defituna-staking 1.0.16

Rust client to interact with DefiTuna's Staking on-chain program.
Documentation
use crate::instructions::SwapRewardTwoHopFusion;
use crate::utils::fusion::get_swap_tick_arrays;
use fusionamm_client::{DecodedAccount, FusionPool, 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_two_hop_fusion_instruction(
    authority: &Pubkey,
    treasury: &Pubkey,
    input_token_mint: &Pubkey,
    intermediate_token_mint: &Pubkey,
    reward_token_mint: &Pubkey,
    input_token_program: &Pubkey,
    fusion_pool_one: &DecodedAccount<FusionPool>,
    fusion_pool_two: &DecodedAccount<FusionPool>,
) -> Instruction {
    let input_token_account = get_associated_token_address_with_program_id(&treasury, &input_token_mint, &input_token_program);
    let reward_token_account = get_associated_token_address_with_program_id(&treasury, &reward_token_mint, &spl_token::id());
    let ticks_array_one = get_swap_tick_arrays(fusion_pool_one.data.tick_current_index, fusion_pool_one.data.tick_spacing, &fusion_pool_one.address);
    let ticks_array_two = get_swap_tick_arrays(fusion_pool_two.data.tick_current_index, fusion_pool_two.data.tick_spacing, &fusion_pool_two.address);

    let ix_builder = SwapRewardTwoHopFusion {
        authority: *authority,
        treasury: *treasury,
        input_token_mint: *input_token_mint,
        intermediate_token_mint: *intermediate_token_mint,
        reward_token_mint: *reward_token_mint,
        input_token_program: *input_token_program,
        intermediate_token_program: spl_token::id(),
        reward_token_program: spl_token::id(),
        input_token_account,
        reward_token_account,
        fusionamm_program: FUSIONAMM_ID,
        fusion_pool_one: fusion_pool_one.address,
        fusion_pool_two: fusion_pool_two.address,
        memo_program: spl_memo::ID,
    };

    ix_builder.instruction_with_remaining_accounts(&[
        AccountMeta::new(fusion_pool_one.data.token_vault_a, false),
        AccountMeta::new(fusion_pool_one.data.token_vault_b, false),
        AccountMeta::new(ticks_array_one[0], false),
        AccountMeta::new(ticks_array_one[1], false),
        AccountMeta::new(ticks_array_one[2], false),
        AccountMeta::new(ticks_array_one[3], false),
        AccountMeta::new(ticks_array_one[4], false),
        AccountMeta::new(fusion_pool_two.data.token_vault_a, false),
        AccountMeta::new(fusion_pool_two.data.token_vault_b, false),
        AccountMeta::new(ticks_array_two[0], false),
        AccountMeta::new(ticks_array_two[1], false),
        AccountMeta::new(ticks_array_two[2], false),
        AccountMeta::new(ticks_array_two[3], false),
        AccountMeta::new(ticks_array_two[4], false),
    ])
}