đźš§ SportsPerp is currently live on devnet. Mainnet target: before Jun 12, 2026 (World Cup kickoff).
TradingMargin Tiers

Margin Tiers

Margin tiers prevent outsized positions from threatening market solvency. The larger your position is relative to the market’s effective_oi, the lower your maximum allowed leverage. This is a continuous de-risking mechanism — not a governance lever.

The denominator: effective_oi

Tiers scale against per-market effective_oi, defined as:

effective_oi = max(market_total_oi, market.initial_capacity)
  • market_total_oi is the live total_long_oi + total_short_oi for the market.
  • initial_capacity is an admin-set per-market field on MarketConfig (defaults: $50K teams, $10K players). It floors the denominator so that fresh markets with no OI yet don’t fall through to full leverage and let the first trader dominate.

Once real OI grows past initial_capacity, the floor is irrelevant.

(SportsPerp previously sized tiers against per-market vault deposits. The vault model was replaced by a single global liquidity pool — see On-Chain Program → Capital model. Tiers now use effective_oi instead, so per-market concentration risk is still bounded even with global capital custody.)

The tier table

Five tiers by position size as a fraction of effective_oi:

TierPosition size (% of effective_oi)Max leverage
1< 5%5x
25% – 10%4x
310% – 25%3x
425% – 50%2x
5≥ 50%Rejected — order fails

Implementation: effective_max_leverage in math/margin.rs.

The calculation runs on every order placement and every trigger-order execution. The effective_oi input is computed live — so a position that was tier 1 when placed can become tier 2 or 3 if other traders’ OI on that market drops sharply.

Why per-market effective_oi, not global pool size

  • Concentration risk is per-market. A single huge position on Arsenal exposes the protocol to one team’s narrative; sizing it against pool-wide capital would let an Arsenal whale dominate Arsenal even though plenty of pool capital is busy backing positions in other markets.
  • OI imbalance is already handled by the vAMM. The composite mark price’s vAMM component shifts mid-market against imbalanced OI (see Mark Price). OI direction risk is priced; concentration risk needs a separate cap.
  • initial_capacity floors the thin-market case. Without it, a brand-new market would have total_oi = 0 and the first trader could open at full leverage uncontested. The floor (admin-set) keeps that market in tier-2 or tier-3 territory until real OI catches up.

Worked examples

Assume effective_oi = 1,000 USDC on the market (either real OI or initial_capacity).

  • 40 USDC position → 4% → tier 1 → max 5x → up to 200 USDC notional.
  • 70 USDC position → 7% → tier 2 → max 4x → up to 280 USDC notional.
  • 150 USDC position → 15% → tier 3 → max 3x → up to 450 USDC notional.
  • 300 USDC position → 30% → tier 4 → max 2x → up to 600 USDC notional.
  • 600 USDC position → 60% → tier 5 → rejected.

The test suite exercises each of these cases verbatim (math/margin.rs tests).

Interaction with the position-size cap

The tier-5 threshold (≥ 50%) is the hard cap: no single position can exceed half a market’s effective_oi. Combined with tier 4’s leverage floor of 2x, the worst-case notional is bounded above.

In practice, tier 1 and early tier 2 are the normal operating range. Tiers 3+ come into play only on thin markets, on the very first trades on a fresh market, or during sharp OI contractions.

Interaction with the market-level max leverage

The tier cap is applied as a minimum against the market’s max_leverage parameter:

effective_max = min(market.max_leverage, tier_max_for_size)

So a market initialized with max_leverage = 3x (say, a highly volatile player market) never allows 5x even at tier 1 — the market’s own cap dominates. Conversely, a market with 5x max still drops to 2x at tier 4, regardless of the market’s setting.

Why no “empty market” edge case anymore

The old design had to special-case markets with zero vault deposits — there was no denominator. With effective_oi = max(market_total_oi, initial_capacity), that’s solved at the schema level: the floor (initial_capacity > 0 for every initialized market) means the denominator is always positive. No fallback branch, no “first trader sets the high-water mark” UX surprise.

Why these thresholds?

5% / 10% / 25% / 50% is a deliberately coarse grid. Finer granularity buys little:

  • 5% – 10%: comfortable everyday trading; 4x accommodates most speculative exposure.
  • 10% – 25%: meaningful position vs the market; 3x requires more thoughtful sizing.
  • 25% – 50%: large position; 2x is defensive — concentration risk on this one market must not be allowed to blow up under modest oracle moves.
  • ≥ 50%: rejected; no single trader should be able to concentrate more than half a market’s effective_oi in one direction.

The thresholds are constants in code, not governance parameters — same reasoning as the composite index weights: predictability beats flexibility for invariants this load-bearing.

Further reading