@@ -1271,9 +1271,15 @@ func (e *EthereumClient) startPollingHeaders() error {
12711271 pollInterval := time .Second * 5
12721272 ticker := time .NewTicker (pollInterval )
12731273 e .subscriptionWg .Add (1 )
1274+
1275+ latestHeader , err := e .HeaderByNumber (context .Background (), nil ) // Fetch the latest header
1276+ if err != nil {
1277+ return fmt .Errorf ("failed to fetch the latest header during initialization: %w" , err )
1278+ }
12741279 go func () {
12751280 defer e .subscriptionWg .Done ()
1276- lastHeaderNumber := uint64 (0 )
1281+ // Initialize lastHeaderNumber dynamically
1282+ lastHeaderNumber := latestHeader .Number .Uint64 () - 1
12771283 for {
12781284 select {
12791285 case <- ticker .C :
@@ -1288,6 +1294,21 @@ func (e *EthereumClient) startPollingHeaders() error {
12881294 e .l .Error ().Err (err ).Msg ("Error processing header" )
12891295 continue
12901296 }
1297+
1298+ // Process headers from (lastHeaderNumber + 1) to latestHeader.Number
1299+ // We may need to add a rate limiter, if we run into issues.
1300+ for blockNum := lastHeaderNumber + 1 ; blockNum <= latestHeader .Number .Uint64 (); blockNum ++ {
1301+ header , err := e .HeaderByNumber (context .Background (), big .NewInt (int64 (blockNum )))
1302+ if err != nil {
1303+ e .l .Error ().Err (err ).Uint64 ("BlockNumber" , blockNum ).Msg ("Error fetching header during range processing" )
1304+ continue
1305+ }
1306+ lastHeaderNumber = header .Number .Uint64 ()
1307+ if err := e .receiveHeader (header ); err != nil {
1308+ e .l .Error ().Err (err ).Uint64 ("BlockNumber" , blockNum ).Msg ("Error processing header" )
1309+ continue
1310+ }
1311+ }
12911312 }
12921313 case <- e .doneChan :
12931314 e .l .Debug ().Str ("Network" , e .NetworkConfig .Name ).Msg ("Polling loop cancelled" )
0 commit comments