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