1use crate::generated::types::UseArgs;
9use borsh::BorshDeserialize;
10use borsh::BorshSerialize;
11
12pub struct Use {
14 pub authority: solana_program::pubkey::Pubkey,
16 pub delegate_record: Option<solana_program::pubkey::Pubkey>,
18 pub token: Option<solana_program::pubkey::Pubkey>,
20 pub mint: solana_program::pubkey::Pubkey,
22 pub metadata: solana_program::pubkey::Pubkey,
24 pub edition: Option<solana_program::pubkey::Pubkey>,
26 pub payer: solana_program::pubkey::Pubkey,
28 pub system_program: solana_program::pubkey::Pubkey,
30 pub sysvar_instructions: solana_program::pubkey::Pubkey,
32 pub spl_token_program: Option<solana_program::pubkey::Pubkey>,
34 pub authorization_rules_program: Option<solana_program::pubkey::Pubkey>,
36 pub authorization_rules: Option<solana_program::pubkey::Pubkey>,
38}
39
40impl Use {
41 pub fn instruction(
42 &self,
43 args: UseInstructionArgs,
44 ) -> solana_program::instruction::Instruction {
45 self.instruction_with_remaining_accounts(args, &[])
46 }
47 #[allow(clippy::vec_init_then_push)]
48 pub fn instruction_with_remaining_accounts(
49 &self,
50 args: UseInstructionArgs,
51 remaining_accounts: &[solana_program::instruction::AccountMeta],
52 ) -> solana_program::instruction::Instruction {
53 let mut accounts = Vec::with_capacity(12 + remaining_accounts.len());
54 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
55 self.authority,
56 true,
57 ));
58 if let Some(delegate_record) = self.delegate_record {
59 accounts.push(solana_program::instruction::AccountMeta::new(
60 delegate_record,
61 false,
62 ));
63 } else {
64 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
65 crate::MPL_TOKEN_METADATA_ID,
66 false,
67 ));
68 }
69 if let Some(token) = self.token {
70 accounts.push(solana_program::instruction::AccountMeta::new(token, false));
71 } else {
72 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
73 crate::MPL_TOKEN_METADATA_ID,
74 false,
75 ));
76 }
77 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
78 self.mint, false,
79 ));
80 accounts.push(solana_program::instruction::AccountMeta::new(
81 self.metadata,
82 false,
83 ));
84 if let Some(edition) = self.edition {
85 accounts.push(solana_program::instruction::AccountMeta::new(
86 edition, false,
87 ));
88 } else {
89 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
90 crate::MPL_TOKEN_METADATA_ID,
91 false,
92 ));
93 }
94 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
95 self.payer, true,
96 ));
97 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
98 self.system_program,
99 false,
100 ));
101 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
102 self.sysvar_instructions,
103 false,
104 ));
105 if let Some(spl_token_program) = self.spl_token_program {
106 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
107 spl_token_program,
108 false,
109 ));
110 } else {
111 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
112 crate::MPL_TOKEN_METADATA_ID,
113 false,
114 ));
115 }
116 if let Some(authorization_rules_program) = self.authorization_rules_program {
117 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
118 authorization_rules_program,
119 false,
120 ));
121 } else {
122 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
123 crate::MPL_TOKEN_METADATA_ID,
124 false,
125 ));
126 }
127 if let Some(authorization_rules) = self.authorization_rules {
128 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
129 authorization_rules,
130 false,
131 ));
132 } else {
133 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
134 crate::MPL_TOKEN_METADATA_ID,
135 false,
136 ));
137 }
138 accounts.extend_from_slice(remaining_accounts);
139 let mut data = UseInstructionData::new().try_to_vec().unwrap();
140 let mut args = args.try_to_vec().unwrap();
141 data.append(&mut args);
142
143 solana_program::instruction::Instruction {
144 program_id: crate::MPL_TOKEN_METADATA_ID,
145 accounts,
146 data,
147 }
148 }
149}
150
151#[derive(BorshDeserialize, BorshSerialize)]
152struct UseInstructionData {
153 discriminator: u8,
154}
155
156impl UseInstructionData {
157 fn new() -> Self {
158 Self { discriminator: 51 }
159 }
160}
161
162#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
163#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
164pub struct UseInstructionArgs {
165 pub use_args: UseArgs,
166}
167
168#[derive(Default)]
185pub struct UseBuilder {
186 authority: Option<solana_program::pubkey::Pubkey>,
187 delegate_record: Option<solana_program::pubkey::Pubkey>,
188 token: Option<solana_program::pubkey::Pubkey>,
189 mint: Option<solana_program::pubkey::Pubkey>,
190 metadata: Option<solana_program::pubkey::Pubkey>,
191 edition: Option<solana_program::pubkey::Pubkey>,
192 payer: Option<solana_program::pubkey::Pubkey>,
193 system_program: Option<solana_program::pubkey::Pubkey>,
194 sysvar_instructions: Option<solana_program::pubkey::Pubkey>,
195 spl_token_program: Option<solana_program::pubkey::Pubkey>,
196 authorization_rules_program: Option<solana_program::pubkey::Pubkey>,
197 authorization_rules: Option<solana_program::pubkey::Pubkey>,
198 use_args: Option<UseArgs>,
199 __remaining_accounts: Vec<solana_program::instruction::AccountMeta>,
200}
201
202impl UseBuilder {
203 pub fn new() -> Self {
204 Self::default()
205 }
206 #[inline(always)]
208 pub fn authority(&mut self, authority: solana_program::pubkey::Pubkey) -> &mut Self {
209 self.authority = Some(authority);
210 self
211 }
212 #[inline(always)]
215 pub fn delegate_record(
216 &mut self,
217 delegate_record: Option<solana_program::pubkey::Pubkey>,
218 ) -> &mut Self {
219 self.delegate_record = delegate_record;
220 self
221 }
222 #[inline(always)]
225 pub fn token(&mut self, token: Option<solana_program::pubkey::Pubkey>) -> &mut Self {
226 self.token = token;
227 self
228 }
229 #[inline(always)]
231 pub fn mint(&mut self, mint: solana_program::pubkey::Pubkey) -> &mut Self {
232 self.mint = Some(mint);
233 self
234 }
235 #[inline(always)]
237 pub fn metadata(&mut self, metadata: solana_program::pubkey::Pubkey) -> &mut Self {
238 self.metadata = Some(metadata);
239 self
240 }
241 #[inline(always)]
244 pub fn edition(&mut self, edition: Option<solana_program::pubkey::Pubkey>) -> &mut Self {
245 self.edition = edition;
246 self
247 }
248 #[inline(always)]
250 pub fn payer(&mut self, payer: solana_program::pubkey::Pubkey) -> &mut Self {
251 self.payer = Some(payer);
252 self
253 }
254 #[inline(always)]
257 pub fn system_program(&mut self, system_program: solana_program::pubkey::Pubkey) -> &mut Self {
258 self.system_program = Some(system_program);
259 self
260 }
261 #[inline(always)]
264 pub fn sysvar_instructions(
265 &mut self,
266 sysvar_instructions: solana_program::pubkey::Pubkey,
267 ) -> &mut Self {
268 self.sysvar_instructions = Some(sysvar_instructions);
269 self
270 }
271 #[inline(always)]
274 pub fn spl_token_program(
275 &mut self,
276 spl_token_program: Option<solana_program::pubkey::Pubkey>,
277 ) -> &mut Self {
278 self.spl_token_program = spl_token_program;
279 self
280 }
281 #[inline(always)]
284 pub fn authorization_rules_program(
285 &mut self,
286 authorization_rules_program: Option<solana_program::pubkey::Pubkey>,
287 ) -> &mut Self {
288 self.authorization_rules_program = authorization_rules_program;
289 self
290 }
291 #[inline(always)]
294 pub fn authorization_rules(
295 &mut self,
296 authorization_rules: Option<solana_program::pubkey::Pubkey>,
297 ) -> &mut Self {
298 self.authorization_rules = authorization_rules;
299 self
300 }
301 #[inline(always)]
302 pub fn use_args(&mut self, use_args: UseArgs) -> &mut Self {
303 self.use_args = Some(use_args);
304 self
305 }
306 #[inline(always)]
308 pub fn add_remaining_account(
309 &mut self,
310 account: solana_program::instruction::AccountMeta,
311 ) -> &mut Self {
312 self.__remaining_accounts.push(account);
313 self
314 }
315 #[inline(always)]
317 pub fn add_remaining_accounts(
318 &mut self,
319 accounts: &[solana_program::instruction::AccountMeta],
320 ) -> &mut Self {
321 self.__remaining_accounts.extend_from_slice(accounts);
322 self
323 }
324 #[allow(clippy::clone_on_copy)]
325 pub fn instruction(&self) -> solana_program::instruction::Instruction {
326 let accounts = Use {
327 authority: self.authority.expect("authority is not set"),
328 delegate_record: self.delegate_record,
329 token: self.token,
330 mint: self.mint.expect("mint is not set"),
331 metadata: self.metadata.expect("metadata is not set"),
332 edition: self.edition,
333 payer: self.payer.expect("payer is not set"),
334 system_program: self
335 .system_program
336 .unwrap_or(solana_program::pubkey!("11111111111111111111111111111111")),
337 sysvar_instructions: self.sysvar_instructions.unwrap_or(solana_program::pubkey!(
338 "Sysvar1nstructions1111111111111111111111111"
339 )),
340 spl_token_program: self.spl_token_program,
341 authorization_rules_program: self.authorization_rules_program,
342 authorization_rules: self.authorization_rules,
343 };
344 let args = UseInstructionArgs {
345 use_args: self.use_args.clone().expect("use_args is not set"),
346 };
347
348 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
349 }
350}
351
352pub struct UseCpiAccounts<'a, 'b> {
354 pub authority: &'b solana_program::account_info::AccountInfo<'a>,
356 pub delegate_record: Option<&'b solana_program::account_info::AccountInfo<'a>>,
358 pub token: Option<&'b solana_program::account_info::AccountInfo<'a>>,
360 pub mint: &'b solana_program::account_info::AccountInfo<'a>,
362 pub metadata: &'b solana_program::account_info::AccountInfo<'a>,
364 pub edition: Option<&'b solana_program::account_info::AccountInfo<'a>>,
366 pub payer: &'b solana_program::account_info::AccountInfo<'a>,
368 pub system_program: &'b solana_program::account_info::AccountInfo<'a>,
370 pub sysvar_instructions: &'b solana_program::account_info::AccountInfo<'a>,
372 pub spl_token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
374 pub authorization_rules_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
376 pub authorization_rules: Option<&'b solana_program::account_info::AccountInfo<'a>>,
378}
379
380pub struct UseCpi<'a, 'b> {
382 pub __program: &'b solana_program::account_info::AccountInfo<'a>,
384 pub authority: &'b solana_program::account_info::AccountInfo<'a>,
386 pub delegate_record: Option<&'b solana_program::account_info::AccountInfo<'a>>,
388 pub token: Option<&'b solana_program::account_info::AccountInfo<'a>>,
390 pub mint: &'b solana_program::account_info::AccountInfo<'a>,
392 pub metadata: &'b solana_program::account_info::AccountInfo<'a>,
394 pub edition: Option<&'b solana_program::account_info::AccountInfo<'a>>,
396 pub payer: &'b solana_program::account_info::AccountInfo<'a>,
398 pub system_program: &'b solana_program::account_info::AccountInfo<'a>,
400 pub sysvar_instructions: &'b solana_program::account_info::AccountInfo<'a>,
402 pub spl_token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
404 pub authorization_rules_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
406 pub authorization_rules: Option<&'b solana_program::account_info::AccountInfo<'a>>,
408 pub __args: UseInstructionArgs,
410}
411
412impl<'a, 'b> UseCpi<'a, 'b> {
413 pub fn new(
414 program: &'b solana_program::account_info::AccountInfo<'a>,
415 accounts: UseCpiAccounts<'a, 'b>,
416 args: UseInstructionArgs,
417 ) -> Self {
418 Self {
419 __program: program,
420 authority: accounts.authority,
421 delegate_record: accounts.delegate_record,
422 token: accounts.token,
423 mint: accounts.mint,
424 metadata: accounts.metadata,
425 edition: accounts.edition,
426 payer: accounts.payer,
427 system_program: accounts.system_program,
428 sysvar_instructions: accounts.sysvar_instructions,
429 spl_token_program: accounts.spl_token_program,
430 authorization_rules_program: accounts.authorization_rules_program,
431 authorization_rules: accounts.authorization_rules,
432 __args: args,
433 }
434 }
435 #[inline(always)]
436 pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult {
437 self.invoke_signed_with_remaining_accounts(&[], &[])
438 }
439 #[inline(always)]
440 pub fn invoke_with_remaining_accounts(
441 &self,
442 remaining_accounts: &[(
443 &'b solana_program::account_info::AccountInfo<'a>,
444 bool,
445 bool,
446 )],
447 ) -> solana_program::entrypoint::ProgramResult {
448 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
449 }
450 #[inline(always)]
451 pub fn invoke_signed(
452 &self,
453 signers_seeds: &[&[&[u8]]],
454 ) -> solana_program::entrypoint::ProgramResult {
455 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
456 }
457 #[allow(clippy::clone_on_copy)]
458 #[allow(clippy::vec_init_then_push)]
459 pub fn invoke_signed_with_remaining_accounts(
460 &self,
461 signers_seeds: &[&[&[u8]]],
462 remaining_accounts: &[(
463 &'b solana_program::account_info::AccountInfo<'a>,
464 bool,
465 bool,
466 )],
467 ) -> solana_program::entrypoint::ProgramResult {
468 let mut accounts = Vec::with_capacity(12 + remaining_accounts.len());
469 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
470 *self.authority.key,
471 true,
472 ));
473 if let Some(delegate_record) = self.delegate_record {
474 accounts.push(solana_program::instruction::AccountMeta::new(
475 *delegate_record.key,
476 false,
477 ));
478 } else {
479 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
480 crate::MPL_TOKEN_METADATA_ID,
481 false,
482 ));
483 }
484 if let Some(token) = self.token {
485 accounts.push(solana_program::instruction::AccountMeta::new(
486 *token.key, false,
487 ));
488 } else {
489 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
490 crate::MPL_TOKEN_METADATA_ID,
491 false,
492 ));
493 }
494 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
495 *self.mint.key,
496 false,
497 ));
498 accounts.push(solana_program::instruction::AccountMeta::new(
499 *self.metadata.key,
500 false,
501 ));
502 if let Some(edition) = self.edition {
503 accounts.push(solana_program::instruction::AccountMeta::new(
504 *edition.key,
505 false,
506 ));
507 } else {
508 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
509 crate::MPL_TOKEN_METADATA_ID,
510 false,
511 ));
512 }
513 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
514 *self.payer.key,
515 true,
516 ));
517 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
518 *self.system_program.key,
519 false,
520 ));
521 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
522 *self.sysvar_instructions.key,
523 false,
524 ));
525 if let Some(spl_token_program) = self.spl_token_program {
526 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
527 *spl_token_program.key,
528 false,
529 ));
530 } else {
531 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
532 crate::MPL_TOKEN_METADATA_ID,
533 false,
534 ));
535 }
536 if let Some(authorization_rules_program) = self.authorization_rules_program {
537 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
538 *authorization_rules_program.key,
539 false,
540 ));
541 } else {
542 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
543 crate::MPL_TOKEN_METADATA_ID,
544 false,
545 ));
546 }
547 if let Some(authorization_rules) = self.authorization_rules {
548 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
549 *authorization_rules.key,
550 false,
551 ));
552 } else {
553 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
554 crate::MPL_TOKEN_METADATA_ID,
555 false,
556 ));
557 }
558 remaining_accounts.iter().for_each(|remaining_account| {
559 accounts.push(solana_program::instruction::AccountMeta {
560 pubkey: *remaining_account.0.key,
561 is_signer: remaining_account.1,
562 is_writable: remaining_account.2,
563 })
564 });
565 let mut data = UseInstructionData::new().try_to_vec().unwrap();
566 let mut args = self.__args.try_to_vec().unwrap();
567 data.append(&mut args);
568
569 let instruction = solana_program::instruction::Instruction {
570 program_id: crate::MPL_TOKEN_METADATA_ID,
571 accounts,
572 data,
573 };
574 let mut account_infos = Vec::with_capacity(12 + 1 + remaining_accounts.len());
575 account_infos.push(self.__program.clone());
576 account_infos.push(self.authority.clone());
577 if let Some(delegate_record) = self.delegate_record {
578 account_infos.push(delegate_record.clone());
579 }
580 if let Some(token) = self.token {
581 account_infos.push(token.clone());
582 }
583 account_infos.push(self.mint.clone());
584 account_infos.push(self.metadata.clone());
585 if let Some(edition) = self.edition {
586 account_infos.push(edition.clone());
587 }
588 account_infos.push(self.payer.clone());
589 account_infos.push(self.system_program.clone());
590 account_infos.push(self.sysvar_instructions.clone());
591 if let Some(spl_token_program) = self.spl_token_program {
592 account_infos.push(spl_token_program.clone());
593 }
594 if let Some(authorization_rules_program) = self.authorization_rules_program {
595 account_infos.push(authorization_rules_program.clone());
596 }
597 if let Some(authorization_rules) = self.authorization_rules {
598 account_infos.push(authorization_rules.clone());
599 }
600 remaining_accounts
601 .iter()
602 .for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
603
604 if signers_seeds.is_empty() {
605 solana_program::program::invoke(&instruction, &account_infos)
606 } else {
607 solana_program::program::invoke_signed(&instruction, &account_infos, signers_seeds)
608 }
609 }
610}
611
612pub struct UseCpiBuilder<'a, 'b> {
629 instruction: Box<UseCpiBuilderInstruction<'a, 'b>>,
630}
631
632impl<'a, 'b> UseCpiBuilder<'a, 'b> {
633 pub fn new(program: &'b solana_program::account_info::AccountInfo<'a>) -> Self {
634 let instruction = Box::new(UseCpiBuilderInstruction {
635 __program: program,
636 authority: None,
637 delegate_record: None,
638 token: None,
639 mint: None,
640 metadata: None,
641 edition: None,
642 payer: None,
643 system_program: None,
644 sysvar_instructions: None,
645 spl_token_program: None,
646 authorization_rules_program: None,
647 authorization_rules: None,
648 use_args: None,
649 __remaining_accounts: Vec::new(),
650 });
651 Self { instruction }
652 }
653 #[inline(always)]
655 pub fn authority(
656 &mut self,
657 authority: &'b solana_program::account_info::AccountInfo<'a>,
658 ) -> &mut Self {
659 self.instruction.authority = Some(authority);
660 self
661 }
662 #[inline(always)]
665 pub fn delegate_record(
666 &mut self,
667 delegate_record: Option<&'b solana_program::account_info::AccountInfo<'a>>,
668 ) -> &mut Self {
669 self.instruction.delegate_record = delegate_record;
670 self
671 }
672 #[inline(always)]
675 pub fn token(
676 &mut self,
677 token: Option<&'b solana_program::account_info::AccountInfo<'a>>,
678 ) -> &mut Self {
679 self.instruction.token = token;
680 self
681 }
682 #[inline(always)]
684 pub fn mint(&mut self, mint: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
685 self.instruction.mint = Some(mint);
686 self
687 }
688 #[inline(always)]
690 pub fn metadata(
691 &mut self,
692 metadata: &'b solana_program::account_info::AccountInfo<'a>,
693 ) -> &mut Self {
694 self.instruction.metadata = Some(metadata);
695 self
696 }
697 #[inline(always)]
700 pub fn edition(
701 &mut self,
702 edition: Option<&'b solana_program::account_info::AccountInfo<'a>>,
703 ) -> &mut Self {
704 self.instruction.edition = edition;
705 self
706 }
707 #[inline(always)]
709 pub fn payer(&mut self, payer: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
710 self.instruction.payer = Some(payer);
711 self
712 }
713 #[inline(always)]
715 pub fn system_program(
716 &mut self,
717 system_program: &'b solana_program::account_info::AccountInfo<'a>,
718 ) -> &mut Self {
719 self.instruction.system_program = Some(system_program);
720 self
721 }
722 #[inline(always)]
724 pub fn sysvar_instructions(
725 &mut self,
726 sysvar_instructions: &'b solana_program::account_info::AccountInfo<'a>,
727 ) -> &mut Self {
728 self.instruction.sysvar_instructions = Some(sysvar_instructions);
729 self
730 }
731 #[inline(always)]
734 pub fn spl_token_program(
735 &mut self,
736 spl_token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
737 ) -> &mut Self {
738 self.instruction.spl_token_program = spl_token_program;
739 self
740 }
741 #[inline(always)]
744 pub fn authorization_rules_program(
745 &mut self,
746 authorization_rules_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
747 ) -> &mut Self {
748 self.instruction.authorization_rules_program = authorization_rules_program;
749 self
750 }
751 #[inline(always)]
754 pub fn authorization_rules(
755 &mut self,
756 authorization_rules: Option<&'b solana_program::account_info::AccountInfo<'a>>,
757 ) -> &mut Self {
758 self.instruction.authorization_rules = authorization_rules;
759 self
760 }
761 #[inline(always)]
762 pub fn use_args(&mut self, use_args: UseArgs) -> &mut Self {
763 self.instruction.use_args = Some(use_args);
764 self
765 }
766 #[inline(always)]
768 pub fn add_remaining_account(
769 &mut self,
770 account: &'b solana_program::account_info::AccountInfo<'a>,
771 is_writable: bool,
772 is_signer: bool,
773 ) -> &mut Self {
774 self.instruction
775 .__remaining_accounts
776 .push((account, is_writable, is_signer));
777 self
778 }
779 #[inline(always)]
784 pub fn add_remaining_accounts(
785 &mut self,
786 accounts: &[(
787 &'b solana_program::account_info::AccountInfo<'a>,
788 bool,
789 bool,
790 )],
791 ) -> &mut Self {
792 self.instruction
793 .__remaining_accounts
794 .extend_from_slice(accounts);
795 self
796 }
797 #[inline(always)]
798 pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult {
799 self.invoke_signed(&[])
800 }
801 #[allow(clippy::clone_on_copy)]
802 #[allow(clippy::vec_init_then_push)]
803 pub fn invoke_signed(
804 &self,
805 signers_seeds: &[&[&[u8]]],
806 ) -> solana_program::entrypoint::ProgramResult {
807 let args = UseInstructionArgs {
808 use_args: self
809 .instruction
810 .use_args
811 .clone()
812 .expect("use_args is not set"),
813 };
814 let instruction = UseCpi {
815 __program: self.instruction.__program,
816
817 authority: self.instruction.authority.expect("authority is not set"),
818
819 delegate_record: self.instruction.delegate_record,
820
821 token: self.instruction.token,
822
823 mint: self.instruction.mint.expect("mint is not set"),
824
825 metadata: self.instruction.metadata.expect("metadata is not set"),
826
827 edition: self.instruction.edition,
828
829 payer: self.instruction.payer.expect("payer is not set"),
830
831 system_program: self
832 .instruction
833 .system_program
834 .expect("system_program is not set"),
835
836 sysvar_instructions: self
837 .instruction
838 .sysvar_instructions
839 .expect("sysvar_instructions is not set"),
840
841 spl_token_program: self.instruction.spl_token_program,
842
843 authorization_rules_program: self.instruction.authorization_rules_program,
844
845 authorization_rules: self.instruction.authorization_rules,
846 __args: args,
847 };
848 instruction.invoke_signed_with_remaining_accounts(
849 signers_seeds,
850 &self.instruction.__remaining_accounts,
851 )
852 }
853}
854
855struct UseCpiBuilderInstruction<'a, 'b> {
856 __program: &'b solana_program::account_info::AccountInfo<'a>,
857 authority: Option<&'b solana_program::account_info::AccountInfo<'a>>,
858 delegate_record: Option<&'b solana_program::account_info::AccountInfo<'a>>,
859 token: Option<&'b solana_program::account_info::AccountInfo<'a>>,
860 mint: Option<&'b solana_program::account_info::AccountInfo<'a>>,
861 metadata: Option<&'b solana_program::account_info::AccountInfo<'a>>,
862 edition: Option<&'b solana_program::account_info::AccountInfo<'a>>,
863 payer: Option<&'b solana_program::account_info::AccountInfo<'a>>,
864 system_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
865 sysvar_instructions: Option<&'b solana_program::account_info::AccountInfo<'a>>,
866 spl_token_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
867 authorization_rules_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
868 authorization_rules: Option<&'b solana_program::account_info::AccountInfo<'a>>,
869 use_args: Option<UseArgs>,
870 __remaining_accounts: Vec<(
872 &'b solana_program::account_info::AccountInfo<'a>,
873 bool,
874 bool,
875 )>,
876}