account_compression/processor/
initialize_concurrent_merkle_tree.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};
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    // Initialize new Merkle trees.
29    {
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}