|
|
|
@ -1,4 +1,6 @@ |
|
|
|
|
// Governor.sol base definitions |
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
///////////////////// Governor.sol base definitions ////////////////////////// |
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
methods { |
|
|
|
|
proposalSnapshot(uint256) returns uint256 envfree // matches proposalVoteStart |
|
|
|
|
proposalDeadline(uint256) returns uint256 envfree |
|
|
|
@ -14,8 +16,24 @@ methods { |
|
|
|
|
// internal functions made public in harness: |
|
|
|
|
_quorumReached(uint256) returns bool envfree |
|
|
|
|
_voteSucceeded(uint256) returns bool envfree |
|
|
|
|
|
|
|
|
|
// getter for checking the sums |
|
|
|
|
counter_vote_power_by_id(uint256) returns uint256 envfree |
|
|
|
|
ghost_vote_power_by_id(uint256) returns uint256 envfree |
|
|
|
|
counted_weight(uint256) returns uint256 envfree |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
///////////////////////////////// GHOSTS ///////////////////////////////////// |
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
|
|
ghost vote_power_ghost() returns uint256; |
|
|
|
|
|
|
|
|
|
hook Sstore ghost_vote_power_by_id[KEY uint256 pId] uint256 current_power STORAGE{ |
|
|
|
|
havoc vote_power_ghost assuming vote_power_ghost@new() == vote_power_ghost@old() + current_power; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
////////////////////////////// INVARIANTS //////////////////////////////////// |
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
@ -38,18 +56,21 @@ invariant voteStartBeforeVoteEnd(uint256 pId) |
|
|
|
|
/** |
|
|
|
|
* A proposal cannot be both executed and canceled. |
|
|
|
|
*/ |
|
|
|
|
invariant noBothExecutedAndCanceled(uint256 pId) !isExecuted(pId) || !isCanceled(pId) |
|
|
|
|
invariant noBothExecutedAndCanceled(uint256 pId) |
|
|
|
|
!isExecuted(pId) || !isCanceled(pId) |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* A proposal cannot be neither executed nor canceled before it starts |
|
|
|
|
*/ |
|
|
|
|
invariant noExecuteOrCancelBeforeStarting(env e, uint256 pId) e.block.number < proposalSnapshot(pId) |
|
|
|
|
=> !isExecuted(pId) && !isCanceled(pId) |
|
|
|
|
invariant noExecuteOrCancelBeforeStarting(env e, uint256 pId) |
|
|
|
|
e.block.number < proposalSnapshot(pId) |
|
|
|
|
=> !isExecuted(pId) && !isCanceled(pId) |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* A proposal could be executed only if quorum was reached and vote succeeded |
|
|
|
|
*/ |
|
|
|
|
invariant executionOnlyIfQuoromReachedAndVoteSucceeded(uint256 pId) isExecuted(pId) => _quorumReached(pId) && _voteSucceeded(pId) |
|
|
|
|
invariant executionOnlyIfQuoromReachedAndVoteSucceeded(uint256 pId) |
|
|
|
|
isExecuted(pId) => _quorumReached(pId) && _voteSucceeded(pId) |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* No functions should be allowed to run after a job is deemed as canceled |
|
|
|
@ -69,7 +90,13 @@ invariant cannotSetIfExecuted(uint256 pId) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* sum of all votes casted is equal to the sum of voting power of those who voted |
|
|
|
|
*/ |
|
|
|
|
invariant SumOfVotesCastEqualSumOfPowerOfVoted(uint256 pId) |
|
|
|
|
counted_weight(pId) == counter_vote_power_by_id(pId) && |
|
|
|
|
counted_weight(pId) == vote_power_ghost && |
|
|
|
|
counter_vote_power_by_id(pId) == vote_power_ghost |
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
/////////////////////////////////// RULES //////////////////////////////////// |
|
|
|
@ -149,10 +176,3 @@ rule doubleVoting(uint256 pId, uint8 sup) { |
|
|
|
|
|
|
|
|
|
assert reverted, "double voting accured"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* |
|
|
|
|
*/ |
|
|
|
|
rule votingSumAndPower(uint256 pId, uint8 sup, method f) { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|