ðĶ SDK Versions
This SDK is available in multiple languages:
| Language | Repository | Description |
|---|---|---|
| Rust | sol-parser-sdk | Ultra-low latency with SIMD optimization |
| Node.js | sol-parser-sdk-nodejs | TypeScript/JavaScript for Node.js |
| Python | sol-parser-sdk-python | Async/await native support |
| Go | sol-parser-sdk-golang | Concurrent-safe with goroutine support |
What This SDK Is For
sol-parser-sdk is the low-level Rust parser core for Solana DEX events. It is designed for trading bots, copy-trading pipelines, sniper bots, indexers, and stream processors that need fast, typed parsing from Yellowstone gRPC transactions, Jito ShredStream entries, RPC transaction payloads, or account subscriptions.
| Area | Coverage |
|---|---|
| Parser inputs | Yellowstone gRPC, ShredStream, RPC transactions, encoded transactions, protocol account data |
| DEX protocols | PumpFun, PumpSwap, Pump Fees, Raydium LaunchLab, Raydium CPMM, Raydium CLMM, Raydium AMM V4, Meteora DAMM v2, Meteora DLMM, Meteora DBC, Orca Whirlpool |
| Parser backends | Default Borsh parser for maintainability, optional zero-copy parser for latency-sensitive hot paths |
| Related SDK | Use solana-streamer when you want a higher-level streaming facade over this parser core |
ð Performance Highlights
⥠Ultra-Low Latency
- 10-20Ξs parsing latency in release mode
- Zero-copy parsing with stack-allocated buffers
- SIMD-accelerated pattern matching (memchr)
- Lock-free ArrayQueue for event delivery
ðïļ Flexible Order Modes
| Mode | Latency | Description |
|---|---|---|
| Unordered | 10-20Ξs | Immediate output, ultra-low latency |
| MicroBatch | 50-200Ξs | Micro-batch ordering with time window |
| StreamingOrdered | 0.1-5ms | Stream ordering with continuous sequence release |
| Ordered | 1-50ms | Full slot ordering, wait for complete slot |
ð Optimization Highlights
- â Zero heap allocation for hot paths
- â SIMD pattern matching for all protocol detection
- â Static pre-compiled finders for string search
- â Inline functions with aggressive optimization
- â Event type filtering for targeted parsing
- â Conditional Create detection (only when needed)
- â Multiple order modes for latency vs ordering trade-off
ðĨ Quick Start
Installation
Clone the repository:
Add to your Cargo.toml:
[]
# Default: Borsh parser
= { = "../sol-parser-sdk" }
# Or: Zero-copy parser (maximum performance)
= { = "../sol-parser-sdk", = false, = ["parse-zero-copy"] }
Use crates.io
# Add to your Cargo.toml
= "0.6.1"
Or with the zero-copy parser (maximum performance):
= { = "0.6.1", = false, = ["parse-zero-copy"] }
Release Notes
v0.6.1
- Decodes the complete current PumpSwap Buy/Sell event tail across log and CPI/inner-instruction paths: cashback, buyback fees, signed virtual quote reserves, boost eligibility, and base supply.
- Uses one validated PumpSwap trade decoder for the default and zero-copy feature configurations while preserving historical event layouts.
- Rejects truncated tails, malformed UTF-8, invalid Borsh booleans, and overflowing string bounds instead of emitting partially decoded events.
- Keeps older serialized PumpSwap events compatible by defaulting fields introduced by the buyback and boost upgrades.
v0.5.15
- Fixes Pump.fun
create_v2quote mint parsing for both 16-account and 19-account layouts. - Uses the appended quote mint only when the 19-account quote-pool tail is present; 16-account
create_v2keeps the SOL sentinel. - Selects the matching create/create_v2 instruction when filling accounts so later buy/sell instructions cannot overwrite create quote fields.
v0.5.13
- Preserves real Pump.fun WSOL quote mints (
So11111111111111111111111111111111111111112) in gRPC and ShredStream create/trade outputs. - Keeps the Solscan SOL sentinel (
So11111111111111111111111111111111111111111) only for legacy or missing Pump.fun quote mint fields. - Adds merge coverage so a placeholder SOL quote mint can be replaced by a later real WSOL quote mint from logs or instruction/account context.
v0.5.11
- Parses PumpSwap
create_poolinstruction args, includingindex, deposit amounts,coin_creator,is_mayhem_mode, andis_cashback_coin. - Fixes PumpSwap
create_poolinstruction account mapping to match the IDL (pool,creator,base_mint,quote_mint, LP/user token accounts). - Preserves
is_cashback_coinwhen instruction-derived CreatePool data is merged with log-derived CreatePool data. - Clarifies source semantics: the PumpSwap log
CreatePoolEventIDL does not carryis_cashback_coin; ShredStream/outer-instruction parsing can read it from instruction data, and account subscriptions can read the authoritativePoolaccount field.
v0.5.10
- Aligns PumpSwap
CreatePoolEventwith the on-chain IDL: the event exposesis_mayhem_modebut notis_cashback_coin. - Keeps PumpSwap
is_cashback_coinon theAccountPumpSwapPoolaccount event, where the on-chainPoolaccount stores it. - Fixes the PumpSwap CreatePool log payload length check to include the final
is_mayhem_modebyte. - Documents that ShredStream CreatePool events cannot recover
is_cashback_coinbecause Shred entries do not include account bodies.
v0.5.9
- Implements real Yellowstone gRPC
stop()behavior by signaling, aborting, and awaiting the active subscription task. - Serializes gRPC subscription lifecycle transitions so concurrent stop/re-subscribe calls cannot orphan retry loops.
- Uses a per-subscription stop signal so a new subscription cannot accidentally reset the stop state for an older task.
- Labels stream failures as
Grpc Stream errorto distinguish them from ShredStream logs. - Makes the warmup test independent from global test execution order.
v0.5.8
- Adds configurable ShredStream event filter examples, including Pump.fun trade, create-trade, buy, sell, and buy-exact-sol-in presets.
- Clarifies Pump.fun IDL instruction names in
ix_name:buy,buy_v2,buy_exact_sol_in,buy_exact_quote_in_v2,sell, andsell_v2. - Keeps Pump.fun filter families aligned with IDL semantics:
PumpFunBuycovers all buy instructions,PumpFunSellcovers all sell instructions, andPumpFunTradecovers all buy and sell instructions. - Ensures subscribing only to
PumpFunTradeemits unifiedDexEvent::PumpFunTradeevents on the ShredStream hot path.
v0.5.5
- Aligns ShredStream static-account parsing across Rust, Node.js, Python, and Go.
- Keeps V0 ALT-loaded instruction accounts on the hot path with default pubkey placeholders instead of dropping the whole instruction.
- Adds discriminator fallback when a ShredStream outer program id is ALT-loaded and not present in the static account table.
- Improves Pump.fun ShredStream parity for create/create_v2, v2 short-account trades, and event-type filtering.
- Refreshes multi-protocol routing and account-fill documentation for Pump.fun, PumpSwap, Pump Fees, Raydium, Orca, and Meteora paths.
v0.5.4
- Emits Pump.fun
createandcreate_v2as one canonicalPumpFunCreateevent. - Treats
PumpFunCreateandPumpFunCreateV2filters as the same create-family subscription. - Keeps create_v2 account fields on the canonical create event so bots do not need to handle two event variants.
- Prevents duplicate new-mint callbacks from gRPC log + instruction parsing.
v0.5.3
- Preserves real Pump.fun v2
ix_namevalues, includingbuy_v2,sell_v2, andbuy_exact_quote_in_v2. - Improves ShredStream Pump.fun v2 parsing with best-effort short-account handling for buy, sell, and exact-quote instructions.
- Treats Pump.fun buy-family filters symmetrically, so
PumpFunBuyandPumpFunBuyExactSolInsubscriptions both match the compatible buy variants. - Keeps ShredStream ALT/default-account best-effort parsing for outer instructions while preserving the CPI/inner-only limitation.
Performance Testing
Test parsing latency with the optimized examples:
# PumpFun with detailed metrics (per-event + 10s stats)
# PumpSwap with detailed metrics (per-event + 10s stats)
# PumpSwap ultra-low latency test
# PumpSwap with MicroBatch ordering
# Expected output:
# gRPC receive time: 1234567890 Ξs
# Event receive time: 1234567900 Ξs
# Latency: 10 Ξs <-- Ultra-low latency!
Examples
| Description | Run Command | Source Code |
|---|---|---|
| PumpFun | ||
| PumpFun event parsing with metrics | cargo run --example pumpfun_with_metrics --release |
examples/pumpfun_with_metrics.rs |
| PumpFun trade type filtering | cargo run --example pumpfun_trade_filter --release |
examples/pumpfun_trade_filter.rs |
| PumpFun trade with ordered mode | cargo run --example pumpfun_trade_filter_ordered --release |
examples/pumpfun_trade_filter_ordered.rs |
| Quick PumpFun connection test | cargo run --example pumpfun_quick_test --release |
examples/pumpfun_quick_test.rs |
| Parse PumpFun tx by signature | TX_SIGNATURE=<sig> cargo run --example parse_pump_tx --release |
examples/parse_pump_tx.rs |
| Parse PumpFun quote-mint cases | TX_SIGNATURES=<sig1,sig2> cargo run --example parse_pumpfun_quote_cases --release |
examples/parse_pumpfun_quote_cases.rs |
| Debug PumpFun transaction | cargo run --example debug_pump_tx --release |
examples/debug_pump_tx.rs |
| PumpSwap | ||
| PumpSwap events with metrics | cargo run --example pumpswap_with_metrics --release |
examples/pumpswap_with_metrics.rs |
| PumpSwap ultra-low latency | cargo run --example pumpswap_low_latency --release |
examples/pumpswap_low_latency.rs |
| PumpSwap with MicroBatch ordering | cargo run --example pumpswap_ordered --release |
examples/pumpswap_ordered.rs |
| Parse PumpSwap tx by signature | TX_SIGNATURE=<sig> cargo run --example parse_pumpswap_tx --release |
examples/parse_pumpswap_tx.rs |
| Debug PumpSwap transaction | cargo run --example debug_pumpswap_tx --release |
examples/debug_pumpswap_tx.rs |
| Meteora DAMM | ||
| Meteora DAMM V2 events | cargo run --example meteora_damm_grpc --release |
examples/meteora_damm_grpc.rs |
| Parse Meteora DAMM tx by signature | TX_SIGNATURE=<sig> cargo run --example parse_meteora_damm_tx --release |
examples/parse_meteora_damm_tx.rs |
| Non-Pump DEX dry-run scenarios | ||
| Raydium LaunchLab migration filter | cargo run --example raydium_launchlab_migration |
examples/raydium_launchlab_migration.rs |
| Raydium CPMM new pool filter | cargo run --example raydium_cpmm_new_pool |
examples/raydium_cpmm_new_pool.rs |
| Raydium CLMM token price math | cargo run --example raydium_clmm_token_price |
examples/raydium_clmm_token_price.rs |
| Orca Whirlpool token price math | cargo run --example orca_whirlpool_token_price |
examples/orca_whirlpool_token_price.rs |
| Meteora DAMM new pool baseline | cargo run --example meteora_damm_new_pool |
examples/meteora_damm_new_pool.rs |
| Meteora DBC token price math | cargo run --example meteora_dbc_token_price |
examples/meteora_dbc_token_price.rs |
| Wallet trade filter | cargo run --example wallet_trade_filter |
examples/wallet_trade_filter.rs |
| gRPC latency slot compare config | cargo run --example grpc_latency_slot_compare |
examples/grpc_latency_slot_compare.rs |
| Account subscription | ||
| Token account balance updates | TOKEN_ACCOUNT=<pubkey> cargo run --example token_balance_listen --release |
examples/token_balance_listen.rs |
| Nonce account state changes | NONCE_ACCOUNT=<pubkey> cargo run --example nonce_listen --release |
examples/nonce_listen.rs |
| Mint account info | MINT_ACCOUNT=<pubkey> cargo run --example token_decimals_listen --release |
examples/token_decimals_listen.rs |
| PumpSwap pool accounts via memcmp | cargo run --example pumpswap_pool_account_listen --release |
examples/pumpswap_pool_account_listen.rs |
| All ATAs for mints | cargo run --example mint_all_ata_account_listen --release |
examples/mint_all_ata_account_listen.rs |
| ShredStream | ||
| Jito ShredStream subscription | cargo run --example shredstream_example --release |
examples/shredstream_example.rs |
| Utility | ||
| Dynamic subscription filters | cargo run --example dynamic_subscription --release |
examples/dynamic_subscription.rs |
| Debug PumpSwap account filling | cargo run --example test_account_filling --release |
examples/test_account_filling.rs |
Basic Usage
use ;
async
ShredStream Usage (Jito)
ShredStream provides ultra-low latency (~50-100ms faster than gRPC) by directly subscribing to Jito's ShredStream service:
use ;
use ;
use DexEvent;
use Arc;
async
ShredStream Limitations:
- Only
static_account_keys()- ALT-loaded instruction accounts use default placeholders, while outer instructions are parsed best-effort from data/discriminators - No Inner Instructions - CPI/inner-only events cannot be recovered from ShredStream entries
- No block_time - always 0
- tx_index is entry-level, not slot-level
ðïļ Supported Protocols
DEX Protocols
- â PumpFun - Meme coin trading (ultra-fast zero-copy path, incl. v2 instructions)
- â Pump Fees - Pump fee-sharing configuration events
- â PumpSwap - PumpFun swap protocol
- â Raydium LaunchLab - Token launch platform
- â Raydium AMM V4 - Automated Market Maker
- â Raydium CLMM - Concentrated Liquidity
- â Raydium CPMM - Concentrated Pool
- â Orca Whirlpool - Concentrated liquidity AMM
- â Meteora Pools - Dynamic AMM
- â Meteora DAMM v2 - Dynamic AMM V2
- â Meteora DLMM - Dynamic Liquidity Market Maker
- ð§ Meteora DBC - Program id and filters added; transaction/account parser pass pending
Event Types
Each protocol supports:
- ð Trade/Swap Events - Buy/sell transactions
- ð§ Liquidity Events - Deposits/withdrawals
- ð Pool Events - Pool creation/initialization
- ðŊ Position Events - Open/close positions (CLMM)
Non-Pump DEX Support Matrix
| Protocol | Events | Accounts | Examples | Language constants |
|---|---|---|---|---|
| Raydium LaunchLab | Trade, pool create, migrate | Pending | Migration, buy/sell oracle planned | Rust, Node, Python, Go |
| Raydium CPMM | Swap, deposit, withdraw, initialize | AmmConfig, PoolState | New pool, token price | Rust, Node, Python, Go |
| Raydium CLMM | Swap, pool, position, liquidity | AmmConfig, PoolState, TickArray | Token price | Rust, Node, Python, Go |
| Raydium AMM V4 | Swap, deposit, withdraw, initialize2 | Pending | Token price oracle planned | Rust, Node, Python, Go |
| Orca Whirlpool | Swap, liquidity, pool init | Whirlpool, Position, TickArray, FeeTier, Config | Token price | Rust, Node, Python, Go |
| Meteora Pools | Swap, liquidity, pool create, fees | Pending | Token price oracle planned | Rust, Node, Python, Go |
| Meteora DAMM V2 | Swap, liquidity, position | Pending | New pool, token price oracle planned | Rust, Node, Python, Go |
| Meteora DLMM | Swap, liquidity, bin/position | Pending | Token price oracle planned | Rust, Node, Python, Go |
| Meteora DBC | Swap, initialize pool, curve complete (Rust log parser) | Pending | Token price, migration oracle planned | Rust, Node, Python, Go |
The canonical cross-language baseline is tracked in
protocols/canonical.json. The current audit and
remaining parser work are documented in
docs/non-pump-dex-gap-analysis.md.
⥠Performance Features
Zero-Copy Parsing
// Stack-allocated 512-byte buffer for PumpFun Trade
const MAX_DECODE_SIZE: usize = 512;
let mut decode_buf: = ;
// Decode directly to stack, no heap allocation
STANDARD
.decode_slice
.ok?;
SIMD Pattern Matching
// Pre-compiled SIMD finders (initialized once)
static PUMPFUN_FINDER: =
new;
// 3-10x faster than .contains()
if PUMPFUN_FINDER.find.is_some
Event Type Filtering
// Ultra-fast path for single event type
if include_only.len == 1 && include_only == PumpFunTrade
Lock-Free Queue
// ArrayQueue with 100,000 capacity
let queue = new;
// Non-blocking push/pop (no mutex overhead)
let _ = queue.push;
if let Some = queue.pop
ðŊ Event Filtering
Reduce processing overhead by filtering specific events:
Example: Trading Bot
let event_filter = include_only;
Example: Pool Monitor
let event_filter = include_only;
PumpSwapCreatePool includes is_mayhem_mode. For is_cashback_coin,
ShredStream/outer-instruction parsing reads the flag from the create_pool
instruction args, while log-only CreatePoolEvent payloads keep the default
false because the log event IDL does not carry this field. The authoritative
account value is also available from
PumpSwapPoolAccountEvent.pool.is_cashback_coin.
Performance Impact:
- 60-80% reduction in processing
- Lower memory usage
- Reduced network bandwidth
ð§ Advanced Features
Create+Buy Detection
Automatically detects when a token is created and immediately bought in the same transaction:
// Detects "Program data: GB7IKAUcB3c..." pattern
let has_create = detect_pumpfun_create;
// Sets is_created_buy flag on Trade events
if has_create
Pump.fun Bonding Curve v2 (buy_v2 / sell_v2 / buy_exact_quote_in_v2)
The SDK recognizes Pump.fun's new v2 trading instructions introduced in the Bonding Curve upgrade. Event logs from buy_v2, sell_v2, and buy_exact_quote_in_v2 are parsed with the same zero-copy path and mapped to the existing event types:
| ix_name in TradeEvent | DexEvent Variant |
|---|---|
"buy" / "buy_v2" / "buy_exact_quote_in" / "buy_exact_quote_in_v2" |
DexEvent::PumpFunBuy |
"sell" / "sell_v2" |
DexEvent::PumpFunSell |
"buy_exact_sol_in" |
DexEvent::PumpFunBuyExactSolIn |
No changes are required in your event handling code â v2 events arrive through the same PumpFunTradeEvent struct with the correct ix_name field populated. Instruction discriminators for buy_v2 ([184, 23, 238, 97, 103, 197, 211, 61]), sell_v2 ([93, 246, 130, 60, 231, 233, 64, 178]), and buy_exact_quote_in_v2 ([194, 171, 28, 70, 104, 77, 91, 47]) are recognized at the instruction parser level.
CreateEvent also exposes quote_mint and virtual_quote_reserves, so USDC quote pools can be distinguished from native SOL pools and initialized with the correct quote-side reserve.
Dynamic Subscription
Update filters without reconnecting:
grpc.update_subscription.await?;
Order Modes
Choose the right balance between latency and ordering:
use ;
// Ultra-low latency (no ordering guarantee)
let config = ClientConfig ;
// Low latency with micro-batch ordering (50-200Ξs)
let config = ClientConfig ;
// Stream ordering with continuous sequence release (0.1-5ms)
let config = ClientConfig ;
// Full slot ordering (1-50ms, wait for complete slot)
let config = ClientConfig ;
Performance Metrics
let config = ClientConfig ;
let grpc = new_with_config?;
ð Project Structure
src/
âââ core/
â âââ events.rs # Event definitions
âââ grpc/
â âââ client.rs # Yellowstone gRPC client
â âââ buffers.rs # SlotBuffer & MicroBatchBuffer
â âââ types.rs # OrderMode, ClientConfig, filters
âââ shredstream/
â âââ client.rs # Jito ShredStream client
â âââ config.rs # ShredStreamConfig
â âââ proto/ # Protobuf definitions
âââ logs/
â âââ optimized_matcher.rs # SIMD log detection
â âââ zero_copy_parser.rs # Zero-copy parsing
â âââ pumpfun.rs # PumpFun parser
â âââ raydium_*.rs # Raydium parsers
â âââ orca_*.rs # Orca parsers
â âââ meteora_*.rs # Meteora parsers
âââ instr/
â âââ *.rs # Instruction parsers
âââ warmup/
â âââ mod.rs # Parser warmup (auto-called)
âââ lib.rs
ð Optimization Techniques
1. SIMD String Matching
- Replaced all
.contains()withmemmem::Finder - 3-10x performance improvement
- Pre-compiled static finders
2. Zero-Copy Parsing
- Stack-allocated buffers (512 bytes)
- No heap allocation in hot path
- Inline helper functions
3. Event Type Filtering
- Early filtering at protocol level
- Conditional Create detection
- Single-type ultra-fast path
4. Lock-Free Queue
- ArrayQueue (100K capacity)
- Spin-wait hybrid strategy
- No mutex overhead
5. Aggressive Inlining
ð Benchmarks
Parsing Latency (Release Mode)
| Protocol | Avg Latency | Min | Max |
|---|---|---|---|
| PumpFun Trade (zero-copy) | 10-15Ξs | 8Ξs | 20Ξs |
| Raydium AMM V4 Swap | 15-20Ξs | 12Ξs | 25Ξs |
| Orca Whirlpool Swap | 15-20Ξs | 12Ξs | 25Ξs |
SIMD Pattern Matching
| Operation | Before (contains) | After (SIMD) | Speedup |
|---|---|---|---|
| Protocol detection | 50-100ns | 10-20ns | 3-10x |
| Create event detection | 150ns | 30ns | 5x |
ð License
MIT License
ð Contact
- Repository: https://github.com/0xfnzero/sol-parser-sdk
- Telegram: https://t.me/fnzero_group
- Discord: https://discord.gg/vuazbGkqQE
â ïļ Performance Tips
- Use Event Filtering - Filter at the source for 60-80% performance gain
- Run in Release Mode -
cargo build --releasefor full optimization - Test with sudo -
sudo cargo run --example basic --releasefor accurate timing - Monitor Latency - Check
grpc_recv_usand queue latency in production - Tune Queue Size - Adjust ArrayQueue capacity based on your throughput
- Spin-Wait Strategy - Tune spin count (default: 1000) for your use case
ðŽ Development
# Run tests
# Build release binary
# Generate docs