use alloy_primitives::{Address, Bytes, U256};
use alloy_rlp::{RlpDecodable, RlpEncodable};
pub type BlockAccessIndex = u32;
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct StorageChange {
pub block_access_index: BlockAccessIndex,
pub value: U256,
}
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BalanceChange {
pub block_access_index: BlockAccessIndex,
pub post_balance: U256,
}
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct NonceChange {
pub block_access_index: BlockAccessIndex,
pub new_nonce: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CodeChange {
pub block_access_index: BlockAccessIndex,
pub new_code: Bytes,
}
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct SlotChanges {
pub slot: U256,
pub changes: Vec<StorageChange>,
}
#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AccountChanges {
pub address: Address,
pub storage_changes: Vec<SlotChanges>,
pub storage_reads: Vec<U256>,
pub balance_changes: Vec<BalanceChange>,
pub nonce_changes: Vec<NonceChange>,
pub code_changes: Vec<CodeChange>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlockAccessList {
pub accounts: Vec<AccountChanges>,
}
impl alloy_rlp::Encodable for BlockAccessList {
fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {
self.accounts.encode(out)
}
fn length(&self) -> usize {
self.accounts.length()
}
}
impl alloy_rlp::Decodable for BlockAccessList {
fn decode(buf: &mut &[u8]) -> alloy_rlp::Result<Self> {
Ok(Self {
accounts: Vec::<AccountChanges>::decode(buf)?,
})
}
}