diff --git a/crates/evm/src/system_calls/eip7251.rs b/crates/evm/src/system_calls/eip7251.rs index 02684d83b7a2..8a7049671028 100644 --- a/crates/evm/src/system_calls/eip7251.rs +++ b/crates/evm/src/system_calls/eip7251.rs @@ -48,11 +48,13 @@ where /// /// If Prague is not active at the given timestamp, then this is a no-op, and an empty vector is /// returned. Otherwise, the consolidation requests are returned. +/// +/// Note: this does not commit the state changes to the database, it only transact the call. #[inline] -pub fn apply_consolidation_requests_contract_call<EvmConfig, EXT, DB>( +pub fn transact_consolidation_requests_contract_call<EvmConfig, EXT, DB>( evm_config: &EvmConfig, evm: &mut Evm<'_, EXT, DB>, -) -> Result<Vec<Request>, BlockExecutionError> +) -> Result<ResultAndState, BlockExecutionError> where DB: Database + DatabaseCommit, DB::Error: core::fmt::Display, @@ -77,7 +79,7 @@ where Bytes::new(), ); - let ResultAndState { result, mut state } = match evm.transact() { + let mut res = match evm.transact() { Ok(res) => res, Err(e) => { evm.context.evm.env = previous_env; @@ -89,13 +91,35 @@ where }; // cleanup the state - state.remove(&alloy_eips::eip7002::SYSTEM_ADDRESS); - state.remove(&evm.block().coinbase); - evm.context.evm.db.commit(state); + res.state.remove(&alloy_eips::eip7002::SYSTEM_ADDRESS); + res.state.remove(&evm.block().coinbase); // re-set the previous env evm.context.evm.env = previous_env; + Ok(res) +} + +/// Applies the post-block call to the EIP-7251 consolidation requests contract. +/// +/// If Prague is not active at the given timestamp, then this is a no-op, and an empty vector is +/// returned. Otherwise, the consolidation requests are returned. +#[inline] +pub fn apply_consolidation_requests_contract_call<EvmConfig, EXT, DB>( + evm_config: &EvmConfig, + evm: &mut Evm<'_, EXT, DB>, +) -> Result<Vec<Request>, BlockExecutionError> +where + DB: Database + DatabaseCommit, + DB::Error: core::fmt::Display, + EvmConfig: ConfigureEvm<Header = Header>, +{ + let ResultAndState { result, state } = + transact_consolidation_requests_contract_call(evm_config, evm)?; + + // commit the state + evm.context.evm.db.commit(state); + let mut data = match result { ExecutionResult::Success { output, .. } => Ok(output.into_data()), ExecutionResult::Revert { output, .. } => {