light_token/compressed_token/v2/update_compressed_mint/
account_metas.rs

1use solana_instruction::AccountMeta;
2use solana_pubkey::Pubkey;
3
4use crate::utils::TokenDefaultAccounts;
5
6/// Configuration for generating account metas for update compressed mint instruction
7#[derive(Debug, Clone)]
8pub struct UpdateMintMetaConfig {
9    pub fee_payer: Option<Pubkey>,
10    pub authority: Option<Pubkey>,
11    pub in_merkle_tree: Pubkey,
12    pub in_output_queue: Pubkey,
13    pub out_output_queue: Pubkey,
14    pub with_cpi_context: bool,
15}
16
17/// Generates account metas for the update compressed mint instruction
18pub fn get_update_compressed_mint_instruction_account_metas(
19    config: UpdateMintMetaConfig,
20) -> Vec<AccountMeta> {
21    let default_pubkeys = TokenDefaultAccounts::default();
22
23    let mut metas = Vec::new();
24
25    // First two accounts are static non-CPI accounts as expected by CPI_ACCOUNTS_OFFSET = 2
26    // light_system_program (always required)
27    metas.push(AccountMeta::new_readonly(
28        default_pubkeys.light_system_program,
29        false,
30    ));
31
32    // authority (signer, always required)
33    if let Some(authority) = config.authority {
34        metas.push(AccountMeta::new_readonly(authority, true));
35    }
36
37    if config.with_cpi_context {
38        // CPI context accounts - similar to other CPI instructions
39        // TODO: Add CPI context specific accounts when needed
40    } else {
41        // LightSystemAccounts (6 accounts)
42        // fee_payer (signer, mutable)
43        if let Some(fee_payer) = config.fee_payer {
44            metas.push(AccountMeta::new(fee_payer, true));
45        }
46
47        // cpi_authority_pda
48        metas.push(AccountMeta::new_readonly(
49            default_pubkeys.cpi_authority_pda,
50            false,
51        ));
52
53        // registered_program_pda
54        metas.push(AccountMeta::new_readonly(
55            default_pubkeys.registered_program_pda,
56            false,
57        ));
58
59        // account_compression_authority
60        metas.push(AccountMeta::new_readonly(
61            default_pubkeys.account_compression_authority,
62            false,
63        ));
64
65        // account_compression_program
66        metas.push(AccountMeta::new_readonly(
67            default_pubkeys.account_compression_program,
68            false,
69        ));
70
71        // system_program
72        metas.push(AccountMeta::new_readonly(
73            default_pubkeys.system_program,
74            false,
75        ));
76
77        // UpdateOneCompressedAccountTreeAccounts (3 accounts)
78        // in_merkle_tree (mutable)
79        metas.push(AccountMeta::new(config.in_merkle_tree, false));
80
81        // in_output_queue (mutable)
82        metas.push(AccountMeta::new(config.in_output_queue, false));
83
84        // out_output_queue (mutable)
85        metas.push(AccountMeta::new(config.out_output_queue, false));
86    }
87
88    metas
89}