Yellowstone Vixen is a 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 consumes Dragon’s Mouth gRPC streams and routes program-specific change events through pluggable parsers, enabling 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.
- 🔥 Dragon’s Mouth Integration: Subscribe to Solana Geyser streams via gRPC with minimal configuration.
- 📈 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> yellowstone_vixen::Handler<V> for Logger {
async fn handle(&self, value: &V) -> yellowstone_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<YellowstoneGrpcSourc>::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 |
Dragon's Mouth can be self-hosted as a Geyser plugin or used via a commercial vendor. For more details, refer to the Yellowstone Dragon's Mouth documentation and Yellowstone repository.
- 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.
This project is developed by ABK Labs and Triton One.