-
Notifications
You must be signed in to change notification settings - Fork 12.1k
Add a governor extension that implements a proposal guardian #5303
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add a governor extension that implements a proposal guardian #5303
Conversation
🦋 Changeset detectedLatest commit: 276185d The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Looks good other than some comments. Would it make sense to call it something like |
Compound Governance already has a feature like this where the council is called the |
9bc440d
to
d613cc8
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the rationale to allow a proposer to cancel a proposal at any time?
I think the contract would be simpler if it just focus on allowing the guardian to cancel at any time and otherwise fallback to their original behavior with super
.
The inspiration for this PR is in #5260 which was then replaced by #5301. There is some context missing but will try to give a TLDR.
|
Co-authored-by: Ernesto García <[email protected]>
Co-authored-by: Ernesto García <[email protected]>
Right, this was my interpretation as well. I also don't have any concrete example of such an exploit. Getting back to the whole idea of enhancing cancellation capabilities, one concern I have with this design is the pattern: if (...) {
...
_cancel(...);
} else if (...) {
...
_cancel(...);
} else {
super.cancel();
} The reasoning is that we're allowing to bypass Consider a contract that inherits from contract GovernorCancellationCounter {
uint256 cancellations;
function cancel(...) public override virtual returns (uint256) {
cancellations++;
super.cancel(...);
}
}
contract MyGovernor is ..., GovernorCancellationCounter, GovernorProposalGuardian { ... } // Order is important In this case, the count would be missing the internal branches that don't call I'd feel more comfortable if function _validateCancel(...) internal virtual {
// Current logic
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
_validateStateBitmap(proposalId, _encodeStateBitmap(ProposalState.Pending));
if (_msgSender() != proposalProposer(proposalId)) {
revert GovernorOnlyProposer(_msgSender());
}
}
...
function cancel(...) public virtual returns (uint256) {
_validateCancel();
return _cancel(targets, values, calldatas, descriptionHash);
} I think this way users can override |
use `_validateCancel` instead of overriding `cancel`
Co-authored-by: Hadrien Croubois <[email protected]>
Co-authored-by: Hadrien Croubois <[email protected]>
Co-authored-by: Hadrien Croubois <[email protected]>
Should the proposal guardian have the ability to give up this role? I could see an argument in either direction but think it's worth a brief discussion before merging. For: Against: I think I lean towards for since the frequency of broken proposals out in the wild is quite high. If the proposal guardian isn't able to act effectively, the DAO needs the proposers to have this ability. |
When there is a guardian, proposer still have the ability to cancel "early". IMO:
function transferProposalGuardian(address newProposalGuardian) public {
require(_msgSender == proposalGuardian());
_setProposalGuardian(newProposalGuardian);
} When in doubts, or when we think not everyone needs something, I'm always in favor of not forving the feature. In that particular case, the Governor is already close to the limit en terms of bytecode size, so I would avoid increassing it for something users may not want/need. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
* Update ReentrancyGuardTransient documentation (OpenZeppelin#5417) * Optimize `MerkleTree` for loops by using `uint256` iterators (OpenZeppelin#5415) Co-authored-by: Ernesto García <[email protected]> * Update `_revokeRole` documentation in AccessControl (OpenZeppelin#5321) Co-authored-by: Ernesto García <[email protected]> * Merge release-v5.2 branch (OpenZeppelin#5424) Signed-off-by: Hadrien Croubois <[email protected]> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Hadrien Croubois <[email protected]> Co-authored-by: Sam Bugs <[email protected]> Co-authored-by: Ernesto García <[email protected]> Co-authored-by: Arr00 <[email protected]> Co-authored-by: wizard <[email protected]> Co-authored-by: leopardracer <[email protected]> Co-authored-by: cairo <[email protected]> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Francisco Giordano <[email protected]> Co-authored-by: Simka <[email protected]> Co-authored-by: Voronor <[email protected]> * Add a Calldata library with `emptyBytes` and `emptyString` functions (OpenZeppelin#5422) Co-authored-by: Ernesto García <[email protected]> * Update governor docs (OpenZeppelin#5420) * Add missing `Calldata`, `Bytes`, `CAIP2` and `CAIP10` API references (OpenZeppelin#5428) * Expose `_isTrustedByTarget` internally in ERC2771Forwarder (OpenZeppelin#5416) * Update LICENSE (OpenZeppelin#5434) * Refactor EnumerableSet.behavior.js for reuse in the community repo (OpenZeppelin#5441) * Replace `overriden` with `overridden` in GovernorCountingOverridable.sol (OpenZeppelin#5446) Co-authored-by: Arr00 <[email protected]> Co-authored-by: ernestognw <[email protected]> * Remove Unnecessary Initialisation of `_paused` (OpenZeppelin#5448) Co-authored-by: Ernesto García <[email protected]> * Fix Broken Docs References (OpenZeppelin#5436) * Update actions/upload-artifact action to v4 (OpenZeppelin#4826) * Remove unused `setBaseURI` tests (OpenZeppelin#5456) Co-authored-by: Hadrien Croubois <[email protected]> * Group typographical errors (OpenZeppelin#5443) Co-authored-by: futreall <[email protected]> Co-authored-by: Marco <[email protected]> Co-authored-by: Dmitry <[email protected]> Co-authored-by: Dmytrol <[email protected]> Co-authored-by: Noisy <[email protected]> Co-authored-by: Danil <[email protected]> Co-authored-by: CrazyFrog <[email protected]> Co-authored-by: Bryer <[email protected]> Co-authored-by: Viktor Pavlik <[email protected]> Co-authored-by: Skylar Ray <[email protected]> Co-authored-by: Brawn <[email protected]> Co-authored-by: fuder.eth <[email protected]> Co-authored-by: FT <[email protected]> Co-authored-by: Ann Wagner <[email protected]> Co-authored-by: Hopium <[email protected]> Co-authored-by: Arr00 <[email protected]> Co-authored-by: Hadrien Croubois <[email protected]> * Fix interface docs ordering and add missing interface (OpenZeppelin#5460) * Add a governor extension that implements a proposal guardian (OpenZeppelin#5303) Co-authored-by: Arr00 <[email protected]> Co-authored-by: Ernesto García <[email protected]> * Fix the CLI output of formal verification runs (OpenZeppelin#5445) * Update dependency halmos to v0.2.4 (OpenZeppelin#5461) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> * Use stable foundry version in CI (OpenZeppelin#5465) * Add stake management function to ERC4337Utils (OpenZeppelin#5471) * Add forum badge correct link (OpenZeppelin#5481) * SafeERC20.trySafeTransfer{,from} (OpenZeppelin#5483) * Improve promise rejections handling in hardhat/async-test-sanity.js (OpenZeppelin#5429) Co-authored-by: Arr00 <[email protected]> * Use slither v0.10.4 (OpenZeppelin#5488) * Add ERC6909 Implementation along with extensions (OpenZeppelin#5394) Co-authored-by: Hadrien Croubois <[email protected]> Co-authored-by: Ernesto García <[email protected]> * Rename ERC4337Utils ENTRYPOINT to ENTRYPOINT_V07 (OpenZeppelin#5472) Co-authored-by: Hadrien Croubois <[email protected]> * Add Bytes32x2Set (OpenZeppelin#5442) Co-authored-by: Ernesto García <[email protected]> * Add clear function to Enumerable{Set,Map} (OpenZeppelin#5486) Co-authored-by: Hadrien Croubois <[email protected]> * Make set-max-old-space-size.sh compatible with sh (OpenZeppelin#5493) Co-authored-by: Hadrien Croubois <[email protected]> * Update FUNDING.json (OpenZeppelin#5496) Co-authored-by: Hadrien Croubois <[email protected]> * Update FUNDING.json hierarchy (OpenZeppelin#5500) Co-authored-by: Hadrien Croubois <[email protected]> * Test behavior of SignatureChecker against the identity precompile (0x4) (OpenZeppelin#5501) * Treat code-size warnings as errors (OpenZeppelin#5101) Co-authored-by: Hadrien Croubois <[email protected]> * Make `TimelockController` receive function virtual (OpenZeppelin#5506) Co-authored-by: Arr00 <[email protected]> Co-authored-by: Hadrien Croubois <[email protected]> --------- Signed-off-by: Hadrien Croubois <[email protected]> Co-authored-by: Ernesto García <[email protected]> Co-authored-by: Michael <[email protected]> Co-authored-by: Maks <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Hadrien Croubois <[email protected]> Co-authored-by: Sam Bugs <[email protected]> Co-authored-by: Arr00 <[email protected]> Co-authored-by: wizard <[email protected]> Co-authored-by: leopardracer <[email protected]> Co-authored-by: cairo <[email protected]> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: Francisco Giordano <[email protected]> Co-authored-by: Simka <[email protected]> Co-authored-by: Voronor <[email protected]> Co-authored-by: Eric Lau <[email protected]> Co-authored-by: planetBoy <[email protected]> Co-authored-by: sudo rm -rf --no-preserve-root / <[email protected]> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Renan Souza <[email protected]> Co-authored-by: futreall <[email protected]> Co-authored-by: Marco <[email protected]> Co-authored-by: Dmitry <[email protected]> Co-authored-by: Dmytrol <[email protected]> Co-authored-by: Noisy <[email protected]> Co-authored-by: Danil <[email protected]> Co-authored-by: CrazyFrog <[email protected]> Co-authored-by: Bryer <[email protected]> Co-authored-by: Viktor Pavlik <[email protected]> Co-authored-by: Skylar Ray <[email protected]> Co-authored-by: Brawn <[email protected]> Co-authored-by: fuder.eth <[email protected]> Co-authored-by: FT <[email protected]> Co-authored-by: Ann Wagner <[email protected]> Co-authored-by: Hopium <[email protected]> Co-authored-by: Yan Victor SN <[email protected]> Co-authored-by: Ursula <[email protected]> Co-authored-by: Michalis Kargakis <[email protected]> Co-authored-by: luca <[email protected]> Co-authored-by: Jonas <[email protected]> Co-authored-by: Joseph Delong <[email protected]>
Fixes #5301
PR Checklist
npx changeset add
)