use crate::accounts::FusionPool;
use crate::instructions::SwapRewardFusion;
use crate::utils::fusion::get_swap_tick_arrays;
use fusionamm_client::{get_fusion_pool_address, FUSIONAMM_ID};
use solana_instruction::{AccountMeta, Instruction};
use solana_pubkey::Pubkey;
use spl_associated_token_account::get_associated_token_address_with_program_id;
pub fn swap_reward_fusion_instruction(
authority: &Pubkey,
treasury: &Pubkey,
reward_token_mint: &Pubkey,
input_token_mint: &Pubkey,
input_token_program: &Pubkey,
fusion_pool: &FusionPool,
) -> Instruction {
let fusion_pool_address = get_fusion_pool_address(&fusion_pool.token_mint_a, &fusion_pool.token_mint_b, fusion_pool.tick_spacing)
.unwrap()
.0;
let input_token_account = get_associated_token_address_with_program_id(&authority, &input_token_mint, &input_token_program);
let reward_token_account = get_associated_token_address_with_program_id(&authority, &reward_token_mint, &spl_token::id());
let swap_ticks_arrays = get_swap_tick_arrays(fusion_pool.tick_current_index, fusion_pool.tick_spacing, &fusion_pool_address);
let ix_builder = SwapRewardFusion {
authority: *authority,
treasury: *treasury,
input_token_mint: *input_token_mint,
input_token_account,
input_token_program: *input_token_program,
reward_token_mint: *reward_token_mint,
reward_token_account,
reward_token_program: spl_token::id(),
fusionamm_program: FUSIONAMM_ID,
fusion_pool: fusion_pool_address,
memo_program: spl_memo::ID,
};
ix_builder.instruction_with_remaining_accounts(&[
AccountMeta::new(fusion_pool.token_vault_a, false),
AccountMeta::new(fusion_pool.token_vault_b, false),
AccountMeta::new(swap_ticks_arrays[0], false),
AccountMeta::new(swap_ticks_arrays[1], false),
AccountMeta::new(swap_ticks_arrays[2], false),
AccountMeta::new(swap_ticks_arrays[3], false),
AccountMeta::new(swap_ticks_arrays[4], false),
])
}