use crate::error::InvalidTransaction;
use alloy_consensus::{Header, Sealed};
use alloy_primitives::{Address, B256, U256};
use serde::{Deserialize, Serialize};
pub use alloy_primitives::Log;
#[derive(Debug, Clone)]
pub struct TxProcessingOutputOwned {
pub status: bool,
pub output: Vec<u8>,
pub contract_address: Option<Address>,
pub gas_used: u64,
pub gas_refunded: u64,
pub computational_native_used: u64,
pub native_used: u64,
pub pubdata_used: u64,
}
#[derive(Debug, Clone)]
pub struct BlockOutput {
pub header: Sealed<Header>,
pub tx_results: Vec<Result<TxOutput, InvalidTransaction>>,
pub storage_writes: Vec<StorageWrite>,
pub account_diffs: Vec<AccountDiff>,
pub published_preimages: Vec<(B256, Vec<u8>)>,
pub pubdata_used: u64,
pub computational_native_used: u64,
}
#[derive(Debug, Clone)]
pub struct StorageWrite {
pub key: B256,
pub value: B256,
pub account: Address,
pub account_key: B256,
}
#[derive(Debug, Clone)]
pub struct AccountDiff {
pub address: Address,
pub nonce: u64,
pub balance: U256,
pub bytecode_hash: B256,
}
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct TxOutput {
pub execution_result: ExecutionResult,
pub gas_used: u64,
pub gas_refunded: u64,
pub computational_native_used: u64,
pub native_used: u64,
pub pubdata_used: u64,
pub contract_address: Option<Address>,
pub logs: Vec<Log>,
pub l2_to_l1_logs: Vec<L2ToL1LogWithPreimage>,
pub storage_writes: Vec<StorageWrite>,
}
impl TxOutput {
pub fn is_success(&self) -> bool {
matches!(self.execution_result, ExecutionResult::Success(_))
}
pub fn as_returned_bytes(&self) -> &[u8] {
match &self.execution_result {
ExecutionResult::Success(o) => match o {
ExecutionOutput::Call(vec) => vec,
ExecutionOutput::Create(vec, _) => vec,
},
ExecutionResult::Revert(vec) => vec,
}
}
}
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub enum ExecutionOutput {
Call(Vec<u8>),
Create(Vec<u8>, Address),
}
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub enum ExecutionResult {
Success(ExecutionOutput),
Revert(Vec<u8>),
}
#[derive(Clone, Copy, Debug, PartialEq, Default, Serialize, Deserialize)]
pub struct BlockContext {
pub chain_id: u64,
pub block_number: u64,
pub block_hashes: BlockHashes,
pub timestamp: u64,
pub eip1559_basefee: U256,
pub pubdata_price: U256,
pub native_price: U256,
pub coinbase: Address,
pub gas_limit: u64,
pub pubdata_limit: u64,
pub mix_hash: U256,
pub execution_version: u32,
pub blob_fee: U256,
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct BlockHashes(pub [U256; 256]);
impl Default for BlockHashes {
fn default() -> Self {
Self([U256::ZERO; 256])
}
}
impl serde::Serialize for BlockHashes {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.0.to_vec().serialize(serializer)
}
}
impl<'de> serde::Deserialize<'de> for BlockHashes {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let vec: Vec<U256> = Vec::deserialize(deserializer)?;
let array: [U256; 256] = vec
.try_into()
.map_err(|_| serde::de::Error::custom("Expected array of length 256"))?;
Ok(Self(array))
}
}
#[derive(Default, Debug, Clone)]
pub struct L2ToL1Log {
pub l2_shard_id: u8,
pub is_service: bool,
pub tx_number_in_block: u16,
pub sender: Address,
pub key: B256,
pub value: B256,
}
#[derive(Debug, Clone)]
pub struct L2ToL1LogWithPreimage {
pub log: L2ToL1Log,
pub preimage: Option<Vec<u8>>,
}