1use crate::generated::types::PermissionSigner;
9use borsh::BorshDeserialize;
10use borsh::BorshSerialize;
11use solana_pubkey::Pubkey;
12
13pub const PERMISSION_CONFIG_INITIALIZE_DISCRIMINATOR: u8 = 2;
14
15#[derive(Debug)]
17pub struct PermissionConfigInitialize {
18 pub authority: solana_pubkey::Pubkey,
20 pub permission_config: solana_pubkey::Pubkey,
22 pub authority_config: solana_pubkey::Pubkey,
24 pub system_program: solana_pubkey::Pubkey,
26}
27
28impl PermissionConfigInitialize {
29 pub fn instruction(
30 &self,
31 args: PermissionConfigInitializeInstructionArgs,
32 ) -> solana_instruction::Instruction {
33 self.instruction_with_remaining_accounts(args, &[])
34 }
35 #[allow(clippy::arithmetic_side_effects)]
36 #[allow(clippy::vec_init_then_push)]
37 pub fn instruction_with_remaining_accounts(
38 &self,
39 args: PermissionConfigInitializeInstructionArgs,
40 remaining_accounts: &[solana_instruction::AccountMeta],
41 ) -> solana_instruction::Instruction {
42 let mut accounts = Vec::with_capacity(4 + remaining_accounts.len());
43 accounts.push(solana_instruction::AccountMeta::new(self.authority, true));
44 accounts.push(solana_instruction::AccountMeta::new(
45 self.permission_config,
46 false,
47 ));
48 accounts.push(solana_instruction::AccountMeta::new_readonly(
49 self.authority_config,
50 false,
51 ));
52 accounts.push(solana_instruction::AccountMeta::new_readonly(
53 self.system_program,
54 false,
55 ));
56 accounts.extend_from_slice(remaining_accounts);
57 let mut data = borsh::to_vec(&PermissionConfigInitializeInstructionData::new()).unwrap();
58 let mut args = borsh::to_vec(&args).unwrap();
59 data.append(&mut args);
60
61 solana_instruction::Instruction {
62 program_id: crate::WAVEBREAK_ID,
63 accounts,
64 data,
65 }
66 }
67}
68
69#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
70#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
71pub struct PermissionConfigInitializeInstructionData {
72 discriminator: u8,
73}
74
75impl PermissionConfigInitializeInstructionData {
76 pub fn new() -> Self {
77 Self { discriminator: 2 }
78 }
79}
80
81impl Default for PermissionConfigInitializeInstructionData {
82 fn default() -> Self {
83 Self::new()
84 }
85}
86
87#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
88#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
89pub struct PermissionConfigInitializeInstructionArgs {
90 pub permission_authority: PermissionSigner,
91 pub consumer_program: Pubkey,
92}
93
94#[derive(Clone, Debug, Default)]
103pub struct PermissionConfigInitializeBuilder {
104 authority: Option<solana_pubkey::Pubkey>,
105 permission_config: Option<solana_pubkey::Pubkey>,
106 authority_config: Option<solana_pubkey::Pubkey>,
107 system_program: Option<solana_pubkey::Pubkey>,
108 permission_authority: Option<PermissionSigner>,
109 consumer_program: Option<Pubkey>,
110 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
111}
112
113impl PermissionConfigInitializeBuilder {
114 pub fn new() -> Self {
115 Self::default()
116 }
117 #[inline(always)]
119 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
120 self.authority = Some(authority);
121 self
122 }
123 #[inline(always)]
125 pub fn permission_config(&mut self, permission_config: solana_pubkey::Pubkey) -> &mut Self {
126 self.permission_config = Some(permission_config);
127 self
128 }
129 #[inline(always)]
131 pub fn authority_config(&mut self, authority_config: solana_pubkey::Pubkey) -> &mut Self {
132 self.authority_config = Some(authority_config);
133 self
134 }
135 #[inline(always)]
138 pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self {
139 self.system_program = Some(system_program);
140 self
141 }
142 #[inline(always)]
143 pub fn permission_authority(&mut self, permission_authority: PermissionSigner) -> &mut Self {
144 self.permission_authority = Some(permission_authority);
145 self
146 }
147 #[inline(always)]
148 pub fn consumer_program(&mut self, consumer_program: Pubkey) -> &mut Self {
149 self.consumer_program = Some(consumer_program);
150 self
151 }
152 #[inline(always)]
154 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
155 self.__remaining_accounts.push(account);
156 self
157 }
158 #[inline(always)]
160 pub fn add_remaining_accounts(
161 &mut self,
162 accounts: &[solana_instruction::AccountMeta],
163 ) -> &mut Self {
164 self.__remaining_accounts.extend_from_slice(accounts);
165 self
166 }
167 #[allow(clippy::clone_on_copy)]
168 pub fn instruction(&self) -> solana_instruction::Instruction {
169 let accounts = PermissionConfigInitialize {
170 authority: self.authority.expect("authority is not set"),
171 permission_config: self
172 .permission_config
173 .expect("permission_config is not set"),
174 authority_config: self.authority_config.expect("authority_config is not set"),
175 system_program: self
176 .system_program
177 .unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")),
178 };
179 let args = PermissionConfigInitializeInstructionArgs {
180 permission_authority: self
181 .permission_authority
182 .clone()
183 .expect("permission_authority is not set"),
184 consumer_program: self
185 .consumer_program
186 .clone()
187 .expect("consumer_program is not set"),
188 };
189
190 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
191 }
192}
193
194pub struct PermissionConfigInitializeCpiAccounts<'a, 'b> {
196 pub authority: &'b solana_account_info::AccountInfo<'a>,
198 pub permission_config: &'b solana_account_info::AccountInfo<'a>,
200 pub authority_config: &'b solana_account_info::AccountInfo<'a>,
202 pub system_program: &'b solana_account_info::AccountInfo<'a>,
204}
205
206pub struct PermissionConfigInitializeCpi<'a, 'b> {
208 pub __program: &'b solana_account_info::AccountInfo<'a>,
210 pub authority: &'b solana_account_info::AccountInfo<'a>,
212 pub permission_config: &'b solana_account_info::AccountInfo<'a>,
214 pub authority_config: &'b solana_account_info::AccountInfo<'a>,
216 pub system_program: &'b solana_account_info::AccountInfo<'a>,
218 pub __args: PermissionConfigInitializeInstructionArgs,
220}
221
222impl<'a, 'b> PermissionConfigInitializeCpi<'a, 'b> {
223 pub fn new(
224 program: &'b solana_account_info::AccountInfo<'a>,
225 accounts: PermissionConfigInitializeCpiAccounts<'a, 'b>,
226 args: PermissionConfigInitializeInstructionArgs,
227 ) -> Self {
228 Self {
229 __program: program,
230 authority: accounts.authority,
231 permission_config: accounts.permission_config,
232 authority_config: accounts.authority_config,
233 system_program: accounts.system_program,
234 __args: args,
235 }
236 }
237 #[inline(always)]
238 pub fn invoke(&self) -> solana_program_error::ProgramResult {
239 self.invoke_signed_with_remaining_accounts(&[], &[])
240 }
241 #[inline(always)]
242 pub fn invoke_with_remaining_accounts(
243 &self,
244 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
245 ) -> solana_program_error::ProgramResult {
246 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
247 }
248 #[inline(always)]
249 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
250 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
251 }
252 #[allow(clippy::arithmetic_side_effects)]
253 #[allow(clippy::clone_on_copy)]
254 #[allow(clippy::vec_init_then_push)]
255 pub fn invoke_signed_with_remaining_accounts(
256 &self,
257 signers_seeds: &[&[&[u8]]],
258 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
259 ) -> solana_program_error::ProgramResult {
260 let mut accounts = Vec::with_capacity(4 + remaining_accounts.len());
261 accounts.push(solana_instruction::AccountMeta::new(
262 *self.authority.key,
263 true,
264 ));
265 accounts.push(solana_instruction::AccountMeta::new(
266 *self.permission_config.key,
267 false,
268 ));
269 accounts.push(solana_instruction::AccountMeta::new_readonly(
270 *self.authority_config.key,
271 false,
272 ));
273 accounts.push(solana_instruction::AccountMeta::new_readonly(
274 *self.system_program.key,
275 false,
276 ));
277 remaining_accounts.iter().for_each(|remaining_account| {
278 accounts.push(solana_instruction::AccountMeta {
279 pubkey: *remaining_account.0.key,
280 is_signer: remaining_account.1,
281 is_writable: remaining_account.2,
282 })
283 });
284 let mut data = borsh::to_vec(&PermissionConfigInitializeInstructionData::new()).unwrap();
285 let mut args = borsh::to_vec(&self.__args).unwrap();
286 data.append(&mut args);
287
288 let instruction = solana_instruction::Instruction {
289 program_id: crate::WAVEBREAK_ID,
290 accounts,
291 data,
292 };
293 let mut account_infos = Vec::with_capacity(5 + remaining_accounts.len());
294 account_infos.push(self.__program.clone());
295 account_infos.push(self.authority.clone());
296 account_infos.push(self.permission_config.clone());
297 account_infos.push(self.authority_config.clone());
298 account_infos.push(self.system_program.clone());
299 remaining_accounts
300 .iter()
301 .for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
302
303 if signers_seeds.is_empty() {
304 solana_cpi::invoke(&instruction, &account_infos)
305 } else {
306 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
307 }
308 }
309}
310
311#[derive(Clone, Debug)]
320pub struct PermissionConfigInitializeCpiBuilder<'a, 'b> {
321 instruction: Box<PermissionConfigInitializeCpiBuilderInstruction<'a, 'b>>,
322}
323
324impl<'a, 'b> PermissionConfigInitializeCpiBuilder<'a, 'b> {
325 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
326 let instruction = Box::new(PermissionConfigInitializeCpiBuilderInstruction {
327 __program: program,
328 authority: None,
329 permission_config: None,
330 authority_config: None,
331 system_program: None,
332 permission_authority: None,
333 consumer_program: None,
334 __remaining_accounts: Vec::new(),
335 });
336 Self { instruction }
337 }
338 #[inline(always)]
340 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
341 self.instruction.authority = Some(authority);
342 self
343 }
344 #[inline(always)]
346 pub fn permission_config(
347 &mut self,
348 permission_config: &'b solana_account_info::AccountInfo<'a>,
349 ) -> &mut Self {
350 self.instruction.permission_config = Some(permission_config);
351 self
352 }
353 #[inline(always)]
355 pub fn authority_config(
356 &mut self,
357 authority_config: &'b solana_account_info::AccountInfo<'a>,
358 ) -> &mut Self {
359 self.instruction.authority_config = Some(authority_config);
360 self
361 }
362 #[inline(always)]
364 pub fn system_program(
365 &mut self,
366 system_program: &'b solana_account_info::AccountInfo<'a>,
367 ) -> &mut Self {
368 self.instruction.system_program = Some(system_program);
369 self
370 }
371 #[inline(always)]
372 pub fn permission_authority(&mut self, permission_authority: PermissionSigner) -> &mut Self {
373 self.instruction.permission_authority = Some(permission_authority);
374 self
375 }
376 #[inline(always)]
377 pub fn consumer_program(&mut self, consumer_program: Pubkey) -> &mut Self {
378 self.instruction.consumer_program = Some(consumer_program);
379 self
380 }
381 #[inline(always)]
383 pub fn add_remaining_account(
384 &mut self,
385 account: &'b solana_account_info::AccountInfo<'a>,
386 is_writable: bool,
387 is_signer: bool,
388 ) -> &mut Self {
389 self.instruction
390 .__remaining_accounts
391 .push((account, is_writable, is_signer));
392 self
393 }
394 #[inline(always)]
399 pub fn add_remaining_accounts(
400 &mut self,
401 accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
402 ) -> &mut Self {
403 self.instruction
404 .__remaining_accounts
405 .extend_from_slice(accounts);
406 self
407 }
408 #[inline(always)]
409 pub fn invoke(&self) -> solana_program_error::ProgramResult {
410 self.invoke_signed(&[])
411 }
412 #[allow(clippy::clone_on_copy)]
413 #[allow(clippy::vec_init_then_push)]
414 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
415 let args = PermissionConfigInitializeInstructionArgs {
416 permission_authority: self
417 .instruction
418 .permission_authority
419 .clone()
420 .expect("permission_authority is not set"),
421 consumer_program: self
422 .instruction
423 .consumer_program
424 .clone()
425 .expect("consumer_program is not set"),
426 };
427 let instruction = PermissionConfigInitializeCpi {
428 __program: self.instruction.__program,
429
430 authority: self.instruction.authority.expect("authority is not set"),
431
432 permission_config: self
433 .instruction
434 .permission_config
435 .expect("permission_config is not set"),
436
437 authority_config: self
438 .instruction
439 .authority_config
440 .expect("authority_config is not set"),
441
442 system_program: self
443 .instruction
444 .system_program
445 .expect("system_program is not set"),
446 __args: args,
447 };
448 instruction.invoke_signed_with_remaining_accounts(
449 signers_seeds,
450 &self.instruction.__remaining_accounts,
451 )
452 }
453}
454
455#[derive(Clone, Debug)]
456struct PermissionConfigInitializeCpiBuilderInstruction<'a, 'b> {
457 __program: &'b solana_account_info::AccountInfo<'a>,
458 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
459 permission_config: Option<&'b solana_account_info::AccountInfo<'a>>,
460 authority_config: Option<&'b solana_account_info::AccountInfo<'a>>,
461 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
462 permission_authority: Option<PermissionSigner>,
463 consumer_program: Option<Pubkey>,
464 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
466}