diff --git a/packages/providers/src.ts/base-provider.ts b/packages/providers/src.ts/base-provider.ts index 79c4a328b3..6c72b18131 100644 --- a/packages/providers/src.ts/base-provider.ts +++ b/packages/providers/src.ts/base-provider.ts @@ -823,7 +823,7 @@ export class BaseProvider extends Provider { } return this.formatter.block(block); - }, { onceBlock: this }); + }, { oncePoll: this }); } getBlock(blockHashOrBlockTag: BlockTag | string | Promise): Promise { @@ -865,7 +865,7 @@ export class BaseProvider extends Provider { } return this._wrapTransaction(tx); - }, { onceBlock: this }); + }, { oncePoll: this }); } async getTransactionReceipt(transactionHash: string | Promise): Promise { @@ -903,7 +903,7 @@ export class BaseProvider extends Provider { } return receipt; - }, { onceBlock: this }); + }, { oncePoll: this }); } async getLogs(filter: Filter | FilterByBlockHash | Promise): Promise> { diff --git a/packages/providers/src.ts/websocket-provider.ts b/packages/providers/src.ts/websocket-provider.ts index 203b3e6547..629dc2b761 100644 --- a/packages/providers/src.ts/websocket-provider.ts +++ b/packages/providers/src.ts/websocket-provider.ts @@ -108,6 +108,14 @@ export class WebSocketProvider extends JsonRpcProvider { console.warn("this should not happen"); } }; + + // This Provider does not actually poll, but we want to trigger + // poll events for things that depend on them (like stalling for + // block and transaction lookups) + const fauxPoll = setInterval(() => { + this.emit("poll"); + }, 1000); + if (fauxPoll.unref) { fauxPoll.unref(); } } get pollingInterval(): number { @@ -180,7 +188,9 @@ export class WebSocketProvider extends JsonRpcProvider { switch (event.type) { case "block": this._subscribe("block", [ "newHeads" ], (result: any) => { - this.emit("block", BigNumber.from(result.number).toNumber()); + const blockNumber = BigNumber.from(result.number).toNumber(); + this._emitted.block = blockNumber; + this.emit("block", blockNumber); }); break; @@ -221,6 +231,9 @@ export class WebSocketProvider extends JsonRpcProvider { // Nothing is needed case "debug": + case "poll": + case "willPoll": + case "didPoll": case "error": break;