Skip to content

Commit 3317194

Browse files
committed
feat(reku): enhance AutoCrossChecker with start/stop functionality and improve error handling in BaseCrossChecker
1 parent 66756d2 commit 3317194

File tree

5 files changed

+742
-27
lines changed

5 files changed

+742
-27
lines changed

packages/reku/src/event/crosschecker/autochecker.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { BaseCrossChecker } from './basechecker'
1010
export class AutoCrossChecker extends BaseCrossChecker {
1111
cache: CrossCheckerCacheManager | undefined = undefined
1212
checkpointBlockNumber: number | undefined
13+
playing = false
1314

1415
constructor(
1516
provider: Providers,
@@ -140,10 +141,14 @@ export class AutoCrossChecker extends BaseCrossChecker {
140141
// never ends if options.toBlock is not provided
141142
: () => false
142143

144+
this.playing = true
143145
debug('crosscheck running')
144146

145147
// TODO: replace polling with schedule cron
146-
await polling(async () => {
148+
149+
const pollingFn = async () => {
150+
if (!this.playing)
151+
return false
147152
try {
148153
debug('start polling')
149154
const wait = await waitOrUpdateToBlock()
@@ -165,7 +170,13 @@ export class AutoCrossChecker extends BaseCrossChecker {
165170
debug('polling error', error)
166171
return false
167172
}
168-
}, pollingInterval)
173+
}
174+
175+
polling(pollingFn, pollingInterval)
176+
}
177+
178+
stop() {
179+
this.playing = false
169180
}
170181

171182
async diff(logs: ethers.Log[], ignoreLogs: SimpleLog[]): Promise<ethers.Log[]> {

packages/reku/src/event/crosschecker/basechecker.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { ethers } from 'ethers'
2-
import { timeoutWithRetry } from '@ora-io/utils'
2+
import { timeoutWithRetry, to } from '@ora-io/utils'
33
import { ETH_BLOCK_COUNT_ONE_HOUR } from '../../constants'
44
import type { Providers } from '../../types/w3'
55
import { debug } from '../../debug'
@@ -35,11 +35,15 @@ export class BaseCrossChecker {
3535

3636
// define from, to
3737
// TODO: use blockNumber for performance
38-
const block = await timeoutWithRetry(() => {
38+
const [err, block] = await to(timeoutWithRetry(() => {
3939
if (!this.provider || !this.provider.provider)
4040
throw new Error('provider not ready')
4141
return this.provider.provider.getBlock('latest')
42-
}, 15 * 1000, 3)
42+
}, 15 * 1000, 3))
43+
if (err) {
44+
console.warn('crosscheck failed to get latest block', err)
45+
return
46+
}
4347
if (!block) {
4448
console.warn('crosscheck failed to get latest block')
4549
return
@@ -62,11 +66,15 @@ export class BaseCrossChecker {
6266
ccfOptions: CrossCheckFromParam,
6367
) {
6468
// TODO: use blockNumber for performance
65-
const block = await timeoutWithRetry(() => {
69+
const [err, block] = await to(timeoutWithRetry(() => {
6670
if (!this.provider || !this.provider.provider)
6771
throw new Error('provider not ready')
6872
return this.provider.provider.getBlock('latest')
69-
}, 15 * 1000, 3)
73+
}, 15 * 1000, 3))
74+
if (err) {
75+
console.warn('crosscheck failed to get latest block', err)
76+
return
77+
}
7078
if (!block) {
7179
console.warn('crosscheck failed to get latest block')
7280
return
@@ -86,24 +94,6 @@ export class BaseCrossChecker {
8694
return block.number
8795
}
8896

89-
/**
90-
* @deprecated
91-
* @param logs
92-
* @param txHashList
93-
* @param logIndexList
94-
* @returns
95-
*/
96-
async diff_old(logs: ethers.Log[], txHashList: string[], logIndexList: number[][]): Promise<ethers.Log[]> {
97-
const missing = (log: ethers.Log) => {
98-
const txIndex = txHashList?.indexOf(log.transactionHash) || -1
99-
// 1. tx missing, or 2. if passed in logIndexList, event idx missing
100-
return txIndex === -1 || (logIndexList && !logIndexList[txIndex].includes(log.index))
101-
}
102-
// filter missing logs
103-
const missingLogs = logs.filter((log) => { return missing(log) })//
104-
return missingLogs
105-
}
106-
10797
async diff(logs: ethers.Log[], ignoreLogs: SimpleLog[]): Promise<ethers.Log[]> {
10898
const missing = (logToFind: ethers.Log) => {
10999
const logIndex = ignoreLogs.findIndex(
@@ -132,7 +122,7 @@ export class BaseCrossChecker {
132122
const logs = await timeoutWithRetry(() => {
133123
if (!this.provider || !this.provider.provider)
134124
throw new Error('provider not ready')
135-
return this.provider.provider.getLogs(params)
125+
return this.provider?.provider?.getLogs(params)
136126
}, 15 * 1000, 3)
137127
// get ignoreLogs keys
138128
const ignoreLogs = options.ignoreLogs

0 commit comments

Comments
 (0)