Liquidation System
The Symmio Options Protocol includes a robust liquidation system, designed to manage counterparty risk and maintain systemic solvency. Liquidation processes are orchestrated by the Symmio Clearing House, which acts as the protocol's enforcement and settlement authority.
Liquidation Workflow
The liquidation process is composed of three core stages:
Step 1: Flagging
The Clearing House can flag accounts that appear insolvent based on external solvency checks.
Flagging creates a
LiquidationDetail
entry with statusFLAGGED
.The protocol provides distinct flagging functions for different margin types (e.g., isolated, cross) and parties (Party A or Party B).
Once flagged, the account enters a grace period during which it may recover solvency before liquidation is enforced.
Step 2: Liquidation Execution
After the grace period, if the account remains insolvent, the Clearing House may execute liquidation.
Upon execution, the liquidation status is updated from
FLAGGED
toIN_PROGRESS
.The collateral price and unrealized PnL (UPNL) at the time of liquidation are recorded to determine accurate settlement amounts.
Relevant cross-margin balances are zeroed out and redistributed or seized as required.
Step 3: Cancel Intents, Close Trades, and Adjust Balances
After execution, the Clearing House finalizes balance adjustments for all affected parties.
Some balance changes may already occur during Step 2 (e.g., during cross balance resets), but this step ensures all final deltas are correctly applied.
The liquidated party must not retain any open intents or open trades:
The Clearing House forcibly cancels any remaining intents.
It also closes all active trades associated with the liquidated party.
This guarantees a clean state for system integrity.
Liquidation States
FLAGGED
Account flagged as insolvent
Execute liquidation or unflag if recovered
IN_PROGRESS
Liquidation actively being processed
Close trades, confiscate assets, distribute collateral
CANCELLED
Flagged liquidation cancelled due to recovery
Return to normal operation
Liquidation Types
1. Isolated Party B Liquidation
Used when Party B becomes insolvent in isolated margin mode when Party A buys option from Party B :
// Flagging
flagIsolatedPartyBLiquidation(address partyB, address collateral)
// Execution
liquidateIsolatedPartyB(address partyB, address collateral, int256 upnl, uint256 collateralPrice)
// Unflagging (if Party B recovers)
unflagIsolatedPartyBLiquidation(address partyB, address collateral)
Trigger Conditions:
When total loss of open positions exceeded from loss coverage of isolated balance.
isolatedBalance + (effectiveUpnl * 1e18) / collateralPrice < 0
Where
effectiveUpnl = upnl > 0 ? upnl : (upnl * lossCoverage) / 1e18
There is no balance changes in this liquidate function
2. Cross Party B Liquidation
Used when Party B becomes insolvent in cross margin mode:
// Flagging
flagCrossPartyBLiquidation(address partyB, address partyA, address collateral)
// Execution
liquidateCrossPartyB(address partyB, address partyA, address collateral, int256 upnl, uint256 collateralPrice)
// Unflagging
unflagCrossPartyBLiquidation(address partyB, address partyA, address collateral)
Trigger Conditions:
When Party B’s cross loss of open trades with an specific Party A exceeded from loss coverage of cross balance.
crossBalance.balance + (effectiveUpnl * 1e18) / collateralPrice < 0
Where
effectiveUpnl = upnl > 0 ? upnl : (upnl * lossCoverage) / 1e18
Liquidation Process:
Remaining cross balance transferred to Party A via scheduled release
All cross margin entries (balance, locked, totalMM) reset to zero
Liquidation status advanced to
IN_PROGRESS
3. Cross Party A Liquidation
Used when Party A becomes insolvent in cross margin mode:
// Flagging
flagPartyALiquidation(address partyA, address partyB, address collateral)
// Execution
liquidateCrossPartyA(uint256 liquidationId, int256 upnl, uint256 collateralPrice)
// Unflagging
unflagPartyALiquidation(address partyA, address partyB, address collateral)
Trigger Conditions:
(crossBalance.balance - totalMM) + (upnl * 1e18) / collateralPrice < 0
Party A's available balance insufficient to cover maintenance margin plus losses
Liquidation Process:
Remaining cross balance transferred to Party B via scheduled release
All cross margin entries reset to zero
Liquidation proceeds to position closure phase
Clearing House Operations
Clearing House also has some shared methods for closing, cancelling and balance changing.
Trade Closure During Liquidation
closeTrades(uint256 liquidationId, uint256[] memory tradeIds, uint256[] memory prices)
Process:
All specified trades must belong to the liquidated parties
Trades are closed at liquidator-provided prices
Trade status changed to
LIQUIDATED
Associated close intents cancelled
Asset Confiscation
confiscatePartyA(uint256 liquidationId, uint256 amount)
confiscatePartyBWithdrawal(uint256 withdrawId)
Party A Confiscation:
Removes specified amount from Party A's cross balance
Used to cover liquidation costs and losses
Requires sufficient available balance
Party B Withdrawal Confiscation:
Cancels pending Party B withdrawals during liquidation
Returns withdrawn amount to Party B's isolated balance
Prevents capital flight during liquidation process
Collateral Distribution
distributeCollateral(
address partyB,
address collateral,
MarginType marginType,
address[] memory partyAs,
uint256[] memory amounts
)
Process:
Distributes Party B's remaining collateral among affected Party A accounts
Uses scheduled release system for secure transfers
Proportional distribution based on losses and exposure
Ensures total distribution doesn't exceed available balance
Intent Cancellation During Liquidation
Open Intent Cancellation:
cancelOpenIntents(uint256[] memory intentIds)
Close Intent Cancellation:
cancelCloseIntents(uint256[] memory intentIds)
Cancellation Logic:
Only cancels intents involving insolvent parties
Handles fees and premium refunds appropriately
Expired intents processed through normal expiration flow
Prevents further trading by liquidated accounts
Last updated