example_erc20_gas/
exec.rs1use 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}