rpc_validateaddress.py raw
1 #!/usr/bin/env python3
2 # Copyright (c) 2023-present The Bitcoin Core developers
3 # Distributed under the MIT software license, see the accompanying
4 # file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 """Test validateaddress for main chain"""
6
7 from test_framework.test_framework import BitcoinTestFramework
8
9 from test_framework.util import assert_equal
10
11 INVALID_DATA = [
12 # BIP 173
13 (
14 "tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty",
15 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # Invalid hrp
16 [],
17 ),
18 ("bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5", "Invalid Bech32 checksum", [41]),
19 (
20 "BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2",
21 "Version 1+ witness address must use Bech32m checksum",
22 [],
23 ),
24 (
25 "bc1rw5uspcuh",
26 "Version 1+ witness address must use Bech32m checksum", # Invalid program length
27 [],
28 ),
29 (
30 "bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90",
31 "Version 1+ witness address must use Bech32m checksum", # Invalid program length
32 [],
33 ),
34 (
35 "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
36 "Invalid Bech32 v0 address program size (16 bytes), per BIP141",
37 [],
38 ),
39 (
40 "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7",
41 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Mixed case
42 [],
43 ),
44 (
45 "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3t4",
46 "Invalid character or mixed case", # bc1, Mixed case, not in BIP 173 test vectors
47 [40],
48 ),
49 (
50 "bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du",
51 "Version 1+ witness address must use Bech32m checksum", # Wrong padding
52 [],
53 ),
54 (
55 "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv",
56 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Non-zero padding in 8-to-5 conversion
57 [],
58 ),
59 ("bc1gmk9yu", "Empty Bech32 data section", []),
60 # BIP 350
61 (
62 "tc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq5zuyut",
63 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # Invalid human-readable part
64 [],
65 ),
66 (
67 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqh2y7hd",
68 "Version 1+ witness address must use Bech32m checksum", # Invalid checksum (Bech32 instead of Bech32m)
69 [],
70 ),
71 (
72 "tb1z0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqglt7rf",
73 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Invalid checksum (Bech32 instead of Bech32m)
74 [],
75 ),
76 (
77 "BC1S0XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ54WELL",
78 "Version 1+ witness address must use Bech32m checksum", # Invalid checksum (Bech32 instead of Bech32m)
79 [],
80 ),
81 (
82 "bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kemeawh",
83 "Version 0 witness address must use Bech32 checksum", # Invalid checksum (Bech32m instead of Bech32)
84 [],
85 ),
86 (
87 "tb1q0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq24jc47",
88 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Invalid checksum (Bech32m instead of Bech32)
89 [],
90 ),
91 (
92 "bc1p38j9r5y49hruaue7wxjce0updqjuyyx0kh56v8s25huc6995vvpql3jow4",
93 "Invalid Base 32 character", # Invalid character in checksum
94 [59],
95 ),
96 (
97 "BC130XLXVLHEMJA6C4DQV22UAPCTQUPFHLXM9H8Z3K2E72Q4K9HCZ7VQ7ZWS8R",
98 "Invalid Bech32 address witness version",
99 [],
100 ),
101 ("bc1pw5dgrnzv", "Invalid Bech32 address program size (1 byte)", []),
102 (
103 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav253zgeav",
104 "Invalid Bech32 address program size (41 bytes)",
105 [],
106 ),
107 (
108 "BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
109 "Invalid Bech32 v0 address program size (16 bytes), per BIP141",
110 [],
111 ),
112 (
113 "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vq47Zagq",
114 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Mixed case
115 [],
116 ),
117 (
118 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v07qwwzcrf",
119 "Invalid padding in Bech32 data section", # zero padding of more than 4 bits
120 [],
121 ),
122 (
123 "tb1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vpggkg4j",
124 "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", # tb1, Non-zero padding in 8-to-5 conversion
125 [],
126 ),
127 ("bc1gmk9yu", "Empty Bech32 data section", []),
128 ]
129 VALID_DATA = [
130 # BIP 350
131 (
132 "BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
133 "0014751e76e8199196d454941c45d1b3a323f1433bd6",
134 ),
135 # (
136 # "tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
137 # "00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
138 # ),
139 (
140 "bc1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3qccfmv3",
141 "00201863143c14c5166804bd19203356da136c985678cd4d27a1b8c6329604903262",
142 ),
143 (
144 "bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kt5nd6y",
145 "5128751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45d1b3a323f1433bd6",
146 ),
147 ("BC1SW50QGDZ25J", "6002751e"),
148 ("bc1zw508d6qejxtdg4y5r3zarvaryvaxxpcs", "5210751e76e8199196d454941c45d1b3a323"),
149 # (
150 # "tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
151 # "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
152 # ),
153 (
154 "bc1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvses5wp4dt",
155 "0020000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
156 ),
157 # (
158 # "tb1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesf3hn0c",
159 # "5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
160 # ),
161 (
162 "bc1pqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvses7epu4h",
163 "5120000000c4a5cad46221b2a187905e5266362b99d5e91c6ce24d165dab93e86433",
164 ),
165 (
166 "bc1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqzk5jj0",
167 "512079be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
168 ),
169 # PayToAnchor(P2A)
170 (
171 "bc1pfeessrawgf",
172 "51024e73",
173 ),
174 ]
175
176
177 class ValidateAddressMainTest(BitcoinTestFramework):
178 def set_test_params(self):
179 self.setup_clean_chain = True
180 self.chain = "" # main
181 self.num_nodes = 1
182 self.extra_args = [["-prune=899"]] * self.num_nodes
183
184 def check_valid(self, addr, spk):
185 info = self.nodes[0].validateaddress(addr)
186 assert_equal(info["isvalid"], True)
187 assert_equal(info["scriptPubKey"], spk)
188 assert "error" not in info
189 assert "error_locations" not in info
190
191 def check_invalid(self, addr, error_str, error_locations):
192 res = self.nodes[0].validateaddress(addr)
193 assert_equal(res["isvalid"], False)
194 assert_equal(res["error"], error_str)
195 assert_equal(res["error_locations"], error_locations)
196
197 def test_validateaddress(self):
198 for (addr, error, locs) in INVALID_DATA:
199 self.check_invalid(addr, error, locs)
200 for (addr, spk) in VALID_DATA:
201 self.check_valid(addr, spk)
202
203 def run_test(self):
204 self.test_validateaddress()
205
206
207 if __name__ == "__main__":
208 ValidateAddressMainTest(__file__).main()
209