Skip to content

Commit 47cc145

Browse files
committed
ethereum: fix issue causing to skip signature in EthereumCallFilter
The and_modify().or_insert() pattern lost the first signature for each address because and_modify() only runs for existing entries. This caused call handlers to miss triggers for the first registered function selector.
1 parent dc48c6c commit 47cc145

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

chain/ethereum/src/adapter.rs

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -770,15 +770,13 @@ impl FromIterator<(BlockNumber, Address, FunctionSelector)> for EthereumCallFilt
770770
let mut lookup: HashMap<Address, (BlockNumber, HashSet<FunctionSelector>)> = HashMap::new();
771771
iter.into_iter()
772772
.for_each(|(start_block, address, function_signature)| {
773-
lookup
773+
let entry = lookup
774774
.entry(address)
775-
.and_modify(|set| {
776-
if set.0 > start_block {
777-
set.0 = start_block
778-
}
779-
set.1.insert(function_signature);
780-
})
781775
.or_insert((start_block, HashSet::default()));
776+
if entry.0 > start_block {
777+
entry.0 = start_block;
778+
}
779+
entry.1.insert(function_signature);
782780
});
783781
EthereumCallFilter {
784782
contract_addresses_function_signatures: lookup,
@@ -1831,6 +1829,25 @@ fn complete_log_filter() {
18311829
}
18321830
}
18331831

1832+
#[test]
1833+
fn test_call_filter_first_signature_not_lost() {
1834+
use crate::adapter::{EthereumCallFilter, FunctionSelector};
1835+
use graph::prelude::web3::types::Address;
1836+
1837+
let addr = Address::from_low_u64_be(1);
1838+
let sig1: FunctionSelector = [0xaa, 0xbb, 0xcc, 0xdd];
1839+
let sig2: FunctionSelector = [0x11, 0x22, 0x33, 0x44];
1840+
1841+
let filter: EthereumCallFilter = vec![(100i32, addr, sig1), (100i32, addr, sig2)]
1842+
.into_iter()
1843+
.collect();
1844+
1845+
let (_, sigs) = filter.contract_addresses_function_signatures.get(&addr).unwrap();
1846+
assert_eq!(sigs.len(), 2);
1847+
assert!(sigs.contains(&sig1));
1848+
assert!(sigs.contains(&sig2));
1849+
}
1850+
18341851
#[test]
18351852
fn log_filter_require_transacion_receipt_method() {
18361853
// test data

0 commit comments

Comments
 (0)