Commit c6c9c7db authored by Kelvin Fichter's avatar Kelvin Fichter

feat(fd): have fault detector wait for providers

Updates the fault detector to wait for its L1 and L2 RPC providers using
a new utility function in common-ts. This will prevent errors that users
currently experience with the fault detector.
parent 2f50e29d
---
'@eth-optimism/common-ts': patch
---
Adds a function for waiting for ethers providers
---
'@eth-optimism/fault-detector': patch
---
Fault detector will now wait for providers to be connected
export * from './logger' export * from './logger'
export * from './metrics' export * from './metrics'
export * from './provider'
import { Provider } from '@ethersproject/abstract-provider'
import { sleep } from '@eth-optimism/core-utils'
import { Logger } from './logger'
/**
* Waits for an Ethers provider to be connected.
*
* @param provider Ethers provider to check.
* @param opts Options for the function.
* @param opts.logger Logger to use.
* @param opts.intervalMs Interval to wait between checks.
* @param opts.name Name of the provider for logs.
*/
export const waitForProvider = async (
provider: Provider,
opts?: {
logger?: Logger
intervalMs?: number
name?: string
}
) => {
opts?.logger?.info(`waiting for ${opts?.name || 'target'} provider...`)
let connected = false
while (!connected) {
try {
await provider.getBlockNumber()
connected = true
} catch (e) {
opts?.logger?.info(`${provider} provider not connected, retrying...`)
// Don't spam requests
await sleep(opts?.intervalMs || 15000)
}
}
opts?.logger?.info(`${opts?.name || 'target'} provider connected`)
}
...@@ -4,6 +4,7 @@ import { ...@@ -4,6 +4,7 @@ import {
ExpressRouter, ExpressRouter,
Gauge, Gauge,
validators, validators,
waitForProvider,
} from '@eth-optimism/common-ts' } from '@eth-optimism/common-ts'
import { getChainId, sleep, toRpcHexString } from '@eth-optimism/core-utils' import { getChainId, sleep, toRpcHexString } from '@eth-optimism/core-utils'
import { CrossChainMessenger } from '@eth-optimism/sdk' import { CrossChainMessenger } from '@eth-optimism/sdk'
...@@ -85,6 +86,18 @@ export class FaultDetector extends BaseServiceV2<Options, Metrics, State> { ...@@ -85,6 +86,18 @@ export class FaultDetector extends BaseServiceV2<Options, Metrics, State> {
} }
async init(): Promise<void> { async init(): Promise<void> {
// Connect to L1.
await waitForProvider(this.options.l1RpcProvider, {
logger: this.logger,
name: 'L1',
})
// Connect to L2.
await waitForProvider(this.options.l2RpcProvider, {
logger: this.logger,
name: 'L2',
})
this.state.messenger = new CrossChainMessenger({ this.state.messenger = new CrossChainMessenger({
l1SignerOrProvider: this.options.l1RpcProvider, l1SignerOrProvider: this.options.l1RpcProvider,
l2SignerOrProvider: this.options.l2RpcProvider, l2SignerOrProvider: this.options.l2RpcProvider,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment