wp-solana-test-utils 0.1.1

Protocol-specific test fixtures for Raydium CLMM, Meteora DLMM, Orca Whirlpool
Documentation
//! Meteora DLMM 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 MeteoraDlmmAccounts {
    pub program_id: Pubkey,
    pub lb_pair_address: Pubkey,
    pub token_x_mint: Pubkey,
    pub token_y_mint: Pubkey,
    pub payer_token_x_ata: Pubkey,
    pub payer_token_y_ata: Pubkey,
    pub bin_step: u16,
}

pub struct MeteoraDlmmOfflineConfig<'a> {
    pub program_bytes: &'a [u8],
    pub account_fixtures_json: &'a [u8],
    pub lb_pair_address: Pubkey,
    pub token_x_mint: Pubkey,
    pub token_y_mint: Pubkey,
    pub bin_step: u16,
}

impl<'a> MeteoraDlmmOfflineConfig<'a> {
    /// Create a config with well-known mainnet addresses pre-filled.
    ///
    /// - lb_pair: `5rCf1DM8LjKTw4YqhnoLcngyZYeNnQqztScTogYHAS6` (SOL/USDC)
    /// - token_x (WSOL): native mint
    /// - token_y (USDC): `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v`
    /// - bin_step: 10
    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,
            lb_pair_address: Pubkey::from_str("5rCf1DM8LjKTw4YqhnoLcngyZYeNnQqztScTogYHAS6")
                .unwrap(),
            token_x_mint: spl_token::native_mint::id(),
            token_y_mint: Pubkey::from_str("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v").unwrap(),
            bin_step: 10,
        }
    }
}

pub fn setup_meteora_dlmm_offline(
    ctx: &TestContext,
    config: MeteoraDlmmOfflineConfig,
) -> Result<MeteoraDlmmAccounts> {
    let program_id = types::meteora_dlmm_program_id();
    let wsol_mint = spl_token::native_mint::id();

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

    // Override mint authorities for non-native tokens
    for mint in &[config.token_x_mint, config.token_y_mint] {
        if *mint != wsol_mint {
            override_mint_authority(ctx, *mint, ctx.payer.pubkey())?;
        }
    }

    let token_amount: u64 = 1_000_000_000_000_000;
    let wsol_amount: u64 = 10_000_000_000; // 10 SOL (payer only has 1,000 SOL)

    let payer_token_x_ata = if config.token_x_mint == wsol_mint {
        fund_wsol(ctx, ctx.payer.pubkey(), wsol_amount)?
    } else {
        fund_token(ctx, config.token_x_mint, ctx.payer.pubkey(), token_amount)?
    };

    let payer_token_y_ata = if config.token_y_mint == wsol_mint {
        fund_wsol(ctx, ctx.payer.pubkey(), wsol_amount)?
    } else {
        fund_token(ctx, config.token_y_mint, ctx.payer.pubkey(), token_amount)?
    };

    Ok(MeteoraDlmmAccounts {
        program_id,
        lb_pair_address: config.lb_pair_address,
        token_x_mint: config.token_x_mint,
        token_y_mint: config.token_y_mint,
        payer_token_x_ata,
        payer_token_y_ata,
        bin_step: config.bin_step,
    })
}