Skip to content

Liquidity Rewards

Oracle pays a daily USDC budget per market to wallets that post tight two-sided quotes. This is how the exchange incentivizes LPs to keep spreads narrow on markets you care about.

How you earn

Every 30 seconds the engine snapshots each market's order book. For each wallet with resting orders, the rewards service scores them per Polymarket's canonical formula.

Per-side score (quadratic distance penalty)

For each side (bid and ask) with a resting order ≥ min_size contracts and within max_spread_bps of mid:

side_score = size × ((max_spread − distance_from_mid) / max_spread)² × in_game_multiplier

Note the square. A quote at mid earns full size × multiplier; a quote halfway to the max spread earns only 25% (0.5²); at the max spread boundary, 0.

Combined score with single-sided penalty

combined = max( min(bid_score, ask_score),  max(bid_score, ask_score) / c )

Where c = 3 (Polymarket's canonical single-sided scale factor).

Translation:

  • Balanced two-sided quoting (similar bid + ask scores) → full credit (combined ≈ min).
  • Single-sided quoting (bid-only or ask-only) → 1/3 credit of your active side (combined = max / 3).
  • The c = 3 factor penalizes one-sided inventory building without killing it entirely, matching Polymarket's documented constant.

Daily aggregate

Daily score = sum of sample scores across the day. The rewards service samples every 30s = 2880 samples/day. A wallet quoting tightly for the full day accumulates the max; a wallet that drops off for an hour loses ~4% of its daily total.

Each market has its own max_spread_bps, min_size, daily_budget_usdc, and in_game_multiplier — listed via GET /v1/rewards/config.

Daily distribution

At 00:00 UTC, each market's budget is split across that day's scoring wallets pro-rata by total score:

your_payout_micro_usdc = floor(your_score / sum_of_all_scores × daily_budget_usdc)

Credits accumulate in claimable_micro_usdc against your wallet, keyed by wallet pubkey (not per-market — it's a single rolling balance across all markets you've scored on).

Claiming

Rewards are claimable on-chain. The operator relays your claim tx — you call the API, the operator submits the claim_rewards instruction on oracle-vault (Fogo), and USDC moves from the fee treasury into your proxy wallet's USDC ATA.

POST /admin/rewards/claim
X-Admin-Key: <admin key>

{
  "wallet": "<bs58 fogo pubkey>",
  "amount_micro_usdc": 5000000           // optional; defaults to full claimable
}

Response:

{
  "claimed_micro_usdc": 5000000,
  "remaining": 400000,
  "signature": "5Kx8..."
}

The signature is the on-chain Fogo tx. remaining reflects the wallet's claimable_micro_usdc after the decrement. Decrement is atomic and clamps at zero.

The public self-service claim endpoint is on the near-term roadmap; today the claim is operator-relayed and requires the admin key. Market makers with active positions should contact the Parti team to schedule automated sweeps.

Endpoints

Current-day leaderboard

GET /v1/rewards/leaderboard?market_id=<hex>&day=YYYY-MM-DD

day defaults to today (UTC). Response:

{
  "market_id": "abc123...",
  "day": "2026-04-15",
  "entries": [
    { "wallet": "4zGaxW...", "score": 42150.3 },
    { "wallet": "8vYu7k...", "score": 9880.2 }
  ]
}

Your claimable balance

GET /v1/rewards/wallet/{wallet}

Returns cumulative unclaimed micro-USDC across all markets:

{ "wallet": "4zGaxW...", "claimable_micro_usdc": 5400000 }

Market configs

GET /v1/rewards/config

Returns the current reward parameters for every market:

{
  "configs": {
    "abc123...": {
      "max_spread_bps": 200,
      "min_size": 100,
      "daily_budget_usdc": 10000000,
      "in_game_multiplier": 1.0
    }
  }
}

Admin-only

Set / update a market's rewards config

POST /admin/rewards/config
X-Admin-Key: <admin key>

{
  "market_id": "abc123...",
  "max_spread_bps": 200,
  "min_size": 100,
  "daily_budget_usdc": 10000000,
  "in_game_multiplier": 1.0
}

Markets without a config earn no rewards. Adding a config is the switch that turns rewards on for that market.

Strategy notes

  • Quote at mid: score peaks at the mid price and falls off quadratically. A quote 50 bps out of a 200 bps band scores (150/200)² = 0.5625 of mid. A quote at the band edge scores 0.
  • Size matters linearly: doubling size doubles your score (within your inventory limits).
  • Uptime compounds: score is summed over 2880 daily samples. Missing 10 minutes costs ~0.7%; missing an hour costs ~4%.
  • Balance beats volume: the c = 3 penalty means one-sided quoting earns ~33% of what balanced quoting earns for the same size. If inventory is skewed, quote smaller on the constrained side rather than dropping it entirely.
  • Ties split pro-rata: bigger capital wins on evenly-matched markets; tighter quotes beat size on skewed markets.
  • Parameter changes: max_spread_bps, min_size, daily_budget, and the scoring formula itself can change without notice — pull GET /v1/rewards/config before each session and subscribe to protocol announcements.

Roadmap

  • Public self-service POST /v1/rewards/claim — remove the admin-key gate
  • Anti-layering heuristics — self-cross / wash detection
  • Per-wallet rate caps — prevent one whale from hoovering a market's budget
  • Frontend leaderboard with projected payout