1use alloy_primitives::{Address, Bytes, U256};
5use alloy_rlp::{RlpDecodable, RlpEncodable};
6
7pub type BlockAccessIndex = u32;
10
11#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
14pub struct StorageChange {
15 pub block_access_index: BlockAccessIndex,
17 pub value: U256,
19}
20
21#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub struct BalanceChange {
25 pub block_access_index: BlockAccessIndex,
27 pub post_balance: U256,
29}
30
31#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub struct NonceChange {
35 pub block_access_index: BlockAccessIndex,
37 pub new_nonce: u64,
39}
40
41#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
43#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
44pub struct CodeChange {
45 pub block_access_index: BlockAccessIndex,
47 pub new_code: Bytes,
49}
50
51#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
53#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
54pub struct SlotChanges {
55 pub slot: U256,
57 pub changes: Vec<StorageChange>,
59}
60
61#[derive(Clone, Debug, PartialEq, Eq, RlpEncodable, RlpDecodable)]
63#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
64pub struct AccountChanges {
65 pub address: Address,
67 pub storage_changes: Vec<SlotChanges>,
69 pub storage_reads: Vec<U256>,
71 pub balance_changes: Vec<BalanceChange>,
73 pub nonce_changes: Vec<NonceChange>,
75 pub code_changes: Vec<CodeChange>,
77}
78
79#[derive(Clone, Debug, Default, PartialEq, Eq)]
82#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
83pub struct BlockAccessList {
84 pub accounts: Vec<AccountChanges>,
86}
87
88impl alloy_rlp::Encodable for BlockAccessList {
89 fn encode(&self, out: &mut dyn alloy_rlp::BufMut) {
90 self.accounts.encode(out)
91 }
92 fn length(&self) -> usize {
93 self.accounts.length()
94 }
95}
96
97impl alloy_rlp::Decodable for BlockAccessList {
98 fn decode(buf: &mut &[u8]) -> alloy_rlp::Result<Self> {
99 Ok(Self {
100 accounts: Vec::<AccountChanges>::decode(buf)?,
101 })
102 }
103}