Expiry & settlement
How Phasis halts trading, determines the settle price via Pyth, and pays intrinsic value in USDC at expiry.
Settlement is automatic
You never need to manually exercise an option on Phasis. At expiry an off-chain cranker service coordinates the settlement sequence on your behalf. Intrinsic value is credited to your account in USDC as each series is settled.
Market state machine
Each market moves through a one-way sequence of states:
Listed → Halted → Settling → Closed| State | Meaning |
|---|---|
Listed | Normal trading is open |
Halted | Trading is frozen; the market is awaiting a settle price |
Settling | Settle price is set; users are being paid out series by series |
Closed | All positions settled; market retired |
Once a market transitions to Halted, no new orders are accepted.
When does trading halt?
The cranker monitors block time and calls cranker_halt once the current time reaches expiry_ts − halt_window. The halt window is configured per underlying (typically around one hour before expiry). For a weekly BTC market expiring on Friday at 16:00 UTC, trading would halt around Thursday at ~15:00–16:00 UTC.
Settle price determination
The protocol uses the Pyth Lazer EMA price as the authoritative settle price. The cranker reads a signed Pyth price update (no older than a configurable staleness window) and writes it on-chain by calling cranker_settle_price. This transitions the market from Halted to Settling.
If the Pyth feed is unavailable, an admin can set a price manually via admin_force_settle_price. This escape hatch is only used if both automated feeds are stale.
Per-series payout
Once the settle price is on-chain, the cranker processes each series individually:
- The series is marked
RetiredAwaitingSettle. - For each account holding a position in that series, the cranker calls the settle function.
- The on-chain payout is calculated as intrinsic value multiplied by the position size:
| Position | Payout per contract |
|---|---|
| Long call | max(0, settle_price − strike) USDC |
| Short call | Pays max(0, settle_price − strike) USDC |
| Long put | max(0, strike − settle_price) USDC |
| Short put | Pays max(0, strike − settle_price) USDC |
- USDC is transferred to (or debited from) the user's account balance.
- The series moves to
Retired.
In the rare case that a short position is undercollateralized at settlement, bad debt is covered first from the protocol fee pool, then absorbed by the protocol.
Example timeline (weekly BTC, expiry Friday 16:00 UTC)
| Time | Event |
|---|---|
| Friday 15:00 UTC | Cranker calls cranker_halt; market moves to Halted |
| Friday 16:00 UTC | Cranker submits Pyth EMA update; market moves to Settling |
| Friday 16:00–17:00 UTC | Cranker settles all accounts series by series |
| By Friday 17:00 UTC | All series retired; cranker calls cranker_retire_market; market moves to Closed |
What you need to do
Nothing. Your balance is credited automatically. After settlement you will see:
- Expired in-the-money positions converted to a USDC credit in
balance_quote. - Expired out-of-the-money long positions with no payout (the premium paid is the total cost).
- Short positions closed with the intrinsic value deducted (or zero deducted if they expired worthless).
Any remaining free balance can be withdrawn immediately after settlement.
Continue to Liquidation.