@@ -24,8 +24,7 @@ pub enum ProofsFetcherError {
2424pub struct ProofsFetcher {
2525 rpc_provider : RPCProvider ,
2626 aligned_service_manager : AlignedLayerServiceManagerContract ,
27- fetch_from_secs_ago : u64 ,
28- block_time_secs : u64 ,
27+ last_aggregated_block : u64 ,
2928}
3029
3130impl ProofsFetcher {
@@ -38,31 +37,49 @@ impl ProofsFetcher {
3837 rpc_provider. clone ( ) ,
3938 ) ;
4039
40+ let last_aggregated_block = config. get_last_aggregated_block ( ) . unwrap ( ) ;
41+
4142 Self {
4243 rpc_provider,
4344 aligned_service_manager,
44- fetch_from_secs_ago : config. fetch_logs_from_secs_ago ,
45- block_time_secs : config. block_time_secs ,
45+ last_aggregated_block,
4646 }
4747 }
4848
49- pub async fn fetch ( & self ) -> Result < Vec < AlignedProof > , ProofsFetcherError > {
50- let from_block = self . get_block_number_to_fetch_from ( ) . await ?;
49+ pub async fn fetch ( & mut self ) -> Result < Vec < AlignedProof > , ProofsFetcherError > {
50+ // Get current block
51+ let current_block = self
52+ . rpc_provider
53+ . get_block_number ( )
54+ . await
55+ . map_err ( |e| ProofsFetcherError :: GetBlockNumber ( e. to_string ( ) ) ) ?;
56+
57+ if current_block < self . last_aggregated_block {
58+ return Err ( ProofsFetcherError :: GetBlockNumber (
59+ "Invalid last processed block" . to_string ( ) ,
60+ ) ) ;
61+ }
62+
5163 info ! (
52- "Fetching proofs from batch logs starting from block number {}" ,
53- from_block
64+ "Fetching proofs from batch logs starting from block number {} upto {} " ,
65+ self . last_aggregated_block , current_block
5466 ) ;
67+
5568 // Subscribe to NewBatch event from AlignedServiceManager
5669 let logs = self
5770 . aligned_service_manager
5871 . NewBatchV3_filter ( )
59- . from_block ( from_block)
72+ . from_block ( self . last_aggregated_block )
73+ . to_block ( current_block)
6074 . query ( )
6175 . await
6276 . map_err ( |e| ProofsFetcherError :: GetLogs ( e. to_string ( ) ) ) ?;
6377
6478 info ! ( "Logs collected {}" , logs. len( ) ) ;
6579
80+ // Update last processed block after collecting logs
81+ self . last_aggregated_block = current_block;
82+
6683 let mut proofs = vec ! [ ] ;
6784
6885 for ( batch, _) in logs {
@@ -119,15 +136,7 @@ impl ProofsFetcher {
119136 Ok ( proofs)
120137 }
121138
122- async fn get_block_number_to_fetch_from ( & self ) -> Result < u64 , ProofsFetcherError > {
123- let block_number = self
124- . rpc_provider
125- . get_block_number ( )
126- . await
127- . map_err ( |e| ProofsFetcherError :: GetBlockNumber ( e. to_string ( ) ) ) ?;
128-
129- let number_of_blocks_in_the_past = self . fetch_from_secs_ago / self . block_time_secs ;
130-
131- Ok ( block_number. saturating_sub ( number_of_blocks_in_the_past) )
139+ pub fn get_last_aggregated_block ( & self ) -> u64 {
140+ self . last_aggregated_block
132141 }
133142}
0 commit comments