Close provider by unsubscribing and closing client

This commit is contained in:
Mark Spanbroek 2023-06-27 16:40:29 +02:00 committed by markspanbroek
parent f8cac08cde
commit a27c2de41c
13 changed files with 59 additions and 4 deletions

View File

@ -90,6 +90,12 @@ await writableToken.transfer(accounts[7], 42.u256)
Which transfers 42 tokens from account 3 to account 7 Which transfers 42 tokens from account 3 to account 7
And lastly, don't forget to close the provider when you're done:
```
await provider.close()
```
Events Events
------ ------

View File

@ -208,3 +208,6 @@ proc confirm*(tx: Future[?TransactionResponse],
) )
return await txResp.confirm(wantedConfirms, timeoutInBlocks) return await txResp.confirm(wantedConfirms, timeoutInBlocks)
method close*(provider: Provider) {.async, base.} =
discard

View File

@ -177,6 +177,13 @@ method subscribe*(provider: JsonRpcProvider,
let subscriptions = await provider.subscriptions let subscriptions = await provider.subscriptions
return await subscriptions.subscribeBlocks(onBlock) return await subscriptions.subscribeBlocks(onBlock)
method close*(provider: JsonRpcProvider) {.async.} =
convertError:
let client = await provider.client
let subscriptions = await provider.subscriptions
await subscriptions.close()
await client.close()
# Signer # Signer
method provider*(signer: JsonRpcSigner): Provider = method provider*(signer: JsonRpcSigner): Provider =

View File

@ -35,6 +35,11 @@ method unsubscribe(subscriptions: JsonRpcSubscriptions,
{.async, base.} = {.async, base.} =
raiseAssert "not implemented" raiseAssert "not implemented"
method close*(subscriptions: JsonRpcSubscriptions) {.async.} =
let ids = toSeq subscriptions.callbacks.keys
for id in ids:
await subscriptions.unsubscribe(id)
method unsubscribe(subscription: JsonRpcSubscription) {.async.} = method unsubscribe(subscription: JsonRpcSubscription) {.async.} =
let subscriptions = subscription.subscriptions let subscriptions = subscription.subscriptions
let id = subscription.id let id = subscription.id

View File

@ -16,6 +16,10 @@ for url in ["ws://localhost:8545", "http://localhost:8545"]:
setup: setup:
provider = JsonRpcProvider.new(url, pollingInterval = 100.millis) provider = JsonRpcProvider.new(url, pollingInterval = 100.millis)
teardown:
await provider.close()
test "can be instantiated with a default URL": test "can be instantiated with a default URL":
discard JsonRpcProvider.new() discard JsonRpcProvider.new()

View File

@ -12,6 +12,9 @@ suite "JsonRpcSigner":
provider = JsonRpcProvider.new() provider = JsonRpcProvider.new()
accounts = await provider.listAccounts() accounts = await provider.listAccounts()
teardown:
await provider.close()
test "is connected to the first account of the provider by default": test "is connected to the first account of the provider by default":
let signer = provider.getSigner() let signer = provider.getSigner()
check (await signer.getAddress()) == accounts[0] check (await signer.getAddress()) == accounts[0]

View File

@ -37,10 +37,23 @@ template subscriptionTests(subscriptions, client) =
discard await client.call("evm_mine", newJArray()) discard await client.call("evm_mine", newJArray())
check eventually count > 0 check eventually count > 0
await subscription.unsubscribe() await subscription.unsubscribe()
let endcount = count count = 0
discard await client.call("evm_mine", newJArray()) discard await client.call("evm_mine", newJArray())
await sleepAsync(100.millis) await sleepAsync(100.millis)
check count == endcount check count == 0
test "stops listening to new blocks when provider is closed":
var count = 0
proc callback(blck: Block) {.async.} =
inc count
let subscription = await subscriptions.subscribeBlocks(callback)
discard await client.call("evm_mine", newJArray())
check eventually count > 0
await subscriptions.close()
count = 0
discard await client.call("evm_mine", newJArray())
await sleepAsync(100.millis)
check count == 0
suite "Web socket subscriptions": suite "Web socket subscriptions":
@ -52,6 +65,10 @@ suite "Web socket subscriptions":
await client.connect("ws://localhost:8545") await client.connect("ws://localhost:8545")
subscriptions = JsonRpcSubscriptions.new(client) subscriptions = JsonRpcSubscriptions.new(client)
teardown:
await subscriptions.close()
await client.close()
subscriptionTests(subscriptions, client) subscriptionTests(subscriptions, client)
suite "HTTP polling subscriptions": suite "HTTP polling subscriptions":
@ -65,4 +82,8 @@ suite "HTTP polling subscriptions":
subscriptions = JsonRpcSubscriptions.new(client, subscriptions = JsonRpcSubscriptions.new(client,
pollingInterval = 100.millis) pollingInterval = 100.millis)
teardown:
await subscriptions.close()
await client.close()
subscriptionTests(subscriptions, client) subscriptionTests(subscriptions, client)

View File

@ -33,6 +33,7 @@ for url in ["ws://localhost:8545", "http://localhost:8545"]:
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "can call constant functions": test "can call constant functions":
check (await token.name()) == "TestToken" check (await token.name()) == "TestToken"

View File

@ -22,6 +22,7 @@ suite "Contract enum parameters and return values":
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "handles enum parameter and return value": test "handles enum parameter and return value":
proc returnValue(contract: TestEnums, proc returnValue(contract: TestEnums,

View File

@ -33,6 +33,7 @@ for url in ["ws://localhost:8545", "http://localhost:8545"]:
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "retrieves basic information": test "retrieves basic information":
check (await token.name()) == "TestToken" check (await token.name()) == "TestToken"

View File

@ -21,6 +21,7 @@ suite "Contract return values":
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "handles static size structs": test "handles static size structs":
proc getStatic(contract: TestReturns): Static {.contract, pure.} proc getStatic(contract: TestReturns): Static {.contract, pure.}

View File

@ -88,6 +88,7 @@ suite "Testing helpers - provider":
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "revert works with provider": test "revert works with provider":
check await helpersContract.revertsWith(revertReason).reverts(revertReason) check await helpersContract.revertsWith(revertReason).reverts(revertReason)

View File

@ -20,9 +20,10 @@ suite "Wallet":
setup: setup:
provider = JsonRpcProvider.new() provider = JsonRpcProvider.new()
snapshot = await provider.send("evm_snapshot") snapshot = await provider.send("evm_snapshot")
teardown: teardown:
discard await provider.send("evm_revert", @[snapshot]) discard await provider.send("evm_revert", @[snapshot])
await provider.close()
test "Can create Wallet with private key": test "Can create Wallet with private key":
discard Wallet.new(pk1) discard Wallet.new(pk1)
@ -114,7 +115,7 @@ suite "Wallet":
gasLimit: some 22_000.u256) gasLimit: some 22_000.u256)
let testToken = Erc20.new(wallet.address, wallet) let testToken = Erc20.new(wallet.address, wallet)
await testToken.transfer(wallet.address, 24.u256, overrides) await testToken.transfer(wallet.address, 24.u256, overrides)
test "Can call state-changing function automatically EIP1559": test "Can call state-changing function automatically EIP1559":
#TODO add actual token contract, not random address. Should work regardless #TODO add actual token contract, not random address. Should work regardless
let wallet = Wallet.new(pk_with_funds, provider) let wallet = Wallet.new(pk_with_funds, provider)