// Generated using a script, which can be found in ./evm/scripts/stackDeltaGenerator.ts

export const stackDelta: {
  [key: number]: {
    inputs: number // Number of inputs to this operation
    outputs: number // Number of outputs after this operation
    name: string // Name of the opcode
    intermediates: number // Intermediate bytes (such as 2 intermediates after a PUSH2)
    terminating?: boolean // Marks the opcode as terminating. This opcode will exit the current CALL frame. (Such as STOP/RETURN)
  }
} = {
  0x00: { inputs: 0, outputs: 0, name: 'STOP', intermediates: 0, terminating: true },
  0x01: { inputs: 2, outputs: 1, name: 'ADD', intermediates: 0 },
  0x02: { inputs: 2, outputs: 1, name: 'MUL', intermediates: 0 },
  0x03: { inputs: 2, outputs: 1, name: 'SUB', intermediates: 0 },
  0x04: { inputs: 2, outputs: 1, name: 'DIV', intermediates: 0 },
  0x05: { inputs: 2, outputs: 1, name: 'SDIV', intermediates: 0 },
  0x06: { inputs: 2, outputs: 1, name: 'MOD', intermediates: 0 },
  0x07: { inputs: 2, outputs: 1, name: 'SMOD', intermediates: 0 },
  0x08: { inputs: 3, outputs: 1, name: 'ADDMOD', intermediates: 0 },
  0x09: { inputs: 3, outputs: 1, name: 'MULMOD', intermediates: 0 },
  0x0a: { inputs: 2, outputs: 1, name: 'EXP', intermediates: 0 },
  0x0b: { inputs: 2, outputs: 1, name: 'SIGNEXTEND', intermediates: 0 },
  0x10: { inputs: 2, outputs: 1, name: 'LT', intermediates: 0 },
  0x11: { inputs: 2, outputs: 1, name: 'GT', intermediates: 0 },
  0x12: { inputs: 2, outputs: 1, name: 'SLT', intermediates: 0 },
  0x13: { inputs: 2, outputs: 1, name: 'SGT', intermediates: 0 },
  0x14: { inputs: 2, outputs: 1, name: 'EQ', intermediates: 0 },
  0x15: { inputs: 1, outputs: 1, name: 'ISZERO', intermediates: 0 },
  0x16: { inputs: 2, outputs: 1, name: 'AND', intermediates: 0 },
  0x17: { inputs: 2, outputs: 1, name: 'OR', intermediates: 0 },
  0x18: { inputs: 2, outputs: 1, name: 'XOR', intermediates: 0 },
  0x19: { inputs: 1, outputs: 1, name: 'NOT', intermediates: 0 },
  0x1a: { inputs: 2, outputs: 1, name: 'BYTE', intermediates: 0 },
  0x1b: { inputs: 2, outputs: 1, name: 'SHL', intermediates: 0 },
  0x1c: { inputs: 2, outputs: 1, name: 'SHR', intermediates: 0 },
  0x1d: { inputs: 2, outputs: 1, name: 'SAR', intermediates: 0 },
  0x20: { inputs: 2, outputs: 1, name: 'SHA3', intermediates: 0 },
  0x30: { inputs: 0, outputs: 1, name: 'ADDRESS', intermediates: 0 },
  0x31: { inputs: 1, outputs: 1, name: 'BALANCE', intermediates: 0 },
  0x32: { inputs: 0, outputs: 1, name: 'ORIGIN', intermediates: 0 },
  0x33: { inputs: 0, outputs: 1, name: 'CALLER', intermediates: 0 },
  0x34: { inputs: 0, outputs: 1, name: 'CALLVALUE', intermediates: 0 },
  0x35: { inputs: 1, outputs: 1, name: 'CALLDATALOAD', intermediates: 0 },
  0x36: { inputs: 0, outputs: 1, name: 'CALLDATASIZE', intermediates: 0 },
  0x37: { inputs: 3, outputs: 0, name: 'CALLDATACOPY', intermediates: 0 },
  0x3a: { inputs: 0, outputs: 1, name: 'GASPRICE', intermediates: 0 },
  0x3d: { inputs: 0, outputs: 1, name: 'RETURNDATASIZE', intermediates: 0 },
  0x3e: { inputs: 3, outputs: 0, name: 'RETURNDATACOPY', intermediates: 0 },
  0x40: { inputs: 1, outputs: 1, name: 'BLOCKHASH', intermediates: 0 },
  0x41: { inputs: 0, outputs: 1, name: 'COINBASE', intermediates: 0 },
  0x42: { inputs: 0, outputs: 1, name: 'TIMESTAMP', intermediates: 0 },
  0x43: { inputs: 0, outputs: 1, name: 'NUMBER', intermediates: 0 },
  0x44: { inputs: 0, outputs: 1, name: 'PREVRANDAO', intermediates: 0 },
  0x45: { inputs: 0, outputs: 1, name: 'GASLIMIT', intermediates: 0 },
  0x46: { inputs: 0, outputs: 1, name: 'CHAINID', intermediates: 0 },
  0x47: { inputs: 0, outputs: 1, name: 'SELFBALANCE', intermediates: 0 },
  0x48: { inputs: 0, outputs: 1, name: 'BASEFEE', intermediates: 0 },
  0x49: { inputs: 1, outputs: 1, name: 'BLOBAHASH', intermediates: 0 },
  0x4a: { inputs: 0, outputs: 1, name: 'BLOBBASEFEE', intermediates: 0 },
  0x50: { inputs: 1, outputs: 0, name: 'POP', intermediates: 0 },
  0x51: { inputs: 1, outputs: 1, name: 'MLOAD', intermediates: 0 },
  0x52: { inputs: 2, outputs: 0, name: 'MSTORE', intermediates: 0 },
  0x53: { inputs: 2, outputs: 0, name: 'MSTORE8', intermediates: 0 },
  0x54: { inputs: 1, outputs: 1, name: 'SLOAD', intermediates: 0 },
  0x55: { inputs: 2, outputs: 0, name: 'SSTORE', intermediates: 0 },
  0x59: { inputs: 0, outputs: 1, name: 'MSIZE', intermediates: 0 },
  0x5b: { inputs: 0, outputs: 0, name: 'NOOP', intermediates: 0 },
  0x5c: { inputs: 1, outputs: 1, name: 'TLOAD', intermediates: 0 },
  0x5d: { inputs: 2, outputs: 0, name: 'TSTORE', intermediates: 0 },
  0x5e: { inputs: 3, outputs: 0, name: 'MCOPY', intermediates: 0 },
  0x5f: { inputs: 0, outputs: 1, name: 'PUSH0', intermediates: 0 },
  0x60: { inputs: 0, outputs: 1, name: 'PUSH1', intermediates: 1 },
  0x61: { inputs: 0, outputs: 1, name: 'PUSH2', intermediates: 2 },
  0x62: { inputs: 0, outputs: 1, name: 'PUSH3', intermediates: 3 },
  0x63: { inputs: 0, outputs: 1, name: 'PUSH4', intermediates: 4 },
  0x64: { inputs: 0, outputs: 1, name: 'PUSH5', intermediates: 5 },
  0x65: { inputs: 0, outputs: 1, name: 'PUSH6', intermediates: 6 },
  0x66: { inputs: 0, outputs: 1, name: 'PUSH7', intermediates: 7 },
  0x67: { inputs: 0, outputs: 1, name: 'PUSH8', intermediates: 8 },
  0x68: { inputs: 0, outputs: 1, name: 'PUSH9', intermediates: 9 },
  0x69: { inputs: 0, outputs: 1, name: 'PUSH10', intermediates: 10 },
  0x6a: { inputs: 0, outputs: 1, name: 'PUSH11', intermediates: 11 },
  0x6b: { inputs: 0, outputs: 1, name: 'PUSH12', intermediates: 12 },
  0x6c: { inputs: 0, outputs: 1, name: 'PUSH13', intermediates: 13 },
  0x6d: { inputs: 0, outputs: 1, name: 'PUSH14', intermediates: 14 },
  0x6e: { inputs: 0, outputs: 1, name: 'PUSH15', intermediates: 15 },
  0x6f: { inputs: 0, outputs: 1, name: 'PUSH16', intermediates: 16 },
  0x70: { inputs: 0, outputs: 1, name: 'PUSH17', intermediates: 17 },
  0x71: { inputs: 0, outputs: 1, name: 'PUSH18', intermediates: 18 },
  0x72: { inputs: 0, outputs: 1, name: 'PUSH19', intermediates: 19 },
  0x73: { inputs: 0, outputs: 1, name: 'PUSH20', intermediates: 20 },
  0x74: { inputs: 0, outputs: 1, name: 'PUSH21', intermediates: 21 },
  0x75: { inputs: 0, outputs: 1, name: 'PUSH22', intermediates: 22 },
  0x76: { inputs: 0, outputs: 1, name: 'PUSH23', intermediates: 23 },
  0x77: { inputs: 0, outputs: 1, name: 'PUSH24', intermediates: 24 },
  0x78: { inputs: 0, outputs: 1, name: 'PUSH25', intermediates: 25 },
  0x79: { inputs: 0, outputs: 1, name: 'PUSH26', intermediates: 26 },
  0x7a: { inputs: 0, outputs: 1, name: 'PUSH27', intermediates: 27 },
  0x7b: { inputs: 0, outputs: 1, name: 'PUSH28', intermediates: 28 },
  0x7c: { inputs: 0, outputs: 1, name: 'PUSH29', intermediates: 29 },
  0x7d: { inputs: 0, outputs: 1, name: 'PUSH30', intermediates: 30 },
  0x7e: { inputs: 0, outputs: 1, name: 'PUSH31', intermediates: 31 },
  0x7f: { inputs: 0, outputs: 1, name: 'PUSH32', intermediates: 32 },
  0x80: { inputs: 1, outputs: 2, name: 'DUP1', intermediates: 0 },
  0x81: { inputs: 2, outputs: 3, name: 'DUP2', intermediates: 0 },
  0x82: { inputs: 3, outputs: 4, name: 'DUP3', intermediates: 0 },
  0x83: { inputs: 4, outputs: 5, name: 'DUP4', intermediates: 0 },
  0x84: { inputs: 5, outputs: 6, name: 'DUP5', intermediates: 0 },
  0x85: { inputs: 6, outputs: 7, name: 'DUP6', intermediates: 0 },
  0x86: { inputs: 7, outputs: 8, name: 'DUP7', intermediates: 0 },
  0x87: { inputs: 8, outputs: 9, name: 'DUP8', intermediates: 0 },
  0x88: { inputs: 9, outputs: 10, name: 'DUP9', intermediates: 0 },
  0x89: { inputs: 10, outputs: 11, name: 'DUP10', intermediates: 0 },
  0x8a: { inputs: 11, outputs: 12, name: 'DUP11', intermediates: 0 },
  0x8b: { inputs: 12, outputs: 13, name: 'DUP12', intermediates: 0 },
  0x8c: { inputs: 13, outputs: 14, name: 'DUP13', intermediates: 0 },
  0x8d: { inputs: 14, outputs: 15, name: 'DUP14', intermediates: 0 },
  0x8e: { inputs: 15, outputs: 16, name: 'DUP15', intermediates: 0 },
  0x8f: { inputs: 16, outputs: 17, name: 'DUP16', intermediates: 0 },
  0x90: { inputs: 2, outputs: 2, name: 'SWAP1', intermediates: 0 },
  0x91: { inputs: 3, outputs: 3, name: 'SWAP2', intermediates: 0 },
  0x92: { inputs: 4, outputs: 4, name: 'SWAP3', intermediates: 0 },
  0x93: { inputs: 5, outputs: 5, name: 'SWAP4', intermediates: 0 },
  0x94: { inputs: 6, outputs: 6, name: 'SWAP5', intermediates: 0 },
  0x95: { inputs: 7, outputs: 7, name: 'SWAP6', intermediates: 0 },
  0x96: { inputs: 8, outputs: 8, name: 'SWAP7', intermediates: 0 },
  0x97: { inputs: 9, outputs: 9, name: 'SWAP8', intermediates: 0 },
  0x98: { inputs: 10, outputs: 10, name: 'SWAP9', intermediates: 0 },
  0x99: { inputs: 11, outputs: 11, name: 'SWAP10', intermediates: 0 },
  0x9a: { inputs: 12, outputs: 12, name: 'SWAP11', intermediates: 0 },
  0x9b: { inputs: 13, outputs: 13, name: 'SWAP12', intermediates: 0 },
  0x9c: { inputs: 14, outputs: 14, name: 'SWAP13', intermediates: 0 },
  0x9d: { inputs: 15, outputs: 15, name: 'SWAP14', intermediates: 0 },
  0x9e: { inputs: 16, outputs: 16, name: 'SWAP15', intermediates: 0 },
  0x9f: { inputs: 17, outputs: 17, name: 'SWAP16', intermediates: 0 },
  0xa0: { inputs: 2, outputs: 0, name: 'LOG0', intermediates: 0 },
  0xa1: { inputs: 3, outputs: 0, name: 'LOG1', intermediates: 0 },
  0xa2: { inputs: 4, outputs: 0, name: 'LOG2', intermediates: 0 },
  0xa3: { inputs: 5, outputs: 0, name: 'LOG3', intermediates: 0 },
  0xa4: { inputs: 6, outputs: 0, name: 'LOG4', intermediates: 0 },
  0xd0: { inputs: 1, outputs: 1, name: 'DATALOAD', intermediates: 0 },
  0xd1: { inputs: 0, outputs: 1, name: 'DATALOADN', intermediates: 2 },
  0xd2: { inputs: 0, outputs: 1, name: 'DATASIZE', intermediates: 0 },
  0xd3: { inputs: 3, outputs: 0, name: 'DATACOPY', intermediates: 0 },
  0xe0: { inputs: 0, outputs: 0, name: 'RJUMP', intermediates: 2 },
  0xe1: { inputs: 1, outputs: 0, name: 'RJUMPI', intermediates: 2 },
  // NOTE: for RJUMPV the intermediate byte is set to 0, this has to do with the validation algorithm specifics
  // This has to do with the dynamic intermediate size of RJUMPV, which depends upon the table size byte right after RJUMPV
  0xe2: { inputs: 1, outputs: 0, name: 'RJUMPV', intermediates: 0 },
  // CALLF special case for stack validation algorithm: the inputs and outputs MUST stay 0
  // (this is currently the case also in EVM)
  0xe3: { inputs: 0, outputs: 0, name: 'CALLF', intermediates: 2 },
  0xe4: { inputs: 0, outputs: 0, name: 'RETF', intermediates: 0, terminating: true },
  0xe5: { inputs: 0, outputs: 0, name: 'JUMPF', intermediates: 2, terminating: true },
  0xe6: { inputs: 0, outputs: 1, name: 'DUPN', intermediates: 1 },
  0xe7: { inputs: 0, outputs: 0, name: 'SWAPN', intermediates: 1 },
  0xe8: { inputs: 0, outputs: 0, name: 'EXCHANGE', intermediates: 1 },
  0xec: { inputs: 4, outputs: 1, name: 'EOFCREATE', intermediates: 1 },
  0xee: { inputs: 2, outputs: 0, name: 'RETURNCONTRACT', intermediates: 1, terminating: true },
  0xf3: { inputs: 2, outputs: 0, name: 'RETURN', intermediates: 0, terminating: true },
  0xf7: { inputs: 1, outputs: 1, name: 'RETURNDATALOAD', intermediates: 0 },
  0xf8: { inputs: 4, outputs: 1, name: 'EXTCALL', intermediates: 0 },
  0xf9: { inputs: 3, outputs: 1, name: 'EXTDELEGATECALL', intermediates: 0 },
  0xfb: { inputs: 3, outputs: 1, name: 'EXTSTATICCALL', intermediates: 0 },
  0xfd: { inputs: 2, outputs: 0, name: 'REVERT', intermediates: 0, terminating: true },
  0xfe: { inputs: 0, outputs: 0, name: 'INVALID', intermediates: 0, terminating: true },
}
