示例#1
0
        private async Task <ChangeBalanceGrpcResponse> ExecuteInternalTransferAsync(string transactionId,
                                                                                    string fromClientId, string fromWalletId, string toWalletId, decimal amount, string assetSymbol, string assetBrokerId)

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

            //todo: убрать тут передачу бренда в принципе
            var wallets =
                await _clientWalletService.GetWalletsByClient(
                    new JetClientIdentity(assetBrokerId, "brand-to-remove", fromClientId));

            var wallet = wallets?.Wallets.FirstOrDefault(e => e.WalletId == fromWalletId);

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

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

            if (wallet == null)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = "Cannot transfer funds, wallet do not found.",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.WalletDoNotFound
                });
            }

            var balanceChangeRequest = new ExBalanceUpdateInstruction
            {
                OperationId = transactionId,
                EventType   = "Internal Transfer",
                Timestamp   = DateTime.UtcNow,
                Updates     = new List <ExBalanceUpdateInstruction.BalanceUpdate>
                {
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = fromWalletId,
                        AssetId       = asset.Symbol,
                        Number        = 1,
                        Amount        = -(decimal)amount,
                        ReserveAmount = 0
                    },
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = toWalletId,
                        AssetId       = asset.Symbol,
                        Number        = 2,
                        Amount        = (decimal)amount,
                        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 transfer funds, 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
            });
        }
示例#2
0
        private async Task <ChangeBalanceGrpcResponse> ExecuteSwapAsync(string transactionId, string walletId1,
                                                                        string assetSymbol1, decimal amount1, string walletId2, string assetSymbol2, decimal amount2, string brokerId)
        {
            var asset1 = _assetsDictionaryClient.GetAssetById(new AssetIdentity()
            {
                BrokerId = brokerId,
                Symbol   = assetSymbol1
            });
            var asset2 = _assetsDictionaryClient.GetAssetById(new AssetIdentity()
            {
                BrokerId = brokerId,
                Symbol   = assetSymbol2
            });

            if (asset1 == null || asset2 == null)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = "Cannot swap funds, asset do not found",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.AssetDoNotFound
                });
            }

            if (!asset1.IsEnabled || !asset2.IsEnabled)
            {
                return(new ChangeBalanceGrpcResponse()
                {
                    TransactionId = transactionId,
                    Result = false,
                    ErrorMessage = "Cannot swap funds, asset is Disabled.",
                    ErrorCode = ChangeBalanceGrpcResponse.ErrorCodeEnum.AssetIsDisabled
                });
            }

            var balanceChangeRequest = new ExBalanceUpdateInstruction
            {
                OperationId = transactionId,
                EventType   = "Swap",
                Timestamp   = DateTime.UtcNow,
                Updates     = new List <ExBalanceUpdateInstruction.BalanceUpdate>
                {
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = walletId1,
                        AssetId       = asset1.Symbol,
                        Number        = 1,
                        Amount        = -(decimal)amount1,
                        ReserveAmount = 0
                    },
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = walletId1,
                        AssetId       = asset2.Symbol,
                        Number        = 2,
                        Amount        = (decimal)amount2,
                        ReserveAmount = 0
                    },
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = walletId2,
                        AssetId       = asset1.Symbol,
                        Number        = 3,
                        Amount        = (decimal)amount1,
                        ReserveAmount = 0
                    },
                    new ExBalanceUpdateInstruction.BalanceUpdate
                    {
                        WalletId      = walletId2,
                        AssetId       = asset2.Symbol,
                        Number        = 4,
                        Amount        = -(decimal)amount2,
                        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 transfer funds, 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
            });
        }
示例#3
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
            });
        }