public override async Task <CreateWithdrawalResponse> CreateWithdrawal(CreateWithdrawalRequest request, ServerCallContext context) { try { var result = await _siriusWalletsService.CreateWithdrawalAsync( request.RequestId, context.GetHttpContext().User.GetClientId(), context.GetHttpContext().User.GetWalletId(), request.AssetId, decimal.Parse(request.Volume), request.DestinationAddress, request.DestinationAddressExtension); return(new CreateWithdrawalResponse { Payload = result.ToString() }); } catch (HftApiException e) { return(new CreateWithdrawalResponse { Error = new Error { Code = _mapper.Map <ErrorCode>(e.ErrorCode), Message = e.Message } }); } }
public async Task <WithdrawalResponse> CreateWithdrawal(CreateWithdrawalRequest request) { request.SignRequest(this._signatureService); var withdrawal = await this.AuthenticatedSendAsync <CreateWithdrawalRequest, WithdrawalResponse>(request, request.Request(this._apiKey.Host)); if (withdrawal.Signature == withdrawal.CalculateSignature(this._signatureService)) { return(withdrawal); } throw new Exception($"Signature error, response signature: {withdrawal.Signature}, calculated signature: {withdrawal.CalculateSignature(this._signatureService)}"); }
public async Task <IActionResult> CreateWithdrawalAsync( [Required, FromHeader(Name = "X-Request-ID")] string requestId, [FromBody] CreateWithdrawalRequest request) { var withdrawalId = await _siriusWalletsService.CreateWithdrawalAsync(requestId, User.GetClientId(), User.GetWalletId(), request.AssetId, request.Volume, request.DestinationAddress, request.DestinationAddressExtension); return(Ok(withdrawalId)); }
public async Task Withdrawal_Amount_Cannot_Leave_Account_In_Negative() { //Arrange var dataContext = new DataContext(_dataContextOptions.Options); IRepository <Account> accountRepository = new AccountRepository(dataContext); IRepository <Transaction> transactionRepository = new TransactionRepository(dataContext); IUnitOfWork unitOfWork = new UnitOfWork(dataContext, accountRepository, transactionRepository); IGenerateId idGenerator = new IdGenerator(); CancellationToken token = new CancellationToken(); var mockRates = new Mock <IRatesService>(); mockRates.Setup(a => a.GetExchangeRate(It.IsAny <Currency>(), It.IsAny <Currency>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => new Rate("GBP", "GBP", 0.79m, DateTime.Now)); //Act RatesApiOption ratesApiOption = new RatesApiOption("someurl", "USD"); IAccountService accountService = new AccountService(_mockAccountActionLogger.Object, unitOfWork, idGenerator); AccountCreationSummary accountCreationSummary = await accountService.CreateAccount(new CreateAccount("Jared", Amount.FromInput(100m))); AccountController accountController = new AccountController(_mockAccountControllerLogger.Object, accountService, mockRates.Object, ratesApiOption); CreateWithdrawalRequest request = new CreateWithdrawalRequest { AccountId = accountCreationSummary.AccountId, Amount = 101m }; var result = (await accountController.Withdraw(request, token) as ObjectResult); Assert.That(accountCreationSummary, Is.Not.Null); Assert.That(accountCreationSummary.AccountId, Is.Not.Empty); Assert.That(result, Is.Not.Null); Assert.That(result.Value, Contains.Substring("amount is greater than balance")); }
public async Task Withdrawal_Fails_If_Account_Id_Is_Invalid() { //Arrange var dataContext = new DataContext(_dataContextOptions.Options); IRepository <Account> accountRepository = new AccountRepository(dataContext); IRepository <Transaction> transactionRepository = new TransactionRepository(dataContext); IUnitOfWork unitOfWork = new UnitOfWork(dataContext, accountRepository, transactionRepository); IGenerateId idGenerator = new IdGenerator(); CancellationToken token = new CancellationToken(); string accountIdInvalid = "Invalid account id"; var mockRates = new Mock <IRatesService>(); mockRates.Setup(a => a.GetExchangeRate(It.IsAny <Currency>(), It.IsAny <Currency>(), It.IsAny <CancellationToken>())) .ReturnsAsync(() => new Rate("GBP", "GBP", 0.79m, DateTime.Now)); //Act RatesApiOption ratesApiOption = new RatesApiOption("someurl", "USD"); IAccountService accountService = new AccountService(_mockAccountActionLogger.Object, unitOfWork, idGenerator); AccountController accountController = new AccountController(_mockAccountControllerLogger.Object, accountService, mockRates.Object, ratesApiOption); CreateWithdrawalRequest request = new CreateWithdrawalRequest { AccountId = accountIdInvalid, Amount = 101m }; var result = (await accountController.Withdraw(request, token) as ObjectResult); Assert.That(result, Is.Not.Null); Assert.That(result.Value, Contains.Substring("Account id not be found")); }
public async Task <IActionResult> Withdraw(CreateWithdrawalRequest request, CancellationToken token) { _logger.LogInformation($"{nameof(AccountController)}.{nameof(Withdraw)} - {request}"); if (!ModelState.IsValid) { return(BadRequest($"Problem with CreateWithdrawalRequest")); } CreateWithdrawal withdraw = new CreateWithdrawal(request.AccountId, Amount.FromInput(request.Amount)); WithdrawalResult withdrawalResult = await _accountService.WithDraw(withdraw); if (withdrawalResult.Status == AccountStatus.Error) { return(BadRequest($"{withdrawalResult.Message}")); } AccountWithdrawalResponse response = new AccountWithdrawalResponse(withdrawalResult.AccountId, withdrawalResult.Amount.Value, withdrawalResult.OldBalance.Value, withdrawalResult.NewBalance.Value); return(Ok(response)); }
public static Task <CreateWithdrawalResponse> CreateWithdrawal(CreateWithdrawalRequest request) { var req = new HttpUrlRequest(request); return(process <CreateWithdrawalResponse>(req)); }