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):
| Duration | Seconds | Multiplier | veGAME per 10,000 GAME |
|---|---|---|---|
| 3 months | 7,776,000 | 0.25× | 2,500 veGAME |
| 6 months | 15,552,000 | 0.50× | 5,000 veGAME |
| 1 year | 31,536,000 | 1.00× | 10,000 veGAME |
| 2 years | 63,072,000 | 2.00× | 20,000 veGAME |
| 4 years | 126,144,000 | 4.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 timestamplockDuration=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)ordelegate(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:
- Voting power: 4× the veGAME of a 1-year lock — 4× the influence over basket composition
- Fee revenue: 4× the weekly distribution from protocol fees (proportional to veGAME)
- Slower decay: The longer the lock, the slower the daily decay as a percentage of balance
- Gaming Council eligibility: 50,000 veGAME required to stand for election
See also: veGAME Token · Locking $GAME · Governance Parameters