GovernorProposalGuardian.sol 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // SPDX-License-Identifier: MIT
  2. // OpenZeppelin Contracts (last updated v5.3.0) (governance/extensions/GovernorProposalGuardian.sol)
  3. pragma solidity ^0.8.24;
  4. import {Governor} from "../Governor.sol";
  5. /**
  6. * @dev Extension of {Governor} which adds a proposal guardian that can cancel proposals at any stage in the proposal's lifecycle.
  7. *
  8. * NOTE: if the proposal guardian is not configured, then proposers take this role for their proposals.
  9. */
  10. abstract contract GovernorProposalGuardian is Governor {
  11. address private _proposalGuardian;
  12. event ProposalGuardianSet(address oldProposalGuardian, address newProposalGuardian);
  13. /**
  14. * @dev Getter that returns the address of the proposal guardian.
  15. */
  16. function proposalGuardian() public view virtual returns (address) {
  17. return _proposalGuardian;
  18. }
  19. /**
  20. * @dev Update the proposal guardian's address. This operation can only be performed through a governance proposal.
  21. *
  22. * Emits a {ProposalGuardianSet} event.
  23. */
  24. function setProposalGuardian(address newProposalGuardian) public virtual onlyGovernance {
  25. _setProposalGuardian(newProposalGuardian);
  26. }
  27. /**
  28. * @dev Internal setter for the proposal guardian.
  29. *
  30. * Emits a {ProposalGuardianSet} event.
  31. */
  32. function _setProposalGuardian(address newProposalGuardian) internal virtual {
  33. emit ProposalGuardianSet(_proposalGuardian, newProposalGuardian);
  34. _proposalGuardian = newProposalGuardian;
  35. }
  36. /**
  37. * @dev Override {Governor-_validateCancel} to implement the extended cancellation logic.
  38. *
  39. * * The {proposalGuardian} can cancel any proposal at any point.
  40. * * If no proposal guardian is set, the {IGovernor-proposalProposer} can cancel their proposals at any point.
  41. * * In any case, permissions defined in {Governor-_validateCancel} (or another override) remains valid.
  42. */
  43. function _validateCancel(uint256 proposalId, address caller) internal view virtual override returns (bool) {
  44. address guardian = proposalGuardian();
  45. return
  46. guardian == caller ||
  47. (guardian == address(0) && caller == proposalProposer(proposalId)) ||
  48. super._validateCancel(proposalId, caller);
  49. }
  50. }