Voting & Incentives

Incentives (Bribes)

Incentives, also called bribes, let projects compete for local gauge votes. BNB voters use veTOPAZ; activated spokes use staked xTOPAZ positions. A deposit targets a reward contract on one chain and pays that chain’s eligible voters.

Why incentives exist

Pre-ve(3,3), a project that wanted deep liquidity for its token had two choices: run its own LP farming program (expensive, no coordination, mercenary capital) or beg a major DEX to list it (slow, opaque, political). Both leak value.

ve(3,3) replaces both with an open auction. Local voters choose which gauges receive the network’s emissions: TOPAZ on BNB, xTOPAZ on spokes. Projects compete for that flow by posting incentives on the gauges they care about. Voters take the incentives that maximize their return. Both sides discover the right price for liquidity transparently.

ℹThe clean part of the design
The project pays once for votes; the protocol's emission schedule does the actual LP-paying. The project never has to run a farming program directly. The voter sells the votes only when the price is right.

The mechanics

Every gauge has an associated BribeVotingReward contract. Anyone can call notifyRewardAmount(token, amount) on it to deposit incentives. Rules:

  • ✓Tokens must be on the Voter's whitelist or already registered as a reward on that contract. This prevents spam / phishing tokens. Whitelisting is governance-controlled.
  • ✓Incentives deposited during epoch n are claimable by voters who voted for that gauge in epoch n, becoming available at the epoch n+1 boundary (Thursday 00:00 UTC).
  • ✓Pro-rata distribution: each voter's claim is (their gauge vote weight) / (total gauge vote weight) × deposited incentive.
  • ✓Multiple tokens per gauge: a gauge can have several incentives simultaneously, each tracked separately.
  • Unclaimed fee and incentive rewards remain keyed to the voting position. There is no general 50-epoch expiry. A burned BNB NFT can lose access to its rewards; a closed spoke stake retains its owner so earlier rewards can still be claimed.

Depositing an incentive (as a project)

  1. 1Identify the target pool and confirm it has an active gauge.
  2. 2Confirm the reward token is on the Voter whitelist. If not, request whitelisting (see Integration Guide).
  3. 3Approve the BribeVotingReward contract for the amount, then call notifyRewardAmount(token, amount). You can do this directly via the contract or through the incentives UI at Incentives.
  4. 4Timing: incentives deposited mid-epoch attract votes for the same epoch. To maximize visibility, deposit early in the epoch (Thursday — Saturday) so voters see them in time.
  5. 5Watch how votes shift in your gauge over the epoch. Adjust subsequent incentive sizes based on observed vote ROI.
⚠No refunds
Incentive deposits cannot be withdrawn by the depositor. Rewards are attributed to their deposit epoch; do not assume a deposit in an epoch with no eligible votes will be refunded or automatically become a later-epoch incentive. Verify the local reward contract and timing before funding it.

Claiming incentives (as a voter)

After an epoch flips, your share of incentives from each gauge you voted for becomes claimable. The app aggregates everything into a single "claim all" button. Programmatically:

  • ✓Voter.claimBribes(bribes[], tokens[][], tokenId) — pass arrays of bribe contracts and the tokens you want to claim from each. Receives the rewards to the NFT owner.
  • ✓Voter.claimFees(fees[], tokens[][], tokenId) — same shape, but for swap-fee rewards from the FeesVotingReward contracts.
  • Claims do not require a current-epoch vote. Keep the original chain, voting contract and position ID available, and resolve NFT reward claims before a merge or wrap burns that NFT.

Strategy notes

For both sides of the market, the same rule applies: incentive ROI is the only metric that matters in steady state. Express it as bribe-per-vote:

bribePerVote = (deposited incentive in $) / (votes attracted)
  • ✓As a voter — sort pools by vAPR (the app sorts by vAPR, total rewards, fees or incentives). Spread votes across the top gauges to maximize income. Re-evaluate each epoch.
  • ✓As a project — target bribe-per-vote slightly higher than the current epoch floor (so you actually attract votes) but not so high that you're overpaying. Deposit early in the epoch so voters see the offer before they finalize allocations.
  • ✓Watch the emission flow. A vote is only worth what its share of next epoch's emissions ends up being worth. Use the local emission token’s market price — TOPAZ on BNB, xTOPAZ on spokes — when valuing expected emissions. Incentive deposits and voter rewards remain separate from LP emissions.

Whitelisting reward tokens

Only governance-whitelisted tokens can be used as incentives. This prevents griefing with worthless or malicious tokens. Projects launching with Topaz typically pre-coordinate whitelisting of their token with governance ahead of mainnet. For new tokens that want incentive eligibility, see the Integration Guide for the request flow.

Plan incentives per chain

A whitelist entry, pool, gauge and incentive token are all local to a deployment. A deposit to a BNB reward contract cannot attract votes to a Base pool. Choose the local chain and live gauge, verify the reward token there, approve the deposit (a standard wallet grants that reward contract one maximum allowance) and review which epoch receives it.

BNB LP emissions are TOPAZ; Robinhood Chain, Base, Ethereum and Arc LP emissions are xTOPAZ. Market price and locked-TOPAZ backing per share are different observations. Incentive deposits are enabled on all five live voting networks: select the network, pool and eligible token, then review the exact approval and deposit. Add incentives.

Continue reading