From aa08510411d7f580fe42cc9e7d753db610bdf4e1 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 15:52:04 -0400 Subject: [PATCH 01/17] wip --- Cargo.lock | 1 + Cargo.toml | 7 ++ crates/lib-reth/Cargo.toml | 4 +- .../src/reth_libmdbx/node_types/mod.rs | 30 +++-- crates/lib-reth/src/rpc.rs | 37 +++--- crates/lib-reth/src/traits/revm.rs | 110 ++++++++++++++---- 6 files changed, 141 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dcaf63e..0d155ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4157,6 +4157,7 @@ dependencies = [ "futures", "op-alloy-consensus", "op-alloy-network", + "op-revm", "reth-chainspec", "reth-db", "reth-network-api", diff --git a/Cargo.toml b/Cargo.toml index 3237f8a..d73020b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -62,6 +62,13 @@ revm = { version = "34.0.0", features = [ "optional_block_gas_limit", "c-kzg", ], default-features = false } +op-revm = { version = "15.0.0", features = [ + "std", + "secp256k1", + "optional_balance_check", + "optional_block_gas_limit", + "c-kzg", +], default-features = false } # async tokio = "1" diff --git a/crates/lib-reth/Cargo.toml b/crates/lib-reth/Cargo.toml index 1303053..d9b7e2e 100644 --- a/crates/lib-reth/Cargo.toml +++ b/crates/lib-reth/Cargo.toml @@ -73,6 +73,7 @@ revm.workspace = true revm-database = { workspace = true, default-features = false, features = [ "alloydb", ] } +op-revm = { workspace = true, optional = true } # async tokio = { workspace = true, features = ["full"] } @@ -89,7 +90,7 @@ serial_test.workspace = true [features] -default = ["full"] +default = ["full", "op-reth-libmdbx"] full = ["ipc", "ws", "uniswap-storage", "revm", "reth-libmdbx"] @@ -117,6 +118,7 @@ op-reth-libmdbx = [ "dep:op-alloy-consensus", "uniswap-storage/l2-angstrom", "eth-network-exts/l2", + "op-revm", ] reth-libmdbx = [ diff --git a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs index faf1b5a..27fc706 100644 --- a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs +++ b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs @@ -1,7 +1,5 @@ use std::sync::Arc; -#[cfg(feature = "revm")] -use alloy_eips::BlockId; use alloy_provider::{IpcConnect, RootProvider, WsConnect, builder}; use eth_network_exts::EthNetworkExt; use reth_node_types::NodeTypes; @@ -129,18 +127,26 @@ where } #[cfg(feature = "revm")] -impl crate::traits::EthRevm for RethNodeClient -where - Ext::RethNode: NodeClientSpec -{ - type InnerDb = crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef; +mod revm_impl { + + use super::*; + use crate::traits::{EthRevm, RevmNetworkSpec}; + + impl EthRevm for RethNodeClient + where + N: RevmNetworkSpec, + Ext: EthNetworkExt, + Ext::RethNode: NodeClientSpec + { + type InnerDb = crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef; - fn make_inner_db(&self, block: BlockId) -> eyre::Result { - use reth_provider::StateProviderFactory; + fn make_inner_db(&self, block: alloy_eips::BlockId) -> eyre::Result { + use reth_provider::StateProviderFactory; - let state_provider = self.eth_db_provider().state_by_block_id(block)?; + let state_provider = self.eth_db_provider().state_by_block_id(block)?; - let this = reth_revm::database::StateProviderDatabase::new(state_provider); - Ok(crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef::new(this)) + let this = reth_revm::database::StateProviderDatabase::new(state_provider); + Ok(crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef::new(this)) + } } } diff --git a/crates/lib-reth/src/rpc.rs b/crates/lib-reth/src/rpc.rs index 3c4a096..c66a1b6 100644 --- a/crates/lib-reth/src/rpc.rs +++ b/crates/lib-reth/src/rpc.rs @@ -14,8 +14,6 @@ use alloy_rpc_client::WsConnect; use alloy_rpc_types::Filter; #[cfg(any(feature = "ipc", feature = "ws"))] use futures::Stream; -#[cfg(feature = "revm")] -use revm_database::{AlloyDB, WrapDatabaseAsync}; #[cfg(any(feature = "ipc", feature = "ws"))] use crate::traits::EthStream; @@ -103,18 +101,27 @@ where } #[cfg(feature = "revm")] -impl crate::traits::AsyncEthRevm for EthRpcClient -where - P: Provider + Clone, - N: Network -{ - type InnerDb = AlloyDB; - - fn make_inner_db( - &self, - block_number: u64, - handle: tokio::runtime::Handle - ) -> eyre::Result> { - Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.provider.clone(), block_number.into()), handle)) +mod revm_impl { + + use alloy_eips::BlockId; + use revm_database::{AlloyDB, WrapDatabaseAsync}; + + use super::*; + use crate::traits::{AsyncEthRevm, RevmNetworkSpec}; + + impl AsyncEthRevm for EthRpcClient + where + P: Provider + Clone, + N: Network + RevmNetworkSpec + { + type InnerDb = AlloyDB; + + fn make_inner_db( + &self, + block_id: BlockId, + handle: tokio::runtime::Handle + ) -> eyre::Result> { + Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.provider.clone(), block_id), handle)) + } } } diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 0117105..4a79dfe 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -1,22 +1,94 @@ use alloy_eips::BlockId; +use alloy_network::{Ethereum, Network}; use revm::{ - Context, DatabaseRef, MainBuilder, MainContext, + Context, DatabaseRef, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter }; use revm_database::{CacheDB, WrapDatabaseAsync, async_db::DatabaseAsyncRef}; -pub type RevmEvm = Evm< - Context, +type NetworkRevmContext = Context, Journal>, CHAIN>; + +type MainnetRevmEvm = Evm< + NetworkRevmContext, (), - EthInstructions>, + EthInstructions>, EthPrecompiles, EthFrame >; +pub trait RevmNetworkSpec: Network { + type TX; + type CFG; + type CHAIN; + type EVM; + + fn build_context( + db: CacheDB, + chain_id: u64 + ) -> NetworkRevmContext; + + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM; +} + +impl RevmNetworkSpec for Ethereum { + type CFG = CfgEnv; + type CHAIN = (); + type EVM = MainnetRevmEvm; + type TX = TxEnv; + + fn build_context( + db: CacheDB, + chain_id: u64 + ) -> NetworkRevmContext { + Context::mainnet() + .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) + .with_db(db) + } + + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { + Self::build_context(db, chain_id).build_mainnet() + } +} + +#[cfg(feature = "op-reth-libmdbx")] +mod op_impl { + use op_alloy_network::Optimism; + use op_revm::{DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; + + use super::*; + + type OptimismRevmEvm = OpEvm< + NetworkRevmContext, + (), + EthInstructions>, + OpPrecompiles + >; + + impl RevmNetworkSpec for Optimism { + type CFG = CfgEnv; + type CHAIN = L1BlockInfo; + type EVM = OptimismRevmEvm; + type TX = OpTransaction; + + fn build_context( + db: CacheDB, + chain_id: u64 + ) -> NetworkRevmContext { + Context::op() + .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) + .with_db(db) + } + + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { + Self::build_context(db, chain_id).build_op() + } + } +} + /// revm utils -pub trait EthRevm { +pub trait EthRevm { type InnerDb: DatabaseRef; /// `makes the inner database fetcher` @@ -28,42 +100,40 @@ pub trait EthRevm { } /// `makes a new cache db` - fn make_empty_evm(&self, block_id: BlockId) -> eyre::Result>> { - let cache = self.make_cache_db(block_id)?; - let evm = Context::mainnet().with_db(cache).build_mainnet(); - Ok(evm) + fn make_empty_evm(&self, block_id: BlockId, chain_id: u64) -> eyre::Result> { + let db = self.make_cache_db(block_id)?; + Ok(N::build_evm(db, chain_id)) } } /// async revm utils -pub trait AsyncEthRevm { +pub trait AsyncEthRevm { type InnerDb: DatabaseAsyncRef; /// `makes the inner database fetcher` fn make_inner_db( &self, - block_number: u64, + block_id: BlockId, handle: tokio::runtime::Handle ) -> eyre::Result>; /// `makes a new cache db` fn make_cache_db( &self, - block_number: u64, + block_id: BlockId, handle: tokio::runtime::Handle ) -> eyre::Result>> { - Ok(CacheDB::new(self.make_inner_db(block_number, handle)?)) + Ok(CacheDB::new(self.make_inner_db(block_id, handle)?)) } /// `makes a new evm with a cache db` fn make_evm( &self, - block_number: u64, - handle: tokio::runtime::Handle - ) -> eyre::Result>>> { - let cache = self.make_cache_db(block_number, handle)?; - let evm = Context::mainnet().with_db(cache).build_mainnet(); - - Ok(evm) + block_id: BlockId, + handle: tokio::runtime::Handle, + chain_id: u64 + ) -> eyre::Result>> { + let db = self.make_cache_db(block_id, handle)?; + Ok(N::build_evm(db, chain_id)) } } From cb6a2c78f900302c0dcf0edbc38bd8bb6acda1af Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 16:23:08 -0400 Subject: [PATCH 02/17] versions --- crates/lib-reth/Cargo.toml | 45 +++++----- crates/lib-reth/README.md | 4 +- crates/lib-reth/src/lib.rs | 8 +- .../src/reth_libmdbx/node_types/mod.rs | 20 +++-- crates/lib-reth/src/rpc.rs | 18 ++-- crates/lib-reth/src/traits/mod.rs | 2 +- crates/lib-reth/src/traits/revm.rs | 83 +++++++++++-------- 7 files changed, 97 insertions(+), 83 deletions(-) diff --git a/crates/lib-reth/Cargo.toml b/crates/lib-reth/Cargo.toml index d9b7e2e..ab7bbef 100644 --- a/crates/lib-reth/Cargo.toml +++ b/crates/lib-reth/Cargo.toml @@ -90,38 +90,23 @@ serial_test.workspace = true [features] -default = ["full", "op-reth-libmdbx"] -full = ["ipc", "ws", "uniswap-storage", "revm", "reth-libmdbx"] +default = ["full"] +full = ["mainnet-full", "op-full", "ipc", "ws", "uniswap-storage"] ipc = [] ws = [] -rayon = ["exe-runners/rayon"] +mainnet-full = ["revm", "reth-db"] +op-full = ["op-revm", "op-reth-db"] -revm = [ - "reth-libmdbx", - "dep:reth-rpc-eth-api", - "dep:reth-revm", - "dep:alloy-eips", -] -op-reth-libmdbx = [ - "reth-libmdbx", - "dep:reth-optimism-chainspec", - "dep:reth-optimism-primitives", - "dep:reth-optimism-node", - "dep:reth-optimism-evm", - "dep:reth-optimism-rpc", - "dep:op-alloy-network", - "dep:op-alloy-consensus", - "uniswap-storage/l2-angstrom", - "eth-network-exts/l2", - "op-revm", -] +revm = ["dep:alloy-eips", "reth-revm"] +op-revm = ["revm", "dep:op-revm", "dep:op-alloy-network"] -reth-libmdbx = [ + +reth-db = [ "dep:reth-provider", "dep:reth-rpc", "dep:reth-transaction-pool", @@ -136,7 +121,21 @@ reth-libmdbx = [ "dep:reth-storage-api", "dep:reth-rpc-eth-api", ] +op-reth-db = [ + "reth-db", + "dep:reth-optimism-chainspec", + "dep:reth-optimism-primitives", + "dep:reth-optimism-node", + "dep:reth-optimism-evm", + "dep:reth-optimism-rpc", + "dep:op-alloy-network", + "dep:op-alloy-consensus", + "uniswap-storage/l2-angstrom", + "eth-network-exts/l2", +] + uniswap-storage = ["dep:uniswap-storage", "dep:alloy-eips"] +rayon = ["exe-runners/rayon"] ci = [] diff --git a/crates/lib-reth/README.md b/crates/lib-reth/README.md index c164461..18d27d5 100644 --- a/crates/lib-reth/README.md +++ b/crates/lib-reth/README.md @@ -11,13 +11,13 @@ This crate provides a comprehensive library for connecting to Ethereum endpoints - HTTP (default) - IPC (feature = `ipc`) - WebSocket (feature = `ws`) -- Direct database access via libmdbx (feature = `reth-libmdbx`) +- Direct database access via libmdbx (feature = `reth-db`) ## Features - `full` - All connection types and integrations - `revm` - REVM execution support -- `op-reth-libmdbx` - Optimism node support +- `op-reth-db` - Optimism node support - `rayon` - Parallel execution support ## Supported Functionality diff --git a/crates/lib-reth/src/lib.rs b/crates/lib-reth/src/lib.rs index 2ac4b13..c0a6b81 100644 --- a/crates/lib-reth/src/lib.rs +++ b/crates/lib-reth/src/lib.rs @@ -1,22 +1,22 @@ #![allow(ambiguous_glob_reexports)] -#[cfg(feature = "reth-libmdbx")] +#[cfg(feature = "reth-db")] pub mod reth_libmdbx; pub mod rpc; pub mod traits; -#[cfg(feature = "op-reth-libmdbx")] +#[cfg(feature = "op-reth-db")] pub mod op_reth { pub use reth_optimism_chainspec::*; pub use reth_optimism_node::*; pub use reth_optimism_primitives::*; } -#[cfg(feature = "reth-libmdbx")] +#[cfg(feature = "reth-db")] pub use regular_reth::*; -#[cfg(feature = "reth-libmdbx")] +#[cfg(feature = "reth-db")] mod regular_reth { pub use reth_chainspec::*; pub use reth_node_ethereum::EthereumNode; diff --git a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs index 27fc706..cb1e343 100644 --- a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs +++ b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs @@ -12,7 +12,7 @@ use reth_tasks::TaskSpawner; use crate::{reth_libmdbx::DbConfig, traits::EthStream}; pub mod node; -#[cfg(feature = "op-reth-libmdbx")] +#[cfg(feature = "op-reth-db")] pub mod op_node; pub(crate) fn provider_runtime() -> eyre::Result { @@ -129,8 +129,11 @@ where #[cfg(feature = "revm")] mod revm_impl { + use reth_provider::StateProviderFactory; + use reth_revm::database::StateProviderDatabase; + use super::*; - use crate::traits::{EthRevm, RevmNetworkSpec}; + use crate::traits::{EthRevm, EthRevmParams, RevmNetworkSpec, reth_revm_utils::RethLibmdbxDatabaseRef}; impl EthRevm for RethNodeClient where @@ -138,15 +141,14 @@ mod revm_impl { Ext: EthNetworkExt, Ext::RethNode: NodeClientSpec { - type InnerDb = crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef; - - fn make_inner_db(&self, block: alloy_eips::BlockId) -> eyre::Result { - use reth_provider::StateProviderFactory; + type InnerDb = RethLibmdbxDatabaseRef; + type Params = EthRevmParams; - let state_provider = self.eth_db_provider().state_by_block_id(block)?; + fn make_inner_db(&self, params: &EthRevmParams) -> eyre::Result { + let state_provider = self.eth_db_provider().state_by_block_id(params.block_id)?; - let this = reth_revm::database::StateProviderDatabase::new(state_provider); - Ok(crate::traits::reth_revm_utils::RethLibmdbxDatabaseRef::new(this)) + let this = StateProviderDatabase::new(state_provider); + Ok(RethLibmdbxDatabaseRef::new(this)) } } } diff --git a/crates/lib-reth/src/rpc.rs b/crates/lib-reth/src/rpc.rs index c66a1b6..8431d5c 100644 --- a/crates/lib-reth/src/rpc.rs +++ b/crates/lib-reth/src/rpc.rs @@ -103,25 +103,21 @@ where #[cfg(feature = "revm")] mod revm_impl { - use alloy_eips::BlockId; use revm_database::{AlloyDB, WrapDatabaseAsync}; use super::*; - use crate::traits::{AsyncEthRevm, RevmNetworkSpec}; + use crate::traits::{AsyncEthRevmParams, EthRevm, RevmNetworkSpec}; - impl AsyncEthRevm for EthRpcClient + impl EthRevm for EthRpcClient where P: Provider + Clone, N: Network + RevmNetworkSpec { - type InnerDb = AlloyDB; - - fn make_inner_db( - &self, - block_id: BlockId, - handle: tokio::runtime::Handle - ) -> eyre::Result> { - Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.provider.clone(), block_id), handle)) + type InnerDb = WrapDatabaseAsync>; + type Params = AsyncEthRevmParams; + + fn make_inner_db(&self, params: &AsyncEthRevmParams) -> eyre::Result { + Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.provider.clone(), params.block_id), params.handle.clone())) } } } diff --git a/crates/lib-reth/src/traits/mod.rs b/crates/lib-reth/src/traits/mod.rs index 13a804a..7569bfa 100644 --- a/crates/lib-reth/src/traits/mod.rs +++ b/crates/lib-reth/src/traits/mod.rs @@ -6,5 +6,5 @@ mod revm; #[cfg(feature = "revm")] pub use revm::*; -#[cfg(feature = "revm")] +#[cfg(all(feature = "revm", feature = "reth-db"))] pub mod reth_revm_utils; diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 4a79dfe..7b64f02 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -1,12 +1,13 @@ use alloy_eips::BlockId; use alloy_network::{Ethereum, Network}; +use alloy_primitives::ChainId; use revm::{ Context, DatabaseRef, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter }; -use revm_database::{CacheDB, WrapDatabaseAsync, async_db::DatabaseAsyncRef}; +use revm_database::CacheDB; type NetworkRevmContext = Context, Journal>, CHAIN>; @@ -52,7 +53,7 @@ impl RevmNetworkSpec for Ethereum { } } -#[cfg(feature = "op-reth-libmdbx")] +#[cfg(feature = "op-revm")] mod op_impl { use op_alloy_network::Optimism; use op_revm::{DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; @@ -90,50 +91,66 @@ mod op_impl { /// revm utils pub trait EthRevm { type InnerDb: DatabaseRef; + type Params: EthRevmInput; /// `makes the inner database fetcher` - fn make_inner_db(&self, block_id: BlockId) -> eyre::Result; + fn make_inner_db(&self, params: &Self::Params) -> eyre::Result; /// `makes a new cache db` - fn make_cache_db(&self, block_id: BlockId) -> eyre::Result> { - Ok(CacheDB::new(self.make_inner_db(block_id)?)) + fn make_cache_db(&self, params: &Self::Params) -> eyre::Result> { + Ok(CacheDB::new(self.make_inner_db(params)?)) } /// `makes a new cache db` - fn make_empty_evm(&self, block_id: BlockId, chain_id: u64) -> eyre::Result> { - let db = self.make_cache_db(block_id)?; - Ok(N::build_evm(db, chain_id)) + fn make_empty_evm(&self, params: &Self::Params) -> eyre::Result> { + let db = self.make_cache_db(params)?; + Ok(N::build_evm(db, params.chain_id())) } } -/// async revm utils -pub trait AsyncEthRevm { - type InnerDb: DatabaseAsyncRef; +pub trait EthRevmInput { + fn block_id(&self) -> BlockId; - /// `makes the inner database fetcher` - fn make_inner_db( - &self, - block_id: BlockId, - handle: tokio::runtime::Handle - ) -> eyre::Result>; + fn chain_id(&self) -> ChainId; - /// `makes a new cache db` - fn make_cache_db( - &self, - block_id: BlockId, - handle: tokio::runtime::Handle - ) -> eyre::Result>> { - Ok(CacheDB::new(self.make_inner_db(block_id, handle)?)) + fn handle(&self) -> Option; +} + +pub struct EthRevmParams { + pub block_id: BlockId, + pub chain_id: ChainId +} + +impl EthRevmInput for EthRevmParams { + fn block_id(&self) -> BlockId { + self.block_id } - /// `makes a new evm with a cache db` - fn make_evm( - &self, - block_id: BlockId, - handle: tokio::runtime::Handle, - chain_id: u64 - ) -> eyre::Result>> { - let db = self.make_cache_db(block_id, handle)?; - Ok(N::build_evm(db, chain_id)) + fn chain_id(&self) -> ChainId { + self.chain_id + } + + fn handle(&self) -> Option { + None + } +} + +pub struct AsyncEthRevmParams { + pub block_id: BlockId, + pub chain_id: ChainId, + pub handle: tokio::runtime::Handle +} + +impl EthRevmInput for AsyncEthRevmParams { + fn block_id(&self) -> BlockId { + self.block_id + } + + fn chain_id(&self) -> ChainId { + self.chain_id + } + + fn handle(&self) -> Option { + Some(self.handle.clone()) } } From 0eacec13c84ddf1eb862071a75546f962913a520 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 16:45:14 -0400 Subject: [PATCH 03/17] auto_impl --- Cargo.lock | 1 + crates/lib-reth/Cargo.toml | 1 + crates/lib-reth/src/traits/revm.rs | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 0d155ce..254c002 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4151,6 +4151,7 @@ dependencies = [ "alloy-rpc-client", "alloy-rpc-types", "async-trait", + "auto_impl", "eth-network-exts", "exe-runners", "eyre", diff --git a/crates/lib-reth/Cargo.toml b/crates/lib-reth/Cargo.toml index ab7bbef..2fb7d05 100644 --- a/crates/lib-reth/Cargo.toml +++ b/crates/lib-reth/Cargo.toml @@ -83,6 +83,7 @@ async-trait.workspace = true # misc eyre.workspace = true exe-runners = { workspace = true, features = ["reth-tasks"] } +auto_impl.workspace = true [dev-dependencies] diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 7b64f02..57dc6f2 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -88,7 +88,7 @@ mod op_impl { } } -/// revm utils +#[auto_impl::auto_impl(&, Box, Arc)] pub trait EthRevm { type InnerDb: DatabaseRef; type Params: EthRevmInput; From c58a2a219e553f96bd09fe75fbd5a21e3b07063e Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 16:47:41 -0400 Subject: [PATCH 04/17] trait bound --- crates/lib-reth/src/reth_libmdbx/node_types/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs index cb1e343..6e0c964 100644 --- a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs +++ b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs @@ -138,7 +138,7 @@ mod revm_impl { impl EthRevm for RethNodeClient where N: RevmNetworkSpec, - Ext: EthNetworkExt, + Ext: EthNetworkExt, Ext::RethNode: NodeClientSpec { type InnerDb = RethLibmdbxDatabaseRef; From 6e0ff2ba8ced9135c363de7d968791847ab56f0f Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:00:03 -0400 Subject: [PATCH 05/17] inspect evm --- crates/lib-reth/src/traits/revm.rs | 56 +++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 12 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 57dc6f2..a20d416 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -2,7 +2,7 @@ use alloy_eips::BlockId; use alloy_network::{Ethereum, Network}; use alloy_primitives::ChainId; use revm::{ - Context, DatabaseRef, Journal, MainBuilder, MainContext, + Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter @@ -11,9 +11,9 @@ use revm_database::CacheDB; type NetworkRevmContext = Context, Journal>, CHAIN>; -type MainnetRevmEvm = Evm< +type MainnetRevmEvm = Evm< NetworkRevmContext, - (), + INSP, EthInstructions>, EthPrecompiles, EthFrame @@ -23,20 +23,26 @@ pub trait RevmNetworkSpec: Network { type TX; type CFG; type CHAIN; - type EVM; + type EVM: ExecuteEvm; fn build_context( db: CacheDB, chain_id: u64 ) -> NetworkRevmContext; - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM; + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM; + + fn build_evm_with_inspector( + db: CacheDB, + chain_id: u64, + inspector: INSP + ) -> Self::EVM; } impl RevmNetworkSpec for Ethereum { type CFG = CfgEnv; type CHAIN = (); - type EVM = MainnetRevmEvm; + type EVM = MainnetRevmEvm; type TX = TxEnv; fn build_context( @@ -48,9 +54,17 @@ impl RevmNetworkSpec for Ethereum { .with_db(db) } - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { Self::build_context(db, chain_id).build_mainnet() } + + fn build_evm_with_inspector( + db: CacheDB, + chain_id: u64, + inspector: INSP + ) -> Self::EVM { + Self::build_context(db, chain_id).build_mainnet_with_inspector(inspector) + } } #[cfg(feature = "op-revm")] @@ -60,9 +74,9 @@ mod op_impl { use super::*; - type OptimismRevmEvm = OpEvm< + type OptimismRevmEvm = OpEvm< NetworkRevmContext, - (), + INSP, EthInstructions>, OpPrecompiles >; @@ -70,7 +84,7 @@ mod op_impl { impl RevmNetworkSpec for Optimism { type CFG = CfgEnv; type CHAIN = L1BlockInfo; - type EVM = OptimismRevmEvm; + type EVM = OptimismRevmEvm; type TX = OpTransaction; fn build_context( @@ -82,9 +96,17 @@ mod op_impl { .with_db(db) } - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { + fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { Self::build_context(db, chain_id).build_op() } + + fn build_evm_with_inspector( + db: CacheDB, + chain_id: u64, + inspector: INSP + ) -> Self::EVM { + Self::build_context(db, chain_id).build_op_with_inspector(inspector) + } } } @@ -102,10 +124,20 @@ pub trait EthRevm { } /// `makes a new cache db` - fn make_empty_evm(&self, params: &Self::Params) -> eyre::Result> { + fn make_empty_evm(&self, params: &Self::Params) -> eyre::Result> { let db = self.make_cache_db(params)?; Ok(N::build_evm(db, params.chain_id())) } + + /// `makes a new cache db` + fn make_empty_evm_with_inspector( + &self, + params: &Self::Params, + inspector: INSP + ) -> eyre::Result> { + let db = self.make_cache_db(params)?; + Ok(N::build_evm_with_inspector(db, params.chain_id(), inspector)) + } } pub trait EthRevmInput { From 9fef24c47e506031706aa02fcc6969d118b4b960 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:14:19 -0400 Subject: [PATCH 06/17] updated --- Cargo.lock | 1 + Cargo.toml | 1 + crates/lib-reth/Cargo.toml | 3 ++- crates/lib-reth/src/traits/revm.rs | 4 ++-- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 254c002..6fef72c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4161,6 +4161,7 @@ dependencies = [ "op-revm", "reth-chainspec", "reth-db", + "reth-evm", "reth-network-api", "reth-node-ethereum", "reth-node-types", diff --git a/Cargo.toml b/Cargo.toml index d73020b..4e925f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ reth-optimism-rpc = { git = "https://github.com/ethereum-optimism/optimism", ver reth-optimism-primitives = { git = "https://github.com/ethereum-optimism/optimism", version = "1.11.3", tag = "op-reth/v1.11.3" } reth-revm = { git = "https://github.com/paradigmxyz/reth", version = "1.11.3", tag = "v1.11.3" } +reth-evm = { git = "https://github.com/paradigmxyz/reth", version = "1.11.3", tag = "v1.11.3" } reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", version = "1.11.3", tag = "v1.11.3" } reth-storage-api = { git = "https://github.com/paradigmxyz/reth", version = "1.11.3", tag = "v1.11.3" } reth-node-types = { git = "https://github.com/paradigmxyz/reth", version = "1.11.3", tag = "v1.11.3" } diff --git a/crates/lib-reth/Cargo.toml b/crates/lib-reth/Cargo.toml index 2fb7d05..281aa14 100644 --- a/crates/lib-reth/Cargo.toml +++ b/crates/lib-reth/Cargo.toml @@ -43,6 +43,7 @@ reth-revm = { workspace = true, optional = true } reth-rpc-eth-api = { workspace = true, optional = true } reth-storage-api = { workspace = true, optional = true } reth-node-types = { workspace = true, optional = true } +reth-evm = { workspace = true, optional = true } uniswap-storage = { workspace = true, optional = true } eth-network-exts.workspace = true @@ -103,7 +104,7 @@ mainnet-full = ["revm", "reth-db"] op-full = ["op-revm", "op-reth-db"] -revm = ["dep:alloy-eips", "reth-revm"] +revm = ["dep:alloy-eips", "dep:reth-revm", "dep:reth-evm"] op-revm = ["revm", "dep:op-revm", "dep:op-alloy-network"] diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index a20d416..3c61963 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -1,6 +1,7 @@ use alloy_eips::BlockId; use alloy_network::{Ethereum, Network}; use alloy_primitives::ChainId; +pub use reth_evm::TransactionEnv; use revm::{ Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, TxEnv}, @@ -8,7 +9,6 @@ use revm::{ interpreter::interpreter::EthInterpreter }; use revm_database::CacheDB; - type NetworkRevmContext = Context, Journal>, CHAIN>; type MainnetRevmEvm = Evm< @@ -20,7 +20,7 @@ type MainnetRevmEvm = Evm< >; pub trait RevmNetworkSpec: Network { - type TX; + type TX: TransactionEnv + Default; type CFG; type CHAIN; type EVM: ExecuteEvm; From 9bcccad2d34c99150d6bae03c4e486f97adfaee0 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:24:53 -0400 Subject: [PATCH 07/17] bumped --- crates/lib-reth/src/traits/revm.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 3c61963..30e2b47 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -1,10 +1,9 @@ use alloy_eips::BlockId; use alloy_network::{Ethereum, Network}; use alloy_primitives::ChainId; -pub use reth_evm::TransactionEnv; use revm::{ Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, - context::{BlockEnv, CfgEnv, Evm, TxEnv}, + context::{BlockEnv, CfgEnv, Evm, Transaction, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter }; @@ -20,11 +19,16 @@ type MainnetRevmEvm = Evm< >; pub trait RevmNetworkSpec: Network { - type TX: TransactionEnv + Default; + type TX: Transaction; type CFG; type CHAIN; type EVM: ExecuteEvm; + fn convert_build_tx( + tx: TxEnv, + #[cfg(feature = "op-revm")] op_mods: impl FnMut(&mut op_revm::OpTransaction) + ) -> Self::TX; + fn build_context( db: CacheDB, chain_id: u64 @@ -45,6 +49,13 @@ impl RevmNetworkSpec for Ethereum { type EVM = MainnetRevmEvm; type TX = TxEnv; + fn convert_build_tx( + tx: TxEnv, + #[cfg(feature = "op-revm")] _: impl FnMut(&mut op_revm::OpTransaction) + ) -> Self::TX { + tx + } + fn build_context( db: CacheDB, chain_id: u64 @@ -87,6 +98,15 @@ mod op_impl { type EVM = OptimismRevmEvm; type TX = OpTransaction; + fn convert_build_tx( + tx: TxEnv, + #[cfg(feature = "op-revm")] mut op_mods: impl FnMut(&mut op_revm::OpTransaction) + ) -> Self::TX { + let mut tx = OpTransaction::new(tx); + op_mods(&mut tx); + tx + } + fn build_context( db: CacheDB, chain_id: u64 From 83de1ab1bba4237ccafb0536eb95d1c8eadb6b80 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:29:19 -0400 Subject: [PATCH 08/17] bumped --- crates/lib-reth/src/traits/revm.rs | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 30e2b47..10fe9ba 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -5,7 +5,8 @@ use revm::{ Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, Transaction, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, - interpreter::interpreter::EthInterpreter + interpreter::interpreter::EthInterpreter, + state::EvmState }; use revm_database::CacheDB; type NetworkRevmContext = Context, Journal>, CHAIN>; @@ -18,11 +19,29 @@ type MainnetRevmEvm = Evm< EthFrame >; +/* + + // type ExecutionResult = ExecutionResult; + // type State = EvmState; + type Error = EVMError<::Error, InvalidTransaction>; + // type Tx = ::Tx; + // type Block = ::Block; + + + + // type Tx = ::Tx; + // type Block = ::Block; + // type State = EvmState; + type Error = OpError; + type ExecutionResult = ExecutionResult; + +*/ + pub trait RevmNetworkSpec: Network { type TX: Transaction; type CFG; type CHAIN; - type EVM: ExecuteEvm; + type EVM: ExecuteEvm; fn convert_build_tx( tx: TxEnv, @@ -117,7 +136,7 @@ mod op_impl { } fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { - Self::build_context(db, chain_id).build_op() + Self::build_context(db, chain_id).build_op().transact(tx) } fn build_evm_with_inspector( From 9d996ff9f76efaaf71ac4a06e54cf8f8b9bdb083 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:34:41 -0400 Subject: [PATCH 09/17] all trait connectors --- crates/lib-reth/src/traits/revm.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 10fe9ba..8ffdea3 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -3,7 +3,10 @@ use alloy_network::{Ethereum, Network}; use alloy_primitives::ChainId; use revm::{ Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, - context::{BlockEnv, CfgEnv, Evm, Transaction, TxEnv}, + context::{ + BlockEnv, CfgEnv, Evm, Transaction, TxEnv, + result::{EVMError, ExecutionResult, HaltReason, InvalidTransaction} + }, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter, state::EvmState @@ -33,7 +36,7 @@ type MainnetRevmEvm = Evm< // type Block = ::Block; // type State = EvmState; type Error = OpError; - type ExecutionResult = ExecutionResult; + // type ExecutionResult = ExecutionResult; */ @@ -41,7 +44,17 @@ pub trait RevmNetworkSpec: Network { type TX: Transaction; type CFG; type CHAIN; - type EVM: ExecuteEvm; + + type EvmHaltReason; + type EvmError; + + type EVM: ExecuteEvm< + Tx = Self::TX, + State = EvmState, + Block = BlockEnv, + ExecutionResult = ExecutionResult, + Error = Self::EvmError + >; fn convert_build_tx( tx: TxEnv, @@ -66,6 +79,8 @@ impl RevmNetworkSpec for Ethereum { type CFG = CfgEnv; type CHAIN = (); type EVM = MainnetRevmEvm; + type EvmError = EVMError; + type EvmHaltReason = HaltReason; type TX = TxEnv; fn convert_build_tx( @@ -100,7 +115,10 @@ impl RevmNetworkSpec for Ethereum { #[cfg(feature = "op-revm")] mod op_impl { use op_alloy_network::Optimism; - use op_revm::{DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; + use op_revm::{ + DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpHaltReason, OpSpecId, OpTransaction, OpTransactionError, + precompiles::OpPrecompiles + }; use super::*; @@ -115,6 +133,8 @@ mod op_impl { type CFG = CfgEnv; type CHAIN = L1BlockInfo; type EVM = OptimismRevmEvm; + type EvmError = EVMError; + type EvmHaltReason = OpHaltReason; type TX = OpTransaction; fn convert_build_tx( @@ -136,7 +156,7 @@ mod op_impl { } fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { - Self::build_context(db, chain_id).build_op().transact(tx) + Self::build_context(db, chain_id).build_op() } fn build_evm_with_inspector( From bcddd914d7cbfb5979f0995d793a477ce4478472 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:36:30 -0400 Subject: [PATCH 10/17] impls on revm error --- crates/lib-reth/src/traits/revm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 8ffdea3..72c75f4 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -46,7 +46,7 @@ pub trait RevmNetworkSpec: Network { type CHAIN; type EvmHaltReason; - type EvmError; + type EvmError: Send + Sync + std::error::Error; type EVM: ExecuteEvm< Tx = Self::TX, From e733011b9e8d761c4401110c76d8dc890f135fe6 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:40:55 -0400 Subject: [PATCH 11/17] cache db stuff --- crates/lib-reth/src/traits/revm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 72c75f4..3413abc 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -53,7 +53,7 @@ pub trait RevmNetworkSpec: Network { State = EvmState, Block = BlockEnv, ExecutionResult = ExecutionResult, - Error = Self::EvmError + Error = Self::EvmError> >; fn convert_build_tx( From c97a591e36339e21eb603b2c9ebff5c000e63961 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Fri, 20 Mar 2026 17:47:45 -0400 Subject: [PATCH 12/17] cleaned up --- crates/lib-reth/src/traits/revm.rs | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 3413abc..e530bf7 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -22,24 +22,6 @@ type MainnetRevmEvm = Evm< EthFrame >; -/* - - // type ExecutionResult = ExecutionResult; - // type State = EvmState; - type Error = EVMError<::Error, InvalidTransaction>; - // type Tx = ::Tx; - // type Block = ::Block; - - - - // type Tx = ::Tx; - // type Block = ::Block; - // type State = EvmState; - type Error = OpError; - // type ExecutionResult = ExecutionResult; - -*/ - pub trait RevmNetworkSpec: Network { type TX: Transaction; type CFG; From 622c691ae2fd5c07f726c2ce2a3eb56462e7e33f Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Mon, 23 Mar 2026 11:12:08 -0400 Subject: [PATCH 13/17] bumped version --- crates/eth-network-exts/src/lib.rs | 8 + .../src/reth_libmdbx/node_types/mod.rs | 5 +- crates/lib-reth/src/rpc.rs | 18 +- crates/lib-reth/src/traits/revm.rs | 171 +++--------------- 4 files changed, 52 insertions(+), 150 deletions(-) diff --git a/crates/eth-network-exts/src/lib.rs b/crates/eth-network-exts/src/lib.rs index 83118b0..e03cec2 100644 --- a/crates/eth-network-exts/src/lib.rs +++ b/crates/eth-network-exts/src/lib.rs @@ -8,6 +8,14 @@ pub trait EthNetworkExt: Send + Sync { type TypeExt; const CHAIN_ID: u64; + + fn is_op_chain() -> bool { + match Self::CHAIN_ID { + 1 | 11155111 => false, + 8453 | 130 => true, + _ => unreachable!() + } + } } pub trait AllExtensions: std::fmt::Debug + Send + Sync + Clone + Copy + Unpin + 'static {} diff --git a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs index 6e0c964..d1c9840 100644 --- a/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs +++ b/crates/lib-reth/src/reth_libmdbx/node_types/mod.rs @@ -133,11 +133,10 @@ mod revm_impl { use reth_revm::database::StateProviderDatabase; use super::*; - use crate::traits::{EthRevm, EthRevmParams, RevmNetworkSpec, reth_revm_utils::RethLibmdbxDatabaseRef}; + use crate::traits::{EthRevm, EthRevmParams, reth_revm_utils::RethLibmdbxDatabaseRef}; - impl EthRevm for RethNodeClient + impl EthRevm for RethNodeClient where - N: RevmNetworkSpec, Ext: EthNetworkExt, Ext::RethNode: NodeClientSpec { diff --git a/crates/lib-reth/src/rpc.rs b/crates/lib-reth/src/rpc.rs index 8431d5c..f8901e5 100644 --- a/crates/lib-reth/src/rpc.rs +++ b/crates/lib-reth/src/rpc.rs @@ -106,12 +106,12 @@ mod revm_impl { use revm_database::{AlloyDB, WrapDatabaseAsync}; use super::*; - use crate::traits::{AsyncEthRevmParams, EthRevm, RevmNetworkSpec}; + use crate::traits::{AsyncEthRevmParams, EthRevm}; - impl EthRevm for EthRpcClient + impl EthRevm for EthRpcClient where P: Provider + Clone, - N: Network + RevmNetworkSpec + N: Network { type InnerDb = WrapDatabaseAsync>; type Params = AsyncEthRevmParams; @@ -120,4 +120,16 @@ mod revm_impl { Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.provider.clone(), params.block_id), params.handle.clone())) } } + + impl EthRevm for RootProvider + where + N: Network + { + type InnerDb = WrapDatabaseAsync>>; + type Params = AsyncEthRevmParams; + + fn make_inner_db(&self, params: &AsyncEthRevmParams) -> eyre::Result { + Ok(WrapDatabaseAsync::with_handle(AlloyDB::new(self.clone(), params.block_id), params.handle.clone())) + } + } } diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index e530bf7..8f8ed0a 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -1,158 +1,57 @@ use alloy_eips::BlockId; -use alloy_network::{Ethereum, Network}; use alloy_primitives::ChainId; use revm::{ - Context, DatabaseRef, ExecuteEvm, Journal, MainBuilder, MainContext, - context::{ - BlockEnv, CfgEnv, Evm, Transaction, TxEnv, - result::{EVMError, ExecutionResult, HaltReason, InvalidTransaction} - }, + Context, DatabaseRef, Journal, MainBuilder, MainContext, + context::{BlockEnv, CfgEnv, Evm, TxEnv}, handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, - interpreter::interpreter::EthInterpreter, - state::EvmState + interpreter::interpreter::EthInterpreter }; use revm_database::CacheDB; type NetworkRevmContext = Context, Journal>, CHAIN>; -type MainnetRevmEvm = Evm< - NetworkRevmContext, - INSP, - EthInstructions>, +type MainnetRevmEvm = Evm< + NetworkRevmContext, + (), + EthInstructions>, EthPrecompiles, EthFrame >; -pub trait RevmNetworkSpec: Network { - type TX: Transaction; - type CFG; - type CHAIN; - - type EvmHaltReason; - type EvmError: Send + Sync + std::error::Error; - - type EVM: ExecuteEvm< - Tx = Self::TX, - State = EvmState, - Block = BlockEnv, - ExecutionResult = ExecutionResult, - Error = Self::EvmError> - >; - - fn convert_build_tx( - tx: TxEnv, - #[cfg(feature = "op-revm")] op_mods: impl FnMut(&mut op_revm::OpTransaction) - ) -> Self::TX; - - fn build_context( - db: CacheDB, - chain_id: u64 - ) -> NetworkRevmContext; - - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM; - - fn build_evm_with_inspector( - db: CacheDB, - chain_id: u64, - inspector: INSP - ) -> Self::EVM; +pub fn empty_mainnet_revm(db: CacheDB, chain_id: ChainId) -> MainnetRevmEvm { + Context::mainnet() + .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) + .with_db(db) + .build_mainnet() } -impl RevmNetworkSpec for Ethereum { - type CFG = CfgEnv; - type CHAIN = (); - type EVM = MainnetRevmEvm; - type EvmError = EVMError; - type EvmHaltReason = HaltReason; - type TX = TxEnv; - - fn convert_build_tx( - tx: TxEnv, - #[cfg(feature = "op-revm")] _: impl FnMut(&mut op_revm::OpTransaction) - ) -> Self::TX { - tx - } - - fn build_context( - db: CacheDB, - chain_id: u64 - ) -> NetworkRevmContext { - Context::mainnet() - .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) - .with_db(db) - } - - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { - Self::build_context(db, chain_id).build_mainnet() - } - - fn build_evm_with_inspector( - db: CacheDB, - chain_id: u64, - inspector: INSP - ) -> Self::EVM { - Self::build_context(db, chain_id).build_mainnet_with_inspector(inspector) - } -} +#[cfg(feature = "op-revm")] +pub use op_impl::empty_op_mainnet_revm; +#[cfg(feature = "op-revm")] +pub use op_revm::OpTransaction; #[cfg(feature = "op-revm")] mod op_impl { - use op_alloy_network::Optimism; - use op_revm::{ - DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpHaltReason, OpSpecId, OpTransaction, OpTransactionError, - precompiles::OpPrecompiles - }; + use op_revm::{DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; use super::*; - type OptimismRevmEvm = OpEvm< - NetworkRevmContext, - INSP, - EthInstructions>, + type OptimismRevmEvm = OpEvm< + NetworkRevmContext, CfgEnv, L1BlockInfo>, + (), + EthInstructions, CfgEnv, L1BlockInfo>>, OpPrecompiles >; - impl RevmNetworkSpec for Optimism { - type CFG = CfgEnv; - type CHAIN = L1BlockInfo; - type EVM = OptimismRevmEvm; - type EvmError = EVMError; - type EvmHaltReason = OpHaltReason; - type TX = OpTransaction; - - fn convert_build_tx( - tx: TxEnv, - #[cfg(feature = "op-revm")] mut op_mods: impl FnMut(&mut op_revm::OpTransaction) - ) -> Self::TX { - let mut tx = OpTransaction::new(tx); - op_mods(&mut tx); - tx - } - - fn build_context( - db: CacheDB, - chain_id: u64 - ) -> NetworkRevmContext { - Context::op() - .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) - .with_db(db) - } - - fn build_evm(db: CacheDB, chain_id: u64) -> Self::EVM { - Self::build_context(db, chain_id).build_op() - } - - fn build_evm_with_inspector( - db: CacheDB, - chain_id: u64, - inspector: INSP - ) -> Self::EVM { - Self::build_context(db, chain_id).build_op_with_inspector(inspector) - } + pub fn empty_op_mainnet_revm(db: CacheDB, chain_id: ChainId) -> OptimismRevmEvm { + Context::op() + .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) + .with_db(db) + .build_op() } } #[auto_impl::auto_impl(&, Box, Arc)] -pub trait EthRevm { +pub trait EthRevm { type InnerDb: DatabaseRef; type Params: EthRevmInput; @@ -163,22 +62,6 @@ pub trait EthRevm { fn make_cache_db(&self, params: &Self::Params) -> eyre::Result> { Ok(CacheDB::new(self.make_inner_db(params)?)) } - - /// `makes a new cache db` - fn make_empty_evm(&self, params: &Self::Params) -> eyre::Result> { - let db = self.make_cache_db(params)?; - Ok(N::build_evm(db, params.chain_id())) - } - - /// `makes a new cache db` - fn make_empty_evm_with_inspector( - &self, - params: &Self::Params, - inspector: INSP - ) -> eyre::Result> { - let db = self.make_cache_db(params)?; - Ok(N::build_evm_with_inspector(db, params.chain_id(), inspector)) - } } pub trait EthRevmInput { From 9fb355012d64b5539bb71243a7b0d220a715fe97 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Mon, 23 Mar 2026 11:16:14 -0400 Subject: [PATCH 14/17] bumped version --- crates/lib-reth/src/traits/revm.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 8f8ed0a..5034348 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -32,6 +32,7 @@ pub use op_revm::OpTransaction; #[cfg(feature = "op-revm")] mod op_impl { use op_revm::{DefaultOp, L1BlockInfo, OpBuilder, OpEvm, OpSpecId, OpTransaction, precompiles::OpPrecompiles}; + use revm::handler::EvmTr; use super::*; @@ -42,11 +43,22 @@ mod op_impl { OpPrecompiles >; - pub fn empty_op_mainnet_revm(db: CacheDB, chain_id: ChainId) -> OptimismRevmEvm { - Context::op() + pub fn empty_op_mainnet_revm( + db: CacheDB, + chain_id: ChainId, + disable_nonce_check: bool + ) -> OptimismRevmEvm { + let mut evm = Context::op() .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) .with_db(db) - .build_op() + .build_op(); + + if disable_nonce_check { + evm.ctx_mut() + .modify_cfg(|cfg| cfg.disable_nonce_check = true); + } + + evm } } From 60770925a2374a469a0a45103546ac809a7515d0 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Mon, 23 Mar 2026 11:16:54 -0400 Subject: [PATCH 15/17] bumped version --- .github/workflows/build.yaml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index af6f300..bed129d 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -39,19 +39,14 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: stable - + - uses: Swatinem/rust-cache@v2 with: key: cargo-check cache-on-failure: true - - name: cargo check --workspace --all-features - run: cargo check --workspace --all-features + - name: cargo check --workspace --all-targets --all-features + run: cargo check --workspace --all-targets --all-features cargo-clippy: name: cargo clippy @@ -86,4 +81,4 @@ jobs: - uses: dtolnay/rust-toolchain@stable - uses: Swatinem/rust-cache@v2 - name: Run tests - run: cargo test --workspace --features ci -- --nocapture \ No newline at end of file + run: cargo test --workspace --all-targets --features ci -- --nocapture \ No newline at end of file From 40ba8610a9d1d9d0e4be81ae7505bb950d6076b7 Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Mon, 23 Mar 2026 11:49:24 -0400 Subject: [PATCH 16/17] send sync --- crates/lib-reth/src/traits/revm.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 5034348..2260734 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -76,7 +76,7 @@ pub trait EthRevm { } } -pub trait EthRevmInput { +pub trait EthRevmInput: Send + Sync { fn block_id(&self) -> BlockId; fn chain_id(&self) -> ChainId; From a680c8aa3dc23e512e5f58527609e5009a2ed29f Mon Sep 17 00:00:00 2001 From: jnoorchashm37 Date: Mon, 23 Mar 2026 12:28:48 -0400 Subject: [PATCH 17/17] nonce check --- crates/lib-reth/src/traits/revm.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/crates/lib-reth/src/traits/revm.rs b/crates/lib-reth/src/traits/revm.rs index 2260734..72a0dba 100644 --- a/crates/lib-reth/src/traits/revm.rs +++ b/crates/lib-reth/src/traits/revm.rs @@ -3,7 +3,7 @@ use alloy_primitives::ChainId; use revm::{ Context, DatabaseRef, Journal, MainBuilder, MainContext, context::{BlockEnv, CfgEnv, Evm, TxEnv}, - handler::{EthFrame, EthPrecompiles, instructions::EthInstructions}, + handler::{EthFrame, EthPrecompiles, EvmTr, instructions::EthInstructions}, interpreter::interpreter::EthInterpreter }; use revm_database::CacheDB; @@ -17,11 +17,22 @@ type MainnetRevmEvm = Evm< EthFrame >; -pub fn empty_mainnet_revm(db: CacheDB, chain_id: ChainId) -> MainnetRevmEvm { - Context::mainnet() +pub fn empty_mainnet_revm( + db: CacheDB, + chain_id: ChainId, + disable_nonce_check: bool +) -> MainnetRevmEvm { + let mut evm = Context::mainnet() .modify_cfg_chained(|cfg| cfg.chain_id = chain_id) .with_db(db) - .build_mainnet() + .build_mainnet(); + + if disable_nonce_check { + evm.ctx_mut() + .modify_cfg(|cfg| cfg.disable_nonce_check = true); + } + + evm } #[cfg(feature = "op-revm")]