Ejemplo n.º 1
0
        public async Task <ChangeBalanceGrpcResponse> BlockchainDepositAsync(BlockchainDepositGrpcRequest request)
        {
            _logger.LogInformation($"Blockchain deposit request: {JsonConvert.SerializeObject(request)}");

            request.ClientId.AddToActivityAsTag("clientId");
            request.BrokerId.AddToActivityAsTag("brokerId");
            request.WalletId.AddToActivityAsTag("walletId");

            if (request.Amount <= 0)
            {
                _logger.LogError(
                    "Blockchain deposit cannot decrease balance. Amount: {amount}, TransactionId: {transactionId}",
                    request.Amount, request.TransactionId);
                Activity.Current?.SetStatus(Status.Error);
                Activity.Current?.AddTag("message", "Blockchain deposit cannot decrease balance");
                return(new ChangeBalanceGrpcResponse()
                {
                    Result = false,
                    TransactionId = request.TransactionId,
                    ErrorMessage = "Blockchain deposit cannot decrease balance.",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.BadRequest
                });
            }

            var result = await ChangeBalanceAsync(request.TransactionId, request.WalletId,
                                                  request.Amount, request.AssetSymbol, request.BrokerId, "Blockchain Deposit",
                                                  new AssetFees { FeeType = FeeType.NoFee });

            if (!result.Result)
            {
                _logger.LogError(
                    $"Cannot apply 'Blockchain deposit'. Message: {result.ErrorMessage}. Request: {JsonConvert.SerializeObject(request)}");
                Activity.Current?.SetStatus(Status.Error);
                Activity.Current?.AddTag("message", "Cannot apply 'Blockchain deposit'");
                result.AddToActivityAsJsonTag("change-balance-response");
            }

            return(result);
        }
Ejemplo n.º 2
0
        public async Task <RetryDepositResponse> RetryDeposit(RetryDepositRequest request)
        {
            using var activity = MyTelemetry.StartActivity("Handle deposit manual retry")
                                 .AddTag("DepositId", request.DepositId);
            _logger.LogInformation("Handle deposit manual retry: {depositId}", request.DepositId);
            try
            {
                await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options);

                var deposit = await context.Deposits.FindAsync(request.DepositId);

                if (deposit == null)
                {
                    _logger.LogInformation("Unable to find deposit with id {depositId}", request.DepositId);
                    return(new RetryDepositResponse
                    {
                        Success = false,
                        ErrorMessage = "Unable to find deposit",
                        DepositId = request.DepositId
                    });
                }

                if (deposit.Status == DepositStatus.Processed)
                {
                    _logger.LogInformation("Deposit {depositId} already processed", request.DepositId);
                    return(new RetryDepositResponse
                    {
                        Success = true,
                        DepositId = request.DepositId
                    });
                }

                var changeBalanceRequest = new BlockchainDepositGrpcRequest
                {
                    WalletId      = deposit.WalletId,
                    ClientId      = deposit.ClientId,
                    Amount        = deposit.Amount,
                    AssetSymbol   = deposit.AssetSymbol,
                    BrokerId      = deposit.BrokerId,
                    Integration   = deposit.Integration,
                    TransactionId = deposit.MatchingEngineId,
                    Comment       = deposit.Comment,
                    Txid          = deposit.Txid
                };

                var resp = await _changeBalanceService.BlockchainDepositAsync(changeBalanceRequest);

                if (!resp.Result)
                {
                    _logger.LogError("Cannot deposit to ME. Error: {errorText}", resp.ErrorMessage);
                    deposit.RetriesCount++;
                    deposit.LastError = resp.ErrorMessage;
                    if (deposit.RetriesCount >=
                        Program.ReloadedSettings(e => e.DepositsRetriesLimit).Invoke())
                    {
                        deposit.Status = DepositStatus.Error;
                    }
                }

                deposit.MatchingEngineId = resp.TransactionId;
                deposit.Status           = DepositStatus.Processed;

                await context.UpdateAsync(new List <DepositEntity> {
                    deposit
                });

                _logger.LogInformation("Handled deposit manual retry: {depositId}", request.DepositId);
                return(new RetryDepositResponse
                {
                    Success = true,
                    DepositId = request.DepositId
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Cannot Handle deposits");
                ex.FailActivity();

                return(new RetryDepositResponse
                {
                    Success = false,
                    ErrorMessage = $"Internal error {ex.Message}",
                    DepositId = request.DepositId
                });
            }
        }
        private async Task DoTime()
        {
            using var activity = MyTelemetry.StartActivity("Handle deposits");
            try
            {
                await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options);

                var sw = new Stopwatch();
                sw.Start();

                var deposits = await context.Deposits.Where(e => e.Status == DepositStatus.New).ToListAsync();

                foreach (var deposit in deposits)
                {
                    var request = new BlockchainDepositGrpcRequest
                    {
                        WalletId      = deposit.WalletId,
                        ClientId      = deposit.ClientId,
                        Amount        = deposit.Amount,
                        AssetSymbol   = deposit.AssetSymbol,
                        BrokerId      = deposit.BrokerId,
                        Integration   = deposit.Integration,
                        TransactionId = deposit.MatchingEngineId,
                        Comment       = deposit.Comment,
                        Txid          = deposit.Txid
                    };

                    var resp = await _changeBalanceService.BlockchainDepositAsync(request);

                    if (!resp.Result)
                    {
                        _logger.LogError("Cannot deposit to ME. Error: {errorText}", resp.ErrorMessage);
                        deposit.RetriesCount++;
                        deposit.LastError = resp.ErrorMessage;
                        if (deposit.RetriesCount >=
                            Program.ReloadedSettings(e => e.DepositsRetriesLimit).Invoke())
                        {
                            deposit.Status = DepositStatus.Error;
                            await _depositPublisher.PublishAsync(new Deposit(deposit));
                        }
                        continue;
                    }

                    deposit.MatchingEngineId = resp.TransactionId;
                    deposit.Status           = DepositStatus.Processed;

                    await _depositPublisher.PublishAsync(new Deposit(deposit));
                }

                await context.UpdateAsync(deposits);

                deposits.Count.AddToActivityAsTag("deposits-count");

                sw.Stop();
                if (deposits.Count > 0)
                {
                    _logger.LogInformation("Handled {countTrade} deposits. Time: {timeRangeText}", deposits.Count,
                                           sw.Elapsed.ToString());
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Cannot Handle deposits");
                ex.FailActivity();

                throw;
            }

            _timer.ChangeInterval(
                TimeSpan.FromSeconds(Program.ReloadedSettings(e => e.DepositsProcessingIntervalSec).Invoke()));
        }