Created
June 17, 2020 20:59
-
-
Save whilb/72538309622596e216a9fdcd40fc672f 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.9+commit.a1d534e.js&optimize=true&gist=
This file contains 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 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.0; | |
contract Owned { | |
constructor() public { owner = msg.sender; } | |
address payable owner; | |
modifier onlyOwner { | |
require( | |
msg.sender == owner, | |
"Only owner can call this function." | |
); | |
_; | |
} | |
} | |
contract Entry is Owned { | |
address public associated; | |
string public shorturl; | |
string public longurl; | |
bool public exists = false; | |
constructor(address payable owner_, address associated_, string memory shorturl_, string memory longurl_) public { | |
owner = owner_; | |
associated = associated_; | |
shorturl = shorturl_; | |
longurl = longurl_; | |
exists = true; | |
} | |
function associate(address associated_) public onlyOwner { | |
associated = associated_; | |
} | |
function change(string memory longurl_) public onlyOwner { | |
longurl = longurl_; | |
} | |
function unlock() public onlyOwner { | |
exists = false; | |
} | |
function wipe() public onlyOwner { | |
if (msg.sender == owner) selfdestruct(owner); | |
} | |
} | |
contract Directory { | |
mapping(string => Entry) entries; | |
function lookup(string memory shorturl_) public { | |
} | |
function createEntry(string memory shorturl_, string memory longurl_) public { | |
require(!entries[shorturl_].exists(), "Entry already exists!"); | |
Entry entry_ = new Entry(msg.sender, msg.sender, shorturl_, longurl_); | |
insert(entry_); | |
} | |
function insert(Entry entry_) internal { | |
entries[entry_.shorturl()] = entry_; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment