use solana_instruction::AccountMeta;
use solana_pubkey::Pubkey;
use crate::utils::TokenDefaultAccounts;
#[derive(Debug, Copy, Clone)]
pub struct BatchCompressMetaConfig {
pub fee_payer: Option<Pubkey>,
pub authority: Option<Pubkey>,
pub spl_interface_pda: Pubkey,
pub sender_token_account: Pubkey,
pub token_program: Pubkey,
pub merkle_tree: Pubkey,
pub sol_pool_pda: Option<Pubkey>,
}
impl BatchCompressMetaConfig {
pub fn new(
fee_payer: Pubkey,
authority: Pubkey,
spl_interface_pda: Pubkey,
sender_token_account: Pubkey,
token_program: Pubkey,
merkle_tree: Pubkey,
with_lamports: bool,
) -> Self {
let sol_pool_pda = if with_lamports {
unimplemented!("TODO hardcode sol pool pda")
} else {
None
};
Self {
fee_payer: Some(fee_payer),
authority: Some(authority),
spl_interface_pda,
sender_token_account,
token_program,
merkle_tree,
sol_pool_pda,
}
}
pub fn new_client(
spl_interface_pda: Pubkey,
sender_token_account: Pubkey,
token_program: Pubkey,
merkle_tree: Pubkey,
with_lamports: bool,
) -> Self {
let sol_pool_pda = if with_lamports {
unimplemented!("TODO hardcode sol pool pda")
} else {
None
};
Self {
fee_payer: None,
authority: None,
spl_interface_pda,
sender_token_account,
token_program,
merkle_tree,
sol_pool_pda,
}
}
}
pub fn get_batch_compress_instruction_account_metas(
config: BatchCompressMetaConfig,
) -> Vec<AccountMeta> {
let default_pubkeys = TokenDefaultAccounts::default();
let base_capacity = 11;
let fee_payer_capacity = if config.fee_payer.is_some() { 4 } 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,
));
if config.fee_payer.is_some() {
metas.push(AccountMeta::new_readonly(
default_pubkeys.compressed_token_program,
false,
));
}
metas.push(AccountMeta::new(config.spl_interface_pda, false));
metas.push(AccountMeta::new_readonly(config.token_program, 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(config.merkle_tree, false));
metas.push(AccountMeta::new_readonly(
default_pubkeys.self_program,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.system_program,
false,
));
if let Some(sol_pool_pda) = config.sol_pool_pda {
metas.push(AccountMeta::new(sol_pool_pda, false));
} else if config.fee_payer.is_some() {
metas.push(AccountMeta::new_readonly(
default_pubkeys.compressed_token_program,
false,
));
}
metas.push(AccountMeta::new(config.sender_token_account, false));
metas
}