refactor: only include changes if we know call.caller AND the call type is delegatecall or callcode

This commit is contained in:
Florian Pellissier
2024-07-19 14:35:45 +02:00
parent 33e5f6a236
commit e6edcd1fa2

View File

@@ -10,9 +10,9 @@
/// more [here](https://streamingfastio.medium.com/new-block-model-to-accelerate-chain-integration-9f65126e5425) /// more [here](https://streamingfastio.medium.com/new-block-model-to-accelerate-chain-integration-9f65126e5425)
use std::collections::HashMap; use std::collections::HashMap;
use substreams_ethereum::pb::{ use substreams_ethereum::pb::eth::{
eth, self,
eth::v2::{block::DetailLevel, StorageChange}, v2::{block::DetailLevel, CallType, StorageChange},
}; };
use crate::pb::tycho::evm::v1::{self as tycho}; use crate::pb::tycho::evm::v1::{self as tycho};
@@ -128,19 +128,21 @@ pub fn extract_contract_changes<F: Fn(&[u8]) -> bool>(
let mut balance_changes = Vec::new(); let mut balance_changes = Vec::new();
let mut code_changes = Vec::new(); let mut code_changes = Vec::new();
block_tx let filtered_calls = block_tx.calls.iter().filter(|call| {
.calls let address_included = inclusion_predicate(&call.address);
.iter() let caller_included = inclusion_predicate(&call.caller);
.filter(|call| { let is_delegate_or_callcode = call.call_type() == CallType::Delegate ||
!call.state_reverted && inclusion_predicate(&call.address) || call.call_type() == CallType::Callcode;
inclusion_predicate(&call.caller) // In the context of DELEGATECALL
// call.caller changes it's own state !call.state_reverted &&
}) (address_included || (caller_included && is_delegate_or_callcode))
.for_each(|call| { });
storage_changes.extend(call.storage_changes.iter());
balance_changes.extend(call.balance_changes.iter()); filtered_calls.for_each(|call| {
code_changes.extend(call.code_changes.iter()); 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); storage_changes.sort_unstable_by_key(|change| change.ordinal);
balance_changes.sort_unstable_by_key(|change| change.ordinal); balance_changes.sort_unstable_by_key(|change| change.ordinal);