use crate::gas;
use crate::primitives::SpecId;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct OpCode(u8);
pub const STOP: u8 = 0x00;
pub const ADD: u8 = 0x01;
pub const MUL: u8 = 0x02;
pub const SUB: u8 = 0x03;
pub const DIV: u8 = 0x04;
pub const SDIV: u8 = 0x05;
pub const MOD: u8 = 0x06;
pub const SMOD: u8 = 0x07;
pub const ADDMOD: u8 = 0x08;
pub const MULMOD: u8 = 0x09;
pub const EXP: u8 = 0x0a;
pub const SIGNEXTEND: u8 = 0x0b;
pub const LT: u8 = 0x10;
pub const GT: u8 = 0x11;
pub const SLT: u8 = 0x12;
pub const SGT: u8 = 0x13;
pub const EQ: u8 = 0x14;
pub const ISZERO: u8 = 0x15;
pub const AND: u8 = 0x16;
pub const OR: u8 = 0x17;
pub const XOR: u8 = 0x18;
pub const NOT: u8 = 0x19;
pub const BYTE: u8 = 0x1a;
pub const CALLDATALOAD: u8 = 0x35;
pub const CALLDATASIZE: u8 = 0x36;
pub const CALLDATACOPY: u8 = 0x37;
pub const CODESIZE: u8 = 0x38;
pub const CODECOPY: u8 = 0x39;
pub const SHL: u8 = 0x1b;
pub const SHR: u8 = 0x1c;
pub const SAR: u8 = 0x1d;
pub const SHA3: u8 = 0x20;
pub const POP: u8 = 0x50;
pub const MLOAD: u8 = 0x51;
pub const MSTORE: u8 = 0x52;
pub const MSTORE8: u8 = 0x53;
pub const JUMP: u8 = 0x56;
pub const JUMPI: u8 = 0x57;
pub const PC: u8 = 0x58;
pub const MSIZE: u8 = 0x59;
pub const JUMPDEST: u8 = 0x5b;
pub const PUSH0: u8 = 0x5f;
pub const PUSH1: u8 = 0x60;
pub const PUSH2: u8 = 0x61;
pub const PUSH3: u8 = 0x62;
pub const PUSH4: u8 = 0x63;
pub const PUSH5: u8 = 0x64;
pub const PUSH6: u8 = 0x65;
pub const PUSH7: u8 = 0x66;
pub const PUSH8: u8 = 0x67;
pub const PUSH9: u8 = 0x68;
pub const PUSH10: u8 = 0x69;
pub const PUSH11: u8 = 0x6a;
pub const PUSH12: u8 = 0x6b;
pub const PUSH13: u8 = 0x6c;
pub const PUSH14: u8 = 0x6d;
pub const PUSH15: u8 = 0x6e;
pub const PUSH16: u8 = 0x6f;
pub const PUSH17: u8 = 0x70;
pub const PUSH18: u8 = 0x71;
pub const PUSH19: u8 = 0x72;
pub const PUSH20: u8 = 0x73;
pub const PUSH21: u8 = 0x74;
pub const PUSH22: u8 = 0x75;
pub const PUSH23: u8 = 0x76;
pub const PUSH24: u8 = 0x77;
pub const PUSH25: u8 = 0x78;
pub const PUSH26: u8 = 0x79;
pub const PUSH27: u8 = 0x7a;
pub const PUSH28: u8 = 0x7b;
pub const PUSH29: u8 = 0x7c;
pub const PUSH30: u8 = 0x7d;
pub const PUSH31: u8 = 0x7e;
pub const PUSH32: u8 = 0x7f;
pub const DUP1: u8 = 0x80;
pub const DUP2: u8 = 0x81;
pub const DUP3: u8 = 0x82;
pub const DUP4: u8 = 0x83;
pub const DUP5: u8 = 0x84;
pub const DUP6: u8 = 0x85;
pub const DUP7: u8 = 0x86;
pub const DUP8: u8 = 0x87;
pub const DUP9: u8 = 0x88;
pub const DUP10: u8 = 0x89;
pub const DUP11: u8 = 0x8a;
pub const DUP12: u8 = 0x8b;
pub const DUP13: u8 = 0x8c;
pub const DUP14: u8 = 0x8d;
pub const DUP15: u8 = 0x8e;
pub const DUP16: u8 = 0x8f;
pub const SWAP1: u8 = 0x90;
pub const SWAP2: u8 = 0x91;
pub const SWAP3: u8 = 0x92;
pub const SWAP4: u8 = 0x93;
pub const SWAP5: u8 = 0x94;
pub const SWAP6: u8 = 0x95;
pub const SWAP7: u8 = 0x96;
pub const SWAP8: u8 = 0x97;
pub const SWAP9: u8 = 0x98;
pub const SWAP10: u8 = 0x99;
pub const SWAP11: u8 = 0x9a;
pub const SWAP12: u8 = 0x9b;
pub const SWAP13: u8 = 0x9c;
pub const SWAP14: u8 = 0x9d;
pub const SWAP15: u8 = 0x9e;
pub const SWAP16: u8 = 0x9f;
pub const RETURN: u8 = 0xf3;
pub const REVERT: u8 = 0xfd;
pub const INVALID: u8 = 0xfe;
pub const ADDRESS: u8 = 0x30;
pub const BALANCE: u8 = 0x31;
pub const BASEFEE: u8 = 0x48;
pub const ORIGIN: u8 = 0x32;
pub const CALLER: u8 = 0x33;
pub const CALLVALUE: u8 = 0x34;
pub const GASPRICE: u8 = 0x3a;
pub const EXTCODESIZE: u8 = 0x3b;
pub const EXTCODECOPY: u8 = 0x3c;
pub const EXTCODEHASH: u8 = 0x3f;
pub const RETURNDATASIZE: u8 = 0x3d;
pub const RETURNDATACOPY: u8 = 0x3e;
pub const BLOCKHASH: u8 = 0x40;
pub const COINBASE: u8 = 0x41;
pub const TIMESTAMP: u8 = 0x42;
pub const NUMBER: u8 = 0x43;
pub const DIFFICULTY: u8 = 0x44;
pub const GASLIMIT: u8 = 0x45;
pub const SELFBALANCE: u8 = 0x47;
pub const SLOAD: u8 = 0x54;
pub const SSTORE: u8 = 0x55;
pub const GAS: u8 = 0x5a;
pub const LOG0: u8 = 0xa0;
pub const LOG1: u8 = 0xa1;
pub const LOG2: u8 = 0xa2;
pub const LOG3: u8 = 0xa3;
pub const LOG4: u8 = 0xa4;
pub const CREATE: u8 = 0xf0;
pub const CREATE2: u8 = 0xf5;
pub const CALL: u8 = 0xf1;
pub const CALLCODE: u8 = 0xf2;
pub const DELEGATECALL: u8 = 0xf4;
pub const STATICCALL: u8 = 0xfa;
pub const SELFDESTRUCT: u8 = 0xff;
pub const CHAINID: u8 = 0x46;
impl OpCode {
pub fn try_from_u8(opcode: u8) -> Option<OpCode> {
OPCODE_JUMPMAP[opcode as usize].map(|_| OpCode(opcode))
}
pub const fn as_str(&self) -> &'static str {
if let Some(str) = OPCODE_JUMPMAP[self.0 as usize] {
str
} else {
"unknown"
}
}
#[inline(always)]
pub const fn u8(&self) -> u8 {
self.0
}
}
impl core::fmt::Display for OpCode {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
if let Some(val) = OPCODE_JUMPMAP[self.0 as usize] {
f.write_str(val)
} else {
write!(f, "UNKNOWN(0x{:02x})", self.0)
}
}
}
pub const OPCODE_JUMPMAP: [Option<&'static str>; 256] = [
Some("STOP"),
Some("ADD"),
Some("MUL"),
Some("SUB"),
Some("DIV"),
Some("SDIV"),
Some("MOD"),
Some("SMOD"),
Some("ADDMOD"),
Some("MULMOD"),
Some("EXP"),
Some("SIGNEXTEND"),
None,
None,
None,
None,
Some("LT"),
Some("GT"),
Some("SLT"),
Some("SGT"),
Some("EQ"),
Some("ISZERO"),
Some("AND"),
Some("OR"),
Some("XOR"),
Some("NOT"),
Some("BYTE"),
Some("SHL"),
Some("SHR"),
Some("SAR"),
None,
None,
Some("SHA3"),
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
Some("ADDRESS"),
Some("BALANCE"),
Some("ORIGIN"),
Some("CALLER"),
Some("CALLVALUE"),
Some("CALLDATALOAD"),
Some("CALLDATASIZE"),
Some("CALLDATACOPY"),
Some("CODESIZE"),
Some("CODECOPY"),
Some("GASPRICE"),
Some("EXTCODESIZE"),
Some("EXTCODECOPY"),
Some("RETURNDATASIZE"),
Some("RETURNDATACOPY"),
Some("EXTCODEHASH"),
Some("BLOCKHASH"),
Some("COINBASE"),
Some("TIMESTAMP"),
Some("NUMBER"),
Some("DIFFICULTY"),
Some("GASLIMIT"),
Some("CHAINID"),
Some("SELFBALANCE"),
Some("BASEFEE"),
None,
None,
None,
None,
None,
None,
None,
Some("POP"),
Some("MLOAD"),
Some("MSTORE"),
Some("MSTORE8"),
Some("SLOAD"),
Some("SSTORE"),
Some("JUMP"),
Some("JUMPI"),
Some("PC"),
Some("MSIZE"),
Some("GAS"),
Some("JUMPDEST"),
None,
None,
None,
Some("PUSH0"),
Some("PUSH1"),
Some("PUSH2"),
Some("PUSH3"),
Some("PUSH4"),
Some("PUSH5"),
Some("PUSH6"),
Some("PUSH7"),
Some("PUSH8"),
Some("PUSH9"),
Some("PUSH10"),
Some("PUSH11"),
Some("PUSH12"),
Some("PUSH13"),
Some("PUSH14"),
Some("PUSH15"),
Some("PUSH16"),
Some("PUSH17"),
Some("PUSH18"),
Some("PUSH19"),
Some("PUSH20"),
Some("PUSH21"),
Some("PUSH22"),
Some("PUSH23"),
Some("PUSH24"),
Some("PUSH25"),
Some("PUSH26"),
Some("PUSH27"),
Some("PUSH28"),
Some("PUSH29"),
Some("PUSH30"),
Some("PUSH31"),
Some("PUSH32"),
Some("DUP1"),
Some("DUP2"),
Some("DUP3"),
Some("DUP4"),
Some("DUP5"),
Some("DUP6"),
Some("DUP7"),
Some("DUP8"),
Some("DUP9"),
Some("DUP10"),
Some("DUP11"),
Some("DUP12"),
Some("DUP13"),
Some("DUP14"),
Some("DUP15"),
Some("DUP16"),
Some("SWAP1"),
Some("SWAP2"),
Some("SWAP3"),
Some("SWAP4"),
Some("SWAP5"),
Some("SWAP6"),
Some("SWAP7"),
Some("SWAP8"),
Some("SWAP9"),
Some("SWAP10"),
Some("SWAP11"),
Some("SWAP12"),
Some("SWAP13"),
Some("SWAP14"),
Some("SWAP15"),
Some("SWAP16"),
Some("LOG0"),
Some("LOG1"),
Some("LOG2"),
Some("LOG3"),
Some("LOG4"),
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
None,
Some("CREATE"),
Some("CALL"),
Some("CALLCODE"),
Some("RETURN"),
Some("DELEGATECALL"),
Some("CREATE2"),
None,
None,
None,
None,
Some("STATICCALL"),
None,
None,
Some("REVERT"),
Some("INVALID"),
Some("SELFDESTRUCT"),
];
#[derive(Debug)]
pub struct OpInfo {
data: u32,
}
const JUMP_MASK: u32 = 0x80000000;
const GAS_BLOCK_END_MASK: u32 = 0x40000000;
const IS_PUSH_MASK: u32 = 0x20000000;
const GAS_MASK: u32 = 0x1FFFFFFF;
impl OpInfo {
#[inline(always)]
pub fn is_jump(&self) -> bool {
self.data & JUMP_MASK == JUMP_MASK
}
#[inline(always)]
pub fn is_gas_block_end(&self) -> bool {
self.data & GAS_BLOCK_END_MASK == GAS_BLOCK_END_MASK
}
#[inline(always)]
pub fn is_push(&self) -> bool {
self.data & IS_PUSH_MASK == IS_PUSH_MASK
}
#[inline(always)]
pub fn get_gas(&self) -> u32 {
self.data & GAS_MASK
}
pub const fn none() -> Self {
Self { data: 0 }
}
pub const fn gas_block_end(gas: u64) -> Self {
Self {
data: gas as u32 | GAS_BLOCK_END_MASK,
}
}
pub const fn dynamic_gas() -> Self {
Self { data: 0 }
}
pub const fn gas(gas: u64) -> Self {
Self { data: gas as u32 }
}
pub const fn push_opcode() -> Self {
Self {
data: gas::VERYLOW as u32 | IS_PUSH_MASK,
}
}
pub const fn jumpdest() -> Self {
Self {
data: JUMP_MASK | GAS_BLOCK_END_MASK,
}
}
}
macro_rules! gas_opcodee {
($name:ident, $spec_id:expr) => {
const $name: &'static [OpInfo; 256] = &[
OpInfo::gas_block_end(0),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::LOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::LOW),
OpInfo::gas(gas::LOW),
OpInfo::gas(gas::LOW),
OpInfo::gas(gas::LOW),
OpInfo::gas(gas::MID),
OpInfo::gas(gas::MID),
OpInfo::dynamic_gas(),
OpInfo::gas(gas::LOW),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::CONSTANTINOPLE) {
gas::VERYLOW
} else {
0
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::CONSTANTINOPLE) {
gas::VERYLOW
} else {
0
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::CONSTANTINOPLE) {
gas::VERYLOW
} else {
0
}),
OpInfo::none(),
OpInfo::none(),
OpInfo::dynamic_gas(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas(gas::BASE),
OpInfo::dynamic_gas(),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::BASE),
OpInfo::dynamic_gas(),
OpInfo::gas(gas::BASE),
OpInfo::dynamic_gas(),
OpInfo::gas(gas::BASE),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::BERLIN) {
gas::WARM_STORAGE_READ_COST } else if SpecId::enabled($spec_id, SpecId::TANGERINE) {
700
} else {
20
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::BERLIN) {
gas::WARM_STORAGE_READ_COST } else if SpecId::enabled($spec_id, SpecId::TANGERINE) {
700
} else {
20
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::BYZANTIUM) {
gas::BASE
} else {
0
}),
OpInfo::dynamic_gas(),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::BERLIN) {
gas::WARM_STORAGE_READ_COST } else if SpecId::enabled($spec_id, SpecId::ISTANBUL) {
700
} else if SpecId::enabled($spec_id, SpecId::PETERSBURG) {
400
} else {
0 }),
OpInfo::gas(gas::BLOCKHASH),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::ISTANBUL) {
gas::BASE
} else {
0
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::ISTANBUL) {
gas::LOW
} else {
0
}),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::LONDON) {
gas::BASE
} else {
0
}),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::dynamic_gas(),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(gas::MID),
OpInfo::gas_block_end(gas::HIGH),
OpInfo::gas(gas::BASE),
OpInfo::gas(gas::BASE),
OpInfo::gas_block_end(gas::BASE),
OpInfo::jumpdest(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas(if SpecId::enabled($spec_id, SpecId::SHANGHAI) {
gas::BASE
} else {
0
}),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::push_opcode(),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::gas(gas::VERYLOW),
OpInfo::dynamic_gas(),
OpInfo::dynamic_gas(),
OpInfo::dynamic_gas(),
OpInfo::dynamic_gas(),
OpInfo::dynamic_gas(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas_block_end(0),
OpInfo::none(),
OpInfo::none(),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
OpInfo::gas_block_end(0),
];
};
}
pub const fn spec_opcode_gas(spec_id: SpecId) -> &'static [OpInfo; 256] {
match spec_id {
SpecId::FRONTIER => {
gas_opcodee!(FRONTIER, SpecId::FRONTIER);
FRONTIER
}
SpecId::FRONTIER_THAWING => {
gas_opcodee!(FRONTIER_THAWING, SpecId::FRONTIER_THAWING);
FRONTIER_THAWING
}
SpecId::HOMESTEAD => {
gas_opcodee!(HOMESTEAD, SpecId::HOMESTEAD);
HOMESTEAD
}
SpecId::DAO_FORK => {
gas_opcodee!(DAO_FORK, SpecId::DAO_FORK);
DAO_FORK
}
SpecId::TANGERINE => {
gas_opcodee!(TANGERINE, SpecId::TANGERINE);
TANGERINE
}
SpecId::SPURIOUS_DRAGON => {
gas_opcodee!(SPURIOUS_DRAGON, SpecId::SPURIOUS_DRAGON);
SPURIOUS_DRAGON
}
SpecId::BYZANTIUM => {
gas_opcodee!(BYZANTIUM, SpecId::BYZANTIUM);
BYZANTIUM
}
SpecId::CONSTANTINOPLE => {
gas_opcodee!(CONSTANTINOPLE, SpecId::CONSTANTINOPLE);
CONSTANTINOPLE
}
SpecId::PETERSBURG => {
gas_opcodee!(PETERSBURG, SpecId::PETERSBURG);
PETERSBURG
}
SpecId::ISTANBUL => {
gas_opcodee!(ISTANBUL, SpecId::ISTANBUL);
ISTANBUL
}
SpecId::MUIR_GLACIER => {
gas_opcodee!(MUIRGLACIER, SpecId::MUIR_GLACIER);
MUIRGLACIER
}
SpecId::BERLIN => {
gas_opcodee!(BERLIN, SpecId::BERLIN);
BERLIN
}
SpecId::LONDON => {
gas_opcodee!(LONDON, SpecId::LONDON);
LONDON
}
SpecId::ARROW_GLACIER => {
gas_opcodee!(ARROW_GLACIER, SpecId::ARROW_GLACIER);
ARROW_GLACIER
}
SpecId::GRAY_GLACIER => {
gas_opcodee!(GRAY_GLACIER, SpecId::GRAY_GLACIER);
GRAY_GLACIER
}
SpecId::MERGE => {
gas_opcodee!(MERGE, SpecId::MERGE);
MERGE
}
SpecId::SHANGHAI => {
gas_opcodee!(SHANGAI, SpecId::SHANGHAI);
SHANGAI
}
SpecId::CANCUN => {
gas_opcodee!(CANCUN, SpecId::CANCUN);
CANCUN
}
SpecId::LATEST => {
gas_opcodee!(LATEST, SpecId::LATEST);
LATEST
}
}
}