Skip to main content
mint_paired(collateral_amount) is the canonical user-facing entry. It deposits cUSDC and mints L and S to the user’s ATAs.

Math

In 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.
Risk-state discounts and fee waivers apply on top.

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:
The L and S tokens are SPL tokens. They are transferable, tradeable on the native venues, usable in CPI by other programs. There’s no special locking, lockup, or hold period.

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.