Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions crates/evm/core/src/backend/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -76,7 +76,7 @@ pub type JournaledState = JournalInner<JournalEntry>;

/// An extension trait that allows us to easily extend the `revm::Inspector` capabilities
#[auto_impl::auto_impl(&mut)]
pub trait DatabaseExt<BLOCK = BlockEnv, TX = TxEnv, SPEC = SpecId>:
pub trait DatabaseExt<BLOCK, TX, SPEC>:
Database<Error = DatabaseError> + DatabaseCommit + Debug
{
/// Creates a new state snapshot at the current point of execution.
Expand Down Expand Up @@ -388,7 +388,7 @@ pub trait DatabaseExt<BLOCK = BlockEnv, TX = TxEnv, SPEC = SpecId>:
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.
///
Expand Down
74 changes: 43 additions & 31 deletions crates/evm/core/src/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<BlockEnv, TxEnv, SpecId>>;

type FoundryEvm<'db, I: FoundryInspectorExt<Self::FoundryContext<'db>>> = EthFoundryEvm<'db, I>;

fn create_foundry_evm_with_inspector<'db, I: FoundryInspectorExt<Self::FoundryContext<'db>>>(
&self,
db: &'db mut dyn DatabaseExt,
db: &'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>,
evm_env: EvmEnv,
inspector: I,
) -> Self::FoundryEvm<'db, I> {
Expand All @@ -121,7 +121,7 @@ impl FoundryEvmFactory for EthEvmFactory {

fn transact_with_dyn_inspector(
&self,
db: &mut dyn DatabaseExt,
db: &mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>,
evm_env: EvmEnv,
inspector: &mut dyn for<'db> FoundryInspectorExt<Self::FoundryContext<'db>>,
depth: usize,
Expand All @@ -137,9 +137,9 @@ impl FoundryEvmFactory for EthEvmFactory {
/// (chain ID check, network precompile injection).
pub fn new_eth_evm_with_inspector<
'db,
I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>,
I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>,
>(
db: &'db mut dyn DatabaseExt,
db: &'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>,
evm_env: EvmEnv,
inspector: I,
) -> EthFoundryEvm<'db, I> {
Expand Down Expand Up @@ -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<BlockEnv, TxEnv, SpecId>>,
I,
EthInstructions<EthInterpreter, EthEvmContext<&'db mut dyn DatabaseExt>>,
EthInstructions<
EthInterpreter,
EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>,
>,
PrecompilesMap,
EthFrame<EthInterpreter>,
>;

pub struct EthFoundryEvm<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> {
pub struct EthFoundryEvm<
'db,
I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>,
> {
pub inner: EthRevmEvm<'db, I>,
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Evm
for EthFoundryEvm<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
Evm for EthFoundryEvm<'db, I>
{
type Precompiles = PrecompilesMap;
type Inspector = I;
type DB = &'db mut dyn DatabaseExt;
type DB = &'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>;
type Error = EVMError<DatabaseError>;
type HaltReason = HaltReason;
type Spec = SpecId;
Expand Down Expand Up @@ -252,18 +258,18 @@ impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Evm
}
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Deref
for EthFoundryEvm<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
Deref for EthFoundryEvm<'db, I>
{
type Target = EthEvmContext<&'db mut dyn DatabaseExt>;
type Target = EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>;

fn deref(&self) -> &Self::Target {
&self.inner.ctx
}
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> DerefMut
for EthFoundryEvm<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
DerefMut for EthFoundryEvm<'db, I>
{
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner.ctx
Expand All @@ -282,8 +288,8 @@ pub trait IntoNestedEvm<TX> {
fn into_nested_evm(self) -> Self::Inner;
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> IntoNestedEvm<TxEnv>
for EthFoundryEvm<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
IntoNestedEvm<TxEnv> for EthFoundryEvm<'db, I>
{
type Inner = EthRevmEvm<'db, I>;

Expand Down Expand Up @@ -313,8 +319,8 @@ pub trait NestedEvm {
) -> Result<ResultAndState<HaltReason>, EVMError<DatabaseError>>;
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> NestedEvm
for EthRevmEvm<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
NestedEvm for EthRevmEvm<'db, I>
{
type Tx = TxEnv;

Expand Down Expand Up @@ -383,13 +389,16 @@ pub fn with_cloned_context<CTX: FoundryContextExt>(
Ok(())
}

pub struct EthFoundryHandler<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> {
pub struct EthFoundryHandler<
'db,
I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>,
> {
create2_overrides: Vec<(usize, CallInputs)>,
_phantom: PhantomData<(&'db mut dyn DatabaseExt, I)>,
_phantom: PhantomData<(&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>, I)>,
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Default
for EthFoundryHandler<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
Default for EthFoundryHandler<'db, I>
{
fn default() -> Self {
Self { create2_overrides: Vec::new(), _phantom: PhantomData }
Expand All @@ -398,21 +407,24 @@ impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Defau

// Blanket Handler implementation for FoundryHandler, needed for implementing the InspectorHandler
// trait.
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> Handler
for EthFoundryHandler<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
Handler for EthFoundryHandler<'db, I>
{
type Evm = RevmEvm<
EthEvmContext<&'db mut dyn DatabaseExt>,
EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>,
I,
EthInstructions<EthInterpreter, EthEvmContext<&'db mut dyn DatabaseExt>>,
EthInstructions<
EthInterpreter,
EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>,
>,
PrecompilesMap,
EthFrame<EthInterpreter>,
>;
type Error = EVMError<DatabaseError>;
type HaltReason = HaltReason;
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
EthFoundryHandler<'db, I>
{
/// Handles CREATE2 frame initialization, potentially transforming it to use the CREATE2
Expand Down Expand Up @@ -508,8 +520,8 @@ impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>>
}
}

impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt>>> InspectorHandler
for EthFoundryHandler<'db, I>
impl<'db, I: FoundryInspectorExt<EthEvmContext<&'db mut dyn DatabaseExt<BlockEnv, TxEnv, SpecId>>>>
InspectorHandler for EthFoundryHandler<'db, I>
{
type IT = EthInterpreter;

Expand Down
Loading