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
17type MyError<CTX> = EVMError<<<CTX as ContextTr>::Db as Database>::Error, InvalidTransaction>;
19
20impl<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
44impl<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
59impl<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
76impl<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}