Skip to content

Commit 31764c3

Browse files
committed
Add migratewallet RPC
1 parent 0bf7b38 commit 31764c3

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

src/wallet/rpc/wallet.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -701,6 +701,59 @@ RPCHelpMan simulaterawtransaction()
701701
};
702702
}
703703

704+
static RPCHelpMan migratewallet()
705+
{
706+
return RPCHelpMan{"migratewallet",
707+
"EXPERIMENTAL warning: This call may not work as expected and may be changed in future releases\n"
708+
"\nMigrate the wallet to a descriptor wallet.\n"
709+
"A new wallet backup will need to be made.\n"
710+
"\nThe migration process will create a backup of the wallet before migrating. This backup\n"
711+
"file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory\n"
712+
"for this wallet. In the event of an incorrect migration, the backup can be restored using restorewallet." +
713+
HELP_REQUIRING_PASSPHRASE,
714+
{},
715+
RPCResult{
716+
RPCResult::Type::OBJ, "", "",
717+
{
718+
{RPCResult::Type::STR, "wallet_name", "The name of the primary migrated wallet"},
719+
{RPCResult::Type::STR, "watchonly_name", /*optional=*/true, "The name of the migrated wallet containing the watchonly scripts"},
720+
{RPCResult::Type::STR, "solvables_name", /*optional=*/true, "The name of the migrated wallet containing solvable but not watched scripts"},
721+
{RPCResult::Type::STR, "backup_path", "The location of the backup of the original wallet"},
722+
}
723+
},
724+
RPCExamples{
725+
HelpExampleCli("migratewallet", "")
726+
+ HelpExampleRpc("migratewallet", "")
727+
},
728+
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
729+
{
730+
std::shared_ptr<CWallet> wallet = GetWalletForJSONRPCRequest(request);
731+
if (!wallet) return NullUniValue;
732+
733+
EnsureWalletIsUnlocked(*wallet);
734+
735+
WalletContext& context = EnsureWalletContext(request.context);
736+
737+
util::Result<MigrationResult> res = MigrateLegacyToDescriptor(std::move(wallet), context);
738+
if (!res) {
739+
throw JSONRPCError(RPC_WALLET_ERROR, util::ErrorString(res).original);
740+
}
741+
742+
UniValue r{UniValue::VOBJ};
743+
r.pushKV("wallet_name", res->wallet_name);
744+
if (res->watchonly_wallet) {
745+
r.pushKV("watchonly_name", res->watchonly_wallet->GetName());
746+
}
747+
if (res->solvables_wallet) {
748+
r.pushKV("solvables_name", res->solvables_wallet->GetName());
749+
}
750+
r.pushKV("backup_path", res->backup_path.u8string());
751+
752+
return r;
753+
},
754+
};
755+
}
756+
704757
// addresses
705758
RPCHelpMan getaddressinfo();
706759
RPCHelpMan getnewaddress();
@@ -820,6 +873,7 @@ Span<const CRPCCommand> GetWalletRPCCommands()
820873
{"wallet", &listwallets},
821874
{"wallet", &loadwallet},
822875
{"wallet", &lockunspent},
876+
{"wallet", &migratewallet},
823877
{"wallet", &newkeypool},
824878
{"wallet", &removeprunedfunds},
825879
{"wallet", &rescanblockchain},

0 commit comments

Comments
 (0)