example_erc20_gas/
exec.rs

1use crate::handler::Erc20MainnetHandler;
2use revm::{
3    context_interface::{
4        result::{EVMError, ExecutionResult, HaltReason, InvalidTransaction},
5        ContextTr, JournalTr,
6    },
7    database_interface::DatabaseCommit,
8    handler::{
9        instructions::InstructionProvider, ContextTrDbError, EthFrame, EvmTr, Handler,
10        PrecompileProvider,
11    },
12    interpreter::{interpreter::EthInterpreter, InterpreterResult},
13    state::EvmState,
14};
15
16type Erc20Error<CTX> = EVMError<ContextTrDbError<CTX>, InvalidTransaction>;
17
18pub fn transact_erc20evm<EVM>(
19    evm: &mut EVM,
20) -> Result<(ExecutionResult<HaltReason>, EvmState), Erc20Error<EVM::Context>>
21where
22    EVM: EvmTr<
23        Context: ContextTr<Journal: JournalTr<State = EvmState>>,
24        Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>,
25        Instructions: InstructionProvider<
26            Context = EVM::Context,
27            InterpreterTypes = EthInterpreter,
28        >,
29    >,
30{
31    let mut handler = Erc20MainnetHandler::<EVM, _, EthFrame<EVM, _, EthInterpreter>>::new();
32    handler.run(evm).map(|r| {
33        let state = evm.ctx().journal_mut().finalize();
34        (r, state)
35    })
36}
37
38pub fn transact_erc20evm_commit<EVM>(
39    evm: &mut EVM,
40) -> Result<ExecutionResult<HaltReason>, Erc20Error<EVM::Context>>
41where
42    EVM: EvmTr<
43        Context: ContextTr<Journal: JournalTr<State = EvmState>, Db: DatabaseCommit>,
44        Precompiles: PrecompileProvider<EVM::Context, Output = InterpreterResult>,
45        Instructions: InstructionProvider<
46            Context = EVM::Context,
47            InterpreterTypes = EthInterpreter,
48        >,
49    >,
50{
51    transact_erc20evm(evm).map(|(result, state)| {
52        evm.ctx().db_mut().commit(state);
53        result
54    })
55}