light_registry/account_compression_cpi/
initialize_batched_address_tree.rs

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