From 2f2a3fee27c1bc959a5c3b4c807fe7dd97f99a88 Mon Sep 17 00:00:00 2001 From: Richard Ramos Date: Wed, 30 May 2018 10:32:38 -0400 Subject: [PATCH] Added voting --- .../proposal-manager/proposal-manager.js | 2 + .../voting-dapp/proposal-container.js | 1 + app/components/voting-dapp/proposal-form.js | 52 ++++++++++++++++--- app/components/voting-dapp/proposal.js | 3 +- contracts/democracy/Democracy.sol | 3 +- contracts/democracy/ProposalManager.sol | 10 ++-- 6 files changed, 58 insertions(+), 13 deletions(-) diff --git a/app/components/proposal-manager/proposal-manager.js b/app/components/proposal-manager/proposal-manager.js index 4e943d6..36f4762 100644 --- a/app/components/proposal-manager/proposal-manager.js +++ b/app/components/proposal-manager/proposal-manager.js @@ -93,6 +93,8 @@ class ProposalManager extends Component { : '' }

Add proposal

+

Execute this on the console if proposal submit is not allowed

+ await ProposalCuration.methods.setSubmitPrice(web3.eth.defaultAccount, true, 1).send();

Price: {this.state.submitPrice}

diff --git a/app/components/voting-dapp/proposal-container.js b/app/components/voting-dapp/proposal-container.js index 0ad619d..5a5afb0 100644 --- a/app/components/voting-dapp/proposal-container.js +++ b/app/components/voting-dapp/proposal-container.js @@ -50,6 +50,7 @@ class ProposalContainer extends Component { let proposalList = []; for(let i = from; i < from + qty && i < this.state.total; i++){ let res = await ProposalCuration.methods.proposals(i).call(); + res.id = i; proposalList.push(res); } cb(proposalList); diff --git a/app/components/voting-dapp/proposal-form.js b/app/components/voting-dapp/proposal-form.js index 16cf6c7..0c4d8bd 100644 --- a/app/components/voting-dapp/proposal-form.js +++ b/app/components/voting-dapp/proposal-form.js @@ -1,25 +1,65 @@ import web3 from "Embark/web3" import EmbarkJS from 'Embark/EmbarkJS'; -import React from 'react'; +import React, {Component, Fragment} from 'react'; import { Button } from 'react-bootstrap'; +import ProposalManager from 'Embark/contracts/ProposalManager'; +import ProposalCuration from 'Embark/contracts/ProposalCuration'; -class ProposalForm extends React.Component { +class ProposalForm extends Component { constructor(props) { super(props); - this.state = {}; + this.state = { + decision: 0 + }; } - handleClick(e){ + componentDidMount(){ + __embarkContext.execWhenReady(async () => { + ProposalManager.options.address = await ProposalCuration.methods.proposalManager().call(); + let proposal = await ProposalManager.methods.getProposal(this.props.proposalId).call(); + this.setState({decision: proposal.vote}); + }); + } + + async handleClick(e, vote){ e.preventDefault(); + + let choice = 0; + if(vote == 'APPROVE') + choice = 2; + else + choice = 1; + + let proposal = this.props.proposalId; + let receipt = await ProposalManager.methods.voteProposal(this.props.proposalId, choice) + .send({from: web3.eth.defaultAccount}); + + if(receipt.status == '0x1'){ + this.setState({ + decision: choice + // TODO: show results + }); + } + console.log(receipt); + + // TODO: handle error } render(){ + console.log(this.state); return
- + { + this.state.decision != 0 ? + You voted for: {this.state.decision.toString() == '1' ? 'REJECT' : 'APPROVE'}
+ : '' + } + + +
TODO: Verify if vote is allowed for this proposal
+
TODO: Show time until proposal votation is closed
; } - } export default ProposalForm; diff --git a/app/components/voting-dapp/proposal.js b/app/components/voting-dapp/proposal.js index 17587c2..c8790f4 100644 --- a/app/components/voting-dapp/proposal.js +++ b/app/components/voting-dapp/proposal.js @@ -8,7 +8,6 @@ class Proposal extends React.Component { constructor(props) { super(props); - this.state = { url: null, title: null, @@ -58,7 +57,7 @@ class Proposal extends React.Component {

{ this.state.title }

{ this.state.description }

{ this.state.url } - + ); } diff --git a/contracts/democracy/Democracy.sol b/contracts/democracy/Democracy.sol index d4c908d..14b3d1e 100644 --- a/contracts/democracy/Democracy.sol +++ b/contracts/democracy/Democracy.sol @@ -56,7 +56,8 @@ contract Democracy { bytes32 topic; bytes32 txHash; bool approved; - (topic, txHash, approved) = proposalManager.getProposal(_proposalId); + + (topic, txHash, approved, ) = proposalManager.getProposal(_proposalId); require(approved); require( txHash == keccak256( diff --git a/contracts/democracy/ProposalManager.sol b/contracts/democracy/ProposalManager.sol index 233f726..3a5a490 100644 --- a/contracts/democracy/ProposalManager.sol +++ b/contracts/democracy/ProposalManager.sol @@ -65,7 +65,7 @@ contract ProposalManager is Controlled { p.topic = _topic; p.txHash = _txHash; - p.blockStart = block.number + 1000; //will be replaced by configurations + p.blockStart = block.number + 0; //will be replaced by configurations p.voteBlockEnd = p.blockStart + 10000; //dummy value emit ProposalSet(_topic, proposalId, _txHash); } @@ -143,12 +143,14 @@ contract ProposalManager is Controlled { returns ( bytes32 topic, bytes32 txHash, - bool approved + bool approved, + Vote vote ) { - Proposal memory p = proposals[_proposalId]; - return (p.topic, p.txHash, p.result == Vote.Approve); + Proposal storage p = proposals[_proposalId]; + return (p.topic, p.txHash, p.result == Vote.Approve, p.voteMap[msg.sender]); } + function offchainTabulateVoteResult(uint256 _proposalId) external