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> {
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)?;
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;
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,
})
}