Skip to content

Commit ca8cd89

Browse files
committed
wallet: fix and improve upgradewallet error responses
1 parent 99d56e3 commit ca8cd89

File tree

2 files changed

+24
-16
lines changed

2 files changed

+24
-16
lines changed

src/wallet/rpcwallet.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4484,12 +4484,12 @@ static RPCHelpMan upgradewallet()
44844484
const int current_version{pwallet->GetVersion()};
44854485
std::string result;
44864486

4487-
if (!wallet_upgraded) {
4488-
throw JSONRPCError(RPC_WALLET_ERROR, error.original);
4489-
} else if (previous_version == current_version) {
4490-
result = "Already at latest version. Wallet version unchanged.";
4491-
} else {
4492-
result = strprintf("Wallet upgraded successfully from version %i to version %i.", previous_version, current_version);
4487+
if (wallet_upgraded) {
4488+
if (previous_version == current_version) {
4489+
result = "Already at latest version. Wallet version unchanged.";
4490+
} else {
4491+
result = strprintf("Wallet upgraded successfully from version %i to version %i.", previous_version, current_version);
4492+
}
44934493
}
44944494

44954495
UniValue obj(UniValue::VOBJ);
@@ -4498,8 +4498,8 @@ static RPCHelpMan upgradewallet()
44984498
obj.pushKV("current_version", current_version);
44994499
if (!result.empty()) {
45004500
obj.pushKV("result", result);
4501-
}
4502-
if (!error.empty()) {
4501+
} else {
4502+
CHECK_NONFATAL(!error.empty());
45034503
obj.pushKV("error", error.original);
45044504
}
45054505
return obj;

test/functional/wallet_upgradewallet.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from test_framework.util import (
2424
assert_equal,
2525
assert_is_hex_string,
26-
assert_raises_rpc_error,
2726
sha256sum_file,
2827
)
2928

@@ -105,6 +104,18 @@ def test_upgradewallet(self, wallet, previous_version, requested_version=None, e
105104
)
106105
assert_equal(wallet.getwalletinfo()["walletversion"], new_version)
107106

107+
def test_upgradewallet_error(self, wallet, previous_version, requested_version, msg):
108+
assert_equal(wallet.getwalletinfo()["walletversion"], previous_version)
109+
assert_equal(wallet.upgradewallet(requested_version),
110+
{
111+
"wallet_name": "",
112+
"previous_version": previous_version,
113+
"current_version": previous_version,
114+
"error": msg,
115+
}
116+
)
117+
assert_equal(wallet.getwalletinfo()["walletversion"], previous_version)
118+
108119
def run_test(self):
109120
self.nodes[0].generatetoaddress(101, self.nodes[0].getnewaddress())
110121
self.dumb_sync_blocks()
@@ -200,7 +211,7 @@ def copy_split_hd():
200211

201212
self.log.info('Wallets cannot be downgraded')
202213
copy_non_hd()
203-
assert_raises_rpc_error(-4, 'Cannot downgrade wallet', wallet.upgradewallet, 40000)
214+
self.test_upgradewallet_error(wallet, previous_version=60000, requested_version=40000, msg="Cannot downgrade wallet")
204215
wallet.unloadwallet()
205216
assert_equal(before_checksum, sha256sum_file(node_master_wallet))
206217
node_master.loadwallet('')
@@ -237,12 +248,9 @@ def copy_split_hd():
237248
assert_equal('m/0\'/0\'/1\'', info['hdkeypath'])
238249

239250
self.log.info('Cannot upgrade to HD Split, needs Pre Split Keypool')
240-
assert_raises_rpc_error(-4, 'Cannot upgrade a non HD split wallet without upgrading to support pre split keypool', wallet.upgradewallet, 139900)
241-
assert_equal(130000, wallet.getwalletinfo()['walletversion'])
242-
assert_raises_rpc_error(-4, 'Cannot upgrade a non HD split wallet without upgrading to support pre split keypool', wallet.upgradewallet, 159900)
243-
assert_equal(130000, wallet.getwalletinfo()['walletversion'])
244-
assert_raises_rpc_error(-4, 'Cannot upgrade a non HD split wallet without upgrading to support pre split keypool', wallet.upgradewallet, 169899)
245-
assert_equal(130000, wallet.getwalletinfo()['walletversion'])
251+
for version in [139900, 159900, 169899]:
252+
self.test_upgradewallet_error(wallet, previous_version=130000, requested_version=version,
253+
msg="Cannot upgrade a non HD split wallet without upgrading to support pre split keypool. Please use version 169900 or no version specified.")
246254

247255
self.log.info('Upgrade HD to HD chain split')
248256
self.test_upgradewallet(wallet, previous_version=130000, requested_version=169900)

0 commit comments

Comments
 (0)