revm_inspector/
mainnet_inspect.rs

1use context::{ContextSetters, ContextTr, Evm, JournalOutput, JournalTr};
2use database_interface::DatabaseCommit;
3use handler::{
4    instructions::EthInstructions, EthFrame, EvmTr, EvmTrError, Frame, FrameResult, Handler,
5    MainnetHandler, PrecompileProvider,
6};
7use interpreter::{interpreter::EthInterpreter, FrameInput, InterpreterResult};
8
9use crate::{
10    inspect::{InspectCommitEvm, InspectEvm},
11    Inspector, InspectorEvmTr, InspectorFrame, InspectorHandler, JournalExt,
12};
13
14impl<EVM, ERROR, FRAME> InspectorHandler for MainnetHandler<EVM, ERROR, FRAME>
15where
16    EVM: InspectorEvmTr<
17        Context: ContextTr<Journal: JournalTr<FinalOutput = JournalOutput>>,
18        Inspector: Inspector<<<Self as Handler>::Evm as EvmTr>::Context, EthInterpreter>,
19    >,
20    ERROR: EvmTrError<EVM>,
21    FRAME: Frame<Evm = EVM, Error = ERROR, FrameResult = FrameResult, FrameInit = FrameInput>
22        + InspectorFrame<IT = EthInterpreter>,
23{
24    type IT = EthInterpreter;
25}
26
27impl<CTX, INSP, PRECOMPILES> InspectEvm
28    for Evm<CTX, INSP, EthInstructions<EthInterpreter, CTX>, PRECOMPILES>
29where
30    CTX: ContextSetters + ContextTr<Journal: JournalTr<FinalOutput = JournalOutput> + JournalExt>,
31    INSP: Inspector<CTX, EthInterpreter>,
32    PRECOMPILES: PrecompileProvider<CTX, Output = InterpreterResult>,
33{
34    type Inspector = INSP;
35
36    fn set_inspector(&mut self, inspector: Self::Inspector) {
37        self.data.inspector = inspector;
38    }
39
40    fn inspect_replay(&mut self) -> Self::Output {
41        let mut t = MainnetHandler::<_, _, EthFrame<_, _, _>> {
42            _phantom: core::marker::PhantomData,
43        };
44
45        t.inspect_run(self)
46    }
47}
48
49impl<CTX, INSP, PRECOMPILES> InspectCommitEvm
50    for Evm<CTX, INSP, EthInstructions<EthInterpreter, CTX>, PRECOMPILES>
51where
52    CTX: ContextSetters
53        + ContextTr<Journal: JournalTr<FinalOutput = JournalOutput> + JournalExt, Db: DatabaseCommit>,
54    INSP: Inspector<CTX, EthInterpreter>,
55    PRECOMPILES: PrecompileProvider<CTX, Output = InterpreterResult>,
56{
57    fn inspect_commit_previous(&mut self) -> Self::CommitOutput {
58        self.inspect_replay().map(|r| {
59            self.ctx().db().commit(r.state);
60            r.result
61        })
62    }
63}