示例#1
0
        public async Task UpdateAssetFeesSettings(AssetFees settings)
        {
            using var action = MyTelemetry.StartActivity("Update Asset Fees Settings");
            settings.AddToActivityAsJsonTag("settings");
            try
            {
                _logger.LogInformation("Update Asset Fees Setting: {jsonText}",
                                       JsonConvert.SerializeObject(settings));

                ValidateSettings(settings);

                var entity = AssetFeesNoSqlEntity.Create(settings);

                var existingItem = await _writer.GetAsync(entity.PartitionKey, entity.RowKey);

                if (existingItem == null)
                {
                    throw new Exception("Cannot update Asset Fees Settings. Do not exist");
                }

                await _writer.InsertOrReplaceAsync(entity);

                _logger.LogInformation("Updated Asset Fees Setting: {jsonText}",
                                       JsonConvert.SerializeObject(settings));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Cannot update ExternalMarketSettings: {requestJson}",
                                 JsonConvert.SerializeObject(settings));
                ex.FailActivity();
                throw;
            }
        }
 public static AssetFeesNoSqlEntity Create(AssetFees assetFees)
 {
     return(new AssetFeesNoSqlEntity()
     {
         PartitionKey = GeneratePartitionKey(assetFees.BrokerId, assetFees.ProfileId),
         RowKey = GenerateRowKey(assetFees.AssetId, assetFees.OperationType),
         BrokerId = assetFees.BrokerId,
         AssetId = assetFees.AssetId,
         OperationType = assetFees.OperationType,
         AssetFees = assetFees
     });
 }
示例#3
0
        public async Task <NullableValue <AssetFees> > GetAssetFees(GetAssetFeesRequest request)
        {
            try
            {
                var fees = _client.GetAssetFees(request.BrokerId, request.GroupId, request.AssetId, request.OperationType);

                return(fees == null ? null : new NullableValue <AssetFees>(AssetFees.Create(fees)));
            }
            catch (Exception ex)
            {
                if (ex.Message == "Unknown HTTP result CodeNotFound. Message: Row not found")
                {
                    return(new NullableValue <AssetFees>());
                }
                throw;
            }
        }
示例#4
0
 private static void ValidateSettings(AssetFees settings)
 {
     if (string.IsNullOrEmpty(settings.BrokerId))
     {
         throw new Exception("Cannot add settings with empty broker");
     }
     if (string.IsNullOrEmpty(settings.ProfileId))
     {
         throw new Exception("Cannot add settings with empty profile");
     }
     if (string.IsNullOrEmpty(settings.AssetId))
     {
         throw new Exception("Cannot add settings with empty asset");
     }
     if (settings.FeeSize < 0)
     {
         throw new Exception("Cannot add settings with negative fee size");
     }
 }
示例#5
0
        public static Fee ConvertAssetFee(AssetFees assetFees)
        {
            var fee = new Fee {
                Type = ConvertFeeType(assetFees.FeeType)
            };

            if (fee.Type == FeeType.NoFee)
            {
                return(fee);
            }

            fee.SizeType = ConvertFeeSizeType(assetFees.FeeSizeType);
            fee.Size     = assetFees.FeeSize.ToString(CultureInfo.InvariantCulture);

            fee.TargetAccountId = assetFees.AccountId;
            fee.TargetWalletId  = assetFees.WalletId;
            if (!string.IsNullOrEmpty(assetFees.FeeAssetId))
            {
                fee.AssetId.Add(assetFees.FeeAssetId);
            }

            return(fee);
        }
