example_erc20_gas/
exec.rs

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