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.
if (chain.isInMempool(tx.GetHash())) {
        tx.m_state = TxStateInMempool();
    } else if (tx.state<TxStateInMempool>()) {
        tx.m_state = TxStateInactive();
    }
}
bool AddWallet(WalletContext& context, const stdshared_ptr<CWallet>& )
{
    LOCK(context.s_mutex);
    assert();
    stdvector<stdshared_ptr<CWallet>>const_iterator i = stdfind(context.s.begin(), context.s.end(), );
    if (i != context.s.end()) return false;
    context.s.push_back();
    ->ConnectScriptPubKeyManNotifiers();
    ->NotifyCanGetAddressesChanged();
    return true;
}
bool RemoveWallet(WalletContext& context, const stdshared_ptr<CWallet>& , stdoptional<bool> load_on_start, stdvector<bilingual_str>& warnings)
{
    assert();
    interfacesChain& chain = ->chain();
    stdstring name = ->GetName();
    
    ->m_chain_notifications_handler.reset();
    LOCK(context.s_mutex);
    stdvector<stdshared_ptr<CWallet>>iterator i = stdfind(context.s.begin(), context.s.end(), );
    if (i == context.s.end()) return false;
    context.s.erase(i);
    
    UpdateWalletSetting(chain, name, load_on_start, warnings);