From 52d502198e9aa964814ef5f139df0886c3eb7bb0 Mon Sep 17 00:00:00 2001 From: Zizou <111426680+zizou0x@users.noreply.github.com> Date: Tue, 13 May 2025 12:25:14 +0200 Subject: [PATCH] fix: stop using buggy `account_creations` for creation tagging. (#201) the `call.account_creations` field had been deprecated by Substreams because of some edge cases where a new account wasn't detected. This commit removes the usage of this field in our sdk contract extraction logic and some others specific places. We decided to rely on the call type instead. This approach should be much more robust. Co-authored-by: zizou <111426680+flopell@users.noreply.github.com> --- substreams/Cargo.lock | 34 +++++++++---------- substreams/crates/tycho-substreams/Cargo.toml | 2 +- .../crates/tycho-substreams/src/contract.rs | 17 ++++------ substreams/ethereum-ambient/Cargo.toml | 2 +- .../src/modules/3_map_changes.rs | 26 +++++++------- substreams/ethereum-sfrax/Cargo.toml | 2 +- substreams/ethereum-sfrax/src/modules.rs | 22 +++++------- 7 files changed, 49 insertions(+), 56 deletions(-) diff --git a/substreams/Cargo.lock b/substreams/Cargo.lock index 3f88db1..d7d0b69 100644 --- a/substreams/Cargo.lock +++ b/substreams/Cargo.lock @@ -300,7 +300,7 @@ dependencies = [ [[package]] name = "ethereum-sfrax" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "ethabi 17.2.0", @@ -1377,7 +1377,7 @@ dependencies = [ [[package]] name = "substreams-ethereum-ambient" -version = "0.5.1" +version = "0.5.2" dependencies = [ "anyhow", "bytes", @@ -1612,21 +1612,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "tycho-substreams" -version = "0.2.0" -dependencies = [ - "ethabi 18.0.0", - "hex", - "itertools 0.12.1", - "num-bigint", - "prost 0.11.9", - "serde", - "serde_json", - "substreams", - "substreams-ethereum", -] - [[package]] name = "tycho-substreams" version = "0.2.0" @@ -1675,6 +1660,21 @@ dependencies = [ "substreams-ethereum", ] +[[package]] +name = "tycho-substreams" +version = "0.2.1" +dependencies = [ + "ethabi 18.0.0", + "hex", + "itertools 0.12.1", + "num-bigint", + "prost 0.11.9", + "serde", + "serde_json", + "substreams", + "substreams-ethereum", +] + [[package]] name = "typenum" version = "1.17.0" diff --git a/substreams/crates/tycho-substreams/Cargo.toml b/substreams/crates/tycho-substreams/Cargo.toml index 65832d1..f63e755 100644 --- a/substreams/crates/tycho-substreams/Cargo.toml +++ b/substreams/crates/tycho-substreams/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tycho-substreams" -version = "0.2.0" +version = "0.2.1" edition = "2021" description = "Tycho substreams development kit, contains tycho-indexer block changes model and helper functions for common indexing tasks." repository = "https://github.com/propeller-heads/tycho-protocol-sdk/tree/main/substreams/crates/tycho-substreams" diff --git a/substreams/crates/tycho-substreams/src/contract.rs b/substreams/crates/tycho-substreams/src/contract.rs index 5996656..44a0207 100644 --- a/substreams/crates/tycho-substreams/src/contract.rs +++ b/substreams/crates/tycho-substreams/src/contract.rs @@ -8,7 +8,7 @@ /// ## Warning /// ⚠️ These helpers *only* work if the **extended block model** is available, /// more [here](https://streamingfastio.medium.com/new-block-model-to-accelerate-chain-integration-9f65126e5425) -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use crate::{ models::{InterimContractChange, TransactionChanges}, @@ -97,14 +97,11 @@ fn extract_contract_changes_generic< .transactions() .for_each(|block_tx| { // Collect all accounts created in this tx - let created_accounts: HashMap<_, _> = block_tx + let created_accounts: HashSet<_> = block_tx .calls .iter() - .flat_map(|call| { - call.account_creations - .iter() - .map(|ac| (&ac.account, ac.ordinal)) - }) + .filter(|call| call.call_type() == CallType::Create) + .map(|call| call.address.clone()) .collect(); let mut storage_changes = Vec::new(); @@ -140,7 +137,7 @@ fn extract_contract_changes_generic< .or_insert_with(|| { InterimContractChange::new( &storage_change.address, - created_accounts.contains_key(&storage_change.address), + created_accounts.contains(&storage_change.address), ) }); @@ -156,7 +153,7 @@ fn extract_contract_changes_generic< .or_insert_with(|| { InterimContractChange::new( &balance_change.address, - created_accounts.contains_key(&balance_change.address), + created_accounts.contains(&balance_change.address), ) }); @@ -174,7 +171,7 @@ fn extract_contract_changes_generic< .or_insert_with(|| { InterimContractChange::new( &code_change.address, - created_accounts.contains_key(&code_change.address), + created_accounts.contains(&code_change.address), ) }); diff --git a/substreams/ethereum-ambient/Cargo.toml b/substreams/ethereum-ambient/Cargo.toml index dfe8971..927ed47 100644 --- a/substreams/ethereum-ambient/Cargo.toml +++ b/substreams/ethereum-ambient/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "substreams-ethereum-ambient" -version = "0.5.1" +version = "0.5.2" edition = "2021" [lib] diff --git a/substreams/ethereum-ambient/src/modules/3_map_changes.rs b/substreams/ethereum-ambient/src/modules/3_map_changes.rs index 8199e85..ca96013 100644 --- a/substreams/ethereum-ambient/src/modules/3_map_changes.rs +++ b/substreams/ethereum-ambient/src/modules/3_map_changes.rs @@ -1,13 +1,13 @@ use num_bigint::BigInt; use std::{ - collections::{hash_map::Entry, HashMap}, + collections::{hash_map::Entry, HashMap, HashSet}, str::FromStr, }; use substreams::{ pb::substreams::StoreDeltas, store::{StoreGet, StoreGetProto}, }; -use substreams_ethereum::pb::eth::{self}; +use substreams_ethereum::pb::eth::{self, v2::CallType}; use tycho_substreams::prelude::*; @@ -77,20 +77,22 @@ fn map_changes( balance_store: StoreDeltas, pool_store: StoreGetProto, ) -> Result { + // TODO: this needs to be refactored to use the tycho-substreams helper functions. + // The current implementation probably suffers from the bug fixed in https://github.com/propeller-heads/tycho-protocol-sdk/pull/117 let mut block_changes = BlockChanges::default(); let mut transaction_changes = TransactionChanges::default(); let mut changed_contracts: HashMap, InterimContractChange> = HashMap::new(); - let created_accounts: HashMap<_, _> = block + // collect all account creations in the block + let created_accounts: HashSet<_> = block .transactions() .flat_map(|tx| { - tx.calls.iter().flat_map(|call| { - call.account_creations - .iter() - .map(|ac| (&ac.account, ac.ordinal)) - }) + tx.calls + .iter() + .filter(|call| call.call_type() == CallType::Create) + .map(|call| call.address.clone()) }) .collect(); @@ -161,7 +163,7 @@ fn map_changes( balance: Vec::new(), code: Vec::new(), slots, - change: if created_accounts.contains_key(&storage_change.address) { + change: if created_accounts.contains(&storage_change.address) { ChangeType::Creation } else { ChangeType::Update @@ -202,7 +204,7 @@ fn map_changes( balance: new_balance.bytes.clone(), code: Vec::new(), slots: HashMap::new(), - change: if created_accounts.contains_key(&balance_change.address) { + change: if created_accounts.contains(&balance_change.address) { ChangeType::Creation } else { ChangeType::Update @@ -241,7 +243,7 @@ fn map_changes( balance: Vec::new(), code: code_change.new_code.clone(), slots: HashMap::new(), - change: if created_accounts.contains_key(&code_change.address) { + change: if created_accounts.contains(&code_change.address) { ChangeType::Creation } else { ChangeType::Update @@ -315,7 +317,7 @@ fn map_changes( let pool_hash_hex = hex::encode(balance_delta.pool_hash); let pool = match pool_store.get_last(pool_hash_hex.clone()) { Some(pool) => pool, - None => panic!("Pool not found in store for given hash: {}", pool_hash_hex), + None => panic!("Pool not found in store for given hash: {pool_hash_hex}"), }; let token_type = substreams::key::segment_at(&store_delta.key, 1); let token_index = if token_type == "quote" { 1 } else { 0 }; diff --git a/substreams/ethereum-sfrax/Cargo.toml b/substreams/ethereum-sfrax/Cargo.toml index 9260a0a..c795f51 100644 --- a/substreams/ethereum-sfrax/Cargo.toml +++ b/substreams/ethereum-sfrax/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ethereum-sfrax" -version = "0.1.0" +version = "0.1.1" edition = "2021" [lib] diff --git a/substreams/ethereum-sfrax/src/modules.rs b/substreams/ethereum-sfrax/src/modules.rs index 3812e10..a2427b9 100644 --- a/substreams/ethereum-sfrax/src/modules.rs +++ b/substreams/ethereum-sfrax/src/modules.rs @@ -1,7 +1,7 @@ use crate::abi; use anyhow::Result; use itertools::Itertools; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use substreams::{ hex, pb::substreams::StoreDeltas, @@ -87,7 +87,7 @@ pub fn map_relative_balances( let address_bytes_be = vault_log.address(); let address_hex = format!("0x{}", hex::encode(address_bytes_be)); if store - .get_last(format!("pool:{}", address_hex)) + .get_last(format!("pool:{address_hex}")) .is_some() { deltas.extend_from_slice(&[ @@ -122,7 +122,7 @@ pub fn map_relative_balances( let address_hex = format!("0x{}", hex::encode(address_bytes_be)); if store - .get_last(format!("pool:{}", address_hex)) + .get_last(format!("pool:{address_hex}")) .is_some() { deltas.extend_from_slice(&[ @@ -157,7 +157,7 @@ pub fn map_relative_balances( let address_hex = format!("0x{}", hex::encode(address_bytes_be)); if store - .get_last(format!("pool:{}", address_hex)) + .get_last(format!("pool:{address_hex}")) .is_some() { deltas.extend_from_slice(&[BalanceDelta { @@ -260,17 +260,11 @@ fn is_deployment_tx(tx: ð::v2::TransactionTrace, vault_address: &[u8]) -> boo let created_accounts = tx .calls .iter() - .flat_map(|call| { - call.account_creations - .iter() - .map(|ac| ac.account.to_owned()) - }) - .collect::>(); + .filter(|call| call.call_type() == eth::v2::CallType::Create) + .map(|call| call.address.clone()) + .collect::>(); - if let Some(deployed_address) = created_accounts.first() { - return deployed_address.as_slice() == vault_address; - } - false + created_accounts.contains(vault_address) } fn find_deployed_underlying_address(vault_address: &[u8]) -> Option<[u8; 20]> {