Governor.helpers.spec 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import "helpers.spec"
  2. import "methods/IGovernor.spec"
  3. /*
  4. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  5. โ”‚ Sanity โ”‚
  6. โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  7. */
  8. function clockSanity(env e) returns bool {
  9. return
  10. e.block.number < max_uint48() &&
  11. e.block.timestamp < max_uint48() &&
  12. clock(e) > 0;
  13. }
  14. /*
  15. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  16. โ”‚ States โ”‚
  17. โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  18. */
  19. definition UNSET() returns uint8 = 255;
  20. definition PENDING() returns uint8 = 0;
  21. definition ACTIVE() returns uint8 = 1;
  22. definition CANCELED() returns uint8 = 2;
  23. definition DEFEATED() returns uint8 = 3;
  24. definition SUCCEEDED() returns uint8 = 4;
  25. definition QUEUED() returns uint8 = 5;
  26. definition EXPIRED() returns uint8 = 6;
  27. definition EXECUTED() returns uint8 = 7;
  28. function safeState(env e, uint256 pId) returns uint8 {
  29. return proposalCreated(pId) ? state(e, pId): UNSET();
  30. }
  31. definition proposalCreated(uint256 pId) returns bool =
  32. proposalSnapshot(pId) > 0 && proposalDeadline(pId) > 0 && proposalProposer(pId) != 0;
  33. /*
  34. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  35. โ”‚ Filters โ”‚
  36. โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  37. */
  38. definition skip(method f) returns bool =
  39. f.isView ||
  40. f.isFallback ||
  41. f.selector == relay(address,uint256,bytes).selector ||
  42. f.selector == 0xb9a61961 || // __acceptAdmin()
  43. f.selector == onERC721Received(address,address,uint256,bytes).selector ||
  44. f.selector == onERC1155Received(address,address,uint256,uint256,bytes).selector ||
  45. f.selector == onERC1155BatchReceived(address,address,uint256[],uint256[],bytes).selector;
  46. definition voting(method f) returns bool =
  47. f.selector == castVote(uint256,uint8).selector ||
  48. f.selector == castVoteWithReason(uint256,uint8,string).selector ||
  49. f.selector == castVoteWithReasonAndParams(uint256,uint8,string,bytes).selector;
  50. definition votingBySig(method f) returns bool =
  51. f.selector == castVoteBySig(uint256,uint8,uint8,bytes32,bytes32).selector ||
  52. f.selector == castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32).selector;
  53. definition votingAll(method f) returns bool =
  54. voting(f) || votingBySig(f);
  55. /*
  56. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  57. โ”‚ Helper functions โ”‚
  58. โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  59. */
  60. function helperVoteWithRevert(env e, method f, uint256 pId, address voter, uint8 support) returns uint256 {
  61. string reason; bytes params;
  62. require reason.length >= 0;
  63. if (f.selector == castVote(uint256,uint8).selector)
  64. {
  65. require e.msg.sender == voter;
  66. return castVote@withrevert(e, pId, support);
  67. }
  68. else if (f.selector == castVoteWithReason(uint256,uint8,string).selector)
  69. {
  70. require e.msg.sender == voter;
  71. return castVoteWithReason@withrevert(e, pId, support, reason);
  72. }
  73. else if (f.selector == castVoteWithReasonAndParams(uint256,uint8,string,bytes).selector)
  74. {
  75. require e.msg.sender == voter;
  76. return castVoteWithReasonAndParams@withrevert(e, pId, support, reason, params);
  77. }
  78. else
  79. {
  80. calldataarg args;
  81. f(e, args);
  82. return 0;
  83. }
  84. }
  85. function helperFunctionsWithRevert(env e, method f, uint256 pId) {
  86. if (f.selector == propose(address[],uint256[],bytes[],string).selector)
  87. {
  88. address[] targets; uint256[] values; bytes[] calldatas; string descr;
  89. require pId == propose@withrevert(e, targets, values, calldatas, descr);
  90. }
  91. else if (f.selector == queue(address[],uint256[],bytes[],bytes32).selector)
  92. {
  93. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  94. require pId == queue@withrevert(e, targets, values, calldatas, descrHash);
  95. }
  96. else if (f.selector == execute(address[],uint256[],bytes[],bytes32).selector)
  97. {
  98. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  99. require pId == execute@withrevert(e, targets, values, calldatas, descrHash);
  100. }
  101. else if (f.selector == cancel(address[],uint256[],bytes[],bytes32).selector)
  102. {
  103. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  104. require pId == cancel@withrevert(e, targets, values, calldatas, descrHash);
  105. }
  106. else if (f.selector == castVote(uint256,uint8).selector)
  107. {
  108. uint8 support;
  109. castVote@withrevert(e, pId, support);
  110. }
  111. else if (f.selector == castVoteWithReason(uint256,uint8,string).selector)
  112. {
  113. uint8 support; string reason;
  114. castVoteWithReason@withrevert(e, pId, support, reason);
  115. }
  116. else if (f.selector == castVoteWithReasonAndParams(uint256,uint8,string,bytes).selector)
  117. {
  118. uint8 support; string reason; bytes params;
  119. castVoteWithReasonAndParams@withrevert(e, pId, support, reason, params);
  120. }
  121. else if (f.selector == castVoteBySig(uint256,uint8,uint8,bytes32,bytes32).selector)
  122. {
  123. uint8 support; uint8 v; bytes32 r; bytes32 s;
  124. castVoteBySig@withrevert(e, pId, support, v, r, s);
  125. }
  126. else if (f.selector == castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32).selector)
  127. {
  128. uint8 support; string reason; bytes params; uint8 v; bytes32 r; bytes32 s;
  129. castVoteWithReasonAndParamsBySig@withrevert(e, pId, support, reason, params, v, r, s);
  130. }
  131. else
  132. {
  133. calldataarg args;
  134. f(e, args);
  135. }
  136. }