light_registry/account_compression_cpi/
update_address_tree.rs

1use account_compression::{
2    program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED, AddressMerkleTreeAccount,
3};
4use anchor_lang::prelude::*;
5
6use crate::epoch::register_epoch::ForesterEpochPda;
7
8#[derive(Accounts)]
9pub struct UpdateAddressMerkleTree<'info> {
10    /// CHECK: only eligible foresters can nullify leaves. Is checked in ix.
11    #[account(mut)]
12    pub registered_forester_pda: Option<Account<'info, ForesterEpochPda>>,
13    /// CHECK:
14    pub authority: Signer<'info>,
15    /// CHECK: (seed constraints) used to invoke account compression program via cpi.
16    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
17    pub cpi_authority: AccountInfo<'info>,
18    /// CHECK: (account compression program) group access control.
19    pub registered_program_pda: AccountInfo<'info>,
20    pub account_compression_program: Program<'info, AccountCompression>,
21    /// CHECK: (account compression program).
22    #[account(mut)]
23    pub queue: AccountInfo<'info>,
24    /// CHECK: (account compression program).
25    #[account(mut)]
26    pub merkle_tree: AccountLoader<'info, AddressMerkleTreeAccount>,
27    /// CHECK: when emitting event.
28    pub log_wrapper: UncheckedAccount<'info>,
29}
30
31pub fn process_update_address_merkle_tree(
32    ctx: &Context<UpdateAddressMerkleTree>,
33    bump: u8,
34    changelog_index: u16,
35    indexed_changelog_index: u16,
36    value: u16,
37    low_address_index: u64,
38    low_address_value: [u8; 32],
39    low_address_next_index: u64,
40    low_address_next_value: [u8; 32],
41    low_address_proof: [[u8; 32]; 16],
42) -> Result<()> {
43    let bump = &[bump];
44    let seeds = [CPI_AUTHORITY_PDA_SEED, bump];
45    let signer_seeds = &[&seeds[..]];
46
47    let accounts = account_compression::cpi::accounts::UpdateAddressMerkleTree {
48        authority: ctx.accounts.cpi_authority.to_account_info(),
49        registered_program_pda: Some(ctx.accounts.registered_program_pda.to_account_info()),
50        log_wrapper: ctx.accounts.log_wrapper.to_account_info(),
51        queue: ctx.accounts.queue.to_account_info(),
52        merkle_tree: ctx.accounts.merkle_tree.to_account_info(),
53    };
54    let cpi_ctx = CpiContext::new_with_signer(
55        ctx.accounts.account_compression_program.to_account_info(),
56        accounts,
57        signer_seeds,
58    );
59
60    account_compression::cpi::update_address_merkle_tree(
61        cpi_ctx,
62        changelog_index,
63        indexed_changelog_index,
64        value,
65        low_address_index,
66        low_address_value,
67        low_address_next_index,
68        low_address_next_value,
69        low_address_proof,
70    )
71}