public bool TryUpdate(SmartTransaction tx)
    {
        var hash = tx.GetHash();

        lock (Lock)
        {
            // Do Contains first, because it's fast.
            if (ConfirmedStore.TryUpdate(tx))
            {
                return(true);
            }
            else if (tx.Confirmed && MempoolStore.TryRemove(hash, out var originalTx))
            {
                originalTx.TryUpdate(tx);
                ConfirmedStore.TryAddOrUpdate(originalTx);
                return(true);
            }
            else if (MempoolStore.TryUpdate(tx))
            {
                return(true);
            }
        }

        return(false);
    }
    private void AddOrUpdateNoLock(SmartTransaction tx)
    {
        var hash = tx.GetHash();

        if (tx.Confirmed)
        {
            if (MempoolStore.TryRemove(hash, out var found))
            {
                found.TryUpdate(tx);
                ConfirmedStore.TryAddOrUpdate(found);
            }
            else
            {
                ConfirmedStore.TryAddOrUpdate(tx);
            }
        }
        else
        {
            if (!ConfirmedStore.TryUpdate(tx))
            {
                MempoolStore.TryAddOrUpdate(tx);
            }
        }
    }