anvil/eth/backend/mem/
optimism.rs1use super::Backend;
4use crate::eth::error::BlockchainError;
5use alloy_evm::{Database, Evm, EvmEnv, EvmFactory};
6use alloy_network::Network;
7use alloy_op_evm::{OpEvmContext, OpEvmFactory, OpTx};
8use foundry_evm::backend::DatabaseError;
9use op_revm::{OpHaltReason, OpSpecId, OpTransaction};
10use revm::{
11 DatabaseRef, Inspector,
12 context::{
13 TxEnv,
14 result::{HaltReason, ResultAndState},
15 },
16 database_interface::WrapDatabaseRef,
17};
18
19impl<N: Network> Backend<N> {
20 pub(super) fn transact_op_with_inspector_ref<'db, I, DB>(
25 &self,
26 db: &'db DB,
27 evm_env: &EvmEnv,
28 inspector: &mut I,
29 tx_env: OpTransaction<TxEnv>,
30 spec: OpSpecId,
31 ) -> Result<ResultAndState<HaltReason>, BlockchainError>
32 where
33 DB: DatabaseRef + ?Sized,
34 I: Inspector<OpEvmContext<WrapDatabaseRef<&'db DB>>>,
35 WrapDatabaseRef<&'db DB>: Database<Error = DatabaseError>,
36 {
37 let op_env = EvmEnv::new(
38 evm_env.cfg_env.clone().with_spec_and_mainnet_gas_params(spec),
39 evm_env.block_env.clone(),
40 );
41 let mut evm = OpEvmFactory::default().create_evm_with_inspector(
42 WrapDatabaseRef(db),
43 op_env,
44 inspector,
45 );
46 self.inject_configured_precompiles(evm.precompiles_mut(), evm_env);
47 let result = evm.transact(OpTx(tx_env))?;
48 Ok(ResultAndState {
49 result: result.result.map_haltreason(|h| match h {
50 OpHaltReason::Base(eth) => eth,
51 OpHaltReason::FailedDeposit => HaltReason::PrecompileError,
52 }),
53 state: result.state,
54 })
55 }
56}