light_merkle_tree_program/verifier_invoked_instructions/
insert_nullifier.rs

1use anchor_lang::{
2    prelude::*,
3    solana_program::{pubkey::Pubkey, sysvar},
4};
5
6use crate::{
7    utils::{accounts::create_and_check_pda, constants::NULLIFIER_SEED},
8    RegisteredVerifier,
9};
10
11#[derive(Accounts)]
12pub struct InitializeNullifiers<'info> {
13    /// CHECK:` Signer is owned by registered verifier program.
14    #[account(mut, seeds=[__program_id.to_bytes().as_ref()], bump,seeds::program=registered_verifier_pda.pubkey)]
15    pub authority: Signer<'info>,
16    pub system_program: Program<'info, System>,
17    #[account(seeds=[&registered_verifier_pda.pubkey.to_bytes()],  bump )]
18    pub registered_verifier_pda: Account<'info, RegisteredVerifier>, // nullifiers are sent in remaining accounts. @ErrorCode::InvalidVerifier
19}
20
21/// Inserts nullifiers, written in plain rust for memory optimization.
22pub fn process_insert_nullifiers<'info>(
23    ctx: Context<'_, '_, '_, 'info, InitializeNullifiers<'info>>,
24    nullifiers: Vec<[u8; 32]>,
25) -> Result<()> {
26    let rent = <Rent as sysvar::Sysvar>::get()?;
27
28    for (nullifier_pda, nullifier) in ctx.remaining_accounts.iter().zip(nullifiers) {
29        create_and_check_pda(
30            ctx.program_id,
31            &ctx.accounts.authority.to_account_info(),
32            &nullifier_pda.to_account_info(),
33            &ctx.accounts.system_program.to_account_info(),
34            &rent,
35            &nullifier,
36            NULLIFIER_SEED,
37            1,    //bytes
38            0,    //lamports
39            true, //rent_exempt
40        )
41        .unwrap();
42        nullifier_pda.to_account_info().data.borrow_mut()[0] = 1u8;
43    }
44    Ok(())
45}