reth_evm/system_calls/
eip7251.rs1use crate::ConfigureEvm;
3use alloc::{boxed::Box, format};
4use alloy_eips::eip7251::CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS;
5use alloy_primitives::Bytes;
6use reth_execution_errors::{BlockExecutionError, BlockValidationError};
7use revm::{interpreter::Host, Database, Evm};
8use revm_primitives::{ExecutionResult, ResultAndState};
9
10#[inline]
17pub(crate) fn transact_consolidation_requests_contract_call<EvmConfig, EXT, DB>(
18 evm_config: &EvmConfig,
19 evm: &mut Evm<'_, EXT, DB>,
20) -> Result<ResultAndState, BlockExecutionError>
21where
22 DB: Database,
23 DB::Error: core::fmt::Display,
24 EvmConfig: ConfigureEvm,
25{
26 let previous_env = Box::new(evm.context.env().clone());
28
29 evm_config.fill_tx_env_system_contract_call(
39 &mut evm.context.evm.env,
40 alloy_eips::eip7002::SYSTEM_ADDRESS,
41 CONSOLIDATION_REQUEST_PREDEPLOY_ADDRESS,
42 Bytes::new(),
43 );
44
45 let mut res = match evm.transact() {
46 Ok(res) => res,
47 Err(e) => {
48 evm.context.evm.env = previous_env;
49 return Err(BlockValidationError::ConsolidationRequestsContractCall {
50 message: format!("execution failed: {e}"),
51 }
52 .into())
53 }
54 };
55
56 res.state.remove(&alloy_eips::eip7002::SYSTEM_ADDRESS);
58 res.state.remove(&evm.block().coinbase);
59
60 evm.context.evm.env = previous_env;
62
63 Ok(res)
64}
65
66#[inline]
69pub(crate) fn post_commit(result: ExecutionResult) -> Result<Bytes, BlockExecutionError> {
70 match result {
71 ExecutionResult::Success { output, .. } => Ok(output.into_data()),
72 ExecutionResult::Revert { output, .. } => {
73 Err(BlockValidationError::ConsolidationRequestsContractCall {
74 message: format!("execution reverted: {output}"),
75 }
76 .into())
77 }
78 ExecutionResult::Halt { reason, .. } => {
79 Err(BlockValidationError::ConsolidationRequestsContractCall {
80 message: format!("execution halted: {reason:?}"),
81 }
82 .into())
83 }
84 }
85}