Governor.helpers.spec 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. /*
  51. โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
  52. โ”‚ Helper functions โ”‚
  53. โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
  54. */
  55. function helperVoteWithRevert(env e, method f, uint256 pId, address voter, uint8 support) returns uint256 {
  56. string reason; bytes params;
  57. if (f.selector == castVote(uint256,uint8).selector)
  58. {
  59. require e.msg.sender == voter;
  60. return castVote@withrevert(e, pId, support);
  61. }
  62. else if (f.selector == castVoteWithReason(uint256,uint8,string).selector)
  63. {
  64. require e.msg.sender == voter;
  65. return castVoteWithReason@withrevert(e, pId, support, reason);
  66. }
  67. else if (f.selector == castVoteWithReasonAndParams(uint256,uint8,string,bytes).selector)
  68. {
  69. require e.msg.sender == voter;
  70. return castVoteWithReasonAndParams@withrevert(e, pId, support, reason, params);
  71. }
  72. else
  73. {
  74. require false;
  75. return 0;
  76. }
  77. }
  78. function helperFunctionsWithRevert(env e, method f, uint256 pId) {
  79. if (f.selector == propose(address[],uint256[],bytes[],string).selector)
  80. {
  81. address[] targets; uint256[] values; bytes[] calldatas; string descr;
  82. require pId == propose@withrevert(e, targets, values, calldatas, descr);
  83. }
  84. else if (f.selector == queue(address[],uint256[],bytes[],bytes32).selector)
  85. {
  86. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  87. require pId == queue@withrevert(e, targets, values, calldatas, descrHash);
  88. }
  89. else if (f.selector == execute(address[],uint256[],bytes[],bytes32).selector)
  90. {
  91. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  92. require pId == execute@withrevert(e, targets, values, calldatas, descrHash);
  93. }
  94. else if (f.selector == cancel(address[],uint256[],bytes[],bytes32).selector)
  95. {
  96. address[] targets; uint256[] values; bytes[] calldatas; bytes32 descrHash;
  97. require pId == cancel@withrevert(e, targets, values, calldatas, descrHash);
  98. }
  99. else if (f.selector == castVote(uint256,uint8).selector)
  100. {
  101. uint8 support;
  102. castVote@withrevert(e, pId, support);
  103. }
  104. else if (f.selector == castVoteWithReason(uint256,uint8,string).selector)
  105. {
  106. uint8 support; string reason;
  107. castVoteWithReason@withrevert(e, pId, support, reason);
  108. }
  109. else if (f.selector == castVoteWithReasonAndParams(uint256,uint8,string,bytes).selector)
  110. {
  111. uint8 support; string reason; bytes params;
  112. castVoteWithReasonAndParams@withrevert(e, pId, support, reason, params);
  113. }
  114. else if (f.selector == castVoteBySig(uint256,uint8,uint8,bytes32,bytes32).selector)
  115. {
  116. uint8 support; uint8 v; bytes32 r; bytes32 s;
  117. castVoteBySig@withrevert(e, pId, support, v, r, s);
  118. }
  119. else if (f.selector == castVoteWithReasonAndParamsBySig(uint256,uint8,string,bytes,uint8,bytes32,bytes32).selector)
  120. {
  121. uint8 support; string reason; bytes params; uint8 v; bytes32 r; bytes32 s;
  122. castVoteWithReasonAndParamsBySig@withrevert(e, pId, support, reason, params, v, r, s);
  123. }
  124. else
  125. {
  126. require false;
  127. }
  128. }