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`
batch.WriteTx(wtx);
            // I
            for (unsigned int i = 0; i < wtx.tx->vout.size(); ++i) {
                stdpair<TxSpendsconst_iterator, TxSpendsconst_iterator> range = mapTxSpends.equal_range(COutPoint(now, i));
                for (TxSpendsconst_iterator iter = range.first; iter != range.second; ++iter) {
                    if (!done.count(iter->second)) {
                        todo.insert(iter->second);
                    }
                }
            }
            // I
            // a
            MarkInputsDirty(wtx.tx);
        }
    }
}
void CWalletSyncTransaction(const CTransactionRef& ptx, const SyncTxState& state, bool update_tx, bool rescanning_old_block)
{
    if (!AddToWalletInvolvingMe(ptx, state, update_tx, rescanning_old_block))
        return; // N
    // I
    // a
    // r
    MarkInputsDirty(ptx);
}
void CWallettransactionAddedToMempool(const CTransactionRef& tx) {
    LOCK(cs_);
    SyncTransaction(tx, TxStateInMempool{});
    auto it = mapWallet.find(tx->GetHash());
    if (it != mapWallet.end()) {