A unified client interface for interacting with top Solana transaction relayers, enabling low-latency, high-performance transaction submission across:
- Easy API client setup using
OnceCell
- Automatic region-based endpoint selection
- Health check and ping latency diagnostics
- Built-in support for
.env
API key loading - Unified interface for sending Solana transactions
- Cargo CLI
cargo add solana-relayer-adapter-rust
- Cargo TOML
# Cargo.toml
[dependencies]
...
solana_relayer_adapter_rust = "3.1.0" # update to lastest version
...
// src/config.rs
use dotenvy::dotenv;
use solana_relayer_adapter_rust::{Astralane, BlockRazor, Jito, NextBlock, Nozomi, ZeroSlot};
use std::env;
use tokio::sync::OnceCell;
pub static NOZOMI_CLIENT: OnceCell<Nozomi> = OnceCell::const_new();
pub static ZSLOT_CLIENT: OnceCell<ZeroSlot> = OnceCell::const_new();
pub static JITO_CLIENT: OnceCell<Jito> = OnceCell::const_new();
pub static BRAZOR_CLIENT: OnceCell<BlockRazor> = OnceCell::const_new();
pub static ASTRA_CLIENT: OnceCell<Astralane> = OnceCell::const_new();
pub static NEXTBLOCK_CLIENT: OnceCell<NextBlock> = OnceCell::const_new();
// src/config.rs or other directory
pub async fn init_nozomi() {
dotenv().ok();
let nozomi_api_key = env::var("NOZOMI_API_KEY").expect("NOZOMI_API_KEY not set in .env");
let nozomi = Nozomi::new_auto(nozomi_api_key).await;
nozomi.health_check(50);
NOZOMI_CLIENT.set(nozomi).unwrap();
}
pub async fn init_jito() {
let jito = Jito::new_auto(None).await;
JITO_CLIENT.set(jito).unwrap();
}
pub async fn init_nextblock() {
dotenv().ok();
let nextblock_api_key = env::var("NEXTBLOCK_API_KEY").expect("NEXTBLOCK_API_KEY not set in .env");
let nextblock = NextBlock::new_auto(nextblock_api_key).await;
NEXTBLOCK_CLIENT.set(nextblock).unwrap();
}
// Repeat for other providers...
// src/main.rs or entry_point
#[tokio::main]
async fn main() -> Result<(), std::io::Error> {
init_nextblock().await;
init_astra().await;
init_nozomi().await;
init_jito().await;
...
Ok(())
}
let client = JITO_CLIENT.get().ok_or("Jito not init").unwrap();
let client = NOZOMI_CLIENT.get().ok_or("Nozomi not init").unwrap();
...
let cu: u64;
let priority_fee_micro_lamport: u64;
let PRIVATE_KEY: Keypair;
let raw_ixs: Vec<Instruction>;
let tip_addr_idx : u8;
let third_party_fee: f64
let ixs = client.add_tip_ix(Tips {
cu: Some(cu),
priority_fee_micro_lamport: Some(priority_fee_micro_lamport),
payer: PRIVATE_KEY.pubkey(),
pure_ix: raw_ixs,
tip_addr_idx: tip_addr_idx,
tip_sol_amount: third_party_fee,
});
let result = client
.send_transaction(&encoded)
.await
.map(|v| v.to_string())
.map_err(|e| e.to_string())
Nextblock-Fra (64.130.50.52) 0.280 ms
Nextblock-Fra (64.130.50.52) 0.160 ms
Connecting with Nextblock-Fra ...
Nextblock-Fra (64.130.50.52) 0.183 ms
Astra-San Francisco (45.32.86.58) 146.506 ms
Astra-Amsterdam (64.130.43.43) 5.894 ms
Astra-Frankfurt (162.19.222.232) 8.101 ms
Astra-NY (173.231.40.226) 84.369 ms
Astra-Tokyo (173.231.40.226) 84.414 ms
Connecting with Astra-Amsterdam ...
Astra-Amsterdam (64.130.43.43) 5.917 ms
BlockRazor-NewYork (185.209.179.15) 82.583 ms
BlockRazor-Frankfurt (64.130.32.137) 0.135 ms
BlockRazor-AMS (64.130.43.53) 5.914 ms
BlockRazor-Tokyo (52.198.190.162) 257.519 ms
Connecting with BlockRazor-Frankfurt ...
BlockRazor-Frankfurt (64.130.32.137) 0.117 ms
Nozomi-PittDirect (204.16.247.116) 90.990 ms
Nozomi-TyoDirect (202.8.9.153) 258.808 ms
Nozomi-SgDirect (202.8.11.174) 160.986 ms
Nozomi-EwrDirect (64.239.117.13) 79.852 ms
Nozomi-AmsDirect (64.130.55.186) 5.804 ms
Nozomi-FraDirect (64.239.35.13) 0.104 ms
Nozomi-AmsSecure (64.130.55.186) 5.806 ms
Nozomi-TyoSecure (202.8.9.153) 258.736 ms
Nozomi-SgSecure (202.8.11.174) 160.976 ms
Nozomi-EwrSecure (64.239.117.13) 79.854 ms
Nozomi-PittSecure (204.16.247.116) 90.992 ms
Nozomi-FraSecure (64.239.35.13) 0.138 ms
Connecting with Nozomi-FraDirect ...
Nozomi-FraDirect (64.239.35.13) 0.066 ms
Jito-Mainnet (64.130.50.46) 0.111 ms
Jito-Amsterdam (64.130.52.157) 5.842 ms
Jito-Frankfurt (64.130.57.104) 0.100 ms
Nozomi-FraDirect Health Check Successful
Jito-London (88.211.250.124) 16.183 ms
Jito-NY (64.130.59.205) 79.847 ms
Jito-SLC (64.130.53.56) 128.648 ms
Jito-SG (202.8.11.169) 151.699 ms
Jito-Tokyo (64.130.49.118) 258.914 ms
Connecting with Jito-Frankfurt ...
Jito-Frankfurt (64.130.57.104) 0.162 ms
ZeroSlot-NewYork (172.66.40.254) 0.765 ms
ZeroSlot-Frankfurt (172.66.43.2) 0.839 ms
ZeroSlot-AMS (172.66.43.2) 0.857 ms
ZeroSlot-LA (172.66.40.254) 0.816 ms
ZeroSlot-Tokyo (172.66.40.254) 0.739 ms
Connecting with ZeroSlot-Tokyo ...
ZeroSlot-Tokyo (172.66.40.254) 0.771 ms
Provider | Best Region | Latency (ms) |
---|---|---|
Nozomi | Frankfurt | 0.066 |
Jito | Frankfurt | 0.100 |
BlockRazor | Frankfurt | 0.117 |
NextBlock | Frankfurt | 0.160 |
ZeroSlot | Tokyo | 0.739 |
Astralane | Frankfurt | 8.101 |
π The system will auto-select the optimal endpoint based on RTT.
NOZOMI_API_KEY=your_nozomi_key
ZERO_SLOT_KEY=your_zeroslot_key
BLOCKRAZOR_API_KEY=your_brazor_key
ASTRALANE_API_KEY=your_astralane_key
NEXTBLOCK_API_KEY=your_nextblock_key
Provider | Endpoint Management | Docs |
---|---|---|
Jito | Auto-region select | π |
Nozomi | Direct vs Secure | π |
ZeroSlot | Ultra-low RTT | π |
BloxRoute | Trader API support | π |
NextBlock | High-speed nodes | π |
Blockrazor | Rust-native adapter | π |
Astralane | Secure latency config | π |
let nozomi = NOZOMI_CLIENT.get().unwrap();
nozomi.health_check(50);
PRs are welcome! Please open issues for feature requests or bug reports.
MIT Β© @vvizardev