use solana_instruction::AccountMeta;
use solana_pubkey::Pubkey;
use crate::utils::TokenDefaultAccounts;
#[derive(Debug, Copy, Clone)]
pub struct CreateMintMetaConfig {
pub fee_payer: Option<Pubkey>,
pub mint_signer: Option<Pubkey>,
pub address_tree_pubkey: Pubkey,
pub output_queue: Pubkey,
}
impl CreateMintMetaConfig {
pub fn new(
fee_payer: Pubkey,
mint_signer: Pubkey,
address_tree_pubkey: Pubkey,
output_queue: Pubkey,
) -> Self {
Self {
fee_payer: Some(fee_payer),
mint_signer: Some(mint_signer),
address_tree_pubkey,
output_queue,
}
}
pub fn new_client(
mint_seed: Pubkey,
address_tree_pubkey: Pubkey,
output_queue: Pubkey,
) -> Self {
Self {
fee_payer: None,
mint_signer: Some(mint_seed),
address_tree_pubkey,
output_queue,
}
}
}
pub fn get_create_compressed_mint_instruction_account_metas(
config: CreateMintMetaConfig,
) -> Vec<AccountMeta> {
let default_pubkeys = TokenDefaultAccounts::default();
let base_capacity = 9;
let fee_payer_capacity = if config.fee_payer.is_some() { 1 } else { 0 };
let total_capacity = base_capacity + fee_payer_capacity;
let mut metas = Vec::with_capacity(total_capacity);
if let Some(mint_signer) = config.mint_signer {
metas.push(AccountMeta::new_readonly(mint_signer, true));
}
metas.push(AccountMeta::new_readonly(
default_pubkeys.light_system_program,
false,
));
if let Some(fee_payer) = config.fee_payer {
metas.push(AccountMeta::new(fee_payer, true));
}
metas.push(AccountMeta::new_readonly(
default_pubkeys.cpi_authority_pda,
false,
));
metas.push(AccountMeta::new_readonly(
default_pubkeys.registered_program_pda,
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.system_program,
false,
));
metas.push(AccountMeta::new(config.address_tree_pubkey, false));
metas.push(AccountMeta::new(config.output_queue, false));
metas
}
#[derive(Debug, Copy, Clone)]
pub struct CreateMintMetaConfigCpiWrite {
pub fee_payer: Pubkey,
pub mint_signer: Pubkey,
pub cpi_context: Pubkey,
}
pub fn get_create_compressed_mint_instruction_account_metas_cpi_write(
config: CreateMintMetaConfigCpiWrite,
) -> [AccountMeta; 5] {
let default_pubkeys = TokenDefaultAccounts::default();
[
AccountMeta::new_readonly(config.mint_signer, true),
AccountMeta::new_readonly(default_pubkeys.light_system_program, false),
AccountMeta::new(config.fee_payer, true),
AccountMeta::new_readonly(default_pubkeys.cpi_authority_pda, false),
AccountMeta::new(config.cpi_context, false),
]
}