GovernorVotesQuorumFractionUpgradeable.sol 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // SPDX-License-Identifier: MIT
  2. // OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorVotesQuorumFraction.sol)
  3. pragma solidity ^0.8.0;
  4. import "./GovernorVotesUpgradeable.sol";
  5. import "../../proxy/utils/Initializable.sol";
  6. /**
  7. * @dev Extension of {Governor} for voting weight extraction from an {ERC20Votes} token and a quorum expressed as a
  8. * fraction of the total supply.
  9. *
  10. * _Available since v4.3._
  11. */
  12. abstract contract GovernorVotesQuorumFractionUpgradeable is Initializable, GovernorVotesUpgradeable {
  13. uint256 private _quorumNumerator;
  14. event QuorumNumeratorUpdated(uint256 oldQuorumNumerator, uint256 newQuorumNumerator);
  15. /**
  16. * @dev Initialize quorum as a fraction of the token's total supply.
  17. *
  18. * The fraction is specified as `numerator / denominator`. By default the denominator is 100, so quorum is
  19. * specified as a percent: a numerator of 10 corresponds to quorum being 10% of total supply. The denominator can be
  20. * customized by overriding {quorumDenominator}.
  21. */
  22. function __GovernorVotesQuorumFraction_init(uint256 quorumNumeratorValue) internal onlyInitializing {
  23. __GovernorVotesQuorumFraction_init_unchained(quorumNumeratorValue);
  24. }
  25. function __GovernorVotesQuorumFraction_init_unchained(uint256 quorumNumeratorValue) internal onlyInitializing {
  26. _updateQuorumNumerator(quorumNumeratorValue);
  27. }
  28. /**
  29. * @dev Returns the current quorum numerator. See {quorumDenominator}.
  30. */
  31. function quorumNumerator() public view virtual returns (uint256) {
  32. return _quorumNumerator;
  33. }
  34. /**
  35. * @dev Returns the quorum denominator. Defaults to 100, but may be overridden.
  36. */
  37. function quorumDenominator() public view virtual returns (uint256) {
  38. return 100;
  39. }
  40. /**
  41. * @dev Returns the quorum for a block number, in terms of number of votes: `supply * numerator / denominator`.
  42. */
  43. function quorum(uint256 blockNumber) public view virtual override returns (uint256) {
  44. return (token.getPastTotalSupply(blockNumber) * quorumNumerator()) / quorumDenominator();
  45. }
  46. /**
  47. * @dev Changes the quorum numerator.
  48. *
  49. * Emits a {QuorumNumeratorUpdated} event.
  50. *
  51. * Requirements:
  52. *
  53. * - Must be called through a governance proposal.
  54. * - New numerator must be smaller or equal to the denominator.
  55. */
  56. function updateQuorumNumerator(uint256 newQuorumNumerator) external virtual onlyGovernance {
  57. _updateQuorumNumerator(newQuorumNumerator);
  58. }
  59. /**
  60. * @dev Changes the quorum numerator.
  61. *
  62. * Emits a {QuorumNumeratorUpdated} event.
  63. *
  64. * Requirements:
  65. *
  66. * - New numerator must be smaller or equal to the denominator.
  67. */
  68. function _updateQuorumNumerator(uint256 newQuorumNumerator) internal virtual {
  69. require(
  70. newQuorumNumerator <= quorumDenominator(),
  71. "GovernorVotesQuorumFraction: quorumNumerator over quorumDenominator"
  72. );
  73. uint256 oldQuorumNumerator = _quorumNumerator;
  74. _quorumNumerator = newQuorumNumerator;
  75. emit QuorumNumeratorUpdated(oldQuorumNumerator, newQuorumNumerator);
  76. }
  77. /**
  78. * This empty reserved space is put in place to allow future versions to add new
  79. * variables without shifting down storage in the inheritance chain.
  80. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
  81. */
  82. uint256[49] private __gap;
  83. }