Skip to main content

veGAME Mechanics

veGAME (vote-escrowed GAME) is the non-transferable token issued when $GAME holders lock their tokens. It determines voting weight, fee revenue share, and eligibility to stand for Gaming Council election.

Locking

To receive veGAME, call VeGAME.lock(gameAmount, durationSeconds):

DurationSecondsMultiplierveGAME per 10,000 GAME
3 months7,776,0000.25×2,500 veGAME
6 months15,552,0000.50×5,000 veGAME
1 year31,536,0001.00×10,000 veGAME
2 years63,072,0002.00×20,000 veGAME
4 years126,144,0004.00×40,000 veGAME

These are the only valid durations. Any other value reverts with InvalidLockDuration.

Linear Decay Formula

veGAME balance decays linearly to zero as the lock approaches expiry:

veBalance(t) = gameAmountLocked × multiplierBps × (lockEnd − t)
─────────────────────────────────────────────────
lockDuration × 10,000

Where:

  • t = current timestamp (seconds)
  • lockEnd = expiry timestamp
  • lockDuration = lockEnd − lockStart (in seconds)
  • multiplierBps = 2500, 5000, 10000, 20000, or 40000

Key values:

  • At t = lockStart: full veGAME balance
  • At t = lockStart + lockDuration/2: exactly half the original balance
  • At t = lockEnd: exactly zero

The decay formula always multiplies before dividing to preserve integer precision in Solidity.

Managing Locks

Adding to a Lock

VeGAME.addToLock(additionalGameAmount)

Adds more $GAME to an active, non-expired lock at the same duration and multiplier. The new $GAME is subject to the same lockEnd.

Extending a Lock

VeGAME.extendLock(newDurationSeconds)

Resets the lock from the current timestamp to the new duration. The newDurationSeconds must result in a lockEnd later than the current lockEnd. veGAME balance immediately recalculates at the full multiplier for the new duration.

Example: A 1-year lock placed 6 months ago (0.5 years remaining, 50% of original veGAME left) can be extended to a fresh 2-year lock, immediately restoring to 2× the full balance.

Withdrawing

VeGAME.withdraw()

Callable only after block.timestamp >= lockEnd. Returns the full gameAmountLocked to the caller. veGAME balance is already zero at this point.

Fee Revenue Distribution

Protocol fees are deposited to VeGAME.sol weekly by FeeCollector as $GAME (not USDC — FeeCollector converts all revenue to $GAME before depositing):

VeGAME.depositFees(gameAmount)  // FeeCollector only

Each staker's claimable share is proportional to their initial ve at lock (not their live decaying veGAME balance), weighted by their lock tier's fee reward multiplier:

feeWeight = initialVe × feeRewardMultiplierBps[tier] / 10_000
yourShare = yourFeeWeight / totalFeeWeight × distributedGameAmount

Fees are claimed by calling:

VeGAME.claimRewards() returns (uint256 gameClaimed)

Governance Snapshots

Historical veGAME balances are required for governance vote weight. The VeGAME contract supports:

function balanceOfAt(address account, uint256 timestamp) external view returns (uint256);
function totalSupplyAt(uint256 timestamp) external view returns (uint256);

These functions use a checkpoint system to return accurate historical balances. The proposal snapshot is set at the block when a proposal is submitted — tokens locked after the snapshot have no effect on that vote.

Delegation

VeGAME.delegate(address delegatee)
  • Transfers voting power (not tokens) to another address
  • Revocable at any time by calling delegate(anotherAddress) or delegate(yourOwnAddress)
  • The delegator retains fee revenue distribution — only voting power is delegated
  • Recognized delegates are listed in the governance portal with their voting history

Summary: Why Lock Long?

The 4-year lock is genuinely attractive, not just symbolically:

  1. Voting power: 4× the veGAME of a 1-year lock — 4× the influence over basket composition
  2. Fee revenue: 4× the weekly distribution from protocol fees (proportional to veGAME)
  3. Slower decay: The longer the lock, the slower the daily decay as a percentage of balance
  4. Gaming Council eligibility: 50,000 veGAME required to stand for election

See also: veGAME Token · Locking $GAME · Governance Parameters