light_program_test/accounts/
test_accounts.rs

1use light_client::indexer::{AddressMerkleTreeAccounts, StateMerkleTreeAccounts, TreeInfo};
2use light_compressed_account::TreeType;
3use light_registry::{
4    account_compression_cpi::sdk::get_registered_program_pda,
5    sdk::create_register_program_instruction,
6    utils::{get_forester_pda, get_protocol_config_pda_address},
7};
8use solana_sdk::{
9    pubkey,
10    pubkey::Pubkey,
11    signature::{Keypair, Signer},
12};
13
14use super::{initialize::*, test_keypairs::*};
15
16pub const NOOP_PROGRAM_ID: Pubkey = pubkey!("noopb9bkMVfRPU8AsbpTUg8AQkHtKwMYZiFUjNRtMmV");
17
18#[derive(Debug)]
19pub struct ProtocolAccounts {
20    pub governance_authority: Keypair,
21    pub governance_authority_pda: Pubkey,
22    pub group_pda: Pubkey,
23    pub forester: Keypair,
24    pub registered_program_pda: Pubkey,
25    pub registered_registry_program_pda: Pubkey,
26    pub registered_forester_pda: Pubkey,
27}
28
29#[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)]
30pub struct StateMerkleTreeAccountsV2 {
31    pub merkle_tree: Pubkey,
32    pub output_queue: Pubkey,
33    pub cpi_context: Pubkey,
34}
35
36impl From<StateMerkleTreeAccountsV2> for TreeInfo {
37    fn from(value: StateMerkleTreeAccountsV2) -> Self {
38        TreeInfo {
39            tree: value.merkle_tree,
40            queue: value.output_queue,
41            cpi_context: Some(value.cpi_context),
42            tree_type: TreeType::StateV2,
43            next_tree_info: None,
44        }
45    }
46}
47
48#[derive(Debug)]
49pub struct TestAccounts {
50    pub protocol: ProtocolAccounts,
51    pub v1_state_trees: Vec<StateMerkleTreeAccounts>,
52    pub v1_address_trees: Vec<AddressMerkleTreeAccounts>,
53    pub v2_state_trees: Vec<StateMerkleTreeAccountsV2>,
54    pub v2_address_trees: Vec<Pubkey>,
55}
56
57impl TestAccounts {
58    pub fn get_local_test_validator_accounts() -> TestAccounts {
59        TestAccounts {
60            protocol: ProtocolAccounts {
61                governance_authority: Keypair::from_bytes(&PAYER_KEYPAIR).unwrap(),
62                governance_authority_pda: Pubkey::default(),
63                group_pda: Pubkey::default(),
64                forester: Keypair::from_bytes(&FORESTER_TEST_KEYPAIR).unwrap(),
65                registered_program_pda: get_registered_program_pda(&Pubkey::from(
66                    light_sdk::constants::LIGHT_SYSTEM_PROGRAM_ID,
67                )),
68                registered_registry_program_pda: get_registered_program_pda(&light_registry::ID),
69                registered_forester_pda: Pubkey::default(),
70            },
71            v1_state_trees: vec![
72                StateMerkleTreeAccounts {
73                    merkle_tree: pubkey!("smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT"),
74                    nullifier_queue: pubkey!("nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148"),
75                    cpi_context: pubkey!("cpi1uHzrEhBG733DoEJNgHCyRS3XmmyVNZx5fonubE4"),
76                    tree_type: TreeType::StateV1,
77                },
78                StateMerkleTreeAccounts {
79                    merkle_tree: pubkey!("smt2rJAFdyJJupwMKAqTNAJwvjhmiZ4JYGZmbVRw1Ho"),
80                    nullifier_queue: pubkey!("nfq2hgS7NYemXsFaFUCe3EMXSDSfnZnAe27jC6aPP1X"),
81                    cpi_context: pubkey!("cpi2cdhkH5roePvcudTgUL8ppEBfTay1desGh8G8QxK"),
82                    tree_type: TreeType::StateV1,
83                },
84            ],
85
86            v1_address_trees: vec![AddressMerkleTreeAccounts {
87                merkle_tree: pubkey!("amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2"),
88                queue: pubkey!("aq1S9z4reTSQAdgWHGD2zDaS39sjGrAxbR31vxJ2F4F"),
89            }],
90
91            v2_address_trees: vec![pubkey!("amt2kaJA14v3urZbZvnc5v2np8jqvc4Z8zDep5wbtzx")],
92            v2_state_trees: vec![
93                StateMerkleTreeAccountsV2 {
94                    merkle_tree: pubkey!("bmt1LryLZUMmF7ZtqESaw7wifBXLfXHQYoE4GAmrahU"),
95                    output_queue: pubkey!("oq1na8gojfdUhsfCpyjNt6h4JaDWtHf1yQj4koBWfto"),
96                    cpi_context: pubkey!("cpi15BoVPKgEPw5o8wc2T816GE7b378nMXnhH3Xbq4y"),
97                },
98                StateMerkleTreeAccountsV2 {
99                    merkle_tree: pubkey!("bmt2UxoBxB9xWev4BkLvkGdapsz6sZGkzViPNph7VFi"),
100                    output_queue: pubkey!("oq2UkeMsJLfXt2QHzim242SUi3nvjJs8Pn7Eac9H9vg"),
101                    cpi_context: pubkey!("cpi2yGapXUR3As5SjnHBAVvmApNiLsbeZpF3euWnW6B"),
102                },
103                StateMerkleTreeAccountsV2 {
104                    merkle_tree: pubkey!("bmt3ccLd4bqSVZVeCJnH1F6C8jNygAhaDfxDwePyyGb"),
105                    output_queue: pubkey!("oq3AxjekBWgo64gpauB6QtuZNesuv19xrhaC1ZM1THQ"),
106                    cpi_context: pubkey!("cpi3mbwMpSX8FAGMZVP85AwxqCaQMfEk9Em1v8QK9Rf"),
107                },
108                StateMerkleTreeAccountsV2 {
109                    merkle_tree: pubkey!("bmt4d3p1a4YQgk9PeZv5s4DBUmbF5NxqYpk9HGjQsd8"),
110                    output_queue: pubkey!("oq4ypwvVGzCUMoiKKHWh4S1SgZJ9vCvKpcz6RT6A8dq"),
111                    cpi_context: pubkey!("cpi4yyPDc4bCgHAnsenunGA8Y77j3XEDyjgfyCKgcoc"),
112                },
113                StateMerkleTreeAccountsV2 {
114                    merkle_tree: pubkey!("bmt5yU97jC88YXTuSukYHa8Z5Bi2ZDUtmzfkDTA2mG2"),
115                    output_queue: pubkey!("oq5oh5ZR3yGomuQgFduNDzjtGvVWfDRGLuDVjv9a96P"),
116                    cpi_context: pubkey!("cpi5ZTjdgYpZ1Xr7B1cMLLUE81oTtJbNNAyKary2nV6"),
117                },
118            ],
119        }
120    }
121
122    pub fn get_program_test_test_accounts() -> TestAccounts {
123        let group_seed_keypair = Keypair::from_bytes(&GROUP_PDA_SEED_TEST_KEYPAIR).unwrap();
124        let group_pda = get_group_pda(group_seed_keypair.pubkey());
125
126        let payer = Keypair::from_bytes(&PAYER_KEYPAIR).unwrap();
127        let protocol_config_pda = get_protocol_config_pda_address();
128        let (_, registered_program_pda) = create_register_program_instruction(
129            payer.pubkey(),
130            protocol_config_pda,
131            group_pda,
132            Pubkey::from(light_sdk::constants::LIGHT_SYSTEM_PROGRAM_ID),
133        );
134
135        let registered_registry_program_pda = get_registered_program_pda(&light_registry::ID);
136        let forester = Keypair::from_bytes(&FORESTER_TEST_KEYPAIR).unwrap();
137
138        let forester_pubkey = forester.pubkey();
139        TestAccounts {
140            protocol: ProtocolAccounts {
141                governance_authority: payer,
142                governance_authority_pda: protocol_config_pda.0,
143                group_pda,
144                forester,
145                registered_program_pda,
146                registered_registry_program_pda,
147                registered_forester_pda: get_forester_pda(&forester_pubkey).0,
148            },
149            v1_state_trees: vec![
150                StateMerkleTreeAccounts {
151                    merkle_tree: pubkey!("smt1NamzXdq4AMqS2fS2F1i5KTYPZRhoHgWx38d8WsT"),
152                    nullifier_queue: pubkey!("nfq1NvQDJ2GEgnS8zt9prAe8rjjpAW1zFkrvZoBR148"),
153                    cpi_context: pubkey!("cpi1uHzrEhBG733DoEJNgHCyRS3XmmyVNZx5fonubE4"),
154                    tree_type: TreeType::StateV1,
155                },
156                StateMerkleTreeAccounts {
157                    merkle_tree: pubkey!("smt2rJAFdyJJupwMKAqTNAJwvjhmiZ4JYGZmbVRw1Ho"),
158                    nullifier_queue: pubkey!("nfq2hgS7NYemXsFaFUCe3EMXSDSfnZnAe27jC6aPP1X"),
159                    cpi_context: pubkey!("cpi2cdhkH5roePvcudTgUL8ppEBfTay1desGh8G8QxK"),
160                    tree_type: TreeType::StateV1,
161                },
162            ],
163            v1_address_trees: vec![AddressMerkleTreeAccounts {
164                merkle_tree: pubkey!("amt1Ayt45jfbdw5YSo7iz6WZxUmnZsQTYXy82hVwyC2"),
165                queue: pubkey!("aq1S9z4reTSQAdgWHGD2zDaS39sjGrAxbR31vxJ2F4F"),
166            }],
167            v2_state_trees: vec![
168                StateMerkleTreeAccountsV2 {
169                    merkle_tree: pubkey!("bmt1LryLZUMmF7ZtqESaw7wifBXLfXHQYoE4GAmrahU"),
170                    output_queue: pubkey!("oq1na8gojfdUhsfCpyjNt6h4JaDWtHf1yQj4koBWfto"),
171                    cpi_context: pubkey!("cpi15BoVPKgEPw5o8wc2T816GE7b378nMXnhH3Xbq4y"),
172                },
173                StateMerkleTreeAccountsV2 {
174                    merkle_tree: pubkey!("bmt2UxoBxB9xWev4BkLvkGdapsz6sZGkzViPNph7VFi"),
175                    output_queue: pubkey!("oq2UkeMsJLfXt2QHzim242SUi3nvjJs8Pn7Eac9H9vg"),
176                    cpi_context: pubkey!("cpi2yGapXUR3As5SjnHBAVvmApNiLsbeZpF3euWnW6B"),
177                },
178                StateMerkleTreeAccountsV2 {
179                    merkle_tree: pubkey!("bmt3ccLd4bqSVZVeCJnH1F6C8jNygAhaDfxDwePyyGb"),
180                    output_queue: pubkey!("oq3AxjekBWgo64gpauB6QtuZNesuv19xrhaC1ZM1THQ"),
181                    cpi_context: pubkey!("cpi3mbwMpSX8FAGMZVP85AwxqCaQMfEk9Em1v8QK9Rf"),
182                },
183                StateMerkleTreeAccountsV2 {
184                    merkle_tree: pubkey!("bmt4d3p1a4YQgk9PeZv5s4DBUmbF5NxqYpk9HGjQsd8"),
185                    output_queue: pubkey!("oq4ypwvVGzCUMoiKKHWh4S1SgZJ9vCvKpcz6RT6A8dq"),
186                    cpi_context: pubkey!("cpi4yyPDc4bCgHAnsenunGA8Y77j3XEDyjgfyCKgcoc"),
187                },
188                StateMerkleTreeAccountsV2 {
189                    merkle_tree: pubkey!("bmt5yU97jC88YXTuSukYHa8Z5Bi2ZDUtmzfkDTA2mG2"),
190                    output_queue: pubkey!("oq5oh5ZR3yGomuQgFduNDzjtGvVWfDRGLuDVjv9a96P"),
191                    cpi_context: pubkey!("cpi5ZTjdgYpZ1Xr7B1cMLLUE81oTtJbNNAyKary2nV6"),
192                },
193            ],
194            v2_address_trees: vec![pubkey!("amt2kaJA14v3urZbZvnc5v2np8jqvc4Z8zDep5wbtzx")],
195        }
196    }
197}
198
199impl Clone for TestAccounts {
200    fn clone(&self) -> Self {
201        TestAccounts {
202            protocol: ProtocolAccounts {
203                governance_authority: Keypair::from_bytes(
204                    &self.protocol.governance_authority.to_bytes(),
205                )
206                .unwrap(),
207                governance_authority_pda: self.protocol.governance_authority_pda,
208                group_pda: self.protocol.group_pda,
209                forester: Keypair::from_bytes(&self.protocol.forester.to_bytes()).unwrap(),
210                registered_program_pda: self.protocol.registered_program_pda,
211                registered_registry_program_pda: self.protocol.registered_registry_program_pda,
212                registered_forester_pda: self.protocol.registered_forester_pda,
213            },
214            v1_state_trees: self.v1_state_trees.clone(),
215            v1_address_trees: self.v1_address_trees.clone(),
216            v2_state_trees: self.v2_state_trees.clone(),
217            v2_address_trees: self.v2_address_trees.clone(),
218        }
219    }
220}