use borsh::BorshSerialize;
use solana_program::instruction::AccountMeta;
use crate::cfg_client;
use crate::derive_lookup_table_address;
use crate::anchor_traits::*;
use crate::prelude::*;
use crate::SYSTEM_PROGRAM_ID;
use crate::{find_lut_signer, solana_program, Pubkey};
pub struct QueueResetLut {}
#[derive(Clone, BorshSerialize, Debug)]
pub struct QueueResetLutParams {
pub recent_slot: u64,
}
impl InstructionData for QueueResetLutParams {}
const DISCRIMINATOR: &'static [u8] = &[126, 234, 176, 75, 38, 211, 204, 53];
impl Discriminator for QueueResetLut {
const DISCRIMINATOR: &'static [u8] = DISCRIMINATOR;
}
impl Discriminator for QueueResetLutParams {
const DISCRIMINATOR: &'static [u8] = DISCRIMINATOR;
}
#[derive(Clone, Debug)]
pub struct QueueResetLutArgs {
pub queue: Pubkey,
pub authority: Pubkey,
pub payer: Pubkey,
pub recent_slot: u64,
}
pub struct QueueResetLutAccounts {
pub queue: Pubkey,
pub authority: Pubkey,
pub payer: Pubkey,
pub recent_slot: u64,
}
impl ToAccountMetas for QueueResetLutAccounts {
fn to_account_metas(&self, _: Option<bool>) -> Vec<AccountMeta> {
let program_state = State::get_pda();
let system_program = SYSTEM_PROGRAM_ID;
let address_lookup_table_program = crate::ADDRESS_LOOKUP_TABLE_PROGRAM_ID;
let lut_signer = find_lut_signer(&self.queue);
vec![
AccountMeta::new(self.queue, false),
AccountMeta::new_readonly(self.authority, true),
AccountMeta::new(self.payer, true),
AccountMeta::new_readonly(system_program.to_bytes().into(), false),
AccountMeta::new_readonly(program_state, false),
AccountMeta::new_readonly(lut_signer, false),
AccountMeta::new(
derive_lookup_table_address(&lut_signer, self.recent_slot).0,
false,
),
AccountMeta::new_readonly(address_lookup_table_program.to_bytes().into(), false),
]
}
}
cfg_client! {
use crate::solana_compat::solana_client::nonblocking::rpc_client::RpcClient;
use crate::solana_compat::AddressLookupTableAccount;
impl QueueResetLut {
pub async fn fetch_luts(client: &RpcClient, args: QueueResetLutArgs) -> Result<Vec<AddressLookupTableAccount>, OnDemandError> {
let queue_data = QueueAccountData::fetch_async(client, args.queue).await?;
let queue_lut = queue_data.fetch_lut(&args.queue, client).await?;
Ok(vec![queue_lut])
}
}
}