Skip to main content

anvil/evm/
optimism.rs

1//! Optimism-specific EVM helpers.
2
3#[cfg(test)]
4mod tests {
5
6    use super::super::tests::{
7        CustomPrecompileFactory, ETH_PRAGUE_PRECOMPILE, PAYLOAD, PRECOMPILE_ADDR,
8    };
9    use crate::PrecompileFactory;
10    use alloy_evm::{Evm, EvmEnv, EvmFactory, precompiles::PrecompilesMap};
11    use alloy_op_evm::{OpEvm, OpEvmFactory, OpTx};
12    use alloy_primitives::{Address, TxKind, U256, address};
13    use itertools::Itertools;
14    use op_revm::{OpSpecId, OpTransaction};
15    use revm::{
16        context::{BlockEnv, CfgEnv, TxEnv},
17        database::EmptyDB,
18        inspector::NoOpInspector,
19        primitives::hardfork::SpecId,
20    };
21
22    // A precompile activated in the `Isthmus` spec.
23    const OP_ISTHMUS_PRECOMPILE: Address = address!("0x0000000000000000000000000000000000000100");
24
25    /// Creates a new OP EVM instance.
26    fn create_op_evm(
27        _spec: SpecId,
28        op_spec: OpSpecId,
29    ) -> (OpTx, OpEvm<EmptyDB, NoOpInspector, PrecompilesMap, OpTx>) {
30        let tx = OpTx(OpTransaction::<TxEnv> {
31            base: TxEnv {
32                kind: TxKind::Call(PRECOMPILE_ADDR),
33                data: PAYLOAD.into(),
34                ..Default::default()
35            },
36            ..Default::default()
37        });
38
39        let mut evm = OpEvmFactory::<OpTx>::default().create_evm_with_inspector(
40            EmptyDB::default(),
41            EvmEnv::new(CfgEnv::new_with_spec(op_spec), BlockEnv::default()),
42            NoOpInspector,
43        );
44
45        if op_spec == OpSpecId::ISTHMUS {
46            evm.ctx_mut().chain.operator_fee_constant = Some(U256::ZERO);
47            evm.ctx_mut().chain.operator_fee_scalar = Some(U256::ZERO);
48        }
49
50        (tx, evm)
51    }
52
53    #[test]
54    fn build_op_evm_with_extra_precompiles_isthmus_spec() {
55        let (tx, mut evm) = create_op_evm(SpecId::OSAKA, OpSpecId::ISTHMUS);
56
57        assert!(evm.precompiles().addresses().contains(&OP_ISTHMUS_PRECOMPILE));
58        assert!(evm.precompiles().addresses().contains(&ETH_PRAGUE_PRECOMPILE));
59        assert!(!evm.precompiles().addresses().contains(&PRECOMPILE_ADDR));
60
61        CustomPrecompileFactory.install(evm.precompiles_mut());
62
63        assert!(evm.precompiles().addresses().contains(&PRECOMPILE_ADDR));
64
65        let result = evm.transact(tx).unwrap();
66        assert!(result.result.is_success());
67        assert_eq!(result.result.output(), Some(&PAYLOAD.into()));
68    }
69
70    #[test]
71    fn build_op_evm_with_extra_precompiles_bedrock_spec() {
72        let (tx, mut evm) = create_op_evm(SpecId::OSAKA, OpSpecId::BEDROCK);
73
74        assert!(!evm.precompiles().addresses().contains(&OP_ISTHMUS_PRECOMPILE));
75        assert!(!evm.precompiles().addresses().contains(&ETH_PRAGUE_PRECOMPILE));
76        assert!(!evm.precompiles().addresses().contains(&PRECOMPILE_ADDR));
77
78        CustomPrecompileFactory.install(evm.precompiles_mut());
79
80        assert!(evm.precompiles().addresses().contains(&PRECOMPILE_ADDR));
81
82        let result = evm.transact(tx).unwrap();
83        assert!(result.result.is_success());
84        assert_eq!(result.result.output(), Some(&PAYLOAD.into()));
85    }
86}