1use context::{result::FromStringError, ContextTr};
2use handler::{
3 instructions::InstructionProvider, ContextTrDbError, EthFrame, EvmTr, Frame, FrameInitOrResult,
4 PrecompileProvider,
5};
6use interpreter::{
7 interpreter::EthInterpreter, FrameInput, Interpreter, InterpreterResult, InterpreterTypes,
8};
9
10pub trait InspectorEvmTr: EvmTr {
16 type Inspector;
17
18 fn inspector(&mut self) -> &mut Self::Inspector;
20
21 fn ctx_inspector(&mut self) -> (&mut Self::Context, &mut Self::Inspector);
25
26 fn run_inspect_interpreter(
31 &mut self,
32 interpreter: &mut Interpreter<
33 <Self::Instructions as InstructionProvider>::InterpreterTypes,
34 >,
35 ) -> <<Self::Instructions as InstructionProvider>::InterpreterTypes as InterpreterTypes>::Output;
36}
37
38pub trait InspectorFrame: Frame {
42 type IT: InterpreterTypes;
43
44 fn run_inspect(&mut self, evm: &mut Self::Evm) -> Result<FrameInitOrResult<Self>, Self::Error>;
48
49 fn interpreter(&mut self) -> &mut Interpreter<Self::IT>;
51
52 fn frame_input(&self) -> &FrameInput;
54}
55
56impl<EVM, ERROR> InspectorFrame for EthFrame<EVM, ERROR, EthInterpreter>
58where
59 EVM: EvmTr<
60 Context: ContextTr,
61 Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>,
62 Instructions: InstructionProvider<
63 Context = EVM::Context,
64 InterpreterTypes = EthInterpreter,
65 >,
66 > + InspectorEvmTr,
67 ERROR: From<ContextTrDbError<EVM::Context>> + FromStringError,
68{
69 type IT = EthInterpreter;
70
71 fn run_inspect(&mut self, evm: &mut Self::Evm) -> Result<FrameInitOrResult<Self>, Self::Error> {
72 let interpreter = self.interpreter();
73 let next_action = evm.run_inspect_interpreter(interpreter);
74 self.process_next_action(evm, next_action)
75 }
76
77 fn interpreter(&mut self) -> &mut Interpreter<Self::IT> {
78 &mut self.interpreter
79 }
80
81 fn frame_input(&self) -> &FrameInput {
82 &self.input
83 }
84}