From b51f6a0e41f9eaef7e4e070c19c113fd4117e71e Mon Sep 17 00:00:00 2001 From: philogy Date: Mon, 7 Oct 2024 01:09:37 -0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20`Opcode::from=5Fstr`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/opcodes.rs | 138 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) diff --git a/src/opcodes.rs b/src/opcodes.rs index 61f4587..0a04857 100644 --- a/src/opcodes.rs +++ b/src/opcodes.rs @@ -192,6 +192,144 @@ pub enum Opcode { UNKNOWN(u8), } +impl std::str::FromStr for Opcode { + type Err = (); + + fn from_str(s: &str) -> Result { + match s { + "stop" => Ok(Self::STOP), + // Basic Arithmetic 0x01 - 0x0b + "add" => Ok(Self::ADD), + "mul" => Ok(Self::MUL), + "sub" => Ok(Self::SUB), + "div" => Ok(Self::DIV), + "sdiv" => Ok(Self::SDIV), + "mod" => Ok(Self::MOD), + "smod" => Ok(Self::SMOD), + "addmod" => Ok(Self::ADDMOD), + "mulmod" => Ok(Self::MULMOD), + "exp" => Ok(Self::EXP), + "signextend" => Ok(Self::SIGNEXTEND), + // Logic & Bitwise Operations 0x10 - 0x1d + "lt" => Ok(Self::LT), + "gt" => Ok(Self::GT), + "slt" => Ok(Self::SLT), + "sgt" => Ok(Self::SGT), + "eq" => Ok(Self::EQ), + "iszero" => Ok(Self::ISZERO), + "and" => Ok(Self::AND), + "or" => Ok(Self::OR), + "xor" => Ok(Self::XOR), + "not" => Ok(Self::NOT), + "byte" => Ok(Self::BYTE), + "shl" => Ok(Self::SHL), + "shr" => Ok(Self::SHR), + "sar" => Ok(Self::SAR), + // Keccak 0x20 + "sha3" => Ok(Self::SHA3), + // Call context introspection 0x30 - 0x3f + "address" => Ok(Self::ADDRESS), + "balance" => Ok(Self::BALANCE), + "origin" => Ok(Self::ORIGIN), + "caller" => Ok(Self::CALLER), + "callvalue" => Ok(Self::CALLVALUE), + "calldataload" => Ok(Self::CALLDATALOAD), + "calldatasize" => Ok(Self::CALLDATASIZE), + "calldatacopy" => Ok(Self::CALLDATACOPY), + "codesize" => Ok(Self::CODESIZE), + "codecopy" => Ok(Self::CODECOPY), + "gasprice" => Ok(Self::GASPRICE), + "extcodesize" => Ok(Self::EXTCODESIZE), + "extcodecopy" => Ok(Self::EXTCODECOPY), + "returndatasize" => Ok(Opcode::RETURNDATASIZE), + "returndatacopy" => Ok(Opcode::RETURNDATACOPY), + "extcodehash" => Ok(Self::EXTCODEHASH), + // Block context introspection 0x40 - 0x4a + "blockhash" => Ok(Self::BLOCKHASH), + "coinbase" => Ok(Self::COINBASE), + "timestamp" => Ok(Self::TIMESTAMP), + "number" => Ok(Self::NUMBER), + "prevrandao" => Ok(Self::PREVRANDAO), + "gaslimit" => Ok(Self::GASLIMIT), + "chainid" => Ok(Self::CHAINID), + "selfbalance" => Ok(Self::SELFBALANCE), + "basefee" => Ok(Self::BASEFEE), + "blobhash" => Ok(Self::BLOBHASH), + "blobbasefee" => Ok(Self::BLOBBASEFEE), + // Control flow, Storage & Memory manipulation, runtime inspection 0x50 - 0x5e + "pop" => Ok(Self::POP), + "mload" => Ok(Self::MLOAD), + "mstore" => Ok(Self::MSTORE), + "mstore8" => Ok(Self::MSTORE8), + "sload" => Ok(Self::SLOAD), + "sstore" => Ok(Self::SSTORE), + "jump" => Ok(Self::JUMP), + "jumpi" => Ok(Self::JUMPI), + "pc" => Ok(Self::PC), + "msize" => Ok(Self::MSIZE), + "gas" => Ok(Self::GAS), + "jumpdest" => Ok(Self::JUMPDEST), + "tload" => Ok(Self::TLOAD), + "tstore" => Ok(Self::TSTORE), + "mcopy" => Ok(Self::MCOPY), + // Static pushes 0x5f - 0x6f + "push0" => Ok(Self::PUSH0), + // Dups 0x80 - 0x8f + "dup1" => Ok(Self::DUP1), + "dup2" => Ok(Self::DUP2), + "dup3" => Ok(Self::DUP3), + "dup4" => Ok(Self::DUP4), + "dup5" => Ok(Self::DUP5), + "dup6" => Ok(Self::DUP6), + "dup7" => Ok(Self::DUP7), + "dup8" => Ok(Self::DUP8), + "dup9" => Ok(Self::DUP9), + "dup10" => Ok(Self::DUP10), + "dup11" => Ok(Self::DUP11), + "dup12" => Ok(Self::DUP12), + "dup13" => Ok(Self::DUP13), + "dup14" => Ok(Self::DUP14), + "dup15" => Ok(Self::DUP15), + "dup16" => Ok(Self::DUP16), + // Swaps 0x90 - 0x9f + "swap1" => Ok(Self::SWAP1), + "swap2" => Ok(Self::SWAP2), + "swap3" => Ok(Self::SWAP3), + "swap4" => Ok(Self::SWAP4), + "swap5" => Ok(Self::SWAP5), + "swap6" => Ok(Self::SWAP6), + "swap7" => Ok(Self::SWAP7), + "swap8" => Ok(Self::SWAP8), + "swap9" => Ok(Self::SWAP9), + "swap10" => Ok(Self::SWAP10), + "swap11" => Ok(Self::SWAP11), + "swap12" => Ok(Self::SWAP12), + "swap13" => Ok(Self::SWAP13), + "swap14" => Ok(Self::SWAP14), + "swap15" => Ok(Self::SWAP15), + "swap16" => Ok(Self::SWAP16), + // Logging 0xa0 - 0xa4 + "log0" => Ok(Self::LOG0), + "log1" => Ok(Self::LOG1), + "log2" => Ok(Self::LOG2), + "log3" => Ok(Self::LOG3), + "log4" => Ok(Self::LOG4), + // Calls 0xf0 - 0xff + "create" => Ok(Self::CREATE), + "call" => Ok(Self::CALL), + "callcode" => Ok(Self::CALLCODE), + "return" => Ok(Self::RETURN), + "delegatecall" => Ok(Self::DELEGATECALL), + "create2" => Ok(Self::CREATE2), + "staticcall" => Ok(Self::STATICCALL), + "revert" => Ok(Self::REVERT), + "invalid" => Ok(Self::INVALID), + "selfdestruct" => Ok(Self::SELFDESTRUCT), + _ => Err(()), + } + } +} + impl Opcode { pub fn byte(&self) -> u8 { match &self {