Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
            }
        }