Skip to content

Commit 28cff37

Browse files
committed
feat(cast): allow logs filtering on multiple addresses
1 parent 87a024e commit 28cff37

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

crates/cast/src/cmd/logs.rs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
101103
fn 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

Comments
 (0)