2019-07-02 13:55:39 +00:00
|
|
|
import ../web3
|
2019-07-31 09:16:35 +00:00
|
|
|
import chronos, nimcrypto, options, json, stint
|
2019-07-02 13:55:39 +00:00
|
|
|
import test_utils
|
|
|
|
|
|
|
|
import random
|
|
|
|
|
|
|
|
#[ Contract LoggerContract
|
|
|
|
pragma solidity >=0.4.25 <0.6.0;
|
|
|
|
|
|
|
|
contract LoggerContract {
|
|
|
|
|
|
|
|
uint fNum;
|
|
|
|
|
|
|
|
event MyEvent(address sender, uint value);
|
|
|
|
|
|
|
|
|
|
|
|
function invoke(uint value) public {
|
|
|
|
emit MyEvent(msg.sender, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]#
|
|
|
|
contract(LoggerContract):
|
|
|
|
proc MyEvent(sender: Address, number: Uint256) {.event.}
|
|
|
|
proc invoke(value: Uint256)
|
|
|
|
|
|
|
|
const LoggerContractCode = "6080604052348015600f57600080fd5b5060bc8061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80632b30d2b814602d575b600080fd5b604760048036036020811015604157600080fd5b50356049565b005b604080513381526020810183905281517fdf50c7bb3b25f812aedef81bc334454040e7b27e27de95a79451d663013b7e17929181900390910190a15056fea265627a7a723058202ed7f5086297d2a49fbe359f4e489a007b69eb5077f5c76328bffdb63f164b4b64736f6c63430005090032"
|
|
|
|
|
|
|
|
var contractAddress = Address.fromHex("0xEA255DeA28c84F698Fa195f87fC83D1d4125ef9C")
|
|
|
|
|
|
|
|
proc test() {.async.} =
|
2019-07-31 09:16:35 +00:00
|
|
|
let web3 = await newWeb3("ws://localhost:8545")
|
|
|
|
let accounts = await web3.provider.eth_accounts()
|
2019-07-02 13:55:39 +00:00
|
|
|
echo "accounts: ", accounts
|
2019-08-05 20:08:18 +00:00
|
|
|
web3.defaultAccount = accounts[0]
|
2019-07-31 09:16:35 +00:00
|
|
|
# let q = await web3.provider.eth_blockNumber()
|
|
|
|
echo "block: ", uint64(await web3.provider.eth_blockNumber())
|
2019-07-02 13:55:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
block: # LoggerContract
|
2020-03-05 23:56:23 +00:00
|
|
|
let receipt = await web3.deployContract(LoggerContractCode)
|
|
|
|
contractAddress = receipt.contractAddress.get
|
2019-07-02 13:55:39 +00:00
|
|
|
echo "Deployed LoggerContract contract: ", contractAddress
|
|
|
|
|
2019-08-05 20:08:18 +00:00
|
|
|
let ns = web3.contractSender(LoggerContract, contractAddress)
|
2019-07-02 13:55:39 +00:00
|
|
|
|
|
|
|
proc testInvoke() {.async.} =
|
|
|
|
let r = rand(1 .. 1000000)
|
2019-08-05 20:08:18 +00:00
|
|
|
echo "invoke(", r, "): ", await ns.invoke(r.u256).send()
|
2019-07-02 13:55:39 +00:00
|
|
|
|
|
|
|
const invocationsBefore = 5
|
|
|
|
const invocationsAfter = 5
|
|
|
|
|
|
|
|
for i in 1 .. invocationsBefore:
|
|
|
|
await testInvoke()
|
|
|
|
|
|
|
|
# Now that we have invoked the function `invocationsBefore` let's wait for the transactions to
|
|
|
|
# settle and see if we receive the logs after subscription. Note in ganache transactions are
|
|
|
|
# processed immediately. With a real eth client we would need to wait for transactions to settle
|
|
|
|
|
|
|
|
await sleepAsync(3.seconds)
|
|
|
|
|
|
|
|
let notifFut = newFuture[void]()
|
|
|
|
var notificationsReceived = 0
|
|
|
|
|
2020-05-08 14:20:59 +00:00
|
|
|
let s = await ns.subscribe(MyEvent, %*{"fromBlock": "0x0"}) do (
|
|
|
|
sender: Address, value: Uint256)
|
|
|
|
{.raises: [Defect], gcsafe.}:
|
|
|
|
try:
|
|
|
|
echo "onEvent: ", sender, " value ", value
|
|
|
|
inc notificationsReceived
|
|
|
|
|
|
|
|
if notificationsReceived == invocationsBefore + invocationsAfter:
|
|
|
|
notifFut.complete()
|
|
|
|
except Exception as err:
|
|
|
|
# chronos still raises exceptions which inherit directly from Exception
|
|
|
|
doAssert false, err.msg
|
2020-06-30 12:54:22 +00:00
|
|
|
do (err: CatchableError):
|
|
|
|
echo "Error from MyEvent subscription: ", err.msg
|
2019-07-02 13:55:39 +00:00
|
|
|
|
|
|
|
for i in 1 .. invocationsAfter:
|
|
|
|
await testInvoke()
|
|
|
|
|
|
|
|
await notifFut
|
|
|
|
|
|
|
|
await s.unsubscribe()
|
2019-10-22 15:57:59 +00:00
|
|
|
await web3.close()
|
2019-07-02 13:55:39 +00:00
|
|
|
|
|
|
|
waitFor test()
|