# Authentication Source: https://docs.vali.wtf/getting-started/authentication # Authentication Access is NFT-gated. 1. Buy a Vali pass on [Tensor](https://tensor.trade) or [Magic Eden](https://magiceden.io) 2. Go to [vali.wtf](https://vali.wtf) and bind your IP to your pass Once your IP is bound, requests from that IP are authorized β€” no API key or headers needed. # Endpoints Source: https://docs.vali.wtf/getting-started/endpoints # Endpoints ## πŸ‡ΊπŸ‡Έ Ashburn β€” 500 TPS | Service | URL | | ------------------ | -------------------------- | | RPC | `ash.node.vali.wtf` | | WebSocket | `ws://ash.socket.vali.wtf` | | gRPC (Yellowstone) | `ash.grpc.vali.wtf:4224` | | Landing | `fast.ash.node.vali.wtf` | ## πŸ‡©πŸ‡ͺ Frankfurt β€” 500 TPS | Service | URL | | ------------------ | -------------------------- | | RPC | `fra.node.vali.wtf` | | WebSocket | `ws://fra.socket.vali.wtf` | | gRPC (Yellowstone) | `fra.grpc.vali.wtf:4224` | | vRPC | `fra.vrpc.vali.wtf:9000` | | Landing | `fast.fra.node.vali.wtf` | ## πŸ‡ΊπŸ‡Έ New York β€” 400 TPS | Service | URL | | ------------------ | ------------------------- | | RPC | `ny.node.vali.wtf` | | WebSocket | `ws://ny.socket.vali.wtf` | | gRPC (Yellowstone) | `ny.grpc.vali.wtf:4224` | | vRPC | `ny.vrpc.vali.wtf:9000` | | Landing | `fast.ny.node.vali.wtf` | ## πŸ‡³πŸ‡± Amsterdam β€” 400 TPS | Service | URL | | ------------------ | -------------------------- | | RPC | `ams.node.vali.wtf` | | WebSocket | `ws://ams.socket.vali.wtf` | | gRPC (Yellowstone) | `ams.grpc.vali.wtf:4224` | | vRPC | `ams.vrpc.vali.wtf:9000` | | Landing | `fast.ams.node.vali.wtf` | ## πŸ‡―πŸ‡΅ Tokyo β€” 250 TPS | Service | URL | | ------------------ | ---------------------------- | | RPC | `tokyo.node.vali.wtf` | | WebSocket | `ws://tokyo.socket.vali.wtf` | | gRPC (Yellowstone) | `tokyo.grpc.vali.wtf:4224` | | vRPC | `tokyo.vrpc.vali.wtf:9000` | | Landing | `fast.tokyo.node.vali.wtf` | ## πŸ‡¬πŸ‡§ London β€” 250 TPS | Service | URL | | ------------------ | -------------------------- | | RPC | `ldn.node.vali.wtf` | | WebSocket | `ws://ldn.socket.vali.wtf` | | gRPC (Yellowstone) | `ldn.grpc.vali.wtf:4224` | | vRPC | `ldn.vrpc.vali.wtf:9000` | | Landing | `fast.ldn.node.vali.wtf` | ## πŸ“œ Archive β€” 35 RPS (Ashburn) | Service | URL | | ------- | ------------------ | | RPC | `archive.vali.wtf` | *** > Landing/fast endpoints are capped at **25 TPS** across all locations. # Introduction Source: https://docs.vali.wtf/introduction # vali.wtf Vali Labs builds high-performance Solana infrastructure. We specialize in RPC nodes β€” from standard JSON-RPC to archive data, gRPC streaming, pre-confirmation shreds, and more. Everything you need to build fast, reliable applications on Solana. ## Products | Product | Description | | --------------------------------------- | --------------------------------------------------------------- | | [RPC](products/rpc/) | JSON-RPC across 6 global locations with sub-50ms latency | | [gRPC (Yellowstone)](products/grpc/) | Geyser-based gRPC streaming for real-time Solana data | | [vRPC (Decoded Shreds)](products/vrpc/) | Pre-confirmation transaction data via decoded shreds | | [Landing Endpoint](products/landing/) | Direct TPU forwarding for maximum transaction landing rates | | [Data Insights](products/insights/) | Block50 analytics, fee estimation, and congestion scoring | | [Archive](products/archive/) | Full historical data with gSFA, Triton, and Yellowstone support | # Archive Source: https://docs.vali.wtf/products/archive/archive # Archive RPC Historical Solana RPC with epoch-level coverage. Query any transaction, block, or address signature history from the archive, with all other methods proxied to a live validator. ## Endpoint ``` archive.vali.wtf ``` ## Rate Limits | Limit | Value | | ------------------- | ---------- | | Requests per second | 100 per IP | | Burst | 100 | ## Coverage Epochs **809–943+**, updated daily as new epochs are published on the old-faithful CDN (typically 1–2 epochs behind current). For the latest 1–2 epochs, requests are proxied to the live validator automatically. ## Supported Methods ### Historical (served from archive) | Method | Description | | ------------------------- | --------------------------------------------------------- | | `getTransaction` | Fetch any historical transaction by signature | | `getBlock` | Fetch full block data by slot number | | `getSignaturesForAddress` | Get transaction signatures for any account (GSFA-indexed) | | `getSlot` | Get the latest available slot | | `getBlockTime` | Get the timestamp for a given slot | ### Proxied to live validator All standard Solana JSON-RPC methods (`getAccountInfo`, `getBalance`, `getHealth`, etc.) are proxied to a live validator for recent/non-historical data. ## Example Calls **Get a transaction:** ```bash theme={null} curl -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["",{"encoding":"json","maxSupportedTransactionVersion":0}]}' \ https://archive.vali.wtf/ ``` **Get signatures for an address:** ```bash theme={null} curl -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"getSignaturesForAddress","params":["
",{"limit":10}]}' \ https://archive.vali.wtf/ ``` **Get a block:** ```bash theme={null} curl -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"getBlock","params":[,{"encoding":"json","maxSupportedTransactionVersion":0,"transactionDetails":"full"}]}' \ https://archive.vali.wtf/ ``` **Health check:** ```bash theme={null} curl -X POST -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}' \ https://archive.vali.wtf/ ``` ## Notes * Archive epochs update automatically as they become available on the old-faithful CDN * For the latest 1–2 epochs, requests are automatically proxied to the live validator * GSFA indexes are stored locally for fast `getSignaturesForAddress` lookups * All responses follow the standard Solana JSON-RPC format # gRPC (Yellowstone) Source: https://docs.vali.wtf/products/grpc/grpc # gRPC (Yellowstone) Standard Yellowstone Dragon's Mouth gRPC interface. Streams post-replay transaction data with full metadata β€” balances, logs, inner instructions, execution status. This is the same protocol used by Helius, Triton, and other RPC providers. ## How It Works ``` Validator replays slot ↓ Geyser plugin captures transaction + metadata ↓ Streamed to gRPC clients via Yellowstone protocol ``` You get everything: pre/post balances, token balances, logs, inner instructions (CPI trace), compute units consumed, success/failure status. ## Connecting ``` Endpoint: your-node:4224 Protocol: gRPC bidirectional streaming (Yellowstone Dragon's Mouth) Method: geyser.Geyser/Subscribe ``` Use any standard Yellowstone gRPC client library: * **Rust:** `yellowstone-grpc-client` * **TypeScript:** `@triton-one/yellowstone-grpc` * **Python:** `yellowstone-grpc-client-python` ## Compression Both gzip and zstd are supported for send and receive. Enable compression on your client for lower bandwidth usage: ```javascript theme={null} // TypeScript example const client = new Client("your-node:4224", undefined, { "grpc.default_compression_algorithm": 2, // zstd }); ``` ## Connection Limits Connect as many clients as you need β€” there's no hard connection cap. Per-connection filter limits prevent firehose abuse: ```json theme={null} { "filter_limits": { "accounts": { "max": 400, "any": false, "account_max": 400, "account_reject": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], "owner_max": 400, "data_slice_max": 20 }, "transactions": { "max": 25, "any": false, "account_include_max": 100, "account_include_reject": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"], "account_exclude_max": 10, "account_required_max": 10 }, "slots": { "max": 1 }, "blocks": { "max": 1 }, "blocks_meta": { "max": 1 }, "entries": { "max": 1 } } } ``` Key limits per connection: * Transaction filters: up to 25 filters, each with up to 100 `account_include` entries * Account filters: up to 400 filters, up to 400 accounts each * `any: false` means you must specify at least one filter β€” no unfiltered firehose * `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA` (SPL Token program) is blocked as a filter key because it matches nearly every transaction # Data Insights Source: https://docs.vali.wtf/products/insights/insights # Data Insights Currently available: **Block50**. More feeds coming soon. ## Block50 Block50 lets you analyze and compare wallet performance over a 50-block window. Check your own landing rates, compute usage, and block inclusion β€” or compare your wallet against another to see how you stack up. ## What You Can See * **Landing rate** β€” how many of your transactions made it into a block * **Block inclusion** β€” which blocks your transactions landed in * **Compute units** β€” your CU usage vs another wallet's * **Transaction count** β€” how many txs each wallet had in the window * **Head-to-head comparison** β€” run your wallet against any other address over the same 50-block period ## Quick Start ```javascript theme={null} const response = await fetch('https://api.vali.wtf/v1/block50'); const data = await response.json(); ``` ### Response ```json theme={null} { "slot_range": { "start": 284501200, "end": 284501250 }, "avg_compute_units": 1423000, "avg_priority_fee": 52340, "median_priority_fee": 12500, "p75_priority_fee": 85000, "p90_priority_fee": 250000, "p99_priority_fee": 1500000, "tx_count": 48230, "success_rate": 0.847, "congestion_score": 0.72, "top_programs": [ { "program_id": "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8", "name": "Raydium AMM", "tx_count": 8420, "avg_cu": 280000 } ], "updated_at": "2025-03-24T12:00:00Z" } ``` ## Fee Estimation Returns a recommended priority fee based on current network conditions: | Level | Landing Probability | Use Case | | ----------- | ------------------- | ---------------------------------- | | `low` | \~60% | Non-urgent, cost-sensitive | | `medium` | \~80% | Standard transactions | | `high` | \~95% | Time-sensitive operations | | `very_high` | \~99% | Critical (arbitrage, liquidations) | ## Historical Data ``` GET /v1/block50/history?from=284500000&to=284501000 ``` Returns an array of Block50 snapshots for the given slot range. Useful for backtesting fee strategies and analyzing historical congestion patterns. ## Congestion Breakdown ``` GET /v1/network/congestion ``` ```json theme={null} { "score": 0.72, "level": "moderate", "factors": { "compute_saturation": 0.68, "write_lock_contention": 0.81, "tx_drop_rate": 0.15 }, "updated_at": "2025-03-24T12:00:00Z" } ``` # Landing Source: https://docs.vali.wtf/products/landing/landing # Landing Endpoint (TPU Forwarder) Maximize transaction landing rates with direct TPU forwarding. Bypass the standard RPC relay path and send transactions directly to the current leader's TPU port for the fastest possible inclusion. ## Endpoint ``` https://land.vali.wtf ``` Drop-in replacement for `sendTransaction` β€” same JSON-RPC API, different routing under the hood. ## How It Works **Standard path** (via RPC): ``` Your app β†’ RPC node β†’ Leader validator TPU ``` **Landing Endpoint path**: ``` Your app β†’ Landing Endpoint β†’ Leader TPU (direct QUIC) β†’ Next leader TPU (pre-forward) ``` The Landing Endpoint: 1. Receives your signed transaction 2. Identifies the current and upcoming leaders from the schedule 3. Opens stake-weighted QUIC connections to their TPU ports 4. Forwards your transaction directly, bypassing the RPC relay 5. Retries across leader rotations with intelligent backoff ## Quick Start ```javascript theme={null} import { Connection, Transaction } from '@solana/web3.js'; // Use the landing endpoint for sendTransaction const connection = new Connection('https://land.vali.wtf', { commitment: 'confirmed', }); // Build your transaction as normal const tx = new Transaction(); // ... add instructions ... // Send via TPU forwarder const signature = await connection.sendTransaction(tx, [payer], { skipPreflight: true, // recommended for speed maxRetries: 0, // landing endpoint handles retries }); console.log('Sent via TPU:', signature); ``` ### cURL ```bash theme={null} curl https://land.vali.wtf -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "sendTransaction", "params": [ "BASE64_ENCODED_TX", { "encoding": "base64", "skipPreflight": true, "maxRetries": 0 } ] }' ``` ## Features | Feature | Description | | ------------------- | -------------------------------------------------------- | | **Direct TPU** | QUIC-based direct connection to leader TPU ports | | **Leader Tracking** | Real-time leader schedule monitoring for optimal routing | | **Multi-leader** | Forward to current and upcoming leaders simultaneously | | **Stake-weighted** | Prioritized connections via stake-weighted QUIC streams | | **Auto Retry** | Intelligent retry with backoff across leader rotations | | **Priority Fees** | Automatic priority fee estimation and suggestion | ## Recommended Settings | Parameter | Value | Why | | --------------- | -------- | ------------------------------------------- | | `skipPreflight` | `true` | Avoids extra RPC round-trip for simulation | | `maxRetries` | `0` | Landing endpoint handles retries internally | | `encoding` | `base64` | Slightly more compact than base58 | ## Supported Methods The Landing Endpoint only supports transaction submission: | Method | Supported | | ----------------- | ---------------------------------- | | `sendTransaction` | Yes | | All other methods | No β€” use the standard RPC endpoint | ## Combining with RPC A common pattern is to use the standard RPC for reads and the Landing Endpoint for writes: ```javascript theme={null} import { Connection } from '@solana/web3.js'; // Read connection (standard RPC) const readConn = new Connection('https://rpc.vali.wtf'); // Write connection (landing endpoint) const writeConn = new Connection('https://land.vali.wtf'); // Fetch data via RPC const balance = await readConn.getBalance(pubkey); // Submit transactions via Landing const sig = await writeConn.sendTransaction(tx, [payer], { skipPreflight: true, maxRetries: 0, }); ``` ## TPU (Transaction Send) TPU forwarding sends your signed transactions directly to the current and upcoming slot leaders over QUIC, bypassing the standard RPC `sendTransaction` path. ``` Your signed transaction ↓ Sent via QUIC to current + next leaders ↓ Leaders include it in their block ``` Standard `sendTransaction` goes: your client β†’ RPC node β†’ RPC forwards to leader. TPU forwarding skips the middleman β€” your transaction goes straight to the leaders who are actually producing blocks. ### Why It's Faster * **No RPC queue** β€” RPC `sendTransaction` batches and retries on a timer (default 2s). TPU sends immediately. * **Multi-leader fanout** β€” sends to multiple upcoming leaders in parallel, increasing the chance of landing in the next slot. * **QUIC priority** β€” staked connections get priority in the leader's QUIC listener. Higher stake = higher priority in the queue. ## TPS (Transactions Per Second) TPS refers to how many transactions your client can submit per second through the TPU path. This depends on: * Your QUIC connection quality to the leaders * Leader proximity β€” lower latency = transactions arrive in time for the current slot * Stake weight β€” staked validators get prioritized QUIC streams * Network congestion β€” during high-traffic periods, leaders drop lower-priority transactions TPU forwarding doesn't guarantee landing β€” it guarantees the fastest possible delivery to the leader. Landing depends on priority fees, compute budget, and leader queue depth. # Rpc Source: https://docs.vali.wtf/products/rpc/rpc # RPC Standard Solana JSON-RPC. Use this endpoint for all on-chain reads and transaction submission. Especially effective for spam-sending during hyped drops β€” our nodes are tuned to get your transactions through when the network is congested. All nodes run with `--full-rpc-api` enabled. ## Locations 6 nodes across global regions: | Location | Country | | --------- | ------------------- | | Ashburn | πŸ‡ΊπŸ‡Έ United States | | New York | πŸ‡ΊπŸ‡Έ United States | | Frankfurt | πŸ‡©πŸ‡ͺ Germany | | Amsterdam | πŸ‡³πŸ‡± Netherlands | | London | πŸ‡¬πŸ‡§ United Kingdom | | Tokyo | πŸ‡―πŸ‡΅ Japan | ## Endpoint ``` [loc].rpc.vali.wtf ``` See [Endpoints](../../getting-started/endpoints) for all location URLs. ## Quick Start ```bash theme={null} curl ash.node.vali.wtf -X POST \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' ``` ## WebSocket Standard Solana WebSocket interface β€” see [WebSocket Subscriptions](websockets.md). ## Next Steps * [WebSocket Subscriptions](websockets.md) * [Landing Endpoint](../landing/) β€” direct TPU forwarding for maximum landing rates # Websockets Source: https://docs.vali.wtf/products/rpc/websockets # WebSocket Subscriptions Standard Solana WebSocket interface. Same JSON-RPC subscription API as any Solana node. ## Endpoint ``` wss://rpc.vali.wtf ``` ## Subscriptions | Method | Description | | -------------------- | -------------------------------------- | | `accountSubscribe` | Account data changes | | `logsSubscribe` | Transaction log output | | `programSubscribe` | Changes to accounts owned by a program | | `slotSubscribe` | Slot change notifications | | `signatureSubscribe` | Transaction confirmation | | `rootSubscribe` | Root slot changes | | `blockSubscribe` | New blocks | ## Example ```javascript theme={null} const ws = new WebSocket('wss://rpc.vali.wtf'); ws.on('open', () => { ws.send(JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'slotSubscribe' })); }); ws.on('message', (data) => { console.log(JSON.parse(data)); }); ``` # vRPC Source: https://docs.vali.wtf/products/vrpc/vrpc # vRPC vRPC is a pre-confirmation transaction streaming service. It decodes transactions directly from Solana's shred layer (turbine) β€” before the validator replays them β€” giving you the lowest possible latency for new transaction detection. vRPC operates at the shred layer, so transactions are available before replay completes. This means: * No transaction metadata (no balances, no logs, no CPI trace) * No execution status (you don't know if it succeeded or failed) * You get: signature, account keys, decoded instruction args, slot This is designed for latency-sensitive use cases like copy trading, MEV detection, and real-time monitoring where you need to know a transaction exists as fast as possible. ## Connecting ``` Endpoint: your-node:9000 Protocol: gRPC bidirectional streaming Method: vrpc.Vrpc/SubscribeDecoded ``` ```javascript theme={null} // Example: subscribe to PumpFun buys const request = { subscriptions: { "pf-buys": { programs: ["PUMP_FUN"], instruction_types: ["buy"] } } }; ``` ## Supported Programs | Program | ID | Instructions | | ----------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------- | | PumpFun | `6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P` | create, buy, sell | | PumpSwap (AMM) | `pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA` | buy, sell, create\_pool, deposit, withdraw | | Raydium CPMM | `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` | swap\_base\_input, swap\_base\_output, create\_pool | | Raydium LaunchLab | `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj` | create, buy\_exact\_in, buy\_exact\_out, sell\_exact\_in, sell\_exact\_out, migrate | | Meteora DBC | `dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN` | swap, initialize, migrate | | Meteora DAMM v2 | `cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG` | swap, create\_pool, add\_liquidity, remove\_liquidity | ## Filtering Filters are set on the initial request and can be updated mid-stream by sending a new `SubscribeRequest`. Sending a new map replaces all previous filters atomically. | Filter | Type | Description | | ------------------- | --------------- | ---------------------------------------------------------- | | `programs` | repeated enum | Which DEX programs to include. Empty = all. | | `instruction_types` | repeated string | e.g. `["buy", "sell"]`. Empty = all for selected programs. | | `accounts_include` | repeated string | OR logic β€” tx must contain ANY of these accounts (base58). | | `accounts_exclude` | repeated string | Reject tx if ANY of these accounts appear. | | `accounts_required` | repeated string | AND logic β€” tx must contain ALL of these accounts. | ## Proto Definition ```protobuf theme={null} syntax = "proto3"; package vrpc; // ============================================================ // vRPC β€” Decoded Shredstream Service // ============================================================ service Vrpc { // Bidirectional streaming: client sends filter updates, server sends decoded transactions. // Client sends initial SubscribeRequest on connect, can update filters mid-stream. rpc SubscribeDecoded(stream SubscribeRequest) returns (stream SubscribeUpdate) {} } // ============================================================ // Enums // ============================================================ enum DexProgram { DEX_PROGRAM_UNSPECIFIED = 0; PUMP_FUN = 1; PUMP_AMM = 2; RAYDIUM_CPMM = 3; RAYDIUM_LAUNCH_LAB = 4; METEORA_DBC = 5; METEORA_DAMM_V2 = 6; JUPITER_PUMP_FUN = 7; JUPITER_PUMP_AMM = 8; JUPITER_RAYDIUM_CPMM = 9; JUPITER_RAYDIUM_LAUNCH_LAB = 10; JUPITER_METEORA_DBC = 11; JUPITER_METEORA_DAMM_V2 = 12; } // ============================================================ // Request // ============================================================ message SubscribeRequest { // Named subscription filters. Key = client-chosen filter ID (e.g. "pf-buys"). // Sending a new map replaces all previous filters atomically. // Empty map = no filtering (receive everything). map subscriptions = 1; // Optional ping for keepalive optional int32 ping_id = 2; } message ProgramFilter { // Which programs to include. Empty = all programs. repeated DexProgram programs = 1; // Optional: only include these instruction types (e.g. "buy", "sell", "swap"). // Empty = all instruction types for the selected programs. repeated string instruction_types = 2; // Optional: only include transactions where ANY of these accounts appear in account_keys. // Each entry is a base58-encoded pubkey. Empty = no include filter. repeated string accounts_include = 3; // Optional: exclude transactions where ANY of these accounts appear in account_keys. // Each entry is a base58-encoded pubkey. Empty = no exclude filter. repeated string accounts_exclude = 4; // Optional: only include transactions where ALL of these accounts appear in account_keys. // Each entry is a base58-encoded pubkey. Empty = no required filter. repeated string accounts_required = 5; } // ============================================================ // Response // ============================================================ message SubscribeUpdate { oneof update { DecodedTransaction transaction = 1; int32 pong = 2; SlotNotification slot = 3; JupiterUpdate jupiter = 4; } } message SlotNotification { uint64 slot = 1; } message JupiterUpdate { // Base transaction envelope for the Jupiter-routed transaction. // This reuses the existing client-visible transaction shape. DecodedTransaction envelope = 1; // Decoded top-level Jupiter instruction that produced this update. JupiterTopLevelInstruction top_level_instruction = 2; // Canonical client-facing wrapped DEX legs. repeated JupiterDexLeg dex_legs = 3; // Indices into dex_legs that matched the current subscription set. repeated uint32 matched_leg_indices = 4; } enum JupiterLegSource { JUPITER_LEG_SOURCE_UNSPECIFIED = 0; JUPITER_LEG_SOURCE_CURRENT_TRANSACTION = 1; JUPITER_LEG_SOURCE_INFERRED_ROUTE = 2; JUPITER_LEG_SOURCE_EXECUTED_INNER = 3; } message JupiterDexLeg { DexProgram wrapped_program = 1; DecodedInstruction instruction = 2; JupiterLegSource source = 3; uint32 top_level_instruction_index = 4; uint32 route_step_index = 5; string swap_variant = 6; string logical_instruction_name = 7; optional uint32 split_percent = 8; optional uint32 split_bps = 9; // Single-hop route-level input amount when it can be derived from the signed Jupiter route. // For exact-in routes this is the exact input; for exact-out routes this is the quoted input. optional uint64 route_input_amount = 10; // Single-hop route-level output amount when it can be derived from the signed Jupiter route. // For exact-in routes this is the quoted output; for exact-out routes this is the exact output. optional uint64 route_output_amount = 11; } message JupiterTopLevelInstruction { string instruction_name = 1; uint32 instruction_index = 2; bytes raw_data = 3; repeated uint32 account_indices = 4; repeated string resolved_accounts = 5; repeated JupiterNamedAccount named_accounts = 6; repeated string remaining_accounts = 7; map decoded_args = 8; optional JupiterRouteSummary route = 9; optional string decode_error = 10; } message JupiterNamedAccount { string name = 1; string pubkey = 2; bool writable = 3; bool signer = 4; bool optional = 5; optional string expected_address = 6; } message JupiterRouteSummary { string variant = 1; uint32 route_plan_step_count = 2; uint32 opaque_route_plan_bytes_len = 3; optional uint64 exact_in_amount = 4; optional uint64 exact_out_amount = 5; optional uint64 quoted_in_amount = 6; optional uint64 quoted_out_amount = 7; uint32 slippage_bps = 8; uint32 platform_fee_bps = 9; optional uint32 positive_slippage_bps = 10; optional uint32 shared_accounts_route_id = 11; bool uses_token_ledger = 12; repeated JupiterRouteStep route_steps = 13; } message JupiterRouteStep { string swap_variant = 1; optional string normalized_dex_label = 2; optional uint32 split_percent = 3; optional uint32 split_bps = 4; uint32 input_index = 5; uint32 output_index = 6; map swap_fields = 7; } message ServerTiming { // Server wall-clock timestamps in Unix epoch nanoseconds. uint64 first_read_unix_nanos = 1; uint64 capture_done_unix_nanos = 2; uint64 deshred_done_unix_nanos = 3; uint64 decode_done_unix_nanos = 4; uint64 publish_unix_nanos = 5; // Set per subscriber when the outbound task dequeues the message from the broadcast channel. uint64 subscriber_recv_unix_nanos = 6; } // ============================================================ // Decoded Transaction // ============================================================ message DecodedTransaction { // Slot this transaction appeared in uint64 slot = 1; // Transaction signature (first signature, 64 bytes) bytes signature = 2; // Transaction index within the entry batch uint32 tx_index = 3; // Fee payer / signer pubkey (32 bytes) bytes signer = 4; // All static account keys from the transaction (32 bytes each). // For v0 txns, LUT-resolved addresses are NOT included in v1. repeated bytes account_keys = 5; // Decoded instructions that matched target programs. // A single transaction can have multiple matches (e.g. multi-hop swap). repeated DecodedInstruction decoded_instructions = 6; // Whether this is a v0 transaction with address lookup tables. // When true, account_keys may be incomplete (LUT resolution deferred). bool uses_lookup_tables = 7; // Which subscription filter IDs matched this transaction repeated string matched_filters = 8; // Optional server-side timing metadata to help benchmark end-to-end latency. optional ServerTiming server_timing = 9; } // ============================================================ // Decoded Instruction // ============================================================ message DecodedInstruction { // Which program this instruction belongs to DexProgram program = 1; // Human-readable instruction name (e.g. "buy", "swap", "create_pool") string instruction_name = 2; // Index of this instruction in the transaction's instruction list uint32 instruction_index = 3; // Account indices into DecodedTransaction.account_keys repeated uint32 account_indices = 4; // Raw instruction data (discriminator + args) for forward-compat bytes raw_data = 5; // Decoded instruction variant oneof decoded { // === PumpFun === PumpFunCreate pump_fun_create = 10; PumpFunBuy pump_fun_buy = 11; PumpFunSell pump_fun_sell = 12; // === Pump AMM (PumpSwap) === PumpAmmBuy pump_amm_buy = 20; PumpAmmSell pump_amm_sell = 21; PumpAmmCreatePool pump_amm_create_pool = 22; PumpAmmDeposit pump_amm_deposit = 23; PumpAmmWithdraw pump_amm_withdraw = 24; // === Raydium CPMM === CpmmSwapBaseInput cpmm_swap_base_input = 30; CpmmSwapBaseOutput cpmm_swap_base_output = 31; CpmmCreatePool cpmm_create_pool = 32; // === Raydium LaunchLab === LaunchLabCreatePool launch_lab_create = 40; LaunchLabBuyExactIn launch_lab_buy_exact_in = 41; LaunchLabBuyExactOut launch_lab_buy_exact_out = 42; LaunchLabSellExactIn launch_lab_sell_exact_in = 43; LaunchLabSellExactOut launch_lab_sell_exact_out = 44; LaunchLabMigrate launch_lab_migrate = 45; // === Meteora DBC === DbcSwap dbc_swap = 50; DbcInitializeVirtualPool dbc_initialize = 51; DbcMigrateToDammV2 dbc_migrate = 52; // === Meteora DAMM v2 === DammV2Swap damm_v2_swap = 60; DammV2CreatePool damm_v2_create_pool = 61; DammV2AddLiquidity damm_v2_add_liquidity = 62; DammV2RemoveLiquidity damm_v2_remove_liquidity = 63; } } // ============================================================ // PumpFun Instructions // Program: 6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P // ============================================================ message PumpFunCreate { string name = 1; string symbol = 2; string uri = 3; } message PumpFunBuy { uint64 amount = 1; uint64 max_sol_cost = 2; } message PumpFunSell { uint64 amount = 1; uint64 min_sol_output = 2; } // ============================================================ // Pump AMM (PumpSwap) Instructions // Program: pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA // ============================================================ message PumpAmmBuy { uint64 base_amount_out = 1; uint64 max_quote_amount_in = 2; } message PumpAmmSell { uint64 base_amount_in = 1; uint64 min_quote_amount_out = 2; } message PumpAmmCreatePool { uint32 index = 1; uint64 base_amount = 2; uint64 quote_amount = 3; } message PumpAmmDeposit { uint64 lp_token_amount_out = 1; uint64 max_base_amount_in = 2; uint64 max_quote_amount_in = 3; } message PumpAmmWithdraw { uint64 lp_token_amount_in = 1; uint64 min_base_amount_out = 2; uint64 min_quote_amount_out = 3; } // ============================================================ // Raydium CPMM Instructions // Program: CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C // ============================================================ message CpmmSwapBaseInput { uint64 amount_in = 1; uint64 minimum_amount_out = 2; } message CpmmSwapBaseOutput { uint64 max_amount_in = 1; uint64 amount_out = 2; } message CpmmCreatePool { uint64 init_amount_0 = 1; uint64 init_amount_1 = 2; uint64 open_time = 3; } // ============================================================ // Raydium LaunchLab Instructions // Program: LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj // ============================================================ message LaunchLabCreatePool { string name = 1; string symbol = 2; string uri = 3; uint32 decimals = 4; uint64 total_supply = 5; } message LaunchLabBuyExactIn { uint64 amount_in = 1; uint64 minimum_amount_out = 2; uint64 share_fee_bps = 3; } message LaunchLabBuyExactOut { uint64 amount_out = 1; uint64 maximum_amount_in = 2; uint64 share_fee_bps = 3; } message LaunchLabSellExactIn { uint64 amount_in = 1; uint64 minimum_amount_out = 2; uint64 share_fee_bps = 3; } message LaunchLabSellExactOut { uint64 amount_out = 1; uint64 maximum_amount_in = 2; uint64 share_fee_bps = 3; } message LaunchLabMigrate { // Permissionless migration - no args } // ============================================================ // Meteora DBC Instructions // Program: dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN // ============================================================ message DbcSwap { uint64 amount_in = 1; uint64 minimum_amount_out = 2; } message DbcInitializeVirtualPool { // Complex config params - include key fields bytes pool_config = 1; } message DbcMigrateToDammV2 { // Permissionless migration } // ============================================================ // Meteora DAMM v2 Instructions // Program: cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG // ============================================================ message DammV2Swap { uint64 amount_in = 1; uint64 minimum_amount_out = 2; } message DammV2CreatePool { // Pool creation params bytes config = 1; } message DammV2AddLiquidity { uint64 max_token_a_amount = 1; uint64 max_token_b_amount = 2; uint64 min_lp_amount = 3; } message DammV2RemoveLiquidity { uint64 lp_amount = 1; uint64 min_token_a_amount = 2; uint64 min_token_b_amount = 3; } ``` # Support Source: https://docs.vali.wtf/resources/support # Support Open a ticket in our Discord and we'll get back to you quickly. β†’ [discord.com/invite/valilabs](https://discord.com/invite/valilabs)