account_compression/processor/
initialize_nullifier_queue.rs

1use anchor_lang::{prelude::*, solana_program::pubkey::Pubkey};
2use light_merkle_tree_metadata::{access::AccessMetadata, rollover::RolloverMetadata, QueueType};
3
4use crate::{queue_from_bytes_zero_copy_init, QueueAccount};
5
6pub fn process_initialize_nullifier_queue<'a, 'b, 'c: 'info, 'info>(
7    nullifier_queue_account_info: AccountInfo<'info>,
8    nullifier_queue_account_loader: &'a AccountLoader<'info, QueueAccount>,
9    index: u64,
10    owner: Pubkey,
11    program_owner: Option<Pubkey>,
12    forester: Option<Pubkey>,
13    associated_merkle_tree: Pubkey,
14    capacity: u16,
15    sequence_threshold: u64,
16    rollover_threshold: Option<u64>,
17    close_threshold: Option<u64>,
18    network_fee: u64,
19) -> Result<()> {
20    {
21        let mut nullifier_queue = nullifier_queue_account_loader.load_init()?;
22        let rollover_meta_data = RolloverMetadata {
23            index,
24            rollover_threshold: rollover_threshold.unwrap_or_default(),
25            close_threshold: close_threshold.unwrap_or(u64::MAX),
26            rolledover_slot: u64::MAX,
27            network_fee,
28            // The rollover fee is charged at append with the Merkle tree. The
29            // rollover that is defined in the Merkle tree is calculated to
30            // rollover the tree, queue and cpi context account.
31            rollover_fee: 0,
32            additional_bytes: 0,
33        };
34
35        nullifier_queue.init(
36            AccessMetadata {
37                owner: owner.into(),
38                program_owner: program_owner.unwrap_or_default().into(),
39                forester: forester.unwrap_or_default().into(),
40            },
41            rollover_meta_data,
42            associated_merkle_tree,
43            QueueType::NullifierV1,
44        );
45
46        drop(nullifier_queue);
47    }
48
49    let nullifier_queue = nullifier_queue_account_info;
50    let mut nullifier_queue = nullifier_queue.try_borrow_mut_data()?;
51    unsafe {
52        queue_from_bytes_zero_copy_init(
53            &mut nullifier_queue,
54            capacity.into(),
55            sequence_threshold as usize,
56        )
57        .map_err(ProgramError::from)?;
58    }
59    Ok(())
60}