|
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