1use ethereum_types::{Address, Bloom, H256, U256, U64};
20use serde::{Deserialize, Serialize};
21
22use crate::{bytes::Bytes, transaction::Transaction};
23
24#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct Block {
28 #[serde(flatten)]
30 pub header: Header,
31
32 pub transactions: BlockTransactions,
34
35 #[serde(default)]
37 pub uncles: Vec<H256>,
38
39 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub size: Option<U256>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub withdrawals: Option<Vec<Withdrawal>>,
46}
47
48#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
50#[serde(rename_all = "camelCase")]
51pub struct Header {
52 pub number: U256,
54 pub hash: Option<H256>,
56 pub parent_hash: H256,
58 #[serde(rename = "sha3Uncles")]
60 pub uncles_hash: H256,
61 pub nonce: Option<U64>,
63 #[serde(rename = "miner")]
65 pub author: Address,
66 pub state_root: H256,
68 pub transactions_root: H256,
70 pub receipts_root: H256,
72 pub logs_bloom: Bloom,
74 pub gas_limit: U256,
76 pub gas_used: U256,
78 pub timestamp: U64,
80 pub extra_data: Bytes,
82 pub difficulty: U256,
84 #[serde(skip_serializing_if = "Option::is_none")]
86 pub total_difficulty: Option<U256>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
89 pub mix_hash: Option<H256>,
90
91 #[serde(default, skip_serializing_if = "Option::is_none")]
93 pub base_fee_per_gas: Option<U256>,
94 #[serde(skip_serializing_if = "Option::is_none")]
96 pub withdrawals_root: Option<H256>,
97 #[serde(skip_serializing_if = "Option::is_none")]
99 pub parent_beacon_block_root: Option<H256>,
100}
101
102#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
104#[serde(untagged)]
105pub enum BlockTransactions {
106 Hashes(Vec<H256>),
108 Full(Vec<Transaction>),
110}
111
112#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
114#[serde(rename_all = "camelCase")]
115pub struct Withdrawal {
116 pub index: U64,
118 pub validator_index: U64,
120 pub address: Address,
122 pub amount: U64,
124}
125
126#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
128#[serde(default, rename_all = "camelCase")]
129pub struct BlockOverrides {
130 #[serde(
133 default,
134 skip_serializing_if = "Option::is_none",
135 alias = "blockNumber"
136 )]
137 pub number: Option<U256>,
138 #[serde(default, skip_serializing_if = "Option::is_none")]
141 pub difficulty: Option<U256>,
142 #[serde(default, skip_serializing_if = "Option::is_none", alias = "timestamp")]
145 pub time: Option<U64>,
146 #[serde(default, skip_serializing_if = "Option::is_none")]
148 pub gas_limit: Option<U64>,
149 #[serde(default, skip_serializing_if = "Option::is_none")]
151 pub coinbase: Option<Address>,
152 #[serde(default, skip_serializing_if = "Option::is_none")]
154 pub random: Option<H256>,
155 #[serde(default, skip_serializing_if = "Option::is_none")]
157 pub base_fee: Option<U256>,
158}