orca_wavebreak/generated/instructions/
permission_consume_top_level.rs

1//! This code was AUTOGENERATED using the codama library.
2//! Please DO NOT EDIT THIS FILE, instead use visitors
3//! to add features, then rerun codama to update it.
4//!
5//! <https://github.com/codama-idl/codama>
6//!
7
8use crate::generated::types::PermissionMessage;
9use crate::generated::types::PermissionSignature;
10use borsh::BorshDeserialize;
11use borsh::BorshSerialize;
12
13pub const PERMISSION_CONSUME_TOP_LEVEL_DISCRIMINATOR: u8 = 0;
14
15/// Accounts.
16#[derive(Debug)]
17pub struct PermissionConsumeTopLevel {
18    /// The consumer of the permission
19    pub consumer: solana_pubkey::Pubkey,
20    /// The permission config account
21    pub permission_config: solana_pubkey::Pubkey,
22    /// The permission program account
23    pub consumed_permission: solana_pubkey::Pubkey,
24    /// System program
25    pub system_program: solana_pubkey::Pubkey,
26    /// Sysvar instructions
27    pub instructions: solana_pubkey::Pubkey,
28}
29
30impl PermissionConsumeTopLevel {
31    pub fn instruction(
32        &self,
33        args: PermissionConsumeTopLevelInstructionArgs,
34    ) -> solana_instruction::Instruction {
35        self.instruction_with_remaining_accounts(args, &[])
36    }
37    #[allow(clippy::arithmetic_side_effects)]
38    #[allow(clippy::vec_init_then_push)]
39    pub fn instruction_with_remaining_accounts(
40        &self,
41        args: PermissionConsumeTopLevelInstructionArgs,
42        remaining_accounts: &[solana_instruction::AccountMeta],
43    ) -> solana_instruction::Instruction {
44        let mut accounts = Vec::with_capacity(5 + remaining_accounts.len());
45        accounts.push(solana_instruction::AccountMeta::new(self.consumer, true));
46        accounts.push(solana_instruction::AccountMeta::new_readonly(
47            self.permission_config,
48            false,
49        ));
50        accounts.push(solana_instruction::AccountMeta::new(
51            self.consumed_permission,
52            false,
53        ));
54        accounts.push(solana_instruction::AccountMeta::new_readonly(
55            self.system_program,
56            false,
57        ));
58        accounts.push(solana_instruction::AccountMeta::new_readonly(
59            self.instructions,
60            false,
61        ));
62        accounts.extend_from_slice(remaining_accounts);
63        let mut data = borsh::to_vec(&PermissionConsumeTopLevelInstructionData::new()).unwrap();
64        let mut args = borsh::to_vec(&args).unwrap();
65        data.append(&mut args);
66
67        solana_instruction::Instruction {
68            program_id: crate::WAVEBREAK_ID,
69            accounts,
70            data,
71        }
72    }
73}
74
75#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
76#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
77pub struct PermissionConsumeTopLevelInstructionData {
78    discriminator: u8,
79}
80
81impl PermissionConsumeTopLevelInstructionData {
82    pub fn new() -> Self {
83        Self { discriminator: 0 }
84    }
85}
86
87impl Default for PermissionConsumeTopLevelInstructionData {
88    fn default() -> Self {
89        Self::new()
90    }
91}
92
93#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
94#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
95pub struct PermissionConsumeTopLevelInstructionArgs {
96    pub permission_message: PermissionMessage,
97    pub permission_signature: PermissionSignature,
98}
99
100/// Instruction builder for `PermissionConsumeTopLevel`.
101///
102/// ### Accounts:
103///
104///   0. `[writable, signer]` consumer
105///   1. `[]` permission_config
106///   2. `[writable]` consumed_permission
107///   3. `[optional]` system_program (default to `11111111111111111111111111111111`)
108///   4. `[]` instructions
109#[derive(Clone, Debug, Default)]
110pub struct PermissionConsumeTopLevelBuilder {
111    consumer: Option<solana_pubkey::Pubkey>,
112    permission_config: Option<solana_pubkey::Pubkey>,
113    consumed_permission: Option<solana_pubkey::Pubkey>,
114    system_program: Option<solana_pubkey::Pubkey>,
115    instructions: Option<solana_pubkey::Pubkey>,
116    permission_message: Option<PermissionMessage>,
117    permission_signature: Option<PermissionSignature>,
118    __remaining_accounts: Vec<solana_instruction::AccountMeta>,
119}
120
121impl PermissionConsumeTopLevelBuilder {
122    pub fn new() -> Self {
123        Self::default()
124    }
125    /// The consumer of the permission
126    #[inline(always)]
127    pub fn consumer(&mut self, consumer: solana_pubkey::Pubkey) -> &mut Self {
128        self.consumer = Some(consumer);
129        self
130    }
131    /// The permission config account
132    #[inline(always)]
133    pub fn permission_config(&mut self, permission_config: solana_pubkey::Pubkey) -> &mut Self {
134        self.permission_config = Some(permission_config);
135        self
136    }
137    /// The permission program account
138    #[inline(always)]
139    pub fn consumed_permission(&mut self, consumed_permission: solana_pubkey::Pubkey) -> &mut Self {
140        self.consumed_permission = Some(consumed_permission);
141        self
142    }
143    /// `[optional account, default to '11111111111111111111111111111111']`
144    /// System program
145    #[inline(always)]
146    pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self {
147        self.system_program = Some(system_program);
148        self
149    }
150    /// Sysvar instructions
151    #[inline(always)]
152    pub fn instructions(&mut self, instructions: solana_pubkey::Pubkey) -> &mut Self {
153        self.instructions = Some(instructions);
154        self
155    }
156    #[inline(always)]
157    pub fn permission_message(&mut self, permission_message: PermissionMessage) -> &mut Self {
158        self.permission_message = Some(permission_message);
159        self
160    }
161    #[inline(always)]
162    pub fn permission_signature(&mut self, permission_signature: PermissionSignature) -> &mut Self {
163        self.permission_signature = Some(permission_signature);
164        self
165    }
166    /// Add an additional account to the instruction.
167    #[inline(always)]
168    pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
169        self.__remaining_accounts.push(account);
170        self
171    }
172    /// Add additional accounts to the instruction.
173    #[inline(always)]
174    pub fn add_remaining_accounts(
175        &mut self,
176        accounts: &[solana_instruction::AccountMeta],
177    ) -> &mut Self {
178        self.__remaining_accounts.extend_from_slice(accounts);
179        self
180    }
181    #[allow(clippy::clone_on_copy)]
182    pub fn instruction(&self) -> solana_instruction::Instruction {
183        let accounts = PermissionConsumeTopLevel {
184            consumer: self.consumer.expect("consumer is not set"),
185            permission_config: self
186                .permission_config
187                .expect("permission_config is not set"),
188            consumed_permission: self
189                .consumed_permission
190                .expect("consumed_permission is not set"),
191            system_program: self
192                .system_program
193                .unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")),
194            instructions: self.instructions.expect("instructions is not set"),
195        };
196        let args = PermissionConsumeTopLevelInstructionArgs {
197            permission_message: self
198                .permission_message
199                .clone()
200                .expect("permission_message is not set"),
201            permission_signature: self
202                .permission_signature
203                .clone()
204                .expect("permission_signature is not set"),
205        };
206
207        accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
208    }
209}
210
211/// `permission_consume_top_level` CPI accounts.
212pub struct PermissionConsumeTopLevelCpiAccounts<'a, 'b> {
213    /// The consumer of the permission
214    pub consumer: &'b solana_account_info::AccountInfo<'a>,
215    /// The permission config account
216    pub permission_config: &'b solana_account_info::AccountInfo<'a>,
217    /// The permission program account
218    pub consumed_permission: &'b solana_account_info::AccountInfo<'a>,
219    /// System program
220    pub system_program: &'b solana_account_info::AccountInfo<'a>,
221    /// Sysvar instructions
222    pub instructions: &'b solana_account_info::AccountInfo<'a>,
223}
224
225/// `permission_consume_top_level` CPI instruction.
226pub struct PermissionConsumeTopLevelCpi<'a, 'b> {
227    /// The program to invoke.
228    pub __program: &'b solana_account_info::AccountInfo<'a>,
229    /// The consumer of the permission
230    pub consumer: &'b solana_account_info::AccountInfo<'a>,
231    /// The permission config account
232    pub permission_config: &'b solana_account_info::AccountInfo<'a>,
233    /// The permission program account
234    pub consumed_permission: &'b solana_account_info::AccountInfo<'a>,
235    /// System program
236    pub system_program: &'b solana_account_info::AccountInfo<'a>,
237    /// Sysvar instructions
238    pub instructions: &'b solana_account_info::AccountInfo<'a>,
239    /// The arguments for the instruction.
240    pub __args: PermissionConsumeTopLevelInstructionArgs,
241}
242
243impl<'a, 'b> PermissionConsumeTopLevelCpi<'a, 'b> {
244    pub fn new(
245        program: &'b solana_account_info::AccountInfo<'a>,
246        accounts: PermissionConsumeTopLevelCpiAccounts<'a, 'b>,
247        args: PermissionConsumeTopLevelInstructionArgs,
248    ) -> Self {
249        Self {
250            __program: program,
251            consumer: accounts.consumer,
252            permission_config: accounts.permission_config,
253            consumed_permission: accounts.consumed_permission,
254            system_program: accounts.system_program,
255            instructions: accounts.instructions,
256            __args: args,
257        }
258    }
259    #[inline(always)]
260    pub fn invoke(&self) -> solana_program_error::ProgramResult {
261        self.invoke_signed_with_remaining_accounts(&[], &[])
262    }
263    #[inline(always)]
264    pub fn invoke_with_remaining_accounts(
265        &self,
266        remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
267    ) -> solana_program_error::ProgramResult {
268        self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
269    }
270    #[inline(always)]
271    pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
272        self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
273    }
274    #[allow(clippy::arithmetic_side_effects)]
275    #[allow(clippy::clone_on_copy)]
276    #[allow(clippy::vec_init_then_push)]
277    pub fn invoke_signed_with_remaining_accounts(
278        &self,
279        signers_seeds: &[&[&[u8]]],
280        remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
281    ) -> solana_program_error::ProgramResult {
282        let mut accounts = Vec::with_capacity(5 + remaining_accounts.len());
283        accounts.push(solana_instruction::AccountMeta::new(
284            *self.consumer.key,
285            true,
286        ));
287        accounts.push(solana_instruction::AccountMeta::new_readonly(
288            *self.permission_config.key,
289            false,
290        ));
291        accounts.push(solana_instruction::AccountMeta::new(
292            *self.consumed_permission.key,
293            false,
294        ));
295        accounts.push(solana_instruction::AccountMeta::new_readonly(
296            *self.system_program.key,
297            false,
298        ));
299        accounts.push(solana_instruction::AccountMeta::new_readonly(
300            *self.instructions.key,
301            false,
302        ));
303        remaining_accounts.iter().for_each(|remaining_account| {
304            accounts.push(solana_instruction::AccountMeta {
305                pubkey: *remaining_account.0.key,
306                is_signer: remaining_account.1,
307                is_writable: remaining_account.2,
308            })
309        });
310        let mut data = borsh::to_vec(&PermissionConsumeTopLevelInstructionData::new()).unwrap();
311        let mut args = borsh::to_vec(&self.__args).unwrap();
312        data.append(&mut args);
313
314        let instruction = solana_instruction::Instruction {
315            program_id: crate::WAVEBREAK_ID,
316            accounts,
317            data,
318        };
319        let mut account_infos = Vec::with_capacity(6 + remaining_accounts.len());
320        account_infos.push(self.__program.clone());
321        account_infos.push(self.consumer.clone());
322        account_infos.push(self.permission_config.clone());
323        account_infos.push(self.consumed_permission.clone());
324        account_infos.push(self.system_program.clone());
325        account_infos.push(self.instructions.clone());
326        remaining_accounts
327            .iter()
328            .for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
329
330        if signers_seeds.is_empty() {
331            solana_cpi::invoke(&instruction, &account_infos)
332        } else {
333            solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
334        }
335    }
336}
337
338/// Instruction builder for `PermissionConsumeTopLevel` via CPI.
339///
340/// ### Accounts:
341///
342///   0. `[writable, signer]` consumer
343///   1. `[]` permission_config
344///   2. `[writable]` consumed_permission
345///   3. `[]` system_program
346///   4. `[]` instructions
347#[derive(Clone, Debug)]
348pub struct PermissionConsumeTopLevelCpiBuilder<'a, 'b> {
349    instruction: Box<PermissionConsumeTopLevelCpiBuilderInstruction<'a, 'b>>,
350}
351
352impl<'a, 'b> PermissionConsumeTopLevelCpiBuilder<'a, 'b> {
353    pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
354        let instruction = Box::new(PermissionConsumeTopLevelCpiBuilderInstruction {
355            __program: program,
356            consumer: None,
357            permission_config: None,
358            consumed_permission: None,
359            system_program: None,
360            instructions: None,
361            permission_message: None,
362            permission_signature: None,
363            __remaining_accounts: Vec::new(),
364        });
365        Self { instruction }
366    }
367    /// The consumer of the permission
368    #[inline(always)]
369    pub fn consumer(&mut self, consumer: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
370        self.instruction.consumer = Some(consumer);
371        self
372    }
373    /// The permission config account
374    #[inline(always)]
375    pub fn permission_config(
376        &mut self,
377        permission_config: &'b solana_account_info::AccountInfo<'a>,
378    ) -> &mut Self {
379        self.instruction.permission_config = Some(permission_config);
380        self
381    }
382    /// The permission program account
383    #[inline(always)]
384    pub fn consumed_permission(
385        &mut self,
386        consumed_permission: &'b solana_account_info::AccountInfo<'a>,
387    ) -> &mut Self {
388        self.instruction.consumed_permission = Some(consumed_permission);
389        self
390    }
391    /// System program
392    #[inline(always)]
393    pub fn system_program(
394        &mut self,
395        system_program: &'b solana_account_info::AccountInfo<'a>,
396    ) -> &mut Self {
397        self.instruction.system_program = Some(system_program);
398        self
399    }
400    /// Sysvar instructions
401    #[inline(always)]
402    pub fn instructions(
403        &mut self,
404        instructions: &'b solana_account_info::AccountInfo<'a>,
405    ) -> &mut Self {
406        self.instruction.instructions = Some(instructions);
407        self
408    }
409    #[inline(always)]
410    pub fn permission_message(&mut self, permission_message: PermissionMessage) -> &mut Self {
411        self.instruction.permission_message = Some(permission_message);
412        self
413    }
414    #[inline(always)]
415    pub fn permission_signature(&mut self, permission_signature: PermissionSignature) -> &mut Self {
416        self.instruction.permission_signature = Some(permission_signature);
417        self
418    }
419    /// Add an additional account to the instruction.
420    #[inline(always)]
421    pub fn add_remaining_account(
422        &mut self,
423        account: &'b solana_account_info::AccountInfo<'a>,
424        is_writable: bool,
425        is_signer: bool,
426    ) -> &mut Self {
427        self.instruction
428            .__remaining_accounts
429            .push((account, is_writable, is_signer));
430        self
431    }
432    /// Add additional accounts to the instruction.
433    ///
434    /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not,
435    /// and a `bool` indicating whether the account is a signer or not.
436    #[inline(always)]
437    pub fn add_remaining_accounts(
438        &mut self,
439        accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
440    ) -> &mut Self {
441        self.instruction
442            .__remaining_accounts
443            .extend_from_slice(accounts);
444        self
445    }
446    #[inline(always)]
447    pub fn invoke(&self) -> solana_program_error::ProgramResult {
448        self.invoke_signed(&[])
449    }
450    #[allow(clippy::clone_on_copy)]
451    #[allow(clippy::vec_init_then_push)]
452    pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
453        let args = PermissionConsumeTopLevelInstructionArgs {
454            permission_message: self
455                .instruction
456                .permission_message
457                .clone()
458                .expect("permission_message is not set"),
459            permission_signature: self
460                .instruction
461                .permission_signature
462                .clone()
463                .expect("permission_signature is not set"),
464        };
465        let instruction = PermissionConsumeTopLevelCpi {
466            __program: self.instruction.__program,
467
468            consumer: self.instruction.consumer.expect("consumer is not set"),
469
470            permission_config: self
471                .instruction
472                .permission_config
473                .expect("permission_config is not set"),
474
475            consumed_permission: self
476                .instruction
477                .consumed_permission
478                .expect("consumed_permission is not set"),
479
480            system_program: self
481                .instruction
482                .system_program
483                .expect("system_program is not set"),
484
485            instructions: self
486                .instruction
487                .instructions
488                .expect("instructions is not set"),
489            __args: args,
490        };
491        instruction.invoke_signed_with_remaining_accounts(
492            signers_seeds,
493            &self.instruction.__remaining_accounts,
494        )
495    }
496}
497
498#[derive(Clone, Debug)]
499struct PermissionConsumeTopLevelCpiBuilderInstruction<'a, 'b> {
500    __program: &'b solana_account_info::AccountInfo<'a>,
501    consumer: Option<&'b solana_account_info::AccountInfo<'a>>,
502    permission_config: Option<&'b solana_account_info::AccountInfo<'a>>,
503    consumed_permission: Option<&'b solana_account_info::AccountInfo<'a>>,
504    system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
505    instructions: Option<&'b solana_account_info::AccountInfo<'a>>,
506    permission_message: Option<PermissionMessage>,
507    permission_signature: Option<PermissionSignature>,
508    /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`.
509    __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
510}