4848 Eth1Monitor * = ref object
4949 db: BeaconChainDB
5050 preset: RuntimePreset
51+ depositContractDeployedAt: BlockHashOrNumber
5152
5253 dataProvider: Web3DataProviderRef
5354
@@ -395,7 +396,7 @@ proc init*(T: type Eth1Monitor,
395396 preset: RuntimePreset ,
396397 web3Url: string ,
397398 depositContractAddress: Eth1Address ,
398- depositContractDeployedAt: string ,
399+ depositContractDeployedAt: BlockHashOrNumber ,
399400 eth1Network: Option [Eth1Network ]): Future [Result [T, string ]] {.async .} =
400401 var web3Url = web3Url
401402 fixupWeb3Urls web3Url
@@ -422,31 +423,12 @@ proc init*(T: type Eth1Monitor,
422423 return err (" The specified web3 provider is not attached to the " &
423424 $ eth1Network.get & " network" )
424425
425- let
426- previouslyPersistedTo = db.getEth1PersistedTo ()
427- knownStart = previouslyPersistedTo.get:
428- # `previouslyPersistedTo` wall null, we start from scratch
429- let deployedAtHash = if depositContractDeployedAt.startsWith " 0x" :
430- try : BlockHash .fromHex depositContractDeployedAt
431- except ValueError :
432- return err " Invalid hex value specified for deposit-contract-block"
433- else :
434- let blockNum = try : parseBiggestUInt depositContractDeployedAt
435- except ValueError :
436- return err " Invalid nummeric value for deposit-contract-block"
437- try :
438- let blk = await dataProvider.getBlockByNumber (blockNum)
439- blk.hash
440- except CatchableError :
441- return err (" Failed to obtain block hash for block number " & $ blockNum)
442- Eth1Data (block_hash: deployedAtHash.asEth2Digest, deposit_count: 0 )
443-
444426 return ok T (
445427 db: db,
446428 preset: preset,
429+ depositContractDeployedAt: depositContractDeployedAt,
447430 dataProvider: dataProvider,
448- eth1Progress: newAsyncEvent (),
449- eth1Chain: Eth1Chain (knownStart: knownStart))
431+ eth1Progress: newAsyncEvent ())
450432
451433proc allDepositsUpTo (m: Eth1Monitor , totalDeposits: uint64 ): seq [Deposit ] =
452434 for i in 0 'u64 ..< totalDeposits:
@@ -643,6 +625,7 @@ proc handleEth1Progress(m: Eth1Monitor) {.async.} =
643625 # If we had the same code embedded in the new block headers event,
644626 # it could easily re-order the steps due to the interruptible
645627 # interleaved execution of async code.
628+
646629 var eth1SyncedTo = await m.dataProvider.getBlockNumber (
647630 m.eth1Chain.knownStart.block_hash.asBlockHash)
648631
@@ -686,6 +669,24 @@ proc run(m: Eth1Monitor, delayBeforeStart: Duration) {.async.} =
686669 info " Starting Eth1 deposit contract monitoring" ,
687670 contract = $ m.depositContractAddress, url = m.web3Url
688671
672+ let previouslyPersistedTo = m.db.getEth1PersistedTo ()
673+ m.eth1Chain.knownStart = previouslyPersistedTo.get:
674+ # `previouslyPersistedTo` wall null, we start from scratch
675+ let deployedAtHash = if m.depositContractDeployedAt.isHash:
676+ m.depositContractDeployedAt.hash
677+ else :
678+ var blk: BlockObject
679+ while true :
680+ try :
681+ blk = await m.dataProvider.getBlockByNumber (m.depositContractDeployedAt.number)
682+ break
683+ except CatchableError as err:
684+ error " Failed to obtain details for the starting block of the deposit contract sync. " &
685+ " The Web3 provider may still be not fully synced" , error = err.msg
686+ await sleepAsync (chronos.seconds (10 ))
687+ blk.hash.asEth2Digest
688+ Eth1Data (block_hash: deployedAtHash, deposit_count: 0 )
689+
689690 await m.dataProvider.onBlockHeaders do (blk: Eth1BlockHeader )
690691 {.raises : [Defect ], gcsafe .}:
691692 try :
0 commit comments