Created
July 1, 2019 17:24
-
-
Save phatnguyenuit/8f326d13e2498c8e79bd840ae7095016 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.5.8+commit.23d335f2.js&optimize=false&gist=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pragma solidity >=0.4.22 <0.6.0; | |
| 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. | |
| constructor(uint8 _numProposals) public { | |
| chairperson = msg.sender; | |
| voters[chairperson].weight = 1; | |
| proposals.length = _numProposals; | |
| } | |
| /// Give $(toVoter) the right to vote on this ballot. | |
| /// May only be called by $(chairperson). | |
| function giveRightToVote(address toVoter) public { | |
| if (msg.sender != chairperson || voters[toVoter].voted) return; | |
| voters[toVoter].weight = 1; | |
| } | |
| /// Delegate your vote to the voter $(to). | |
| function delegate(address to) public { | |
| Voter storage 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 storage delegateTo = voters[to]; | |
| if (delegateTo.voted) | |
| proposals[delegateTo.vote].voteCount += sender.weight; | |
| else | |
| delegateTo.weight += sender.weight; | |
| } | |
| /// Give a single vote to proposal $(toProposal). | |
| function vote(uint8 toProposal) public { | |
| Voter storage sender = voters[msg.sender]; | |
| if (sender.voted || toProposal >= proposals.length) return; | |
| sender.voted = true; | |
| sender.vote = toProposal; | |
| proposals[toProposal].voteCount += sender.weight; | |
| } | |
| function winningProposal() public view returns (uint8 _winningProposal) { | |
| uint256 winningVoteCount = 0; | |
| for (uint8 prop = 0; prop < proposals.length; prop++) | |
| if (proposals[prop].voteCount > winningVoteCount) { | |
| winningVoteCount = proposals[prop].voteCount; | |
| _winningProposal = prop; | |
| } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pragma solidity >=0.4.22 <0.6.0; | |
| import "remix_tests.sol"; // this import is automatically injected by Remix. | |
| import "./ballot.sol"; | |
| contract test3 { | |
| Ballot ballotToTest; | |
| function beforeAll () public { | |
| ballotToTest = new Ballot(2); | |
| } | |
| function checkWinningProposal () public { | |
| ballotToTest.vote(1); | |
| Assert.equal(ballotToTest.winningProposal(), uint(1), "1 should be the winning proposal"); | |
| } | |
| function checkWinninProposalWithReturnValue () public view returns (bool) { | |
| return ballotToTest.winningProposal() == 1; | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| pragma solidity ^0.5.8; | |
| contract MyContract { | |
| string value; | |
| // expose publicValue can be called outside of the contract | |
| string public publicValue = "publicValue"; | |
| // declare constant property | |
| string public constant constantValue = "constantValue"; | |
| // declare bool property | |
| bool public myBool = true; | |
| // declare integer property | |
| int public myInt = -1; | |
| uint public myUint = 1; | |
| // declare enum | |
| enum State { Waiting, Ready, Active } | |
| State public state; | |
| // declare struct | |
| struct Person { | |
| uint id; | |
| string firstName; | |
| string lastName; | |
| } | |
| Person[] public people; | |
| uint256 public peopleCount; | |
| // mapping Person to MyContract as a map with key and value | |
| mapping(uint => Person) public mappingPeople; | |
| // delcare owner property | |
| address owner; | |
| modifier onlyOwner() { | |
| require(msg.sender == owner); | |
| _; | |
| } | |
| constructor() public { | |
| value = "myValue"; | |
| state = State.Waiting; | |
| } | |
| function getValue() public view returns(string memory) { | |
| return value; | |
| } | |
| function setValue(string memory _value) public { | |
| value = _value; | |
| } | |
| function activate() public { | |
| state = State.Active; | |
| } | |
| function checkIsActive() public view returns(bool) { | |
| return state == State.Active; | |
| } | |
| function addPerson(string memory _firstName, string memory _lastName) public { | |
| people.push(Person(1, _firstName, _lastName)); | |
| peopleCount += 1; | |
| } | |
| function addPersonMapping(string memory _firstName, string memory _lastName) public onlyOwner{ | |
| incrementCount(); | |
| mappingPeople[peopleCount] = Person(peopleCount, _firstName, _lastName); | |
| } | |
| // declare internal function like private method in OOP | |
| // only be invoked in MyContract | |
| function incrementCount() internal { | |
| peopleCount += 1; | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment