Markets
Asset Classes & Roadmap
Launch Coverage
At launch, Origin lists perpetual futures across three asset classes:
- Crypto perps. BTC, ETH, SOL, and major altcoins.
- Equity perps. Major single-name equities and equity indices.
- Commodity perps. Precious metals, energy, and agricultural benchmarks.
All contracts are quoted in USD and settled in stablecoins.
Roadmap
Options, spot, and FX perpetuals are scheduled to follow.
- Options. Will share the same margin account as perps, allowing portfolio-margined risk offsets.
- Spot. Will leverage the same orderbook and settlement infrastructure.
- FX perps. Will reference rates derived from Circle StableFX liquidity, giving traders 24/7 access to currency pairs natively settled in stablecoins.
Listing Process
Listings are permissioned. New markets are reviewed for liquidity, oracle availability, regulatory considerations, and risk-parameter feasibility before being activated. Each listing publishes a complete parameter set at the time of activation:
- Initial margin, maintenance margin, and leverage tier ladder
- Position limits
- Tick size and lot size
- Oracle source binding (Pyth feed identifier and CEX price source set)
- Funding configuration
- Fat-finger band
Contract Specifications
Quote and Settlement Currency
Every contract is USD-denominated. PnL is calculated in USD and credited or debited in the user's collateral assets. If a user holds non-USD collateral, realized PnL settles against that collateral at the prevailing oracle exchange rate, with haircuts applied (Accepted Assets & Haircuts).
Tick Size and Lot Size
Tick size and lot size are set per market based on liquidity profile and price magnitude. High-liquidity, high-price markets (e.g., BTC) use finer ticks expressed in absolute USD; lower-price markets use ticks expressed as a percentage of price to avoid quoting noise. The full table is published on the markets reference page.
Position Limits
Each market enforces a per-account maximum position size. Limits scale with the user's effective margin tier and are designed to prevent any single account from accumulating risk that would be difficult to liquidate without market impact.
Market States
A market can be in one of the following per-market states at any time. These are distinct from system-wide operational states (Operational States), which act as a global envelope over all markets.
| State | Behavior |
|---|---|
LIVE | Full trading. Markets with external closure periods (equities, commodities) may additionally be in Discovery Mode during weekends, holidays, or after-hours trading. |
POST_ONLY | Only post-only limit orders accepted; takers rejected. Used during volatility spikes or oracle anomalies. |
REDUCE_ONLY | Only orders that reduce existing positions accepted. Used during planned market windowing or risk events. |
HALTED | No order activity. Existing positions continue marking; liquidations paused if halt is triggered by oracle staleness. |
DELISTED | Market removed from listing; users notified to close before final settlement. |
Transitions between states are logged on-chain and announced via the WebSocket market-state channel.
CrossFX: Virtual Cross-Currency Markets
Core Concept
Origin exposes markets like GOOGL/KRW, BTC/EUR, and XAU/JPY without maintaining separate orderbook liquidity for every quote currency. Instead, each virtual cross-currency market is a composition of a canonical USD-denominated perp book and an FX overlay:
GOOGL/KRW = GOOGL/USD-PERP + USD/KRW FX layer
BTC/EUR = BTC/USD-PERP + USD/EUR FX layer
XAU/JPY = XAU/USD-PERP + USD/JPY FX layer
This gives users a native local-currency trading experience while all orderbook liquidity, funding, risk, and market-maker hedging remain unified around canonical USD books.

