GovernorFullHarness.sol 6.8 KB

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