mirror of
https://github.com/logos-storage/nim-ethers.git
synced 2026-01-11 10:03:09 +00:00
refactor!(subscriptions): remove ?! from callbacks
This commit is contained in:
parent
c4b3130213
commit
248965f7f6
@ -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)
|
||||
```
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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])
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user