@@ -28,8 +28,7 @@ pub enum ProofsFetcherError {
2828pub struct ProofsFetcher {
2929 rpc_provider : RPCProvider ,
3030 aligned_service_manager : AlignedLayerServiceManagerContract ,
31- fetch_from_secs_ago : u64 ,
32- block_time_secs : u64 ,
31+ last_aggregated_block : u64 ,
3332}
3433
3534impl ProofsFetcher {
@@ -42,31 +41,52 @@ impl ProofsFetcher {
4241 rpc_provider. clone ( ) ,
4342 ) ;
4443
44+ let last_aggregated_block = config. get_last_aggregated_block ( ) . unwrap ( ) ;
45+
4546 Self {
4647 rpc_provider,
4748 aligned_service_manager,
48- fetch_from_secs_ago : config. fetch_logs_from_secs_ago ,
49- block_time_secs : config. block_time_secs ,
49+ last_aggregated_block,
5050 }
5151 }
5252
53- pub async fn fetch ( & self , engine : ZKVMEngine ) -> Result < Vec < AlignedProof > , ProofsFetcherError > {
54- let from_block = self . get_block_number_to_fetch_from ( ) . await ?;
53+ pub async fn fetch (
54+ & mut self ,
55+ engine : ZKVMEngine ,
56+ ) -> Result < Vec < AlignedProof > , ProofsFetcherError > {
57+ // Get current block
58+ let current_block = self
59+ . rpc_provider
60+ . get_block_number ( )
61+ . await
62+ . map_err ( |e| ProofsFetcherError :: GetBlockNumber ( e. to_string ( ) ) ) ?;
63+
64+ if current_block < self . last_aggregated_block {
65+ return Err ( ProofsFetcherError :: GetBlockNumber (
66+ "Invalid last processed block" . to_string ( ) ,
67+ ) ) ;
68+ }
69+
5570 info ! (
56- "Fetching proofs from batch logs starting from block number {}" ,
57- from_block
71+ "Fetching proofs from batch logs starting from block number {} upto {} " ,
72+ self . last_aggregated_block , current_block
5873 ) ;
74+
5975 // Subscribe to NewBatch event from AlignedServiceManager
6076 let logs = self
6177 . aligned_service_manager
6278 . NewBatchV3_filter ( )
63- . from_block ( from_block)
79+ . from_block ( self . last_aggregated_block )
80+ . to_block ( current_block)
6481 . query ( )
6582 . await
6683 . map_err ( |e| ProofsFetcherError :: GetLogs ( e. to_string ( ) ) ) ?;
6784
6885 info ! ( "Logs collected {}" , logs. len( ) ) ;
6986
87+ // Update last processed block after collecting logs
88+ self . last_aggregated_block = current_block;
89+
7090 let mut proofs = vec ! [ ] ;
7191
7292 for ( batch, _) in logs {
@@ -145,15 +165,7 @@ impl ProofsFetcher {
145165 Ok ( proofs)
146166 }
147167
148- async fn get_block_number_to_fetch_from ( & self ) -> Result < u64 , ProofsFetcherError > {
149- let block_number = self
150- . rpc_provider
151- . get_block_number ( )
152- . await
153- . map_err ( |e| ProofsFetcherError :: GetBlockNumber ( e. to_string ( ) ) ) ?;
154-
155- let number_of_blocks_in_the_past = self . fetch_from_secs_ago / self . block_time_secs ;
156-
157- Ok ( block_number. saturating_sub ( number_of_blocks_in_the_past) )
168+ pub fn get_last_aggregated_block ( & self ) -> u64 {
169+ self . last_aggregated_block
158170 }
159171}
0 commit comments