Steps:
1. Send transaction (A) to a different wallet
2. Using the change, create another transaction (B) to a different wallet
3. `abandontransaction` B
4. `bumpfee` A fails with `Transaction has descendants in the wallet`
assert(desc_spkm != nullptr);
            AddScriptPubKeys(desc_spkm);
            // 
            if (desc_spkm->IsHDEnabled()) {
                m_last_range_ends.emplace(desc_spkm->GetID(), desc_spkm->GetEndRange());
            }
        }
    }
    void UpdateNeeded()
    {
        // 
        for (const auto& [desc_spkm_id, last_range_end]  m_last_range_ends) {
            auto desc_spkm{dynamic_cast<DescriptorScriptPubKeyMan*>(m_.GetScriptPubKeyMan(desc_spkm_id))};
            assert(desc_spkm != nullptr);
            int32_t current_range_end{desc_spkm->GetEndRange()};
            if (current_range_end > last_range_end) {
                AddScriptPubKeys(desc_spkm, last_range_end);
                m_last_range_ends.at(desc_spkm->GetID()) = current_range_end;
            }
        }
    }
    stdoptional<bool> MatchesBlock(const uint256& block_hash) const
    {
        return m_.chain().blockFilterMatchesAny(BlockFilterTypeBASIC, block_hash, m_filter_set);
    }
private
    const CWallet& m_;
    /** Map for keeping track of each range 's last seen end range.
      * This information is used to detect whether new addresses were derived
      * (that is, if the current end range is larger than the saved end range)