Skip to content

Commit

Permalink
Opcode::from_str
Browse files Browse the repository at this point in the history
  • Loading branch information
Philogy committed Oct 7, 2024
1 parent f4de48f commit b51f6a0
Showing 1 changed file with 138 additions and 0 deletions.
138 changes: 138 additions & 0 deletions src/opcodes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,144 @@ pub enum Opcode {
UNKNOWN(u8),
}

impl std::str::FromStr for Opcode {
type Err = ();

fn from_str(s: &str) -> Result<Self, Self::Err> {
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 {
Expand Down

0 comments on commit b51f6a0

Please sign in to comment.