1use crate::{
2 evm::OpEvm, handler::OpHandler, transaction::OpTxTr, L1BlockInfo, OpHaltReason, OpSpecId,
3 OpTransactionError,
4};
5use inspector::{InspectCommitEvm, InspectEvm, Inspector, JournalExt};
6use precompile::Log;
7use revm::{
8 context_interface::{
9 result::{EVMError, ExecutionResult, ResultAndState},
10 Block, Cfg, ContextTr, Database, Journal,
11 },
12 handler::{handler::EvmTr, instructions::EthInstructions, EthFrame, Handler},
13 interpreter::interpreter::EthInterpreter,
14 state::EvmState,
15 Context, DatabaseCommit, ExecuteCommitEvm, ExecuteEvm,
16};
17use std::vec::Vec;
18
19impl<BLOCK, TX, CFG, DB, JOURNAL, INSP> ExecuteEvm
20 for OpEvm<
21 Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>,
22 INSP,
23 EthInstructions<EthInterpreter, Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>>,
24 >
25where
26 BLOCK: Block,
27 TX: OpTxTr,
28 CFG: Cfg<Spec = OpSpecId>,
29 DB: Database,
30 JOURNAL: Journal<Database = DB, FinalOutput = (EvmState, Vec<Log>)>,
31{
32 type Output =
33 Result<ResultAndState<OpHaltReason>, EVMError<<DB as Database>::Error, OpTransactionError>>;
34
35 fn transact_previous(&mut self) -> Self::Output {
36 let mut h = OpHandler::<_, _, EthFrame<_, _, _>>::new();
37 h.run(self)
38 }
39}
40
41impl<BLOCK, TX, CFG, DB, JOURNAL, INSP> ExecuteCommitEvm
42 for OpEvm<
43 Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>,
44 INSP,
45 EthInstructions<EthInterpreter, Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>>,
46 >
47where
48 BLOCK: Block,
49 TX: OpTxTr,
50 CFG: Cfg<Spec = OpSpecId>,
51 DB: Database + DatabaseCommit,
52 JOURNAL: Journal<Database = DB, FinalOutput = (EvmState, Vec<Log>)> + JournalExt,
53{
54 type CommitOutput = Result<
55 ExecutionResult<OpHaltReason>,
56 EVMError<<DB as Database>::Error, OpTransactionError>,
57 >;
58
59 fn transact_commit_previous(&mut self) -> Self::CommitOutput {
60 self.transact_previous().map(|r| {
61 self.ctx().db().commit(r.state);
62 r.result
63 })
64 }
65}
66
67impl<BLOCK, TX, CFG, DB, JOURNAL, INSP> InspectEvm
68 for OpEvm<
69 Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>,
70 INSP,
71 EthInstructions<EthInterpreter, Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>>,
72 >
73where
74 BLOCK: Block,
75 TX: OpTxTr,
76 CFG: Cfg<Spec = OpSpecId>,
77 DB: Database,
78 JOURNAL: Journal<Database = DB, FinalOutput = (EvmState, Vec<Log>)> + JournalExt,
79 INSP: Inspector<Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>, EthInterpreter>,
80{
81 type Inspector = INSP;
82
83 fn set_inspector(&mut self, inspector: Self::Inspector) {
84 self.0.data.inspector = inspector;
85 }
86
87 fn inspect_previous(&mut self) -> Self::Output {
88 let mut h = OpHandler::<_, _, EthFrame<_, _, _>>::new();
89 h.run(self)
90 }
91}
92
93impl<BLOCK, TX, CFG, DB, JOURNAL, INSP> InspectCommitEvm
94 for OpEvm<
95 Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>,
96 INSP,
97 EthInstructions<EthInterpreter, Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>>,
98 >
99where
100 BLOCK: Block,
101 TX: OpTxTr,
102 CFG: Cfg<Spec = OpSpecId>,
103 DB: Database + DatabaseCommit,
104 JOURNAL: Journal<Database = DB, FinalOutput = (EvmState, Vec<Log>)> + JournalExt,
105 INSP: Inspector<Context<BLOCK, TX, CFG, DB, JOURNAL, L1BlockInfo>, EthInterpreter>,
106{
107 fn inspect_commit_previous(&mut self) -> Self::CommitOutput {
108 self.inspect_previous().map(|r| {
109 self.ctx().db().commit(r.state);
110 r.result
111 })
112 }
113}