Skip to content

Instantly share code, notes, and snippets.

@goastoman
Last active March 15, 2018 16:51
Show Gist options
  • Save goastoman/407be695cfd6ce4d47ecbfd10e34d8a2 to your computer and use it in GitHub Desktop.
Save goastoman/407be695cfd6ce4d47ecbfd10e34d8a2 to your computer and use it in GitHub Desktop.
Simple Voting System
pragma solidity ^0.4.18;
/**
* @title Simple Voting
*/
contract SimpleVoting {
string public votingName;
string[] public variants;
mapping(uint=>uint) votesCount;
mapping(address=>bool) public isVoted;
mapping(bytes32=>uint) variantIds;
function SimpleVoting() public payable {
votingName = 'VotingTopic';
variants.push(''); // for starting variants from 1 (non-programmers oriented)
variants.push('Answer1');variantIds[sha256('Answer1')] = 1;
variants.push('Answer2');variantIds[sha256('Answer2')] = 2;
variants.push('Answer3');variantIds[sha256('Answer3')] = 3;
assert(variants.length <= 100);
}
modifier hasNotVoted() {
require(!isVoted[msg.sender]);
_;
}
modifier validVariantId(uint _variantId) {
require(_variantId>=1 && _variantId<variants.length);
_;
}
/**
* Vote by variant id
*/
function vote(uint _variantId)
public
validVariantId(_variantId)
hasNotVoted
{
votesCount[_variantId]++;
isVoted[msg.sender] = true;
}
/**
* Vote by variant name
*/
function voteByName(string _variantName)
public
hasNotVoted
{
uint variantId = variantIds[ sha256(_variantName) ];
require(variantId!=0);
votesCount[variantId]++;
isVoted[msg.sender] = true;
}
/**
* Get votes count of variant (by id)
*/
function getVotesCount(uint _variantId)
public
view
validVariantId(_variantId)
returns (uint)
{
return votesCount[_variantId];
}
/**
* Get votes count of variant (by name)
*/
function getVotesCountByName(string _variantName) public view returns (uint) {
uint variantId = variantIds[ sha256(_variantName) ];
require(variantId!=0);
return votesCount[variantId];
}
/**
* Get winning variant ID
*/
function getWinningVariantId() public view returns (uint id) {
uint maxVotes = votesCount[1];
id = 1;
for (uint i=2; i<variants.length; ++i) {
if (votesCount[i] > maxVotes) {
maxVotes = votesCount[i];
id = i;
}
}
}
/**
* Get winning variant name
*/
function getWinningVariantName() public view returns (string) {
return variants[ getWinningVariantId() ];
}
/**
* Get winning variant name
*/
function getWinningVariantVotesCount() public view returns (uint) {
return votesCount[ getWinningVariantId() ];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment