diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -1412,6 +1412,11 @@ parameters...); }; + /** Upgrade the wallet */ + static bool UpgradeWallet(std::shared_ptr wallet, bool first_run, + bilingual_str &error, + std::vector &warnings); + //! Returns all unique ScriptPubKeyMans in m_internal_spk_managers and //! m_external_spk_managers std::set GetActiveScriptPubKeyMans() const; diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4145,51 +4145,8 @@ } } - int prev_version = walletInstance->GetVersion(); - if (gArgs.GetBoolArg("-upgradewallet", fFirstRun)) { - int nMaxVersion = gArgs.GetArg("-upgradewallet", 0); - // The -upgradewallet without argument case - if (nMaxVersion == 0) { - walletInstance->WalletLogPrintf("Performing wallet upgrade to %i\n", - FEATURE_LATEST); - nMaxVersion = FEATURE_LATEST; - // permanently upgrade the wallet immediately - walletInstance->SetMinVersion(FEATURE_LATEST); - } else { - walletInstance->WalletLogPrintf( - "Allowing wallet upgrade up to %i\n", nMaxVersion); - } - - if (nMaxVersion < walletInstance->GetVersion()) { - error = _("Cannot downgrade wallet"); - return nullptr; - } - - walletInstance->SetMaxVersion(nMaxVersion); - } - - // Upgrade to HD if explicit upgrade - if (gArgs.GetBoolArg("-upgradewallet", false)) { - LOCK(walletInstance->cs_wallet); - - // Do not upgrade versions to any version between HD_SPLIT and - // FEATURE_PRE_SPLIT_KEYPOOL unless already supporting HD_SPLIT - int max_version = walletInstance->GetVersion(); - if (!walletInstance->CanSupportFeature(FEATURE_HD_SPLIT) && - max_version >= FEATURE_HD_SPLIT && - max_version < FEATURE_PRE_SPLIT_KEYPOOL) { - error = - _("Cannot upgrade a non HD split wallet without upgrading to " - "support pre split keypool. Please use -upgradewallet=200300 " - "or -upgradewallet with no version specified."); - return nullptr; - } - - for (auto spk_man : walletInstance->GetActiveScriptPubKeyMans()) { - if (!spk_man->Upgrade(prev_version, error)) { - return nullptr; - } - } + if (!UpgradeWallet(walletInstance, fFirstRun, error, warnings)) { + return nullptr; } if (fFirstRun) { @@ -4498,6 +4455,59 @@ return &address_book_it->second; } +bool CWallet::UpgradeWallet(std::shared_ptr walletInstance, + bool fFirstRun, bilingual_str &error, + std::vector &warnings) { + int prev_version = walletInstance->GetVersion(); + if (gArgs.GetBoolArg("-upgradewallet", fFirstRun)) { + int nMaxVersion = gArgs.GetArg("-upgradewallet", 0); + // The -upgradewallet without argument case + if (nMaxVersion == 0) { + walletInstance->WalletLogPrintf("Performing wallet upgrade to %i\n", + FEATURE_LATEST); + nMaxVersion = FEATURE_LATEST; + // permanently upgrade the wallet immediately + walletInstance->SetMinVersion(FEATURE_LATEST); + } else { + walletInstance->WalletLogPrintf( + "Allowing wallet upgrade up to %i\n", nMaxVersion); + } + + if (nMaxVersion < walletInstance->GetVersion()) { + error = _("Cannot downgrade wallet"); + return false; + } + + walletInstance->SetMaxVersion(nMaxVersion); + } + + // Upgrade to HD if explicit upgrade + if (gArgs.GetBoolArg("-upgradewallet", false)) { + LOCK(walletInstance->cs_wallet); + + // Do not upgrade versions to any version between HD_SPLIT and + // FEATURE_PRE_SPLIT_KEYPOOL unless already supporting HD_SPLIT + int max_version = walletInstance->GetVersion(); + if (!walletInstance->CanSupportFeature(FEATURE_HD_SPLIT) && + max_version >= FEATURE_HD_SPLIT && + max_version < FEATURE_PRE_SPLIT_KEYPOOL) { + error = + _("Cannot upgrade a non HD split wallet without upgrading to " + "support pre split keypool. Please use -upgradewallet=200300 " + "or -upgradewallet with no version specified."); + return false; + } + + for (auto spk_man : walletInstance->GetActiveScriptPubKeyMans()) { + if (!spk_man->Upgrade(prev_version, error)) { + return false; + } + } + } + + return true; +} + void CWallet::postInitProcess() { auto locked_chain = chain().lock(); LOCK(cs_wallet);