private Task ProcessMessageAsync(CashInEvent message)
        {
            var fees   = message.CashIn.Fees;
            var fee    = fees?.FirstOrDefault()?.Transfer;
            var @event = new CashInProcessedEvent
            {
                OperationId = Guid.Parse(message.Header.RequestId),
                RequestId   = Guid.Parse(message.Header.MessageId),
                WalletId    = Guid.Parse(message.CashIn.WalletId),
                Volume      = decimal.Parse(message.CashIn.Volume),
                AssetId     = message.CashIn.AssetId,
                Timestamp   = message.Header.Timestamp,
                FeeSize     = ParseNullabe(fee?.Volume)
            };

            _cqrsEngine.PublishEvent(@event, BoundedContext.Name);

            if (fees != null)
            {
                var feeEvent = new FeeChargedEvent
                {
                    OperationId   = message.Header.MessageId,
                    OperationType = FeeOperationType.CashInOut,
                    Fee           = fees.Where(x => x.Transfer != null).Select(x => x.Transfer).ToJson()
                };
                _cqrsEngine.PublishEvent(feeEvent, BoundedContext.Name);
            }

            return(Task.CompletedTask);
        }
        private async Task ProcessMessageAsync(CashInEvent message)
        {
            var fees   = message.CashIn.Fees;
            var fee    = fees?.FirstOrDefault()?.Transfer;
            var @event = new CashInProcessedEvent
            {
                OperationId = Guid.Parse(message.Header.RequestId),
                RequestId   = Guid.Parse(message.Header.MessageId),
                WalletId    = Guid.Parse(message.CashIn.WalletId),
                Volume      = decimal.Parse(message.CashIn.Volume),
                AssetId     = message.CashIn.AssetId,
                Timestamp   = message.Header.Timestamp,
                FeeSize     = ParseNullabe(fee?.Volume)
            };

            _cqrsEngine.PublishEvent(@event, BoundedContext.Name);

            if (fees != null)
            {
                var feeEvent = new FeeChargedEvent
                {
                    OperationId   = message.Header.MessageId,
                    OperationType = FeeOperationType.CashInOut,
                    Fee           = fees.Where(x => x.Transfer != null).Select(x => x.Transfer).ToJson()
                };
                _cqrsEngine.PublishEvent(feeEvent, BoundedContext.Name);
            }

            await _lykkeMailerliteClient.Customers.UpdateDepositAsync(new UpdateCustomerDepositRequest
            {
                CustomerId = message.CashIn.WalletId, RequestId = Guid.NewGuid().ToString(), Timestamp = message.Header.Timestamp.ToTimestamp()
            });
        }
        private Task ProcessMessageAsync(ExecutionEvent message)
        {
            var orders = message.Orders.Select(x => new OrderModel
            {
                Id              = Guid.Parse(x.ExternalId),
                WalletId        = Guid.Parse(x.WalletId),
                Volume          = decimal.Parse(x.Volume),
                AssetPairId     = x.AssetPairId,
                CreateDt        = x.CreatedAt,
                LowerLimitPrice = ParseNullabe(x.LowerLimitPrice),
                LowerPrice      = ParseNullabe(x.LowerPrice),
                MatchDt         = x.LastMatchTime,
                MatchingId      = Guid.Parse(x.Id),
                Price           = ParseNullabe(x.Price),
                RegisterDt      = x.Registered,
                RejectReason    = x.RejectReason,
                RemainingVolume = ParseNullabe(x.RemainingVolume),
                Side            = (Contracts.Cqrs.Models.Enums.OrderSide)(int) x.Side,
                Status          = (Contracts.Cqrs.Models.Enums.OrderStatus)(int) x.Status,
                StatusDt        = x.StatusDate,
                Straight        = x.OrderType == OrderType.Limit || x.OrderType == OrderType.StopLimit || x.Straight,
                Type            = (Contracts.Cqrs.Models.Enums.OrderType)(int) x.OrderType,
                UpperLimitPrice = ParseNullabe(x.UpperLimitPrice),
                UpperPrice      = ParseNullabe(x.UpperPrice),
                Trades          = x.Trades?.Select(t => new TradeModel
                {
                    Id               = Guid.Parse(t.TradeId),
                    WalletId         = Guid.Parse(x.WalletId),
                    AssetPairId      = x.AssetPairId,
                    BaseAssetId      = t.BaseAssetId,
                    BaseVolume       = decimal.Parse(t.BaseVolume),
                    Price            = decimal.Parse(t.Price),
                    Timestamp        = t.Timestamp,
                    QuotingAssetId   = t.QuotingAssetId,
                    QuotingVolume    = decimal.Parse(t.QuotingVolume),
                    Index            = t.Index,
                    Role             = (Contracts.Cqrs.Models.Enums.TradeRole)(int) t.Role,
                    FeeSize          = ParseNullabe(t.Fees?.FirstOrDefault()?.Volume),
                    FeeAssetId       = t.Fees?.FirstOrDefault()?.AssetId,
                    OppositeWalletId = Guid.Parse(t.OppositeWalletId),
                }).ToList()
            }).ToList();

            foreach (var order in orders.Where(x => _walletIds.Contains(x.WalletId.ToString())))
            {
                _log.Info("Order from ME", $"order: {new {order.Id, order.Status, message.Header.SequenceNumber}.ToJson()}");
            }

            var @event = new ExecutionProcessedEvent
            {
                SequenceNumber = message.Header.SequenceNumber,
                Orders         = orders
            };

            _cqrsEngine.PublishEvent(@event, BoundedContext.Name);

            foreach (var order in orders.Where(x => x.Trades != null && x.Trades.Any()))
            {
                var tradeProcessedEvent = new ManualOrderTradeProcessedEvent
                {
                    Order = order
                };
                _cqrsEngine.PublishEvent(tradeProcessedEvent, BoundedContext.Name);
            }

            foreach (var order in message.Orders.Where(x => x.Trades != null && x.Trades.Count > 0))
            {
                var orderType = order.OrderType == OrderType.Market ? FeeOperationType.Trade : FeeOperationType.LimitTrade;
                var orderId   = order.Id;
                foreach (var trade in order.Trades)
                {
                    if (trade.Fees != null)
                    {
                        var feeEvent = new FeeChargedEvent
                        {
                            OperationId   = orderId,
                            OperationType = orderType,
                            Fee           = trade.Fees.ToJson()
                        };
                        _cqrsEngine.PublishEvent(feeEvent, BoundedContext.Name);
                    }
                }
            }

            var limitOrders = orders.Where(x => x.Type == Contracts.Cqrs.Models.Enums.OrderType.Limit ||
                                           x.Type == Contracts.Cqrs.Models.Enums.OrderType.StopLimit).ToList();

            foreach (var order in limitOrders.Where(x => x.Status == OrderStatus.Cancelled))
            {
                var orderCancelledEvent = new OrderCancelledEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId
                };
                _cqrsEngine.PublishEvent(orderCancelledEvent, BoundedContext.Name);
            }

            foreach (var order in limitOrders.Where(x => x.Status == OrderStatus.Placed))
            {
                var orderPlacedEvent = new OrderPlacedEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId,
                    CreateDt    = order.CreateDt
                };
                _cqrsEngine.PublishEvent(orderPlacedEvent, BoundedContext.Name);
            }

            foreach (var order in limitOrders.Where(x =>
                                                    (x.Status == OrderStatus.Matched || x.Status == OrderStatus.PartiallyMatched) &&
                                                    x.Trades.Any(t => t.Role == TradeRole.Taker)))
            {
                var orderPlacedEvent = new OrderPlacedEvent
                {
                    OrderId     = order.Id,
                    Status      = order.Status,
                    AssetPairId = order.AssetPairId,
                    Price       = order.Price,
                    Timestamp   = order.StatusDt,
                    Volume      = order.Volume,
                    WalletId    = order.WalletId,
                    CreateDt    = order.CreateDt
                };
                _cqrsEngine.PublishEvent(orderPlacedEvent, BoundedContext.Name);
            }

            return(Task.CompletedTask);
        }