use solana_instruction::AccountMeta;
use solana_pubkey::Pubkey;
use crate::utils::TokenDefaultAccounts;
#[derive(Debug, Copy, Clone)]
pub struct ApproveMetaConfig {
pub fee_payer: Option<Pubkey>,
pub authority: Option<Pubkey>,
pub delegated_compressed_account_merkle_tree: Pubkey,
pub change_compressed_account_merkle_tree: Pubkey,
}
impl ApproveMetaConfig {
pub fn new(
fee_payer: Pubkey,
authority: Pubkey,
delegated_compressed_account_merkle_tree: Pubkey,
change_compressed_account_merkle_tree: Pubkey,
) -> Self {
Self {
fee_payer: Some(fee_payer),
authority: Some(authority),
delegated_compressed_account_merkle_tree,
change_compressed_account_merkle_tree,
}
}
pub fn new_client(
delegated_compressed_account_merkle_tree: Pubkey,
change_compressed_account_merkle_tree: Pubkey,
) -> Self {
Self {
fee_payer: None,
authority: None,
delegated_compressed_account_merkle_tree,
change_compressed_account_merkle_tree,
}
}
}
pub fn get_approve_instruction_account_metas(config: ApproveMetaConfig) -> Vec<AccountMeta> {
let default_pubkeys = TokenDefaultAccounts::default();
let base_capacity = 10;
let fee_payer_capacity = if config.fee_payer.is_some() { 2 } else { 0 };
let total_capacity = base_capacity + fee_payer_capacity;
let mut metas = Vec::with_capacity(total_capacity);
if let Some(fee_payer) = config.fee_payer {
let authority = config.authority.expect("Missing authority");
metas.extend_from_slice(&[
AccountMeta::new(fee_payer, true),
AccountMeta::new_readonly(authority, true),
]);
}
metas.push(AccountMeta::new_readonly(
default_pubkeys.cpi_authority_pda,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.light_system_program,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.registered_program_pda,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.noop_program,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.account_compression_authority,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.account_compression_program,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.self_program,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.system_program,
false,
));
metas.push(AccountMeta::new(
config.delegated_compressed_account_merkle_tree,
false,
));
metas.push(AccountMeta::new(
config.change_compressed_account_merkle_tree,
false,
));
metas
}