@@ -27,11 +27,8 @@ pub struct LogsArgs {
2727 to_block : Option < BlockId > ,
2828
2929 /// The contract address to filter on.
30- #[ arg(
31- long,
32- value_parser = NameOrAddress :: from_str
33- ) ]
34- address : Option < NameOrAddress > ,
30+ #[ arg( long, value_parser = NameOrAddress :: from_str) ]
31+ address : Option < Vec < NameOrAddress > > ,
3532
3633 /// The signature of the event to filter logs by which will be converted to the first topic or
3734 /// a topic to filter on.
@@ -61,9 +58,14 @@ impl LogsArgs {
6158 let provider = utils:: get_provider ( & config) ?;
6259
6360 let cast = Cast :: new ( & provider) ;
64-
65- let address = match address {
66- Some ( address) => Some ( address. resolve ( & provider) . await ?) ,
61+ let addresses = match address {
62+ Some ( addresses) => Some (
63+ futures:: future:: try_join_all ( addresses. into_iter ( ) . map ( |address| {
64+ let provider = provider. clone ( ) ;
65+ async move { address. resolve ( & provider) . await }
66+ } ) )
67+ . await ?,
68+ ) ,
6769 None => None ,
6870 } ;
6971
@@ -72,7 +74,7 @@ impl LogsArgs {
7274 let to_block =
7375 cast. convert_block_number ( Some ( to_block. unwrap_or_else ( BlockId :: latest) ) ) . await ?;
7476
75- let filter = build_filter ( from_block, to_block, address , sig_or_topic, topics_or_args) ?;
77+ let filter = build_filter ( from_block, to_block, addresses , sig_or_topic, topics_or_args) ?;
7678
7779 if !subscribe {
7880 let logs = cast. filter_logs ( filter) . await ?;
@@ -101,7 +103,7 @@ impl LogsArgs {
101103fn build_filter (
102104 from_block : Option < BlockNumberOrTag > ,
103105 to_block : Option < BlockNumberOrTag > ,
104- address : Option < Address > ,
106+ address : Option < Vec < Address > > ,
105107 sig_or_topic : Option < String > ,
106108 topics_or_args : Vec < String > ,
107109) -> Result < Filter , eyre:: Error > {
@@ -223,7 +225,9 @@ mod tests {
223225 address : ValueOrArray :: Value ( address. unwrap ( ) ) . into ( ) ,
224226 topics : [ vec ! [ ] . into ( ) , vec ! [ ] . into ( ) , vec ! [ ] . into ( ) , vec ! [ ] . into ( ) ] ,
225227 } ;
226- let filter = build_filter ( from_block, to_block, address, None , vec ! [ ] ) . unwrap ( ) ;
228+ let filter =
229+ build_filter ( from_block, to_block, address. map ( |addr| vec ! [ addr] ) , None , vec ! [ ] )
230+ . unwrap ( ) ;
227231 assert_eq ! ( filter, expected)
228232 }
229233
@@ -365,6 +369,29 @@ mod tests {
365369 assert_eq ! ( filter, expected)
366370 }
367371
372+ #[ test]
373+ fn test_build_filter_with_multiple_addresses ( ) {
374+ let expected = Filter {
375+ block_option : FilterBlockOption :: Range { from_block : None , to_block : None } ,
376+ address : vec ! [ Address :: ZERO , ADDRESS . parse( ) . unwrap( ) ] . into ( ) ,
377+ topics : [
378+ vec ! [ TRANSFER_TOPIC . parse( ) . unwrap( ) ] . into ( ) ,
379+ vec ! [ ] . into ( ) ,
380+ vec ! [ ] . into ( ) ,
381+ vec ! [ ] . into ( ) ,
382+ ] ,
383+ } ;
384+ let filter = build_filter (
385+ None ,
386+ None ,
387+ Some ( vec ! [ Address :: ZERO , ADDRESS . parse( ) . unwrap( ) ] ) ,
388+ Some ( TRANSFER_TOPIC . to_string ( ) ) ,
389+ vec ! [ ] ,
390+ )
391+ . unwrap ( ) ;
392+ assert_eq ! ( filter, expected)
393+ }
394+
368395 #[ test]
369396 fn test_build_filter_sig_with_mismatched_argument ( ) {
370397 let err = build_filter (
0 commit comments