コード例 #1
0
        private async Task DepositDemoAssets(ClientWalletEntity wallet)
        {
            try
            {
                var asset = await _marketDataService.GetDefaultBaseAsset(wallet.Client.TenantId);

                var assets = await _marketDataService.GetAssetsByTenant(wallet.Client.TenantId);

                var eur = assets.FirstOrDefault(x => x.Symbol == "EUR");

                if (asset != null)
                {
                    await _cashInOutProcessor.ChangeBalance(wallet,
                                                            asset,
                                                            10000,
                                                            "Deposit demo amount");
                }

                if (eur != null)
                {
                    await _cashInOutProcessor.ChangeBalance(wallet,
                                                            eur,
                                                            10000,
                                                            "Deposit demo amount");
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Cannot register demo deposit: {ex.Message}");
            }
        }
コード例 #2
0
        public async Task <ClientWalletEntity> RegisterOrGetDefaultWallets(ClientIdentity client)
        {
            var existWallet = await _walletsWriter.TryGetAsync(ClientWalletEntity.GetPartitionKey(client.TenantId), ClientWalletEntity.GetRowKey(client.ClientId));

            if (existWallet != null)
            {
                return(existWallet);
            }

            bool result;

            do
            {
                var walletId = GenerateWalletId();

                var entity = ClientWalletEntity.Generate(client.TenantId, client.ClientId);
                entity.WalletId = walletId;
                entity.Type     = TradingWalletType.Trading;
                entity.Client   = client;

                var indexById = ClientWalletIndexByIdEntity.Generate(entity.Client.TenantId, walletId, entity.Client.ClientId);
                result = await _walletsByIdWriter.TryInsertAsync(indexById);

                if (result)
                {
                    await _walletsWriter.InsertOrReplaceAsync(entity);

                    return(entity);
                }

                _logger.LogInformation("Cannot insert new wallet with id={WalletId}. ClientId={clientId}, TenantId={TenamtId}", entity.WalletId, entity.Client.TenantId, entity.Client.ClientId);
            } while (true);
        }
コード例 #3
0
        public async Task <ClientWalletList> GetWalletsByClient(JetClientIdentity clientId)
        {
            _logger.LogInformation("Request wallets for Broker/Brand/Client: {brokerId}/{clientId}",
                                   clientId.BrokerId, clientId.ClientId);

            clientId.BrokerId.AddToActivityAsTag("brokerId");
            clientId.ClientId.AddToActivityAsTag("clientId");

            _logger.LogInformation("Request to get wallets. clientId: {clientText}", JsonSerializer.Serialize(clientId));

            using var activity  = MyTelemetry.StartActivity($"Use DB context {DatabaseContext.Schema}")?.AddTag("db-schema", DatabaseContext.Schema);
            await using var ctx = new DatabaseContext(_dbContextOptionsBuilder.Options);

            var list = await ctx.ClientWallet.Where(e => e.BrokerId == clientId.BrokerId && e.ClientId == clientId.ClientId)
                       .ToListAsync();

            if (!list.Any())
            {
                using var _ = MyTelemetry.StartActivity($"Create a new wallet");
                var wallet = new ClientWallet()
                {
                    IsDefault         = true,
                    IsInternal        = false,
                    EnableEarnProgram = true,
                    Name             = "spot",
                    WalletId         = GenerateDefaultWalletId(clientId.ClientId),
                    CreatedAt        = DateTime.UtcNow,
                    BaseAsset        = Program.Settings.BaseAssetSymbol,
                    EnableUseTestNet = Program.Settings.EnableUseTestNetByDefault
                };

                wallet.WalletId.AddToActivityAsTag("walletId");

                var entity = new ClientWalletEntity(clientId.BrokerId, clientId.ClientId, wallet);

                await ctx.UpsetAsync(new [] { entity });

                list.Add(entity);

                _logger.LogInformation("Created default wallet. Wallet: {walletJson}", JsonSerializer.Serialize(entity));
            }

            foreach (var clientWalletEntity in list.Where(e => string.IsNullOrWhiteSpace(e.BaseAsset)))
            {
                clientWalletEntity.BaseAsset = Program.Settings.BaseAssetSymbol;
            }

            await UpdateCache(clientId.ClientId, clientId.BrokerId, list);

            return(new ClientWalletList()
            {
                Wallets = list.Select(e => new ClientWallet()
                {
                    IsDefault = e.IsDefault, Name = e.Name,
                    WalletId = e.WalletId, CreatedAt = e.CreatedAt, BaseAsset = e.BaseAsset,
                    EnableUseTestNet = e.EnableUseTestNet, IsInternal = e.IsInternal, EnableEarnProgram = e.EnableEarnProgram
                }).ToList()
            });
        }
コード例 #4
0
        public async Task ChangeBalance(ClientWalletEntity wallet,
                                        Asset asset,
                                        decimal amount,
                                        string comment)
        {
            var operationId = Guid.NewGuid().ToString("N");

            var request = new CashInOutOperation
            {
                BrokerId    = wallet.Client.TenantId,
                AccountId   = (ulong)wallet.Client.ClientId,
                WalletId    = (ulong)wallet.WalletId,
                AssetId     = asset.Symbol,
                Description = comment,
                Volume      = amount.ToString(CultureInfo.InvariantCulture),
                Id          = operationId
            };

            _logger.LogInformation($"CashInRequest: {request.ToJson()}");

            var response = await _matchingEngineClient.CashOperations.CashInOutAsync(request);

            _logger.LogInformation(
                "ME operations {MeOperation}, Id: {OperationId}. Status: {MeStatus}, Reason: {MeReason}; BrokerId: {TenantId}; AccountId: {AccountId}; WalletId: {WalletId}; Asset: {AssetSymbol}; Volume: {Volume}",
                "CashInOut",
                operationId,
                response.Status.ToString(),
                response.StatusReason,
                wallet.Client.TenantId,
                (ulong)wallet.Client.ClientId,
                (ulong)wallet.WalletId,
                asset.Symbol,
                amount);

            if (response.Status != Status.Ok)
            {
                throw new MatchingEngineException(response.Status.ToString(),
                                                  response.StatusReason,
                                                  "CashInOutAsync",
                                                  "CashOperations",
                                                  request,
                                                  response);
            }
        }
コード例 #5
0
        public async Task <CreateWalletResponse> CreateWalletAsync(CreateWalletRequest request)
        {
            using var _ = MyTelemetry.StartActivity($"Create a new wallet");
            request.Name.AddToActivityAsTag("wallet-name");
            request.ClientId.ClientId.AddToActivityAsTag("clientId");
            request.ClientId.BrokerId.AddToActivityAsTag("brokerId");

            _logger.LogInformation("Request to create wallet. Request: {requestText}", JsonSerializer.Serialize(request));

            if (string.IsNullOrEmpty(request.ClientId?.ClientId) ||
                string.IsNullOrEmpty(request.ClientId?.BrokerId) ||
                string.IsNullOrEmpty(request.Name) ||
                string.IsNullOrWhiteSpace(request.BaseAsset))
            {
                _logger.LogError("Cannot create wallet. BadRequest.");
                return(new CreateWalletResponse()
                {
                    Success = false,
                    ErrorMessage = "Bad request"
                });
            }

            var index = DateTimeOffset.UtcNow.ToUnixTimeSeconds();

            var wallet = new ClientWallet()
            {
                IsDefault         = false,
                IsInternal        = false,
                EnableEarnProgram = true,
                Name             = request.Name,
                WalletId         = $"{Program.Settings.WalletPrefix}{request.ClientId.ClientId}-{index}",
                CreatedAt        = DateTime.UtcNow,
                BaseAsset        = request.BaseAsset,
                EnableUseTestNet = Program.Settings.EnableUseTestNetByDefault
            };

            wallet.WalletId.AddToActivityAsTag("walletId");

            var entity = new ClientWalletEntity(request.ClientId.BrokerId, request.ClientId.ClientId, wallet);

            await using var ctx = new DatabaseContext(_dbContextOptionsBuilder.Options);
            await ctx.ClientWallet.AddAsync(entity);

            await ctx.SaveChangesAsync();

            var list = await ctx.ClientWallet
                       .Where(e => e.ClientId == request.ClientId.ClientId && e.BrokerId == request.ClientId.BrokerId)
                       .ToListAsync();

            await UpdateCache(request.ClientId.ClientId, request.ClientId.BrokerId, list);

            _logger.LogInformation("Wallet created. Wallet: {walletJson}", JsonSerializer.Serialize(entity));

            return(new CreateWalletResponse()
            {
                Success = true,
                Name = request.Name,
                WalletId = wallet.WalletId,
                CreatedAt = wallet.CreatedAt
            });
        }