Browse Source

MoreRulesToTheGodOfRules

Aleksander Kryukov 3 years ago
parent
commit
2761ec0b66

+ 23 - 9
certora/harnesses/GovernorHarness.sol

@@ -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(

+ 7 - 1
certora/scripts/GovernorCountingSimple.sh

@@ -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"

+ 34 - 0
certora/specs/GovernorBase.spec

@@ -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) {
+
+}