From 33e5f6a23612d94eecc4210d5a5dee10794583ea Mon Sep 17 00:00:00 2001 From: Florian Pellissier <111426680+flopell@users.noreply.github.com> Date: Fri, 19 Jul 2024 12:18:58 +0200 Subject: [PATCH 1/2] fix(substreams): Fix storage changes indexing for DELEGATECALL --- substreams/crates/tycho-substreams/src/contract.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/substreams/crates/tycho-substreams/src/contract.rs b/substreams/crates/tycho-substreams/src/contract.rs index 250da36..84bf079 100644 --- a/substreams/crates/tycho-substreams/src/contract.rs +++ b/substreams/crates/tycho-substreams/src/contract.rs @@ -131,7 +131,11 @@ pub fn extract_contract_changes bool>( block_tx .calls .iter() - .filter(|call| !call.state_reverted && inclusion_predicate(&call.address)) + .filter(|call| { + !call.state_reverted && inclusion_predicate(&call.address) || + inclusion_predicate(&call.caller) // In the context of DELEGATECALL + // call.caller changes it's own state + }) .for_each(|call| { storage_changes.extend(call.storage_changes.iter()); balance_changes.extend(call.balance_changes.iter()); From e6edcd1fa21f1994fd65b009db0b303448404142 Mon Sep 17 00:00:00 2001 From: Florian Pellissier <111426680+flopell@users.noreply.github.com> Date: Fri, 19 Jul 2024 14:35:45 +0200 Subject: [PATCH 2/2] refactor: only include changes if we know call.caller AND the call type is delegatecall or callcode --- .../crates/tycho-substreams/src/contract.rs | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/substreams/crates/tycho-substreams/src/contract.rs b/substreams/crates/tycho-substreams/src/contract.rs index 84bf079..bc0735d 100644 --- a/substreams/crates/tycho-substreams/src/contract.rs +++ b/substreams/crates/tycho-substreams/src/contract.rs @@ -10,9 +10,9 @@ /// more [here](https://streamingfastio.medium.com/new-block-model-to-accelerate-chain-integration-9f65126e5425) use std::collections::HashMap; -use substreams_ethereum::pb::{ - eth, - eth::v2::{block::DetailLevel, StorageChange}, +use substreams_ethereum::pb::eth::{ + self, + v2::{block::DetailLevel, CallType, StorageChange}, }; use crate::pb::tycho::evm::v1::{self as tycho}; @@ -128,19 +128,21 @@ pub fn extract_contract_changes bool>( let mut balance_changes = Vec::new(); let mut code_changes = Vec::new(); - block_tx - .calls - .iter() - .filter(|call| { - !call.state_reverted && inclusion_predicate(&call.address) || - inclusion_predicate(&call.caller) // In the context of DELEGATECALL - // call.caller changes it's own state - }) - .for_each(|call| { - storage_changes.extend(call.storage_changes.iter()); - balance_changes.extend(call.balance_changes.iter()); - code_changes.extend(call.code_changes.iter()); - }); + let filtered_calls = block_tx.calls.iter().filter(|call| { + let address_included = inclusion_predicate(&call.address); + let caller_included = inclusion_predicate(&call.caller); + let is_delegate_or_callcode = call.call_type() == CallType::Delegate || + call.call_type() == CallType::Callcode; + + !call.state_reverted && + (address_included || (caller_included && is_delegate_or_callcode)) + }); + + filtered_calls.for_each(|call| { + storage_changes.extend(call.storage_changes.iter()); + balance_changes.extend(call.balance_changes.iter()); + code_changes.extend(call.code_changes.iter()); + }); storage_changes.sort_unstable_by_key(|change| change.ordinal); balance_changes.sort_unstable_by_key(|change| change.ordinal);