Liquidity & Slippage
SportsPerp markets start thin. All 68 markets share a single global liquidity pool (cross-market) — net pool size depends on how much LP USDC has been seeded and how much organic trading has accumulated. Per-market depth, in turn, is bounded by tier-based concentration caps, not by per-market segregated capital. This page documents how thin liquidity affects trading, and how the protocol’s design addresses it.
The core issue
Every traded market needs depth to function well:
- Deep markets: opens and closes execute at stable prices; the mark accurately reflects consensus.
- Thin markets: the vAMM component of the mark is easily moved by a single large trade; spreads widen; liquidations may execute at off-consensus prices.
Most crypto perpetual DEXes manage thinness through two mechanisms: large LP pools and market-maker programs. SportsPerp’s launch has neither at full scale — the initial pool LP is modest, and professional market makers will take time to engage.
How the protocol protects against thin-market failures
1. Position-size tiers (per-market effective_oi)
As documented in Margin Tiers, max leverage steps down as a position grows relative to a market’s effective_oi (= max(market_total_oi, initial_capacity)):
Position size (% of effective_oi) | Max leverage |
|---|---|
| < 5% | 5x |
| 5–10% | 4x |
| 10–25% | 3x |
| 25–50% | 2x |
| ≥ 50% | Rejected |
The rejection threshold at 50% is the hard stop: no single position can represent more than half a market’s effective_oi. This directly bounds how much slippage a single position can cause on close, and it’s enforced per-market — even though capital custody is global, concentration risk on any one market is still capped.
2. initial_capacity floor on the tier denominator
A brand-new market with total_oi = 0 would otherwise let the first trader open at full 5x leverage uncontested. Each MarketConfig carries an admin-set initial_capacity (defaults: $50K teams, $10K players) that floors the tier denominator. Once real OI grows past initial_capacity, the floor stops mattering.
3. risk_floor on the global pool
The global liquidity pool has an admin-set risk_floor. When pool_token.amount < risk_floor, opening new positions and placing LimitOpen orders are blocked with RiskFloorBreached. Closes, SL/TP, cancels, and margin-passing collateral withdrawals all keep working — the floor is a “no new risk” gate, not a kill switch. Frontends surface this as “Opening paused: pool liquidity below risk floor.”
4. vAMM impact factor is small
The vAMM adjustment to the mark from OI imbalance is 0.1% per full imbalance (all longs, no shorts). A 50% imbalance shifts the vAMM by only 0.05%. Combined with the composite weighting (30–70% vAMM), the total impact on mark is bounded.
This is deliberately conservative. On a healthy vAMM, larger impact factors let the mark follow consensus more closely; on a thin vAMM, they create exploit opportunities. Starting conservative and tuning up post-mainnet is safer than the reverse.
5. Opens settle against the oracle, not the mark EMA
Because open_position settles against market.oracle_price (not the mark EMA), a trader cannot get a worse entry from a transiently-dislocated mark. If the vAMM is temporarily distorted, the oracle is still the price at which the new position is recorded — limiting the damage from a thin-book squeeze. (See Mark Price → What each instruction prices against.)
6. EMA smoothing
The 150-second EMA on mark price means a single large trade moves the mark gradually, not instantly. This gives the market time to absorb the flow without cascading effects.
7. Three-layer liquidation (not single-shot)
A thin market is most dangerous during a liquidation — a forced close can move the mark against itself, triggering more liquidations. SportsPerp’s Layer 1 closes only 20% per call with a 30-second cooldown. Layer 2 unwinds the insurance-absorbed position in 10% chunks. Both mechanisms spread liquidation flow across time, allowing the market to absorb it without crashing.
See Three-Layer Cascade.
Launch-window liquidity expectations
The mainnet bootstrap is a single global pool, sized to absorb worst-case net unrealized PnL across all 68 markets — not 68 × per-market vaults. Realistic mainnet bootstrap range: $50K–$250K total LP, tuned during Phase 4 soak and post-launch.
Per-market depth then comes from concentration caps (50% of effective_oi hard, with initial_capacity = $50K teams / $10K players as the floor), so even before organic OI accumulates, every market supports tier-2-or-better trading.
A trader sizing to ≤ 10% of effective_oi on a $50K team market can place positions up to $5K at 4x leverage ($20K notional). That’s a meaningful trader size for a fresh market — but not a whale size. Traders who need larger positions should wait for organic OI growth or spread across multiple markets.
Slippage on opens and closes
SportsPerp does not have a central-limit order book yet — trades execute at the composite mark EMA. Slippage per-trade is small relative to book-driven venues because:
- Mark moves slowly. 150-second EMA smooths fast flow.
- vAMM impact is bounded. At most 0.1% of imbalance contribution.
- No stop hunting. Trigger orders execute against the EMA, not the raw mark, so brief spikes don’t fill them.
But slippage on closing a large position against thin vAMM is real. A trader sizing to 10% of effective_oi should expect to pay 0.5–1.5% of notional in combined slippage + fees when unwinding in normal conditions — more if market conditions are adversarial.
What happens in a liquidity crisis
If a market experiences a coordinated run on one side (say, everyone is long, nobody is short), the protocol response is:
- vAMM mid tilts against the dominant side — shorts become cheaper, longs more expensive. This is the mechanism that eventually balances the book.
- Funding rate rises toward the ±10 bps cap, paying the minority side and making the dominant side more expensive to hold.
- Arbitrageurs (or the protocol’s own market-making routines, post-launch) step in to close the premium.
Because both opens and closes settle against the raw oracle (the mark EMA is only consulted for liquidation eligibility), the vAMM’s local dislocation does not directly worsen new-trade entry prices — but it does feed funding and indirectly punish the dominant side via the funding-rate channel.
This is the designed steady-state response to an imbalanced market: the system self-balances through pricing, not through forced closes.
Cross-market liquidity sharing
The protocol now uses a single global liquidity pool, replacing the earlier per-market vault model:
- Pro: capital efficiency. Losses on one market fund profits on another automatically; the protocol-wide bootstrap cost falls from ~$340K (68 Ă— $5K admin seeds) to a single pool sized to net unrealized PnL.
- Pro: UX. A profitable close on a thin market is never blocked by that market’s lack of LP — the global pool always has the funds, as long as the protocol-wide solvency invariant holds.
- Trade-off: contagion exposure is now protocol-wide rather than market-scoped. The protocol mitigates this with the per-market
effective_oi-based concentration caps (so no one market can drain the pool single-handedly), the off-chainpool_token.amount ≥ Σ obligationssolvency probe (60s cadence with Telegram alerts), and therisk_floorhard on-chain gate against new risk.
Why the change: the prior per-market design surfaced its structural flaw on 2026-04-25, when an NFO trader hit VaultInsufficient on a profitable +$20 close because their market’s local vault was thinner than the payout. Refactor was completed on devnet pre-mainnet; full plan in .agents/plans/cross-market-liquidity-pool.md.
LP incentives
Post-mainnet, permissionless LP deposits will earn:
- A share of trading fees generated across all markets (one global pool, one global fee stream).
- Liquidation allocations (50% of Layer 1 partial liquidation proceeds flow to insurance → LPs indirectly, via fund growth).
- Points via the Points Program.
The exact LP economics will be published alongside the public LP-deposit launch. Expected yield range at scale: 15–40% APR depending on aggregate market activity, broadly comparable to deep-liquidity positions on other Solana perp DEXes.
Trader implications
- Size positions sensibly. Respect the per-market 50%-of-
effective_oicap (and the lower-tier limits below it); don’t expect to fill very large positions at best price — the protocol blocks them before slippage becomes painful. - Spread large positions across markets. $100K of total capital is better deployed as 5 positions of $20K across different markets than as a single $100K position in one market.
- Use trigger orders for exits. A limit-style exit plan is more reliable than market-selling into a thin market.
- Watch the pool’s
risk_floor. Whenpool_token.amount < risk_floor, opens and LimitOpens are blocked. Closes always work. The frontend shows an “Opening paused” banner. - Be patient on thin markets. Player markets in particular are thinner than team markets. If you want to trade them, expect slightly wider spreads.
Further reading
- Margin Tiers — the protocol’s primary defense against thin-market blowups.
- Mark Price — why the composite + EMA dampens large single trades.
- Three-Layer Cascade — why liquidations spread over time.
- On-Chain Program → Capital model — full design of the cross-market pool, solvency invariant, and
risk_floor/target_balancesplit.