example_my_evm/
api.rs

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
18/// Type alias for the error type of the OpEvm.
19type MyError<CTX> = EVMError<<<CTX as ContextTr>::Db as Database>::Error, InvalidTransaction>;
20
21// Trait that allows to replay and transact the transaction.
22impl<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
59// Trait allows replay_commit and transact_commit functionality.
60impl<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
69// Inspection trait.
70impl<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
88// Inspect
89impl<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}