TopazTOPAZDocs

Governance

Protocol Governance

Topaz has two governance contracts and a small set of admin roles. This page maps out who can change what, how proposals work, and what the upper bounds of governance authority are.

What governance can and can't do

The protocol itself — the AMM math, the lock mechanics, the emission schedule — is immutable once deployed. Governance does not upgrade core contracts. What governance can change is bounded by what each parameter setter explicitly allows:

  • Tail emission rate (±0.01 percentage points per epoch via EpochGovernor, within 0.01%–1% bounds).
  • Team rate — TOPAZ allocation to the team address (0%–5% of emissions).
  • maxVotingNum — maximum gauges per veNFT vote (default 30).
  • Token whitelist — which tokens are eligible as incentive (bribe) rewards.
  • Managed NFT whitelist — which addresses can mint managed veNFTs.
  • Factory registry approvals — which pool / gauge / rewards factories are valid for new gauge creation.
Immutable core
AMM curves, voting power decay math, lock periods, fee caps, tail rate bounds, factory contracts themselves — these are immutable. New factories can be registered to enable new pool types, but existing pools cannot be retroactively changed. Migration is opt-in by LPs and voters, never forced.

ProtocolGovernor

Topaz's top-level governance contract is a lightly modified OpenZeppelin Governor. Key properties:

ParameterValueDescription
Voting powerveTOPAZ balancePer-NFT, timestamp-based snapshots (EIP-6372 timestamp mode).
QuorumGovernance-setSubject to standard Governor quorum logic.
VetoYesA vetoer role can cancel proposals as a 51% attack mitigation. Designed for emergency use, not routine.
Proposal hashIncludes proposer addressPrevents griefing via frontrun of identical proposals.
RelayDisabledGovernor cannot make arbitrary cross-contract calls outside its specified targets.

Proposals follow the standard Governor lifecycle: propose → delay → vote → queue → execute. Vote weight is captured at the proposal's snapshot timestamp, so locking after a proposal starts does not retroactively earn votes on that proposal.

EpochGovernor — the tail-rate nudge

A second, simpler Governor exists for one specific purpose: adjusting the tail emission rate by exactly one basis point per epoch. Once tail emissions activate, EpochGovernor lets voters choose each week whether to nudge the rate up, down, or hold.

  • One proposal per epoch — the protocol guarantees uniqueness via the epochStart-derived proposal hash.
  • Three options (up / down / hold), plurality wins. No quorum, no proposal threshold.
  • Effect bounded: NUDGE = 1 basis point per call (i.e. 0.01 percentage points).
  • Bounds enforced at the Minter: rate stays in 0.01% – 1% per epoch.
  • Proposals created in epoch n are executed in epoch n+1 after the voting period closes.
  • The very first nudge proposal must be initiated in the epoch before tail emissions activate.
Pre-tail behavior
EpochGovernor only operates once tail emissions are active. Until then, the emission schedule follows its fixed growth/decay curve and EpochGovernor is dormant. Phase-2 decay ends when weekly emissions drop below 8,969,150 TOPAZ — that's when EpochGovernor activates. See TOPAZ & Emissions for the full schedule.

Admin role map

A handful of permissioned roles exist on top of governance. They're held by multisigs or governance-controlled contracts. The full role list is on-chain and visible on the contracts page.

RolePowers
Team multisigReceives the team-rate share of emissions. Holds the protocol's foundation veTOPAZ. Governance can set the team rate to 0.
Emergency CouncilCan kill / revive gauges, deactivate managed NFTs, and toggle the split function. Cannot mint, change emission rate, or move user funds.
Fee ManagerSets per-pool swap fees (within hard caps), enables dynamic fees, configures unstaked-position fees, and manages aggregator discounts.
PauserCan pause individual pools (block swaps) for incident response. Cannot drain or modify balances.
VetoerCan cancel a ProtocolGovernor proposal as a 51%-attack guardrail.

Proposal lifecycle in practice

  • Drafting: discussed openly in Telegram / GitHub before going on-chain. Aim for community consensus before submitting.
  • On-chain proposal: anyone meeting the proposal threshold can submit via ProtocolGovernor.propose().
  • Voting period: starts after the proposal delay, runs for a fixed window. Vote by NFT, not by address — large veTOPAZ NFTs cast a single vote with their entire weight.
  • Queue & execute: if passing, proposal queues into the timelock (if present) and becomes executable.
  • Veto: if the proposal is found to be malicious or buggy during the window, the vetoer can cancel.

Continue reading