Ejemplo n.º 1
0
        internal static HistoryEntity Map(BaseHistoryRecord entity)
        {
            if (entity == null)
            {
                return(null);
            }

            switch (entity)
            {
            case Cashin cashin:
                return(Mapper.Map <HistoryEntity>(cashin));

            case Cashout cashout:
                return(Mapper.Map <HistoryEntity>(cashout));

            case Trade trade:
                return(Mapper.Map <HistoryEntity>(trade));

            case OrderEvent orderEvent:
                return(Mapper.Map <HistoryEntity>(orderEvent));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public async Task <bool> TryInsertAsync(BaseHistoryRecord entity)
        {
            using (var connection = await _connectionFactory.CreateNpgsqlConnection())
            {
                var result = await connection.ExecuteAsync(_insertQuery, HistoryTypeMapper.Map(entity));

                return(result > 0);
            }
        }
Ejemplo n.º 3
0
        public async Task <bool> TryInsertAsync(BaseHistoryRecord entity)
        {
            if (await GetAsync(entity.Id, entity.WalletId) == null)
            {
                _data.Add(entity);
                return(true);
            }

            return(false);
        }
        private async Task ProcessMessageAsync(CashTransferEvent message)
        {
            var fees              = message.CashTransfer.Fees;
            var fee               = fees?.FirstOrDefault()?.Transfer;
            var operationId       = Guid.Parse(message.Header.RequestId);
            var fromWallet        = Guid.Parse(message.CashTransfer.FromWalletId);
            var toWallet          = Guid.Parse(message.CashTransfer.ToWalletId);
            var volume            = decimal.Parse(message.CashTransfer.Volume);
            var timestamp         = message.Header.Timestamp;
            var assetId           = message.CashTransfer.AssetId;
            var feeSourceWalletId = fee != null?Guid.Parse(fee.SourceWalletId) : (Guid?)null;

            var feeSize = ParseNullabe(fee?.Volume);

            var cashInOuts = new BaseHistoryRecord[] {
                new Cashout()
                {
                    Id        = operationId,
                    WalletId  = fromWallet,
                    Volume    = -Math.Abs(volume),
                    Timestamp = timestamp,
                    AssetId   = assetId,
                    FeeSize   = fromWallet == feeSourceWalletId ? feeSize : null,
                    State     = Antares.Service.History.Core.Domain.Enums.HistoryState.Finished
                },
                new Cashin()
                {
                    Id        = operationId,
                    WalletId  = toWallet,
                    Volume    = Math.Abs(volume),
                    Timestamp = timestamp,
                    AssetId   = assetId,
                    FeeSize   = toWallet == feeSourceWalletId ? feeSize : null,
                    State     = Antares.Service.History.Core.Domain.Enums.HistoryState.Finished
                }
            };

            foreach (var cashInOut in cashInOuts)
            {
                if (!await _historyRecordsRepository.TryInsertAsync(cashInOut))
                {
                    _log.Warning($"Skipped duplicated transfer record", context: new
                    {
                        id = operationId
                    });
                }
            }
        }
        public static HistoryResponseItem Map(BaseHistoryRecord baseHistoryRecord)
        {
            var item = new HistoryResponseItem()
            {
                Id        = baseHistoryRecord.Id.ToString(),
                Timestamp = baseHistoryRecord.Timestamp.ToUniversalTime().ToTimestamp(),
                WalletId  = baseHistoryRecord.WalletId.ToString(),
            };

            switch (baseHistoryRecord.Type)
            {
            case HistoryType.CashIn:
            {
                var cashinModel = (Antares.Service.History.Core.Domain.History.Cashin)baseHistoryRecord;
                item.Type   = GrpcContract.Common.HistoryType.CashIn;
                item.CashIn = new CashInModel()
                {
                    AssetId        = cashinModel.AssetId,
                    BlockchainHash = cashinModel.BlockchainHash,
                    FeeSize        = cashinModel.FeeSize,
                    Volume         = cashinModel.Volume
                };
                break;
            }

            case HistoryType.CashOut:
            {
                var cashout = (Antares.Service.History.Core.Domain.History.Cashout)baseHistoryRecord;
                item.Type    = GrpcContract.Common.HistoryType.CashOut;
                item.CashOut = new CashOutModel()
                {
                    AssetId        = cashout.AssetId,
                    BlockchainHash = cashout.BlockchainHash,
                    FeeSize        = cashout.FeeSize,
                    Volume         = cashout.Volume
                };
                break;
            }

            case HistoryType.Trade:
            {
                var trade = (Antares.Service.History.Core.Domain.History.Trade)baseHistoryRecord;
                item.Type  = GrpcContract.Common.HistoryType.Trade;
                item.Trade = new TradeModel()
                {
                    FeeSize        = trade.FeeSize,
                    AssetPairId    = trade.AssetPairId,
                    OrderId        = trade.OrderId.ToString(),
                    BaseAssetId    = trade.BaseAssetId,
                    BaseVolume     = trade.BaseVolume,
                    FeeAssetId     = trade.FeeAssetId,
                    Index          = trade.Index,
                    Price          = trade.Price,
                    QuotingAssetId = trade.QuotingAssetId,
                    QuotingVolume  = trade.QuotingVolume,
                    Role           = trade.Role switch
                    {
                        TradeRole.Unknown => GrpcContract.Common.TradeRole.Unknown,
                        TradeRole.Maker => GrpcContract.Common.TradeRole.Maker,
                        TradeRole.Taker => GrpcContract.Common.TradeRole.Taker,
                        _ => throw new ArgumentOutOfRangeException(nameof(trade.Role), trade.Role, null)
                    }
                };
                break;
            }

            case HistoryType.OrderEvent:
            {
                var orderEvent = (Antares.Service.History.Core.Domain.History.OrderEvent)baseHistoryRecord;
                item.Type       = GrpcContract.Common.HistoryType.OrderEvent;
                item.OrderEvent = new OrderEventModel()
                {
                    AssetPairId = orderEvent.AssetPairId,
                    OrderId     = orderEvent.OrderId.ToString(),
                    Price       = orderEvent.Price,
                    Status      = orderEvent.Status switch
                    {
                        OrderStatus.Unknown => GrpcContract.Common.OrderStatus.UnknownOrder,
                        OrderStatus.Placed => GrpcContract.Common.OrderStatus.Placed,
                        OrderStatus.PartiallyMatched => GrpcContract.Common.OrderStatus.PartiallyMatched,
                        OrderStatus.Matched => GrpcContract.Common.OrderStatus.Matched,
                        OrderStatus.Pending => GrpcContract.Common.OrderStatus.Pending,
                        OrderStatus.Cancelled => GrpcContract.Common.OrderStatus.Cancelled,
                        OrderStatus.Replaced => GrpcContract.Common.OrderStatus.Replaced,
                        OrderStatus.Rejected => GrpcContract.Common.OrderStatus.Rejected,
                        _ => throw new ArgumentOutOfRangeException(nameof(orderEvent.Status), orderEvent.Status, null)
                    },
                    Volume = orderEvent.Volume
                };
                break;
            }