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
Exemple #3
0
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)}")