use carbon_core::{account_utils::next_account, deserialize::ArrangeAccounts};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
pub struct LpHarvest {}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LpHarvestInstructionAccounts {
pub lp_authority: solana_pubkey::Pubkey,
pub lp_escrow: solana_pubkey::Pubkey,
pub whirlpool: solana_pubkey::Pubkey,
pub position: solana_pubkey::Pubkey,
pub position_token_account: solana_pubkey::Pubkey,
pub lower_tick_array: solana_pubkey::Pubkey,
pub upper_tick_array: solana_pubkey::Pubkey,
pub token_a_mint: solana_pubkey::Pubkey,
pub token_b_mint: solana_pubkey::Pubkey,
pub token_a_ata: solana_pubkey::Pubkey,
pub token_b_ata: solana_pubkey::Pubkey,
pub token_a_vault: solana_pubkey::Pubkey,
pub token_b_vault: solana_pubkey::Pubkey,
pub reward1_mint: solana_pubkey::Pubkey,
pub reward2_mint: solana_pubkey::Pubkey,
pub reward3_mint: solana_pubkey::Pubkey,
pub reward1_ata: solana_pubkey::Pubkey,
pub reward2_ata: solana_pubkey::Pubkey,
pub reward3_ata: solana_pubkey::Pubkey,
pub reward1_vault: solana_pubkey::Pubkey,
pub reward2_vault: solana_pubkey::Pubkey,
pub reward3_vault: solana_pubkey::Pubkey,
pub system_program: solana_pubkey::Pubkey,
pub token_a_program: solana_pubkey::Pubkey,
pub token_b_program: solana_pubkey::Pubkey,
pub reward1_token_program: solana_pubkey::Pubkey,
pub reward2_token_program: solana_pubkey::Pubkey,
pub reward3_token_program: solana_pubkey::Pubkey,
pub ata_program: solana_pubkey::Pubkey,
pub memo_program: solana_pubkey::Pubkey,
pub whirlpool_program: solana_pubkey::Pubkey,
pub remaining: Vec<solana_instruction::AccountMeta>,
}
impl LpHarvest {
pub fn decode(data: &[u8]) -> Option<Self> {
if data.is_empty() {
return None;
}
let discriminator = &data[0..1];
if discriminator != [56] {
return None;
}
let mut data_slice = data;
data_slice = &data_slice[1..];
borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
}
}
impl ArrangeAccounts for LpHarvest {
type ArrangedAccounts = LpHarvestInstructionAccounts;
fn arrange_accounts(
accounts: &[solana_instruction::AccountMeta],
) -> Option<Self::ArrangedAccounts> {
let mut iter = accounts.iter();
let lp_authority = next_account(&mut iter)?;
let lp_escrow = next_account(&mut iter)?;
let whirlpool = next_account(&mut iter)?;
let position = next_account(&mut iter)?;
let position_token_account = next_account(&mut iter)?;
let lower_tick_array = next_account(&mut iter)?;
let upper_tick_array = next_account(&mut iter)?;
let token_a_mint = next_account(&mut iter)?;
let token_b_mint = next_account(&mut iter)?;
let token_a_ata = next_account(&mut iter)?;
let token_b_ata = next_account(&mut iter)?;
let token_a_vault = next_account(&mut iter)?;
let token_b_vault = next_account(&mut iter)?;
let reward1_mint = next_account(&mut iter)?;
let reward2_mint = next_account(&mut iter)?;
let reward3_mint = next_account(&mut iter)?;
let reward1_ata = next_account(&mut iter)?;
let reward2_ata = next_account(&mut iter)?;
let reward3_ata = next_account(&mut iter)?;
let reward1_vault = next_account(&mut iter)?;
let reward2_vault = next_account(&mut iter)?;
let reward3_vault = next_account(&mut iter)?;
let system_program = next_account(&mut iter)?;
let token_a_program = next_account(&mut iter)?;
let token_b_program = next_account(&mut iter)?;
let reward1_token_program = next_account(&mut iter)?;
let reward2_token_program = next_account(&mut iter)?;
let reward3_token_program = next_account(&mut iter)?;
let ata_program = next_account(&mut iter)?;
let memo_program = next_account(&mut iter)?;
let whirlpool_program = next_account(&mut iter)?;
let remaining = iter.as_slice();
Some(LpHarvestInstructionAccounts {
lp_authority,
lp_escrow,
whirlpool,
position,
position_token_account,
lower_tick_array,
upper_tick_array,
token_a_mint,
token_b_mint,
token_a_ata,
token_b_ata,
token_a_vault,
token_b_vault,
reward1_mint,
reward2_mint,
reward3_mint,
reward1_ata,
reward2_ata,
reward3_ata,
reward1_vault,
reward2_vault,
reward3_vault,
system_program,
token_a_program,
token_b_program,
reward1_token_program,
reward2_token_program,
reward3_token_program,
ata_program,
memo_program,
whirlpool_program,
remaining: remaining.to_vec(),
})
}
}