use std::collections::{BTreeMap, BTreeSet, HashMap};
use ethereum_types::{Address, U256};
use evm_arithmetization::proof::{BlockHashes, BlockMetadata};
use evm_arithmetization::ConsolidatedHash;
use keccak_hash::H256;
use mpt_trie::partial_trie::HashedPartialTrie;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BlockTrace {
pub trie_pre_images: BlockTraceTriePreImages,
#[serde(default)]
pub code_db: BTreeSet<Vec<u8>>,
pub txn_info: Vec<TxnInfo>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum BlockTraceTriePreImages {
Separate(SeparateTriePreImages),
Combined(CombinedPreImages),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct SeparateTriePreImages {
pub state: SeparateTriePreImage,
pub storage: SeparateStorageTriesPreImage,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SeparateTriePreImage {
Direct(HashedPartialTrie),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct CombinedPreImages {
#[serde(with = "crate::hex")]
pub compact: Vec<u8>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SeparateStorageTriesPreImage {
MultipleTries(HashMap<H256, SeparateTriePreImage>),
}
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub struct TxnInfo {
pub traces: BTreeMap<Address, TxnTrace>,
pub meta: TxnMeta,
}
#[derive(Clone, Debug, Deserialize, Serialize, Default)]
pub struct TxnMeta {
#[serde(with = "crate::hex")]
pub byte_code: Vec<u8>,
#[serde(with = "crate::hex")]
pub new_receipt_trie_node_byte: Vec<u8>,
pub gas_used: u64,
}
#[derive(Clone, Debug, Deserialize, Serialize, Default, PartialEq)]
pub struct TxnTrace {
#[serde(skip_serializing_if = "Option::is_none")]
pub balance: Option<U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<U256>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub storage_read: BTreeSet<H256>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub storage_written: BTreeMap<H256, U256>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code_usage: Option<ContractCodeUsage>,
#[serde(default, skip_serializing_if = "is_false")]
pub self_destructed: bool,
}
fn is_false(b: &bool) -> bool {
!b
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum ContractCodeUsage {
Read(H256),
Write(#[serde(with = "crate::hex")] Vec<u8>),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct OtherBlockData {
pub b_data: BlockLevelData,
pub checkpoint_state_trie_root: H256,
pub checkpoint_consolidated_hash: ConsolidatedHash,
pub burn_addr: Option<Address>,
pub ger_data: Option<(H256, H256)>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BlockLevelData {
pub b_meta: BlockMetadata,
pub b_hashes: BlockHashes,
pub withdrawals: Vec<(Address, U256)>,
}