MoreRulesToTheGodOfRules

pull/2997/head
Aleksander Kryukov 3 years ago
parent ad7993d7d5
commit 751277a1ab
  1. 32
      certora/harnesses/GovernorHarness.sol
  2. 8
      certora/scripts/GovernorCountingSimple.sh
  3. 34
      certora/specs/GovernorBase.spec

@ -10,6 +10,15 @@ contract GovernorHarness is Governor {
return _proposals[proposalId].canceled;
}
function initialized(uint256 proposalId) public view returns (bool){
if (_proposals[proposalId].voteStart._deadline != 0 && _proposals[proposalId].voteEnd._deadline != 0) {
return true;
}
return false;
}
mapping(uint256 => uint256) _quorum;
function quorum(uint256 blockNumber) public view override virtual returns (uint256) {
@ -64,6 +73,7 @@ contract GovernorHarness is Governor {
return _votingPeriod;
}
constructor(string memory name) Governor(name) {}
// _countVots == Sum of castVote
@ -76,28 +86,32 @@ contract GovernorHarness is Governor {
// mapping of count
// countMap
mapping(uint256 => mapping(address => uint256)) counted_weight_by_id;
mapping(uint256 => uint256) counted_weight;
// uint decision;
// uint numberOfOptions;
function _countVote(
uint256 proposalId,
address account,
uint8 support,
uint256 weight
) internal override virtual {
counted_weight_by_id[proposalId][account] += weight;
counted_weight[proposalId] += weight;
}
mapping(uint256 => uint256) counter_vote_power_by_id;
mapping(uint256 => uint256) public counter_vote_power_by_id;
mapping(uint256 => uint256) public ghost_vote_power_by_id;
function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {
address voter = _msgSender();
// 1)
counter_vote_power_by_id[proposalId] += _castVote(proposalId, voter, support, "");
return _castVote(proposalId, voter, support, "");
// 2)
// counter_vote_power_by_id[proposalId] = _castVote(proposalId, voter, support, "");
// return counter_vote_power;
ghost_vote_power_by_id[proposalId] = _castVote(proposalId, voter, support, "");
// 1)
counter_vote_power_by_id[proposalId] += ghost_vote_power_by_id[proposalId];
// return _castVote(proposalId, voter, support, "");
return ghost_vote_power_by_id[proposalId];
}
function castVoteWithReason(

@ -1,2 +1,8 @@
certoraRun certora/harnesses/GovernorCountingSimpleHarness.sol \
--verify GovernorCountingSimpleHarness:certora/specs/Privileged.spec
--verify GovernorCountingSimpleHarness:certora/specs/GovernorBase.spec \
--solc solc8.0 \
--staging \
--optimistic_loop \
--settings -copyLoopUnroll=4 \
--rule doubleVoting \
--msg "$1"

@ -5,6 +5,11 @@ methods {
hashProposal(address[],uint256[],bytes[],bytes32) returns uint256 envfree
isExecuted(uint256) returns bool envfree
isCanceled(uint256) returns bool envfree
initialized(uint256) returns bool envfree
hasVoted(uint256, address) returns bool
castVote(uint256, uint8) returns uint256
// internal functions made public in harness:
_quorumReached(uint256) returns bool envfree
@ -23,6 +28,12 @@ methods {
invariant voteStartBeforeVoteEnd(uint256 pId)
(proposalSnapshot(pId) > 0 => proposalSnapshot(pId) < proposalDeadline(pId))
&& (proposalSnapshot(pId) == 0 => proposalDeadline(pId) == 0)
/*
proposalSnapshot(pId) < proposalDeadline(pId) || (proposalSnapshot(pId) == 0 && proposalDeadline(pId) == 0)
{ preserved {
require initialized(pId) == true;
}}
*/
/**
* A proposal cannot be both executed and canceled.
@ -116,3 +127,26 @@ rule immutableFieldsAfterProposalCreation(uint256 pId, method f) {
assert _voteStart == voteStart_;
assert _voteEnd == voteEnd_;
}
/**
* Check if it's possible to vote two time. Relevant to GovernorCountingSimpleHarness.sol contract
*/
rule doubleVoting(uint256 pId, uint8 sup) {
env e;
address user = e.msg.sender;
bool votedCheck = hasVoted(e, pId, user);
require votedCheck == true;
castVote@withrevert(e, pId, sup);
bool reverted = lastReverted;
assert reverted, "double voting accured";
}
/**
*
*/
rule votingSumAndPower(uint256 pId, uint8 sup, method f) {
}

Loading…
Cancel
Save