light_registry/account_compression_cpi/
nullify.rs

1use account_compression::{
2    program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED, StateMerkleTreeAccount,
3};
4use anchor_lang::prelude::*;
5
6use crate::epoch::register_epoch::ForesterEpochPda;
7
8#[derive(Accounts)]
9pub struct NullifyLeaves<'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    pub authority: Signer<'info>,
14    /// CHECK: (seed constraints) used to invoke account compression program via cpi.
15    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
16    pub cpi_authority: AccountInfo<'info>,
17    /// CHECK: (account compression program) group access control.
18    pub registered_program_pda: AccountInfo<'info>,
19    pub account_compression_program: Program<'info, AccountCompression>,
20    /// CHECK: (account compression program) when emitting event.
21    pub log_wrapper: UncheckedAccount<'info>,
22    /// CHECK: (account compression program).
23    #[account(mut)]
24    pub merkle_tree: AccountLoader<'info, StateMerkleTreeAccount>,
25    /// CHECK: (account compression program).
26    #[account(mut)]
27    pub nullifier_queue: AccountInfo<'info>,
28}
29
30pub fn process_nullify(
31    ctx: &Context<NullifyLeaves>,
32    bump: u8,
33    change_log_indices: Vec<u64>,
34    leaves_queue_indices: Vec<u16>,
35    indices: Vec<u64>,
36    proofs: Vec<Vec<[u8; 32]>>,
37) -> Result<()> {
38    let bump = &[bump];
39    let seeds = [CPI_AUTHORITY_PDA_SEED, bump];
40    let signer_seeds = &[&seeds[..]];
41    let accounts = account_compression::cpi::accounts::NullifyLeaves {
42        authority: ctx.accounts.cpi_authority.to_account_info(),
43        registered_program_pda: Some(ctx.accounts.registered_program_pda.to_account_info()),
44        log_wrapper: ctx.accounts.log_wrapper.to_account_info(),
45        merkle_tree: ctx.accounts.merkle_tree.to_account_info(),
46        nullifier_queue: ctx.accounts.nullifier_queue.to_account_info(),
47    };
48    let cpi_ctx = CpiContext::new_with_signer(
49        ctx.accounts.account_compression_program.to_account_info(),
50        accounts,
51        signer_seeds,
52    );
53
54    account_compression::cpi::nullify_leaves(
55        cpi_ctx,
56        change_log_indices,
57        leaves_queue_indices,
58        indices,
59        proofs,
60    )
61}