opcodes = {
    0x00: ['STOP', 0, 0],
    0x01: ['ADD', 2, 1],
    0x02: ['MUL', 2, 1],
    0x03: ['SUB', 2, 1],
    0x04: ['DIV', 2, 1],
    0x05: ['SDIV', 2, 1],
    0x06: ['MOD', 2, 1],
    0x07: ['SMOD', 2, 1],
    0x08: ['EXP', 2, 1],
    0x09: ['NEG', 2, 1],
    0x0a: ['LT', 2, 1],
    0x0b: ['GT', 2, 1],
    0x0c: ['SLT', 2, 1],
    0x0d: ['SGT', 2, 1],
    0x0e: ['EQ', 2, 1],
    0x0f: ['NOT', 1, 1],
    0x10: ['AND', 2, 1],
    0x11: ['OR', 2, 1],
    0x12: ['XOR', 2, 1],
    0x13: ['BYTE', 2, 1],
    0x20: ['SHA3', 2, 1],
    0x21: ['ECRECOVER', 4, 2],
    0x22: ['ECVERIFY', 6, 1],
    0x23: ['PUB2ADDR', 2, 1],
    0x30: ['ADDRESS', 0, 1],
    0x31: ['BALANCE', 0, 1],
    0x32: ['ORIGIN', 0, 1],
    0x33: ['CALLER', 0, 1],
    0x34: ['CALLVALUE', 0, 1],
    0x35: ['CALLDATALOAD', 1, 1],
    0x36: ['CALLDATASIZE', 0, 1],
    0x37: ['CALLDATACOPY', 3, 0],
    0x38: ['CODESIZE', 0, 1],
    0x39: ['CODECOPY', 3, 0],
    0x3a: ['GASPRICE', 0, 1],
    0x40: ['PREVHASH', 0, 1],
    0x41: ['COINBASE', 0, 1],
    0x42: ['TIMESTAMP', 0, 1],
    0x43: ['NUMBER', 0, 1],
    0x44: ['DIFFICULTY', 0, 1],
    0x45: ['GASLIMIT', 0, 1],
    0x50: ['POP', 1, 0],
    0x51: ['DUP', 1, 2],
    0x52: ['SWAP', 2, 2],
    0x53: ['MLOAD', 1, 1],
    0x54: ['MSTORE', 2, 0],
    0x55: ['MSTORE8', 2, 0],
    0x56: ['SLOAD', 1, 1],
    0x57: ['SSTORE', 2, 0],
    0x58: ['JUMP', 1, 0],
    0x59: ['JUMPI', 2, 0],
    0x5a: ['PC', 0, 1],
    0x5b: ['MSIZE', 0, 1],
    0x5c: ['GAS', 0, 1],
    0x60: ['PUSH', 0, 1],  # encompasses 96...127
    0xf0: ['CREATE', 4, 1],
    0xf1: ['CALL', 7, 1],
    0xf2: ['RETURN', 2, 1],
    0xff: ['SUICIDE', 1, 1],
}
reverse_opcodes = {}
for o in opcodes:
    reverse_opcodes[opcodes[o][0]] = o
