Skip to content

Commit 2269fdf

Browse files
committed
#3 Add testnet support
1 parent a946bd4 commit 2269fdf

2 files changed

Lines changed: 41 additions & 7 deletions

File tree

cashaddress/convert.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,31 @@ class InvalidAddress(Exception):
1010
class Address:
1111
VERSION_MAP = {
1212
'legacy': [
13-
('P2SH', 5),
14-
('P2PKH', 0)
13+
('P2SH', 5, False),
14+
('P2PKH', 0, False),
15+
('P2SH-TESTNET', 196, True),
16+
('P2PKH-TESTNET', 111, True)
1517
],
1618
'cash': [
17-
('P2SH', 8),
18-
('P2PKH', 0)
19+
('P2SH', 8, False),
20+
('P2PKH', 0, False),
21+
('P2SH-TESTNET', 8, True),
22+
('P2PKH-TESTNET', 0, True)
1923
]
2024
}
21-
DEFAULT_PREFIX = 'bitcoincash'
25+
MAINNET_PREFIX = 'bitcoincash'
26+
TESTNET_PREFIX = 'bchtest'
2227

2328
def __init__(self, version, payload, prefix=None):
2429
self.version = version
2530
self.payload = payload
2631
if prefix:
2732
self.prefix = prefix
2833
else:
29-
self.prefix = self.DEFAULT_PREFIX
34+
if Address._address_type('cash', self.version)[2]:
35+
self.prefix = self.TESTNET_PREFIX
36+
else:
37+
self.prefix = self.MAINNET_PREFIX
3038

3139
def __str__(self):
3240
return 'version: {}\npayload: {}\nprefix: {}'.format(self.version, self.payload, self.prefix)
@@ -90,13 +98,15 @@ def _cash_string(address_string):
9098
raise InvalidAddress('Cash address contains uppercase and lowercase characters')
9199
address_string = address_string.lower()
92100
if ':' not in address_string:
93-
address_string = Address.DEFAULT_PREFIX + ':' + address_string
101+
address_string = Address.MAINNET_PREFIX + ':' + address_string
94102
prefix, base32string = address_string.split(':')
95103
decoded = b32decode(base32string)
96104
if not verify_checksum(prefix, decoded):
97105
raise InvalidAddress('Bad cash address checksum')
98106
converted = convertbits(decoded, 5, 8)
99107
version = Address._address_type('cash', converted[0])[0]
108+
if prefix == Address.TESTNET_PREFIX:
109+
version += '-TESTNET'
100110
payload = converted[1:-6]
101111
return Address(version, payload, prefix)
102112

tests/test.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,30 @@ def test_to_cash_p2pkh(self):
2727
self.assertEqual(convert.to_cash_address('bitcoincash:qqkv9wr69ry2p9l53lxp635va4h86wv435995w8p2h'),
2828
'bitcoincash:qqkv9wr69ry2p9l53lxp635va4h86wv435995w8p2h')
2929

30+
def test_to_legacy_p2sh_testnet(self):
31+
self.assertEqual(convert.to_legacy_address('2MwikwR6hoVijCmr1u8UgzFMHFP6rpQyRvP'),
32+
'2MwikwR6hoVijCmr1u8UgzFMHFP6rpQyRvP')
33+
self.assertEqual(convert.to_legacy_address('bchtest:pqc3tyspqwn95retv5k3c5w4fdq0cxvv95u36gfk00'),
34+
'2MwikwR6hoVijCmr1u8UgzFMHFP6rpQyRvP')
35+
36+
def test_to_legacy_p2pkh_testnet(self):
37+
self.assertEqual(convert.to_legacy_address('mqp7vM7eU7Vu9NPH1V7s7pPg5FFBMo6SWK'),
38+
'mqp7vM7eU7Vu9NPH1V7s7pPg5FFBMo6SWK')
39+
self.assertEqual(convert.to_legacy_address('bchtest:qpc0qh2xc3tfzsljq79w37zx02kwvzm4gydm222qg8'),
40+
'mqp7vM7eU7Vu9NPH1V7s7pPg5FFBMo6SWK')
41+
42+
def test_to_cash_p2sh_testnet(self):
43+
self.assertEqual(convert.to_cash_address('2MwikwR6hoVijCmr1u8UgzFMHFP6rpQyRvP'),
44+
'bchtest:pqc3tyspqwn95retv5k3c5w4fdq0cxvv95u36gfk00')
45+
self.assertEqual(convert.to_cash_address('bchtest:pqc3tyspqwn95retv5k3c5w4fdq0cxvv95u36gfk00'),
46+
'bchtest:pqc3tyspqwn95retv5k3c5w4fdq0cxvv95u36gfk00')
47+
48+
def test_to_cash_p2pkh_testnet(self):
49+
self.assertEqual(convert.to_cash_address('mqp7vM7eU7Vu9NPH1V7s7pPg5FFBMo6SWK'),
50+
'bchtest:qpc0qh2xc3tfzsljq79w37zx02kwvzm4gydm222qg8')
51+
self.assertEqual(convert.to_cash_address('bchtest:qpc0qh2xc3tfzsljq79w37zx02kwvzm4gydm222qg8'),
52+
'bchtest:qpc0qh2xc3tfzsljq79w37zx02kwvzm4gydm222qg8')
53+
3054

3155
if __name__ == '__main__':
3256
unittest.main()

0 commit comments

Comments
 (0)