reth_execution_types/
execute.rs1use alloy_primitives::{Address, B256, U256};
2use reth_primitives_traits::{Account, Bytecode};
3use revm::database::{states::BundleState, BundleAccount};
4
5pub use alloy_evm::block::BlockExecutionResult;
6
7#[derive(
9 Debug,
10 Clone,
11 PartialEq,
12 Eq,
13 derive_more::AsRef,
14 derive_more::AsMut,
15 derive_more::Deref,
16 derive_more::DerefMut,
17)]
18pub struct BlockExecutionOutput<T> {
19 #[as_ref]
21 #[as_mut]
22 #[deref]
23 #[deref_mut]
24 pub result: BlockExecutionResult<T>,
25 pub state: BundleState,
27}
28
29impl<T> BlockExecutionOutput<T> {
30 pub fn bytecode(&self, code_hash: &B256) -> Option<Bytecode> {
32 self.state.bytecode(code_hash).map(Bytecode)
33 }
34
35 pub fn account(&self, address: &Address) -> Option<Option<Account>> {
37 self.state.account(address).map(|a| a.info.as_ref().map(Into::into))
38 }
39
40 pub fn account_state(&self, address: &Address) -> Option<&BundleAccount> {
42 self.state.account(address)
43 }
44
45 pub fn storage(&self, address: &Address, storage_key: U256) -> Option<U256> {
49 self.state.account(address).and_then(|a| a.storage_slot(storage_key))
50 }
51}
52
53impl<T> Default for BlockExecutionOutput<T> {
54 fn default() -> Self {
55 Self {
56 result: BlockExecutionResult {
57 receipts: Default::default(),
58 requests: Default::default(),
59 gas_used: 0,
60 blob_gas_used: 0,
61 },
62 state: Default::default(),
63 }
64 }
65}