@@ -8,6 +8,7 @@ use crate::{
88use alloy:: {
99 eips:: BlockNumberOrTag ,
1010 network:: Network ,
11+ primitives:: Address ,
1112 providers:: Provider ,
1213 rpc:: types:: { Filter , Log } ,
1314 transports:: http:: reqwest:: Url ,
@@ -38,38 +39,45 @@ impl EventScannerBuilder {
3839 }
3940 }
4041
41- pub fn with_event_filter ( & mut self , filter : EventFilter ) -> & mut Self {
42+ #[ must_use]
43+ pub fn with_event_filter ( mut self , filter : EventFilter ) -> Self {
4244 self . tracked_events . push ( filter) ;
4345 self
4446 }
4547
46- pub fn with_event_filters ( & mut self , filters : Vec < EventFilter > ) -> & mut Self {
48+ #[ must_use]
49+ pub fn with_event_filters ( mut self , filters : Vec < EventFilter > ) -> Self {
4750 self . tracked_events . extend ( filters) ;
4851 self
4952 }
5053
51- pub fn with_callback_strategy ( & mut self , strategy : Arc < dyn CallbackStrategy > ) -> & mut Self {
54+ #[ must_use]
55+ pub fn with_callback_strategy ( mut self , strategy : Arc < dyn CallbackStrategy > ) -> Self {
5256 self . callback_strategy = strategy;
5357 self
5458 }
5559
56- pub fn with_blocks_read_per_epoch ( & mut self , blocks_read_per_epoch : usize ) -> & mut Self {
57- let _ = self . block_scanner . with_blocks_read_per_epoch ( blocks_read_per_epoch) ;
60+ #[ must_use]
61+ pub fn with_blocks_read_per_epoch ( mut self , blocks_read_per_epoch : usize ) -> Self {
62+ self . block_scanner = self . block_scanner . with_blocks_read_per_epoch ( blocks_read_per_epoch) ;
5863 self
5964 }
6065
61- pub fn with_reorg_rewind_depth ( & mut self , reorg_rewind_depth : u64 ) -> & mut Self {
62- let _ = self . block_scanner . with_reorg_rewind_depth ( reorg_rewind_depth) ;
66+ #[ must_use]
67+ pub fn with_reorg_rewind_depth ( mut self , reorg_rewind_depth : u64 ) -> Self {
68+ self . block_scanner = self . block_scanner . with_reorg_rewind_depth ( reorg_rewind_depth) ;
6369 self
6470 }
6571
66- pub fn with_retry_interval ( & mut self , retry_interval : Duration ) -> & mut Self {
67- let _ = self . block_scanner . with_retry_interval ( retry_interval) ;
72+ #[ must_use]
73+ pub fn with_retry_interval ( mut self , retry_interval : Duration ) -> Self {
74+ self . block_scanner = self . block_scanner . with_retry_interval ( retry_interval) ;
6875 self
6976 }
7077
71- pub fn with_block_confirmations ( & mut self , block_confirmations : u64 ) -> & mut Self {
72- let _ = self . block_scanner . with_block_confirmations ( block_confirmations) ;
78+ #[ must_use]
79+ pub fn with_block_confirmations ( mut self , block_confirmations : u64 ) -> Self {
80+ self . block_scanner = self . block_scanner . with_block_confirmations ( block_confirmations) ;
7381 self
7482 }
7583
@@ -119,6 +127,12 @@ pub struct EventScanner<N: Network> {
119127 callback_strategy : Arc < dyn CallbackStrategy > ,
120128}
121129
130+ #[ derive( Hash , Eq , PartialEq ) ]
131+ struct EventIdentifier {
132+ contract_address : Address ,
133+ event : String ,
134+ }
135+
122136impl < N : Network > EventScanner < N > {
123137 /// Starts the scanner
124138 ///
@@ -130,29 +144,31 @@ impl<N: Network> EventScanner<N> {
130144 start_height : BlockNumberOrTag ,
131145 end_height : Option < BlockNumberOrTag > ,
132146 ) -> anyhow:: Result < ( ) > {
133- let mut event_channels: HashMap < String , mpsc:: Sender < Log > > = HashMap :: new ( ) ;
147+ let mut event_channels: HashMap < EventIdentifier , mpsc:: Sender < Log > > = HashMap :: new ( ) ;
134148
135149 for filter in & self . tracked_events {
136- let event_name = filter. event . clone ( ) ;
150+ let unique_event = EventIdentifier {
151+ contract_address : filter. contract_address ,
152+ event : filter. event . clone ( ) ,
153+ } ;
137154
138- if event_channels. contains_key ( & event_name ) {
155+ if event_channels. contains_key ( & unique_event ) {
139156 continue ;
140157 }
141158
142159 // TODO: configurable buffer size / smaller buffer ?
143160 let ( sender, receiver) = mpsc:: channel :: < Log > ( 1024 ) ;
144161
145- let event_name_clone = event_name. clone ( ) ;
146162 let callback = filter. callback . clone ( ) ;
147163 let strategy = self . callback_strategy . clone ( ) ;
148164 Self :: spawn_event_callback_task_executors (
149165 receiver,
150166 callback,
151167 strategy,
152- event_name_clone ,
168+ filter . event . clone ( ) ,
153169 ) ;
154170
155- event_channels. insert ( event_name , sender) ;
171+ event_channels. insert ( unique_event , sender) ;
156172 }
157173
158174 let client = self . block_scanner . run ( ) ?;
@@ -199,7 +215,7 @@ impl<N: Network> EventScanner<N> {
199215 & self ,
200216 from_block : u64 ,
201217 to_block : u64 ,
202- event_channels : & HashMap < String , mpsc:: Sender < Log > > ,
218+ event_channels : & HashMap < EventIdentifier , mpsc:: Sender < Log > > ,
203219 ) -> anyhow:: Result < ( ) > {
204220 for event_filter in & self . tracked_events {
205221 let filter = Filter :: new ( )
@@ -222,7 +238,12 @@ impl<N: Network> EventScanner<N> {
222238 "found logs for event in block range"
223239 ) ;
224240
225- if let Some ( sender) = event_channels. get ( & event_filter. event ) {
241+ let event_identifier = EventIdentifier {
242+ contract_address : event_filter. contract_address ,
243+ event : event_filter. event . clone ( ) ,
244+ } ;
245+
246+ if let Some ( sender) = event_channels. get ( & event_identifier) {
226247 for log in logs {
227248 if let Err ( e) = sender. send ( log) . await {
228249 warn ! ( event = %event_filter. event, error = %e, "failed to enqueue log for processing" ) ;
0 commit comments