account_compression/processor/
initialize_address_queue.rs

1use anchor_lang::prelude::*;
2use light_merkle_tree_metadata::{
3    access::AccessMetadata,
4    fee::compute_rollover_fee,
5    rollover::{check_rollover_fee_sufficient, RolloverMetadata},
6    QueueType,
7};
8
9use crate::state::{queue_from_bytes_zero_copy_init, QueueAccount};
10
11pub fn process_initialize_address_queue<'info>(
12    queue_account_info: &AccountInfo<'info>,
13    queue_loader: &AccountLoader<'info, QueueAccount>,
14    index: u64,
15    owner: Pubkey,
16    program_owner: Option<Pubkey>,
17    forester: Option<Pubkey>,
18    associated_merkle_tree: Pubkey,
19    capacity: u16,
20    sequence_threshold: u64,
21    network_fee: u64,
22    rollover_threshold: Option<u64>,
23    close_threshold: Option<u64>,
24    height: u32,
25    merkle_tree_rent: u64,
26) -> Result<()> {
27    {
28        let mut address_queue = queue_loader.load_init()?;
29
30        // Since the user doesn't interact with the address Merkle tree
31        // directly, we need to charge a `rollover_fee` both for the queue and
32        // Merkle tree.
33        let queue_rent = queue_account_info.lamports();
34        let rollover_fee = if let Some(rollover_threshold) = rollover_threshold {
35            let rollover_fee = compute_rollover_fee(rollover_threshold, height, merkle_tree_rent)
36                .map_err(ProgramError::from)?
37                + compute_rollover_fee(rollover_threshold, height, queue_rent)
38                    .map_err(ProgramError::from)?;
39            check_rollover_fee_sufficient(
40                rollover_fee,
41                queue_rent,
42                merkle_tree_rent,
43                rollover_threshold,
44                height,
45            )
46            .map_err(ProgramError::from)?;
47            msg!("address queue rollover_fee: {}", rollover_fee);
48            rollover_fee
49        } else {
50            0
51        };
52
53        address_queue.init(
54            AccessMetadata {
55                owner: owner.into(),
56                program_owner: program_owner.unwrap_or_default().into(),
57                forester: forester.unwrap_or_default().into(),
58            },
59            RolloverMetadata::new(
60                index,
61                rollover_fee,
62                rollover_threshold,
63                network_fee,
64                close_threshold,
65                None,
66            ),
67            associated_merkle_tree,
68            QueueType::AddressV1,
69        );
70        msg!("address queue address_queue.init");
71
72        drop(address_queue);
73    }
74
75    unsafe {
76        queue_from_bytes_zero_copy_init(
77            &mut queue_account_info.try_borrow_mut_data()?,
78            capacity as usize,
79            sequence_threshold as usize,
80        )
81        .map_err(ProgramError::from)?;
82    }
83
84    Ok(())
85}