diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h --- a/src/wallet/wallet.h +++ b/src/wallet/wallet.h @@ -85,8 +85,7 @@ // Wallet without a default key written FEATURE_NO_DEFAULT_KEY = 190700, - // HD is optional, use FEATURE_COMPRPUBKEY as latest version - FEATURE_LATEST = FEATURE_COMPRPUBKEY, + FEATURE_LATEST = FEATURE_NO_DEFAULT_KEY }; enum class OutputType { diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -4386,6 +4386,37 @@ walletInstance->SetMaxVersion(nMaxVersion); } + // Upgrade to HD if explicit upgrade + if (gArgs.GetBoolArg("-upgradewallet", false)) { + LOCK(walletInstance->cs_wallet); + bool hd_upgrade = false; + if (walletInstance->CanSupportFeature(FEATURE_HD) && + !walletInstance->IsHDEnabled()) { + LogPrintf("Upgrading wallet to HD\n"); + walletInstance->SetMinVersion(FEATURE_HD); + + // generate a new master key + CPubKey masterPubKey = walletInstance->GenerateNewHDMasterKey(); + if (!walletInstance->SetHDMasterKey(masterPubKey)) { + throw std::runtime_error(std::string(__func__) + + ": Storing master key failed"); + } + hd_upgrade = true; + } + // Upgrade to HD chain split if necessary + if (walletInstance->CanSupportFeature(FEATURE_HD_SPLIT)) { + LogPrintf("Upgrading wallet to use HD chain split\n"); + walletInstance->SetMinVersion(FEATURE_HD_SPLIT); + } + // Regenerate the keypool if upgraded to HD + if (hd_upgrade) { + if (!walletInstance->NewKeyPool()) { + InitError(_("Unable to generate keys") += "\n"); + return nullptr; + } + } + } + if (fFirstRun) { // Ensure this wallet.dat can only be opened by clients supporting // HD with chain split and expects no default key. @@ -4395,7 +4426,7 @@ walletFile)); return nullptr; } - walletInstance->SetMinVersion(FEATURE_NO_DEFAULT_KEY); + walletInstance->SetMinVersion(FEATURE_LATEST); // Generate a new master key. CPubKey masterPubKey = walletInstance->GenerateNewHDMasterKey();