rpc_validateaddress.py
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()