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.

web devnet program sdk mcp license

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 (M0 through M3), 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.py can 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:

  1. Plain-English overviewINTRODUCTION.md and PRINCIPLES.md at the worktree root.
  2. Audit packet entry pointskew/docs/audit/README.md. Read this before any other audit doc; it lists the 12-doc reading order and the integrity index.
  3. Rulebook + parametersPROTOCOL.md (binding) and PARAMETERS.md (numeric constants).
  4. On-chain surfaceskew/skew-master/README.md.
  5. Off-chain servicesskew/skew-pricing/README.md, skew/skew-indexer/, skew/skew-relay/README.md.
  6. Distribution surfacesskew/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.