Claude-skill-registry dflow
Complete DFlow trading protocol SDK - the single source of truth for integrating DFlow on Solana. Covers spot trading, prediction markets, Swap API, Metadata API, WebSocket streaming, and all DFlow tools.
git clone https://github.com/majiayu000/claude-skill-registry
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/dflow" ~/.claude/skills/majiayu000-claude-skill-registry-dflow && rm -rf "$T"
skills/data/dflow/SKILL.mdDFlow - Complete Integration Guide
The definitive guide for integrating DFlow - a trading protocol that enables traders to exchange value across spot and prediction markets natively on Solana.
What is DFlow?
DFlow is a comprehensive trading infrastructure that provides:
- Trading Applications & Wallets - Token swaps with intelligent routing and 99.9% token coverage
- Exchanges & Aggregators - Access to billions in monthly routed volume across DEXes and Prop AMMs
- Financial Institutions & Market Makers - Programmable execution layers with CLPs and async trades
- Prediction Market Platforms - Discovery, pricing, routing, and settlement infrastructure
Key Capabilities
| Feature | Description |
|---|---|
| Token Coverage | 99.9% with millisecond detection |
| Infrastructure | Globally distributed, high-throughput optimization |
| Execution | Advanced algorithms with JIT routing for best-price execution |
| Markets | Support for both spot and prediction market trading |
| MEV Protection | Enhanced sandwich protection with Jito bundles |
API Overview
DFlow provides two main API categories:
1. Swap API (Trading)
Base URL:
https://quote-api.dflow.net
For executing trades:
- Imperative Swaps - Full control over route selection at signature time
- Declarative Swaps - Intent-based swaps with deferred route optimization
- Trade API - Unified interface for spot and prediction market trading
- Order API - Quote and transaction generation
2. Prediction Market Metadata API
Base URL:
https://api.prod.dflow.net
For querying prediction market data:
- Events API - Query prediction events and forecasts
- Markets API - Get market details, orderbooks, outcome mints
- Trades API - Historical trade data
- Live Data API - Real-time milestones and updates
- WebSocket - Streaming price and orderbook updates
Authentication
Most endpoints require an API key via the
x-api-key header. Contact hello@dflow.net to obtain credentials.
Quick Start
Imperative Swap (3 Steps)
import { Connection, Keypair, VersionedTransaction } from "@solana/web3.js"; const API_BASE = "https://quote-api.dflow.net"; const API_KEY = process.env.DFLOW_API_KEY; // Optional but recommended // Token addresses const SOL = "So11111111111111111111111111111111111111112"; const USDC = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"; async function imperativeSwap(keypair: Keypair, connection: Connection) { // Step 1: Get Quote const quoteParams = new URLSearchParams({ inputMint: SOL, outputMint: USDC, amount: "1000000000", // 1 SOL slippageBps: "50", // 0.5% }); const quote = await fetch(`${API_BASE}/quote?${quoteParams}`, { headers: API_KEY ? { "x-api-key": API_KEY } : {}, }).then(r => r.json()); // Step 2: Get Swap Transaction const swapResponse = await fetch(`${API_BASE}/swap`, { method: "POST", headers: { "content-type": "application/json", ...(API_KEY && { "x-api-key": API_KEY }), }, body: JSON.stringify({ userPublicKey: keypair.publicKey.toBase58(), quoteResponse: quote, dynamicComputeUnitLimit: true, prioritizationFeeLamports: 150000, }), }).then(r => r.json()); // Step 3: Sign and Send const tx = VersionedTransaction.deserialize( Buffer.from(swapResponse.swapTransaction, "base64") ); tx.sign([keypair]); const signature = await connection.sendTransaction(tx); await connection.confirmTransaction(signature); return signature; }
Trade API (Unified - Recommended)
The Trade API provides a single endpoint that handles both sync and async execution:
async function tradeTokens(keypair: Keypair, connection: Connection) { // Step 1: Get Order (quote + transaction in one call) const orderParams = new URLSearchParams({ inputMint: SOL, outputMint: USDC, amount: "1000000000", slippageBps: "50", userPublicKey: keypair.publicKey.toBase58(), }); const order = await fetch(`${API_BASE}/order?${orderParams}`, { headers: API_KEY ? { "x-api-key": API_KEY } : {}, }).then(r => r.json()); // Step 2: Sign and Send const tx = VersionedTransaction.deserialize( Buffer.from(order.transaction, "base64") ); tx.sign([keypair]); const signature = await connection.sendTransaction(tx); // Step 3: Monitor (based on execution mode) if (order.executionMode === "async") { // Poll order status for async trades let status = "pending"; while (status !== "closed" && status !== "failed") { await new Promise(r => setTimeout(r, 2000)); const statusRes = await fetch( `${API_BASE}/order-status?signature=${signature}`, { headers: API_KEY ? { "x-api-key": API_KEY } : {} } ).then(r => r.json()); status = statusRes.status; } } else { // Sync trades complete atomically await connection.confirmTransaction(signature); } return signature; }
API Reference
Order API Endpoints
GET /order
Returns a quote and optionally a transaction for spot or prediction market trades.
| Parameter | Required | Description |
|---|---|---|
| Yes | Base58 input token mint |
| Yes | Base58 output token mint |
| Yes | Amount as scaled integer (1 SOL = 1000000000) |
| No | Include to receive signable transaction |
| No | Max slippage in basis points or "auto" |
| No | Platform fee in basis points |
| No | "auto", "medium", "high", "veryHigh", or lamport amount |
Response:
{ "outAmount": "150000000", "minOutAmount": "149250000", "priceImpactPct": "0.05", "executionMode": "sync", "transaction": "base64...", "computeUnitLimit": 200000, "lastValidBlockHeight": 123456789, "routePlan": [...] }
GET /order-status
Check status of async orders.
| Parameter | Required | Description |
|---|---|---|
| Yes | Base58 transaction signature |
| No | Block height for expiry check |
Status Values:
- Order submitted, awaiting processingpending
- Order opened, awaiting fillopen
- Filled, closing transaction pendingpendingClose
- Order completed successfullyclosed
- Transaction expired before landingexpired
- Order execution failedfailed
Imperative Swap Endpoints
GET /quote
Get a quote for an imperative swap.
| Parameter | Required | Description |
|---|---|---|
| Yes | Base58 input mint |
| Yes | Base58 output mint |
| Yes | Input amount (scaled integer) |
| No | Slippage tolerance or "auto" |
| No | Comma-separated DEXes to include |
| No | Comma-separated DEXes to exclude |
| No | Single-leg routes only |
| No | Max number of route legs |
| No | Jito bundle compatible routes |
| No | Platform fee in basis points |
POST /swap
Generate swap transaction from quote.
Request Body:
{ "userPublicKey": "Base58...", "quoteResponse": { /* from /quote */ }, "dynamicComputeUnitLimit": true, "prioritizationFeeLamports": 150000, "wrapAndUnwrapSol": true }
Response:
{ "swapTransaction": "base64...", "computeUnitLimit": 200000, "lastValidBlockHeight": 123456789, "prioritizationFeeLamports": 150000 }
POST /swap-instructions
Returns individual instructions instead of a full transaction (for custom transaction building).
Declarative Swap Endpoints
Declarative swaps use intent-based execution with deferred route optimization.
GET /intent
Get an intent quote for a declarative swap.
| Parameter | Required | Description |
|---|---|---|
| Yes | Base58 input mint |
| Yes | Base58 output mint |
| Yes | Input amount (scaled integer) |
| No | Slippage tolerance |
| Yes | User's wallet address |
POST /submit-intent
Submit a signed intent transaction for execution.
Request Body:
{ "signedTransaction": "base64...", "intentResponse": { /* from /intent */ } }
Token API Endpoints
GET /tokens
Returns list of supported token mints.
GET /tokens-with-decimals
Returns tokens with decimal information for proper amount scaling.
Venue API Endpoints
GET /venues
Returns list of supported DEX venues (Raydium, Orca, Phoenix, Lifinity, etc.).
Swap Modes Comparison
| Feature | Imperative | Declarative |
|---|---|---|
| Route Control | Full control at sign time | Optimized at execution |
| Latency | Higher (two API calls) | Lower (deferred calc) |
| Slippage | Fixed at quote time | Minimized at execution |
| Sandwich Protection | Standard | Enhanced |
| Use Case | Precise route requirements | Best execution priority |
When to Use Imperative
- Need to review exact route before signing
- Building order books or specific DEX routing
- Complex multi-step transactions
- Need deterministic execution paths
When to Use Declarative
- Prioritize best execution
- Lower slippage requirements
- Simple token swaps
- MEV protection is important
Execution Modes
Synchronous (Atomic)
- Single transaction execution
- All-or-nothing settlement
- Standard confirmation flow
- Use
connection.confirmTransaction()
Asynchronous (Multi-Transaction)
- Uses Jito bundles
- Open → Fill → Close transaction flow
- Poll
for completion/order-status - Better for complex routes or prediction markets
// Async order monitoring async function monitorAsyncOrder(signature: string) { const statuses = ["pending", "open", "pendingClose"]; let currentStatus = "pending"; while (statuses.includes(currentStatus)) { await new Promise(r => setTimeout(r, 2000)); const res = await fetch( `${API_BASE}/order-status?signature=${signature}`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json()); currentStatus = res.status; if (currentStatus === "closed") { return { success: true, fills: res.fills }; } if (currentStatus === "failed" || currentStatus === "expired") { return { success: false, status: currentStatus }; } } }
Prediction Markets
DFlow provides infrastructure for trading prediction market outcome tokens.
Market Structure
Series (Collection) └── Event (Occurrence) └── Market (Outcome Trade)
Market Lifecycle
- Initialized - Market created
- Active - Trading enabled
- Inactive - Trading paused
- Closed - No more trading
- Determined - Outcome known
- Finalized - Payouts available
Trading Prediction Markets
// Use the Trade API with prediction market token mints const order = await fetch(`${API_BASE}/order?${new URLSearchParams({ inputMint: USDC, outputMint: OUTCOME_TOKEN_MINT, // Prediction market token amount: "10000000", // 10 USDC slippageBps: "100", userPublicKey: keypair.publicKey.toBase58(), predictionMarketSlippageBps: "200", // Separate slippage for PM })}`, { headers: { "x-api-key": API_KEY } }).then(r => r.json());
Common Token Mints
| Token | Mint Address |
|---|---|
| SOL (Wrapped) | |
| USDC | |
| USDT | |
| BONK | |
| JUP | |
| WIF | |
Priority Fees
Configure transaction priority:
// Option 1: Auto (recommended) prioritizationFeeLamports: "auto" // Option 2: Priority level prioritizationFeeLamports: { priorityLevel: "high" // "medium", "high", "veryHigh" } // Option 3: Exact amount prioritizationFeeLamports: 150000 // Option 4: Max with auto-adjust prioritizationFeeLamports: { autoMultiplier: 2, maxLamports: 500000 }
Error Handling
async function safeSwap(params: SwapParams) { try { const quote = await getQuote(params); if (!quote.routePlan?.length) { throw new Error("No route found"); } const swap = await getSwapTransaction(quote, params.userPublicKey); const tx = deserializeTransaction(swap.swapTransaction); tx.sign([params.keypair]); const signature = await connection.sendTransaction(tx, { skipPreflight: false, maxRetries: 3, }); return { success: true, signature }; } catch (error) { if (error.message.includes("insufficient")) { return { success: false, error: "Insufficient balance" }; } if (error.message.includes("slippage")) { return { success: false, error: "Slippage exceeded" }; } return { success: false, error: error.message }; } }
Platform Fees
Collect platform fees on swaps:
const quote = await fetch(`${API_BASE}/quote?${new URLSearchParams({ inputMint: SOL, outputMint: USDC, amount: "1000000000", platformFeeBps: "50", // 0.5% fee platformFeeMode: "outputMint", // Collect in output token })}`, { headers: { "x-api-key": API_KEY } }).then(r => r.json()); // In swap request, specify fee account const swap = await fetch(`${API_BASE}/swap`, { method: "POST", headers: { "content-type": "application/json", "x-api-key": API_KEY }, body: JSON.stringify({ userPublicKey: user.toBase58(), quoteResponse: quote, feeAccount: platformFeeAccount.toBase58(), // Your fee recipient }), }).then(r => r.json());
Jito Integration
For MEV protection and bundle submission:
// Request Jito-compatible routes const quote = await fetch(`${API_BASE}/quote?${new URLSearchParams({ inputMint: SOL, outputMint: USDC, amount: "1000000000", forJitoBundle: "true", })}`, { headers: { "x-api-key": API_KEY } }).then(r => r.json()); // Include Jito sandwich mitigation const swap = await fetch(`${API_BASE}/swap`, { method: "POST", body: JSON.stringify({ userPublicKey: user.toBase58(), quoteResponse: quote, includeJitoSandwichMitigationAccount: true, }), }).then(r => r.json());
DFlow Swap Orchestrator
The DFlow Swap Orchestrator contract manages declarative swap execution:
Program ID: DF1ow3DqMj3HvTj8i8J9yM2hE9hCrLLXpdbaKZu4ZPnz
Prediction Market Metadata API
The Prediction Market Metadata API provides comprehensive access to prediction market information.
Base URL:
https://api.prod.dflow.net
Market Structure
Series (Collection) └── Event (Occurrence) └── Market (Outcome Trade) ├── Yes Token (outcome mint) └── No Token (outcome mint)
Events API
GET /api/v1/event/{ticker}
Returns a single event by its ticker with optional nested markets.
const METADATA_API = "https://api.prod.dflow.net"; // Get event details const event = await fetch(`${METADATA_API}/api/v1/event/TRUMP-2024`, { headers: { "x-api-key": API_KEY } }).then(r => r.json()); // Response includes: ticker, title, status, markets, close_time, etc.
GET /api/v1/events
Returns a paginated list of all events.
const events = await fetch(`${METADATA_API}/api/v1/events?limit=50&offset=0`, { headers: { "x-api-key": API_KEY } }).then(r => r.json());
GET /api/v1/event/{ticker}/forecast
Returns historical forecast percentile data.
GET /api/v1/event/{ticker}/candlesticks
Returns candlestick data from Kalshi.
Markets API
GET /api/v1/market/{ticker}
Returns a single market by ticker.
const market = await fetch(`${METADATA_API}/api/v1/market/TRUMP-2024-WIN`, { headers: { "x-api-key": API_KEY } }).then(r => r.json()); // Response: ticker, yes_mint, no_mint, status, last_price, volume, etc.
GET /api/v1/market/by-mint/{mint_address}
Lookup market by any mint (ledger or outcome mints).
const market = await fetch( `${METADATA_API}/api/v1/market/by-mint/${outcomeMint}`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json());
POST /api/v1/markets/batch
Batch retrieve multiple markets (max 100).
const markets = await fetch(`${METADATA_API}/api/v1/markets/batch`, { method: "POST", headers: { "content-type": "application/json", "x-api-key": API_KEY }, body: JSON.stringify({ tickers: ["MARKET-1", "MARKET-2"], mints: ["mint1...", "mint2..."] }) }).then(r => r.json());
GET /api/v1/outcome_mints
Returns all yes_mint and no_mint pubkeys from all supported markets.
// Get all outcome mints, optionally filter by close time const mints = await fetch( `${METADATA_API}/api/v1/outcome_mints?min_close_timestamp=${Date.now()}`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json());
POST /api/v1/filter_outcome_mints
Check if addresses are outcome mints (max 200).
const filtered = await fetch(`${METADATA_API}/api/v1/filter_outcome_mints`, { method: "POST", headers: { "content-type": "application/json", "x-api-key": API_KEY }, body: JSON.stringify({ addresses: ["mint1...", "mint2..."] }) }).then(r => r.json());
Orderbook API
GET /api/v1/orderbook/{ticker}
Get orderbook by market ticker.
const orderbook = await fetch( `${METADATA_API}/api/v1/orderbook/TRUMP-2024-WIN`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json()); // Response: bids: [{price, quantity}], asks: [{price, quantity}]
GET /api/v1/orderbook/by-mint/{mint_address}
Get orderbook using mint address lookup.
Trades API
GET /api/v1/trades
Returns paginated trade history with filtering.
const trades = await fetch( `${METADATA_API}/api/v1/trades?ticker=TRUMP-2024-WIN&limit=100`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json());
GET /api/v1/trades/by-mint/{mint_address}
Get trades using mint address lookup.
Live Data API
GET /api/v1/milestones/{ticker}
Real-time milestone data from Kalshi.
const milestones = await fetch( `${METADATA_API}/api/v1/milestones/TRUMP-2024`, { headers: { "x-api-key": API_KEY } } ).then(r => r.json());
Series & Categories
GET /api/v1/series
Returns series templates for recurring events.
GET /api/v1/categories
Returns category tags for filtering.
WebSocket Streaming
Connect for real-time updates:
const ws = new WebSocket("wss://api.prod.dflow.net/ws"); ws.onopen = () => { // Subscribe to market updates ws.send(JSON.stringify({ action: "subscribe", channel: "market", ticker: "TRUMP-2024-WIN" })); }; ws.onmessage = (event) => { const data = JSON.parse(event.data); // Handle: price_update, orderbook_update, trade, etc. console.log("Update:", data); };
Market Lifecycle
| Status | Description |
|---|---|
| Market created |
| Trading enabled |
| Trading paused |
| No more trading |
| Outcome known |
| Payouts available |
GitHub Tools & SDKs
DFlow provides several open-source tools on GitHub:
solana-agent-kit
Repository: DFlowProtocol/solana-agent-kit
Toolkit enabling AI agents to connect to Solana protocols:
// Use with AI agents for automated trading import { SolanaAgentKit } from "@dflow/solana-agent-kit"; const agent = new SolanaAgentKit({ rpcUrl: process.env.RPC_URL, privateKey: process.env.PRIVATE_KEY, }); // Agent can execute DFlow swaps, query markets, etc.
clearpools
Repository: DFlowProtocol/clearpools
Orca Whirlpools with support for flow segmentation:
// Extends Orca protocol with DFlow routing import { ClearPools } from "@dflow/clearpools"; const pools = new ClearPools(connection); await pools.initializePool(/* params */);
dflow-amm-interface
Repository: DFlowProtocol/dflow-amm-interface
Rust trait definitions for DFlow's AMM implementation. Use when building custom AMMs that integrate with DFlow routing.
Infrastructure Tools
- solana-accountsdb-plugin-bigtable - Geyser plugin for Bigtable
- solana-bigtable-connection - Bigtable connection library
- solana-bigtable-geyser-models - Object models for Geyser data
Skill Structure
dflow/ ├── SKILL.md # This file - complete integration guide ├── resources/ │ ├── api-reference.md # Swap API reference │ ├── prediction-market-api.md # Prediction Market Metadata API reference │ ├── github-sdks.md # GitHub tools & SDKs documentation │ ├── token-mints.md # Common token addresses │ └── error-codes.md # Error handling guide ├── examples/ │ ├── imperative-swaps/ # Imperative swap examples │ ├── declarative-swaps/ # Declarative swap examples │ ├── trade-api/ # Unified Trade API examples │ └── prediction-markets/ # Prediction market examples │ ├── query-markets.ts # Query events, markets, orderbook │ ├── trade-outcomes.ts # Trade outcome tokens │ └── websocket-client.ts # Real-time data streaming ├── templates/ │ ├── swap-client.ts # Swap client starter │ └── prediction-market-client.ts # Prediction market client starter └── docs/ ├── advanced-patterns.md # Complex integrations └── troubleshooting.md # Common issues
Guidelines
- Use Trade API for most cases - Unified endpoint handles both sync/async
- Always handle async orders - Check
and poll statusexecutionMode - Set appropriate slippage - "auto" for convenience, custom for control
- Include priority fees - Essential for reliable execution
- Handle errors gracefully - Network issues, slippage, insufficient balance
- Monitor rate limits - Use API key for production
- Test on devnet first - DFlow supports Solana devnet