light_test_utils/
assert_address_merkle_tree.rs1use forester_utils::{get_indexed_merkle_tree, AccountZeroCopy};
2use light_client::rpc::RpcConnection;
3use light_hasher::Poseidon;
4use solana_sdk::pubkey::Pubkey;
5
6#[allow(clippy::too_many_arguments)]
7pub async fn assert_address_merkle_tree_initialized<R: RpcConnection>(
8 rpc: &mut R,
9 merkle_tree_pubkey: &Pubkey,
10 queue_pubkey: &Pubkey,
11 merkle_tree_config: &account_compression::AddressMerkleTreeConfig,
12 index: u64,
13 program_owner: Option<Pubkey>,
14 forester: Option<Pubkey>,
15 expected_changelog_length: usize,
16 expected_roots_length: usize,
17 expected_next_index: usize,
18 expected_rightmost_leaf: &[u8; 32],
19 owner_pubkey: &Pubkey,
20 expected_indexed_changelog_length: usize,
21) {
22 let merkle_tree = AccountZeroCopy::<account_compression::AddressMerkleTreeAccount>::new(
23 rpc,
24 *merkle_tree_pubkey,
25 )
26 .await;
27 let merkle_tree_account = merkle_tree.deserialized();
28
29 assert_eq!(
30 merkle_tree_account
31 .metadata
32 .rollover_metadata
33 .rollover_threshold,
34 merkle_tree_config.rollover_threshold.unwrap_or_default()
35 );
36 assert_eq!(
37 merkle_tree_account.metadata.rollover_metadata.network_fee,
38 merkle_tree_config.network_fee.unwrap_or_default()
39 );
40
41 let expected_rollover_fee = 0;
44 assert_eq!(
45 merkle_tree_account.metadata.rollover_metadata.rollover_fee,
46 expected_rollover_fee
47 );
48
49 assert_eq!(merkle_tree_account.metadata.rollover_metadata.index, index);
50 assert_eq!(
51 merkle_tree_account
52 .metadata
53 .rollover_metadata
54 .rolledover_slot,
55 u64::MAX
56 );
57
58 assert_eq!(
59 merkle_tree_account
60 .metadata
61 .rollover_metadata
62 .close_threshold,
63 merkle_tree_config.close_threshold.unwrap_or(u64::MAX)
64 );
65
66 assert_eq!(
67 merkle_tree_account.metadata.next_merkle_tree,
68 Pubkey::default()
69 );
70 let expected_access_meta_data = account_compression::AccessMetadata {
71 owner: *owner_pubkey,
72 program_owner: program_owner.unwrap_or_default(),
73 forester: forester.unwrap_or_default(),
74 };
75 assert_eq!(
76 merkle_tree_account.metadata.access_metadata,
77 expected_access_meta_data
78 );
79 assert_eq!(merkle_tree_account.metadata.associated_queue, *queue_pubkey);
80
81 let merkle_tree = get_indexed_merkle_tree::<
82 account_compression::AddressMerkleTreeAccount,
83 R,
84 Poseidon,
85 usize,
86 26,
87 16,
88 >(rpc, *merkle_tree_pubkey)
89 .await;
90
91 assert_eq!(merkle_tree.height, merkle_tree_config.height as usize);
92 assert_eq!(
93 merkle_tree.merkle_tree.changelog.capacity(),
94 merkle_tree_config.changelog_size as usize
95 );
96 assert_eq!(
97 merkle_tree.merkle_tree.changelog.len(),
98 expected_changelog_length
99 );
100 assert_eq!(
101 merkle_tree.merkle_tree.changelog_index(),
102 expected_changelog_length.saturating_sub(1)
103 );
104 assert_eq!(
105 merkle_tree.roots.capacity(),
106 merkle_tree_config.roots_size as usize
107 );
108 assert_eq!(merkle_tree.roots.len(), expected_roots_length);
109 assert_eq!(
110 merkle_tree.root_index(),
111 expected_roots_length.saturating_sub(1)
112 );
113 assert_eq!(
114 merkle_tree.canopy_depth,
115 merkle_tree_config.canopy_depth as usize
116 );
117 assert_eq!(merkle_tree.next_index(), expected_next_index);
118 assert_eq!(
119 merkle_tree.sequence_number() % merkle_tree_config.roots_size as usize,
120 expected_roots_length.saturating_sub(1)
121 );
122 assert_eq!(&merkle_tree.rightmost_leaf(), expected_rightmost_leaf);
123 assert_eq!(
125 merkle_tree.indexed_changelog_index(),
126 expected_indexed_changelog_length.saturating_sub(1)
127 );
128}