defituna-staking 1.0.9

Rust client to interact with DefiTuna's Staking on-chain program.
Documentation
use crate::accounts::Whirlpool;
use crate::instructions::SwapRewardOrca;
use crate::utils::orca::get_swap_tick_arrays;
use orca_whirlpools_client::{get_oracle_address, get_whirlpool_address, WHIRLPOOL_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_orca_instruction(
    authority: &Pubkey,
    treasury: &Pubkey,
    reward_token_mint: &Pubkey,
    input_token_mint: &Pubkey,
    input_token_program: &Pubkey,
    whirlpool: &Whirlpool,
) -> Instruction {
    let whirlpool_address =
        get_whirlpool_address(&whirlpool.whirlpools_config, &whirlpool.token_mint_a, &whirlpool.token_mint_b, whirlpool.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 oracle_address = get_oracle_address(&whirlpool_address).unwrap().0;
    let swap_ticks_arrays = get_swap_tick_arrays(whirlpool.tick_current_index, whirlpool.tick_spacing, &whirlpool_address);

    let ix_builder = SwapRewardOrca {
        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(),
        whirlpool_program: WHIRLPOOL_ID,
        whirlpool: whirlpool_address,
        memo_program: spl_memo::ID,
    };

    ix_builder.instruction_with_remaining_accounts(&[
        AccountMeta::new(whirlpool.token_vault_a, false),
        AccountMeta::new(whirlpool.token_vault_b, false),
        AccountMeta::new(oracle_address, 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),
    ])
}