light_registry/account_compression_cpi/
nullify.rs1use 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 #[account(mut)]
12 pub registered_forester_pda: Option<Account<'info, ForesterEpochPda>>,
13 pub authority: Signer<'info>,
14 #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
16 pub cpi_authority: AccountInfo<'info>,
17 pub registered_program_pda: AccountInfo<'info>,
19 pub account_compression_program: Program<'info, AccountCompression>,
20 pub log_wrapper: UncheckedAccount<'info>,
22 #[account(mut)]
24 pub merkle_tree: AccountLoader<'info, StateMerkleTreeAccount>,
25 #[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}