revm_inspector/
mainnet_inspect.rs

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