revme/cmd/blockchaintest/
pre_block.rs1use revm::{
4 context::{Block, ContextTr},
5 database::Database,
6 handler::EvmTr,
7 primitives::{address, hardfork::SpecId, Address, B256},
8 DatabaseCommit, SystemCallCommitEvm,
9};
10
11pub fn pre_block_transition<
17 'a,
18 DB: Database + DatabaseCommit + 'a,
19 EVM: SystemCallCommitEvm<Error: core::fmt::Debug> + EvmTr<Context: ContextTr<Db = DB>>,
20>(
21 evm: &mut EVM,
22 spec: SpecId,
23 parent_block_hash: Option<B256>,
24 parent_beacon_block_root: Option<B256>,
25) -> Result<(), EVM::Error> {
26 if evm.ctx().block().number() == 0 {
28 return Ok(());
29 }
30
31 if let Some(parent_block_hash) = parent_block_hash {
33 if spec.is_enabled_in(SpecId::PRAGUE) {
34 system_call_eip2935_blockhash(evm, parent_block_hash)?;
35 }
36 }
37
38 if let Some(parent_beacon_block_root) = parent_beacon_block_root {
39 if spec.is_enabled_in(SpecId::CANCUN) {
40 system_call_eip4788_beacon_root(evm, parent_beacon_block_root)?;
41 }
42 }
43
44 Ok(())
45}
46
47pub const HISTORY_STORAGE_ADDRESS: Address = address!("0x0000F90827F1C53a10cb7A02335B175320002935");
48
49#[inline]
51pub(crate) fn system_call_eip2935_blockhash<EVM>(
52 evm: &mut EVM,
53 parent_block_hash: B256,
54) -> Result<(), EVM::Error>
55where
56 EVM: SystemCallCommitEvm<Error: core::fmt::Debug>,
57{
58 evm.system_call_commit(HISTORY_STORAGE_ADDRESS, parent_block_hash.0.into())?;
59 Ok(())
60}
61
62pub const BEACON_ROOTS_ADDRESS: Address = address!("000F3df6D732807Ef1319fB7B8bB8522d0Beac02");
63
64pub(crate) fn system_call_eip4788_beacon_root<EVM>(
66 evm: &mut EVM,
67 parent_beacon_block_root: B256,
68) -> Result<(), EVM::Error>
69where
70 EVM: SystemCallCommitEvm<Error: core::fmt::Debug>,
71{
72 evm.system_call_commit(BEACON_ROOTS_ADDRESS, parent_beacon_block_root.0.into())?;
73 Ok(())
74}