defi-wonderland.notion.site
Open in
urlscan Pro
2606:4700:4400::6812:2009
Public Scan
Submitted URL: https://governance.sucks/
Effective URL: https://defi-wonderland.notion.site/Wonderland-Governoor-81905fa46bba4eb795344c18e5ede3e1?pvs=4
Submission: On December 22 via api from US — Scanned from US
Effective URL: https://defi-wonderland.notion.site/Wonderland-Governoor-81905fa46bba4eb795344c18e5ede3e1?pvs=4
Submission: On December 22 via api from US — Scanned from US
Form analysis
0 forms found in the DOMText Content
Wonderland Governoor Search Duplicate Try Notion Drag image to reposition WONDERLAND GOVERNOOR A TALE OF A DELEGATE This year, we became a top 5 delegate for Connext DAO, one of the most important bridging protocols in the space. Our journey saw us delving into a diverse array of subjects. While some were right up our alley, others, like legal matters, presented new challenges due to our limited expertise. The OpenZeppelin Governor, an evolution of Compound’s Governor, has emerged as the go-to governance contract in the web3 space. Top-tier protocols such as Uniswap, Optimism, ENS, and more, have adopted it as their primary tool for consensus and decision-making. Yet, the landscape is changing; Increasing market complexities and regulatory scrutiny have added layers of sophistication to organizational processes, signaling that the Governor, despite its widespread use, may be struggling to keep up with the times. Let's consider two notable limitations: DAOs can only set one parameter configuration (like quorum, approval thresholds, etc.) at any given time. Users are restricted to delegating their entire voting power to just one delegate. Some DAOs are already seeking alternatives. For instance, Arbitrum implemented two Governors, and Optimism launched an RFP for a new Governor model to incorporate stakeholder feedback. The current Governor standards, although effective for simpler scenarios, are showing their age in this fast-evolving web3 era, having been in place for over three years - practically an eternity in our world. Blockchains offer the potential for much finer control than what we experience in the physical world. Yet, current governance models lack this level of flexibility. To put it bluntly, the existing Governor standards are falling short, unable to fully harness the nuanced capabilities of blockchain technology. Current Governors suck. INTRODUCING THE WONDERLAND GOVERNOOR > Kudos, anon. You fell down the rabbit hole of governance and made it this far. > Are you ready to see what awaits you in Wonderland? At Wonderland, we thrive on solving puzzles and because of it we’ve decided to embark on a journey to improve Governors, starting with a first version that will feature: Different proposal types: Supporting the addition, removal and management of proposal types, each with different quorums, approval thresholds and voting periods. Smart delegation: Delegation per proposal type: Users will be able to set different delegates for each proposal type, allowing more flexibility and specialization of delegates. Partial delegation: Users will be able to delegate its voting power to multiple addresses. This first version should be enough to demonstrate the power of an enhanced Governor, but if those features aren’t enough, here are some other ideas floating around for future iterations: Different vote types: Not all decisions fit the present “yes, no, abstain” majority voting. We want to allow DAOs to develop voting modules to cater to all the different decisions, like single/multiple choice voting, commit/reveal private votes, quadratic voting, etc. Sub-delegation: With great power comes great responsibility. Delegates and delegators may want help with their duties for several reasons. If A and B delegate 50% of their voting power to C, C might, in turn, delegate that accumulated power to D. This is very helpful for delegates who wish to take a break. Resigning from delegation: Being a delegate is a lot of work, and they should be able to resign from their voting power if they want to stop participating in the governance or even take vacations. HOW WOULD IT LOOK? We'll use OpenZeppelin contracts as the starting point for our project and tweak the following contracts to add the needed features: Votes. ERC20Votes. Governor. Votes: The new contract will now track the delegation information and the snapshots segmented by proposal types. The delegates for a specific proposal type can be more than one, and different weights can be assigned according to the percentage of votes delegated for each of them. Solidity Copy struct Delegatee { address account; uint256 weight; } mapping(address account => mapping(uint8 proposalType => Delegate[] delegates)) private _delegatees; mapping(address delegatee => mapping(uint8 proposalType => Checkpoints.Trace208)) private _delegateCheckpoints; mapping(uint8 proposalType => Checkpoints.Trace208) private _totalCheckpoints; ERC20Votes: This contract will be modified to be compatible with the Votes contract. Governor: The new contract will define the different types of proposals that can be created according to the protocol decision. Created proposals will now require the proposal type field, and when casting a vote, the voting power will be queried according to the proposal type parameter. The contract will allow DAOs to determine how many proposal types they want to support by overriding the function getProposalTypes() external view returns (uint8[] memory). The proposalCore struct will now have the proposalType member: Solidity Copy struct ProposalCore { uint8 proposalType; address proposer; uint48 voteStart; uint32 voteDuration; bool executed; bool canceled; uint48 etaSeconds; } The decision on the proposalTypes implementation will be up to each protocol design. This is an example of how a protocol could implement Governor and store their proposalTypes with a fixed enum: Solidity Copy enum ProposalType { ApproveSpending, GovernanceParameterChanges, SmartContractUpgrades, PolicyAndRuleChanges, CommunityGrantsAndFunding, EmergencyActions, ProtocolChanges } // overridden method function proposalTypes() external view returns (uint8[] memory) { uint8[] memory proposalTypes = new uint8[](7); proposalTypes[0] = uint8(ProposalTypes.ApproveSpending); proposalTypes[1] = uint8(ProposalTypes.GovernanceParameterChanges); proposalTypes[2] = uint8(ProposalTypes.SmartContractUpgrades); proposalTypes[3] = uint8(ProposalTypes.PolicyAndRuleChanges); proposalTypes[4] = uint8(ProposalTypes.CommunityGrantsAndFunding); proposalTypes[5] = uint8(ProposalTypes.EmergencyActions); proposalTypes[6] = uint8(ProposalTypes.ProtocolChanges); return proposalTypes; } If the protocol decides that it wants to have dynamic proposalTypes it could easily implement a dynamic array of proposals: Solidity Copy // ApproveSpending => 0 // GovernanceParameterChanges => 1 // SmartContractUpgrades => 2 // PolicyAndRuleChanges => 3 // CommunityGrantsAndFunding => 4 // EmergencyActions => 5 // ProtocolChanges => 6 uint8[] internal _proposalTypes; uint8 private _proposalNonce; function proposalTypes() external view returns (uint8[] memory) { return _proposalTypes; } function addProposalType() external onlyGovernance { _proposalNonce += 1; _proposalTypes.push(_proposalNonce); } Delegation flows: GET IN TOUCH Thank you for joining Wonderland through out this journey. We are just getting started. If these issues strike a chord, or you have other challenges you think we can assist with, let’s chat!