diff --git a/app/components/simple-voting/PollsList.js b/app/components/simple-voting/PollsList.js index 8945816..b4f5df7 100644 --- a/app/components/simple-voting/PollsList.js +++ b/app/components/simple-voting/PollsList.js @@ -1,4 +1,4 @@ -import React, { Fragment, PureComponent } from 'react'; +import React, { Fragment, Component, PureComponent } from 'react'; import { toString } from 'lodash'; import AppBar from '@material-ui/core/AppBar'; import Toolbar from '@material-ui/core/Toolbar'; @@ -55,7 +55,22 @@ class Poll extends PureComponent { constructor(props){ super(props); - this.state = { value: props.votes, originalValue: props.votes, balance: 0, isSubmitting: false, open: false }; + this.state = { + t: 0, + value: props.votes, + originalValue: props.votes, + balance: 0, + isSubmitting: false, + open: false, + votes: { + } + }; + } + + updateVotes = i => numVotes => { + const votes = this.state.votes; + votes[i] = numVotes; + this.setState({votes, t: new Date()}); } handleClickOpen = () => { @@ -66,10 +81,6 @@ class Poll extends PureComponent { this.setState({ open: false }); }; - handleChange = (event, value) => { - this.setState({ value }) - }; - handleClick = (event) => { event.preventDefault(); @@ -105,7 +116,6 @@ class Poll extends PureComponent { render(){ const { _description, - _totalCensus, _voters, _qvResults, _results, @@ -115,11 +125,11 @@ class Poll extends PureComponent { ideaSites, _numBallots, } = this.props; - const { value, originalValue, isSubmitting, error } = this.state; + + const { value, originalValue, isSubmitting, error, votes } = this.state; + const { fromWei } = web3.utils; const cantVote = balance == 0 || !_canVote; const disableVote = cantVote || isSubmitting; - const fromWei = (m) => m; - const maxValue = Math.floor(Math.sqrt(balance)); const buttonText = originalValue != 0 && value != originalValue ? 'Change Vote' : 'Vote'; const idea = getIdeaFromStr(_description) const ideaSite = ideaSites && ideaSites.filter(site => site.includes(idea)); @@ -128,24 +138,54 @@ class Poll extends PureComponent { const title = decodedDesc[0].toString(); const ballots = decodedDesc[1]; + // Calculating votes availables + const maxVotes = Math.floor(Math.sqrt(balance)); + const maxValuesForBallots = {}; + let votedSNT = 0; + for(let i = 0; i < ballots.length; i++){ + if(votes[i] == undefined){ + votes[i] = 0; + maxValuesForBallots[i] = 0; + } else { + votedSNT += votes[i]*votes[i]; + } + } + for(let i = 0; i < ballots.length; i++){ + maxValuesForBallots[i] = Math.floor(Math.sqrt(balance - votedSNT + votes[i]*votes[i])); // votes[i] // Math.floor(Math.sqrt(balance - (votedSNT*votedSNT) + (votes[i]*votes[i]))); + } + + return ( - {title} + {title} - Total: {_voters} voters. {_qvResults} votes ({fromWei(_results)} SNT) + Total: {_voters} voters. {_qvResults} votes ({(_results)} SNT) + + + SNT available for voting: {(balance - votedSNT).toFixed(2)} of {(parseFloat(balance).toFixed(2))} SNT - { _numBallots > 0 && ballots.map((opt, i) =>

{opt.toString()}

) } - - Your vote: {value} votes ({value * value} SNT) - + { _numBallots > 0 && + ballots.map((opt, i) => { + return
+ {opt.toString()} + {!cantVote } + +
+ }) + } + + + + {cantVote && {balance == 0 && Voting disabled for proposals made when there was no SNT in the account} {balance != 0 && !_canVote && You can not vote on this poll} } {error && {error}} + {ideaSite && ideaSite.length > 0 && {ideaSite}} {ideaSite && }
{!cantVote && - - {isSubmitting ? : } - } + {isSubmitting ? : } + }
) } @@ -194,10 +233,40 @@ const PollsList = ({ classes }) => ( {rawPolls .sort(sortingFn[pollOrder]) - .map((poll) => )} + .map((poll, i) => )} } ) +class BallotSlider extends Component { + + constructor(props){ + super(props); + this.state = { + value: props.votes || 0 + } + } + + handleChange = (event, value) => { + if(value > this.props.maxVotesAvailable){ + value = this.props.maxVotesAvailable; + } + this.setState({value}); + this.props.updateVotes(value); + }; + + render(){ + const {maxVotes, maxVotesAvailable} = this.props; + const {value} = this.state; + const nextVote = value + 1; + + return + + Votes: {value} ({value * value} SNT) + { nextVote <= maxVotesAvailable ? - Additional vote will cost {nextVote*nextVote - value*value} SNT : - Not enough balance available to buy additional votes } + + } +} + export default withStyles(styles)(PollsList); diff --git a/app/utils/polls.js b/app/utils/polls.js index 8f93c0b..e61543d 100644 --- a/app/utils/polls.js +++ b/app/utils/polls.js @@ -4,9 +4,7 @@ import PollManager from 'Embark/contracts/PollManager'; import SNT from 'Embark/contracts/SNT'; const excluded = { - PROPER_LIGHT_CLIENT_SUPPORT : 3, - IMPLEMENT_SECURITY_PRACTICES : 14, - SHIP_1_0 : 16 + // PROPER_LIGHT_CLIENT_SUPPORT : 3, }; export const getBalance = async (startBlock) => { diff --git a/contracts/polls/PollManager.sol b/contracts/polls/PollManager.sol index 349522a..22a6420 100644 --- a/contracts/polls/PollManager.sol +++ b/contracts/polls/PollManager.sol @@ -148,7 +148,7 @@ contract PollManager is Controlled { /// @notice Calculate square root of a uint (It has some precision loss) /// @param x Number to calculate the square root /// @return Square root of x - function sqrt(uint256 x) internal pure returns (uint256 y) { + function sqrt(uint256 x) public pure returns (uint256 y) { uint256 z = (x + 1) / 2; y = x; while (z < y) {