diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp index b0bbfb0e265..4bd4851609d 100644 --- a/src/wallet/rpc/wallet.cpp +++ b/src/wallet/rpc/wallet.cpp @@ -135,6 +135,10 @@ static RPCHelpMan listwalletdir() {RPCResult::Type::OBJ, "", "", { {RPCResult::Type::STR, "name", "The wallet name"}, + {RPCResult::Type::ARR, "warnings", /*optional=*/true, "Warning messages, if any, related to loading the wallet.", + { + {RPCResult::Type::STR, "", ""}, + }}, }}, }}, } @@ -146,9 +150,14 @@ static RPCHelpMan listwalletdir() [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue { UniValue wallets(UniValue::VARR); - for (const auto& [path, _] : ListDatabases(GetWalletDir())) { + for (const auto& [path, db_type] : ListDatabases(GetWalletDir())) { UniValue wallet(UniValue::VOBJ); wallet.pushKV("name", path.utf8string()); + UniValue warnings(UniValue::VARR); + if (db_type == "bdb") { + warnings.push_back("This wallet is a legacy wallet and will need to be migrated with migratewallet before it can be loaded"); + } + wallet.pushKV("warnings", warnings); wallets.push_back(std::move(wallet)); } diff --git a/test/functional/wallet_migration.py b/test/functional/wallet_migration.py index 700d801891c..4491c0b33fb 100755 --- a/test/functional/wallet_migration.py +++ b/test/functional/wallet_migration.py @@ -113,6 +113,11 @@ class WalletMigrationTest(BitcoinTestFramework): shutil.copyfile(self.old_node.wallets_path / "wallet.dat", self.master_node.wallets_path / "wallet.dat") else: shutil.copytree(self.old_node.wallets_path / wallet_name, self.master_node.wallets_path / wallet_name) + # Check that the wallet shows up in listwalletdir with a warning about migration + wallets = self.master_node.listwalletdir() + for w in wallets["wallets"]: + if w["name"] == wallet_name: + assert_equal(w["warnings"], ["This wallet is a legacy wallet and will need to be migrated with migratewallet before it can be loaded"]) # Migrate, checking that rescan does not occur with self.master_node.assert_debug_log(expected_msgs=[], unexpected_msgs=["Rescanning"]): migrate_info = self.master_node.migratewallet(wallet_name=wallet_name, **kwargs) @@ -548,7 +553,7 @@ class WalletMigrationTest(BitcoinTestFramework): assert_equal(info["format"], "sqlite") walletdir_list = wallet.listwalletdir() - assert {"name": info["walletname"]} in walletdir_list["wallets"] + assert {"name": info["walletname"]} in [{"name": w["name"]} for w in walletdir_list["wallets"]] # Check backup existence and its non-empty wallet filename backup_filename = f"default_wallet_{curr_time}.legacy.bak" diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py index cd849445f08..87c8f627552 100755 --- a/test/functional/wallet_multiwallet.py +++ b/test/functional/wallet_multiwallet.py @@ -72,7 +72,7 @@ class MultiWalletTest(BitcoinTestFramework): return wallet_dir(name, "wallet.dat") return wallet_dir(name) - assert_equal(self.nodes[0].listwalletdir(), {'wallets': [{'name': self.default_wallet_name}]}) + assert_equal(self.nodes[0].listwalletdir(), {'wallets': [{'name': self.default_wallet_name, "warnings": []}]}) # check wallet.dat is created self.stop_nodes()