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`
bool CWalletAddToWalletInvolvingMe(const CTransactionRef& ptx, const SyncTxState& state, bool fUpdate, bool rescanning_old_block)
{
    const CTransaction& tx = *ptx;
    {
        AssertLockHeld(cs_);
        if (auto* conf = stdget_if<TxStateConfirmed>(&state)) {
            for (const CTxIn& txin  tx.vin) {
                stdpair<TxSpendsconst_iterator, TxSpendsconst_iterator> range = mapTxSpends.equal_range(txin.prevout);
                while (range.first != range.second) {
                    if (range.first->second != tx.GetHash()) {
                        WalletLogPrintf("Transaction %s (in block %s) conflicts with  transaction %s (both spend %s%i)\n", tx.GetHash().ToString(), conf->confirmed_block_hash.ToString(), range.first->second.ToString(), range.first->first.hash.ToString(), range.first->first.n);
                        MarkConflicted(conf->confirmed_block_hash, conf->confirmed_block_height, range.first->second);
                    }
                    range.first++;
                }
            }
        }
        bool fExisted = mapWallet.count(tx.GetHash()) != 0;
        if (fExisted && !fUpdate) return false;
        if (fExisted || IsMine(tx) || IsFromMe(tx))
        {
            /* Check if any keys in th keypool that were supposed to be unused
             * have appeared in a new transaction.  so, remove those keys from the keypool.
             * This can happen when restoring an old  backup that does not contain
             * the mostly recently created transactions from newer versions of th.
             */
            // l
            for (const CTxOut& txout tx.vout) {
                for (const auto& spk_man  GetScriptPubKeyMans(txout.scriptPubKey)) {
                    for (auto &dest  spk_man->MarkUnusedAddresses(txout.scriptPubKey)) {