From 6810130ef406b70673e5c070f9e15bc0ac467bd8 Mon Sep 17 00:00:00 2001 From: Nabarun Date: Wed, 3 Jul 2024 14:06:49 +0530 Subject: [PATCH] Filter blocks without contract events when eth_getLogs filter is unset --- packages/util/src/indexer.ts | 25 +++++++++++++++++++++---- packages/util/src/job-runner.ts | 6 +++--- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/util/src/indexer.ts b/packages/util/src/indexer.ts index 0fd0f0ba..9b6bc600 100644 --- a/packages/util/src/indexer.ts +++ b/packages/util/src/indexer.ts @@ -469,10 +469,27 @@ export class Indexer { topics }); - const blockLogsMap = this._reduceLogsToBlockLogsMap(logs); - // Create unique list of tx required + let blockLogsMap = this._reduceLogsToBlockLogsMap(logs); + + // Filter blocks which have no events from watched contracts + blockLogsMap = Array.from(blockLogsMap.entries()) + .filter(([, logs]) => { + return logs.some(log => { + const contractAddress = ethers.utils.getAddress(log.account.address); + return this.isContractAddressWatched(contractAddress)?.length; + }); + }) + .reduce((acc, [blockHash, logs]) => { + acc.set(blockHash, logs); + return acc; + }, new Map()); + + // Create unique list of txs required const txHashes = Array.from([ - ...new Set(logs.map((log: any) => log.transaction.hash)) + ...new Set( + Array.from(blockLogsMap.values()) + .flat() + .map((log: any) => log.transaction.hash)) ]); // Fetch blocks with transactions for the logs returned @@ -543,7 +560,7 @@ export class Indexer { return blocksWithDbEvents; } - _reduceLogsToBlockLogsMap (logs: any[]): Map { + _reduceLogsToBlockLogsMap (logs: any[]): Map { return logs.reduce((acc: Map, log: any) => { const { blockHash: logBlockHash } = log; assert(typeof logBlockHash === 'string'); diff --git a/packages/util/src/job-runner.ts b/packages/util/src/job-runner.ts index 6d08c4bf..4964ac16 100644 --- a/packages/util/src/job-runner.ts +++ b/packages/util/src/job-runner.ts @@ -728,9 +728,9 @@ export class JobRunner { this._blockAndEventsMap.delete(block.blockHash); - // Check if new contract was added and filterLogsByAddresses is set to true - if (isNewContractWatched && this._indexer.upstreamConfig.ethServer.filterLogsByAddresses) { - // Check if historical processing is running and that current block is being processed was trigerred by historical processing + // Check if new contract was added + if (isNewContractWatched) { + // Check if historical processing is running and that current block being processed was trigerred by historical processing if (this._historicalProcessingCompletedUpto && this._historicalProcessingCompletedUpto > block.blockNumber) { const nextBlockNumberToProcess = block.blockNumber + 1;