/// @title A single ballot contract which allows certain
contract Ballot {
/// @title accounts to vote (one single vote).
// This declares a new complex type which will
/// @author soliditycookbook.com & Robert Martin-Legene
// be used for variables later.
/// @notice A Chairman will deploy the contract, setting up initial
// It will represent a single voter.
/// @notice conditions. Before the voting period starts the Chairman
struct Voter {
/// @notice must also tell the contract who is allowed to vote.
contract Ballot
{
/// @dev This is a struct for a single voter.
/// @dev Voter.vote is the index of the voted proposal or -1 if
/// @dev the account has not voted yet.
struct Voter
{
address voter;
address voter;
int vote; // index of the voted proposal or -1 if not voted
uint[] votedProposals;
}
uint votesLeft;
// This is a type for a single proposal.
struct Proposal {
bytes32 name; // short name (up to 32 bytes)
uint voteCount; // number of accumulated votes
}
struct Votingrules {
string title;
address chairman;
uint voteStarts;
uint voteBefore;
// A NOTE ON PERCENTAGES
// At present floats do not exist. Since we merely use
// our floats to later present to the outside world,
// and then let them handle the math, this scenario will
// be used:
//
// A percentage will be multiplied with one million. Thus:
// 100% is represented as 100 million. I.e. "100000000".
// 2/3 is represented as "67777778" (see note later on
// two-thirds
// Which percentage of the registered voters must
// vote in order for the vote to be considered valid.
// e.g. 0
uint percentOfRegisteredVotersReqToBeValid;
// Which percentage of the cast votes are required
// for the motion/title to pass?
// MAJORITY VOTE:
// specify 50000001
// TWO-THIRDS:
// specify 67777777
uint percentOfVotesCastToWin;
// Counting registered voters who do not vote as blank
// votes, has the effect that it is more difficult
// to acquire the desired votes.
bool countNonvotesAsBlanks;
}
}
string public ballotTitle;
address public ballotChairman;
uint public ballotVoteStarts;
uint public ballotVoteBefore;
uint public ballotPercentOfRegisteredVotersReqToBeValid;
uint public ballotPercentOfVotesCastToWin;
/// @dev Counting registered voters who do not vote as blank
/// @dev votes, has the effect that it is more difficult
/// @dev to acquire the desired votes.
bool public ballotCountNonvotesAsBlanks;
uint public ballotMaxVotesPerVoter;
uint public ballotMaxVotesPerProposal;
/// @dev The votermap points to the index(number) that the struct of the
/// @dev account can be found.
mapping( address => uint )
public voterMap;
Voter[] public voterList;
/// @dev Short name (up to 32 bytes)
bytes32[] public proposalList;
uint[] private emptyuintlist;
Votingrules public rules;
/// @notice When the SC is being deployed, you must define initial conditions. When specifying percentages they are to have been multiplied with 100 million (5% is written as 5 million, since 5% is actially 0.05).
mapping( address => uint ) public voterMap;
/// @param title Name of the things being voted for.
Voter[] public voterList;
/// @param voteStarts Time in seconds (since Unix Epoch) when the voting starts (note that voters must be defined before voting starts).
uint public numvoters;
/// @param voteBefore Time in seconds (since Unix Epoch) at/after which it is too late to vote. After this point, the Ballot is effectively readonly.
Proposal[] public proposalList;
/// @param percentOfRegisteredVotersReqToBeValid How many of the registered voters must vote before the result of the Ballot can be considered valid. E.g. if 50% is set and only 40% votes, then the result of the Ballot can not be used.
uint public numproposals;
/// @param percentOfVotesCastToWin How many of the votes that are cast are required to win. This is often 50.000001% ("more than half"), 67.777778% ("two thirds") or 0% (proposal with most votes - e.g. voting for most popular fruit).
/// @param countNonvotesAsBlanks Whether or not to count voters whom did not vote, as having voted blank.
/// Create a new ballot to choose one of `proposalNames`.
/// @param maxVotesPerVoter How many votes can a voter cast. Often this is 1 (one).
/// @param maxVotesPerProposal How many votes one voter can cast on each proposal. I.e. can (s)he vote use all his votes on one proposal?
/// @param proposalNames 32 char "strings" listing all the options available to vote for.