parent
de594921cc
commit
96c6120609
@ -0,0 +1,139 @@ |
||||
////////////////////////////////////////////////////////////////////////////// |
||||
////////////// THIS SPEC IS A RESERVE FOR NOT IN PROGRESS ////////////// |
||||
////////////////////////////////////////////////////////////////////////////// |
||||
|
||||
import "GovernorBase.spec" |
||||
|
||||
using ERC20VotesHarness as erc20votes |
||||
|
||||
methods { |
||||
ghost_sum_vote_power_by_id(uint256) returns uint256 envfree |
||||
|
||||
quorum(uint256) returns uint256 |
||||
proposalVotes(uint256) returns (uint256, uint256, uint256) envfree |
||||
|
||||
quorumNumerator() returns uint256 |
||||
_executor() returns address |
||||
|
||||
erc20votes._getPastVotes(address, uint256) returns uint256 |
||||
|
||||
getExecutor() returns address |
||||
|
||||
timelock() returns address |
||||
} |
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////// |
||||
///////////////////////////////// GHOSTS ///////////////////////////////////// |
||||
////////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
//////////// ghosts to keep track of votes counting //////////// |
||||
|
||||
/* |
||||
* the sum of voting power of those who voted |
||||
*/ |
||||
ghost sum_all_votes_power() returns uint256 { |
||||
init_state axiom sum_all_votes_power() == 0; |
||||
} |
||||
|
||||
hook Sstore ghost_sum_vote_power_by_id [KEY uint256 pId] uint256 current_power(uint256 old_power) STORAGE { |
||||
havoc sum_all_votes_power assuming sum_all_votes_power@new() == sum_all_votes_power@old() - old_power + current_power; |
||||
} |
||||
|
||||
/* |
||||
* sum of all votes casted per proposal |
||||
*/ |
||||
ghost tracked_weight(uint256) returns uint256 { |
||||
init_state axiom forall uint256 p. tracked_weight(p) == 0; |
||||
} |
||||
|
||||
/* |
||||
* sum of all votes casted |
||||
*/ |
||||
ghost sum_tracked_weight() returns uint256 { |
||||
init_state axiom sum_tracked_weight() == 0; |
||||
} |
||||
|
||||
/* |
||||
* getter for _proposalVotes.againstVotes |
||||
*/ |
||||
ghost votesAgainst() returns uint256 { |
||||
init_state axiom votesAgainst() == 0; |
||||
} |
||||
|
||||
/* |
||||
* getter for _proposalVotes.forVotes |
||||
*/ |
||||
ghost votesFor() returns uint256 { |
||||
init_state axiom votesFor() == 0; |
||||
} |
||||
|
||||
/* |
||||
* getter for _proposalVotes.abstainVotes |
||||
*/ |
||||
ghost votesAbstain() returns uint256 { |
||||
init_state axiom votesAbstain() == 0; |
||||
} |
||||
|
||||
hook Sstore _proposalVotes [KEY uint256 pId].againstVotes uint256 votes(uint256 old_votes) STORAGE { |
||||
havoc tracked_weight assuming forall uint256 p.(p == pId => tracked_weight@new(p) == tracked_weight@old(p) - old_votes + votes) && |
||||
(p != pId => tracked_weight@new(p) == tracked_weight@old(p)); |
||||
havoc sum_tracked_weight assuming sum_tracked_weight@new() == sum_tracked_weight@old() - old_votes + votes; |
||||
havoc votesAgainst assuming votesAgainst@new() == votesAgainst@old() - old_votes + votes; |
||||
} |
||||
|
||||
hook Sstore _proposalVotes [KEY uint256 pId].forVotes uint256 votes(uint256 old_votes) STORAGE { |
||||
havoc tracked_weight assuming forall uint256 p.(p == pId => tracked_weight@new(p) == tracked_weight@old(p) - old_votes + votes) && |
||||
(p != pId => tracked_weight@new(p) == tracked_weight@old(p)); |
||||
havoc sum_tracked_weight assuming sum_tracked_weight@new() == sum_tracked_weight@old() - old_votes + votes; |
||||
havoc votesFor assuming votesFor@new() == votesFor@old() - old_votes + votes; |
||||
} |
||||
|
||||
hook Sstore _proposalVotes [KEY uint256 pId].abstainVotes uint256 votes(uint256 old_votes) STORAGE { |
||||
havoc tracked_weight assuming forall uint256 p.(p == pId => tracked_weight@new(p) == tracked_weight@old(p) - old_votes + votes) && |
||||
(p != pId => tracked_weight@new(p) == tracked_weight@old(p)); |
||||
havoc sum_tracked_weight assuming sum_tracked_weight@new() == sum_tracked_weight@old() - old_votes + votes; |
||||
havoc votesAbstain assuming votesAbstain@new() == votesAbstain@old() - old_votes + votes; |
||||
} |
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////// |
||||
////////////////////////////// INVARIANTS //////////////////////////////////// |
||||
////////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////// |
||||
///////////////////////////////// RULES ////////////////////////////////////// |
||||
////////////////////////////////////////////////////////////////////////////// |
||||
|
||||
|
||||
//NOT FINISHED |
||||
/* |
||||
* the sum of voting power of those who voted is less or equal to the maximum possible votes, per each proposal |
||||
*/ |
||||
rule possibleTotalVotes(uint256 pId, uint8 sup, env e, method f) { |
||||
|
||||
// add requireinvariant for all i, j. i = i - 1 && i < j => checkpointlookup[i] < checkpointlookup[j]; |
||||
require tracked_weight(pId) <= erc20votes.getPastTotalSupply(e, proposalSnapshot(pId)); |
||||
|
||||
uint256 againstB; |
||||
uint256 forB; |
||||
uint256 absatinB; |
||||
againstB, forB, absatinB = proposalVotes(pId); |
||||
|
||||
calldataarg args; |
||||
//f(e, args); |
||||
|
||||
castVote(e, pId, sup); |
||||
|
||||
uint256 against; |
||||
uint256 for; |
||||
uint256 absatin; |
||||
against, for, absatin = proposalVotes(pId); |
||||
|
||||
uint256 ps = proposalSnapshot(pId); |
||||
|
||||
assert tracked_weight(pId) <= erc20votes.getPastTotalSupply(e, proposalSnapshot(pId)), "bla bla bla"; |
||||
} |
Loading…
Reference in new issue