From e5e42dc56f5f82b3f6d057266f3ac9bc87580d60 Mon Sep 17 00:00:00 2001 From: rajivpoc Date: Thu, 17 Jun 2021 00:25:43 -0500 Subject: [PATCH 1/4] remove listeners and use loop to find tx receipt --- packages/core-utils/src/watcher.ts | 53 +++++++++++------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/packages/core-utils/src/watcher.ts b/packages/core-utils/src/watcher.ts index 49f69bd57ce3..5a2bf9cd230a 100644 --- a/packages/core-utils/src/watcher.ts +++ b/packages/core-utils/src/watcher.ts @@ -73,22 +73,31 @@ export class Watcher { msgHash: string, pollForPending: boolean = true ): Promise { - const blockNumber = await layer.provider.getBlockNumber() - const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0) - const successFilter = { + let matches: ethers.providers.Log[] = [] + const successFilter: ethers.providers.Filter = { address: layer.messengerAddress, topics: [ethers.utils.id(`RelayedMessage(bytes32)`)], - fromBlock: startingBlock, } - const failureFilter = { + const failureFilter: ethers.providers.Filter = { address: layer.messengerAddress, topics: [ethers.utils.id(`FailedRelayedMessage(bytes32)`)], - fromBlock: startingBlock, } - const successLogs = await layer.provider.getLogs(successFilter) - const failureLogs = await layer.provider.getLogs(failureFilter) - const logs = successLogs.concat(failureLogs) - const matches = logs.filter((log: any) => log.data === msgHash) + + // scan for transaction with specified message + while (matches.length === 0) { + const blockNumber = await layer.provider.getBlockNumber() + const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0) + successFilter.fromBlock = startingBlock + failureFilter.fromBlock = startingBlock + const successLogs = await layer.provider.getLogs(successFilter) + const failureLogs = await layer.provider.getLogs(failureFilter) + const logs = successLogs.concat(failureLogs) + matches = logs.filter((log: ethers.providers.Log) => log.data === msgHash) + // exit loop after first iteration if not polling + if (!pollForPending) { + break + } + } // Message was relayed in the past if (matches.length > 0) { @@ -98,30 +107,8 @@ export class Watcher { ) } return layer.provider.getTransactionReceipt(matches[0].transactionHash) - } - if (!pollForPending) { + } else { return Promise.resolve(undefined) } - - // Message has yet to be relayed, poll until it is found - return new Promise(async (resolve, reject) => { - const handleEvent = async (log: any) => { - if (log.data === msgHash) { - try { - const txReceipt = await layer.provider.getTransactionReceipt( - log.transactionHash - ) - layer.provider.off(successFilter) - layer.provider.off(failureFilter) - resolve(txReceipt) - } catch (e) { - reject(e) - } - } - } - - layer.provider.on(successFilter, handleEvent) - layer.provider.on(failureFilter, handleEvent) - }) } } From 85bb502edfdc8555c64a0b179b4591146a60e93d Mon Sep 17 00:00:00 2001 From: rajivpoc Date: Thu, 17 Jun 2021 00:26:25 -0500 Subject: [PATCH 2/4] add yarn ready --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index b424d60f1095..163c5ef289ac 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "lint:check": "yarn lerna run lint:check", "lint:fix": "yarn lerna run lint:fix", "postinstall": "patch-package", + "ready": "yarn lint && yarn test", "release": "yarn build && yarn changeset publish" }, "dependencies": { From 1ede5f7c037c89ca8097705cc4c2acdad7dac9b3 Mon Sep 17 00:00:00 2001 From: rajivpoc Date: Thu, 17 Jun 2021 22:23:47 -0500 Subject: [PATCH 3/4] moved filters inside loop --- packages/core-utils/src/watcher.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/core-utils/src/watcher.ts b/packages/core-utils/src/watcher.ts index 5a2bf9cd230a..b22cd2e24f95 100644 --- a/packages/core-utils/src/watcher.ts +++ b/packages/core-utils/src/watcher.ts @@ -74,21 +74,21 @@ export class Watcher { pollForPending: boolean = true ): Promise { let matches: ethers.providers.Log[] = [] - const successFilter: ethers.providers.Filter = { - address: layer.messengerAddress, - topics: [ethers.utils.id(`RelayedMessage(bytes32)`)], - } - const failureFilter: ethers.providers.Filter = { - address: layer.messengerAddress, - topics: [ethers.utils.id(`FailedRelayedMessage(bytes32)`)], - } // scan for transaction with specified message while (matches.length === 0) { const blockNumber = await layer.provider.getBlockNumber() const startingBlock = Math.max(blockNumber - this.NUM_BLOCKS_TO_FETCH, 0) - successFilter.fromBlock = startingBlock - failureFilter.fromBlock = startingBlock + const successFilter: ethers.providers.Filter = { + address: layer.messengerAddress, + topics: [ethers.utils.id(`RelayedMessage(bytes32)`)], + fromBlock: startingBlock + } + const failureFilter: ethers.providers.Filter = { + address: layer.messengerAddress, + topics: [ethers.utils.id(`FailedRelayedMessage(bytes32)`)], + fromBlock: startingBlock + } const successLogs = await layer.provider.getLogs(successFilter) const failureLogs = await layer.provider.getLogs(failureFilter) const logs = successLogs.concat(failureLogs) From 4773040734a63af3480bdf55ba83f48f49a6b829 Mon Sep 17 00:00:00 2001 From: rajivpoc Date: Fri, 18 Jun 2021 00:19:44 -0500 Subject: [PATCH 4/4] [added] changeset --- .changeset/tall-plums-behave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/tall-plums-behave.md diff --git a/.changeset/tall-plums-behave.md b/.changeset/tall-plums-behave.md new file mode 100644 index 000000000000..3459ad6e5e1a --- /dev/null +++ b/.changeset/tall-plums-behave.md @@ -0,0 +1,5 @@ +--- +'@eth-optimism/core-utils': patch +--- + +improved watcher ability to find transactions during periods of high load