In specter https://github.com/cryptoadvance/specter-desktop/issues/1491#issuecomment-1126145011  a user can abandon an **receiving** tx that was evicted from the mempool (for example because it was double spent). The tx is marked via [abandontransaction](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/abandontransaction.rst) as abandoned in bitcoin core.

However [gettransaction](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/gettransaction.rst) and [listtransactions](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/listtransactions.rst) do not return the field `abandoned`, even though this is visible in the GUI:

![image](https://user-images.githubusercontent.com/60378539/168316171-45c1aa29-de52-4d9a-ae2b-3293aeadd663.png)

**Consequence**: Specter cannot get the `abandoned` information from bitcoin rpc, and will fetch the abandoned tx back again via [listtransactions](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/listtransactions.rst) after it was deleted in specter.   

**Describe the solution you'd like**
Always return the `abandoned` field in https://github.com/bitcoin/bitcoin/blob/225e5b57b2ee2bc1acd7f09c89ccccc15ef8c85f/src/wallet/rpc/transactions.cpp#L345  and not only in this special case https://github.com/bitcoin/bitcoin/blob/225e5b57b2ee2bc1acd7f09c89ccccc15ef8c85f/src/wallet/rpc/transactions.cpp#L375
That should then automatically solve  [gettransaction](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/gettransaction.rst)  via https://github.com/bitcoin/bitcoin/blob/225e5b57b2ee2bc1acd7f09c89ccccc15ef8c85f/src/wallet/rpc/transactions.cpp#L795

**Describe alternatives you've considered**
If specter can't get the information about abandoned tx from bitcoin, it would have to keep an internal list. That is possible, but redundant and can lead to many edge cases.

**Steps to reproduce**

- Wallet A:  Send 1 BTC to Wallet B  (rbf)
- Wallet A:  Replace tx with rbf to send all funds to wallet A
- Wallet B: Abandon tx (because no longer in mempool)
- Wallet B:  [gettransaction](https://github.com/bitcoin-dot-org/developer.bitcoin.org/blob/master/reference/rpc/gettransaction.rst) will not show the  `abandoned` field
if (target_confirms < 1) {
            throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter");
        }
    }
    if (ParseIncludeWatchonly(request.params[2], wallet)) {
        filter |= ISMINE_WATCH_ONLY;
    }
    bool include_removed = (request.params[3].isNull() || request.params[3].get_bool());
    bool include_change = (!request.params[4].isNull() && request.params[4].get_bool());
    
    std::optional<std::string> filter_label;
    if (!request.params[5].isNull()) filter_label.emplace(LabelFromValue(request.params[5]));
    int depth = height ? wallet.GetLastBlockHeight() + 1 - *height : -1;
    UniValue transactions(UniValue::VARR);
    for (const std::pair<const uint256, CWalletTx>& pairWtx : wallet.mapWallet) {
        const CWalletTx& tx = pairWtx.second;
        if (depth == -1 || abs(wallet.GetTxDepthInMainChain(tx)) < depth) {
            ListTransactions(wallet, tx, 0, true, transactions, filter, filter_label, include_change);
        }
    }
    
    
    UniValue removed(UniValue::VARR);
    while (include_removed && altheight && *altheight > *height) {
        CBlock block;
        if (!wallet.chain().findBlock(blockId, FoundBlock().data(block)) || block.IsNull()) {
            throw JSONRPCError(RPC_INTERNAL_ERROR, "Can't read block from disk");
        }
        for (const CTransactionRef& tx : block.vtx) {
            auto it = wallet.mapWallet.find(tx->GetHash());