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());
        }
示例#2
0
        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)));
            }
        }