diff --git a/packages/codegen/src/templates/indexer-template.handlebars b/packages/codegen/src/templates/indexer-template.handlebars index b8a308a5..11624ccc 100644 --- a/packages/codegen/src/templates/indexer-template.handlebars +++ b/packages/codegen/src/templates/indexer-template.handlebars @@ -249,7 +249,7 @@ export class Indexer implements IndexerInterface { }; } - const { block: { number } } = await this._ethClient.getBlockByHash(blockHash); + const { block: { number } } = await this.getBlockByHash(blockHash); const blockNumber = ethers.BigNumber.from(number).toNumber(); log('{{query.name}}: db miss, fetching from upstream server'); @@ -679,6 +679,10 @@ export class Indexer implements IndexerInterface { return this._baseIndexer.getBlocks(blockFilter); } + async getBlockByHash (blockHash?: string): Promise<{ block: any }> { + return this._baseIndexer.getBlockByHash(blockHash); + } + async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force = false): Promise { return this._baseIndexer.updateSyncStatusIndexedBlock(blockHash, blockNumber, force); } 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;