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); }
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); }