example_my_evm/
api.rs

1use crate::{evm::MyEvm, handler::MyHandler};
2use revm::{
3    context::{
4        result::{HaltReason, InvalidTransaction},
5        ContextSetters, JournalOutput,
6    },
7    context_interface::{
8        result::{EVMError, ExecutionResult, ResultAndState},
9        ContextTr, Database, JournalTr,
10    },
11    handler::{EvmTr, Handler},
12    inspector::{InspectCommitEvm, InspectEvm, Inspector, InspectorHandler, JournalExt},
13    interpreter::interpreter::EthInterpreter,
14    DatabaseCommit, ExecuteCommitEvm, ExecuteEvm,
15};
16
17/// Type alias for the error type of the OpEvm.
18type MyError<CTX> = EVMError<<<CTX as ContextTr>::Db as Database>::Error, InvalidTransaction>;
19
20// Trait that allows to replay and transact the transaction.
21impl<CTX, INSP> ExecuteEvm for MyEvm<CTX, INSP>
22where
23    CTX: ContextSetters<Journal: JournalTr<FinalOutput = JournalOutput>>,
24{
25    type Output = Result<ResultAndState, MyError<CTX>>;
26
27    type Tx = <CTX as ContextTr>::Tx;
28
29    type Block = <CTX as ContextTr>::Block;
30
31    fn set_tx(&mut self, tx: Self::Tx) {
32        self.0.data.ctx.set_tx(tx);
33    }
34
35    fn set_block(&mut self, block: Self::Block) {
36        self.0.data.ctx.set_block(block);
37    }
38
39    fn replay(&mut self) -> Self::Output {
40        MyHandler::default().run(self)
41    }
42}
43
44// Trait allows replay_commit and transact_commit functionality.
45impl<CTX, INSP> ExecuteCommitEvm for MyEvm<CTX, INSP>
46where
47    CTX: ContextSetters<Db: DatabaseCommit, Journal: JournalTr<FinalOutput = JournalOutput>>,
48{
49    type CommitOutput = Result<ExecutionResult<HaltReason>, MyError<CTX>>;
50
51    fn replay_commit(&mut self) -> Self::CommitOutput {
52        self.replay().map(|r| {
53            self.ctx().db().commit(r.state);
54            r.result
55        })
56    }
57}
58
59// Inspection trait.
60impl<CTX, INSP> InspectEvm for MyEvm<CTX, INSP>
61where
62    CTX: ContextSetters<Journal: JournalTr<FinalOutput = JournalOutput> + JournalExt>,
63    INSP: Inspector<CTX, EthInterpreter>,
64{
65    type Inspector = INSP;
66
67    fn set_inspector(&mut self, inspector: Self::Inspector) {
68        self.0.data.inspector = inspector;
69    }
70
71    fn inspect_replay(&mut self) -> Self::Output {
72        MyHandler::default().inspect_run(self)
73    }
74}
75
76// Inspect
77impl<CTX, INSP> InspectCommitEvm for MyEvm<CTX, INSP>
78where
79    CTX: ContextSetters<
80        Db: DatabaseCommit,
81        Journal: JournalTr<FinalOutput = JournalOutput> + JournalExt,
82    >,
83    INSP: Inspector<CTX, EthInterpreter>,
84{
85    fn inspect_replay_commit(&mut self) -> Self::CommitOutput {
86        self.inspect_replay().map(|r| {
87            self.ctx().db().commit(r.state);
88            r.result
89        })
90    }
91}