From ea2d2453a535a319ad55e7ca739ab1bcdb1432b7 Mon Sep 17 00:00:00 2001 From: Richard Moore Date: Wed, 20 Jul 2022 16:36:30 -0400 Subject: [PATCH] Fix old events from being emitted at the beginning of a filter (#3069, #3094). --- packages/providers/src.ts/base-provider.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/providers/src.ts/base-provider.ts b/packages/providers/src.ts/base-provider.ts index c2ad5fcf42..c9ef59f5ff 100644 --- a/packages/providers/src.ts/base-provider.ts +++ b/packages/providers/src.ts/base-provider.ts @@ -1069,7 +1069,13 @@ export class BaseProvider extends Provider implements EnsProvider { if (!event._inflight) { event._inflight = true; - // Filter from the last known event; due to load-balancing + // This is the first filter for this event, so we want to + // restrict events to events that happened no earlier than now + if (event._lastBlockNumber === -2) { + event._lastBlockNumber = blockNumber - 1; + } + + // Filter from the last *known* event; due to load-balancing // and some nodes returning updated block numbers before // indexing events, a logs result with 0 entries cannot be // trusted and we must retry a range which includes it again @@ -1077,10 +1083,12 @@ export class BaseProvider extends Provider implements EnsProvider { filter.fromBlock = event._lastBlockNumber + 1; filter.toBlock = blockNumber; - // Prevent fitler ranges from growing too wild - if (filter.toBlock - this._maxFilterBlockRange > filter.fromBlock) { - filter.fromBlock = filter.toBlock - this._maxFilterBlockRange; - } + // Prevent fitler ranges from growing too wild, since it is quite + // likely there just haven't been any events to move the lastBlockNumber. + const minFromBlock = filter.toBlock - this._maxFilterBlockRange; + if (minFromBlock > filter.fromBlock) { filter.fromBlock = minFromBlock; } + + if (filter.fromBlock < 0) { filter.fromBlock = 0; } const runner = this.getLogs(filter).then((logs) => { // Allow the next getLogs