GovernorPreventLateQuorumHarness.sol 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.2;
  3. import "../munged/governance/extensions/GovernorPreventLateQuorum.sol";
  4. import "../munged/governance/Governor.sol";
  5. import "../munged/governance/extensions/GovernorCountingSimple.sol";
  6. import "../munged/governance/extensions/GovernorVotes.sol";
  7. import "../munged/governance/extensions/GovernorVotesQuorumFraction.sol";
  8. import "../munged/governance/extensions/GovernorTimelockControl.sol";
  9. import "../munged/token/ERC20/extensions/ERC20Votes.sol";
  10. contract GovernorPreventLateQuorumHarness is
  11. Governor,
  12. GovernorCountingSimple,
  13. GovernorVotes,
  14. GovernorVotesQuorumFraction,
  15. GovernorTimelockControl,
  16. GovernorPreventLateQuorum
  17. {
  18. using SafeCast for uint256;
  19. using Timers for Timers.BlockNumber;
  20. constructor(
  21. IVotes _token,
  22. TimelockController _timelock,
  23. uint64 initialVoteExtension,
  24. uint256 quorumNumeratorValue
  25. )
  26. Governor("Harness")
  27. GovernorVotes(_token)
  28. GovernorVotesQuorumFraction(quorumNumeratorValue)
  29. GovernorTimelockControl(_timelock)
  30. GovernorPreventLateQuorum(initialVoteExtension)
  31. {}
  32. mapping(uint256 => uint256) public ghost_sum_vote_power_by_id;
  33. // variable added to check when _castVote is called
  34. uint256 public latestCastVoteCall;
  35. // Harness from GovernorPreventLateQuorum //
  36. function getVoteExtension() public view returns (uint64) {
  37. return _voteExtension;
  38. }
  39. function getExtendedDeadlineIsUnset(uint256 proposalId) public view returns (bool) {
  40. return _extendedDeadlines[proposalId].isUnset();
  41. }
  42. function getExtendedDeadlineIsStarted(uint256 proposalId) public view returns (bool) {
  43. return _extendedDeadlines[proposalId].isStarted();
  44. }
  45. function getExtendedDeadline(uint256 proposalId) public view returns (uint64) {
  46. return _extendedDeadlines[proposalId].getDeadline();
  47. }
  48. // Harness from GovernorCountingSimple //
  49. function getAgainstVotes(uint256 proposalId) public view returns (uint256) {
  50. ProposalVote storage proposalvote = _proposalVotes[proposalId];
  51. return proposalvote.againstVotes;
  52. }
  53. function getAbstainVotes(uint256 proposalId) public view returns (uint256) {
  54. ProposalVote storage proposalvote = _proposalVotes[proposalId];
  55. return proposalvote.abstainVotes;
  56. }
  57. function getForVotes(uint256 proposalId) public view returns (uint256) {
  58. ProposalVote storage proposalvote = _proposalVotes[proposalId];
  59. return proposalvote.forVotes;
  60. }
  61. function quorumReached(uint256 proposalId) public view returns (bool) {
  62. return _quorumReached(proposalId);
  63. }
  64. function voteSucceeded(uint256 proposalId) public view returns (bool) {
  65. return _voteSucceeded(proposalId);
  66. }
  67. // Harness from Governor //
  68. function getExecutor() public view returns (address) {
  69. return _executor();
  70. }
  71. function isExecuted(uint256 proposalId) public view returns (bool) {
  72. return _proposals[proposalId].executed;
  73. }
  74. function isCanceled(uint256 proposalId) public view returns (bool) {
  75. return _proposals[proposalId].canceled;
  76. }
  77. // The following functions are overrides required by Solidity added by Certora. //
  78. function proposalDeadline(uint256 proposalId)
  79. public
  80. view
  81. virtual
  82. override(Governor, GovernorPreventLateQuorum, IGovernor)
  83. returns (uint256)
  84. {
  85. return super.proposalDeadline(proposalId);
  86. }
  87. function _castVote(
  88. uint256 proposalId,
  89. address account,
  90. uint8 support,
  91. string memory reason,
  92. bytes memory params
  93. ) internal virtual override(Governor, GovernorPreventLateQuorum) returns (uint256) {
  94. // flag for when _castVote is called
  95. latestCastVoteCall = block.number;
  96. // added to run GovernorCountingSimple.spec
  97. uint256 deltaWeight = super._castVote(proposalId, account, support, reason, params);
  98. ghost_sum_vote_power_by_id[proposalId] += deltaWeight;
  99. return deltaWeight;
  100. }
  101. function lateQuorumVoteExtension() public view virtual override returns (uint64) {
  102. return super.lateQuorumVoteExtension();
  103. }
  104. function setLateQuorumVoteExtension(uint64 newVoteExtension) public virtual override onlyGovernance {
  105. super.setLateQuorumVoteExtension(newVoteExtension);
  106. }
  107. // The following functions are overrides required by Solidity added by OZ Wizard. //
  108. function votingDelay() public pure override returns (uint256) {
  109. return 1; // 1 block
  110. }
  111. function votingPeriod() public pure override returns (uint256) {
  112. return 45818; // 1 week
  113. }
  114. function quorum(uint256 blockNumber)
  115. public
  116. view
  117. override(IGovernor, GovernorVotesQuorumFraction)
  118. returns (uint256)
  119. {
  120. return super.quorum(blockNumber);
  121. }
  122. function state(uint256 proposalId) public view override(Governor, GovernorTimelockControl) returns (ProposalState) {
  123. return super.state(proposalId);
  124. }
  125. function propose(
  126. address[] memory targets,
  127. uint256[] memory values,
  128. bytes[] memory calldatas,
  129. string memory description
  130. ) public override(Governor, IGovernor) returns (uint256) {
  131. return super.propose(targets, values, calldatas, description);
  132. }
  133. function _execute(
  134. uint256 proposalId,
  135. address[] memory targets,
  136. uint256[] memory values,
  137. bytes[] memory calldatas,
  138. bytes32 descriptionHash
  139. ) internal override(Governor, GovernorTimelockControl) {
  140. super._execute(proposalId, targets, values, calldatas, descriptionHash);
  141. }
  142. function _cancel(
  143. address[] memory targets,
  144. uint256[] memory values,
  145. bytes[] memory calldatas,
  146. bytes32 descriptionHash
  147. ) internal override(Governor, GovernorTimelockControl) returns (uint256) {
  148. return super._cancel(targets, values, calldatas, descriptionHash);
  149. }
  150. function _executor() internal view override(Governor, GovernorTimelockControl) returns (address) {
  151. return super._executor();
  152. }
  153. function supportsInterface(bytes4 interfaceId)
  154. public
  155. view
  156. override(Governor, GovernorTimelockControl)
  157. returns (bool)
  158. {
  159. return super.supportsInterface(interfaceId);
  160. }
  161. }