UNPKG

@vbyte/btc-dev

Version:

Batteries-included toolset for plebian bitcoin development

165 lines (164 loc) 3.72 kB
export const OPCODE_MAP = { OP_0: 0, OP_PUSHDATA1: 76, OP_PUSHDATA2: 77, OP_PUSHDATA4: 78, OP_1NEGATE: 79, OP_SUCCESS80: 80, OP_1: 81, OP_2: 82, OP_3: 83, OP_4: 84, OP_5: 85, OP_6: 86, OP_7: 87, OP_8: 88, OP_9: 89, OP_10: 90, OP_11: 91, OP_12: 92, OP_13: 93, OP_14: 94, OP_15: 95, OP_16: 96, OP_NOP: 97, OP_SUCCESS98: 98, OP_IF: 99, OP_NOTIF: 100, OP_ELSE: 103, OP_ENDIF: 104, OP_VERIFY: 105, OP_RETURN: 106, OP_TOALTSTACK: 107, OP_FROMALTSTACK: 108, OP_2DROP: 109, OP_2DUP: 110, OP_3DUP: 111, OP_2OVER: 112, OP_2ROT: 113, OP_2SWAP: 114, OP_IFDUP: 115, OP_DEPTH: 116, OP_DROP: 117, OP_DUP: 118, OP_NIP: 119, OP_OVER: 120, OP_PICK: 121, OP_ROLL: 122, OP_ROT: 123, OP_SWAP: 124, OP_TUCK: 125, OP_SUCCESS126: 126, OP_SUCCESS127: 127, OP_SUCCESS128: 128, OP_SUCCESS129: 129, OP_SIZE: 130, OP_SUCCESS131: 131, OP_SUCCESS132: 132, OP_SUCCESS133: 133, OP_SUCCESS134: 134, OP_EQUAL: 135, OP_EQUALVERIFY: 136, OP_SUCCESS137: 137, OP_SUCCESS138: 138, OP_1ADD: 139, OP_1SUB: 140, OP_SUCCESS141: 141, OP_SUCCESS142: 142, OP_NEGATE: 143, OP_ABS: 144, OP_NOT: 145, OP_0NOTEQUAL: 146, OP_ADD: 147, OP_SUB: 148, OP_SUCCESS149: 149, OP_SUCCESS150: 150, OP_SUCCESS151: 151, OP_SUCCESS152: 152, OP_SUCCESS153: 153, OP_BOOLAND: 154, OP_BOOLOR: 155, OP_NUMEQUAL: 156, OP_NUMEQUALVERIFY: 157, OP_NUMNOTEQUAL: 158, OP_LESSTHAN: 159, OP_GREATERTHAN: 160, OP_LESSTHANOREQUAL: 161, OP_GREATERTHANOREQUAL: 162, OP_MIN: 163, OP_MAX: 164, OP_WITHIN: 165, OP_RIPEMD160: 166, OP_SHA1: 167, OP_SHA256: 168, OP_HASH160: 169, OP_HASH256: 170, OP_CODESEPARATOR: 171, OP_CHECKSIG: 172, OP_CHECKSIGVERIFY: 173, OP_CHECKMULTISIG: 174, OP_CHECKMULTISIGVERIFY: 175, OP_NOP1: 176, OP_CHECKLOCKTIMEVERIFY: 177, OP_CHECKSEQUENCEVERIFY: 178, OP_NOP4: 179, OP_NOP5: 180, OP_NOP6: 181, OP_NOP7: 182, OP_NOP8: 183, OP_NOP9: 184, OP_NOP10: 185, OP_CHECKSIGADD: 186 }; export function get_op_code(num) { if (num > 186 && num < 255) { return 'OP_SUCCESS' + String(num); } for (const [k, v] of Object.entries(OPCODE_MAP)) { if (v === num) return k; } throw new Error('OPCODE not found:' + String(num)); } export function get_asm_code(string) { for (const [k, v] of Object.entries(OPCODE_MAP)) { if (k === string) return Number(v); } throw new Error('OPCODE not found:' + string); } export function get_op_type(word) { switch (true) { case (word === 0): return 'opcode'; case (word >= 1 && word <= 75): return 'varint'; case (word === 76): return 'pushdata1'; case (word === 77): return 'pushdata2'; case (word === 78): return 'pushdata4'; case (word <= 254): return 'opcode'; default: throw new Error(`Invalid word range: ${word}`); } } export function is_valid_op(word) { const MIN_RANGE = 75; const MAX_RANGE = 254; const DISABLED_OPCODES = []; switch (true) { case (typeof (word) !== 'number'): return false; case (word === 0): return true; case (DISABLED_OPCODES.includes(word)): return false; case (MIN_RANGE < word && word < MAX_RANGE): return true; default: return false; } }