Skew
Venue-only Solana on-chain OTC options · ISDA SIMM v2.6 + IOSCO PFMI 2017
Skew is a venue-only on-chain OTC options protocol. The program clears RFQ options, portfolio margin, collateral custody, settlement, and builder distribution. The protocol is not a dealer, market-maker, matching engine, managed vault, or capital provider. It provides deterministic Solana program state, typed APIs, and a public OTC Tape for RFQ and secondary discovery.
OTC Tape · Docs · SDK · MCP · Relay · Program
Institutional documentation: see PROTOCOL.md (Rulebook v1.4) and PARAMETERS.md (canonical numeric parameters). Operational runbooks under
docs/runbooks/.
Status — 2026-05-13
| Field | Value | Source |
|---|---|---|
| Build | Anchor 0.31.1 / Rust 1.86 / skew_master.so 2,398,832 B (W30 reduction from 2,506,368) |
skew/target/deploy/skew_master.so · docs/audit/W33_SO_PROFILE_2026-05-09.md |
| Devnet | Redeployed slot 461100548 · program 3w2qSp1UnuTbTfdHPXxm3zZaz6JZRmPpbmHf56Y1DsgK |
skew/skew-sdk/RELEASE.md |
| Audit packet | 12 docs send-ready (README, AUDIT_RFP, SCOPE, THREAT_MODEL, ATTACK_SURFACE, INVARIANTS, RECOVERY_IX_INVARIANTS, W28_BPF_STACK_VERIFICATION, W29_PROJECT_CONSISTENCY_AUDIT, W29_MCP_PRICING_INDEXER_WEB_ALIGNMENT, W33_SO_PROFILE, AUDIT_PACKET_CHECKSUMS) |
skew/docs/audit/SEND_LIST_2026-05-09.md |
| Distribution | @skew-labs/sdk 0.7.11 published · @skew-labs/mcp 0.7.21 published |
npm registry · skew/skew-sdk/package.json · skew/skew-mcp/package.json |
| Mainnet | Gated on external audit, CU/profile acceptance, account-size and IDL freeze, deploy runbooks | skew/docs/audit/AUDIT_RFP.md |
Tech
Anchor 0.31 / Rust · Next.js 15 on Vercel · Fastify + node:http relay/indexer on Fly · Neon Postgres (skew-indexer) · Helius RPC + webhooks · Pyth EMA (settlement) + Switchboard (failover). Devnet keypairs and RPC tokens are operator-managed and never live in the repo.
Surface (verified counts)
| Component | Count | Verified |
|---|---|---|
skew-master Anchor instructions |
123 ix (W30, post legacy v4 RFQ removal; W25 baseline 127) | grep -c "pub fn " skew/skew-master/programs/*/src/lib.rs |
| PDA seed namespaces | 60 | skew/docs/audit/ATTACK_SURFACE.md |
| SDK PDA helpers | 36 | skew/skew-sdk/README.md |
skew-pricing HTTP routes |
26 | skew/skew-pricing/src/bin/server.rs (.route(...)) |
skew-indexer HTTP routes |
7 | skew/skew-indexer/src/http.ts |
MCP tools (all profile) |
119 visible (123 named, 4 retired stubs hidden) | skew/skew-mcp/README.md |
| CI gates | 11 blocking + 1 informational | skew/.github/workflows/ci.yml + .github/workflows/ |
| Audit packet | 12 docs (~3,500 LOC) | skew/docs/audit/AUDIT_PACKET_CHECKSUMS.md |
Compliance
PROTOCOL.md v1.4 maps 143 unique rules across 18 institutional standards: ISDA 2002 + SIMM v2.6, FIA, MiFID II RTS 6 / RTS 7, MiFIR Art 26 T+1, CFTC SEF Part 37, IOSCO PFMI 2017 (Recovery Regime, Rule 11A), EMIR REFIT, SEC Form ATS-N, CME Rule 526 / 588 / 802, PFMI 24, Eurex 2026, LCH SwapClear, SGX-DC, JSCC, KRX, NFA 2-29 / 2-30, HKEX OTC Clear, DTCC GTR, MAS PSA.
Standard-by-standard citations and source quotations live in
skew/docs/spec/RESEARCH_DEEP_PARSE_2026-05-09.md
and skew/docs/spec/RESEARCH_EU_REGULATORY_2026-05-09.md.
Skew is a venue-only protocol: the team does not run a market-making bot, does not provide LP capital, does not quote against users, and does not custody user collateral outside on-chain PDAs. Settlement is Pyth-only.
Operating Model
Institutional OTC infrastructure separates negotiation, risk, clearing, and settlement. Skew keeps the same separation on Solana:
| Layer | Skew component | Responsibility |
|---|---|---|
| Trade capture | skew-relay, Auction RFQ, SDK/MCP/API clients |
Route quote requests, collect signed quotes, prepare buyer-signed transactions |
| Clearing | skew-master Anchor program |
Verify buyer/CM signatures, allocate option accounts, lock collateral, update registries |
| Risk | Portfolio margin engine, variation margin, MMP hooks | Complete-book IM, maker risk limits, liquidation admission, fee and IF routing |
| Custody | PDA escrow and vault accounts | USDC PM escrow, wSOL/jitoSOL physical locks, fee accumulators, builder escrows |
| Settlement | Pyth-gated settle, dispute/admin rails |
Permissionless expiry settlement with explicit fallback and audit events |
| Distribution | SDK, MCP, API, OTC Tape | Builders, bots, agents, and desks read the same protocol surface; writes stay outside the browser tape |
This is private pre-trade RFQ and public post-trade clearing. Quote negotiation can happen off-chain; collateral movement, option minting, fee routing, and settlement land as auditable Solana transactions.
Live Surfaces
| Surface | URL / package | Status |
|---|---|---|
| OTC Tape | skew-web.vercel.app/terminal | Read-only devnet tape: RFQ Tape + Secondary Tape |
| Program | 3w2qSp1UnuTbTfdHPXxm3zZaz6JZRmPpbmHf56Y1DsgK |
Devnet deployed |
| SDK | @skew-labs/sdk |
0.7.11 published |
| MCP | @skew-labs/mcp |
0.7.21 published |
| Relay | skew-relay-devnet.fly.dev/health | Instant RFQ websocket |
| Pricing | skew-pricing.fly.dev/health | Fair value, IV surface, margin previews |
| Docs | skew-web.vercel.app/docs | Public protocol documentation |
Launch panel: BTC, ETH, SOL, XRP, HYPE. Linear settlement is USDC. Physical SOL-family settlement is constrained to SOL inverse wSOL/jitoSOL lanes.
| Asset | USDC linear payoff support | SOL-family physical support |
|---|---|---|
| BTC | vanilla, digital, capped, range-accrual | none |
| ETH | vanilla, digital, capped, range-accrual | none |
| SOL | vanilla, digital, capped, range-accrual | vanilla inverse and digital inverse over wSOL/jitoSOL |
| XRP | vanilla, digital, capped | none |
| HYPE | vanilla, digital | none |
Auction RFQ v1 escrow is USDC/stable-only. wSOL and jitoSOL are policy-gated CM collateral and Instant RFQ physical-settlement rails for SOL inverse fills; they are not generic cross-asset PM collateral.
Evaluation Quickstart
Run this path first when evaluating Skew. It is the same Paradigm-style RFQ shape used by the public docs: buyer opens an Auction RFQ, maker quotes, buyer fills through Instant RFQ, and the receipt proves portfolio-margin readback.
git clone https://github.com/skew-labs/skew
cd skew/skew/skew-sdk/examples/06-auction-pm-fill
cp .env.example .env
# edit HELIUS_RPC, BUYER_KEYPAIR, and MAKER_KEYPAIR in .env
pnpm install
pnpm start
Both keypairs need devnet SOL. The buyer needs devnet USDC for the premium cap; the maker needs devnet USDC for clearing collateral. A successful run prints an auction PDA, fill transaction, option PDA, buyer-long readback, maker-short readback, and PM lock fields similar to:
executionLane: instant_rfq_atomic_fill
tradeState: FILLED
pmBacked: true
pmGuarantee: guaranteed
pmLockedDeltaUsd: 28.58
pmLockedDeltaPctOfNotional: 2.86
readbackOk: true
Verification Snapshot
Latest devnet verification, 2026-05-12:
| Check | Result |
|---|---|
| Pricing + Greeks + PM preview matrix | 175 / 175 pass |
| Live RFQ request/build matrix | 159 / 159 pass |
| Expected local tenor rejects | 16 XRP/HYPE combinations |
| Unexpected matrix failures | 0 |
| Representative Auction -> Instant PM fill | pass with PM readback |
Execution Lanes
Skew exposes three distinct trade paths. They are deliberately not collapsed into one order-book abstraction.
| Lane | Path | Use |
|---|---|---|
| Instant RFQ HIT | quote_request -> buyer_accept -> cm_sign -> buyer_tx_signed -> atomic_fill_from_relay |
Immediate buyer-selected CM fill with portfolio margin, fee routing, and normalized lifecycle readback |
| Auction RFQ | register_rfq_auction -> submit_rfq_quote_tx_signed / submit_rfq_quote -> finalize_rfq_auction -> Instant RFQ PM fill |
Competitive quote window and price discovery; PM-backed issuance uses the Instant handoff (skew.rfq.auctionAndFill) |
| Pre-funded listing | create_option -> buy_option -> settle and legacy single-MM RFQ |
Fully collateralized builder primitive and inventory workflows |
There is no take_best_quote instruction in the current IDL. Clients that need
1-click execution should use Instant RFQ; clients that need price discovery
should use Auction RFQ for tape/finalization and skew.rfq.auctionAndFill()
or the MCP Auction-to-Instant handoff for PM-backed issuance.
For non-empty maker books, Instant RFQ uses the PM-cache hot path. The relay
checks CmRiskCacheV1, refreshes it when stale/missing/count-mismatched, then
builds the atomic fill with pmRiskCache only. The Anchor program validates
the cache again on-chain. This avoids the large-book transaction-size fallback
without trusting off-chain margin state.
Risk And Custody
- Portfolio margin: complete-position registry walks, clearing-class IM
(
M0throughM3), held-long tracking, PM lock rebalance, and variation-margin freshness checks. - Collateral policy: live custody paths are policy-gated. USDC is the linear PM rail; wSOL/jitoSOL are restricted physical collateral rails.
- Oracle policy: settlement uses canonical Pyth feeds. The IV oracle and pricing service are advisory/risk surfaces, not settlement sources.
- Liquidation: keepers compute priority off-chain; on-chain handlers verify improvement, close factors, waterfall movement, and holder-claim state.
- Fees: protocol fee accumulators are per settlement mint. Builder-routed flows share 25% of the effective taker fee with the registered builder.
- Insurance fund: IF replenish is SKEW_AUTHORITY-keeper gated and capped per call. Governance migration is documented before mainnet.
Skew is devnet software until external audit is complete. The codebase is built to expose invariants clearly before mainnet rather than to hide operational assumptions behind UI copy.
Developer Entry Points
SDK
pnpm add @skew-labs/sdk @solana/web3.js @coral-xyz/anchor @solana/spl-token
import { SkewClient } from "@skew-labs/sdk";
import idl from "@skew-labs/sdk/idl/skew_master.json" assert { type: "json" };
import { Program } from "@coral-xyz/anchor";
const skew = SkewClient.fromProgram(
connection,
wallet,
new Program(idl as any, provider),
);
The SDK includes typed methods for clearing members, option lifecycle, RFQ auctions, Instant RFQ relay helpers, settlement, liquidations, fee routing, builder codes, series listings, collateral vaults, and read snapshots. Live RFQ/create tenor buckets are asset-specific: BTC/ETH/SOL support 1d / 7d / 14d / 28d / 90d, XRP supports 7d / 14d / 28d, and HYPE supports 1d / 7d / 14d / 28d. The SDK rejects unsupported asset/tenor pairs before wallet signing.
The recommended institutional RFQ path is the official SDK facade:
const rfq = await skew.rfq.request({
asset: "BTC",
payoff: "vanilla_call",
strike: 60000,
notional: 10000,
expiry: "7d",
maxPremiumUsd: 300,
});
const best = await rfq.waitForBestQuote({ timeoutMs: 60000 });
const fill = await rfq.accept(best, { maxPremiumUsd: 300 });
console.log(fill.optionPda);
console.log(fill.tradeState, fill.clearingState);
console.log(fill.pmBacked, fill.pmGuarantee);
console.log(fill.margin.pmLockedDeltaUsd);
console.log(fill.margin.pmLockedDeltaPctOfNotional);
This wraps the Instant RFQ PM-backed route:
quote_request -> quote_ack -> buyer_accept_tx_signed -> cm_sign -> buyer_tx_signed -> atomic_fill_from_relay.
If the workflow starts with Auction RFQ discovery, use
skew.rfq.auctionAndFill(...); it finalizes the auction tape and then forces
the actual option issuance through the same Instant RFQ PM route.
The pre-funded create -> deposit -> buy primitive remains available for
inventory workflows, but it is not the official RFQ clearing path.
SDK, MCP, and relay readback use the same lifecycle fields:
tradeState/trade_state, clearingState/clearing_state, pmBacked/pm_backed,
pmGuarantee/pm_guarantee, registryUpdated/registry_updated, and
rejectionReason/rejection_reason. Successful Instant RFQ atomic fills return
pmBacked=true and pmGuarantee="guaranteed". Auction discovery,
pre-funded inventory, and secondary transfer stay explicit so integrators do
not mislabel non-PM flows as PM-backed issuance.
MCP
npx @skew-labs/mcp
Core profile is read-only: discovery, market data, pricing, margin
breakdowns, fee estimates, collateral policy, option/RFQ/CM reads. Trading,
RFQ, advanced, and governance write surfaces are explicit opt-ins via
SKEW_MCP_PROFILE; write tools are not listed unless a keypair is configured.
API
The public web/API layer exposes tape data plus separate pricing and risk reads:
/api/rfq-auctions/api/rfq-metrics/api/surface/api/portfolio-margin/api/price/api/fill-tape/api/options
Every trading API route is rate-limited and returns provenance where the data can come from more than one path, such as indexer vs on-chain snapshot.
Repository Layout
skew/
├─ skew-master/ Anchor program
├─ skew-sdk/ npm SDK
├─ skew-mcp/ MCP server for agents
├─ skew-relay/ Instant RFQ websocket relay
├─ skew-pricing/ fair value, IV, margin preview service
├─ skew-web/ OTC Tape, docs, public API routes
├─ skew-indexer/ Helius webhook and database projections
├─ skew-e2e/ anchor/browser integration tests
└─ scripts/ deploy, CU profiling, ops tooling
Quick Start
git clone https://github.com/skew-labs/skew
cd skew/skew
corepack pnpm install
corepack pnpm --filter @skew-labs/sdk build
corepack pnpm --filter @skew/web dev
For the Anchor program:
cd skew
anchor build
For devnet deployment and CU profiling:
corepack pnpm deploy:devnet
corepack pnpm profile:cu
Documentation
Design References
Skew's public surface follows a financial-infrastructure pattern rather than a consumer exchange pattern: network access and market connectivity, front-to-back risk/operations, explicit OTC trade capture, and transparent clearing output. The design review for this README used public material from Trayport, Orchestrade, CME ClearPort, and Paradigm as reference points for tone and information architecture.
Institutional Documentation
The binding rulebook lives at the worktree root. Code, parameters, and prose are kept in alignment by CI gates so the public surface cannot drift from the rules it claims to follow.
- PROTOCOL.md — Rulebook v1.4, 14+ chapters, 143 unique rules across 18 institutional standards.
CME numbering plus Deribit / CME / Paradigm / Derive voice patterns. Aligned
to ISDA 2002 + SIMM v2.6, FIA, MiFID II RTS 6 & 7, MiFIR Art 26 T+1, CFTC SEF Part 37, IOSCO PFMI 2017 (Recovery Regime, Rule 11A),
EMIR REFIT, SEC Form ATS-N, CME Rule 526 / 588 / 802, PFMI 24, Eurex 2026,
LCH SwapClear, SGX-DC, JSCC, KRX, NFA 2-29 / 2-30, HKEX OTC Clear, DTCC GTR,
and MAS PSA. Source citations:
skew/docs/spec/RESEARCH_DEEP_PARSE_2026-05-09.md,skew/docs/spec/RESEARCH_EU_REGULATORY_2026-05-09.md. - PARAMETERS.md — 258 verified numeric parameters.
Each row carries a Contract Variable column so
scripts/spec_parity_check.pycan detect claim ↔ code drift on every CI run. docs/runbooks/— 10 operational runbooks: 5 default-management (RUNBOOK_INCIDENT_RESPONSE,RUNBOOK_ORACLE_FAILOVER,RUNBOOK_SETTLEMENT_DISPUTE,RUNBOOK_LIQUIDITY_STRESS_TEST,RUNBOOK_DEFAULT_WATERFALL_DRILL) and 5 institutional (RUNBOOK_HEDGE_AUCTION,RUNBOOK_METHODOLOGY_COMMITTEE,RUNBOOK_FIRE_DRILL,RUNBOOK_DATA_QUALITY_AUDIT,RUNBOOK_PROMO_REVIEW).
On-chain state is the Solana program at skew/skew-master. Off-chain pricing
runs as the skew-pricing Rust HTTP service. Indexer projections live in
skew-indexer (TypeScript + Neon Postgres). The TypeScript SDK at
skew/skew-sdk is generated from the Anchor IDL via pnpm gen:sdk.
How To Read The Docs (recommended path)
For auditors, integrators, and reviewers entering the repo for the first time:
- Plain-English overview —
INTRODUCTION.mdandPRINCIPLES.mdat the worktree root. - Audit packet entry point —
skew/docs/audit/README.md. Read this before any other audit doc; it lists the 12-doc reading order and the integrity index. - Rulebook + parameters —
PROTOCOL.md(binding) andPARAMETERS.md(numeric constants). - On-chain surface —
skew/skew-master/README.md. - Off-chain services —
skew/skew-pricing/README.md,skew/skew-indexer/,skew/skew-relay/README.md. - Distribution surfaces —
skew/skew-sdk/README.md,skew/skew-mcp/README.md,skew/skew-web/README.md.
Contact
Founder: Heoun ([email protected]). Korean preferred for protocol /
business correspondence; English fine for technical threads. Time zone KST
(UTC+9). Repository:
github.com/skew-labs/skew. For audit
engagement see skew/docs/audit/AUDIT_RFP.md.
License
MIT — see LICENSE, NOTICE (if present), and
CONTRIBUTING.md. Security disclosure policy in
SECURITY.md.
No comments yet
Be the first to share your take.