diff --git a/src.ts/contract/contract.ts b/src.ts/contract/contract.ts index ffb95da8b..bbddf0cc1 100644 --- a/src.ts/contract/contract.ts +++ b/src.ts/contract/contract.ts @@ -80,8 +80,13 @@ class PreparedTopicFilter implements DeferredTopicFilter { const resolver = canResolve(runner) ? runner: null; this.#filter = (async function() { const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => { + const arg = args[index]; + if (arg == null) { return null; } + return param.walkAsync(args[index], (type, value) => { - if (type === "address") { return resolveAddress(value, resolver); } + if (type === "address") { + return resolveAddress(value, resolver); + } return value; }); })); @@ -443,17 +448,21 @@ async function getSub(contract: BaseContract, operation: string, event: Contract } }; - let started = false; + let starting: Array> = [ ]; const start = () => { - if (started) { return; } - provider.on(filter, listener); - started = true; + if (starting.length) { return; } + starting.push(provider.on(filter, listener)); }; - const stop = () => { - if (!started) { return; } + + const stop = async () => { + if (starting.length == 0) { return; } + + let started = starting; + starting = [ ]; + await Promise.all(started); provider.off(filter, listener); - started = false; }; + sub = { tag, listeners: [ ], start, stop }; subs.set(tag, sub); } diff --git a/src.ts/providers/subscriber-filterid.ts b/src.ts/providers/subscriber-filterid.ts index 5cd74751d..fa352d874 100644 --- a/src.ts/providers/subscriber-filterid.ts +++ b/src.ts/providers/subscriber-filterid.ts @@ -28,6 +28,8 @@ export class FilterIdSubscriber implements Subscriber { #network: null | Network; + #hault: boolean; + constructor(provider: JsonRpcApiProvider) { this.#provider = provider; @@ -35,6 +37,8 @@ export class FilterIdSubscriber implements Subscriber { this.#poller = this.#poll.bind(this); this.#network = null; + + this.#hault = false; } _subscribe(provider: JsonRpcApiProvider): Promise { @@ -68,6 +72,8 @@ export class FilterIdSubscriber implements Subscriber { throw new Error("chaid changed"); } + if (this.#hault) { return; } + const result = await this.#provider.send("eth_getFilterChanges", [ filterId ]); await this._emitResults(this.#provider, result); } catch (error) { console.log("@TODO", error); } @@ -88,6 +94,7 @@ export class FilterIdSubscriber implements Subscriber { start(): void { this.#poll(-2); } stop(): void { + this.#hault = true; this.#teardown(); this.#provider.off("block", this.#poller); }