public async Task <ChangeBalanceGrpcResponse> BlockchainFeeApplyAsync(BlockchainFeeApplyGrpcRequest request) { _logger.LogInformation("BlockchainFeeApplyGrpcRequest receive: {jsonText}", JsonConvert.SerializeObject(request)); request.BrokerId.AddToActivityAsTag("brokerId"); request.WalletId.AddToActivityAsTag("walletId"); var result = await ChangeBalanceAsync( Guid.NewGuid().ToString(), request.FeeWalletId, -request.FeeAmount, request.AssetSymbol, request.BrokerId, "Fee Deduction", new AssetFees { FeeType = FeeType.NoFee }); if (!result.Result) { _logger.LogError( $"Cannot apply 'Blockchain fee'. Message: {result.ErrorMessage}. Request: {JsonConvert.SerializeObject(request)}"); Activity.Current?.SetStatus(Status.Error); Activity.Current?.AddTag("message", "Cannot apply 'Blockchain fee'"); result.AddToActivityAsJsonTag("change-balance-response"); } return(result); }
private async Task HandleTransactionFee(SignalCircleTransfer transfer) { using var activity = MyTelemetry.StartActivity("Handle event SignalCircleTransfer"); transfer.AddToActivityAsTag("circle-transfer"); try { await using var context = new DatabaseContext(_dbContextOptionsBuilder.Options); var withdrawal = await context.Withdrawals .Where(e => e.Integration == "Circle" && e.ExternalSystemId == transfer.PaymentInfo.Id) .FirstOrDefaultAsync(); if (withdrawal == null) { _logger.LogError("Unable to find withdrawal with external system id {withdrawalId}", transfer.PaymentInfo.Id); return; } withdrawal.Status = Domain.Models.WithdrawalStatus.Success; withdrawal.Txid = transfer.PaymentInfo.TransactionHash; if (!string.IsNullOrEmpty(transfer.PaymentInfo?.Fees?.Currency)) { var asset = _circleAssetMapper.CircleAssetToAsset(withdrawal.BrokerId, transfer.PaymentInfo.Fees.Currency); if (asset == null) { _logger.LogError("Unknown fees asset: {asset}", transfer.PaymentInfo.Fees.Currency); await context.UpdateAsync(withdrawal); return; } var feeStr = transfer.PaymentInfo.Fees.Amount; if (!decimal.TryParse(feeStr, out var fee)) { _logger.LogError( "Cannot read fee from circle transaction. FeeString {feeString}, coin: {coin}, id: {id}", feeStr, asset.AssetTokenSymbol, transfer.PaymentInfo.Id); activity?.SetStatus(Status.Error); await context.UpdateAsync(withdrawal); return; } withdrawal.WalletId.AddToActivityAsTag("walletId"); var request = new BlockchainFeeApplyGrpcRequest() { WalletId = withdrawal.WalletId, BrokerId = withdrawal.BrokerId, TransactionId = transfer.PaymentInfo.TransactionHash, AssetSymbol = asset.AssetSymbol, FeeAmount = fee }; request.AddToActivityAsJsonTag("fee-apply-request"); var result = await _changeBalanceService.BlockchainFeeApplyAsync(request); if (result.ErrorCode != ChangeBalanceGrpcResponse.ErrorCodeEnum.Ok || !result.Result) { _logger.LogError("Cannot apply fee. Request: {requestText}. Error: {jsonText}", JsonConvert.SerializeObject(request), JsonConvert.SerializeObject(result)); activity?.SetStatus(Status.Error); } else { _logger.LogInformation("Success apply fee. Request: {requestText}", JsonConvert.SerializeObject(request)); } withdrawal.ActualFee = fee; withdrawal.ActualFeeAssetSymbol = asset.AssetTokenSymbol; } await context.UpdateAsync(withdrawal); } catch (Exception) { _logger.LogError("Unable to record actual tx fee for withdrawal with id {withdrawalId}", transfer.PaymentInfo.Id); } }