11import { CeloProvider } from '@celo-tools/celo-ethers-wrapper'
2+ import { providers } from 'ethers'
23import { config } from 'src/config'
4+ import { STALE_BLOCK_TIME } from 'src/consts'
35import { setIsConnected } from 'src/features/wallet/walletSlice'
46import { logger } from 'src/utils/logger'
57import { promiseTimeout , sleep } from 'src/utils/promises'
8+ import { isStale } from 'src/utils/time'
69import { call , put } from 'typed-redux-saga'
710
811let provider : CeloProvider | undefined
@@ -40,14 +43,11 @@ async function connectToJsonRpcProvider(url: string) {
4043 logger . info ( `Connecting to json rpc provider: ${ url } ` )
4144 provider = new CeloProvider ( url )
4245 for ( let i = 0 ; i < 3 ; i ++ ) {
43- const providerStateP = Promise . all ( [ provider . getBlockNumber ( ) , provider . getNetwork ( ) ] )
44- const providerState = await promiseTimeout ( providerStateP , 1000 )
45- if ( providerState ) {
46- const [ latestBlock , network ] = providerState
47- if ( latestBlock > 0 && network ?. chainId === config . chainId ) {
48- logger . info ( 'Provider is connected' )
49- return true
50- }
46+ const blockAndNetworkP = Promise . all ( [ provider . getBlock ( 'latest' ) , provider . getNetwork ( ) ] )
47+ const blockAndNetwork = await promiseTimeout ( blockAndNetworkP , 1000 )
48+ if ( blockAndNetwork && isProviderSynced ( blockAndNetwork [ 0 ] , blockAndNetwork [ 1 ] ) ) {
49+ logger . info ( 'Provider is connected' )
50+ return true
5151 }
5252 // Otherwise wait a bit and then try again
5353 await sleep ( 1000 )
@@ -60,6 +60,17 @@ async function connectToJsonRpcProvider(url: string) {
6060 }
6161}
6262
63+ function isProviderSynced ( block ?: providers . Block , network ?: providers . Network ) {
64+ return (
65+ block &&
66+ block . number &&
67+ block . timestamp &&
68+ ! isStale ( block . timestamp * 1000 , STALE_BLOCK_TIME ) &&
69+ network &&
70+ network . chainId === config . chainId
71+ )
72+ }
73+
6374export function getProvider ( ) {
6475 if ( ! provider ) {
6576 logger . error ( 'Provider is not yet initialized' )
0 commit comments