@@ -578,6 +578,8 @@ impl<N: Network> Service<N> {
578578
579579 self . next_start_block = BlockHashAndNumber :: from_header :: < N > ( start. header ( ) ) ;
580580
581+ // must be <= to include the edge case when start == end (i.e. return the single block
582+ // range)
581583 while self . next_start_block . number <= end. header ( ) . number ( ) {
582584 self . ensure_current_not_reorged ( ) . await ?;
583585
@@ -592,18 +594,29 @@ impl<N: Network> Service<N> {
592594 ) )
593595 . await ;
594596
595- let next_start_block_number = ( batch_end_block_number + 1 ) . into ( ) ;
596- self . next_start_block = self
597- . provider
598- . get_block_by_number ( next_start_block_number)
599- . await ?
600- . map ( |block| BlockHashAndNumber :: from_header :: < N > ( block. header ( ) ) )
601- . ok_or ( BlockRangeScannerError :: BlockNotFound ( next_start_block_number) ) ?;
602-
603597 batch_count += 1 ;
604598 if batch_count % 10 == 0 {
605599 debug ! ( batch_count = batch_count, "Processed historical batches" ) ;
606600 }
601+
602+ if batch_end_block_number == end. header ( ) . number ( ) {
603+ break ;
604+ }
605+
606+ let next_start_block_number = ( batch_end_block_number + 1 ) . into ( ) ;
607+ let next_start_block =
608+ match self . provider . get_block_by_number ( next_start_block_number) . await {
609+ Ok ( block) => {
610+ block. expect ( "block number is less than 'end', so it should exist" )
611+ }
612+ Err ( e) => {
613+ error ! ( error = %e, "Failed to get block by number" ) ;
614+ let e: BlockRangeScannerError = e. into ( ) ;
615+ self . send_to_subscriber ( BlockRangeMessage :: Error ( e. clone ( ) ) ) . await ;
616+ return Err ( e) ;
617+ }
618+ } ;
619+ self . next_start_block = BlockHashAndNumber :: from_header :: < N > ( next_start_block. header ( ) ) ;
607620 }
608621
609622 info ! ( batch_count = batch_count, "Historical sync completed" ) ;
0 commit comments