revm_optimism/api/
exec.rs

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}