@@ -199,3 +199,99 @@ async fn scan_latest_multiple_listeners_to_same_event_receive_same_results() ->
199199
200200 Ok ( ( ) )
201201}
202+
203+ #[ tokio:: test]
204+ async fn scan_latest_different_filters_receive_different_results ( ) -> anyhow:: Result < ( ) > {
205+ let setup = setup_scanner ( None , None , None ) . await ?;
206+ let contract = setup. contract ;
207+ let mut client = setup. client ;
208+
209+ // First listener for CountDecreased
210+ let filter_inc = EventFilter :: new ( )
211+ . with_contract_address ( * contract. address ( ) )
212+ . with_event ( TestCounter :: CountIncreased :: SIGNATURE ) ;
213+ let mut stream_inc = client. create_event_stream ( filter_inc) ;
214+
215+ // Second listener for CountDecreased
216+ let filter_dec = EventFilter :: new ( )
217+ . with_contract_address ( * contract. address ( ) )
218+ . with_event ( TestCounter :: CountDecreased :: SIGNATURE ) ;
219+ let mut stream_dec = client. create_event_stream ( filter_dec) ;
220+
221+ // Produce 5 increases, then 2 decreases
222+ let mut inc_hashes: Vec < FixedBytes < 32 > > = Vec :: new ( ) ;
223+ for _ in 0 ..5u8 {
224+ let r = contract. increase ( ) . send ( ) . await ?. get_receipt ( ) . await ?;
225+ inc_hashes. push ( r. transaction_hash ) ;
226+ }
227+ let mut dec_hashes: Vec < FixedBytes < 32 > > = Vec :: new ( ) ;
228+ for _ in 0 ..2u8 {
229+ let r = contract. decrease ( ) . send ( ) . await ?. get_receipt ( ) . await ?;
230+ dec_hashes. push ( r. transaction_hash ) ;
231+ }
232+
233+ // Ask for latest 3 across the full range: each filtered listener should receive their own last
234+ // 3 events
235+ client. scan_latest ( 3 , BlockNumberOrTag :: Earliest , BlockNumberOrTag :: Latest ) . await ?;
236+
237+ let logs_inc = collect_events ( & mut stream_inc) . await ;
238+ let logs_dec = collect_events ( & mut stream_dec) . await ;
239+
240+ // Should be different sequences and lengths match the requested count (or fewer if not enough)
241+ assert_eq ! ( logs_inc. len( ) , 3 ) ;
242+ assert_eq ! ( logs_dec. len( ) , 2 ) ; // only 2 decreases exist
243+
244+ // Validate increases: expect counts 3,4,5 and the corresponding tx hashes from inc_hashes[2..5]
245+ let expected_hashes_inc = inc_hashes[ 2 ..5 ] . to_vec ( ) ;
246+ assert_ordering ( logs_inc, 3 , expected_hashes_inc, contract. address ( ) ) ;
247+
248+ // Validate decreases: expect counts 4,3 (after two decreases)
249+ let mut expected_count_dec = U256 :: from ( 4 ) ;
250+ for ( log, & expected_hash) in logs_dec. iter ( ) . zip ( dec_hashes. iter ( ) ) {
251+ let ev = log. log_decode :: < TestCounter :: CountDecreased > ( ) ?;
252+ assert_eq ! ( & ev. address( ) , contract. address( ) ) ;
253+ assert_eq ! ( ev. transaction_hash. unwrap( ) , expected_hash) ;
254+ assert_eq ! ( ev. inner. newCount, expected_count_dec) ;
255+ expected_count_dec -= ONE ;
256+ }
257+
258+ Ok ( ( ) )
259+ }
260+
261+ #[ tokio:: test]
262+ async fn scan_latest_ignores_reorg_and_returns_canonical_latest ( ) -> anyhow:: Result < ( ) > {
263+ let setup = setup_scanner ( None , None , None ) . await ?;
264+ let contract = setup. contract ;
265+ let provider = setup. provider ;
266+ let client = setup. client ;
267+ let mut stream = setup. stream ;
268+
269+ // Create 4 events, then reorg last 2 blocks with 2 new txs
270+ let _initial_hashes = crate :: common:: reorg_with_new_count_incr_txs (
271+ provider. clone ( ) ,
272+ contract. clone ( ) ,
273+ 4 , // num_initial_events
274+ 2 , // num_new_events (these will be the canonical latest)
275+ 2 , // reorg depth
276+ false , // place new events in separate blocks
277+ )
278+ . await ?;
279+
280+ // Now query latest 2 from full range
281+ client. scan_latest ( 2 , BlockNumberOrTag :: Earliest , BlockNumberOrTag :: Latest ) . await ?;
282+
283+ let logs = collect_events ( & mut stream) . await ;
284+ assert_eq ! ( logs. len( ) , 2 ) ;
285+
286+ // After reorg, counts should be 3 and 4 (the chain kept the first two increments; then two new
287+ // increments) Validate exact address, tx hashes ordering via decode and count values.
288+ let mut expected_count = U256 :: from ( 3u64 ) ;
289+ for log in & logs {
290+ let ev = log. log_decode :: < TestCounter :: CountIncreased > ( ) ?;
291+ assert_eq ! ( & ev. address( ) , contract. address( ) ) ;
292+ assert_eq ! ( ev. inner. newCount, expected_count) ;
293+ expected_count += ONE ;
294+ }
295+
296+ Ok ( ( ) )
297+ }
0 commit comments