|
|
|
@ -1,5 +1,7 @@ |
|
|
|
|
import "GovernorBase.spec" |
|
|
|
|
|
|
|
|
|
using ERC20VotesHarness as erc20votes |
|
|
|
|
|
|
|
|
|
methods { |
|
|
|
|
ghost_sum_vote_power_by_id(uint256) returns uint256 envfree |
|
|
|
|
// castVote(uint256, uint8) returns uint256 |
|
|
|
@ -81,12 +83,11 @@ ghost totalVotesPossible(uint256) returns uint256 { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Was done with _getVotes by mistake. Should check GovernorBasicHarness but _getVotes is from GovernorHarness |
|
|
|
|
//hook Sstore _getVotes[KEY address uId][KEY uint256 blockNumber] uint256 voteWeight(uint256 old_voteWeight) STORAGE { |
|
|
|
|
// havoc totalVotesPossible assuming forall uint256 bn. |
|
|
|
|
// (bn == blockNumber => totalVotesPossible@new(bn) == totalVotesPossible@old(bn) - old_voteWeight + voteWeight) |
|
|
|
|
// && (bn != blockNumber => totalVotesPossible@new(bn) == totalVotesPossible@old(bn)); |
|
|
|
|
// |
|
|
|
|
//} |
|
|
|
|
hook Sstore erc20votes._getPastVotes[KEY address uId][KEY uint256 blockNumber] uint256 voteWeight(uint256 old_voteWeight) STORAGE { |
|
|
|
|
havoc totalVotesPossible assuming forall uint256 bn. |
|
|
|
|
(bn == blockNumber => totalVotesPossible@new(bn) == totalVotesPossible@old(bn) - old_voteWeight + voteWeight) |
|
|
|
|
&& (bn != blockNumber => totalVotesPossible@new(bn) == totalVotesPossible@old(bn)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -118,8 +119,8 @@ invariant OneIsNotMoreThanAll(uint256 pId) |
|
|
|
|
/* |
|
|
|
|
* totalVotesPossible >= votePower(id) |
|
|
|
|
*/ |
|
|
|
|
//invariant possibleTotalVotes(uint256 pId) |
|
|
|
|
// tracked_weight(pId) <= totalVotesPossible(snapshot(pId)) |
|
|
|
|
invariant possibleTotalVotes(uint256 pId) |
|
|
|
|
tracked_weight(pId) <= totalVotesPossible(snapshot(pId)) |
|
|
|
|
|
|
|
|
|
/* |
|
|
|
|
* totalVotesPossible >= votePower(id) |
|
|
|
@ -255,7 +256,7 @@ rule hasVotedCorrelation(uint256 pId, method f, env e, uint256 bn) filtered {f - |
|
|
|
|
uint256 votesAfter = getVotes(acc, bn); |
|
|
|
|
bool hasVotedAfter = hasVoted(e, pId, acc); |
|
|
|
|
|
|
|
|
|
assert hasVotedBefore != hasVotedAfter => againstBefore < againstAfter || forBefore < forAfter || abstainBefore < abstainAfter, "no correlation"; |
|
|
|
|
assert hasVotedBefore != hasVotedAfter => againstBefore <= againstAfter || forBefore <= forAfter || abstainBefore <= abstainAfter, "no correlation"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|