@@ -155,6 +155,48 @@ async fn latest_block_number_goes_down() {
155155 assert_eq ! ( scraper. fetch_events( ) . await , Ok ( ( expected_block_reference, vec![ ] ) ) ) ;
156156}
157157
158+ #[ tokio:: test]
159+ async fn base_layer_returns_block_number_below_finality ( ) {
160+ // Setup.
161+ const FINALITY : u64 = 10 ;
162+ const INITIAL_L1_BLOCK_NUMBER : u64 = 100 ;
163+ const INITIAL_L1_BLOCK_HASH : L1BlockHash = L1BlockHash ( [ 123 ; 32 ] ) ;
164+ const WRONG_L1_BLOCK_NUMBER : u64 = 5 ;
165+
166+ let initial_block_reference =
167+ L1BlockReference { number : INITIAL_L1_BLOCK_NUMBER , hash : INITIAL_L1_BLOCK_HASH } ;
168+
169+ let latest_l1_block_number_response = Arc :: new ( AtomicU64 :: new ( INITIAL_L1_BLOCK_NUMBER ) ) ;
170+ let latest_l1_block_number_response_clone = latest_l1_block_number_response. clone ( ) ;
171+
172+ let mut dummy_base_layer: MockBaseLayerContract = MockBaseLayerContract :: new ( ) ;
173+
174+ dummy_base_layer
175+ . expect_latest_l1_block_number ( )
176+ . returning ( move || Ok ( latest_l1_block_number_response_clone. load ( Ordering :: Relaxed ) ) ) ;
177+ dummy_base_layer. expect_l1_block_at ( ) . returning ( move |number| {
178+ Ok ( Some ( L1BlockReference { number, hash : INITIAL_L1_BLOCK_HASH } ) )
179+ } ) ;
180+
181+ let mut scraper = scraper_with_dummy ( ) . await ;
182+ scraper. config . finality = FINALITY ;
183+
184+ scraper. scrape_from_this_l1_block = Some ( initial_block_reference) ;
185+ scraper. base_layer = dummy_base_layer;
186+
187+ // Test.
188+ assert_eq ! ( scraper. send_events_to_l1_provider( ) . await , Ok ( ( ) ) ) ;
189+
190+ // Simulate a base layer returning a lower block number.
191+ latest_l1_block_number_response. store ( WRONG_L1_BLOCK_NUMBER , Ordering :: Relaxed ) ;
192+
193+ // The scraper should return a finality too high error.
194+ assert_matches ! (
195+ scraper. send_events_to_l1_provider( ) . await ,
196+ Err ( L1ScraperError :: FinalityTooHigh { .. } )
197+ ) ;
198+ }
199+
158200#[ test]
159201#[ ignore = "similar to backlog_happy_flow, only shorter, and sprinkle some start_block/get_txs \
160202 attempts while its bootstrapping (and assert failure on height), then assert that they \
0 commit comments