evm_feature_evm64/
lib.rs

1//! # The EVM64 feature
2//!
3//! See [EIP-7937](https://eips.ethereum.org/EIPS/eip-7937).
4
5pub mod eval;
6mod gasometer;
7
8use evm::{
9	interpreter::{
10		etable::{Etable, MultiEfn, MultiEtable, Single},
11		opcode::Opcode,
12	},
13	standard::GasometerState,
14};
15
16pub use crate::gasometer::eval as eval_gasometer;
17
18pub const OPCODE_EVM64_MODE: Opcode = Opcode(0xc0);
19
20/// Append a normal `(gasometer, runtime)` etable with EVM64 gasometer and
21/// opcodes.
22pub fn etable<'config, S, H, Tr>(
23	orig: (Single<S, H, Tr>, Etable<S, H, Tr>),
24) -> (Etable<S, H, Tr>, MultiEtable<S, H, Tr>)
25where
26	S: AsRef<GasometerState<'config>> + AsMut<GasometerState<'config>>,
27{
28	let mut gasometer_etable = Etable::from(orig.0);
29	let mut eval_etable = MultiEtable::from(orig.1);
30
31	let mut mode_etable = Etable::none();
32	mode_etable[Opcode::ADD.as_usize()] = eval::eval_add;
33	mode_etable[Opcode::MUL.as_usize()] = eval::eval_mul;
34	mode_etable[Opcode::SUB.as_usize()] = eval::eval_sub;
35	mode_etable[Opcode::DIV.as_usize()] = eval::eval_div;
36	mode_etable[Opcode::SDIV.as_usize()] = eval::eval_sdiv;
37	mode_etable[Opcode::MOD.as_usize()] = eval::eval_mod;
38	mode_etable[Opcode::SMOD.as_usize()] = eval::eval_smod;
39	mode_etable[Opcode::ADDMOD.as_usize()] = eval::eval_addmod;
40	mode_etable[Opcode::MULMOD.as_usize()] = eval::eval_mulmod;
41	mode_etable[Opcode::EXP.as_usize()] = eval::eval_exp;
42	mode_etable[Opcode::LT.as_usize()] = eval::eval_lt;
43	mode_etable[Opcode::GT.as_usize()] = eval::eval_gt;
44	mode_etable[Opcode::SLT.as_usize()] = eval::eval_slt;
45	mode_etable[Opcode::SGT.as_usize()] = eval::eval_sgt;
46	mode_etable[Opcode::EQ.as_usize()] = eval::eval_eq;
47	mode_etable[Opcode::ISZERO.as_usize()] = eval::eval_iszero;
48	mode_etable[Opcode::AND.as_usize()] = eval::eval_and;
49	mode_etable[Opcode::OR.as_usize()] = eval::eval_or;
50	mode_etable[Opcode::XOR.as_usize()] = eval::eval_xor;
51	mode_etable[Opcode::NOT.as_usize()] = eval::eval_not;
52	mode_etable[Opcode::SHL.as_usize()] = eval::eval_shl;
53	mode_etable[Opcode::SHR.as_usize()] = eval::eval_shr;
54	mode_etable[Opcode::SAR.as_usize()] = eval::eval_sar;
55	mode_etable[Opcode::JUMP.as_usize()] = eval::eval_jump;
56	mode_etable[Opcode::JUMPI.as_usize()] = eval::eval_jumpi;
57
58	gasometer_etable[OPCODE_EVM64_MODE.as_usize()] = eval_gasometer;
59	eval_etable[OPCODE_EVM64_MODE.as_usize()] = MultiEfn::Node(Box::new(mode_etable.into()));
60
61	(gasometer_etable, eval_etable)
62}