Skip to content

Instantly share code, notes, and snippets.

@atvanguard
Created November 3, 2018 19:16
Show Gist options
  • Save atvanguard/9cf0d796f5699a8c18b099a9ec865393 to your computer and use it in GitHub Desktop.
Save atvanguard/9cf0d796f5699a8c18b099a9ec865393 to your computer and use it in GitHub Desktop.
contract LiquidDemocracy {
...
function delegateTo(address delegate) public isValidVoter {
require(
voters[delegate].state != State.Invalid,
'Delegating to invalid voter'
);
require(
delegate != msg.sender && !delegationCycleExists(delegate, msg.sender),
'Forming a delegation cycle'
);
Voter storage voter = voters[msg.sender];
voter.delegatedTo = voters[delegate].index;
voter.state = State.Delegated;
}
function delegationCycleExists(address delegate, address sender) internal view returns(bool) {
// traverse the delegation cycle until we find a voter that has not delegated
while(voters[delegate].state == State.Delegated) {
delegate = validVoters[voters[delegate].delegatedTo];
if (delegate == sender) return true; // delegation cycle found
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment