mint_paired(collateral_amount) is the canonical user-facing entry. It deposits cUSDC and mints L and S to the user’s ATAs.
Math
Normal risk state with no confidence markup, qty_L × L_NAV + qty_S × S_NAV = collateral_amount - fee. Trivially.
Fees
The base fee is 10bps (mint_fee_bps). Two things about it are easy to miss:
- 90% of the fee stays in the collateral vault. Only the dev tax (
dev_tax_pct = 10%of the fee) goes to the fee recipient. The retained portion is real backing - it accrues directly to the market’s collateralization ratio. - On high-vol markets the fee is vol-informed. The keeper posts
fee = max(10, fee_mult × q90)bps, capped at 100, where q90 is the trailing realized spread of the market’s oracle moves. The fee is the hurdle for paired round-trip extraction - scaling it with realized vol is what keeps high-vol listings solvent (see Solvency). Calm broad indices stay at the static 10bps.
Oracle staleness gate
Mint requires a TWAP that is fresher than 300 seconds (MAX_TWAP_AGE_SECS) when the market is not in Normal risk state - which is always the case on devnet (ProxyMode). When the underlying market closes (nights, weekends), the keeper deliberately withholds oracle pushes; the TWAP ages past the gate and mint/redeem freezes itself with TwapNotAvailable until the market reopens. This is intentional: minting at a stale Friday close into a Monday gap would be free money against the vault. The pool books keep floating off-hours - see Trade.
Accounts required
The frontend’s
useMint() hook resolves all of this from the symbol. For a copy-pasteable script see Build → Mint and redeem example.
TypeScript
Minimum mint size
Enforced by the program: 10 cUSDC (10_000_000 lamports). Below this, you get BelowMinimum.
This exists to keep the post-fee residual computable without precision issues - at 1 cUSDC mint, the 0.1% fee rounds to lamport boundaries that produce zero L/S in some markets.
Errors
→ Full error catalog
Behavior across risk states
→ Risk states
Optional: mint_paired_with_waiver
A variant that consumes a fee-waiver against the user’s FeeWaiver PDA, if active. Saves the mint fee but only works when the user has previously called donate_to_vault to acquire a waiver and the market vault is at or above its dynamic buffer target (keeper-posted per market, floored at 102%).
This is an advanced flow used by power users. Most integrations stick with mint_paired.
What you receive
After a successful mint:See also
Redeem
The inverse: burn paired tokens, receive cUSDC at NAV.
End-to-end TypeScript example
Copy-pasteable script with wallet setup, IDL load, mint, verify.

