account_compression/processor/
initialize_concurrent_merkle_tree.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};
7
8use crate::{state::StateMerkleTreeAccount, state_merkle_tree_from_bytes_zero_copy_init};
9
10#[allow(unused_variables)]
11pub fn process_initialize_state_merkle_tree(
12 merkle_tree_account_loader: &AccountLoader<'_, StateMerkleTreeAccount>,
13 index: u64,
14 owner: Pubkey,
15 program_owner: Option<Pubkey>,
16 forester: Option<Pubkey>,
17 height: &u32,
18 changelog_size: &u64,
19 roots_size: &u64,
20 canopy_depth: &u64,
21 associated_queue: Pubkey,
22 network_fee: u64,
23 rollover_threshold: Option<u64>,
24 close_threshold: Option<u64>,
25 merkle_tree_rent: u64,
26 queue_rent: u64,
27) -> Result<()> {
28 {
30 let mut merkle_tree = merkle_tree_account_loader.load_init()?;
31
32 let rollover_fee = match rollover_threshold {
33 Some(rollover_threshold) => {
34 let rollover_fee =
35 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!(" state Merkle tree rollover_fee: {}", rollover_fee);
48 rollover_fee
49 }
50 None => 0,
51 };
52
53 merkle_tree.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_queue,
68 );
69 }
70
71 let merkle_tree = merkle_tree_account_loader.to_account_info();
72 let mut merkle_tree = merkle_tree.try_borrow_mut_data()?;
73 let mut merkle_tree = state_merkle_tree_from_bytes_zero_copy_init(
74 &mut merkle_tree,
75 *height as usize,
76 *canopy_depth as usize,
77 *changelog_size as usize,
78 *roots_size as usize,
79 )?;
80 merkle_tree.init().map_err(ProgramError::from)?;
81
82 Ok(())
83}