FX Oracle Architecture
The FX overlay is not a simple midpoint price feed. It is a liquidity-aware executable FX oracle anchored to StableFX RFQ (Request for Quote) quotes at the $1M-notional level. This reflects institutionally meaningful executable liquidity rather than theoretical midpoints that may not be achievable at size.
Size-Aware Quote Curves
For each currency pair, the protocol maintains a curve of executable quotes at different size buckets:
USD/KRW ask curve (StableFX RFQ):
$100K: 1,382
$1M: 1,385 ← primary mark input
$5M: 1,390
$10M: 1,396
The $1M level is chosen as the primary mark input because it represents real executable liquidity at an institutionally relevant size, while remaining robust to quote manipulation that might target smaller notional amounts.
CrossFX Oracle
The published CrossFX oracle mark is a clamped value designed to be manipulation-resistant and continuous even when RFQs are sparse:
fx_oracle_mark = min(
max(
TWAP_5min(StableFX $1M RFQ),
oracle_price * 0.98
),
oracle_price * 1.02
)
The price is clamped ±3% from the backup oracle reference price to prevent extreme deviations from broader market consensus. If the RFQ-based calculation falls outside this band, the oracle reverts to the conservative boundary toward the reference price.
Quote TTL and Circuit Breakers
Every FX quote carries a time-to-live (TTL). Under normal conditions:
- Normal FX TTL: 3-5 seconds
- Liquidation FX TTL: 1 second for fast markets
- UI indicative TTL: 30 seconds
If StableFX RFQ becomes unavailable, the oracle falls back to the backup feed with widened collateral haircuts. Circuit breakers trigger when:
- Backup oracle deviates from $1M RFQ by >100 bps
- FX bid/ask spread widens beyond threshold
- Settlement failure rate for an LP exceeds threshold
User Experience vs. Protocol Reality
From the user's perspective:
- Deposit KRW1, see margin in KRW, trade GOOGL/KRW, see PnL in KRW, withdraw KRW1.
From the protocol's perspective:
- Collateral is valued in USD at conservative FX rates. The order routes to the canonical GOOGL/USD book. The FX overlay prices USD/KRW via $1M RFQ. The Risk Engine computes everything in USD. Settlement converts through StableFX only when needed (withdrawal or liquidation), not on every trade.
Economic Distinction
The user's actual economic exposure is to a USD-denominated GOOGL/USD perp. The KRW display is a presentation layer over that canonical position. This distinction matters for understanding where risk resides:
| Aspect | User Sees | Protocol Reality | Risk Location |
|---|---|---|---|
| Position | Long GOOGL/KRW | Long GOOGL/USD-PERP | USD-denominated perp risk |
| PnL | +₩528,200 | +$380 USD | USD at source, converted for display |
| Mark price | ₩249,286 | $180.12 USD | Both valid; KRW is derived |
| Funding payment | -₩2,768/hour | -$2 USD/hour | Canonical USD funding |
| Collateral value | ₩100,000,000 | $66,426 (at ask) | KRW1 balance × conservative FX |
Where FX Risk Lives
Users holding KRW1 collateral and trading GOOGL/KRW carry FX risk on their collateral, not on their perp position. The perp position is USD-denominated; if USD/KRW moves, the USD PnL remains the same, but its KRW equivalent changes.
Example:
- User enters with KRW1 when USD/KRW = 1,380
- Later USD/KRW moves to 1,450 (+5.1% KRW depreciation)
- GOOGL/USD mark unchanged at $180
- User sees their KRW margin value increase 5.1% in KRW terms (more KRW per USD of collateral)
- But their USD position value is unchanged
This is collateral FX exposure, not position FX exposure. Origin makes this distinction explicit in account statements and the order preview, showing both USD and local-currency values side by side.
Virtual Market Definition
Each virtual market is registered as:
| Field | Example |
|---|---|
virtual_market_id | GOOGL-KRW-PERP |
canonical_market_id | GOOGL-USD-PERP |
display_quote_currency | KRW |
settlement_stablecoin | KRW1 |
fx_pair | USD/KRW |
max_fx_drift_bps | 25 |
fx_quote_ttl_ms | 3000 |
The virtual market is a routing and display configuration; it is not a separate orderbook. Risk, funding, open interest, and position records are all maintained on the canonical USD market.
Mark Price Construction for Virtual Markets
The virtual mark price for cross-currency markets is constructed by composing the canonical USD mark with the FX oracle rate, with specific pricing used for different risk purposes:
Display Mark Price
virtual_mark_price = canonical_mark_usd × fx_oracle_mark
Where fx_oracle_mark is the blended $1M RFQ rate described above, clamped ±2% from the backup oracle reference to prevent manipulation. This display mark is used for:
- Unrealized PnL display in local currency
- Liquidation price estimates shown to users
- SL/TP trigger conditions expressed in local currency
Executable Virtual Spread
The displayed bid/ask spread for a virtual market reflects both the asset perp spread and the FX spread:
virtual bid = asset/USD impact bid × USD/local_executable_bid
virtual ask = asset/USD impact ask × USD/local_executable_ask
For a buy order, the execution path requires paying the asset ask in USD terms, then converting USD to local currency at the ask (the worse rate for the buyer). For a sell, the path is reversed using bids.
Example:
GOOGL/USD bid/ask: 180.00 / 180.10
USD/KRW executable: 1,379 / 1,384
GOOGL/KRW virtual bid: 180.00 × 1,379 = 248,220 KRW
GOOGL/KRW virtual ask: 180.10 × 1,384 = 249,258 KRW
Virtual spread: 1,038 KRW (~0.42%)
Liquidation Pricing
For liquidation calculations, the protocol uses stressed FX rates that protect solvency:
stressed_fx_rate = fx_oracle_ask × (1 + stress_factor)
Where stress_factor accounts for:
- FX volatility buffer (typically 1-3%)
- Size premium for large liquidations
- Settlement uncertainty
The liquidation engine asks: "If we had to convert this user's KRW1 collateral to USDC now, at size, what USD value would we actually realize?" That conservative value is what matters for solvency.
For large liquidations exceeding $1M in local-currency value, the protocol requests a live RFQ at the actual seizure size rather than using the $1M mark rate. This ensures the liquidation pricing reflects real executable liquidity at the specific notional being converted.
Conservative Pricing by Purpose
| Purpose | FX Rate Used | Direction |
|---|---|---|
| Display, UI charts | Blended oracle mark | Mid (clamped ±2%) |
| Collateral valuation | $1M RFQ ask | Ask (weakens collateral value) |
| Liquidation triggers | Stressed ask × buffer | Ask × (1 + stress) |
| Settlement (withdrawal) | Live RFQ at actual size | Bid/ask per side |
Order Routing and Limit Translation
When a user places a local-currency limit order (e.g., Buy GOOGL/KRW limit ₩250,000), the system translates the limit into a canonical USD price at placement time:
# Buy side: user pays local currency for USD exposure
canonical_limit_usd = local_limit / USD_local_execution_ask
# Sell side: user receives local currency from USD exposure
canonical_limit_usd = local_limit / USD_local_execution_bid
Origin uses dynamic FX-bound limits: the original local-currency limit price and FX reference rate are stored alongside the translated USD limit. If FX moves beyond max_fx_drift_bps while the order rests on the book, the order is cancelled by default (configurable to pause or reprice). This protects the user from having their KRW-denominated price intent silently become a different economic outcome after an FX move.
Funding
Funding remains canonical. A single GOOGL/USD funding rate applies regardless of the user's display currency. There are no separate funding rates for GOOGL/KRW, GOOGL/EUR, or GOOGL/JPY. This eliminates liquidity fragmentation and cross-currency funding arbitrage. Funding payments are denominated in USD and reflected in KRW only as a display conversion.
Market-Maker Model
Virtual cross-currency markets are powered by two specialized liquidity roles:
| Participant | Provides |
|---|---|
| Perp market maker | Quotes on canonical Asset/USD books |
| FX liquidity provider | Quotes on stablecoin FX pairs (e.g., USDC/KRW1) via StableFX |
| Origin virtual layer | Synthesizes Asset/local-currency markets from both |
Market makers do not need to quote every synthetic pair directly. A market maker quoting GOOGL/USD and an FX LP quoting USDC/KRW1 together enable GOOGL/KRW for users, without requiring any participant to hold or hedge cross-currency perp inventory.

