module EVM.Op ( Op (..) , opString ) where import EVM.Types (SymWord) import Data.Word (Word8) import Numeric (showHex) data Op = OpStop | OpAdd | OpMul | OpSub | OpDiv | OpSdiv | OpMod | OpSmod | OpAddmod | OpMulmod | OpExp | OpSignextend | OpLt | OpGt | OpSlt | OpSgt | OpEq | OpIszero | OpAnd | OpOr | OpXor | OpNot | OpByte | OpShl | OpShr | OpSar | OpSha3 | OpAddress | OpBalance | OpOrigin | OpCaller | OpCallvalue | OpCalldataload | OpCalldatasize | OpCalldatacopy | OpCodesize | OpCodecopy | OpGasprice | OpExtcodesize | OpExtcodecopy | OpReturndatasize | OpReturndatacopy | OpExtcodehash | OpBlockhash | OpCoinbase | OpTimestamp | OpNumber | OpDifficulty | OpGaslimit | OpChainid | OpSelfbalance | OpPop | OpMload | OpMstore | OpMstore8 | OpSload | OpSstore | OpJump | OpJumpi | OpPc | OpMsize | OpGas | OpJumpdest | OpCreate | OpCall | OpStaticcall | OpCallcode | OpReturn | OpDelegatecall | OpCreate2 | OpRevert | OpSelfdestruct | OpDup !Word8 | OpSwap !Word8 | OpLog !Word8 | OpPush !SymWord | OpUnknown Word8 deriving (Int -> Op -> ShowS [Op] -> ShowS Op -> String (Int -> Op -> ShowS) -> (Op -> String) -> ([Op] -> ShowS) -> Show Op forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a showList :: [Op] -> ShowS $cshowList :: [Op] -> ShowS show :: Op -> String $cshow :: Op -> String showsPrec :: Int -> Op -> ShowS $cshowsPrec :: Int -> Op -> ShowS Show, Op -> Op -> Bool (Op -> Op -> Bool) -> (Op -> Op -> Bool) -> Eq Op forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a /= :: Op -> Op -> Bool $c/= :: Op -> Op -> Bool == :: Op -> Op -> Bool $c== :: Op -> Op -> Bool Eq) opString :: (Integral a, Show a) => (a, Op) -> String opString :: (a, Op) -> String opString (i :: a i, o :: Op o) = let showPc :: a -> String showPc x :: a x | a x a -> a -> Bool forall a. Ord a => a -> a -> Bool < 0x10 = '0' Char -> ShowS forall a. a -> [a] -> [a] : a -> ShowS forall a. (Integral a, Show a) => a -> ShowS showHex a x "" | Bool otherwise = a -> ShowS forall a. (Integral a, Show a) => a -> ShowS showHex a x "" in a -> String forall a. (Integral a, Show a) => a -> String showPc a i String -> ShowS forall a. Semigroup a => a -> a -> a <> " " String -> ShowS forall a. [a] -> [a] -> [a] ++ case Op o of OpStop -> "STOP" OpAdd -> "ADD" OpMul -> "MUL" OpSub -> "SUB" OpDiv -> "DIV" OpSdiv -> "SDIV" OpMod -> "MOD" OpSmod -> "SMOD" OpAddmod -> "ADDMOD" OpMulmod -> "MULMOD" OpExp -> "EXP" OpSignextend -> "SIGNEXTEND" OpLt -> "LT" OpGt -> "GT" OpSlt -> "SLT" OpSgt -> "SGT" OpEq -> "EQ" OpIszero -> "ISZERO" OpAnd -> "AND" OpOr -> "OR" OpXor -> "XOR" OpNot -> "NOT" OpByte -> "BYTE" OpShl -> "SHL" OpShr -> "SHR" OpSar -> "SAR" OpSha3 -> "SHA3" OpAddress -> "ADDRESS" OpBalance -> "BALANCE" OpOrigin -> "ORIGIN" OpCaller -> "CALLER" OpCallvalue -> "CALLVALUE" OpCalldataload -> "CALLDATALOAD" OpCalldatasize -> "CALLDATASIZE" OpCalldatacopy -> "CALLDATACOPY" OpCodesize -> "CODESIZE" OpCodecopy -> "CODECOPY" OpGasprice -> "GASPRICE" OpExtcodesize -> "EXTCODESIZE" OpExtcodecopy -> "EXTCODECOPY" OpReturndatasize -> "RETURNDATASIZE" OpReturndatacopy -> "RETURNDATACOPY" OpExtcodehash -> "EXTCODEHASH" OpBlockhash -> "BLOCKHASH" OpCoinbase -> "COINBASE" OpTimestamp -> "TIMESTAMP" OpNumber -> "NUMBER" OpDifficulty -> "DIFFICULTY" OpGaslimit -> "GASLIMIT" OpChainid -> "CHAINID" OpSelfbalance -> "SELFBALANCE" OpPop -> "POP" OpMload -> "MLOAD" OpMstore -> "MSTORE" OpMstore8 -> "MSTORE8" OpSload -> "SLOAD" OpSstore -> "SSTORE" OpJump -> "JUMP" OpJumpi -> "JUMPI" OpPc -> "PC" OpMsize -> "MSIZE" OpGas -> "GAS" OpJumpdest -> "JUMPDEST" OpCreate -> "CREATE" OpCall -> "CALL" OpStaticcall -> "STATICCALL" OpCallcode -> "CALLCODE" OpReturn -> "RETURN" OpDelegatecall -> "DELEGATECALL" OpCreate2 -> "CREATE2" OpSelfdestruct -> "SELFDESTRUCT" OpDup x :: Word8 x -> "DUP" String -> ShowS forall a. [a] -> [a] -> [a] ++ Word8 -> String forall a. Show a => a -> String show Word8 x OpSwap x :: Word8 x -> "SWAP" String -> ShowS forall a. [a] -> [a] -> [a] ++ Word8 -> String forall a. Show a => a -> String show Word8 x OpLog x :: Word8 x -> "LOG" String -> ShowS forall a. [a] -> [a] -> [a] ++ Word8 -> String forall a. Show a => a -> String show Word8 x OpPush x :: SymWord x -> "PUSH " String -> ShowS forall a. [a] -> [a] -> [a] ++ SymWord -> String forall a. Show a => a -> String show SymWord x OpRevert -> "REVERT" OpUnknown x :: Word8 x -> "UNKNOWN " String -> ShowS forall a. [a] -> [a] -> [a] ++ Word8 -> String forall a. Show a => a -> String show Word8 x