light_test_utils/
assert_address_merkle_tree.rs

1use 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    // The address Merkle tree is never directly called by the user.
42    // The whole rollover fees are collected by the address queue.
43    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    // TODO: complete asserts
124    assert_eq!(
125        merkle_tree.indexed_changelog_index(),
126        expected_indexed_changelog_length.saturating_sub(1)
127    );
128}