From 492a715d7841f03472bc4950f33612e13b5764ad Mon Sep 17 00:00:00 2001 From: Pol Espinasa Date: Mon, 27 Jul 2026 18:43:50 +0200 Subject: [PATCH] gui: Adds option to not load the wallet after migration --- src/interfaces/wallet.h | 2 +- src/qt/walletcontroller.cpp | 22 ++++++++++++++++------ src/qt/walletcontroller.h | 2 +- src/wallet/interfaces.cpp | 4 ++-- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h index 326361aa802..7955820b295 100644 --- a/src/interfaces/wallet.h +++ b/src/interfaces/wallet.h @@ -323,7 +323,7 @@ public: virtual util::Result> restoreWallet(const fs::path& backup_file, const std::string& wallet_name, std::vector& warnings, bool load_after_restore) = 0; //! Migrate a wallet - virtual util::Result migrateWallet(const std::string& name, const SecureString& passphrase) = 0; + virtual util::Result migrateWallet(const std::string& name, const SecureString& passphrase, bool load_wallet) = 0; //! Returns true if wallet stores encryption keys virtual bool isEncrypted(const std::string& wallet_name) = 0; diff --git a/src/qt/walletcontroller.cpp b/src/qt/walletcontroller.cpp index 1d6153d49a1..e3cb713c00b 100644 --- a/src/qt/walletcontroller.cpp +++ b/src/qt/walletcontroller.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -439,7 +440,7 @@ void RestoreWalletActivity::finish() Q_EMIT finished(); } -void MigrateWalletActivity::do_migrate(const std::string& name) +void MigrateWalletActivity::do_migrate(const std::string& name, bool load_wallet) { SecureString passphrase; if (node().walletLoader().isEncrypted(name)) { @@ -450,8 +451,8 @@ void MigrateWalletActivity::do_migrate(const std::string& name) showProgressDialog(tr("Migrate Wallet"), tr("Migrating Wallet %1…").arg(GUIUtil::HtmlEscape(name))); - QTimer::singleShot(0, worker(), [this, name, passphrase] { - auto res{node().walletLoader().migrateWallet(name, passphrase)}; + QTimer::singleShot(0, worker(), [this, name, passphrase, load_wallet] { + auto res{node().walletLoader().migrateWallet(name, passphrase, load_wallet)}; if (res) { m_success_message = tr("The wallet '%1' was migrated successfully.").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(name))); @@ -461,7 +462,12 @@ void MigrateWalletActivity::do_migrate(const std::string& name) if (res->solvables_wallet_name) { m_success_message += QChar(' ') + tr("Solvable but not watched scripts have been migrated to a new wallet named '%1'.").arg(GUIUtil::HtmlEscape(GUIUtil::WalletDisplayName(res->solvables_wallet_name.value()))); } - m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(res->wallet)); + if (load_wallet) { + assert(res->wallet); + m_wallet_model = m_wallet_controller->getOrCreateWallet(std::move(res->wallet)); + } else { + m_success_message += QChar(' ') + tr("The wallet was not loaded after migration. You can open it from the \"File > Open wallet\" menu."); + } } else { m_error_message = util::ErrorString(res); } @@ -482,11 +488,15 @@ void MigrateWalletActivity::migrate(const std::string& name) "The migration process will create a backup of the wallet before migrating. This backup file will be named " "-.legacy.bak and can be found in the directory for this wallet. In the event of " "an incorrect migration, the backup can be restored with the \"Restore Wallet\" functionality.")); + auto* load_wallet_checkbox = new QCheckBox(tr("Load wallet after migration"), &box); + load_wallet_checkbox->setToolTip(tr("If the node is pruned and the wallet was created before the pruned height, the migration process may fail trying to load the migrated wallet.")); + load_wallet_checkbox->setChecked(true); + box.setCheckBox(load_wallet_checkbox); box.setStandardButtons(QMessageBox::Yes|QMessageBox::Cancel); box.setDefaultButton(QMessageBox::Yes); if (box.exec() != QMessageBox::Yes) return; - do_migrate(name); + do_migrate(name, load_wallet_checkbox->isChecked()); } void MigrateWalletActivity::restore_and_migrate(const fs::path& path, const std::string& wallet_name) @@ -523,7 +533,7 @@ void MigrateWalletActivity::restore_and_migrate(const fs::path& path, const std: return; } QTimer::singleShot(0, this, [this, wallet_name] { - do_migrate(wallet_name); + do_migrate(wallet_name, /*load_wallet=*/true); }); }); } diff --git a/src/qt/walletcontroller.h b/src/qt/walletcontroller.h index 2fb9ccf1f93..6f807333ed7 100644 --- a/src/qt/walletcontroller.h +++ b/src/qt/walletcontroller.h @@ -196,7 +196,7 @@ Q_SIGNALS: private: QString m_success_message; - void do_migrate(const std::string& name); + void do_migrate(const std::string& name, bool load_wallet); void finish(); }; diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp index 9f9876da303..bed9be0a5a3 100644 --- a/src/wallet/interfaces.cpp +++ b/src/wallet/interfaces.cpp @@ -601,9 +601,9 @@ public: } return wallet; } - util::Result migrateWallet(const std::string& name, const SecureString& passphrase) override + util::Result migrateWallet(const std::string& name, const SecureString& passphrase, bool load_wallet) override { - auto res = wallet::MigrateLegacyToDescriptor(name, passphrase, m_context); + auto res = wallet::MigrateLegacyToDescriptor(name, passphrase, m_context, load_wallet); if (!res) return util::Error{util::ErrorString(res)}; WalletMigrationResult out{ .wallet = MakeWallet(m_context, res->wallet),