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`
error = chain.havePruned() ?
                     _("Prune last  synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)") 
                     strprintf(_(
                        "Error loading . Wallet requires blocks to be downloaded, "
                        "and software does not currently support loading s while "
                        "blocks are being downloaded out of order when using assumeutxo "
                        "snapshots. Wallet should be able to load successfully after "
                        "node sync reaches height %s"), block_height);
                return false;
            }
        }
        chain.initMessage(_("Rescanning…").translated);
        Instance->WalletLogPrintf("Rescanning last %i blocks (from block %i)...\n", *tip_height - rescan_height, rescan_height);
        {
            WalletRescanReserver reserver(*Instance);
            if (!reserver.reserve() || (ScanResultSUCCESS != Instance->ScanForWalletTransactions(chain.getBlockHash(rescan_height), rescan_height, /*ma reserver, /*fUpdate=*/_progr)) {
                error = _("Failed to rescan th during initialization");
                return false;
            }
        }
        Instance->m_attaching_chain = false;
        Instance->chainStateFlushed(chain.getTipLocator());
        Instance->GetDatabase().IncrementUpdateCounter();
    }
    Instance->m_attaching_chain = false;
    return true;
}
const CAddressBookData* CWalletFindAddressBookEntry(const CTxDestination& dest, bool allow_change) const
{
    const auto& address_book_it = m_address_book.find(dest);