When a block reward is spent together with other outputs in the wallet and that block reward is later orphaned, the wallet does not show the other funds as available anymore.  Even a `-rescan` is not enough - only `-zapwallettxes` or an explicit `abandontransaction` "recovers" the funds.  I prepared a [test case](https://github.com/domob1812/bitcoin/blob/wallet-bug-invalidated-block-rewards/test/functional/wallet_bug.py) that shows this behaviour.

Is this a known issue or the expected behaviour?  While this situation is something that will presumably not occur in practice (as it requires a long reorg), I wonder if that transaction should be automatically abandoned as it seems clear it won't be able to be confirmed anymore.
};
struct TxStateInactive {
    bool abandoned;
    explicit TxStateInactive(bool abandoned = false) : abandoned(abandoned) {}
};
struct TxStateUnrecognized {
    uint256 block_hash;
    int index;
    TxStateUnrecognized(const uint256& block_hash, int index) : block_hash(block_hash), index(index) {}
};
using TxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateConflicted, TxStateInactive, TxStateUnrecognized>;
using SyncTxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateInactive>;
static inline TxState TxStateInterpretSerialized(TxStateUnrecognized data)
{
    if (data.block_hash == uint256::ZERO) {
        if (data.index == 0) return TxStateInactive{};
    } else if (data.block_hash == uint256::ONE) {
        if (data.index == -1) return TxStateInactive{true};
    } else if (data.index >= 0) {
        return TxStateConfirmed{data.block_hash, -1, data.index};
    } else if (data.index == -1) {
        return TxStateConflicted{data.block_hash, -1};
    }
    return data;
}
static inline uint256 TxStateSerializedBlockHash(const TxState& state)