Voting & Incentives
Gauge Voting
Each active LP pool has a gauge that receives a share of weekly TOPAZ emissions, proportional to votes it gets from veTOPAZ holders. This page is the operating manual for casting and managing those votes.
Epochs at a glance
The protocol runs on weekly epochs. All voting, emissions, fees, and bribe accounting align to this clock.
| Parameter | Value | Description |
|---|---|---|
| Epoch length | 7 days (604,800 seconds) | Thursday 00:00 UTC → Thursday 00:00 UTC. |
| Distribution window | First hour of each epoch | Vote, depositManaged, withdrawManaged, reset, and poke are disabled while the protocol distributes the prior epoch's emissions. |
| Final-hour window | Last hour before epoch flip | Only whitelisted (approved) NFTs can vote during this final hour. |
| Max gauges per vote | 30 | Set by Voter.maxVotingNum; governance-adjustable. |
How to vote
- 1Lock TOPAZ to receive a veTOPAZ NFT. See veTOPAZ Locks.
- 2Open app.topazdex.com/vote. The page lists every active gauge with its current vote weight, expected emission share, recent bribe-per-vote, and swap-fee yield.
- 3Allocate your vote weight across up to 30 gauges. Weights are proportional, not absolute — entering 60 / 40 splits your NFT's voting power 60% to the first gauge and 40% to the second.
- 4Submit. The transaction goes to the Voter contract, which records your vote and updates gauge weights immediately.
- 5After the next epoch flip (Thursday 00:00 UTC), claim your share of trading fees and bribes from the FeesVotingReward and BribeVotingReward contracts of each gauge you voted for.
Reset, re-vote, and poke
Three operations exist for managing a vote over time:
- ✓vote(...) — Cast or replace your vote. Allowed once per epoch, outside the first-hour distribution window. Whitelisted NFTs can also vote during the final-hour window.
- ✓reset() — Removes all vote weight from your NFT. Useful before withdrawing your TOPAZ at lock expiry, or before depositing into a managed NFT. You cannot vote in the same epoch you reset (the lastVoted clock is tracked at the NFT level).
- ✓poke()— Refreshes the voting-weight snapshot for your NFT in all the reward contracts it's in. Useful if your locked amount changed (you added more TOPAZ, merged with another NFT, etc.) and you want the gauge to record the new weight immediately rather than at the next vote. Doesn't change which gauges you voted for, only the weight.
Who earns what
The clean separation between LPs and voters is the central design choice of ve(3,3):
Liquidity Providers (LPs)
Stake LP tokens or Slipstream NFTs in gauges and earn TOPAZ emissions. The more votes a gauge receives, the more emissions flow to its LPs. LPs do not earn swap fees on staked positions — those flow to voters via the FeesVotingReward contract.
veTOPAZ Voters
Vote on gauges and earn 100% of trading fees on those pools plus any incentives (bribes) deposited by projects. Voters don't earn emissions directly — they direct where emissions flow. Both fees and incentives are claimable starting the epoch after they accrue.
Claiming rewards
Three types of rewards become claimable after each epoch flip:
- ✓Trading fees from voted pools. Claim via
Voter.claimFees(feeContracts[], tokens[][], tokenId). - ✓Bribes / incentives from voted pools. Claim via
Voter.claimBribes(bribeContracts[], tokens[][], tokenId). - ✓Rebases on your veTOPAZ. Claim via
RewardsDistributor.claim(tokenId)orclaimMany(tokenIds[]). Auto-compounds for active locks.
The app aggregates all three into a single "claim" flow. Unclaimed rewards persist for up to 50 epochs before they forward to future voters — claim regularly, especially for smaller positions where gas vs. reward matters.
Vote delegation vs gauge voting
A common point of confusion: the delegate() function on VotingEscrow delegates governance voting power (used in ProtocolGovernor / EpochGovernor proposals) and is only available for permanent locks and managed NFTs. It does not delegate gauge votes. To delegate gauge voting, deposit your NFT into a managed NFT — see Managed Locks.
