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); }
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())); }