def scriptcode(self): output = self.ref() output_type = self.ref().type() if output_type == TX.P2WPKH: return OP.DUP.byte + OP.HASH160.byte + push(witness_program(output.script)) + OP.EQUALVERIFY.byte + OP.CHECKSIG.byte elif output_type == TX.P2SH: if self.is_nested() == TX.P2WPKH: return OP.DUP.byte + OP.HASH160.byte + push(witness_program(self.script[1:])) + OP.EQUALVERIFY.byte + OP.CHECKSIG.byte elif self.is_nested() == TX.P2WSH: return self.witness[-1] # elif output_type == TX.P2WPKH: # return output.script # elif output_type == TX.P2SH: # return self.script elif output_type == TX.P2WSH: return self.witness[-1] else: raise ScriptValidationError(f"No scriptcode for {output_type}")
def is_nested(self): if self.ref().type() == TX.P2SH: try: witness_script = witness_program(depush(self.script)) except ScriptValidationError: return False if len(witness_script) == 20: return TX.P2WPKH elif len(witness_script) == 32: return TX.P2WSH return False
def get_address(script): """Extracts the address from a scriptPubkey""" script = hex_to_bytes(script) if isinstance(script, str) else script stype = get_type(script) if stype == TX.P2SH: data = script[2:22] version = network('scripthash') return hashed_payload_to_address(version + data) elif stype == TX.P2PKH: data = script[3:23] version = network('keyhash') return hashed_payload_to_address(version + data) elif stype in (TX.P2WSH, TX.P2WPKH): witver = version_byte(script) witprog = witness_program(script) return bech32.encode(network('hrp'), witver, witprog) elif stype == TX.P2PK: return "N/A" raise ValidationError(f"Unknown script type: {bytes_to_hex(script)}")