Source code for cashscript_py.helpers.address

"""Utility functions for address computations, conversions, and transformations."""

from cashscript_py.helpers.cashaddress import (
    LockingBytecodeType,
    address_contents_to_locking_bytecode,
    get_network_prefix,
    locking_bytecode_to_cash_address,
    payload_to_cash_address,
)
from cashscript_py.helpers.crypto import hash160, hash256
from cashscript_py.helpers.script import Script, serialize_script
from cashscript_py.network.network_provider import Network


[docs] def script_to_address( script: Script, network: Network, address_type: LockingBytecodeType, token_aware: bool = False ) -> str: """Convert a script to a CashAddress for the given network/type. Args: script: Script list to encode. network: Target network. address_type: Locking bytecode type (P2SH20/P2SH32/P2PKH/P2PK). token_aware: If True, encode token-aware address version. Returns: CashAddress string. """ locking_bytecode = script_to_locking_bytecode(script, address_type) prefix = get_network_prefix(network) return locking_bytecode_to_cash_address(locking_bytecode, prefix, token_aware)
[docs] def script_to_locking_bytecode(script: Script, address_type: LockingBytecodeType) -> bytes: """Hash a script into its P2SH20/P2SH32 (or P2PKH/P2PK) locking bytecode. Args: script: Script list to hash. address_type: Desired locking type. Returns: Locking bytecode. Raises: ValueError: If the address_type is unsupported. """ if address_type != LockingBytecodeType.P2SH20 and address_type != LockingBytecodeType.P2SH32: raise ValueError("address_type needs to be either 'p2sh32' or 'p2sh20'") script_bytecode = serialize_script(script) script_hash = hash256(script_bytecode) if address_type == LockingBytecodeType.P2SH32 else hash160(script_bytecode) return address_contents_to_locking_bytecode(script_hash, address_type)
[docs] def public_key_to_pkh(public_key: bytes) -> bytes: """Return the HASH160 of a public key (pkh).""" return hash160(public_key)
[docs] def public_key_to_p2pkh_locking_bytecode(public_key: bytes) -> bytes: """Build a standard P2PKH locking bytecode from a public key. Args: public_key: Raw public key (compressed or uncompressed). Returns: P2PKH locking bytecode. """ pubkey_hash: bytes = hash160(public_key) return address_contents_to_locking_bytecode(pubkey_hash, LockingBytecodeType.P2PKH)
[docs] def public_key_to_cash_address( public_key: bytes, network: Network, address_type: LockingBytecodeType = LockingBytecodeType.P2PKH, token_aware: bool = False, ) -> str: """Convert a public key to a CashAddress. Args: public_key: Raw public key (compressed or uncompressed). network: Target network. address_type: Address type (default P2PKH). token_aware: If True, uses token-aware address version. Returns: CashAddress string. """ prefix = get_network_prefix(network) public_key_hash = hash160(public_key) return payload_to_cash_address(prefix, public_key_hash, address_type, token_aware)