|
@@ -21,31 +21,34 @@ ghost proposalCanceled(uint256) returns bool {
|
|
|
init_state axiom forall uint256 pId. !proposalCanceled(pId);
|
|
|
}
|
|
|
|
|
|
-definition mask_uint64() returns uint256 = max_uint64 - 1;
|
|
|
-
|
|
|
-hook Sstore _proposals[KEY uint256 pId] uint64 newValue STORAGE {
|
|
|
+hook Sstore _proposals[KEY uint256 pId].voteStart._deadline uint64 newValue STORAGE {
|
|
|
havoc proposalVoteStart assuming (
|
|
|
- proposalVoteStart@new(pId) == newValue & mask_uint64()
|
|
|
+ proposalVoteStart@new(pId) == newValue
|
|
|
&& (forall uint256 pId2. pId != pId2 => proposalVoteStart@new(pId2) == proposalVoteStart@old(pId2))
|
|
|
);
|
|
|
}
|
|
|
|
|
|
-hook Sload uint64 value _proposals[KEY uint256 pId] STORAGE {
|
|
|
- require proposalVoteStart(pId) == value & mask_uint64();
|
|
|
+hook Sload uint64 value _proposals[KEY uint256 pId].voteStart._deadline STORAGE {
|
|
|
+ require proposalVoteStart(pId) == value;
|
|
|
}
|
|
|
|
|
|
|
|
|
-hook Sstore _proposals[KEY uint256 pId].(offset 32).(offset 0) uint64 newValue STORAGE {
|
|
|
+hook Sstore _proposals[KEY uint256 pId].voteEnd._deadline uint64 newValue STORAGE {
|
|
|
havoc proposalVoteEnd assuming (
|
|
|
- proposalVoteEnd@new(pId) == newValue & mask_uint64()
|
|
|
+ proposalVoteEnd@new(pId) == newValue
|
|
|
&& (forall uint256 pId2. pId != pId2 => proposalVoteEnd@new(pId2) == proposalVoteEnd@old(pId2))
|
|
|
);
|
|
|
}
|
|
|
|
|
|
-hook Sload uint64 value _proposals[KEY uint256 pId].(offset 32).(offset 0) STORAGE {
|
|
|
- require proposalVoteEnd(pId) == value & mask_uint64();
|
|
|
+hook Sload uint64 value _proposals[KEY uint256 pId].voteEnd._deadline STORAGE {
|
|
|
+ require proposalVoteEnd(pId) == value;
|
|
|
}
|
|
|
|
|
|
+//////////////////////////////////////////////////////////////////////////////
|
|
|
+//////////////////////////// SANITY CHECKS ///////////////////////////////////
|
|
|
+//////////////////////////////////////////////////////////////////////////////
|
|
|
+//
|
|
|
+
|
|
|
rule sanityCheckVoteStart(method f, uint256 pId) {
|
|
|
uint64 preGhost = proposalVoteStart(pId);
|
|
|
uint256 pre = proposalSnapshot(pId);
|
|
@@ -76,6 +79,11 @@ rule sanityCheckVoteEnd(method f, uint256 pId) {
|
|
|
assert pre == preGhost => post == postGhost, "if correlated at the beginning should be correlated at the end";
|
|
|
}
|
|
|
|
|
|
+//////////////////////////////////////////////////////////////////////////////
|
|
|
+////////////////////////////// INVARIANTS ////////////////////////////////////
|
|
|
+//////////////////////////////////////////////////////////////////////////////
|
|
|
+//
|
|
|
+
|
|
|
/**
|
|
|
* A proposal cannot end unless it started.
|
|
|
*/
|