swap interface for solana
Blue House
Blue House is a Solana program that provides a unified interface for performing swaps across multiple decentralized exchanges (DEXes). Instead of implementing each market individually in your own program or trading bot, you can simply call Blue House — either directly in a transaction or through a CPI (cross-program invocation).
Program ID
The program is deployed at:b1225DYKeTyLGd4SrNZFPcgzCC76Q9qniud7XgwB7C4
Features
🔄 Unified Swaps — One interface for 15+ Solana DEXs and protocols
⚡ Low Overhead — Minimal abstractions to preserve performance
🛠 Extensible — Easily add support for more markets in the future
Base Accounts
console wallet 0 tokenamint 1 tokenaata 2 token_program 3 sys_program 4 ata_program 5 tokenbmint 6 tokenbprogram 7 tokenbata 8 Test
#[test] fn swap() { // --- 1. Connect to Solana RPC --- // Using mainnet-beta endpoint to fetch real accounts/state let rpc_client = RpcClient::new("https://api.mainnet-beta.solana.com ");
// --- 2. Spin up a local LiteSVM instance --- // This acts as a lightweight local Solana VM where we can hydrate accounts // and simulate transactions against them. let mut litesvm = build_svm().unwrap(); // --- 3. Fetch wallet + base token accounts --- let baseaccounts = fetchbaseaccounts(&litesvm, &rpcclient);
// --- 4. Define market-specific accounts (Meteora DAMM v2) --- let pooladdress = Pubkey::fromstr_const("2mZ2VBiG8uPX6kza6WBHxcW5KcwmDvcjyXJctKVsmjSq"); let poolauth = Pubkey::fromstr_const("HLnpSz9h2S4hiLQ43rnSD9XkcUThA7B8hQMKmDaiTLcC"); let eventauth = Pubkey::fromstr_const("3rmHSu74h1ZcmAisVcWerTCiRDQbUrBKmcwptYGjHfet");
// --- 5. Fetch pool account data from RPC --- let pool = rpc_client .getaccount(&Pubkey::fromstrconst(&pooladdress.to_string())) .unwrap(); let data = pool.data;
// Extract vault accounts (base & quote) let basevault = Pubkey::newfromarray(data[232..264].tryinto().unwrap()); let quotevault = Pubkey::newfromarray(data[264..296].tryinto().unwrap());
// --- 6. Fetch and hydrate market accounts --- let marketaccounts = fetchmarket_accounts( vec![pooladdress, poolauth, eventauth, basevault, quote_vault], &rpc_client, );
// Hydrate LiteSVM with accounts hydratesvm(&mut litesvm, baseaccounts); hydratesvm(&mut litesvm, marketaccounts);
// --- 7. Prepare transaction account metas --- let mut accounts = getbaseaccounts(&rpc_client); accounts.extend([ AccountMeta::newreadonly(DAMMV2_ID, false), AccountMeta::newreadonly(eventauth, false), AccountMeta::newreadonly(poolauth, false), AccountMeta::new(pool_address, false), AccountMeta::new(base_vault, false), AccountMeta::new(quote_vault, false), ]);
// --- 8. Encode instruction data --- // SwapData { amountin: 10000000, amountout: 0, atob: false } let mut data = Vec::with_capacity(17); data.extendfromslice(&10000000u64.tolebytes()); // amount_in data.extendfromslice(&0u64.tolebytes()); // amount_out data.push(0u8); // atob = false
// --- 9. Execute transaction in LiteSVM --- execute_transaction(&mut litesvm, accounts, data); }
Dex Accounts details here