diff --git a/index.html b/index.html index 56885f3fe2..d5ebf9c9e2 100644 --- a/index.html +++ b/index.html @@ -60,62 +60,70 @@ Version: (loading)
-
contract Ballot { +
contract Ballot { + struct Voter { + uint weight; + bool voted; + uint8 vote; + address delegate; + } + struct Proposal { + uint voteCount; + } + + address chairperson; + mapping(address => Voter) voters; + Proposal[] proposals; + // Create a new ballot with $(_numProposals) different proposals. function Ballot(uint8 _numProposals) { - address sender = msg.sender; - chairperson = sender; - numProposals = _numProposals; + chairperson = msg.sender; + voters[chairperson].weight = 1; + proposals.length = _numProposals; } // Give $(voter) the right to vote on this ballot. // May only be called by $(chairperson). function giveRightToVote(address voter) { - if (msg.sender != chairperson || voted[voter]) return; - voterWeight[voter] = 1; + if (msg.sender != chairperson || voters[voter].voted) return; + voters[voter].weight = 1; } // Delegate your vote to the voter $(to). function delegate(address to) { - address sender = msg.sender; - if (voted[sender]) return; - while (delegations[to] != address(0) && delegations[to] != sender) - to = delegations[to]; - if (to == sender) return; - voted[sender] = true; - delegations[sender] = to; - if (voted[to]) voteCounts[votes[to]] += voterWeight[sender]; - else voterWeight[to] += voterWeight[sender]; + Voter sender = voters[msg.sender]; // assigns reference + if (sender.voted) return; + while (voters[to].delegate != address(0) && voters[to].delegate != msg.sender) + to = voters[to].delegate; + if (to == msg.sender) return; + sender.voted = true; + sender.delegate = to; + Voter delegate = voters[to]; + if (delegate.voted) + proposals[delegate.vote].voteCount += sender.weight; + else + delegate.weight += sender.weight; } // Give a single vote to proposal $(proposal). function vote(uint8 proposal) { - address sender = msg.sender; - if (voted[sender] || proposal >= numProposals) return; - voted[sender] = true; - votes[sender] = proposal; - voteCounts[proposal] += voterWeight[sender]; + Voter sender = voters[msg.sender]; + if (sender.voted || proposal >= proposals.length) return; + sender.voted = true; + sender.vote = proposal; + proposals[proposal].voteCount += sender.weight; } function winningProposal() constant returns (uint8 winningProposal) { uint256 winningVoteCount = 0; - uint8 proposal = 0; - while (proposal < numProposals) { - if (voteCounts[proposal] > winningVoteCount) { - winningVoteCount = voteCounts[proposal]; + for (uint8 proposal = 0; proposal < proposals.length; proposal++) { + if (proposals[proposal].voteCount > winningVoteCount) { + winningVoteCount = proposals[proposal].voteCount; winningProposal = proposal; } ++proposal; } } - - address chairperson; - uint8 numProposals; - mapping(address => uint256) voterWeight; - mapping(address => bool) voted; - mapping(address => uint8) votes; - mapping(address => address) delegations; - mapping(uint8 => uint256) voteCounts; }