diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp index 53ea904d052..a40635a0b77 100644 --- a/src/wallet/scriptpubkeyman.cpp +++ b/src/wallet/scriptpubkeyman.cpp @@ -1598,6 +1598,11 @@ bool DescriptorScriptPubKeyMan::CanUpdateToWalletDescriptor(const WalletDescript return false; } + if (!descriptor.descriptor->IsRange()) { + // Skip range check for non-range descriptors + return true; + } + if (descriptor.range_start > m_wallet_descriptor.range_start || descriptor.range_end < m_wallet_descriptor.range_end) { // Use inclusive range for error diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp index 96d475c2823..535f74f24fe 100644 --- a/src/wallet/test/wallet_tests.cpp +++ b/src/wallet/test/wallet_tests.cpp @@ -70,6 +70,25 @@ static void AddKey(CWallet& wallet, const CKey& key) assert(spk_manager); } +BOOST_FIXTURE_TEST_CASE(update_non_range_descriptor, TestingSetup) +{ + CWallet wallet(m_node.chain.get(), "", CreateMockableWalletDatabase()); + { + LOCK(wallet.cs_wallet); + wallet.SetWalletFlag(WALLET_FLAG_DESCRIPTORS); + auto key{GenerateRandomKey()}; + auto desc_str{"combo(" + EncodeSecret(key) + ")"}; + FlatSigningProvider provider; + std::string error; + auto descs{Parse(desc_str, provider, error, /* require_checksum=*/ false)}; + auto& desc{descs.at(0)}; + WalletDescriptor w_desc{std::move(desc), 0, 0, 0, 0}; + BOOST_CHECK(wallet.AddWalletDescriptor(w_desc, provider, "", false)); + // Wallet should update the non-range descriptor successfully + BOOST_CHECK(wallet.AddWalletDescriptor(w_desc, provider, "", false)); + } +} + BOOST_FIXTURE_TEST_CASE(scan_for_wallet_transactions, TestChain100Setup) { // Cap last block file size, and mine new block in a new block file.