light_program_test/accounts/
test_accounts.rs1use 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}