1#[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 const OP_ISTHMUS_PRECOMPILE: Address = address!("0x0000000000000000000000000000000000000100");
24
25 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(Ð_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(Ð_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}