account_compression/processor/
initialize_address_queue.rs1use 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 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}