@@ -12,7 +12,7 @@ use async_trait::async_trait;
1212use papyrus_base_layer:: { BaseLayerContract , L1BlockHeader , L1BlockNumber } ;
1313use starknet_api:: block:: GasPrice ;
1414use thiserror:: Error ;
15- use tracing:: { error, info, trace} ;
15+ use tracing:: { error, info, trace, warn } ;
1616
1717use crate :: metrics:: {
1818 register_scraper_metrics,
@@ -63,6 +63,31 @@ impl<B: BaseLayerContract + Send + Sync + Debug> L1GasPriceScraper<B> {
6363 Self { config, l1_gas_price_provider, base_layer, last_l1_header : None }
6464 }
6565
66+ pub async fn get_first_block_number ( & mut self ) -> L1BlockNumber {
67+ if let Some ( block) = self . config . starting_block {
68+ return block;
69+ } ;
70+ loop {
71+ let latest = self . latest_l1_block_number ( ) . await ;
72+ let Ok ( latest) = latest else {
73+ warn ! (
74+ "Scraper startup failure: could not get the latest L1 block number: {latest:?}"
75+ ) ;
76+ L1_GAS_PRICE_SCRAPER_BASELAYER_ERROR_COUNT . increment ( 1 ) ;
77+ tokio:: time:: sleep ( self . config . polling_interval ) . await ;
78+ continue ;
79+ } ;
80+ // If no starting block is provided, the default is to start from
81+ // startup_num_blocks_multiplier * number_of_blocks_for_mean before the tip of
82+ // L1. Note that for new chains this subtraction may be
83+ // negative, hence the use of saturating_sub.
84+ let latest = latest. saturating_sub (
85+ self . config . number_of_blocks_for_mean * self . config . startup_num_blocks_multiplier ,
86+ ) ;
87+ return latest;
88+ }
89+ }
90+
6691 /// Run the scraper, starting from the given L1 `block_number`, indefinitely.
6792 pub async fn run ( & mut self , mut block_number : L1BlockNumber ) -> L1GasPriceScraperResult < ( ) , B > {
6893 self . l1_gas_price_provider
@@ -174,24 +199,12 @@ where
174199 async fn start ( & mut self ) {
175200 info ! ( "Starting component {}." , type_name:: <Self >( ) ) ;
176201 register_scraper_metrics ( ) ;
177- let start_from = match self . config . starting_block {
178- Some ( block) => block,
179- None => {
180- let latest = self
181- . latest_l1_block_number ( )
182- . await
183- . expect ( "Failed to get the latest L1 block number at startup" ) ;
184-
185- // If no starting block is provided, the default is to start from
186- // startup_num_blocks_multiplier * number_of_blocks_for_mean before the tip of L1.
187- // Note that for new chains this subtraction may be negative,
188- // hence the use of saturating_sub.
189- latest. saturating_sub (
190- self . config . number_of_blocks_for_mean
191- * self . config . startup_num_blocks_multiplier ,
192- )
193- }
194- } ;
195- self . run ( start_from) . await . unwrap_or_else ( |e| panic ! ( "L1 gas price scraper failed: {e}" ) )
202+ // Loop and retry base layer until we successfully get the first block number.
203+ let first_block_number = self . get_first_block_number ( ) . await ;
204+
205+ // Run the scraper on an endless loop.
206+ self . run ( first_block_number)
207+ . await
208+ . unwrap_or_else ( |e| panic ! ( "L1 gas price scraper failed: {e}" ) )
196209 }
197210}
0 commit comments