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
                    }
                });
            }
        }
Beispiel #2
0
        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)}");
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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"));
        }
Beispiel #5
0
        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));
        }