diff --git a/Readme.md b/Readme.md index b1ff00e..30bb259 100644 --- a/Readme.md +++ b/Readme.md @@ -137,11 +137,8 @@ You can now subscribe to Transfer events by calling `subscribe` on the contract instance. ```nim -proc handleTransfer(transferResult: ?!Transfer) = - if transferResult.isOk: - echo "received transfer: ", transferResult.value - else: - echo "error during transfer: ", transferResult.error.msg +proc handleTransfer(transferResult: Transfer) = + echo "received transfer: ", transferResult.value let subscription = await token.subscribe(Transfer, handleTransfer) ``` diff --git a/ethers/contracts/filters.nim b/ethers/contracts/filters.nim index 6e6c0cf..09d2ca0 100644 --- a/ethers/contracts/filters.nim +++ b/ethers/contracts/filters.nim @@ -6,7 +6,7 @@ import ./contract import ./events import ./fields -type EventHandler*[E: Event] = proc(event: ?!E) {.gcsafe, raises:[].} +type EventHandler*[E: Event] = proc(event: E) {.gcsafe, raises:[].} proc subscribe*[E: Event](contract: Contract, _: type E, @@ -16,13 +16,9 @@ proc subscribe*[E: Event](contract: Contract, let topic = topic($E, E.fieldTypes).toArray let filter = EventFilter(address: contract.address, topics: @[topic]) - proc logHandler(logResult: ?!Log) {.raises: [].} = - without log =? logResult, error: - handler(failure(E, error)) - return - + proc logHandler(log: Log) {.raises: [].} = if event =? E.decode(log.data, log.topics): - handler(success(event)) + handler(event) contract.provider.subscribe(filter, logHandler) diff --git a/ethers/provider.nim b/ethers/provider.nim index 8b2b1c1..d3db60f 100644 --- a/ethers/provider.nim +++ b/ethers/provider.nim @@ -57,8 +57,8 @@ type effectiveGasPrice*: ?UInt256 status*: TransactionStatus transactionType* {.serialize("type"), deserialize("type").}: TransactionType - LogHandler* = proc(log: ?!Log) {.gcsafe, raises:[].} - BlockHandler* = proc(blck: ?!Block) {.gcsafe, raises:[].} + LogHandler* = proc(log: Log) {.gcsafe, raises:[].} + BlockHandler* = proc(blck: Block) {.gcsafe, raises:[].} Topic* = array[32, byte] Block* {.serialize.} = object number*: ?BlockNumber @@ -239,8 +239,8 @@ proc confirm*( let blockEvent = newAsyncEvent() blockEvent.fire() - proc onBlock(blckResult: ?!Block) = - if blck =? blckResult and number =? blck.number: + proc onBlock(blck: Block) = + if number =? blck.number: blockNumber = number blockEvent.fire() diff --git a/ethers/subscriptions.nim b/ethers/subscriptions.nim index b71001e..eb661b3 100644 --- a/ethers/subscriptions.nim +++ b/ethers/subscriptions.nim @@ -92,11 +92,11 @@ proc processBlock( return false let logs = await subscriptions.getLogs(blck) for handler in subscriptions.blockSubscriptions.values: - handler(success blck) + handler(blck) for (id, logs) in logs.pairs: if (_, handler) =? subscriptions.logSubscriptions.?[id]: for log in logs: - handler(success log) + handler(log) return true except ProviderError: return false diff --git a/testmodule/providers/jsonrpc/testJsonRpcProvider.nim b/testmodule/providers/jsonrpc/testJsonRpcProvider.nim index fae1e07..133060f 100644 --- a/testmodule/providers/jsonrpc/testJsonRpcProvider.nim +++ b/testmodule/providers/jsonrpc/testJsonRpcProvider.nim @@ -49,7 +49,7 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: let oldBlock = !await provider.getBlock(BlockTag.latest) discard await provider.send("evm_mine") var newBlock: Block - let blockHandler = proc(blck: ?!Block) {.raises:[].}= newBlock = blck.value + let blockHandler = proc(blck: Block) = newBlock = blck let subscription = await provider.subscribe(blockHandler) discard await provider.send("evm_mine") check eventually newBlock.number.isSome diff --git a/testmodule/providers/jsonrpc/testJsonRpcSubscriptions.nim b/testmodule/providers/jsonrpc/testJsonRpcSubscriptions.nim index 4a885f3..f26c647 100644 --- a/testmodule/providers/jsonrpc/testJsonRpcSubscriptions.nim +++ b/testmodule/providers/jsonrpc/testJsonRpcSubscriptions.nim @@ -1,6 +1,5 @@ import std/os import pkg/asynctest/chronos/unittest -import pkg/serde import pkg/json_rpc/rpcclient import pkg/json_rpc/rpcserver import ethers/providers/jsonrpc @@ -20,8 +19,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: test "subscribes to new blocks": var latestBlock: Block - proc callback(blck: ?!Block) = - latestBlock = blck.value + proc callback(blck: Block) = + latestBlock = blck let subscription = await provider.subscribe(callback) discard await provider.send("evm_mine") check eventually latestBlock.number.isSome @@ -31,9 +30,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: test "stops listening to new blocks when unsubscribed": var count = 0 - proc callback(blck: ?!Block) = - if blck.isOk: - inc count + proc callback(blck: Block) = + inc count let subscription = await provider.subscribe(callback) discard await provider.send("evm_mine") check eventually count > 0 @@ -44,16 +42,15 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: check count == 0 test "duplicate unsubscribe is harmless": - proc callback(blck: ?!Block) = discard + proc callback(blck: Block) = discard let subscription = await provider.subscribe(callback) await subscription.unsubscribe() await subscription.unsubscribe() test "stops listening to new blocks when provider is closed": var count = 0 - proc callback(blck: ?!Block) = - if blck.isOk: - inc count + proc callback(blck: Block) = + inc count discard await provider.subscribe(callback) discard await provider.send("evm_mine") check eventually count > 0 diff --git a/testmodule/testContracts.nim b/testmodule/testContracts.nim index 487b186..bca0146 100644 --- a/testmodule/testContracts.nim +++ b/testmodule/testContracts.nim @@ -157,10 +157,7 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: test "receives events when subscribed": var transfers: seq[Transfer] - proc handleTransfer(transferRes: ?!Transfer) = - without transfer =? transferRes, error: - echo error.msg - + proc handleTransfer(transfer: Transfer) = transfers.add(transfer) let signer0 = provider.getSigner(accounts[0]) @@ -182,9 +179,8 @@ for url in ["ws://" & providerUrl, "http://" & providerUrl]: test "stops receiving events when unsubscribed": var transfers: seq[Transfer] - proc handleTransfer(transferRes: ?!Transfer) = - if transfer =? transferRes: - transfers.add(transfer) + proc handleTransfer(transfer: Transfer) = + transfers.add(transfer) let signer0 = provider.getSigner(accounts[0])