Skip to content

Commit 962a093

Browse files
committed
Improve address decoding errors
1 parent 89fb354 commit 962a093

File tree

3 files changed

+15
-15
lines changed

3 files changed

+15
-15
lines changed

src/key_io.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,17 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
107107
std::equal(script_prefix.begin(), script_prefix.end(), data.begin())) ||
108108
(data.size() >= pubkey_prefix.size() &&
109109
std::equal(pubkey_prefix.begin(), pubkey_prefix.end(), data.begin()))) {
110-
error_str = "Invalid length for Base58 address";
110+
error_str = "Invalid length for Base58 address (P2PKH or P2SH)";
111111
} else {
112-
error_str = "Invalid prefix for Base58-encoded address";
112+
error_str = "Invalid or unsupported Base58-encoded address.";
113113
}
114114
return CNoDestination();
115115
} else if (!is_bech32) {
116116
// Try Base58 decoding without the checksum, using a much larger max length
117117
if (!DecodeBase58(str, data, 100)) {
118-
error_str = "Not a valid Bech32 or Base58 encoding";
118+
error_str = "Invalid or unsupported Segwit (Bech32) or Base58 encoding.";
119119
} else {
120-
error_str = "Invalid checksum or length of Base58 address";
120+
error_str = "Invalid checksum or length of Base58 address (P2PKH or P2SH)";
121121
}
122122
return CNoDestination();
123123
}
@@ -127,7 +127,7 @@ CTxDestination DecodeDestination(const std::string& str, const CChainParams& par
127127
if ((dec.encoding == bech32::Encoding::BECH32 || dec.encoding == bech32::Encoding::BECH32M) && dec.data.size() > 0) {
128128
// Bech32 decoding
129129
if (dec.hrp != params.Bech32HRP()) {
130-
error_str = "Invalid prefix for Bech32 address";
130+
error_str = strprintf("Invalid or unsupported prefix for Segwit (Bech32) address (expected %s, got %s).", params.Bech32HRP(), dec.hrp);
131131
return CNoDestination();
132132
}
133133
int version = dec.data[0]; // The first 5 bit symbol is the witness version (0-16)

test/functional/rpc_invalid_address_message.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def check_invalid(self, addr, error_str, error_locations=None):
6464
def test_validateaddress(self):
6565
# Invalid Bech32
6666
self.check_invalid(BECH32_INVALID_SIZE, 'Invalid Bech32 address data size')
67-
self.check_invalid(BECH32_INVALID_PREFIX, 'Not a valid Bech32 or Base58 encoding')
67+
self.check_invalid(BECH32_INVALID_PREFIX, 'Invalid or unsupported Segwit (Bech32) or Base58 encoding.')
6868
self.check_invalid(BECH32_INVALID_BECH32, 'Version 1+ witness address must use Bech32m checksum')
6969
self.check_invalid(BECH32_INVALID_BECH32M, 'Version 0 witness address must use Bech32 checksum')
7070
self.check_invalid(BECH32_INVALID_VERSION, 'Invalid Bech32 address witness version')
@@ -84,16 +84,16 @@ def test_validateaddress(self):
8484
self.check_valid(BECH32_VALID_MULTISIG)
8585

8686
# Invalid Base58
87-
self.check_invalid(BASE58_INVALID_PREFIX, 'Invalid prefix for Base58-encoded address')
88-
self.check_invalid(BASE58_INVALID_CHECKSUM, 'Invalid checksum or length of Base58 address')
89-
self.check_invalid(BASE58_INVALID_LENGTH, 'Invalid checksum or length of Base58 address')
87+
self.check_invalid(BASE58_INVALID_PREFIX, 'Invalid or unsupported Base58-encoded address.')
88+
self.check_invalid(BASE58_INVALID_CHECKSUM, 'Invalid checksum or length of Base58 address (P2PKH or P2SH)')
89+
self.check_invalid(BASE58_INVALID_LENGTH, 'Invalid checksum or length of Base58 address (P2PKH or P2SH)')
9090

9191
# Valid Base58
9292
self.check_valid(BASE58_VALID)
9393

9494
# Invalid address format
95-
self.check_invalid(INVALID_ADDRESS, 'Not a valid Bech32 or Base58 encoding')
96-
self.check_invalid(INVALID_ADDRESS_2, 'Not a valid Bech32 or Base58 encoding')
95+
self.check_invalid(INVALID_ADDRESS, 'Invalid or unsupported Segwit (Bech32) or Base58 encoding.')
96+
self.check_invalid(INVALID_ADDRESS_2, 'Invalid or unsupported Segwit (Bech32) or Base58 encoding.')
9797

9898
node = self.nodes[0]
9999

@@ -106,9 +106,9 @@ def test_getaddressinfo(self):
106106
node = self.nodes[0]
107107

108108
assert_raises_rpc_error(-5, "Invalid Bech32 address data size", node.getaddressinfo, BECH32_INVALID_SIZE)
109-
assert_raises_rpc_error(-5, "Not a valid Bech32 or Base58 encoding", node.getaddressinfo, BECH32_INVALID_PREFIX)
110-
assert_raises_rpc_error(-5, "Invalid prefix for Base58-encoded address", node.getaddressinfo, BASE58_INVALID_PREFIX)
111-
assert_raises_rpc_error(-5, "Not a valid Bech32 or Base58 encoding", node.getaddressinfo, INVALID_ADDRESS)
109+
assert_raises_rpc_error(-5, "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", node.getaddressinfo, BECH32_INVALID_PREFIX)
110+
assert_raises_rpc_error(-5, "Invalid or unsupported Base58-encoded address.", node.getaddressinfo, BASE58_INVALID_PREFIX)
111+
assert_raises_rpc_error(-5, "Invalid or unsupported Segwit (Bech32) or Base58 encoding.", node.getaddressinfo, INVALID_ADDRESS)
112112

113113
def run_test(self):
114114
self.test_validateaddress()

test/functional/wallet_basic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ def run_test(self):
632632
assert_equal(total_txs, len(self.nodes[0].listtransactions("*", 99999)))
633633

634634
# Test getaddressinfo on external address. Note that these addresses are taken from disablewallet.py
635-
assert_raises_rpc_error(-5, "Invalid prefix for Base58-encoded address", self.nodes[0].getaddressinfo, "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy")
635+
assert_raises_rpc_error(-5, "Invalid or unsupported Base58-encoded address.", self.nodes[0].getaddressinfo, "3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy")
636636
address_info = self.nodes[0].getaddressinfo("mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ")
637637
assert_equal(address_info['address'], "mneYUmWYsuk7kySiURxCi3AGxrAqZxLgPZ")
638638
assert_equal(address_info["scriptPubKey"], "76a9144e3854046c7bd1594ac904e4793b6a45b36dea0988ac")

0 commit comments

Comments
 (0)