diff --git a/crates/revm/src/context/inner_evm_context.rs b/crates/revm/src/context/inner_evm_context.rs index 98a4d5679b..16ffe8a2f2 100644 --- a/crates/revm/src/context/inner_evm_context.rs +++ b/crates/revm/src/context/inner_evm_context.rs @@ -113,6 +113,11 @@ impl InnerEvmContext { &mut self.env } + /// Returns the error by replacing it with `Ok(())`, if any. + pub fn take_error(&mut self) -> Result<(), EVMError> { + core::mem::replace(&mut self.error, Ok(())) + } + /// Fetch block hash from database. #[inline] pub fn block_hash(&mut self, number: U256) -> Result> { diff --git a/crates/revm/src/evm.rs b/crates/revm/src/evm.rs index 76bf4b633c..239aa64eee 100644 --- a/crates/revm/src/evm.rs +++ b/crates/revm/src/evm.rs @@ -266,7 +266,7 @@ impl Evm<'_, EXT, DB> { // take error and break the loop if there is any. // This error is set From Interpreter when it's interacting with Host. - core::mem::replace(&mut self.context.evm.error, Ok(()))?; + self.context.evm.take_error()?; // take shared memory back. shared_memory = interpreter.take_memory(); diff --git a/crates/revm/src/handler/mainnet/execution.rs b/crates/revm/src/handler/mainnet/execution.rs index ba79aabe4b..f5c0eb2964 100644 --- a/crates/revm/src/handler/mainnet/execution.rs +++ b/crates/revm/src/handler/mainnet/execution.rs @@ -88,7 +88,7 @@ pub fn insert_call_outcome( shared_memory: &mut SharedMemory, outcome: CallOutcome, ) -> Result<(), EVMError> { - core::mem::replace(&mut context.evm.error, Ok(()))?; + context.evm.take_error()?; frame .frame_data_mut() .interpreter @@ -128,7 +128,7 @@ pub fn insert_create_outcome( frame: &mut Frame, outcome: CreateOutcome, ) -> Result<(), EVMError> { - core::mem::replace(&mut context.evm.error, Ok(()))?; + context.evm.take_error()?; frame .frame_data_mut() .interpreter diff --git a/crates/revm/src/handler/mainnet/post_execution.rs b/crates/revm/src/handler/mainnet/post_execution.rs index a0b81a0dc0..6230b882fc 100644 --- a/crates/revm/src/handler/mainnet/post_execution.rs +++ b/crates/revm/src/handler/mainnet/post_execution.rs @@ -76,7 +76,7 @@ pub fn output( context: &mut Context, result: FrameResult, ) -> Result> { - core::mem::replace(&mut context.evm.error, Ok(()))?; + context.evm.take_error()?; // used gas with refund calculated. let gas_refunded = result.gas().refunded() as u64; let final_gas_used = result.gas().spent() - gas_refunded;