Check in missing script utility file
This commit is contained in:
		
							parent
							
								
									249c57f376
								
							
						
					
					
						commit
						882e8ec598
					
				
							
								
								
									
										203
									
								
								backend/src/utils/bitcoin-script.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								backend/src/utils/bitcoin-script.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| const opcodes = { | ||||
|   OP_FALSE: 0, | ||||
|   OP_0: 0, | ||||
|   OP_PUSHDATA1: 76, | ||||
|   OP_PUSHDATA2: 77, | ||||
|   OP_PUSHDATA4: 78, | ||||
|   OP_1NEGATE: 79, | ||||
|   OP_PUSHNUM_NEG1: 79, | ||||
|   OP_RESERVED: 80, | ||||
|   OP_TRUE: 81, | ||||
|   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_PUSHNUM_1: 81, | ||||
|   OP_PUSHNUM_2: 82, | ||||
|   OP_PUSHNUM_3: 83, | ||||
|   OP_PUSHNUM_4: 84, | ||||
|   OP_PUSHNUM_5: 85, | ||||
|   OP_PUSHNUM_6: 86, | ||||
|   OP_PUSHNUM_7: 87, | ||||
|   OP_PUSHNUM_8: 88, | ||||
|   OP_PUSHNUM_9: 89, | ||||
|   OP_PUSHNUM_10: 90, | ||||
|   OP_PUSHNUM_11: 91, | ||||
|   OP_PUSHNUM_12: 92, | ||||
|   OP_PUSHNUM_13: 93, | ||||
|   OP_PUSHNUM_14: 94, | ||||
|   OP_PUSHNUM_15: 95, | ||||
|   OP_PUSHNUM_16: 96, | ||||
|   OP_NOP: 97, | ||||
|   OP_VER: 98, | ||||
|   OP_IF: 99, | ||||
|   OP_NOTIF: 100, | ||||
|   OP_VERIF: 101, | ||||
|   OP_VERNOTIF: 102, | ||||
|   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_CAT: 126, | ||||
|   OP_SUBSTR: 127, | ||||
|   OP_LEFT: 128, | ||||
|   OP_RIGHT: 129, | ||||
|   OP_SIZE: 130, | ||||
|   OP_INVERT: 131, | ||||
|   OP_AND: 132, | ||||
|   OP_OR: 133, | ||||
|   OP_XOR: 134, | ||||
|   OP_EQUAL: 135, | ||||
|   OP_EQUALVERIFY: 136, | ||||
|   OP_RESERVED1: 137, | ||||
|   OP_RESERVED2: 138, | ||||
|   OP_1ADD: 139, | ||||
|   OP_1SUB: 140, | ||||
|   OP_2MUL: 141, | ||||
|   OP_2DIV: 142, | ||||
|   OP_NEGATE: 143, | ||||
|   OP_ABS: 144, | ||||
|   OP_NOT: 145, | ||||
|   OP_0NOTEQUAL: 146, | ||||
|   OP_ADD: 147, | ||||
|   OP_SUB: 148, | ||||
|   OP_MUL: 149, | ||||
|   OP_DIV: 150, | ||||
|   OP_MOD: 151, | ||||
|   OP_LSHIFT: 152, | ||||
|   OP_RSHIFT: 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_NOP2: 177, | ||||
|   OP_CHECKLOCKTIMEVERIFY: 177, | ||||
|   OP_CLTV: 177, | ||||
|   OP_NOP3: 178, | ||||
|   OP_CHECKSEQUENCEVERIFY: 178, | ||||
|   OP_CSV: 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, | ||||
|   OP_PUBKEYHASH: 253, | ||||
|   OP_PUBKEY: 254, | ||||
|   OP_INVALIDOPCODE: 255, | ||||
| }; | ||||
| // add unused opcodes
 | ||||
| for (let i = 187; i <= 255; i++) { | ||||
|   opcodes[`OP_RETURN_${i}`] = i; | ||||
| } | ||||
| 
 | ||||
| export { opcodes }; | ||||
| 
 | ||||
| /** extracts m and n from a multisig script (asm), returns nothing if it is not a multisig script */ | ||||
| export function parseMultisigScript(script: string): void | { m: number, n: number } { | ||||
|   if (!script) { | ||||
|     return; | ||||
|   } | ||||
|   const ops = script.split(' '); | ||||
|   if (ops.length < 3 || ops.pop() !== 'OP_CHECKMULTISIG') { | ||||
|     return; | ||||
|   } | ||||
|   const opN = ops.pop(); | ||||
|   if (!opN) { | ||||
|     return; | ||||
|   } | ||||
|   if (!opN.startsWith('OP_PUSHNUM_')) { | ||||
|     return; | ||||
|   } | ||||
|   const n = parseInt(opN.match(/[0-9]+/)?.[0] || '', 10); | ||||
|   if (ops.length < n * 2 + 1) { | ||||
|     return; | ||||
|   } | ||||
|   // pop n public keys
 | ||||
|   for (let i = 0; i < n; i++) { | ||||
|     if (!/^0((2|3)\w{64}|4\w{128})$/.test(ops.pop() || '')) { | ||||
|       return; | ||||
|     } | ||||
|     if (!/^OP_PUSHBYTES_(33|65)$/.test(ops.pop() || '')) { | ||||
|       return; | ||||
|     } | ||||
|   } | ||||
|   const opM = ops.pop(); | ||||
|   if (!opM) { | ||||
|     return; | ||||
|   } | ||||
|   if (!opM.startsWith('OP_PUSHNUM_')) { | ||||
|     return; | ||||
|   } | ||||
|   const m = parseInt(opM.match(/[0-9]+/)?.[0] || '', 10); | ||||
| 
 | ||||
|   if (ops.length) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   return { m, n }; | ||||
| } | ||||
| 
 | ||||
| export function getVarIntLength(n: number): number { | ||||
|   if (n < 0xfd) { | ||||
|     return 1; | ||||
|   } else if (n <= 0xffff) { | ||||
|     return 3; | ||||
|   } else if (n <= 0xffffffff) { | ||||
|     return 5; | ||||
|   } else { | ||||
|     return 9; | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user