Skip to Content

Keeper Incentives

Keepers keep the Velocity network healthy.

Velocity has no fuel (points/incentives) program; fuel-based keeper/user rewards were removed entirely. The only keeper incentives on Velocity are the on-chain fee/reward mechanics described below.

Keeper Rewards

For matching orders, Keepers receive a portion of the taker fee as a filler reward. See Filler Reward.

For cancelling orders (that can be cancelled, see Advanced Orders FAQ), Keepers will receive the flat_filler_fee from the exchange-wide perp fee structure (State.perp_fee_structure.flat_filler_fee, currently $0.01), paid out via pay_keeper_flat_reward_for_perps when a keeper triggers an order expiry or reduce-only cancellation.

Liquidation rewards for keepers are set per-market (liquidator_fee) and read directly from each market’s on-chain account: check PerpMarketAccount.liquidatorFee / SpotMarketAccount.liquidatorFee for current values.

Currently, the USDT reward function for keepers (f_keeper) is designed as:

fkeeper=min(0.01max(1,torder)1/4,0.1fuser)f_{\text{keeper}} = \textit{min}(0.01 \ast \textit{max}\left(1, t_{\text{order}}\right)^ {1/4}, 0.1 \ast f_{\text{user}})

where: tordert_{\text{order}} is whole 400ms periods of order age (elapsed slots converted to wall-clock time, then divided into 400ms periods) fuserf_{\text{user}} is the taker fee paid by the user who placed the order

This is the lesser of a size-based reward (10% of the fee) and a time-based reward that grows with the fourth root of the order’s age in 400ms periods, see calculate_filler_reward (math/fees.rs) for the on-chain calculation. Counting whole 400ms periods rather than raw slots keeps the reward curve’s wall-clock shape the same even if the chain’s slot duration changes.

A Keeper reward multiplier (for taker price improvement) is applied to the keeper’s minimum time-based reward component in the function above. Any percent improvement versus the baseline oracle +/- 10bps, increases this multiplier. This multiplier only applies when the keeper fills a taker order against a resting maker order; fills routed to the AMM always use a 1x multiplier.

30d fill volume for keepers is tracked on-chain via UserStats, allowing for logic to reward consistent keepers with a larger multiplier on rewards.

Last updated on