示例#6
0
        private async Task <ChangeBalanceGrpcResponse> ChangeBalanceAsync(string transactionId,
                                                                          string walletId, decimal amount, string assetSymbol, string brokerId, string eventType, AssetFees assetFees)

        {
            var asset = _assetsDictionaryClient.GetAssetById(new AssetIdentity()
            {
                BrokerId = brokerId,
                Symbol   = assetSymbol
            });

            if (asset == null)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = "Cannot change balance, asset do not found",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.AssetDoNotFound
                });
            }

            if (!asset.IsEnabled)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = "Cannot change balance, asset is Disabled.",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.AssetIsDisabled
                });
            }

            var balanceChangeRequest = new ExBalanceUpdateInstruction
            {
                OperationId = transactionId,
                EventType   = eventType,
                Timestamp   = DateTime.UtcNow,
                Updates     = new List <ExBalanceUpdateInstruction.BalanceUpdate>
                {
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = walletId,
                        AssetId       = asset.Symbol,
                        Number        = 1,
                        Amount        = (decimal)amount,
                        ReserveAmount = 0
                    }
                }
            };

            if (assetFees != null && assetFees.FeeType != FeeType.NoFee && assetFees.FeeAssetId != assetSymbol)
            {
                //decimal check amount and fee, ensure that amount does not include fee
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = $"Fee asset {assetFees.FeeAssetId} is not equal to asset {assetSymbol}",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.Error
                });
            }

            if (assetFees != null && assetFees.FeeType != FeeType.NoFee)
            {
                balanceChangeRequest.Updates.Add(new ExBalanceUpdateInstruction.BalanceUpdate
                {
                    WalletId      = assetFees.WalletId,
                    AssetId       = assetFees.AssetId,
                    Number        = 2,
                    Amount        = (decimal)assetFees.FeeSize,
                    ReserveAmount = 0
                });
            }

            var balanceResponse = await _balanceOperationService.ProcessBalanceUpdate(balanceChangeRequest);

            _logger.LogInformation("BalanceService call. Request: {requestText}. Response: {responseText}",
                                   JsonConvert.SerializeObject(balanceChangeRequest), JsonConvert.SerializeObject(balanceResponse));

            if (balanceResponse.Result != ExBalanceUpdate.BalanceUpdateResult.Ok)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = $"Cannot change balance, error: {balanceResponse.Result}",
                    ErrorCode = balanceResponse.Result == ExBalanceUpdate.BalanceUpdateResult.LowBalance
                        ? ChangeBalanceGrpcResponse.ErrorCodeEnum.LowBalance
                        : ChangeBalanceGrpcResponse.ErrorCodeEnum.Error
                });
            }

            return(new ChangeBalanceGrpcResponse()
            {
                TransactionId = transactionId,
                Result = true,
                ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.Ok
            });
        }
示例#7
0
        public async Task <ChangeBalanceGrpcResponse> BlockchainWithdrawalAsync(BlockchainWithdrawalGrpcRequest request)
        {
            _logger.LogInformation($"Blockchain withdrawal request: {JsonConvert.SerializeObject(request)}");

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

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

            var fee = new AssetFees()
            {
                FeeType = FeeType.NoFee
            };

            if (request.FeeAmount != 0)
            {
                if (string.IsNullOrWhiteSpace(request.FeeWalletId))
                {
                    _logger.LogError(
                        "Can not send withdrawal without FeeWalletId. TransactionId: {transactionId}, walletId {walletId}",
                        request.TransactionId, request.WalletId);
                    Activity.Current?.SetStatus(Status.Error);
                    Activity.Current?.AddTag("message", "Can not send withdrawal without FeeWalletId");
                    return(new ChangeBalanceGrpcResponse()
                    {
                        Result = false,
                        TransactionId = request.TransactionId,
                        ErrorMessage = "Can not send withdrawal without FeeWalletId.",
                        ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.BadRequest
                    });
                }

                fee = new AssetFees
                {
                    BrokerId      = request.BrokerId,
                    AssetId       = request.FeeAssetSymbol,
                    OperationType = OperationType.Withdrawal,
                    FeeType       = FeeType.ClientFee,
                    FeeSizeType   = FeeSizeType.Absolute,
                    FeeSize       = request.FeeAmount,
                    WalletId      = request.FeeWalletId,
                    FeeAssetId    = request.FeeAssetSymbol
                };
            }

            var result = await ChangeBalanceAsync(request.TransactionId, request.WalletId,
                                                  request.Amount, request.AssetSymbol, request.BrokerId, "Blockchain Withdrawal", fee);

            if (!result.Result)
            {
                _logger.LogError(
                    $"Cannot apply 'Blockchain withdrawal'. 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);
        }