@ -1,67 +1,67 @@
'use strict'
'use strict'
var ballot = ` pragma solidity ^0.4.0
var ballot = ` pragma solidity ^0.4.0;
contract Ballot {
contract Ballot {
struct Voter {
struct Voter {
uint weight
uint weight ;
bool voted
bool voted ;
uint8 vote
uint8 vote ;
address delegate
address delegate ;
}
}
struct Proposal {
struct Proposal {
uint voteCount
uint voteCount ;
}
}
address chairperson
address chairperson ;
mapping ( address => Voter ) voters
mapping ( address => Voter ) voters ;
Proposal [ ] proposals
Proposal [ ] proposals ;
/// Create a new ballot with $(_numProposals) different proposals.
/// Create a new ballot with $(_numProposals) different proposals.
function Ballot ( uint8 _numProposals ) {
function Ballot ( uint8 _numProposals ) {
chairperson = msg . sender
chairperson = msg . sender ;
voters [ chairperson ] . weight = 1
voters [ chairperson ] . weight = 1 ;
proposals . length = _numProposals
proposals . length = _numProposals ;
}
}
/// Give $(voter) the right to vote on this ballot.
/// Give $(voter) the right to vote on this ballot.
/// May only be called by $(chairperson).
/// May only be called by $(chairperson).
function giveRightToVote ( address voter ) {
function giveRightToVote ( address voter ) {
if ( msg . sender != chairperson || voters [ voter ] . voted ) return
if ( msg . sender != chairperson || voters [ voter ] . voted ) return ;
voters [ voter ] . weight = 1
voters [ voter ] . weight = 1 ;
}
}
/// Delegate your vote to the voter $(to).
/// Delegate your vote to the voter $(to).
function delegate ( address to ) {
function delegate ( address to ) {
Voter sender = voters [ msg . sender ] // assigns reference
Voter sender = voters [ msg . sender ] ; // assigns reference
if ( sender . voted ) return
if ( sender . voted ) return ;
while ( voters [ to ] . delegate != address ( 0 ) && voters [ to ] . delegate != msg . sender )
while ( voters [ to ] . delegate != address ( 0 ) && voters [ to ] . delegate != msg . sender )
to = voters [ to ] . delegate
to = voters [ to ] . delegate ;
if ( to == msg . sender ) return
if ( to == msg . sender ) return ;
sender . voted = true
sender . voted = true ;
sender . delegate = to
sender . delegate = to ;
Voter delegate = voters [ to ]
Voter delegate = voters [ to ] ;
if ( delegate . voted )
if ( delegate . voted )
proposals [ delegate . vote ] . voteCount += sender . weight
proposals [ delegate . vote ] . voteCount += sender . weight ;
else
else
delegate . weight += sender . weight
delegate . weight += sender . weight ;
}
}
/// Give a single vote to proposal $(proposal).
/// Give a single vote to proposal $(proposal).
function vote ( uint8 proposal ) {
function vote ( uint8 proposal ) {
Voter sender = voters [ msg . sender ]
Voter sender = voters [ msg . sender ] ;
if ( sender . voted || proposal >= proposals . length ) return
if ( sender . voted || proposal >= proposals . length ) return ;
sender . voted = true
sender . voted = true ;
sender . vote = proposal
sender . vote = proposal ;
proposals [ proposal ] . voteCount += sender . weight
proposals [ proposal ] . voteCount += sender . weight ;
}
}
function winningProposal ( ) constant returns ( uint8 winningProposal ) {
function winningProposal ( ) constant returns ( uint8 winningProposal ) {
uint256 winningVoteCount = 0
uint256 winningVoteCount = 0 ;
for ( uint8 proposal = 0 ; proposal < proposals . length ; proposal ++ )
for ( uint8 proposal = 0 ; proposal < proposals . length ; proposal ++ )
if ( proposals [ proposal ] . voteCount > winningVoteCount ) {
if ( proposals [ proposal ] . voteCount > winningVoteCount ) {
winningVoteCount = proposals [ proposal ] . voteCount
winningVoteCount = proposals [ proposal ] . voteCount ;
winningProposal = proposal
winningProposal = proposal ;
}
}
}
}
} `
} `