|
12 | 12 | )
|
13 | 13 |
|
14 | 14 | BECH32_VALID = 'bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv'
|
| 15 | +BECH32_VALID_CAPITALS = 'BCRT1QPLMTZKC2XHARPPZDLNPAQL78RSHJ68U33RAH7R' |
| 16 | +BECH32_VALID_MULTISIG = 'bcrt1qdg3myrgvzw7ml9q0ejxhlkyxm7vl9r56yzkfgvzclrf4hkpx9yfqhpsuks' |
| 17 | + |
15 | 18 | BECH32_INVALID_BECH32 = 'bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqdmchcc'
|
16 | 19 | BECH32_INVALID_BECH32M = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7k35mrzd'
|
17 | 20 | BECH32_INVALID_VERSION = 'bcrt130xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqynjegk'
|
18 | 21 | BECH32_INVALID_SIZE = 'bcrt1s0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav25430mtr'
|
19 | 22 | BECH32_INVALID_V0_SIZE = 'bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7kqqq5k3my'
|
20 | 23 | BECH32_INVALID_PREFIX = 'bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx'
|
| 24 | +BECH32_TOO_LONG = 'bcrt1q049edschfnwystcqnsvyfpj23mpsg3jcedq9xv049edschfnwystcqnsvyfpj23mpsg3jcedq9xv049edschfnwystcqnsvyfpj23m' |
| 25 | +BECH32_ONE_ERROR = 'bcrt1q049edschfnwystcqnsvyfpj23mpsg3jcedq9xv' |
| 26 | +BECH32_ONE_ERROR_CAPITALS = 'BCRT1QPLMTZKC2XHARPPZDLNPAQL78RSHJ68U32RAH7R' |
| 27 | +BECH32_TWO_ERRORS = 'bcrt1qax9suht3qv95sw33xavx8crpxduefdrsvgsklu' # should be bcrt1qax9suht3qv95sw33wavx8crpxduefdrsvgsklx |
| 28 | +BECH32_NO_SEPARATOR = 'bcrtq049ldschfnwystcqnsvyfpj23mpsg3jcedq9xv' |
| 29 | +BECH32_INVALID_CHAR = 'bcrt1q04oldschfnwystcqnsvyfpj23mpsg3jcedq9xv' |
| 30 | +BECH32_MULTISIG_TWO_ERRORS = 'bcrt1qdg3myrgvzw7ml8q0ejxhlkyxn7vl9r56yzkfgvzclrf4hkpx9yfqhpsuks' |
| 31 | +BECH32_WRONG_VERSION = 'bcrt1ptmp74ayg7p24uslctssvjm06q5phz4yrxucgnv' |
21 | 32 |
|
22 | 33 | BASE58_VALID = 'mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn'
|
23 | 34 | BASE58_INVALID_PREFIX = '17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem'
|
| 35 | +BASE58_INVALID_CHECKSUM = 'mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJJfn' |
| 36 | +BASE58_INVALID_LENGTH = '2VKf7XKMrp4bVNVmuRbyCewkP8FhGLP2E54LHDPakr9Sq5mtU2' |
24 | 37 |
|
25 | 38 | INVALID_ADDRESS = 'asfah14i8fajz0123f'
|
| 39 | +INVALID_ADDRESS_2 = '1q049ldschfnwystcqnsvyfpj23mpsg3jcedq9xv' |
26 | 40 |
|
27 | 41 | class InvalidAddressErrorMessageTest(BitcoinTestFramework):
|
28 | 42 | def set_test_params(self):
|
29 | 43 | self.setup_clean_chain = True
|
30 | 44 | self.num_nodes = 1
|
31 | 45 |
|
32 |
| - def test_validateaddress(self): |
33 |
| - node = self.nodes[0] |
34 |
| - |
35 |
| - # Bech32 |
36 |
| - info = node.validateaddress(BECH32_INVALID_SIZE) |
37 |
| - assert not info['isvalid'] |
38 |
| - assert_equal(info['error'], 'Invalid Bech32 address data size') |
39 |
| - |
40 |
| - info = node.validateaddress(BECH32_INVALID_PREFIX) |
41 |
| - assert not info['isvalid'] |
42 |
| - assert_equal(info['error'], 'Invalid HRP or Base58 character in address') |
43 |
| - |
44 |
| - info = node.validateaddress(BECH32_INVALID_BECH32) |
45 |
| - assert not info['isvalid'] |
46 |
| - assert_equal(info['error'], 'Version 1+ witness address must use Bech32m checksum') |
47 |
| - |
48 |
| - info = node.validateaddress(BECH32_INVALID_BECH32M) |
49 |
| - assert not info['isvalid'] |
50 |
| - assert_equal(info['error'], 'Version 0 witness address must use Bech32 checksum') |
51 |
| - |
52 |
| - info = node.validateaddress(BECH32_INVALID_V0_SIZE) |
53 |
| - assert not info['isvalid'] |
54 |
| - assert_equal(info['error'], 'Invalid Bech32 v0 address data size') |
55 |
| - |
56 |
| - info = node.validateaddress(BECH32_VALID) |
| 46 | + def check_valid(self, addr): |
| 47 | + info = self.nodes[0].validateaddress(addr) |
57 | 48 | assert info['isvalid']
|
58 | 49 | assert 'error' not in info
|
| 50 | + assert 'error_locations' not in info |
59 | 51 |
|
60 |
| - info = node.validateaddress(BECH32_INVALID_VERSION) |
61 |
| - assert not info['isvalid'] |
62 |
| - assert_equal(info['error'], 'Invalid Bech32 address witness version') |
63 |
| - |
64 |
| - # Base58 |
65 |
| - info = node.validateaddress(BASE58_INVALID_PREFIX) |
66 |
| - assert not info['isvalid'] |
67 |
| - assert_equal(info['error'], 'Invalid prefix for Base58-encoded address') |
| 52 | + def check_invalid(self, addr, error_str, error_locations=None): |
| 53 | + res = self.nodes[0].validateaddress(addr) |
| 54 | + assert not res['isvalid'] |
| 55 | + assert_equal(res['error'], error_str) |
| 56 | + if error_locations: |
| 57 | + assert_equal(res['error_locations'], error_locations) |
| 58 | + else: |
| 59 | + assert_equal(res['error_locations'], []) |
68 | 60 |
|
69 |
| - info = node.validateaddress(BASE58_VALID) |
70 |
| - assert info['isvalid'] |
71 |
| - assert 'error' not in info |
| 61 | + def test_validateaddress(self): |
| 62 | + # Invalid Bech32 |
| 63 | + self.check_invalid(BECH32_INVALID_SIZE, 'Invalid Bech32 address data size') |
| 64 | + self.check_invalid(BECH32_INVALID_PREFIX, 'Invalid HRP or Base58 character in address') |
| 65 | + self.check_invalid(BECH32_INVALID_BECH32, 'Version 1+ witness address must use Bech32m checksum') |
| 66 | + self.check_invalid(BECH32_INVALID_BECH32M, 'Version 0 witness address must use Bech32 checksum') |
| 67 | + self.check_invalid(BECH32_INVALID_VERSION, 'Invalid Bech32 address witness version') |
| 68 | + self.check_invalid(BECH32_INVALID_V0_SIZE, 'Invalid Bech32 v0 address data size') |
| 69 | + self.check_invalid(BECH32_TOO_LONG, 'Bech32 string too long', list(range(90, 108))) |
| 70 | + self.check_invalid(BECH32_ONE_ERROR, 'Invalid checksum', [9]) |
| 71 | + self.check_invalid(BECH32_TWO_ERRORS, 'Invalid checksum', [22, 43]) |
| 72 | + self.check_invalid(BECH32_ONE_ERROR_CAPITALS, 'Invalid checksum', [38]) |
| 73 | + self.check_invalid(BECH32_NO_SEPARATOR, 'Missing separator') |
| 74 | + self.check_invalid(BECH32_INVALID_CHAR, 'Invalid Base 32 character', [8]) |
| 75 | + self.check_invalid(BECH32_MULTISIG_TWO_ERRORS, 'Invalid checksum', [19, 30]) |
| 76 | + self.check_invalid(BECH32_WRONG_VERSION, 'Invalid checksum', [5]) |
| 77 | + |
| 78 | + # Valid Bech32 |
| 79 | + self.check_valid(BECH32_VALID) |
| 80 | + self.check_valid(BECH32_VALID_CAPITALS) |
| 81 | + self.check_valid(BECH32_VALID_MULTISIG) |
| 82 | + |
| 83 | + # Invalid Base58 |
| 84 | + self.check_invalid(BASE58_INVALID_PREFIX, 'Invalid prefix for Base58-encoded address') |
| 85 | + self.check_invalid(BASE58_INVALID_CHECKSUM, 'Invalid checksum or length of Base58 address') |
| 86 | + self.check_invalid(BASE58_INVALID_LENGTH, 'Invalid checksum or length of Base58 address') |
| 87 | + |
| 88 | + # Valid Base58 |
| 89 | + self.check_valid(BASE58_VALID) |
72 | 90 |
|
73 | 91 | # Invalid address format
|
74 |
| - info = node.validateaddress(INVALID_ADDRESS) |
75 |
| - assert not info['isvalid'] |
76 |
| - assert_equal(info['error'], 'Invalid HRP or Base58 character in address') |
| 92 | + self.check_invalid(INVALID_ADDRESS, 'Invalid HRP or Base58 character in address') |
| 93 | + self.check_invalid(INVALID_ADDRESS_2, 'Invalid HRP or Base58 character in address') |
77 | 94 |
|
78 | 95 | def test_getaddressinfo(self):
|
79 | 96 | node = self.nodes[0]
|
|
0 commit comments