| id | governor-walkthrough |
|---|---|
| title | Governor Walkthrough |
| sidebar_label | Governor Walkthrough |
The Optimism Governor is based on OpenZeppelin’s Governor, customized to support Optimism’s governance needs: signalling proposals, customizable voting rules, subdelegations, and so on.
In the long run, anyone should be able to propose changes, but safeguards like delegate approvals, quorum thresholds, and timelocks are required to ensure quality and protect against manipulation.
Some useful resources:
- Governor GitHub Repo (voteagora)
- vote.optimism.io: front-end interface for participation
The OptimismGovernor contract is upgradeable, following a proxy pattern:
Governor Proxy:0xcDF27F107725988f2261Ce2256bDfCdE8B382B10Alligator(subdelegations):0x7f08F3095530B67CdF8466B7a923607944136Df0ProposalTypesConfigurator:0xCE52b7cc490523B3e81C3076D5ae5Cca9a3e2D6FVotableSupplyOracle:0x1b7CA7437748375302bAA8954A2447fC3FBE44CC
While proposals today are signaling-only for most types (i.e., they do not trigger automatic onchain execution), the system enforces the full governance lifecycle: Pending → Active → Succeeded → Queued → Executed. The key exceptions are Governance Fund (Missions) proposals and certain Security Council proposals, which do cause onchain token transfers, for example, transferring OP to fund a Mission or allocating ETH from the treasury.
admin: Owns the proxy and controls upgrades. Does not vote or propose.manager: Can create proposals, execute them, or update system parameters.voters: Any address with delegated OP, either directly or through Alligator.
contract OptimismGovernor is
Initializable,
GovernorUpgradeableV2,
GovernorCountingSimpleUpgradeableV2,
GovernorVotesUpgradeableV2,
GovernorVotesQuorumFractionUpgradeableV2,
GovernorSettingsUpgradeableV2Each inherited contract contributes:
GovernorUpgradeableV2: Core lifecycle logic, proposal state machineGovernorCountingSimpleUpgradeableV2: Vote tallying (for/against/abstain)GovernorVotesUpgradeableV2: Gets historical voting power at a given blockGovernorVotesQuorumFractionUpgradeableV2: Legacy support for % quorumGovernorSettingsUpgradeableV2: Configurable parameters (e.g. voting period)
:::warning
The Optimism Governor overrides some of these base contracts, notably quorum and proposal thresholds, using a ProposalTypesConfigurator and VotableSupplyOracle
:::
The Governor supports two proposal paths:
propose(...): // Standard proposal
proposeWithModule(...): // Proposal with custom voting moduleOnly the manager or timelock() can propose. Each proposal is assigned a proposalType, which maps to specific quorum/approval thresholds in the ProposalTypesConfigurator.
Voting is handled via:
castVote(): standard token-based votingcastVoteFromAlligator(): partial delegation via the Alligator contractVoteCastWithParams: supports modules that require additional input (e.g., ranked or approval voting)
Proposals are executed via the Timelock contract, using execute() or executeWithModule().
The Alligator enables partial delegation; a user can split their voting power across multiple delegates using absolute or relative rules. These delegations can be chained (A → B → C) and validated onchain using authority[] arrays.
The key structures are:
subdelegations[from][to]: maps delegationsSubdelegationRules: define allowance,maxRedelegations, timing, and custom logic- Supports batched voting with
castVoteWithReasonAndParamsBatched(...)
The contract validates that:
- Each delegation is valid and within limits
- The final sender is authorized
- No overuse or double-voting has occurred
It then forwards votes to castVoteFromAlligator() on the Governor.
Proposals can have different voting requirements depending on their type. This configurator allows each proposalType to define:
- quorum (e.g. 5100 = 51%)
- approvalThreshold (e.g. 7600 = 76%)
- name, description, module (if any)
Proposal thresholds are stored with 1e4 scaling (10000 = 100%). The Governor calls proposalTypesConfigurator.proposalTypes(proposalTypeId) during voting and quorum checks.
Instead of the total token supply, quorum is based on votable supply — the total OP that has been delegated. This is retrieved at the proposal creation block and used to calculate thresholds dynamically.
- Fallback: if
votableSupply()returns zero, the Governor falls back to the total token supply.
Proposal Management
propose()/proposeWithModule()setVotingDelay(),setVotingPeriod(),setProposalThreshold()setProposalDeadline(): update deadline during votingcancel(),cancelWithModule()
Voting
castVote()castVoteFromAlligator(...)increaseWeightCast(...): internal weight accounting for partial votes
Execution
queue(),queueWithModule()execute(),executeWithModule()
We are working on an upgrade that is evolving toward permissionless proposals, enforced via DelegatesProposalValidator contract, which gates access to propose() based on delegate approvals and submission windows, allowing any qualifying participant to propose, while still preserving cycle alignment.