diff --git a/crates/handler/src/evm.rs b/crates/handler/src/evm.rs index 53b893029a..2fd1eab5d7 100644 --- a/crates/handler/src/evm.rs +++ b/crates/handler/src/evm.rs @@ -123,7 +123,7 @@ impl ExecuteEvm for Evm, PRECOMPILES> where CTX: ContextSetters + ContextTr>, - PRECOMPILES: PrecompileProvider, + PRECOMPILES: PrecompileProvider, { type Output = Result< ResultAndState, @@ -141,7 +141,7 @@ impl ExecuteCommitEvm where CTX: ContextSetters + ContextTr, Db: DatabaseCommit>, - PRECOMPILES: PrecompileProvider, + PRECOMPILES: PrecompileProvider, { type CommitOutput = Result< ExecutionResult, diff --git a/crates/handler/src/frame.rs b/crates/handler/src/frame.rs index 0e78ad4e43..d4e887857a 100644 --- a/crates/handler/src/frame.rs +++ b/crates/handler/src/frame.rs @@ -74,7 +74,7 @@ pub struct EthFrame { impl Frame for EthFrame where EVM: EvmTr< - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider< Context = EVM::Context, InterpreterTypes = EthInterpreter, @@ -146,7 +146,7 @@ impl EthFrame where EVM: EvmTr< Context: ContextTr, - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider, >, ERROR: From> + From, @@ -514,7 +514,7 @@ impl EthFrame where EVM: EvmTr< Context: ContextTr, - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider< Context = EVM::Context, InterpreterTypes = EthInterpreter, diff --git a/crates/handler/src/mainnet_builder.rs b/crates/handler/src/mainnet_builder.rs index efd1ddd652..2ee64b64a7 100644 --- a/crates/handler/src/mainnet_builder.rs +++ b/crates/handler/src/mainnet_builder.rs @@ -6,7 +6,7 @@ use interpreter::interpreter::EthInterpreter; use primitives::hardfork::SpecId; pub type MainnetEvm = - Evm, EthPrecompiles>; + Evm, EthPrecompiles>; pub type MainnetContext = Context, ()>; diff --git a/crates/handler/src/precompile_provider.rs b/crates/handler/src/precompile_provider.rs index 608caea73f..8bded03c4d 100644 --- a/crates/handler/src/precompile_provider.rs +++ b/crates/handler/src/precompile_provider.rs @@ -8,64 +8,69 @@ use primitives::{hardfork::SpecId, Address, Bytes}; use std::boxed::Box; #[auto_impl(&mut, Box)] -pub trait PrecompileProvider { - type Context: ContextTr; +pub trait PrecompileProvider { type Output; - fn set_spec(&mut self, spec: <::Cfg as Cfg>::Spec); + fn set_spec(&mut self, spec: ::Spec); /// Run the precompile. fn run( &mut self, - context: &mut Self::Context, + context: &mut CTX, address: &Address, bytes: &Bytes, gas_limit: u64, ) -> Result, PrecompileError>; /// Get the warm addresses. - fn warm_addresses(&self) -> Box + '_>; + fn warm_addresses(&self) -> Box>; /// Check if the address is a precompile. fn contains(&self, address: &Address) -> bool; } -pub struct EthPrecompiles { +pub struct EthPrecompiles { pub precompiles: &'static Precompiles, - pub _phantom: core::marker::PhantomData, } -impl Clone for EthPrecompiles { +impl EthPrecompiles { + /// Returns addresses of the precompiles. + pub fn warm_addresses(&self) -> Box> { + Box::new(self.precompiles.addresses().cloned()) + } + + /// Returns whether the address is a precompile. + pub fn contains(&self, address: &Address) -> bool { + self.precompiles.contains(address) + } +} + +impl Clone for EthPrecompiles { fn clone(&self) -> Self { Self { precompiles: self.precompiles, - _phantom: core::marker::PhantomData, } } } -impl Default for EthPrecompiles { +impl Default for EthPrecompiles { fn default() -> Self { Self { precompiles: Precompiles::new(PrecompileSpecId::from_spec_id(SpecId::LATEST)), - _phantom: core::marker::PhantomData, } } } -impl PrecompileProvider for EthPrecompiles -where - CTX: ContextTr, -{ - type Context = CTX; +impl PrecompileProvider for EthPrecompiles { type Output = InterpreterResult; - fn set_spec(&mut self, spec: <::Cfg as Cfg>::Spec) { + + fn set_spec(&mut self, spec: ::Spec) { self.precompiles = Precompiles::new(PrecompileSpecId::from_spec_id(spec.into())); } fn run( &mut self, - _context: &mut Self::Context, + _context: &mut CTX, address: &Address, bytes: &Bytes, gas_limit: u64, @@ -102,10 +107,10 @@ where } fn warm_addresses(&self) -> Box> { - Box::new(self.precompiles.addresses().cloned()) + self.warm_addresses() } fn contains(&self, address: &Address) -> bool { - self.precompiles.contains(address) + self.contains(address) } } diff --git a/crates/inspector/src/mainnet_inspect.rs b/crates/inspector/src/mainnet_inspect.rs index 4853d5dca1..ac493bf604 100644 --- a/crates/inspector/src/mainnet_inspect.rs +++ b/crates/inspector/src/mainnet_inspect.rs @@ -29,7 +29,7 @@ impl InspectEvm where CTX: ContextSetters + ContextTr + JournalExt>, INSP: Inspector, - PRECOMPILES: PrecompileProvider, + PRECOMPILES: PrecompileProvider, { type Inspector = INSP; @@ -52,7 +52,7 @@ where CTX: ContextSetters + ContextTr + JournalExt, Db: DatabaseCommit>, INSP: Inspector, - PRECOMPILES: PrecompileProvider, + PRECOMPILES: PrecompileProvider, { fn inspect_commit_previous(&mut self) -> Self::CommitOutput { self.inspect_previous().map(|r| { diff --git a/crates/inspector/src/traits.rs b/crates/inspector/src/traits.rs index 3bdb5abcb2..4cdd4cbba8 100644 --- a/crates/inspector/src/traits.rs +++ b/crates/inspector/src/traits.rs @@ -80,7 +80,7 @@ impl InspectorFrame for EthFrame where EVM: EvmTr< Context: ContextTr, - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider< Context = EVM::Context, InterpreterTypes = EthInterpreter, diff --git a/crates/optimism/src/api/exec.rs b/crates/optimism/src/api/exec.rs index 7ae0d340f1..f82c4a0017 100644 --- a/crates/optimism/src/api/exec.rs +++ b/crates/optimism/src/api/exec.rs @@ -42,7 +42,7 @@ impl ExecuteEvm for OpEvm, PRECOMPILE> where CTX: OpContextTr, - PRECOMPILE: PrecompileProvider, + PRECOMPILE: PrecompileProvider, { type Output = Result, OpError>; @@ -56,7 +56,7 @@ impl ExecuteCommitEvm for OpEvm, PRECOMPILE> where CTX: OpContextTr, - PRECOMPILE: PrecompileProvider, + PRECOMPILE: PrecompileProvider, { type CommitOutput = Result, OpError>; @@ -73,7 +73,7 @@ impl InspectEvm where CTX: OpContextTr, INSP: Inspector, - PRECOMPILE: PrecompileProvider, + PRECOMPILE: PrecompileProvider, { type Inspector = INSP; @@ -92,7 +92,7 @@ impl InspectCommitEvm where CTX: OpContextTr, INSP: Inspector, - PRECOMPILE: PrecompileProvider, + PRECOMPILE: PrecompileProvider, { fn inspect_commit_previous(&mut self) -> Self::CommitOutput { self.inspect_previous().map(|r| { diff --git a/crates/optimism/src/evm.rs b/crates/optimism/src/evm.rs index a08fcfa1d1..6aecd23f22 100644 --- a/crates/optimism/src/evm.rs +++ b/crates/optimism/src/evm.rs @@ -1,4 +1,4 @@ -use crate::precompiles::OpPrecompileProvider; +use crate::precompiles::OpPrecompiles; use revm::{ context::{setters::ContextSetters, Evm, EvmData}, context_interface::ContextTr, @@ -11,18 +11,16 @@ use revm::{ }, }; -pub struct OpEvm, P = OpPrecompileProvider>( +pub struct OpEvm, P = OpPrecompiles>( pub Evm, ); -impl - OpEvm, OpPrecompileProvider> -{ +impl OpEvm, OpPrecompiles> { pub fn new(ctx: CTX, inspector: INSP) -> Self { Self(Evm { data: EvmData { ctx, inspector }, instruction: EthInstructions::new_mainnet(), - precompiles: OpPrecompileProvider::default(), + precompiles: OpPrecompiles::default(), }) } } diff --git a/crates/optimism/src/precompiles.rs b/crates/optimism/src/precompiles.rs index 7a3b2aaf37..8769d688dc 100644 --- a/crates/optimism/src/precompiles.rs +++ b/crates/optimism/src/precompiles.rs @@ -14,12 +14,12 @@ use revm::{ use std::boxed::Box; // Optimism precompile provider -pub struct OpPrecompileProvider { +pub struct OpPrecompiles { /// Inner precompile provider is same as Ethereums. - inner: EthPrecompiles, + inner: EthPrecompiles, } -impl Clone for OpPrecompileProvider { +impl Clone for OpPrecompiles { fn clone(&self) -> Self { Self { inner: self.inner.clone(), @@ -27,14 +27,11 @@ impl Clone for OpPrecompileProvider { } } -impl OpPrecompileProvider { - /// Create a new [`OpPrecompileProvider`] with the given precompiles. +impl OpPrecompiles { + /// Create a new [`OpPrecompiles`] with the given precompiles. pub fn new(precompiles: &'static Precompiles) -> Self { Self { - inner: EthPrecompiles { - precompiles, - _phantom: core::marker::PhantomData, - }, + inner: EthPrecompiles { precompiles }, } } @@ -92,22 +89,21 @@ pub fn isthumus() -> &'static Precompiles { }) } -impl PrecompileProvider for OpPrecompileProvider +impl PrecompileProvider for OpPrecompiles where CTX: ContextTr>, { - type Context = CTX; type Output = InterpreterResult; #[inline] - fn set_spec(&mut self, spec: <::Cfg as Cfg>::Spec) { + fn set_spec(&mut self, spec: ::Spec) { *self = Self::new_with_spec(spec); } #[inline] fn run( &mut self, - context: &mut Self::Context, + context: &mut CTX, address: &Address, bytes: &Bytes, gas_limit: u64, @@ -116,7 +112,7 @@ where } #[inline] - fn warm_addresses(&self) -> Box + '_> { + fn warm_addresses(&self) -> Box> { self.inner.warm_addresses() } @@ -126,7 +122,7 @@ where } } -impl Default for OpPrecompileProvider { +impl Default for OpPrecompiles { fn default() -> Self { Self::new_with_spec(OpSpecId::ISTHMUS) } diff --git a/examples/erc20_gas/src/exec.rs b/examples/erc20_gas/src/exec.rs index c24cbde2dc..70296a7904 100644 --- a/examples/erc20_gas/src/exec.rs +++ b/examples/erc20_gas/src/exec.rs @@ -19,7 +19,7 @@ pub fn transact_erc20evm( where EVM: EvmTr< Context: ContextTr>, - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider< Context = EVM::Context, InterpreterTypes = EthInterpreter, @@ -35,7 +35,7 @@ pub fn transact_erc20evm_commit( where EVM: EvmTr< Context: ContextTr, Db: DatabaseCommit>, - Precompiles: PrecompileProvider, + Precompiles: PrecompileProvider, Instructions: InstructionProvider< Context = EVM::Context, InterpreterTypes = EthInterpreter,