2021-01-03 01:45:25 +01:00
#!/usr/bin/env python3
2024-07-16 19:23:02 +02:00
# Copyright (c) 2020-present The Bitcoin Core developers
2021-01-03 01:45:25 +01:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
""" Test error messages for ' getaddressinfo ' and ' validateaddress ' RPC commands. """
from test_framework . test_framework import BitcoinTestFramework
from test_framework . util import (
assert_equal ,
assert_raises_rpc_error ,
)
BECH32_VALID = ' bcrt1qtmp74ayg7p24uslctssvjm06q5phz4yrxucgnv '
2024-07-16 19:23:02 +02:00
BECH32_VALID_UNKNOWN_WITNESS = ' bcrt1p424qxxyd0r '
2021-10-01 14:17:18 +13:00
BECH32_VALID_CAPITALS = ' BCRT1QPLMTZKC2XHARPPZDLNPAQL78RSHJ68U33RAH7R '
BECH32_VALID_MULTISIG = ' bcrt1qdg3myrgvzw7ml9q0ejxhlkyxm7vl9r56yzkfgvzclrf4hkpx9yfqhpsuks '
2021-01-05 13:36:42 -08:00
BECH32_INVALID_BECH32 = ' bcrt1p0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqdmchcc '
BECH32_INVALID_BECH32M = ' bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7k35mrzd '
BECH32_INVALID_VERSION = ' bcrt130xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7vqynjegk '
BECH32_INVALID_SIZE = ' bcrt1s0xlxvlhemja6c4dqv22uapctqupfhlxm9h8z3k2e72q4k9hcz7v8n0nx0muaewav25430mtr '
BECH32_INVALID_V0_SIZE = ' bcrt1qw508d6qejxtdg4y5r3zarvary0c5xw7kqqq5k3my '
BECH32_INVALID_PREFIX = ' bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx '
2021-10-01 14:17:18 +13:00
BECH32_TOO_LONG = ' bcrt1q049edschfnwystcqnsvyfpj23mpsg3jcedq9xv049edschfnwystcqnsvyfpj23mpsg3jcedq9xv049edschfnwystcqnsvyfpj23m '
BECH32_ONE_ERROR = ' bcrt1q049edschfnwystcqnsvyfpj23mpsg3jcedq9xv '
BECH32_ONE_ERROR_CAPITALS = ' BCRT1QPLMTZKC2XHARPPZDLNPAQL78RSHJ68U32RAH7R '
BECH32_TWO_ERRORS = ' bcrt1qax9suht3qv95sw33xavx8crpxduefdrsvgsklu ' # should be bcrt1qax9suht3qv95sw33wavx8crpxduefdrsvgsklx
BECH32_NO_SEPARATOR = ' bcrtq049ldschfnwystcqnsvyfpj23mpsg3jcedq9xv '
BECH32_INVALID_CHAR = ' bcrt1q04oldschfnwystcqnsvyfpj23mpsg3jcedq9xv '
BECH32_MULTISIG_TWO_ERRORS = ' bcrt1qdg3myrgvzw7ml8q0ejxhlkyxn7vl9r56yzkfgvzclrf4hkpx9yfqhpsuks '
BECH32_WRONG_VERSION = ' bcrt1ptmp74ayg7p24uslctssvjm06q5phz4yrxucgnv '
2021-01-03 01:45:25 +01:00
BASE58_VALID = ' mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJRfn '
BASE58_INVALID_PREFIX = ' 17VZNX1SN5NtKa8UQFxwQbFeFc3iqRYhem '
2021-10-01 14:17:18 +13:00
BASE58_INVALID_CHECKSUM = ' mipcBbFg9gMiCh81Kj8tqqdgoZub1ZJJfn '
BASE58_INVALID_LENGTH = ' 2VKf7XKMrp4bVNVmuRbyCewkP8FhGLP2E54LHDPakr9Sq5mtU2 '
2021-01-03 01:45:25 +01:00
INVALID_ADDRESS = ' asfah14i8fajz0123f '
2021-10-01 14:17:18 +13:00
INVALID_ADDRESS_2 = ' 1q049ldschfnwystcqnsvyfpj23mpsg3jcedq9xv '
2021-01-03 01:45:25 +01:00
class InvalidAddressErrorMessageTest ( BitcoinTestFramework ) :
2022-11-09 12:53:13 +01:00
def add_options ( self , parser ) :
self . add_wallet_options ( parser )
2021-01-03 01:45:25 +01:00
def set_test_params ( self ) :
self . setup_clean_chain = True
self . num_nodes = 1
2021-10-01 14:17:18 +13:00
def check_valid ( self , addr ) :
info = self . nodes [ 0 ] . validateaddress ( addr )
2021-01-03 01:45:25 +01:00
assert info [ ' isvalid ' ]
assert ' error ' not in info
2021-10-01 14:17:18 +13:00
assert ' error_locations ' not in info
2021-01-03 01:45:25 +01:00
2021-10-01 14:17:18 +13:00
def check_invalid ( self , addr , error_str , error_locations = None ) :
res = self . nodes [ 0 ] . validateaddress ( addr )
assert not res [ ' isvalid ' ]
assert_equal ( res [ ' error ' ] , error_str )
if error_locations :
assert_equal ( res [ ' error_locations ' ] , error_locations )
else :
assert_equal ( res [ ' error_locations ' ] , [ ] )
2021-01-03 01:45:25 +01:00
2021-10-01 14:17:18 +13:00
def test_validateaddress ( self ) :
# Invalid Bech32
2025-02-23 08:51:49 +00:00
self . check_invalid ( BECH32_INVALID_SIZE , ' Invalid Bech32 address program size (41 bytes) ' )
self . check_invalid ( BECH32_INVALID_PREFIX , ' Invalid or unsupported prefix for Segwit (Bech32) regtest address (expected bcrt, got bc) ' )
2021-10-01 14:17:18 +13:00
self . check_invalid ( BECH32_INVALID_BECH32 , ' Version 1+ witness address must use Bech32m checksum ' )
self . check_invalid ( BECH32_INVALID_BECH32M , ' Version 0 witness address must use Bech32 checksum ' )
self . check_invalid ( BECH32_INVALID_VERSION , ' Invalid Bech32 address witness version ' )
2025-02-23 08:51:49 +00:00
self . check_invalid ( BECH32_INVALID_V0_SIZE , ' Invalid SegWit v0 address program size (21 bytes), per BIP141 ' )
2025-02-23 06:03:00 +00:00
self . check_invalid ( BECH32_TOO_LONG , ' Bech32(m) address decoded with error: Bech32 string too long ' , list ( range ( 90 , 108 ) ) )
self . check_invalid ( BECH32_ONE_ERROR , ' Bech32(m) address decoded with error: Invalid Bech32 checksum ' , [ 9 ] )
self . check_invalid ( BECH32_TWO_ERRORS , ' Bech32(m) address decoded with error: Invalid Bech32 checksum ' , [ 22 , 43 ] )
self . check_invalid ( BECH32_ONE_ERROR_CAPITALS , ' Invalid checksum or length of Base58 address (P2PKH or P2SH) ' , [ 38 ] )
self . check_invalid ( BECH32_NO_SEPARATOR , ' Bech32(m) address decoded with error: Missing separator ' )
self . check_invalid ( BECH32_INVALID_CHAR , ' Address is not valid Base58 or Bech32 ' , [ 8 ] )
self . check_invalid ( BECH32_MULTISIG_TWO_ERRORS , ' Bech32(m) address decoded with error: Invalid Bech32 checksum ' , [ 19 , 30 ] )
self . check_invalid ( BECH32_WRONG_VERSION , ' Bech32(m) address decoded with error: Invalid Bech32 checksum ' , [ 5 ] )
2021-10-01 14:17:18 +13:00
# Valid Bech32
self . check_valid ( BECH32_VALID )
2024-07-16 19:23:02 +02:00
self . check_valid ( BECH32_VALID_UNKNOWN_WITNESS )
2021-10-01 14:17:18 +13:00
self . check_valid ( BECH32_VALID_CAPITALS )
self . check_valid ( BECH32_VALID_MULTISIG )
# Invalid Base58
2025-02-23 06:03:00 +00:00
self . check_invalid ( BASE58_INVALID_PREFIX , ' Invalid Base58 regtest address. Expected prefix 2, m, or n ' )
self . check_invalid ( BASE58_INVALID_CHECKSUM , ' Invalid checksum or length of Base58 address (P2PKH or P2SH) ' , [ 4 , 6 , 10 , 12 , 16 , 25 , 29 , 30 , 31 ] )
self . check_invalid ( BASE58_INVALID_LENGTH , ' Invalid checksum or length of Base58 address (P2PKH or P2SH) ' , [ 3 , 8 , 9 , 11 , 15 , 16 , 18 , 19 , 21 , 22 , 23 , 27 , 39 , 40 , 41 , 44 , 46 , 47 ] )
2021-10-01 14:17:18 +13:00
# Valid Base58
self . check_valid ( BASE58_VALID )
2021-01-03 01:45:25 +01:00
# Invalid address format
2025-02-23 06:03:00 +00:00
self . check_invalid ( INVALID_ADDRESS , ' Bech32(m) address decoded with error: Invalid separator position ' , [ 14 ] )
self . check_invalid ( INVALID_ADDRESS_2 , ' Bech32(m) address decoded with error: Invalid separator position ' , [ 0 ] )
2021-01-03 01:45:25 +01:00
2023-01-11 17:58:45 +01:00
node = self . nodes [ 0 ]
# Missing arg returns the help text
assert_raises_rpc_error ( - 1 , " Return information about the given bitcoin address. " , node . validateaddress )
# Explicit None is not allowed for required parameters
assert_raises_rpc_error ( - 3 , " JSON value of type null is not of expected type string " , node . validateaddress , None )
2021-01-03 01:45:25 +01:00
def test_getaddressinfo ( self ) :
node = self . nodes [ 0 ]
2025-02-23 08:51:49 +00:00
assert_raises_rpc_error ( - 5 , ' Invalid Bech32 address program size (41 bytes) ' , node . getaddressinfo , BECH32_INVALID_SIZE )
assert_raises_rpc_error ( - 5 , ' Invalid or unsupported prefix for Segwit (Bech32) regtest address (expected bcrt, got bc) ' , node . getaddressinfo , BECH32_INVALID_PREFIX )
assert_raises_rpc_error ( - 5 , ' Invalid Base58 regtest address. Expected prefix 2, m, or n ' , node . getaddressinfo , BASE58_INVALID_PREFIX )
assert_raises_rpc_error ( - 5 , ' Bech32(m) address decoded with error: Invalid separator position ' , node . getaddressinfo , INVALID_ADDRESS )
2024-07-16 19:23:02 +02:00
assert " isscript " not in node . getaddressinfo ( BECH32_VALID_UNKNOWN_WITNESS )
2021-01-03 01:45:25 +01:00
def run_test ( self ) :
self . test_validateaddress ( )
2021-08-24 19:42:13 -03:00
if self . is_wallet_compiled ( ) :
2021-10-20 00:30:28 -03:00
self . init_wallet ( node = 0 )
2021-08-24 19:42:13 -03:00
self . test_getaddressinfo ( )
2021-01-03 01:45:25 +01:00
if __name__ == ' __main__ ' :
2024-07-16 22:05:14 +01:00
InvalidAddressErrorMessageTest ( __file__ ) . main ( )