Skip to content

Commit 9994213

Browse files
committed
Accept 35-character testnet P2SH BTC addresses
1 parent 22786cc commit 9994213

2 files changed

Lines changed: 13 additions & 2 deletions

File tree

‎src/validators/crypto_addresses/btc_address.py‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ def _decode_base58(addr: str):
1616

1717
def _validate_old_btc_address(addr: str):
1818
"""Validate P2PKH and P2SH type address."""
19-
if len(addr) not in range(25, 35):
19+
# Testnet P2SH addresses (version byte 0xc4) are 35 characters long.
20+
if len(addr) not in range(25, 36):
2021
return False
21-
decoded_bytes = _decode_base58(addr).to_bytes(25, "big")
22+
decoded = _decode_base58(addr)
23+
# Some 35-character strings decode to more than 25 bytes.
24+
if decoded.bit_length() > 200:
25+
return False
26+
decoded_bytes = decoded.to_bytes(25, "big")
2227
header, checksum = decoded_bytes[:-4], decoded_bytes[-4:]
2328
return checksum == sha256(sha256(header).digest()).digest()[:4]
2429

‎tests/crypto_addresses/test_btc_address.py‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2",
1515
# P2SH (Pay to script hash) type
1616
"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy",
17+
# Testnet P2SH type (35 characters)
18+
"2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vc",
1719
# Bech32/segwit type
1820
"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq",
1921
"bc1qc7slrfxkknqcq2jevvvkdgvrt8080852dfjewde450xdlk4ugp7szw5tk9",
@@ -36,6 +38,10 @@ def test_returns_true_on_valid_btc_address(value: str):
3638
"1BvBMsEYstWetqTFn5Au4m4GFg7xJaNVN2",
3739
# incorrect checksum
3840
"3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLz",
41+
# incorrect testnet P2SH checksum
42+
"2MzQwSSnBHWHqSAqtTVQ6v47XtaisrJa1Vd",
43+
# 35 characters that decode to more than 25 bytes
44+
"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz",
3945
],
4046
)
4147
def test_returns_failed_validation_on_invalid_btc_address(value: str):

0 commit comments

Comments
 (0)