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_oiis the livetotal_long_oi + total_short_oifor the market.initial_capacityis an admin-set per-market field onMarketConfig(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:
| Tier | Position size (% of effective_oi) | Max leverage |
|---|---|---|
| 1 | < 5% | 5x |
| 2 | 5% – 10% | 4x |
| 3 | 10% – 25% | 3x |
| 4 | 25% – 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_capacityfloors the thin-market case. Without it, a brand-new market would havetotal_oi = 0and 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_oiin 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
- Margin — how maintenance margin and effective collateral interact with tiers.
- Contract Specifications — the position-size cap and all related numbers in one table.
- On-Chain Program → Capital model — why capital custody is global but concentration sizing is per-market.
- Protocol Architecture → Fixed-Point Math — how tier thresholds are represented as basis points.