From f522b9248167d8551f26d956399ffeb60c3f9982 Mon Sep 17 00:00:00 2001 From: Denis Carriere Date: Thu, 1 Aug 2024 16:35:06 -0400 Subject: [PATCH] refactor insert transactions --- README.md | 5 ++++- blocks/evm/src/balance_changes.rs | 22 +++++++++++++++++++++- blocks/evm/src/blocks.rs | 13 +++++++++++-- blocks/evm/src/logs.rs | 6 +++--- blocks/evm/src/sinks.rs | 24 ++++++++++++++---------- blocks/evm/src/transactions.rs | 6 ++++++ common/src/blocks.rs | 8 +++----- 7 files changed, 62 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index dbdc134..9eb81bc 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,6 @@ - [ ] TON - **EVM** - [x] Ethereum - - [x] Arbitrum - [x] BNB - [x] Polygon - [ ] Fantom @@ -45,7 +44,10 @@ - [ ] [Injective](https://injective.com/) (L2 on Cosmos) - [ ] [Rootstock](https://rootstock.io/) (L2 on Bitcoin) - [ ] [IoTex](https://iotex.io/) + - [ ] [Celo](https://celo.org/) (L2 on ETH) - **Optimistic Rollup (EVM)** + - [x] Arbitrum One (L2 on ETH) + - [ ] Arbitrum Nova (L2 on ETH using AnyTrust protocol) - [ ] Optimism (OP) - [ ] opBNB - [ ] Blast @@ -66,6 +68,7 @@ - [ ] Scroll - [ ] Linea - [ ] Fuse + - [ ] [Polygon zkEVM](https://polygon.technology/polygon-zkevm) - [ ] [Astar zkEVM](https://astar.network/) (L2) - **Polkadot's Parachain** - [ ] Moonbeam diff --git a/blocks/evm/src/balance_changes.rs b/blocks/evm/src/balance_changes.rs index 799e4fb..dc775c4 100644 --- a/blocks/evm/src/balance_changes.rs +++ b/blocks/evm/src/balance_changes.rs @@ -2,7 +2,7 @@ use common::blocks::insert_timestamp; use common::utils::bytes_to_hex; use common::{keys::balance_changes_keys, utils::optional_bigint_to_string}; use substreams::pb::substreams::Clock; -use substreams_database_change::pb::database::{table_change, DatabaseChanges}; +use substreams_database_change::pb::database::{table_change, DatabaseChanges, TableChange}; use substreams_ethereum::pb::eth::v2::BalanceChange; pub fn balance_change_reason_to_string(reason: i32) -> String { @@ -33,6 +33,13 @@ pub fn balance_change_reason_to_string(reason: i32) -> String { } } +// Block balance changes (ex: RewardMineBlock, RewardMineUncle, Withdraw, Burn) +pub fn insert_balance_changes(tables: &mut DatabaseChanges, clock: &Clock, balance_changes: &Vec) { + for balance_change in balance_changes { + insert_balance_change(tables, &clock, &balance_change); + } +} + // https://github.com/streamingfast/firehose-ethereum/blob/1bcb32a8eb3e43347972b6b5c9b1fcc4a08c751e/proto/sf/ethereum/type/v2/type.proto#L658 pub fn insert_balance_change(tables: &mut DatabaseChanges, clock: &Clock, balance_change: &BalanceChange) { let address = bytes_to_hex(balance_change.address.clone()); @@ -53,3 +60,16 @@ pub fn insert_balance_change(tables: &mut DatabaseChanges, clock: &Clock, balanc insert_timestamp(row, clock, false); } + +pub fn insert_balance_change_counts(row: &mut TableChange, all_balance_changes_reason: Vec) { + // transaction counts + let total_balance_changes = all_balance_changes_reason.len(); + let mut total_withdrawals = 0; + for reason in all_balance_changes_reason { + if reason == 16 { + total_withdrawals += 1; + } + } + row.change("total_balance_changes", ("", total_balance_changes.to_string().as_str())) + .change("total_withdrawals", ("", total_withdrawals.to_string().as_str())); +} diff --git a/blocks/evm/src/blocks.rs b/blocks/evm/src/blocks.rs index c2c5b0d..281a4c0 100644 --- a/blocks/evm/src/blocks.rs +++ b/blocks/evm/src/blocks.rs @@ -5,6 +5,8 @@ use substreams::pb::substreams::Clock; use substreams_database_change::pb::database::{table_change, DatabaseChanges}; use substreams_ethereum::pb::eth::v2::Block; +use crate::balance_changes::insert_balance_change_counts; + // https://github.com/streamingfast/firehose-ethereum/blob/develop/proto/sf/ethereum/type/v2/type.proto pub fn insert_blocks(tables: &mut DatabaseChanges, clock: &Clock, block: &Block) { let header = block.header.clone().unwrap_or_default(); @@ -15,7 +17,7 @@ pub fn insert_blocks(tables: &mut DatabaseChanges, clock: &Clock, block: &Block) let transactions_root = bytes_to_hex(header.transactions_root); let state_root = bytes_to_hex(header.state_root); let receipts_root = bytes_to_hex(header.receipt_root); - let miner = bytes_to_hex(header.coinbase); + let miner = bytes_to_hex(header.coinbase); // EVM Address let size = block.size; let mix_hash = bytes_to_hex(header.mix_hash); let extra_data = bytes_to_hex(header.extra_data); @@ -59,5 +61,12 @@ pub fn insert_blocks(tables: &mut DatabaseChanges, clock: &Clock, block: &Block) .change("blob_gas_used", ("", blob_gas_used.to_string().as_str())); insert_timestamp(row, clock, true); - insert_transaction_counts(row, &block.transaction_traces); + + // transaction status counts + let all_transaction_status: Vec = block.transaction_traces.iter().map(|transaction| transaction.status).collect(); + insert_transaction_counts(row, all_transaction_status); + + // balance changes counts + let all_balance_changes_reason: Vec = block.balance_changes.iter().map(|balance_change| balance_change.reason).collect(); + insert_balance_change_counts(row, all_balance_changes_reason); } diff --git a/blocks/evm/src/logs.rs b/blocks/evm/src/logs.rs index 0becea2..14a437d 100644 --- a/blocks/evm/src/logs.rs +++ b/blocks/evm/src/logs.rs @@ -10,9 +10,9 @@ pub fn insert_log(tables: &mut DatabaseChanges, clock: &Clock, log: &Log, transa let index = log.index; let tx_hash = bytes_to_hex(transaction.hash.to_vec()); let tx_index = transaction.index; - let tx_from = bytes_to_hex(transaction.from.to_vec()); - let tx_to = bytes_to_hex(transaction.to.to_vec()); - let contract_address = bytes_to_hex(log.address.to_vec()); + let tx_from = bytes_to_hex(transaction.from.to_vec()); // EVM Address + let tx_to = bytes_to_hex(transaction.to.to_vec()); // EVM Address + let contract_address = bytes_to_hex(log.address.to_vec()); // EVM Address let topics = log.topics.clone(); let topic0 = extract_topic(&topics, 0); let topic1 = extract_topic(&topics, 1); diff --git a/blocks/evm/src/sinks.rs b/blocks/evm/src/sinks.rs index 2d11454..cceff04 100644 --- a/blocks/evm/src/sinks.rs +++ b/blocks/evm/src/sinks.rs @@ -3,21 +3,25 @@ use substreams::pb::substreams::Clock; use substreams_database_change::pb::database::DatabaseChanges; use substreams_ethereum::pb::eth::v2::Block; -use crate::balance_changes::insert_balance_change; +use crate::balance_changes::insert_balance_changes; use crate::blocks::insert_blocks; -use crate::transactions::insert_transaction; +use crate::transactions::insert_transactions; #[substreams::handlers::map] pub fn ch_out(clock: Clock, block: Block) -> Result { let mut tables: DatabaseChanges = DatabaseChanges::default(); - // blocks insert_blocks(&mut tables, &clock, &block); - for balance_change in block.balance_changes.clone() { - insert_balance_change(&mut tables, &clock, &balance_change); - } - // transactions - for transaction in block.transaction_traces.iter() { - insert_transaction(&mut tables, &clock, &transaction); - } + insert_balance_changes(&mut tables, &clock, &block.balance_changes); + insert_transactions(&mut tables, &clock, &block.transaction_traces); + + Ok(tables) +} + +// TO-DO: Implement the `graph_out` function using EntityChanges +#[substreams::handlers::map] +pub fn graph_out(clock: Clock, block: Block) -> Result { + let mut tables: DatabaseChanges = DatabaseChanges::default(); + insert_blocks(&mut tables, &clock, &block); + // TO-DO: Convert DatabaseChanges to EntityChanges Ok(tables) } diff --git a/blocks/evm/src/transactions.rs b/blocks/evm/src/transactions.rs index 826f371..2e17f6c 100644 --- a/blocks/evm/src/transactions.rs +++ b/blocks/evm/src/transactions.rs @@ -41,6 +41,12 @@ pub fn is_transaction_success(status: i32) -> bool { status == 1 } +pub fn insert_transactions(tables: &mut DatabaseChanges, clock: &Clock, transactions: &Vec) { + for transaction in transactions { + insert_transaction(tables, clock, &transaction); + } +} + // https://github.com/streamingfast/firehose-ethereum/blob/1bcb32a8eb3e43347972b6b5c9b1fcc4a08c751e/proto/sf/ethereum/type/v2/type.proto#L658 pub fn insert_transaction(tables: &mut DatabaseChanges, clock: &Clock, transaction: &TransactionTrace) { let index = transaction.index; diff --git a/common/src/blocks.rs b/common/src/blocks.rs index d6c09f1..0c1c404 100644 --- a/common/src/blocks.rs +++ b/common/src/blocks.rs @@ -1,6 +1,5 @@ use substreams::pb::substreams::Clock; use substreams_database_change::pb::database::TableChange; -use substreams_ethereum::pb::eth::v2::TransactionTrace; use crate::utils::block_time_to_date; @@ -18,14 +17,13 @@ pub fn insert_timestamp(row: &mut TableChange, clock: &Clock, is_block: bool) { .change(format!("{}hash", prefix).as_str(), ("", block_hash.as_str())); } -// TO-DO: rewrite using only `all_transaction_status: &Vec` -pub fn insert_transaction_counts(row: &mut TableChange, transaction_traces: &Vec) { +pub fn insert_transaction_counts(row: &mut TableChange, all_transaction_status: Vec) { // transaction counts let mut total_transactions = 0; let mut successful_transactions = 0; let mut failed_transactions = 0; - for traces in transaction_traces.iter() { - if traces.status == 1 { + for status in all_transaction_status { + if status == 1 { successful_transactions += 1; } else { failed_transactions += 1;