1use crate::{evm::MyEvm, handler::MyHandler};
2use revm::{
3 context::{
4 result::{HaltReason, InvalidTransaction, ResultAndState},
5 ContextSetters,
6 },
7 context_interface::{
8 result::{EVMError, ExecutionResult},
9 ContextTr, Database, JournalTr,
10 },
11 handler::{EvmTr, Handler},
12 inspector::{InspectCommitEvm, InspectEvm, Inspector, InspectorHandler, JournalExt},
13 interpreter::interpreter::EthInterpreter,
14 state::EvmState,
15 DatabaseCommit, ExecuteCommitEvm, ExecuteEvm,
16};
17
18type MyError<CTX> = EVMError<<<CTX as ContextTr>::Db as Database>::Error, InvalidTransaction>;
20
21impl<CTX, INSP> ExecuteEvm for MyEvm<CTX, INSP>
23where
24 CTX: ContextSetters<Journal: JournalTr<State = EvmState>>,
25{
26 type State = EvmState;
27 type ExecutionResult = ExecutionResult<HaltReason>;
28 type Error = MyError<CTX>;
29
30 type Tx = <CTX as ContextTr>::Tx;
31
32 type Block = <CTX as ContextTr>::Block;
33
34 fn set_block(&mut self, block: Self::Block) {
35 self.0.ctx.set_block(block);
36 }
37
38 fn transact(&mut self, tx: Self::Tx) -> Result<Self::ExecutionResult, Self::Error> {
39 self.0.ctx.set_tx(tx);
40 let mut handler = MyHandler::default();
41 handler.run(self)
42 }
43
44 fn finalize(&mut self) -> Self::State {
45 self.ctx().journal_mut().finalize()
46 }
47
48 fn replay(
49 &mut self,
50 ) -> Result<ResultAndState<Self::ExecutionResult, Self::State>, Self::Error> {
51 let mut handler = MyHandler::default();
52 handler.run(self).map(|result| {
53 let state = self.finalize();
54 ResultAndState::new(result, state)
55 })
56 }
57}
58
59impl<CTX, INSP> ExecuteCommitEvm for MyEvm<CTX, INSP>
61where
62 CTX: ContextSetters<Db: DatabaseCommit, Journal: JournalTr<State = EvmState>>,
63{
64 fn commit(&mut self, state: Self::State) {
65 self.ctx().db_mut().commit(state);
66 }
67}
68
69impl<CTX, INSP> InspectEvm for MyEvm<CTX, INSP>
71where
72 CTX: ContextSetters<Journal: JournalTr<State = EvmState> + JournalExt>,
73 INSP: Inspector<CTX, EthInterpreter>,
74{
75 type Inspector = INSP;
76
77 fn set_inspector(&mut self, inspector: Self::Inspector) {
78 self.0.inspector = inspector;
79 }
80
81 fn inspect_tx(&mut self, tx: Self::Tx) -> Result<Self::ExecutionResult, Self::Error> {
82 self.0.ctx.set_tx(tx);
83 let mut handler = MyHandler::default();
84 handler.inspect_run(self)
85 }
86}
87
88impl<CTX, INSP> InspectCommitEvm for MyEvm<CTX, INSP>
90where
91 CTX: ContextSetters<Db: DatabaseCommit, Journal: JournalTr<State = EvmState> + JournalExt>,
92 INSP: Inspector<CTX, EthInterpreter>,
93{
94}