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`
func(item.first, entry.GetLabel(), entry.purpose, entry.IsChange());
    }
}
stdvector<CTxDestination> CWalletListAddrBookAddresses(const stdoptional<AddrBookFilter>& _filter) const
{
    AssertLockHeld(cs_);
    stdvector<CTxDestination> result;
    AddrBookFilter filter = _filter ? *_filter  AddrBookFilter();
    ForEachAddrBookEntry([&result, &filter](const CTxDestination& dest, const stdstring& label, const stdstring& purpose, bool is_change) {
        // Filter by change
        if (filter.ignore_change && is_change) return;
        // Filter by label
        if (filter.m_op_label && *filter.m_op_label != label) return;
        // All good
        result.emplace_back(dest);
    });
    return result;
}
stdset<stdstring> CWalletListAddrBookLabels(const stdstring& purpose) const
{
    AssertLockHeld(cs_);
    stdset<stdstring> label_set;
    ForEachAddrBookEntry([&](const CTxDestination& _dest, const stdstring& _label,
                             const stdstring& _purpose, bool _is_change) {
        if (_is_change) return;
        if (purpose.empty() || _purpose == purpose) {
            label_set.insert(_label);
        }
    });
    return label_set;