use solana_program::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
use crate::drift::{EndSwapV2Params, StartSwapV2Params};
pub struct SwapV2Instructions {
pub start: Instruction,
pub end: Instruction,
}
pub struct SwapV2Params {
pub owner: Pubkey,
pub caller: Pubkey,
pub payer: Pubkey,
pub mint_substitute: Pubkey,
pub mint_from: Pubkey,
pub mint_to: Pubkey,
pub token_program_substitute: Pubkey,
pub token_program_from: Pubkey,
pub token_program_to: Pubkey,
pub price_update_from: Pubkey,
pub price_update_to: Pubkey,
pub asset_id_substitute: pyra_tokens::AssetId,
pub amount_base_units_substitute: u64,
pub asset_id_from: pyra_tokens::AssetId,
pub amount_base_units_from: u64,
pub asset_id_to: pyra_tokens::AssetId,
pub reduce_only: bool,
pub is_liquidation_attempt: bool,
pub remaining_accounts: Vec<AccountMeta>,
}
pub fn build_swap_v2(params: &SwapV2Params) -> Option<SwapV2Instructions> {
let start = crate::drift::start_swap_v2(&StartSwapV2Params {
owner: params.owner,
caller: params.caller,
payer: params.payer,
mint_substitute: params.mint_substitute,
mint_from: params.mint_from,
mint_to: params.mint_to,
token_program_substitute: params.token_program_substitute,
token_program_from: params.token_program_from,
token_program_to: params.token_program_to,
asset_id_substitute: params.asset_id_substitute,
amount_base_units_substitute: params.amount_base_units_substitute,
asset_id_from: params.asset_id_from,
amount_base_units_from: params.amount_base_units_from,
asset_id_to: params.asset_id_to,
reduce_only: params.reduce_only,
remaining_accounts: params.remaining_accounts.clone(),
})?;
let end = crate::drift::end_swap_v2(&EndSwapV2Params {
owner: params.owner,
caller: params.caller,
payer: params.payer,
mint_from: params.mint_from,
mint_to: params.mint_to,
mint_substitute: params.mint_substitute,
token_program_to: params.token_program_to,
token_program_substitute: params.token_program_substitute,
price_update_from: params.price_update_from,
price_update_to: params.price_update_to,
asset_id_substitute: params.asset_id_substitute,
asset_id_from: params.asset_id_from,
asset_id_to: params.asset_id_to,
is_liquidation_attempt: params.is_liquidation_attempt,
remaining_accounts: params.remaining_accounts.clone(),
})?;
Some(SwapV2Instructions { start, end })
}
pub fn assemble_swap_v2(
swap: SwapV2Instructions,
external_ixs: Vec<Instruction>,
) -> Vec<Instruction> {
let mut ixs = Vec::new();
ixs.push(swap.start);
ixs.extend(external_ixs);
ixs.push(swap.end);
ixs
}