66 "database/sql"
77 "encoding/binary"
88 "encoding/hex"
9+ "errors"
910 "fmt"
1011 "math/big"
1112 "sync/atomic"
@@ -101,27 +102,39 @@ func (d *executionDepositsExporter) Init() error {
101102 }
102103 d .DepositMethod = depositMethod
103104
104- // check if any log_index is missing, if yes we have to do a soft re-export
105- // ideally i would check for gaps in the merkletree-index column, but this is extremely annoying as its stored as little endian bytes in the db
106- var isV2Check bool
107- err = db .WriterDb .Get (& isV2Check , "select count(*) = count(log_index) as is_v2 from eth1_deposits" )
105+ // check for gaps in the merkletree-index column
106+ log .Info ("checking for gaps in eth1_deposits table" )
107+ gapsInTable , err := db .GetGapsInEth1DepositsTable ()
108108 if err != nil {
109109 return err
110110 }
111+ log .Infof ("found %v gaps in eth1_deposits table" , len (gapsInTable ))
111112
112- if isV2Check {
113- // get latest block from db
114- err = db . WriterDb . Get ( & d . LastExportedBlock , "select block_number from eth1_deposits order by block_number desc limit 1" )
113+ for _ , gap := range gapsInTable {
114+ log . Infof ( "gap in eth1_deposits table: %v" , gap )
115+ deposits , err := d . fetchDeposits ( uint64 ( gap . FromBlock ), uint64 ( gap . ToBlock ) )
115116 if err != nil {
116- if err == sql .ErrNoRows {
117- d .LastExportedBlock = utils .Config .Indexer .ELDepositContractFirstBlock
118- } else {
119- return err
120- }
117+ return err
118+ }
119+ // can return more than the expected missing deposits as the start and end blocks are inclusive
120+ if int64 (len (deposits )) < gap .MissingCount {
121+ return fmt .Errorf ("only %d of %d expected deposits found for gap in eth1_deposits table: %v" , len (deposits ), gap .MissingCount , gap )
122+ }
123+ log .Infof ("saving %v deposits" , len (deposits ))
124+ err = d .saveDeposits (deposits )
125+ if err != nil {
126+ return err
127+ }
128+ }
129+
130+ // get latest block from db
131+ err = db .WriterDb .Get (& d .LastExportedBlock , "select block_number from eth1_deposits order by block_number desc limit 1" )
132+ if err != nil {
133+ if errors .Is (err , sql .ErrNoRows ) {
134+ d .LastExportedBlock = utils .Config .Indexer .ELDepositContractFirstBlock
135+ } else {
136+ return err
121137 }
122- } else {
123- log .Warnf ("log_index is missing in eth1_deposits table, starting from the beginning" )
124- d .LastExportedBlock = utils .Config .Indexer .ELDepositContractFirstBlock
125138 }
126139
127140 val , err := db .PersistentRedisDbClient .Get (context .Background (), d .LastExportedFinalizedBlockRedisKey ).Uint64 ()
@@ -561,7 +574,6 @@ func (d *executionDepositsExporter) batchRequestHeadersAndTxs(blocksToFetch []ui
561574 elems := make ([]gethrpc.BatchElem , 0 , len (blocksToFetch )+ len (txsToFetch ))
562575 headers := make (map [uint64 ]* gethtypes.Header , len (blocksToFetch ))
563576 txs := make (map [string ]* gethtypes.Transaction , len (txsToFetch ))
564- errors := make ([]error , 0 , len (blocksToFetch )+ len (txsToFetch ))
565577
566578 for _ , b := range blocksToFetch {
567579 header := & gethtypes.Header {}
@@ -573,7 +585,6 @@ func (d *executionDepositsExporter) batchRequestHeadersAndTxs(blocksToFetch []ui
573585 Error : err ,
574586 })
575587 headers [b ] = header
576- errors = append (errors , err )
577588 }
578589
579590 for _ , txHashHex := range txsToFetch {
@@ -586,7 +597,6 @@ func (d *executionDepositsExporter) batchRequestHeadersAndTxs(blocksToFetch []ui
586597 Error : err ,
587598 })
588599 txs [txHashHex ] = tx
589- errors = append (errors , err )
590600 }
591601
592602 lenElems := len (elems )
@@ -596,7 +606,7 @@ func (d *executionDepositsExporter) batchRequestHeadersAndTxs(blocksToFetch []ui
596606 }
597607
598608 for i := 0 ; (i * 100 ) < lenElems ; i ++ {
599- start := ( i * 100 )
609+ start := i * 100
600610 end := start + 100
601611
602612 if end > lenElems {
@@ -609,9 +619,9 @@ func (d *executionDepositsExporter) batchRequestHeadersAndTxs(blocksToFetch []ui
609619 }
610620 }
611621
612- for _ , e := range errors {
613- if e != nil {
614- return nil , nil , e
622+ for _ , e := range elems {
623+ if e . Error != nil {
624+ return nil , nil , e . Error
615625 }
616626 }
617627
0 commit comments