diff --git a/crates/evm2/src/evm/async.rs b/crates/evm2/src/evm/async.rs index 9b7de6dc..22a825ff 100644 --- a/crates/evm2/src/evm/async.rs +++ b/crates/evm2/src/evm/async.rs @@ -778,6 +778,24 @@ mod tests { drop(evm.transact_async_send(&tx)); } + #[test] + #[should_panic = "async EVM execution requires EVM erased fields to be verified as Send with Evm::evm_is_send"] + fn transaction_async_send_panics_after_state_mut_replaces_database() { + let marker = Rc::new(()); + let mut evm = Evm::::new( + SpecId::OSAKA, + BlockEnvExt::default(), + TxRegistry::new(), + InMemoryDB::default(), + Precompiles::base(SpecId::OSAKA), + ); + evm.evm_is_send::>(); + evm.state_mut().set_initial(Db::new(NonSendDb { marker })); + let tx = test_tx(41); + + drop(evm.transact_async_send(&tx)); + } + #[test] fn transaction_async_accepts_non_send_erased_fields() { let marker = Rc::new(()); @@ -902,6 +920,24 @@ mod tests { assert_eq!(result.tx_gas_used(), 0); } + #[test] + #[should_panic = "async EVM execution requires EVM erased fields to be verified as Send with Evm::evm_is_send"] + fn system_call_async_send_panics_after_overlay_db_mut_replaces_database() { + let marker = Rc::new(()); + let contract = Address::from([0x42; 20]); + let mut evm = Evm::::new( + SpecId::OSAKA, + BlockEnvExt::default(), + TxRegistry::new(), + InMemoryDB::default(), + Precompiles::base(SpecId::OSAKA), + ); + evm.evm_is_send::>(); + evm.overlay_db_mut().db = Box::new(Db::new(NonSendDb { marker })); + + drop(evm.system_call_async_send(SystemTx::new(contract, Bytes::new()))); + } + #[test] fn system_call_async_clears_stale_error_code() { let contract = Address::from([0x42; 20]); diff --git a/crates/evm2/src/evm/mod.rs b/crates/evm2/src/evm/mod.rs index 189ce650..c94ed9dd 100644 --- a/crates/evm2/src/evm/mod.rs +++ b/crates/evm2/src/evm/mod.rs @@ -584,6 +584,7 @@ impl<'a, T: EvmTypes> Evm<'a, T> { /// available through [`Self::database_mut`]. #[inline] pub fn overlay_db_mut(&mut self) -> &mut CacheDB> { + self.evm_send = false; self.state.overlay_db_mut() } @@ -747,6 +748,7 @@ impl<'a, T: EvmTypes> Evm<'a, T> { /// Returns the mutable EVM state. #[inline] pub const fn state_mut(&mut self) -> &mut State<'a> { + self.evm_send = false; &mut self.state }