34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from ..constants import BCH_CASHADDR_RE
|
|
from .common import base58check_verify
|
|
|
|
|
|
def validate_bch_address(address: str) -> tuple[bool, str]:
|
|
address = address.strip()
|
|
lower = address.lower()
|
|
if lower.startswith("bitcoincash:"):
|
|
payload = lower.split(":", 1)[1]
|
|
else:
|
|
payload = lower
|
|
|
|
if payload.startswith("q") or payload.startswith("p"):
|
|
if not BCH_CASHADDR_RE.fullmatch(payload):
|
|
return False, "Invalid characters in BCH CashAddr payload"
|
|
if len(payload) < 30:
|
|
return False, "BCH CashAddr payload is too short"
|
|
# Future improvement: replace this with full BCH CashAddr checksum verification.
|
|
return True, "CashAddr format (checksum not verified)"
|
|
|
|
if address.startswith("1") or address.startswith("3"):
|
|
valid, reason, version, payload_len = base58check_verify(address)
|
|
if not valid:
|
|
return False, reason
|
|
if payload_len != 21:
|
|
return False, "Unexpected Base58 payload length"
|
|
if version not in (0x00, 0x05):
|
|
return False, "Invalid BCH legacy version byte"
|
|
return True, "Valid legacy Base58Check address"
|
|
|
|
return False, "BCH addresses must be CashAddr or legacy Base58"
|