Yellowstone Vixen is a comprehensive framework for building program-aware, real-time Solana data pipelines. It provides the core components—runtime, parser definitions, and handler interfaces—needed to transform raw on-chain events into structured, actionable data. Vixen supports the registration of custom data sources, allowing developers to integrate various data streams seamlessly.
Solana change events, following the Yellowstone gRPC specification, are received from the source and routed through pluggable parsers. This enables developers to log, store, or stream enriched data for indexing, analytics, and downstream consumption.
Yellowstone Vixen solves core challenges for Solana dApp developers:
- Cost Efficiency: Share Dragon's Mouth subscriptions and filter only the data you care about.
- Operational Simplicity: Lightweight setup, minimal external dependencies.
- Observability: Built-in Prometheus metrics for lag, throughput, and error tracking.
- Composability: Independent, reusable parser crates that can deserialize complex cross-program interactions (CPI).
- 🛠 Parser + Handler Architecture: Build pipelines that transform raw Solana events into structured models and trigger custom logic.
- 🔥 Flexible Source Integration: Register custom data sources or use existing ones like Dragon's Mouth for Solana Geyser streams.
- 📈 Metrics Support: Prometheus /metrics endpoint available out-of-the-box.
- 🧪 Offline Testing with Fixtures: Test parsers without connecting to live Solana nodes using devnet fixtures.
- 🔄 gRPC Streaming API: Serve parsed program events directly to external systems or clients.
A minimal example using Token Program parsers and a Logger handler:
use std::path::PathBuf;
use clap::Parser;
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
use yellowstone_vixen::Pipeline;
use yellowstone_vixen_parser::token_program::{AccountParser, InstructionParser};
use yellowstone_vixen_yellowstone_grpc_source::YellowstoneGrpcSource;
#[derive(clap::Parser)]
#[command(version, author, about)]
pub struct Opts {
#[arg(long, short)]
config: PathBuf,
}
#[derive(Debug)]
pub struct Logger;
impl<V: std::fmt::Debug + Sync, R: Sync> vixen::Handler<V, R> for Logger {
async fn handle(&self, _value: &V, _raw: &R) -> vixen::HandlerResult<()> {
tracing::info!(?value);
Ok(())
}
}
fn main() {
tracing_subscriber::registry()
.with(tracing_subscriber::EnvFilter::from_default_env())
.with(tracing_subscriber::fmt::layer())
.init();
let Opts { config } = Opts::parse();
let config = std::fs::read_to_string(config).expect("Error reading config file");
let config = toml::from_str(&config).expect("Error parsing config");
yellowstone_vixen::Runtime<YellowstoneGrpcSource>::builder()
.account(Pipeline::new(AccountParser, [Logger]))
.instruction(Pipeline::new(InstructionParser, [Logger]))
.build(config)
.run();
}RUST_LOG=info cargo run -- --config "./Vixen.toml"Prometheus metrics are served on the /metrics endpoint. To collect metrics, we have setup a prometheus server as a docker container. You can access the metrics at http://localhost:9090 after running the prometheus server using docker-compose.
To run prometheus, you need to have docker and docker-compose installed on your machine. To start the services, run the following command:
sudo docker-compose up| Address | Public Name | Parser |
|---|---|---|
boop8hVGQGqehUK2iVEMEnMrL5RbjywRzHKBmBE7ry4 |
Boop.fun | yellowstone-vixen-boop-parser |
JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 |
Jupiter Aggregator v6 | yellowstone-vixen-jupiter-swap-parser |
LiMoM9rMhrdYrfzUCxQppvxCSG1FcrUK9G8uLq4A1GF |
Kamino Limit Order | yellowstone-vixen-kamino-limit-orders-parser |
cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG |
Meteora DAMM v2 | yellowstone-vixen-meteora-amm-parser |
dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN |
Meteora Dynamic Bonding Curve | yellowstone-vixen-meteora-dbc-parser |
LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo |
Meteora DLMM | yellowstone-vixen-meteora-parser |
Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB |
Meteora Pools | yellowstone-vixen-meteora-pools-parser |
24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi |
Meteora Vault | yellowstone-vixen-meteora-vault-parser |
MoonCVVNZFSYkqNXP6bxHLPL6QQJiMagDL3qcqUQTrG |
Moonshot | yellowstone-vixen-moonshot-parser |
whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc |
Whirlpools | yellowstone-vixen-orca-whirlpool-parser |
pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA |
Pump.fun AMM | yellowstone-vixen-pump-swaps-parser |
6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P |
Pump.fun | yellowstone-vixen-pumpfun-parser |
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8 |
Raydium Liquidity Pool V4 | yellowstone-vixen-raydium-amm-v4-parser |
CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK |
Raydium Concentrated Liquidity | yellowstone-vixen-raydium-clmm-parser |
CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C |
Raydium CPMM | yellowstone-vixen-raydium-cpmm-parser |
LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj |
Raydium Launchpad | yellowstone-vixen-raydium-launchpad-parser |
5U3EU2ubXtK84QcRjWVmYt9RaDyA8gKxdUrPFXmZyaki |
Virtuals | yellowstone-vixen-virtuals-parser |
Yellowstone Vixen supports several official data sources for ingesting Solana account and transaction data. Each source is provided as a Rust crate and can be configured in your Vixen pipeline. Below is a summary of the available sources:
| Source Crate | Description |
|---|---|
yellowstone-grpc-source |
Dragon's Mouth (gRPC Source): Scalable and reliable streaming of account and transaction data from Solana nodes via the Dragon's Mouth Geyser plugin. Can be self-hosted or accessed via commercial vendors. See the Dragon's Mouth documentation and Yellowstone repository for more details. |
yellowstone-fumarole-source |
Fumarole Reliable Streams: Scalable, reliable, and persistent streaming of Solana accounts and transactions. Fumarole merges data from multiple nodes for high availability, supports consumer groups for horizontal scalability, and allows clients to resume streams after interruptions. Currently in limited beta—contact Triton support for access. Learn more or see the GitHub repo. |
solana-rpc-source |
Solana RPC Source: Pulls account data directly from a Solana node's JSON-RPC API using getProgramAccounts. |
solana-snapshot-source |
Solana Snapshot Source: Loads and processes Solana ledger snapshots for offline or historical analysis. |
Refer to the crate documentation for setup instructions and configuration options.
- Mock Testing for Parsers: Load and replay devnet accounts or transactions offline.
- Usage Examples: A variety of example projects that demonstrate how to use the features.
- Example Vixen Configuration: Starter TOML file for pipeline configuration.
- Generate Parsers from IDL: Use Codama to automatically generate Vixen parsers from Anchor or custom IDL files.
This project is developed by ABK Labs and Triton One.