example_custom_opcodes/
main.rs1#![cfg_attr(not(test), warn(unused_crate_dependencies))]
3
4use revm::{
5 bytecode::opcode,
6 context::{Evm, TxEnv},
7 database::{BenchmarkDB, BENCH_TARGET},
8 handler::{instructions::EthInstructions, EthPrecompiles},
9 inspector::inspectors::TracerEip3155,
10 interpreter::{
11 interpreter::EthInterpreter,
12 interpreter_types::{Immediates, Jumps},
13 Interpreter,
14 },
15 primitives::TxKind,
16 state::Bytecode,
17 Context, InspectEvm, MainContext,
18};
19
20const MY_STATIC_JUMP: u8 = 0x0C;
22
23pub fn main() {
24 let ctx = Context::mainnet().with_db(BenchmarkDB::new_bytecode(Bytecode::new_raw(
25 [
26 MY_STATIC_JUMP,
27 0x00,
28 0x03,
29 opcode::STOP,
30 opcode::JUMPDEST,
31 opcode::STOP,
32 ]
33 .into(),
34 )));
35
36 let mut instructions = EthInstructions::new_mainnet();
38 instructions.insert_instruction(
40 MY_STATIC_JUMP,
41 |interpreter: &mut Interpreter<EthInterpreter>, _| {
42 let offset = interpreter.bytecode.read_i16();
43 interpreter.bytecode.relative_jump(offset as isize);
44 },
45 );
46
47 let mut evm = Evm::new(ctx, instructions, EthPrecompiles::default())
49 .with_inspector(TracerEip3155::new_stdout().without_summary());
50
51 let _ = evm.inspect_with_tx(TxEnv {
53 kind: TxKind::Call(BENCH_TARGET),
54 ..Default::default()
55 });
56
57 }