defituna_client/generated/instructions/
collect_and_compound_fees_fusion.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::RemainingAccountsInfo;
9use borsh::BorshSerialize;
10use borsh::BorshDeserialize;
11
12pub const COLLECT_AND_COMPOUND_FEES_FUSION_DISCRIMINATOR: [u8; 8] = [61, 213, 30, 201, 89, 220, 156, 13];
13
14/// Accounts.
15#[derive(Debug)]
16pub struct CollectAndCompoundFeesFusion {
17            /// 
18/// TUNA accounts
19/// 
20
21    
22              
23          pub authority: solana_pubkey::Pubkey,
24          
25              
26          pub tuna_config: solana_pubkey::Pubkey,
27          
28              
29          pub mint_a: solana_pubkey::Pubkey,
30          
31              
32          pub mint_b: solana_pubkey::Pubkey,
33          
34              
35          pub token_program_a: solana_pubkey::Pubkey,
36          
37              
38          pub token_program_b: solana_pubkey::Pubkey,
39          
40              
41          pub market: solana_pubkey::Pubkey,
42          
43              
44          pub vault_a: solana_pubkey::Pubkey,
45          
46              
47          pub vault_b: solana_pubkey::Pubkey,
48          
49              
50          pub vault_a_ata: solana_pubkey::Pubkey,
51          
52              
53          pub vault_b_ata: solana_pubkey::Pubkey,
54          
55              
56          pub tuna_position: solana_pubkey::Pubkey,
57          
58              
59          pub tuna_position_ata: solana_pubkey::Pubkey,
60          
61              
62          pub tuna_position_ata_a: solana_pubkey::Pubkey,
63          
64              
65          pub tuna_position_ata_b: solana_pubkey::Pubkey,
66          
67              
68          pub fee_recipient_ata_a: solana_pubkey::Pubkey,
69          
70              
71          pub fee_recipient_ata_b: solana_pubkey::Pubkey,
72          
73              
74          pub pyth_oracle_price_feed_a: solana_pubkey::Pubkey,
75          
76              
77          pub pyth_oracle_price_feed_b: solana_pubkey::Pubkey,
78                /// 
79/// Fusion accounts
80/// 
81
82    
83              
84          pub fusionamm_program: solana_pubkey::Pubkey,
85          
86              
87          pub fusion_pool: solana_pubkey::Pubkey,
88          
89              
90          pub fusion_position: solana_pubkey::Pubkey,
91          
92              
93          pub memo_program: solana_pubkey::Pubkey,
94      }
95
96impl CollectAndCompoundFeesFusion {
97  pub fn instruction(&self, args: CollectAndCompoundFeesFusionInstructionArgs) -> solana_instruction::Instruction {
98    self.instruction_with_remaining_accounts(args, &[])
99  }
100  #[allow(clippy::arithmetic_side_effects)]
101  #[allow(clippy::vec_init_then_push)]
102  pub fn instruction_with_remaining_accounts(&self, args: CollectAndCompoundFeesFusionInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
103    let mut accounts = Vec::with_capacity(23+ remaining_accounts.len());
104                            accounts.push(solana_instruction::AccountMeta::new(
105            self.authority,
106            true
107          ));
108                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
109            self.tuna_config,
110            false
111          ));
112                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
113            self.mint_a,
114            false
115          ));
116                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
117            self.mint_b,
118            false
119          ));
120                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
121            self.token_program_a,
122            false
123          ));
124                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
125            self.token_program_b,
126            false
127          ));
128                                          accounts.push(solana_instruction::AccountMeta::new(
129            self.market,
130            false
131          ));
132                                          accounts.push(solana_instruction::AccountMeta::new(
133            self.vault_a,
134            false
135          ));
136                                          accounts.push(solana_instruction::AccountMeta::new(
137            self.vault_b,
138            false
139          ));
140                                          accounts.push(solana_instruction::AccountMeta::new(
141            self.vault_a_ata,
142            false
143          ));
144                                          accounts.push(solana_instruction::AccountMeta::new(
145            self.vault_b_ata,
146            false
147          ));
148                                          accounts.push(solana_instruction::AccountMeta::new(
149            self.tuna_position,
150            false
151          ));
152                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
153            self.tuna_position_ata,
154            false
155          ));
156                                          accounts.push(solana_instruction::AccountMeta::new(
157            self.tuna_position_ata_a,
158            false
159          ));
160                                          accounts.push(solana_instruction::AccountMeta::new(
161            self.tuna_position_ata_b,
162            false
163          ));
164                                          accounts.push(solana_instruction::AccountMeta::new(
165            self.fee_recipient_ata_a,
166            false
167          ));
168                                          accounts.push(solana_instruction::AccountMeta::new(
169            self.fee_recipient_ata_b,
170            false
171          ));
172                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
173            self.pyth_oracle_price_feed_a,
174            false
175          ));
176                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
177            self.pyth_oracle_price_feed_b,
178            false
179          ));
180                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
181            self.fusionamm_program,
182            false
183          ));
184                                          accounts.push(solana_instruction::AccountMeta::new(
185            self.fusion_pool,
186            false
187          ));
188                                          accounts.push(solana_instruction::AccountMeta::new(
189            self.fusion_position,
190            false
191          ));
192                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
193            self.memo_program,
194            false
195          ));
196                      accounts.extend_from_slice(remaining_accounts);
197    let mut data = borsh::to_vec(&CollectAndCompoundFeesFusionInstructionData::new()).unwrap();
198          let mut args = borsh::to_vec(&args).unwrap();
199      data.append(&mut args);
200    
201    solana_instruction::Instruction {
202      program_id: crate::TUNA_ID,
203      accounts,
204      data,
205    }
206  }
207}
208
209#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
210#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
211 pub struct CollectAndCompoundFeesFusionInstructionData {
212            discriminator: [u8; 8],
213                  }
214
215impl CollectAndCompoundFeesFusionInstructionData {
216  pub fn new() -> Self {
217    Self {
218                        discriminator: [61, 213, 30, 201, 89, 220, 156, 13],
219                                              }
220  }
221}
222
223impl Default for CollectAndCompoundFeesFusionInstructionData {
224  fn default() -> Self {
225    Self::new()
226  }
227}
228
229#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
230#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
231 pub struct CollectAndCompoundFeesFusionInstructionArgs {
232                  pub use_leverage: bool,
233                pub remaining_accounts_info: RemainingAccountsInfo,
234      }
235
236
237/// Instruction builder for `CollectAndCompoundFeesFusion`.
238///
239/// ### Accounts:
240///
241                      ///   0. `[writable, signer]` authority
242          ///   1. `[]` tuna_config
243          ///   2. `[]` mint_a
244          ///   3. `[]` mint_b
245          ///   4. `[]` token_program_a
246          ///   5. `[]` token_program_b
247                ///   6. `[writable]` market
248                ///   7. `[writable]` vault_a
249                ///   8. `[writable]` vault_b
250                ///   9. `[writable]` vault_a_ata
251                ///   10. `[writable]` vault_b_ata
252                ///   11. `[writable]` tuna_position
253          ///   12. `[]` tuna_position_ata
254                ///   13. `[writable]` tuna_position_ata_a
255                ///   14. `[writable]` tuna_position_ata_b
256                ///   15. `[writable]` fee_recipient_ata_a
257                ///   16. `[writable]` fee_recipient_ata_b
258          ///   17. `[]` pyth_oracle_price_feed_a
259          ///   18. `[]` pyth_oracle_price_feed_b
260          ///   19. `[]` fusionamm_program
261                ///   20. `[writable]` fusion_pool
262                ///   21. `[writable]` fusion_position
263          ///   22. `[]` memo_program
264#[derive(Clone, Debug, Default)]
265pub struct CollectAndCompoundFeesFusionBuilder {
266            authority: Option<solana_pubkey::Pubkey>,
267                tuna_config: Option<solana_pubkey::Pubkey>,
268                mint_a: Option<solana_pubkey::Pubkey>,
269                mint_b: Option<solana_pubkey::Pubkey>,
270                token_program_a: Option<solana_pubkey::Pubkey>,
271                token_program_b: Option<solana_pubkey::Pubkey>,
272                market: Option<solana_pubkey::Pubkey>,
273                vault_a: Option<solana_pubkey::Pubkey>,
274                vault_b: Option<solana_pubkey::Pubkey>,
275                vault_a_ata: Option<solana_pubkey::Pubkey>,
276                vault_b_ata: Option<solana_pubkey::Pubkey>,
277                tuna_position: Option<solana_pubkey::Pubkey>,
278                tuna_position_ata: Option<solana_pubkey::Pubkey>,
279                tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
280                tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
281                fee_recipient_ata_a: Option<solana_pubkey::Pubkey>,
282                fee_recipient_ata_b: Option<solana_pubkey::Pubkey>,
283                pyth_oracle_price_feed_a: Option<solana_pubkey::Pubkey>,
284                pyth_oracle_price_feed_b: Option<solana_pubkey::Pubkey>,
285                fusionamm_program: Option<solana_pubkey::Pubkey>,
286                fusion_pool: Option<solana_pubkey::Pubkey>,
287                fusion_position: Option<solana_pubkey::Pubkey>,
288                memo_program: Option<solana_pubkey::Pubkey>,
289                        use_leverage: Option<bool>,
290                remaining_accounts_info: Option<RemainingAccountsInfo>,
291        __remaining_accounts: Vec<solana_instruction::AccountMeta>,
292}
293
294impl CollectAndCompoundFeesFusionBuilder {
295  pub fn new() -> Self {
296    Self::default()
297  }
298            /// 
299/// TUNA accounts
300/// 
301#[inline(always)]
302    pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
303                        self.authority = Some(authority);
304                    self
305    }
306            #[inline(always)]
307    pub fn tuna_config(&mut self, tuna_config: solana_pubkey::Pubkey) -> &mut Self {
308                        self.tuna_config = Some(tuna_config);
309                    self
310    }
311            #[inline(always)]
312    pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
313                        self.mint_a = Some(mint_a);
314                    self
315    }
316            #[inline(always)]
317    pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
318                        self.mint_b = Some(mint_b);
319                    self
320    }
321            #[inline(always)]
322    pub fn token_program_a(&mut self, token_program_a: solana_pubkey::Pubkey) -> &mut Self {
323                        self.token_program_a = Some(token_program_a);
324                    self
325    }
326            #[inline(always)]
327    pub fn token_program_b(&mut self, token_program_b: solana_pubkey::Pubkey) -> &mut Self {
328                        self.token_program_b = Some(token_program_b);
329                    self
330    }
331            #[inline(always)]
332    pub fn market(&mut self, market: solana_pubkey::Pubkey) -> &mut Self {
333                        self.market = Some(market);
334                    self
335    }
336            #[inline(always)]
337    pub fn vault_a(&mut self, vault_a: solana_pubkey::Pubkey) -> &mut Self {
338                        self.vault_a = Some(vault_a);
339                    self
340    }
341            #[inline(always)]
342    pub fn vault_b(&mut self, vault_b: solana_pubkey::Pubkey) -> &mut Self {
343                        self.vault_b = Some(vault_b);
344                    self
345    }
346            #[inline(always)]
347    pub fn vault_a_ata(&mut self, vault_a_ata: solana_pubkey::Pubkey) -> &mut Self {
348                        self.vault_a_ata = Some(vault_a_ata);
349                    self
350    }
351            #[inline(always)]
352    pub fn vault_b_ata(&mut self, vault_b_ata: solana_pubkey::Pubkey) -> &mut Self {
353                        self.vault_b_ata = Some(vault_b_ata);
354                    self
355    }
356            #[inline(always)]
357    pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
358                        self.tuna_position = Some(tuna_position);
359                    self
360    }
361            #[inline(always)]
362    pub fn tuna_position_ata(&mut self, tuna_position_ata: solana_pubkey::Pubkey) -> &mut Self {
363                        self.tuna_position_ata = Some(tuna_position_ata);
364                    self
365    }
366            #[inline(always)]
367    pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
368                        self.tuna_position_ata_a = Some(tuna_position_ata_a);
369                    self
370    }
371            #[inline(always)]
372    pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
373                        self.tuna_position_ata_b = Some(tuna_position_ata_b);
374                    self
375    }
376            #[inline(always)]
377    pub fn fee_recipient_ata_a(&mut self, fee_recipient_ata_a: solana_pubkey::Pubkey) -> &mut Self {
378                        self.fee_recipient_ata_a = Some(fee_recipient_ata_a);
379                    self
380    }
381            #[inline(always)]
382    pub fn fee_recipient_ata_b(&mut self, fee_recipient_ata_b: solana_pubkey::Pubkey) -> &mut Self {
383                        self.fee_recipient_ata_b = Some(fee_recipient_ata_b);
384                    self
385    }
386            #[inline(always)]
387    pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: solana_pubkey::Pubkey) -> &mut Self {
388                        self.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
389                    self
390    }
391            #[inline(always)]
392    pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: solana_pubkey::Pubkey) -> &mut Self {
393                        self.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
394                    self
395    }
396            /// 
397/// Fusion accounts
398/// 
399#[inline(always)]
400    pub fn fusionamm_program(&mut self, fusionamm_program: solana_pubkey::Pubkey) -> &mut Self {
401                        self.fusionamm_program = Some(fusionamm_program);
402                    self
403    }
404            #[inline(always)]
405    pub fn fusion_pool(&mut self, fusion_pool: solana_pubkey::Pubkey) -> &mut Self {
406                        self.fusion_pool = Some(fusion_pool);
407                    self
408    }
409            #[inline(always)]
410    pub fn fusion_position(&mut self, fusion_position: solana_pubkey::Pubkey) -> &mut Self {
411                        self.fusion_position = Some(fusion_position);
412                    self
413    }
414            #[inline(always)]
415    pub fn memo_program(&mut self, memo_program: solana_pubkey::Pubkey) -> &mut Self {
416                        self.memo_program = Some(memo_program);
417                    self
418    }
419                    #[inline(always)]
420      pub fn use_leverage(&mut self, use_leverage: bool) -> &mut Self {
421        self.use_leverage = Some(use_leverage);
422        self
423      }
424                #[inline(always)]
425      pub fn remaining_accounts_info(&mut self, remaining_accounts_info: RemainingAccountsInfo) -> &mut Self {
426        self.remaining_accounts_info = Some(remaining_accounts_info);
427        self
428      }
429        /// Add an additional account to the instruction.
430  #[inline(always)]
431  pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
432    self.__remaining_accounts.push(account);
433    self
434  }
435  /// Add additional accounts to the instruction.
436  #[inline(always)]
437  pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
438    self.__remaining_accounts.extend_from_slice(accounts);
439    self
440  }
441  #[allow(clippy::clone_on_copy)]
442  pub fn instruction(&self) -> solana_instruction::Instruction {
443    let accounts = CollectAndCompoundFeesFusion {
444                              authority: self.authority.expect("authority is not set"),
445                                        tuna_config: self.tuna_config.expect("tuna_config is not set"),
446                                        mint_a: self.mint_a.expect("mint_a is not set"),
447                                        mint_b: self.mint_b.expect("mint_b is not set"),
448                                        token_program_a: self.token_program_a.expect("token_program_a is not set"),
449                                        token_program_b: self.token_program_b.expect("token_program_b is not set"),
450                                        market: self.market.expect("market is not set"),
451                                        vault_a: self.vault_a.expect("vault_a is not set"),
452                                        vault_b: self.vault_b.expect("vault_b is not set"),
453                                        vault_a_ata: self.vault_a_ata.expect("vault_a_ata is not set"),
454                                        vault_b_ata: self.vault_b_ata.expect("vault_b_ata is not set"),
455                                        tuna_position: self.tuna_position.expect("tuna_position is not set"),
456                                        tuna_position_ata: self.tuna_position_ata.expect("tuna_position_ata is not set"),
457                                        tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
458                                        tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
459                                        fee_recipient_ata_a: self.fee_recipient_ata_a.expect("fee_recipient_ata_a is not set"),
460                                        fee_recipient_ata_b: self.fee_recipient_ata_b.expect("fee_recipient_ata_b is not set"),
461                                        pyth_oracle_price_feed_a: self.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
462                                        pyth_oracle_price_feed_b: self.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
463                                        fusionamm_program: self.fusionamm_program.expect("fusionamm_program is not set"),
464                                        fusion_pool: self.fusion_pool.expect("fusion_pool is not set"),
465                                        fusion_position: self.fusion_position.expect("fusion_position is not set"),
466                                        memo_program: self.memo_program.expect("memo_program is not set"),
467                      };
468          let args = CollectAndCompoundFeesFusionInstructionArgs {
469                                                              use_leverage: self.use_leverage.clone().expect("use_leverage is not set"),
470                                                                  remaining_accounts_info: self.remaining_accounts_info.clone().expect("remaining_accounts_info is not set"),
471                                    };
472    
473    accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
474  }
475}
476
477  /// `collect_and_compound_fees_fusion` CPI accounts.
478  pub struct CollectAndCompoundFeesFusionCpiAccounts<'a, 'b> {
479                  /// 
480/// TUNA accounts
481/// 
482
483      
484                    
485              pub authority: &'b solana_account_info::AccountInfo<'a>,
486                
487                    
488              pub tuna_config: &'b solana_account_info::AccountInfo<'a>,
489                
490                    
491              pub mint_a: &'b solana_account_info::AccountInfo<'a>,
492                
493                    
494              pub mint_b: &'b solana_account_info::AccountInfo<'a>,
495                
496                    
497              pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
498                
499                    
500              pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
501                
502                    
503              pub market: &'b solana_account_info::AccountInfo<'a>,
504                
505                    
506              pub vault_a: &'b solana_account_info::AccountInfo<'a>,
507                
508                    
509              pub vault_b: &'b solana_account_info::AccountInfo<'a>,
510                
511                    
512              pub vault_a_ata: &'b solana_account_info::AccountInfo<'a>,
513                
514                    
515              pub vault_b_ata: &'b solana_account_info::AccountInfo<'a>,
516                
517                    
518              pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
519                
520                    
521              pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
522                
523                    
524              pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
525                
526                    
527              pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
528                
529                    
530              pub fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>,
531                
532                    
533              pub fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>,
534                
535                    
536              pub pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>,
537                
538                    
539              pub pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>,
540                        /// 
541/// Fusion accounts
542/// 
543
544      
545                    
546              pub fusionamm_program: &'b solana_account_info::AccountInfo<'a>,
547                
548                    
549              pub fusion_pool: &'b solana_account_info::AccountInfo<'a>,
550                
551                    
552              pub fusion_position: &'b solana_account_info::AccountInfo<'a>,
553                
554                    
555              pub memo_program: &'b solana_account_info::AccountInfo<'a>,
556            }
557
558/// `collect_and_compound_fees_fusion` CPI instruction.
559pub struct CollectAndCompoundFeesFusionCpi<'a, 'b> {
560  /// The program to invoke.
561  pub __program: &'b solana_account_info::AccountInfo<'a>,
562            /// 
563/// TUNA accounts
564/// 
565
566    
567              
568          pub authority: &'b solana_account_info::AccountInfo<'a>,
569          
570              
571          pub tuna_config: &'b solana_account_info::AccountInfo<'a>,
572          
573              
574          pub mint_a: &'b solana_account_info::AccountInfo<'a>,
575          
576              
577          pub mint_b: &'b solana_account_info::AccountInfo<'a>,
578          
579              
580          pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
581          
582              
583          pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
584          
585              
586          pub market: &'b solana_account_info::AccountInfo<'a>,
587          
588              
589          pub vault_a: &'b solana_account_info::AccountInfo<'a>,
590          
591              
592          pub vault_b: &'b solana_account_info::AccountInfo<'a>,
593          
594              
595          pub vault_a_ata: &'b solana_account_info::AccountInfo<'a>,
596          
597              
598          pub vault_b_ata: &'b solana_account_info::AccountInfo<'a>,
599          
600              
601          pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
602          
603              
604          pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
605          
606              
607          pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
608          
609              
610          pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
611          
612              
613          pub fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>,
614          
615              
616          pub fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>,
617          
618              
619          pub pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>,
620          
621              
622          pub pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>,
623                /// 
624/// Fusion accounts
625/// 
626
627    
628              
629          pub fusionamm_program: &'b solana_account_info::AccountInfo<'a>,
630          
631              
632          pub fusion_pool: &'b solana_account_info::AccountInfo<'a>,
633          
634              
635          pub fusion_position: &'b solana_account_info::AccountInfo<'a>,
636          
637              
638          pub memo_program: &'b solana_account_info::AccountInfo<'a>,
639            /// The arguments for the instruction.
640    pub __args: CollectAndCompoundFeesFusionInstructionArgs,
641  }
642
643impl<'a, 'b> CollectAndCompoundFeesFusionCpi<'a, 'b> {
644  pub fn new(
645    program: &'b solana_account_info::AccountInfo<'a>,
646          accounts: CollectAndCompoundFeesFusionCpiAccounts<'a, 'b>,
647              args: CollectAndCompoundFeesFusionInstructionArgs,
648      ) -> Self {
649    Self {
650      __program: program,
651              authority: accounts.authority,
652              tuna_config: accounts.tuna_config,
653              mint_a: accounts.mint_a,
654              mint_b: accounts.mint_b,
655              token_program_a: accounts.token_program_a,
656              token_program_b: accounts.token_program_b,
657              market: accounts.market,
658              vault_a: accounts.vault_a,
659              vault_b: accounts.vault_b,
660              vault_a_ata: accounts.vault_a_ata,
661              vault_b_ata: accounts.vault_b_ata,
662              tuna_position: accounts.tuna_position,
663              tuna_position_ata: accounts.tuna_position_ata,
664              tuna_position_ata_a: accounts.tuna_position_ata_a,
665              tuna_position_ata_b: accounts.tuna_position_ata_b,
666              fee_recipient_ata_a: accounts.fee_recipient_ata_a,
667              fee_recipient_ata_b: accounts.fee_recipient_ata_b,
668              pyth_oracle_price_feed_a: accounts.pyth_oracle_price_feed_a,
669              pyth_oracle_price_feed_b: accounts.pyth_oracle_price_feed_b,
670              fusionamm_program: accounts.fusionamm_program,
671              fusion_pool: accounts.fusion_pool,
672              fusion_position: accounts.fusion_position,
673              memo_program: accounts.memo_program,
674                    __args: args,
675          }
676  }
677  #[inline(always)]
678  pub fn invoke(&self) -> solana_program_error::ProgramResult {
679    self.invoke_signed_with_remaining_accounts(&[], &[])
680  }
681  #[inline(always)]
682  pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
683    self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
684  }
685  #[inline(always)]
686  pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
687    self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
688  }
689  #[allow(clippy::arithmetic_side_effects)]
690  #[allow(clippy::clone_on_copy)]
691  #[allow(clippy::vec_init_then_push)]
692  pub fn invoke_signed_with_remaining_accounts(
693    &self,
694    signers_seeds: &[&[&[u8]]],
695    remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
696  ) -> solana_program_error::ProgramResult {
697    let mut accounts = Vec::with_capacity(23+ remaining_accounts.len());
698                            accounts.push(solana_instruction::AccountMeta::new(
699            *self.authority.key,
700            true
701          ));
702                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
703            *self.tuna_config.key,
704            false
705          ));
706                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
707            *self.mint_a.key,
708            false
709          ));
710                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
711            *self.mint_b.key,
712            false
713          ));
714                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
715            *self.token_program_a.key,
716            false
717          ));
718                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
719            *self.token_program_b.key,
720            false
721          ));
722                                          accounts.push(solana_instruction::AccountMeta::new(
723            *self.market.key,
724            false
725          ));
726                                          accounts.push(solana_instruction::AccountMeta::new(
727            *self.vault_a.key,
728            false
729          ));
730                                          accounts.push(solana_instruction::AccountMeta::new(
731            *self.vault_b.key,
732            false
733          ));
734                                          accounts.push(solana_instruction::AccountMeta::new(
735            *self.vault_a_ata.key,
736            false
737          ));
738                                          accounts.push(solana_instruction::AccountMeta::new(
739            *self.vault_b_ata.key,
740            false
741          ));
742                                          accounts.push(solana_instruction::AccountMeta::new(
743            *self.tuna_position.key,
744            false
745          ));
746                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
747            *self.tuna_position_ata.key,
748            false
749          ));
750                                          accounts.push(solana_instruction::AccountMeta::new(
751            *self.tuna_position_ata_a.key,
752            false
753          ));
754                                          accounts.push(solana_instruction::AccountMeta::new(
755            *self.tuna_position_ata_b.key,
756            false
757          ));
758                                          accounts.push(solana_instruction::AccountMeta::new(
759            *self.fee_recipient_ata_a.key,
760            false
761          ));
762                                          accounts.push(solana_instruction::AccountMeta::new(
763            *self.fee_recipient_ata_b.key,
764            false
765          ));
766                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
767            *self.pyth_oracle_price_feed_a.key,
768            false
769          ));
770                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
771            *self.pyth_oracle_price_feed_b.key,
772            false
773          ));
774                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
775            *self.fusionamm_program.key,
776            false
777          ));
778                                          accounts.push(solana_instruction::AccountMeta::new(
779            *self.fusion_pool.key,
780            false
781          ));
782                                          accounts.push(solana_instruction::AccountMeta::new(
783            *self.fusion_position.key,
784            false
785          ));
786                                          accounts.push(solana_instruction::AccountMeta::new_readonly(
787            *self.memo_program.key,
788            false
789          ));
790                      remaining_accounts.iter().for_each(|remaining_account| {
791      accounts.push(solana_instruction::AccountMeta {
792          pubkey: *remaining_account.0.key,
793          is_signer: remaining_account.1,
794          is_writable: remaining_account.2,
795      })
796    });
797    let mut data = borsh::to_vec(&CollectAndCompoundFeesFusionInstructionData::new()).unwrap();
798          let mut args = borsh::to_vec(&self.__args).unwrap();
799      data.append(&mut args);
800    
801    let instruction = solana_instruction::Instruction {
802      program_id: crate::TUNA_ID,
803      accounts,
804      data,
805    };
806    let mut account_infos = Vec::with_capacity(24 + remaining_accounts.len());
807    account_infos.push(self.__program.clone());
808                  account_infos.push(self.authority.clone());
809                        account_infos.push(self.tuna_config.clone());
810                        account_infos.push(self.mint_a.clone());
811                        account_infos.push(self.mint_b.clone());
812                        account_infos.push(self.token_program_a.clone());
813                        account_infos.push(self.token_program_b.clone());
814                        account_infos.push(self.market.clone());
815                        account_infos.push(self.vault_a.clone());
816                        account_infos.push(self.vault_b.clone());
817                        account_infos.push(self.vault_a_ata.clone());
818                        account_infos.push(self.vault_b_ata.clone());
819                        account_infos.push(self.tuna_position.clone());
820                        account_infos.push(self.tuna_position_ata.clone());
821                        account_infos.push(self.tuna_position_ata_a.clone());
822                        account_infos.push(self.tuna_position_ata_b.clone());
823                        account_infos.push(self.fee_recipient_ata_a.clone());
824                        account_infos.push(self.fee_recipient_ata_b.clone());
825                        account_infos.push(self.pyth_oracle_price_feed_a.clone());
826                        account_infos.push(self.pyth_oracle_price_feed_b.clone());
827                        account_infos.push(self.fusionamm_program.clone());
828                        account_infos.push(self.fusion_pool.clone());
829                        account_infos.push(self.fusion_position.clone());
830                        account_infos.push(self.memo_program.clone());
831              remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
832
833    if signers_seeds.is_empty() {
834      solana_cpi::invoke(&instruction, &account_infos)
835    } else {
836      solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
837    }
838  }
839}
840
841/// Instruction builder for `CollectAndCompoundFeesFusion` via CPI.
842///
843/// ### Accounts:
844///
845                      ///   0. `[writable, signer]` authority
846          ///   1. `[]` tuna_config
847          ///   2. `[]` mint_a
848          ///   3. `[]` mint_b
849          ///   4. `[]` token_program_a
850          ///   5. `[]` token_program_b
851                ///   6. `[writable]` market
852                ///   7. `[writable]` vault_a
853                ///   8. `[writable]` vault_b
854                ///   9. `[writable]` vault_a_ata
855                ///   10. `[writable]` vault_b_ata
856                ///   11. `[writable]` tuna_position
857          ///   12. `[]` tuna_position_ata
858                ///   13. `[writable]` tuna_position_ata_a
859                ///   14. `[writable]` tuna_position_ata_b
860                ///   15. `[writable]` fee_recipient_ata_a
861                ///   16. `[writable]` fee_recipient_ata_b
862          ///   17. `[]` pyth_oracle_price_feed_a
863          ///   18. `[]` pyth_oracle_price_feed_b
864          ///   19. `[]` fusionamm_program
865                ///   20. `[writable]` fusion_pool
866                ///   21. `[writable]` fusion_position
867          ///   22. `[]` memo_program
868#[derive(Clone, Debug)]
869pub struct CollectAndCompoundFeesFusionCpiBuilder<'a, 'b> {
870  instruction: Box<CollectAndCompoundFeesFusionCpiBuilderInstruction<'a, 'b>>,
871}
872
873impl<'a, 'b> CollectAndCompoundFeesFusionCpiBuilder<'a, 'b> {
874  pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
875    let instruction = Box::new(CollectAndCompoundFeesFusionCpiBuilderInstruction {
876      __program: program,
877              authority: None,
878              tuna_config: None,
879              mint_a: None,
880              mint_b: None,
881              token_program_a: None,
882              token_program_b: None,
883              market: None,
884              vault_a: None,
885              vault_b: None,
886              vault_a_ata: None,
887              vault_b_ata: None,
888              tuna_position: None,
889              tuna_position_ata: None,
890              tuna_position_ata_a: None,
891              tuna_position_ata_b: None,
892              fee_recipient_ata_a: None,
893              fee_recipient_ata_b: None,
894              pyth_oracle_price_feed_a: None,
895              pyth_oracle_price_feed_b: None,
896              fusionamm_program: None,
897              fusion_pool: None,
898              fusion_position: None,
899              memo_program: None,
900                                            use_leverage: None,
901                                remaining_accounts_info: None,
902                    __remaining_accounts: Vec::new(),
903    });
904    Self { instruction }
905  }
906      /// 
907/// TUNA accounts
908/// 
909#[inline(always)]
910    pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
911                        self.instruction.authority = Some(authority);
912                    self
913    }
914      #[inline(always)]
915    pub fn tuna_config(&mut self, tuna_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
916                        self.instruction.tuna_config = Some(tuna_config);
917                    self
918    }
919      #[inline(always)]
920    pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
921                        self.instruction.mint_a = Some(mint_a);
922                    self
923    }
924      #[inline(always)]
925    pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
926                        self.instruction.mint_b = Some(mint_b);
927                    self
928    }
929      #[inline(always)]
930    pub fn token_program_a(&mut self, token_program_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
931                        self.instruction.token_program_a = Some(token_program_a);
932                    self
933    }
934      #[inline(always)]
935    pub fn token_program_b(&mut self, token_program_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
936                        self.instruction.token_program_b = Some(token_program_b);
937                    self
938    }
939      #[inline(always)]
940    pub fn market(&mut self, market: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
941                        self.instruction.market = Some(market);
942                    self
943    }
944      #[inline(always)]
945    pub fn vault_a(&mut self, vault_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
946                        self.instruction.vault_a = Some(vault_a);
947                    self
948    }
949      #[inline(always)]
950    pub fn vault_b(&mut self, vault_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
951                        self.instruction.vault_b = Some(vault_b);
952                    self
953    }
954      #[inline(always)]
955    pub fn vault_a_ata(&mut self, vault_a_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
956                        self.instruction.vault_a_ata = Some(vault_a_ata);
957                    self
958    }
959      #[inline(always)]
960    pub fn vault_b_ata(&mut self, vault_b_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
961                        self.instruction.vault_b_ata = Some(vault_b_ata);
962                    self
963    }
964      #[inline(always)]
965    pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
966                        self.instruction.tuna_position = Some(tuna_position);
967                    self
968    }
969      #[inline(always)]
970    pub fn tuna_position_ata(&mut self, tuna_position_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
971                        self.instruction.tuna_position_ata = Some(tuna_position_ata);
972                    self
973    }
974      #[inline(always)]
975    pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
976                        self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
977                    self
978    }
979      #[inline(always)]
980    pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
981                        self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
982                    self
983    }
984      #[inline(always)]
985    pub fn fee_recipient_ata_a(&mut self, fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
986                        self.instruction.fee_recipient_ata_a = Some(fee_recipient_ata_a);
987                    self
988    }
989      #[inline(always)]
990    pub fn fee_recipient_ata_b(&mut self, fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
991                        self.instruction.fee_recipient_ata_b = Some(fee_recipient_ata_b);
992                    self
993    }
994      #[inline(always)]
995    pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
996                        self.instruction.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
997                    self
998    }
999      #[inline(always)]
1000    pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1001                        self.instruction.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
1002                    self
1003    }
1004      /// 
1005/// Fusion accounts
1006/// 
1007#[inline(always)]
1008    pub fn fusionamm_program(&mut self, fusionamm_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1009                        self.instruction.fusionamm_program = Some(fusionamm_program);
1010                    self
1011    }
1012      #[inline(always)]
1013    pub fn fusion_pool(&mut self, fusion_pool: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1014                        self.instruction.fusion_pool = Some(fusion_pool);
1015                    self
1016    }
1017      #[inline(always)]
1018    pub fn fusion_position(&mut self, fusion_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1019                        self.instruction.fusion_position = Some(fusion_position);
1020                    self
1021    }
1022      #[inline(always)]
1023    pub fn memo_program(&mut self, memo_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1024                        self.instruction.memo_program = Some(memo_program);
1025                    self
1026    }
1027                    #[inline(always)]
1028      pub fn use_leverage(&mut self, use_leverage: bool) -> &mut Self {
1029        self.instruction.use_leverage = Some(use_leverage);
1030        self
1031      }
1032                #[inline(always)]
1033      pub fn remaining_accounts_info(&mut self, remaining_accounts_info: RemainingAccountsInfo) -> &mut Self {
1034        self.instruction.remaining_accounts_info = Some(remaining_accounts_info);
1035        self
1036      }
1037        /// Add an additional account to the instruction.
1038  #[inline(always)]
1039  pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
1040    self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
1041    self
1042  }
1043  /// Add additional accounts to the instruction.
1044  ///
1045  /// Each account is represented by a tuple of the `AccountInfo`, a `bool` indicating whether the account is writable or not,
1046  /// and a `bool` indicating whether the account is a signer or not.
1047  #[inline(always)]
1048  pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
1049    self.instruction.__remaining_accounts.extend_from_slice(accounts);
1050    self
1051  }
1052  #[inline(always)]
1053  pub fn invoke(&self) -> solana_program_error::ProgramResult {
1054    self.invoke_signed(&[])
1055  }
1056  #[allow(clippy::clone_on_copy)]
1057  #[allow(clippy::vec_init_then_push)]
1058  pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
1059          let args = CollectAndCompoundFeesFusionInstructionArgs {
1060                                                              use_leverage: self.instruction.use_leverage.clone().expect("use_leverage is not set"),
1061                                                                  remaining_accounts_info: self.instruction.remaining_accounts_info.clone().expect("remaining_accounts_info is not set"),
1062                                    };
1063        let instruction = CollectAndCompoundFeesFusionCpi {
1064        __program: self.instruction.__program,
1065                  
1066          authority: self.instruction.authority.expect("authority is not set"),
1067                  
1068          tuna_config: self.instruction.tuna_config.expect("tuna_config is not set"),
1069                  
1070          mint_a: self.instruction.mint_a.expect("mint_a is not set"),
1071                  
1072          mint_b: self.instruction.mint_b.expect("mint_b is not set"),
1073                  
1074          token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
1075                  
1076          token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
1077                  
1078          market: self.instruction.market.expect("market is not set"),
1079                  
1080          vault_a: self.instruction.vault_a.expect("vault_a is not set"),
1081                  
1082          vault_b: self.instruction.vault_b.expect("vault_b is not set"),
1083                  
1084          vault_a_ata: self.instruction.vault_a_ata.expect("vault_a_ata is not set"),
1085                  
1086          vault_b_ata: self.instruction.vault_b_ata.expect("vault_b_ata is not set"),
1087                  
1088          tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
1089                  
1090          tuna_position_ata: self.instruction.tuna_position_ata.expect("tuna_position_ata is not set"),
1091                  
1092          tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
1093                  
1094          tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
1095                  
1096          fee_recipient_ata_a: self.instruction.fee_recipient_ata_a.expect("fee_recipient_ata_a is not set"),
1097                  
1098          fee_recipient_ata_b: self.instruction.fee_recipient_ata_b.expect("fee_recipient_ata_b is not set"),
1099                  
1100          pyth_oracle_price_feed_a: self.instruction.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
1101                  
1102          pyth_oracle_price_feed_b: self.instruction.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
1103                  
1104          fusionamm_program: self.instruction.fusionamm_program.expect("fusionamm_program is not set"),
1105                  
1106          fusion_pool: self.instruction.fusion_pool.expect("fusion_pool is not set"),
1107                  
1108          fusion_position: self.instruction.fusion_position.expect("fusion_position is not set"),
1109                  
1110          memo_program: self.instruction.memo_program.expect("memo_program is not set"),
1111                          __args: args,
1112            };
1113    instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
1114  }
1115}
1116
1117#[derive(Clone, Debug)]
1118struct CollectAndCompoundFeesFusionCpiBuilderInstruction<'a, 'b> {
1119  __program: &'b solana_account_info::AccountInfo<'a>,
1120            authority: Option<&'b solana_account_info::AccountInfo<'a>>,
1121                tuna_config: Option<&'b solana_account_info::AccountInfo<'a>>,
1122                mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1123                mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1124                token_program_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1125                token_program_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1126                market: Option<&'b solana_account_info::AccountInfo<'a>>,
1127                vault_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1128                vault_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1129                vault_a_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
1130                vault_b_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
1131                tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
1132                tuna_position_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
1133                tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1134                tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1135                fee_recipient_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1136                fee_recipient_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1137                pyth_oracle_price_feed_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1138                pyth_oracle_price_feed_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1139                fusionamm_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1140                fusion_pool: Option<&'b solana_account_info::AccountInfo<'a>>,
1141                fusion_position: Option<&'b solana_account_info::AccountInfo<'a>>,
1142                memo_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1143                        use_leverage: Option<bool>,
1144                remaining_accounts_info: Option<RemainingAccountsInfo>,
1145        /// Additional instruction accounts `(AccountInfo, is_writable, is_signer)`.
1146  __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
1147}
1148