From 7829ce762f86b919d2b76970b3c1ec816f117b61 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:27:46 +0200 Subject: [PATCH 1/7] refactor(relayer): Factor out common listener utils This is a pre-emptive change made to make it easier to reuse common components in alternative listener implementations. Examples for a viem-based listener, as well as an eventual Solana listener. --- src/libexec/RelayerSpokePoolIndexer.ts | 59 ++------------------------ src/libexec/types.ts | 9 ++++ src/libexec/util.ts | 46 ++++++++++++++++++++ 3 files changed, 59 insertions(+), 55 deletions(-) create mode 100644 src/libexec/types.ts create mode 100644 src/libexec/util.ts diff --git a/src/libexec/RelayerSpokePoolIndexer.ts b/src/libexec/RelayerSpokePoolIndexer.ts index 951f528e7..0d25832b7 100644 --- a/src/libexec/RelayerSpokePoolIndexer.ts +++ b/src/libexec/RelayerSpokePoolIndexer.ts @@ -3,8 +3,6 @@ import minimist from "minimist"; import { Contract, EventFilter, providers as ethersProviders, utils as ethersUtils } from "ethers"; import { utils as sdkUtils } from "@across-protocol/sdk"; import * as utils from "../../scripts/utils"; -import { Log } from "../interfaces"; -import { SpokePoolClientMessage } from "../clients"; import { disconnectRedisClients, EventManager, @@ -20,19 +18,13 @@ import { getWSProviders, Logger, paginatedEventQuery, - sortEventsAscending, winston, } from "../utils"; +import { postEvents, removeEvent } from "./util"; +import { Log, ScraperOpts } from "./types"; type WebSocketProvider = ethersProviders.WebSocketProvider; type EventSearchConfig = sdkUtils.EventSearchConfig; -type ScraperOpts = { - lookback?: number; // Event lookback (in seconds). - deploymentBlock: number; // SpokePool deployment block - maxBlockRange?: number; // Maximum block range for paginated getLogs queries. - filterArgs?: { [event: string]: string[] }; // Event-specific filter criteria to apply. -}; - const { NODE_SUCCESS, NODE_APP_ERR } = utils; const INDEXER_POLLING_PERIOD = 2_000; // ms; time to sleep between checking for exit request via SIGHUP. @@ -68,49 +60,6 @@ function getEventFilterArgs(relayer?: string): { [event: string]: string[] } { return { FilledV3Relay }; } -/** - * Given the inputs for a SpokePoolClient update, consolidate the inputs into a message and submit it to the parent - * process (if defined). - * @param blockNumber Block number up to which the update applies. - * @param currentTime The SpokePool timestamp at blockNumber. - * @param events An array of Log objects to be submitted. - * @returns void - */ -function postEvents(blockNumber: number, currentTime: number, events: Log[]): void { - if (!isDefined(process.send) || stop) { - return; - } - - // Drop the array component of event.args and retain the named k/v pairs, - // otherwise stringification tends to retain only the array. - events = sortEventsAscending(events); - - const message: SpokePoolClientMessage = { - blockNumber, - currentTime, - oldestTime, - nEvents: events.length, - data: JSON.stringify(events, sdkUtils.jsonReplacerWithBigNumbers), - }; - process.send(JSON.stringify(message)); -} - -/** - * Given an event removal notification, post the message to the parent process. - * @param event Log instance. - * @returns void - */ -function removeEvent(event: Log): void { - if (!isDefined(process.send) || stop) { - return; - } - - const message: SpokePoolClientMessage = { - event: JSON.stringify(event, sdkUtils.jsonReplacerWithBigNumbers), - }; - process.send(JSON.stringify(message)); -} - /** * Given a SpokePool contract instance and an event name, scrape all corresponding events and submit them to the * parent process (if defined). @@ -146,7 +95,7 @@ async function scrapeEvents(spokePool: Contract, eventName: string, opts: Scrape const filter = getEventFilter(spokePool, eventName, filterArgs[eventName]); const events = await pollEvents(filter, searchConfig); - postEvents(toBlock, currentTime, events); + postEvents(toBlock, oldestTime, currentTime, events); } /** @@ -178,7 +127,7 @@ async function listen( // Post an update to the parent. Do this irrespective of whether there were new events or not, since there's // information in blockNumber and currentTime alone. - postEvents(blockNumber, currentTime, events); + postEvents(blockNumber, oldestTime, currentTime, events); }); // Add a handler for each new instance of a subscribed event. diff --git a/src/libexec/types.ts b/src/libexec/types.ts new file mode 100644 index 000000000..c1986dfb0 --- /dev/null +++ b/src/libexec/types.ts @@ -0,0 +1,9 @@ +export { Log } from "../interfaces"; +export { SpokePoolClientMessage } from "../clients"; + +export type ScraperOpts = { + lookback?: number; // Event lookback (in seconds). + deploymentBlock: number; // SpokePool deployment block + maxBlockRange?: number; // Maximum block range for paginated getLogs queries. + filterArgs?: { [event: string]: string[] }; // Event-specific filter criteria to apply. +}; diff --git a/src/libexec/util.ts b/src/libexec/util.ts new file mode 100644 index 000000000..cb350e30d --- /dev/null +++ b/src/libexec/util.ts @@ -0,0 +1,46 @@ +import { utils as sdkUtils } from "@across-protocol/sdk"; +import { isDefined, sortEventsAscending } from "../utils"; +import { Log, SpokePoolClientMessage } from "./types"; + +/** + * Given the inputs for a SpokePoolClient update, consolidate the inputs into a message and submit it to the parent + * process (if defined). + * @param blockNumber Block number up to which the update applies. + * @param currentTime The SpokePool timestamp at blockNumber. + * @param events An array of Log objects to be submitted. + * @returns void + */ +export function postEvents(blockNumber: number, oldestTime: number, currentTime: number, events: Log[]): void { + if (!isDefined(process.send) || stop) { + return; + } + + // Drop the array component of event.args and retain the named k/v pairs, + // otherwise stringification tends to retain only the array. + events = sortEventsAscending(events); + + const message: SpokePoolClientMessage = { + blockNumber, + currentTime, + oldestTime, + nEvents: events.length, + data: JSON.stringify(events, sdkUtils.jsonReplacerWithBigNumbers), + }; + process.send(JSON.stringify(message)); +} + +/** + * Given an event removal notification, post the message to the parent process. + * @param event Log instance. + * @returns void + */ +export function removeEvent(event: Log): void { + if (!isDefined(process.send) || stop) { + return; + } + + const message: SpokePoolClientMessage = { + event: JSON.stringify(event, sdkUtils.jsonReplacerWithBigNumbers), + }; + process.send(JSON.stringify(message)); +} From ff6f406daba69b2bddab0fdbb059957a3b4d5be8 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:33:22 +0200 Subject: [PATCH 2/7] Reorg stop --- src/libexec/RelayerSpokePoolIndexer.ts | 12 +++++++++--- src/libexec/util.ts | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libexec/RelayerSpokePoolIndexer.ts b/src/libexec/RelayerSpokePoolIndexer.ts index 0d25832b7..f65678434 100644 --- a/src/libexec/RelayerSpokePoolIndexer.ts +++ b/src/libexec/RelayerSpokePoolIndexer.ts @@ -95,7 +95,9 @@ async function scrapeEvents(spokePool: Contract, eventName: string, opts: Scrape const filter = getEventFilter(spokePool, eventName, filterArgs[eventName]); const events = await pollEvents(filter, searchConfig); - postEvents(toBlock, oldestTime, currentTime, events); + if (!stop) { + postEvents(toBlock, oldestTime, currentTime, events); + } } /** @@ -127,7 +129,9 @@ async function listen( // Post an update to the parent. Do this irrespective of whether there were new events or not, since there's // information in blockNumber and currentTime alone. - postEvents(blockNumber, oldestTime, currentTime, events); + if (!stop) { + postEvents(blockNumber, oldestTime, currentTime, events); + } }); // Add a handler for each new instance of a subscribed event. @@ -140,7 +144,9 @@ async function listen( if (event.removed) { eventMgr.remove(event, host); // Notify the parent immediately in case the event was already submitted. - removeEvent(event); + if (!stop) { + removeEvent(event); + } } else { eventMgr.add(event, host); } diff --git a/src/libexec/util.ts b/src/libexec/util.ts index cb350e30d..471b89576 100644 --- a/src/libexec/util.ts +++ b/src/libexec/util.ts @@ -11,7 +11,7 @@ import { Log, SpokePoolClientMessage } from "./types"; * @returns void */ export function postEvents(blockNumber: number, oldestTime: number, currentTime: number, events: Log[]): void { - if (!isDefined(process.send) || stop) { + if (!isDefined(process.send)) { return; } @@ -35,7 +35,7 @@ export function postEvents(blockNumber: number, oldestTime: number, currentTime: * @returns void */ export function removeEvent(event: Log): void { - if (!isDefined(process.send) || stop) { + if (!isDefined(process.send)) { return; } From bdd1149aa2dbb152a2f12f68631c508a9c265b47 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:28:37 +0200 Subject: [PATCH 3/7] Factor out EVM-specific filter utils --- src/libexec/RelayerSpokePoolIndexer.ts | 25 +------------------ src/libexec/evm/util.ts | 33 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 24 deletions(-) create mode 100644 src/libexec/evm/util.ts diff --git a/src/libexec/RelayerSpokePoolIndexer.ts b/src/libexec/RelayerSpokePoolIndexer.ts index f65678434..af9ebfe12 100644 --- a/src/libexec/RelayerSpokePoolIndexer.ts +++ b/src/libexec/RelayerSpokePoolIndexer.ts @@ -22,6 +22,7 @@ import { } from "../utils"; import { postEvents, removeEvent } from "./util"; import { Log, ScraperOpts } from "./types"; +import { getEventFilter, getEventFilterArgs } from "./evm/util"; type WebSocketProvider = ethersProviders.WebSocketProvider; type EventSearchConfig = sdkUtils.EventSearchConfig; @@ -36,30 +37,6 @@ let chain: string; let stop = false; let oldestTime = 0; -/** - * Given an event name and contract, return the corresponding Ethers EventFilter object. - * @param contract Ethers Constract instance. - * @param eventName The name of the event to be filtered. - * @param filterArgs Optional filter arguments to be applied. - * @returns An Ethers EventFilter instance. - */ -function getEventFilter(contract: Contract, eventName: string, filterArgs?: string[]): EventFilter { - const filter = contract.filters[eventName]; - if (!isDefined(filter)) { - throw new Error(`Event ${eventName} not defined for contract`); - } - - return isDefined(filterArgs) ? filter(...filterArgs) : filter(); -} - -function getEventFilterArgs(relayer?: string): { [event: string]: string[] } { - const FilledV3Relay = !isDefined(relayer) - ? undefined - : [null, null, null, null, null, null, null, null, null, null, relayer]; - - return { FilledV3Relay }; -} - /** * Given a SpokePool contract instance and an event name, scrape all corresponding events and submit them to the * parent process (if defined). diff --git a/src/libexec/evm/util.ts b/src/libexec/evm/util.ts new file mode 100644 index 000000000..f1d12a4b6 --- /dev/null +++ b/src/libexec/evm/util.ts @@ -0,0 +1,33 @@ +import { Contract, EventFilter } from "ethers"; +import { isDefined } from "../../utils"; + +/** + * Given an event name and contract, return the corresponding Ethers EventFilter object. + * @param contract Ethers Constract instance. + * @param eventName The name of the event to be filtered. + * @param filterArgs Optional filter arguments to be applied. + * @returns An Ethers EventFilter instance. + */ +export function getEventFilter(contract: Contract, eventName: string, filterArgs?: string[]): EventFilter { + const filter = contract.filters[eventName]; + if (!isDefined(filter)) { + throw new Error(`Event ${eventName} not defined for contract`); + } + + return isDefined(filterArgs) ? filter(...filterArgs) : filter(); +} + +/** + * Given an event name and contract, return the set of corresponding Ethers EventFilter object. + * @param contract Ethers Constract instance. + * @param eventName The name of the event to be filtered. + * @param filterArgs Optional filter arguments to be applied. + * @returns An Ethers EventFilter instance. + */ +export function getEventFilterArgs(relayer?: string): { [event: string]: (null | string)[] } { + const FilledV3Relay = !isDefined(relayer) + ? undefined + : [null, null, null, null, null, null, null, null, null, null, relayer]; + + return { FilledV3Relay }; +} From 6e76404193d280079710c159b132f45f7a504a9e Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:02:33 +0200 Subject: [PATCH 4/7] Fix comment --- src/libexec/evm/util.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/libexec/evm/util.ts b/src/libexec/evm/util.ts index f1d12a4b6..3e21b1c84 100644 --- a/src/libexec/evm/util.ts +++ b/src/libexec/evm/util.ts @@ -18,11 +18,10 @@ export function getEventFilter(contract: Contract, eventName: string, filterArgs } /** - * Given an event name and contract, return the set of corresponding Ethers EventFilter object. - * @param contract Ethers Constract instance. - * @param eventName The name of the event to be filtered. - * @param filterArgs Optional filter arguments to be applied. - * @returns An Ethers EventFilter instance. + * Get a general event filter mapping to be used for filtering SpokePool contract events. + * This is currently only useful for filtering the relayer address on FilledV3Relay events. + * @param relayer Optional relayer address to filter on. + * @returns An argument array for input to an Ethers EventFilter. */ export function getEventFilterArgs(relayer?: string): { [event: string]: (null | string)[] } { const FilledV3Relay = !isDefined(relayer) From ca5db5d58097ef037b602cdac7dffe5e5e441202 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:42:55 +0200 Subject: [PATCH 5/7] Factor out event scraping --- src/libexec/RelayerSpokePoolIndexer.ts | 51 ++++++-------------------- src/libexec/evm/util.ts | 40 +++++++++++++++++++- 2 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/libexec/RelayerSpokePoolIndexer.ts b/src/libexec/RelayerSpokePoolIndexer.ts index af9ebfe12..28907e610 100644 --- a/src/libexec/RelayerSpokePoolIndexer.ts +++ b/src/libexec/RelayerSpokePoolIndexer.ts @@ -1,6 +1,6 @@ import assert from "assert"; import minimist from "minimist"; -import { Contract, EventFilter, providers as ethersProviders, utils as ethersUtils } from "ethers"; +import { Contract, providers as ethersProviders, utils as ethersUtils } from "ethers"; import { utils as sdkUtils } from "@across-protocol/sdk"; import * as utils from "../../scripts/utils"; import { @@ -17,15 +17,13 @@ import { getRedisCache, getWSProviders, Logger, - paginatedEventQuery, winston, } from "../utils"; import { postEvents, removeEvent } from "./util"; -import { Log, ScraperOpts } from "./types"; -import { getEventFilter, getEventFilterArgs } from "./evm/util"; +import { ScraperOpts } from "./types"; +import { getEventFilter, getEventFilterArgs, scrapeEvents as _scrapeEvents } from "./evm/util"; type WebSocketProvider = ethersProviders.WebSocketProvider; -type EventSearchConfig = sdkUtils.EventSearchConfig; const { NODE_SUCCESS, NODE_APP_ERR } = utils; const INDEXER_POLLING_PERIOD = 2_000; // ms; time to sleep between checking for exit request via SIGHUP. @@ -38,42 +36,20 @@ let stop = false; let oldestTime = 0; /** - * Given a SpokePool contract instance and an event name, scrape all corresponding events and submit them to the - * parent process (if defined). + * Aggregate utils/scrapeEvents for a series of event names. * @param spokePool Ethers Constract instance. - * @param eventName The name of the event to be filtered. + * @param eventNames The array of events to be queried. * @param opts Options to configure event scraping behaviour. * @returns void */ -async function scrapeEvents(spokePool: Contract, eventName: string, opts: ScraperOpts): Promise { - const { lookback, deploymentBlock, filterArgs, maxBlockRange } = opts; - const { provider } = spokePool; - const { chainId } = await provider.getNetwork(); - const chain = getNetworkName(chainId); - - let tStart: number, tStop: number; - - const pollEvents = async (filter: EventFilter, searchConfig: EventSearchConfig): Promise => { - tStart = performance.now(); - const events = await paginatedEventQuery(spokePool, filter, searchConfig); - tStop = performance.now(); - logger.debug({ - at: "SpokePoolIndexer::listen", - message: `Indexed ${events.length} ${chain} events in ${Math.round((tStop - tStart) / 1000)} seconds`, - searchConfig, - }); - return events; - }; - - const { number: toBlock, timestamp: currentTime } = await provider.getBlock("latest"); - const fromBlock = Math.max(toBlock - (lookback ?? deploymentBlock), deploymentBlock); - assert(toBlock > fromBlock, `${toBlock} > ${fromBlock}`); - const searchConfig = { fromBlock, toBlock, maxBlockLookBack: maxBlockRange }; +export async function scrapeEvents(spokePool: Contract, eventNames: string[], opts: ScraperOpts): Promise { + const { number: toBlock, timestamp: currentTime } = await spokePool.provider.getBlock("latest"); + const events = await Promise.all( + eventNames.map((eventName) => _scrapeEvents(spokePool, eventName, { ...opts, toBlock }, logger)) + ); - const filter = getEventFilter(spokePool, eventName, filterArgs[eventName]); - const events = await pollEvents(filter, searchConfig); if (!stop) { - postEvents(toBlock, oldestTime, currentTime, events); + postEvents(toBlock, oldestTime, currentTime, events.flat()); } } @@ -209,10 +185,7 @@ async function run(argv: string[]): Promise { if (latestBlock.number > startBlock) { const events = ["V3FundsDeposited", "FilledV3Relay", "RelayedRootBundle", "ExecutedRelayerRefundRoot"]; const _spokePool = spokePool.connect(quorumProvider); - await Promise.all([ - resolveOldestTime(_spokePool, startBlock), - ...events.map((event) => scrapeEvents(_spokePool, event, opts)), - ]); + await Promise.all([resolveOldestTime(_spokePool, startBlock), scrapeEvents(_spokePool, events, opts)]); } // If no lookback was specified then default to the timestamp of the latest block. diff --git a/src/libexec/evm/util.ts b/src/libexec/evm/util.ts index 3e21b1c84..72b20f906 100644 --- a/src/libexec/evm/util.ts +++ b/src/libexec/evm/util.ts @@ -1,5 +1,7 @@ +import assert from "assert"; import { Contract, EventFilter } from "ethers"; -import { isDefined } from "../../utils"; +import { getNetworkName, isDefined, paginatedEventQuery, winston } from "../../utils"; +import { Log, ScraperOpts } from "../types"; /** * Given an event name and contract, return the corresponding Ethers EventFilter object. @@ -30,3 +32,39 @@ export function getEventFilterArgs(relayer?: string): { [event: string]: (null | return { FilledV3Relay }; } + +/** + * Given a SpokePool contract instance and an event name, scrape all corresponding events and submit them to the + * parent process (if defined). + * @param spokePool Ethers Constract instance. + * @param eventName The name of the event to be filtered. + * @param opts Options to configure event scraping behaviour. + * @returns void + */ +export async function scrapeEvents( + spokePool: Contract, + eventName: string, + opts: ScraperOpts & { toBlock: number }, + logger: winston.Logger +): Promise { + const { lookback, deploymentBlock, filterArgs, maxBlockRange, toBlock } = opts; + const { provider } = spokePool; + const { chainId } = await provider.getNetwork(); + const chain = getNetworkName(chainId); + + const fromBlock = Math.max(toBlock - (lookback ?? deploymentBlock), deploymentBlock); + assert(toBlock > fromBlock, `${toBlock} > ${fromBlock}`); + const searchConfig = { fromBlock, toBlock, maxBlockLookBack: maxBlockRange }; + + const tStart = performance.now(); + const filter = getEventFilter(spokePool, eventName, filterArgs[eventName]); + const events = await paginatedEventQuery(spokePool, filter, searchConfig); + const tStop = performance.now(); + logger.debug({ + at: "SpokePoolIndexer::listen", + message: `Scraped ${events.length} ${chain} ${eventName} events in ${Math.round((tStop - tStart) / 1000)} seconds`, + searchConfig, + }); + + return events; +} From d289d099f1da210d3fc88b83c01e1201faaa29c4 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 22:55:56 +0200 Subject: [PATCH 6/7] Reorg --- src/libexec/RelayerSpokePoolIndexer.ts | 4 ++-- src/libexec/util/evm/index.ts | 1 + src/libexec/{ => util}/evm/util.ts | 4 ++-- src/libexec/{util.ts => util/ipc.ts} | 7 ++----- 4 files changed, 7 insertions(+), 9 deletions(-) create mode 100644 src/libexec/util/evm/index.ts rename src/libexec/{ => util}/evm/util.ts (97%) rename src/libexec/{util.ts => util/ipc.ts} (83%) diff --git a/src/libexec/RelayerSpokePoolIndexer.ts b/src/libexec/RelayerSpokePoolIndexer.ts index 28907e610..e6b211734 100644 --- a/src/libexec/RelayerSpokePoolIndexer.ts +++ b/src/libexec/RelayerSpokePoolIndexer.ts @@ -19,9 +19,9 @@ import { Logger, winston, } from "../utils"; -import { postEvents, removeEvent } from "./util"; +import { postEvents, removeEvent } from "./util/ipc"; import { ScraperOpts } from "./types"; -import { getEventFilter, getEventFilterArgs, scrapeEvents as _scrapeEvents } from "./evm/util"; +import { getEventFilter, getEventFilterArgs, scrapeEvents as _scrapeEvents } from "./util/evm"; type WebSocketProvider = ethersProviders.WebSocketProvider; const { NODE_SUCCESS, NODE_APP_ERR } = utils; diff --git a/src/libexec/util/evm/index.ts b/src/libexec/util/evm/index.ts new file mode 100644 index 000000000..181e76f24 --- /dev/null +++ b/src/libexec/util/evm/index.ts @@ -0,0 +1 @@ +export * from "./util"; diff --git a/src/libexec/evm/util.ts b/src/libexec/util/evm/util.ts similarity index 97% rename from src/libexec/evm/util.ts rename to src/libexec/util/evm/util.ts index 72b20f906..5139f64e3 100644 --- a/src/libexec/evm/util.ts +++ b/src/libexec/util/evm/util.ts @@ -1,7 +1,7 @@ import assert from "assert"; import { Contract, EventFilter } from "ethers"; -import { getNetworkName, isDefined, paginatedEventQuery, winston } from "../../utils"; -import { Log, ScraperOpts } from "../types"; +import { getNetworkName, isDefined, paginatedEventQuery, winston } from "../../../utils"; +import { Log, ScraperOpts } from "../../types"; /** * Given an event name and contract, return the corresponding Ethers EventFilter object. diff --git a/src/libexec/util.ts b/src/libexec/util/ipc.ts similarity index 83% rename from src/libexec/util.ts rename to src/libexec/util/ipc.ts index 471b89576..b5bfb81c3 100644 --- a/src/libexec/util.ts +++ b/src/libexec/util/ipc.ts @@ -1,6 +1,6 @@ import { utils as sdkUtils } from "@across-protocol/sdk"; -import { isDefined, sortEventsAscending } from "../utils"; -import { Log, SpokePoolClientMessage } from "./types"; +import { isDefined, sortEventsAscending } from "../../utils"; +import { Log, SpokePoolClientMessage } from "./../types"; /** * Given the inputs for a SpokePoolClient update, consolidate the inputs into a message and submit it to the parent @@ -15,10 +15,7 @@ export function postEvents(blockNumber: number, oldestTime: number, currentTime: return; } - // Drop the array component of event.args and retain the named k/v pairs, - // otherwise stringification tends to retain only the array. events = sortEventsAscending(events); - const message: SpokePoolClientMessage = { blockNumber, currentTime, From a3d63d720a91113d0e62a1b85dd13fe35e21bf48 Mon Sep 17 00:00:00 2001 From: Paul <108695806+pxrl@users.noreply.github.com> Date: Thu, 26 Sep 2024 23:19:39 +0200 Subject: [PATCH 7/7] Apply suggestions from code review --- src/libexec/util/evm/util.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libexec/util/evm/util.ts b/src/libexec/util/evm/util.ts index 5139f64e3..c19a86199 100644 --- a/src/libexec/util/evm/util.ts +++ b/src/libexec/util/evm/util.ts @@ -48,8 +48,7 @@ export async function scrapeEvents( logger: winston.Logger ): Promise { const { lookback, deploymentBlock, filterArgs, maxBlockRange, toBlock } = opts; - const { provider } = spokePool; - const { chainId } = await provider.getNetwork(); + const { chainId } = await spokePool.provider.getNetwork(); const chain = getNetworkName(chainId); const fromBlock = Math.max(toBlock - (lookback ?? deploymentBlock), deploymentBlock); @@ -61,7 +60,7 @@ export async function scrapeEvents( const events = await paginatedEventQuery(spokePool, filter, searchConfig); const tStop = performance.now(); logger.debug({ - at: "SpokePoolIndexer::listen", + at: "scrapeEvents", message: `Scraped ${events.length} ${chain} ${eventName} events in ${Math.round((tStop - tStart) / 1000)} seconds`, searchConfig, });