Token Voting
This documentation shows the build 3 which uses 1.4 protocol version. Currently, these are being audited. Even though, contracts are backwards compatible, we do NOT recommend using these latest versions in production until audit is finished. |
Description
TokenVoting is a governance plugin developed and maintained by the Aragon core team. It enables decision-making in DAOs through proposals and token-based voting, where members’ influence is proportional to their token holdings or delegated voting power. Proposals succeed if they meet a configurable majority voting rule and other customizable parameters.
The plugin supports governance-ready ERC20 tokens (ERC20Votes
) and can also deploy and mint new tokens that implement ERC20Votes
. Additionally, it allows existing standard ERC20 tokens to be wrapped with governance capabilities using an ERC20Votes
wrapper.
Proposal Lifecycle
Creation
Proposals can be created by users granted the CREATE_PROPOSAL_PERMISSION
or those verified through the VotingPowerCondition
, depending on the plugin’s configuration.
Below are the essential operations of proposal creation:
-
Snapshot Block: Captures the state of the previous block (
block.number - 1
) at the time of creation. -
Proposal Initialization: Instantiates a new proposal and records all relevant parameters, such as metadata, proposed actions, start and end dates, and voting settings.
-
Creator Voting: Allows proposal creators to cast their vote during the creation process, aligning their intent with the proposal.
Proposal creation settings:
|
Voting
Voters express their preferences through the vote
function, which:
-
Verifies voter eligibility and records their vote.
-
Supports vote replacement (if enabled).
-
Allows early execution attempts if thresholds are met and the voter is eligible to execute the proposal.
Execution
Proposals can be executed by calling the execute
function on the plugin, provided the following conditions are met:
-
Permission Verification: The
execute
function is guarded by theEXECUTE_PROPOSAL_PERMISSION
, ensuring only authorized users can trigger the execution.
Typically, this permission is set to any address, allowing anyone to execute, but it can also be restricted to specific users or conditions if needed.
-
Threshold Verification: The plugin ensures that all thresholds (Support, Participation, and Approval) are satisfied, verifying the proposal’s success.
-
Action Passing: The plugin passes them to the associated DAO or to the configured executor, which is responsible for their execution.
-
Finalization: Once the actions are passed and executed, the plugin marks the proposal as executed.
Proposal execution settings:
|
Voting Modes
The TokenVoting plugin supports three distinct voting modes, each designed to meet different governance needs. These modes cannot be enabled simultaneously because their logic and execution criteria conflict. DAOs must choose one mode based on their decision-making preferences.
-
Normal: Proposals succeed after the voting period ends if:
-
Support Criterion:
\((1 - \texttt{supportThreshold}) \cdot N_\text{yes} > \texttt{supportThreshold} \cdot N_\text{no}\)
The ratio of "Yes" votes to "No" votes must exceed the configured support threshold. -
Participation Criterion:
\(N_\text{yes} + N_\text{no} + N_\text{abstain} \geq \texttt{minVotingPower}\)
The total voting power used in the proposal must meet the minimum participation requirement. -
Approval Criterion:
\(N_\text{yes} \geq \texttt{minApprovalPower}\)
The number of "Yes" votes meets or exceeds the minApprovalPower.
-
-
Early Execution: Proposals in this mode can succeed before the voting period ends if the outcome is mathematically certain, even if all remaining votes are "No."
-
Worst-Case No Votes Formula:
\(N_\text{no, worst-case} = N_\text{total} - N_\text{yes} - N_\text{abstain}\)
Calculates the maximum possible "No" votes by assuming all remaining voting power is cast as "No." -
Support Criterion for Early Execution:
\((1 - \texttt{supportThreshold}) \cdot N_\text{yes} > \texttt{supportThreshold} \cdot N_\text{no, worst-case}\)
Ensures "Yes" votes exceed the support threshold, even in the worst-case scenario of all remaining votes being "No."
-
-
Vote Replacement: Voters can update their preferences during the voting period. Only the latest vote is tallied.
Token Support
The TokenVoting plugin exclusively supports tokens that implement the ERC20Votes
standard from OpenZeppelin (Learn more), which provides block-specific voting power snapshots and delegation capabilities.
For DAOs with existing non-governance tokens, these tokens can still be used with the plugin. Please refer to the Wrapped Token Setup section for details on how standard ERC20 tokens can be wrapped for governance. |
Plugin Setup
-
Contracts: The TokenVotingSetup contains the TokenVoting plugin’s implementation and automatically deploys and prepares the following contracts:
-
TokenVoting Proxy: The ERC1967Proxy contract pointing to the plugin’s implementation.
-
VotingPowerCondition: A condition contract to determine if a user meets the minimum voting power or balance required to create a proposal.
-
Governance ERC20 Token: The plugin setup offers flexible options for DAOs to prepare tokens for governance, depending on their existing token situation:
-
Existing Governance Tokens: If an
ERC20Votes
token is provided during setup, the plugin will use it directly. -
Token Deployment and Minting: If no token is provided, the setup deploys a new
GovernanceERC20
token and mints an initial supply as specified by the user. -
Token Wrapping: For DAOs with a standard (non-governance) ERC20 token, the setup wraps it into a
GovernanceWrappedERC20
token. This wrapper adds governance capabilities, enabling voting and delegation, while allowing deposits and withdrawals of the original token.
-
-
-
Permissions: The following permissions are set up by default by the TokenVotingSetup:
Permission ID | Where (Granted By) | Who (Granted To) | Condition | Functions |
---|---|---|---|---|
|
DAO |
Plugin |
None |
|
|
Plugin |
DAO |
None |
|
|
Plugin |
DAO |
None |
|
|
Plugin |
DAO |
None |
|
|
Plugin |
Any Address |
|
|
|
Plugin |
Any Address |
None |
|
|
Associated Governance Token |
DAO |
None |
|
This setup ensures that the TokenVoting plugin is ready for operation immediately after installation, with all required contracts deployed and permissions configured.