wp-solana-test-utils 0.1.1

Protocol-specific test fixtures for Raydium CLMM, Meteora DLMM, Orca Whirlpool
Documentation
//! Whirlpool test fixture setup.

use anyhow::Result;
use solana_sdk::{pubkey::Pubkey, signature::Signer};
use wp_solana_test_core::{
    fund_token, fund_wsol, load_accounts_json, load_program, override_mint_authority, TestContext,
};

use super::types;

pub struct WhirlpoolAccounts {
    pub program_id: Pubkey,
    pub pool_address: Pubkey,
    pub usdc_mint: Pubkey,
    pub wsol_mint: Pubkey,
    pub payer_usdc_ata: Pubkey,
    pub payer_wsol_ata: Pubkey,
    pub tick_spacing: u16,
}

pub struct WhirlpoolOfflineConfig<'a> {
    pub program_bytes: &'a [u8],
    pub account_fixtures_json: &'a [u8],
    pub pool_address: Pubkey,
    pub usdc_mint: Pubkey,
    pub wsol_mint: Pubkey,
    pub tick_spacing: u16,
}

impl<'a> WhirlpoolOfflineConfig<'a> {
    /// Create a config with well-known mainnet addresses pre-filled.
    ///
    /// - pool: `Czfq3xZZDmsdGdUyrNLtRhGc47cXcZtLG4crryfu44zE` (SOL/USDC)
    /// - USDC: `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`
    /// - WSOL: native mint
    /// - tick_spacing: 64
    pub fn with_default_addresses(
        program_bytes: &'a [u8],
        account_fixtures_json: &'a [u8],
    ) -> Self {
        use std::str::FromStr;
        Self {
            program_bytes,
            account_fixtures_json,
            pool_address: Pubkey::from_str("Czfq3xZZDmsdGdUyrNLtRhGc47cXcZtLG4crryfu44zE").unwrap(),
            usdc_mint: Pubkey::from_str("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v").unwrap(),
            wsol_mint: spl_token::native_mint::id(),
            tick_spacing: 64,
        }
    }
}

pub fn setup_whirlpool_offline(
    ctx: &TestContext,
    config: WhirlpoolOfflineConfig,
) -> Result<WhirlpoolAccounts> {
    let program_id = types::whirlpool_program_id();

    load_program(ctx, program_id, config.program_bytes)?;
    load_accounts_json(ctx, config.account_fixtures_json)?;

    override_mint_authority(ctx, config.usdc_mint, ctx.payer.pubkey())?;
    let payer_usdc_ata =
        fund_token(ctx, config.usdc_mint, ctx.payer.pubkey(), 1_000_000_000_000_000)?;
    let payer_wsol_ata = fund_wsol(ctx, ctx.payer.pubkey(), 10_000_000_000)?;

    Ok(WhirlpoolAccounts {
        program_id,
        pool_address: config.pool_address,
        usdc_mint: config.usdc_mint,
        wsol_mint: config.wsol_mint,
        payer_usdc_ata,
        payer_wsol_ata,
        tick_spacing: config.tick_spacing,
    })
}