Reorganize project structure
This commit is contained in:
33
checkaddy_app/validators/bch.py
Normal file
33
checkaddy_app/validators/bch.py
Normal file
@@ -0,0 +1,33 @@
|
||||
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"
|
||||
Reference in New Issue
Block a user