public async Task <CoinTransfer> SpendCoins(SpendCoins request) { var wallet = await firebaseDbService.GetWallet(request.Id); if (wallet is null) { throw new ArgumentNullException(nameof(wallet)); } if (string.IsNullOrWhiteSpace(request.ToAddress)) { throw new ArgumentNullException(nameof(request.ToAddress)); } var addressBalanceResult = await this.GetBalance(request.Id, request.Email); decimal addressBalance = addressBalanceResult.AvailableBalance; decimal addressBalanceConfirmed = addressBalanceResult.ConfirmedBalance; var info = await this.GetInfo(); if ((request.transferValue + info.RelayFee) >= addressBalanceConfirmed) { throw new Exception($"The address doesn't have enough funds! Relay fee {info.RelayFee} + {request.transferValue} = {(request.transferValue + info.RelayFee)}"); } var rpcResult = await rpcClient.SendCommandAsync(new RPCRequest(RPCOperations.sendfrom, new object[] { wallet.WalletId.ToString(), request.ToAddress, request.transferValue })); rpcResult.ThrowIfError(); return(new CoinTransfer()); }
public async Task <ActionResult <CoinTransfer> > SpendCoins([FromBody] SpendCoins request) { try { if (request is null || string.IsNullOrEmpty(request.ToAddress)) { return(BadRequest("Invalid request.")); } if (User.Identity.Name != request.Email) { return(BadRequest(RequestResponse.BadRequest("Invalid request. Please try again."))); } var result = await walletManagementService.SpendCoins(request); return(Ok(result)); } catch (Exception ex) { return(StatusCode((int)HttpStatusCode.InternalServerError, RequestResponse.InternalServerError(ex.Message))); } }