light_registry/account_compression_cpi/
initialize_batched_state_tree.rs

1use account_compression::{program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED};
2use anchor_lang::prelude::*;
3use light_system_program::program::LightSystemProgram;
4
5use crate::protocol_config::state::ProtocolConfigPda;
6
7#[derive(Accounts)]
8pub struct InitializeBatchedStateMerkleTreeAndQueue<'info> {
9    #[account(mut)]
10    pub authority: Signer<'info>,
11    /// CHECK:  initialized in account compression program.
12    #[account(mut)]
13    pub merkle_tree: AccountInfo<'info>,
14    /// CHECK: initialized in account compression program.
15    #[account(mut)]
16    pub queue: AccountInfo<'info>,
17    /// CHECK: (account compression program) access control.
18    pub registered_program_pda: AccountInfo<'info>,
19    /// CHECK: (seed constraints) used to invoke account compression program via cpi.
20    #[account(mut, seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
21    pub cpi_authority: AccountInfo<'info>,
22    pub account_compression_program: Program<'info, AccountCompression>,
23    pub protocol_config_pda: Account<'info, ProtocolConfigPda>,
24    /// CHECK: (system program) new cpi context account.
25    #[account(mut)]
26    pub cpi_context_account: AccountInfo<'info>,
27    pub light_system_program: Program<'info, LightSystemProgram>,
28}
29
30pub fn process_initialize_batched_state_merkle_tree(
31    ctx: &Context<InitializeBatchedStateMerkleTreeAndQueue>,
32    bump: u8,
33    params: Vec<u8>,
34) -> Result<()> {
35    let bump = &[bump];
36    let seeds = [CPI_AUTHORITY_PDA_SEED, bump];
37    let signer_seeds = &[&seeds[..]];
38    let accounts = account_compression::cpi::accounts::InitializeBatchedStateMerkleTreeAndQueue {
39        authority: ctx.accounts.cpi_authority.to_account_info(),
40        merkle_tree: ctx.accounts.merkle_tree.to_account_info(),
41        queue: ctx.accounts.queue.to_account_info(),
42        registered_program_pda: Some(ctx.accounts.registered_program_pda.clone()),
43    };
44
45    let cpi_ctx = CpiContext::new_with_signer(
46        ctx.accounts.account_compression_program.to_account_info(),
47        accounts,
48        signer_seeds,
49    );
50
51    account_compression::cpi::initialize_batched_state_merkle_tree(cpi_ctx, params)
52}