The cross-margin account
How Phasis calculates margin across your entire portfolio using the N-point Black-Scholes stress model.
One account, all positions
Each wallet has a single Account<USDC> on Phasis. That one account holds all of your positions across every series and every underlying (SUI, BTC, ETH) simultaneously. There is no need to manage separate sub-accounts per market.
Account fields
| Field | Meaning |
|---|---|
balance_quote | Free USDC held in the account (not locked) |
locked_margin | Total USDC locked as margin across all assets |
quote_locked | USDC reserved for resting bid orders (the principal for pending buys) |
positions | Your signed net positions keyed by series |
Each position records: underlying asset, strike, call/put flag, expiry timestamp, net quantity magnitude, and whether the net direction is short.
Free balance
At any moment your free balance is:
free_balance = balance_quote − locked_margin − quote_lockedYou can only withdraw free balance. You can only open new short positions if they do not reduce free balance below zero after accounting for the new margin requirement.
How margin is calculated
Phasis uses a portfolio-margin stress model (the N-point Black–Scholes stress grid). Rather than treating each position in isolation, the model evaluates your entire portfolio of positions for a single underlying across a range of hypothetical price scenarios.
The margin requirement for a given asset is the worst-case portfolio loss across N evenly spaced spot price scenarios, where the price range spans ±20% around the current spot (configurable per asset). At each grid point, the protocol computes the Black–Scholes value of every position and sums the portfolio PnL. The margin requirement is the magnitude of the worst loss found.
The actual margin lock applied to your account is:
lock = max(0, requirement − max(0, net_option_value))Where net_option_value is the net premium you received across your positions (positive if you are a net seller). The idea is that premium you have already collected cushions against potential losses — but only up to the requirement itself.
Long-only and debit spreads: zero margin lock
If your portfolio for an asset consists entirely of long positions, your maximum loss is bounded by the premium you paid. The stress model produces a requirement of zero for long-only portfolios, so lock = 0.
Similarly, a debit spread (e.g., a bull call spread: long ATM call + short OTM call) has a capped maximum loss equal to the net premium paid. The model recognises this and typically locks zero margin, since the long leg offsets the short leg's liability.
Naked shorts: positive margin lock
When you sell options without a fully offsetting long, the downside is unbounded (for calls) or capped at the strike (for puts). The stress model will find a grid point where the loss exceeds any premium received, so lock > 0. You must maintain enough free balance to cover this lock at all times.
Cross-underlying isolation
Margin is computed per underlying. Positions in BTC options do not offset or net against positions in ETH options. Each asset has its own stress calculation and its own lock contribution to locked_margin.
Refreshing margin manually
If a new stress snapshot is published but your account has not been touched since (no trades, deposits, or withdrawals), your stored locked_margin may lag the latest prices. You can force a recompute with:
refreshAssetMargin(tx, {
registryId,
accountRegistryId,
snapshotId,
})The asset is derived from the snapshot, so it is not passed explicitly.
This is a read-and-update transaction with no fee beyond gas. It is also called automatically whenever you trade.
Withdraw guard
You cannot withdraw USDC if doing so would violate:
balance_quote − withdrawal_amount ≥ locked_marginThis ensures the protocol stays solvent even if prices move adversely after you withdraw.
Continue to Reading the orderbook or jump ahead to Expiry and settlement.