Intent-Based Trading System
Intent States
PENDING
Initial state when intent is created by Party A
LOCKED
Intent reserved by a Party B
FILLED
Intent executed and trade created
EXPIRED
Intent passed expiration time
CANCELLED
Intent cancelled by Party A before filling
CANCEL_PENDING
Party A cancelled locked intent, awaiting Party B confirmation
Trading Lifecycle

Step 1: Send Open Intent
Party A initiates an open intent by calling:
function sendOpenIntent(
address[] calldata partyBsWhiteList,
uint256 symbolId,
uint256 price,
uint256 quantity,
uint256 strikePrice,
uint256 expirationTimestamp,
uint256 mm,
TradeSide tradeSide,
MarginType marginType,
ExerciseFee memory exerciseFee,
uint256 deadline,
address feeToken,
address affiliate,
bytes memory userData
) external returns (uint256 intentId)
Fees: Party A pays three fees : protocol fee + affiliate fee + solver fee.
Fund locking:
BUY options:
Party A locks the option premium:
premium = option_price × quantity
.The premium will be transferred to Party B when the trade is settled.
SELL options
Party A locks the required maintenance margin.
The intent is stored with PENDING status and becomes visible to eligible Party B accounts.
Step 2: Lock Open Intent
Eligibility requirements for Party B
The intent is PENDING and has not expired.
Party B’s address is included in
partyBsWhiteList
.Party B has a sufficient balance to meet its obligations.
Party B accepts the terms.
function lockOpenIntent(uint256 intentId) external onlyPartyB
The intent status changes from PENDING to LOCKED and is reserved for the locking Party B.
Step 3: Fill Open Intent
function fillOpenIntent(uint256 intentId, uint256 quantity, uint256 price) external
BUY options :
The locked premium is debited from Party A and credited to Party B. It will be paid to Party B after settlement.
SELL options :
The locked maintenance margin is added to Party A’s total maintenance margin balance for solvency checks.
Party B pays the premium to Party A.
A new trade is created with OPENED status.
The intent status changes from LOCKED to FILLED.
Step 4: Close Position
4.1 Early Close (before expiration)
Party A may close a position early by sending a close intent:
function sendCloseIntent(
uint256 tradeId,
uint256 quantity,
uint256 price,
uint256 deadline
) external
BUY positions:
The premium is paid to Party B.
Party A sells the option back to Party B.
Party B pays Party A the PnL:
PnL = (closePrice − openPrice) × quantity
.If PnL < 0, Party A pays the loss to Party B.
SELL positions
The corresponding maintenance margin is released to Party A.
Party A pays Party B the PnL (same formula as above).
If PnL < 0, Party B pays the loss to Party A.
4.2 Settlement at Expiration
function executeTrade(
uint256 tradeId,
SettlementPriceSig memory settlementPriceSig
) external
Party B keeps the premium already received (for trades where Party A was the buyer).
In‑the‑Money (ITM)
Settlement price is obtained from the oracle.
PnL = (settlementPrice − strikePrice) × quantity
.The seller pays the positive P&L to the buyer (or vice versa if negative).
Out‑of‑the‑Money (OTM)
The option expires worthless.
Any maintenance margin locked by the Party A seller is released.
Last updated