public async Task <IActionResult> VoteSDAProposal([FromBody] SDAVoteModel sDAVote)
        {
            if (!ModelState.IsValid)
            {
                return(this.BadRequest("Please enter all the required values."));
            }

            ApiResponse response = await this.apiRequester.VoteSDAProposalSmartContractCall(this.defaultEndpointsSettings, sDAVote);

            if (response == null || response.Content == null)
            {
                return(this.BadRequest("An error occurred trying to vote, please try again."));
            }

            if (!response.IsSuccess || response.IsSuccess && response.Content.transactionId == null)
            {
                return(this.BadRequest(GetBadResponseMessage(response)));
            }

            var cancellation = new CancellationTokenSource(TimeSpan.FromMinutes(5));

            ApiResponse responseReceipt;

            do
            {
                responseReceipt = await this.apiRequester.GetRequestAsync(this.defaultEndpointsSettings.SidechainNode, "/api/SmartContracts/receipt", $"txHash={response.Content.transactionId}").ConfigureAwait(false);

                if (!responseReceipt.IsSuccess)
                {
                    if (cancellation.IsCancellationRequested)
                    {
                        return(this.BadRequest($"The request timed out getting receipt for '{response.Content.transactionId}'"));
                    }

                    await Task.Delay(TimeSpan.FromSeconds(5));

                    continue;
                }

                if ((bool)responseReceipt.Content.success)
                {
                    return(this.Ok());
                }
                else
                {
                    return(this.BadRequest((string)responseReceipt.Content.error));
                }
            } while (true);
        }
Esempio n. 2
0
        public async Task <ApiResponse> VoteSDAProposalSmartContractCall(DefaultEndpointsSettings settings, SDAVoteModel sDAVote)
        {
            try
            {
                List <WalletAddress> walletAddresses = new List <WalletAddress>();

                ApiResponse responseWalletAddress = await GetRequestAsync(settings.SidechainNode, "/api/Wallet/addresses", $"WalletName={sDAVote.WalletName}" + "&" + $"AccountName=account 0").ConfigureAwait(false);

                if (responseWalletAddress.IsSuccess)
                {
                    var items = JsonConvert.DeserializeObject(responseWalletAddress.Content.addresses.ToString());
                    walletAddresses = JsonConvert.DeserializeObject <List <WalletAddress> >(responseWalletAddress.Content.addresses.ToString());

                    var usedWalletAddress = walletAddresses.FindAll(x => x.IsUsed).FirstOrDefault();

                    var sDAVoteContractCall = new SDAVoteContractCall
                    {
                        GasPrice        = 100,
                        GasLimit        = 50000,
                        WalletName      = sDAVote.WalletName,
                        Password        = sDAVote.WalletPassword,
                        Amount          = 0,
                        FeeAmount       = 0.001,
                        MethodName      = "Vote",
                        AccountName     = "account 0",
                        ContractAddress = settings.SDADaoContractAddress,
                        Sender          = usedWalletAddress.Address,
                        Parameters      = new string[] { "5#" + sDAVote.ProposalId, "1#" + sDAVote.VotingDecision },
                    };

                    ApiResponse response = await PostRequestAsync(settings.SidechainNode, "/api/SmartContracts/build-and-send-call", sDAVoteContractCall).ConfigureAwait(false);

                    return(response);
                }
                else
                {
                    return(responseWalletAddress);
                }
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, "Failed to vote on the SDA Proposal");
            }

            return(null);
        }