diff --git a/crates/evm/core/src/backend/mod.rs b/crates/evm/core/src/backend/mod.rs index 7071143e74f23..f3e05070d2676 100644 --- a/crates/evm/core/src/backend/mod.rs +++ b/crates/evm/core/src/backend/mod.rs @@ -21,7 +21,7 @@ use itertools::Itertools; use revm::{ Database, DatabaseCommit, JournalEntry, bytecode::Bytecode, - context::{Block, BlockEnv, CfgEnv, ContextTr, JournalInner, Transaction, TxEnv}, + context::{Block, BlockEnv, CfgEnv, ContextTr, JournalInner, Transaction}, context_interface::{journaled_state::account::JournaledAccountTr, result::ResultAndState}, database::{CacheDB, DatabaseRef, EmptyDB}, primitives::{AddressMap, HashMap as Map, KECCAK_EMPTY, Log, hardfork::SpecId}, @@ -76,7 +76,7 @@ pub type JournaledState = JournalInner; /// An extension trait that allows us to easily extend the `revm::Inspector` capabilities #[auto_impl::auto_impl(&mut)] -pub trait DatabaseExt: +pub trait DatabaseExt: Database + DatabaseCommit + Debug { /// Creates a new state snapshot at the current point of execution. @@ -388,7 +388,7 @@ pub trait DatabaseExt: fn set_blockhash(&mut self, block_number: U256, block_hash: B256); } -struct _ObjectSafe(dyn DatabaseExt); +struct _ObjectSafe(dyn DatabaseExt<(), (), ()>); /// Provides the underlying `revm::Database` implementation. /// diff --git a/crates/evm/core/src/evm.rs b/crates/evm/core/src/evm.rs index 1eccd634d1de3..7fefa6f3d8f41 100644 --- a/crates/evm/core/src/evm.rs +++ b/crates/evm/core/src/evm.rs @@ -106,13 +106,13 @@ pub trait FoundryEvmFactory: } impl FoundryEvmFactory for EthEvmFactory { - type FoundryContext<'db> = EthEvmContext<&'db mut dyn DatabaseExt>; + type FoundryContext<'db> = EthEvmContext<&'db mut dyn DatabaseExt>; type FoundryEvm<'db, I: FoundryInspectorExt>> = EthFoundryEvm<'db, I>; fn create_foundry_evm_with_inspector<'db, I: FoundryInspectorExt>>( &self, - db: &'db mut dyn DatabaseExt, + db: &'db mut dyn DatabaseExt, evm_env: EvmEnv, inspector: I, ) -> Self::FoundryEvm<'db, I> { @@ -121,7 +121,7 @@ impl FoundryEvmFactory for EthEvmFactory { fn transact_with_dyn_inspector( &self, - db: &mut dyn DatabaseExt, + db: &mut dyn DatabaseExt, evm_env: EvmEnv, inspector: &mut dyn for<'db> FoundryInspectorExt>, depth: usize, @@ -137,9 +137,9 @@ impl FoundryEvmFactory for EthEvmFactory { /// (chain ID check, network precompile injection). pub fn new_eth_evm_with_inspector< 'db, - I: FoundryInspectorExt>, + I: FoundryInspectorExt>>, >( - db: &'db mut dyn DatabaseExt, + db: &'db mut dyn DatabaseExt, evm_env: EvmEnv, inspector: I, ) -> EthFoundryEvm<'db, I> { @@ -174,23 +174,29 @@ fn get_create2_factory_call_inputs( } type EthRevmEvm<'db, I> = RevmEvm< - EthEvmContext<&'db mut dyn DatabaseExt>, + EthEvmContext<&'db mut dyn DatabaseExt>, I, - EthInstructions>, + EthInstructions< + EthInterpreter, + EthEvmContext<&'db mut dyn DatabaseExt>, + >, PrecompilesMap, EthFrame, >; -pub struct EthFoundryEvm<'db, I: FoundryInspectorExt>> { +pub struct EthFoundryEvm< + 'db, + I: FoundryInspectorExt>>, +> { pub inner: EthRevmEvm<'db, I>, } -impl<'db, I: FoundryInspectorExt>> Evm - for EthFoundryEvm<'db, I> +impl<'db, I: FoundryInspectorExt>>> + Evm for EthFoundryEvm<'db, I> { type Precompiles = PrecompilesMap; type Inspector = I; - type DB = &'db mut dyn DatabaseExt; + type DB = &'db mut dyn DatabaseExt; type Error = EVMError; type HaltReason = HaltReason; type Spec = SpecId; @@ -252,18 +258,18 @@ impl<'db, I: FoundryInspectorExt>> Evm } } -impl<'db, I: FoundryInspectorExt>> Deref - for EthFoundryEvm<'db, I> +impl<'db, I: FoundryInspectorExt>>> + Deref for EthFoundryEvm<'db, I> { - type Target = EthEvmContext<&'db mut dyn DatabaseExt>; + type Target = EthEvmContext<&'db mut dyn DatabaseExt>; fn deref(&self) -> &Self::Target { &self.inner.ctx } } -impl<'db, I: FoundryInspectorExt>> DerefMut - for EthFoundryEvm<'db, I> +impl<'db, I: FoundryInspectorExt>>> + DerefMut for EthFoundryEvm<'db, I> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner.ctx @@ -282,8 +288,8 @@ pub trait IntoNestedEvm { fn into_nested_evm(self) -> Self::Inner; } -impl<'db, I: FoundryInspectorExt>> IntoNestedEvm - for EthFoundryEvm<'db, I> +impl<'db, I: FoundryInspectorExt>>> + IntoNestedEvm for EthFoundryEvm<'db, I> { type Inner = EthRevmEvm<'db, I>; @@ -313,8 +319,8 @@ pub trait NestedEvm { ) -> Result, EVMError>; } -impl<'db, I: FoundryInspectorExt>> NestedEvm - for EthRevmEvm<'db, I> +impl<'db, I: FoundryInspectorExt>>> + NestedEvm for EthRevmEvm<'db, I> { type Tx = TxEnv; @@ -383,13 +389,16 @@ pub fn with_cloned_context( Ok(()) } -pub struct EthFoundryHandler<'db, I: FoundryInspectorExt>> { +pub struct EthFoundryHandler< + 'db, + I: FoundryInspectorExt>>, +> { create2_overrides: Vec<(usize, CallInputs)>, - _phantom: PhantomData<(&'db mut dyn DatabaseExt, I)>, + _phantom: PhantomData<(&'db mut dyn DatabaseExt, I)>, } -impl<'db, I: FoundryInspectorExt>> Default - for EthFoundryHandler<'db, I> +impl<'db, I: FoundryInspectorExt>>> + Default for EthFoundryHandler<'db, I> { fn default() -> Self { Self { create2_overrides: Vec::new(), _phantom: PhantomData } @@ -398,13 +407,16 @@ impl<'db, I: FoundryInspectorExt>> Defau // Blanket Handler implementation for FoundryHandler, needed for implementing the InspectorHandler // trait. -impl<'db, I: FoundryInspectorExt>> Handler - for EthFoundryHandler<'db, I> +impl<'db, I: FoundryInspectorExt>>> + Handler for EthFoundryHandler<'db, I> { type Evm = RevmEvm< - EthEvmContext<&'db mut dyn DatabaseExt>, + EthEvmContext<&'db mut dyn DatabaseExt>, I, - EthInstructions>, + EthInstructions< + EthInterpreter, + EthEvmContext<&'db mut dyn DatabaseExt>, + >, PrecompilesMap, EthFrame, >; @@ -412,7 +424,7 @@ impl<'db, I: FoundryInspectorExt>> Handl type HaltReason = HaltReason; } -impl<'db, I: FoundryInspectorExt>> +impl<'db, I: FoundryInspectorExt>>> EthFoundryHandler<'db, I> { /// Handles CREATE2 frame initialization, potentially transforming it to use the CREATE2 @@ -508,8 +520,8 @@ impl<'db, I: FoundryInspectorExt>> } } -impl<'db, I: FoundryInspectorExt>> InspectorHandler - for EthFoundryHandler<'db, I> +impl<'db, I: FoundryInspectorExt>>> + InspectorHandler for EthFoundryHandler<'db, I> { type IT = EthInterpreter;