1use 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#[derive(Debug)]
16pub struct CollectAndCompoundFeesFusion {
17 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 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#[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 #[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 #[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 #[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 #[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 pub struct CollectAndCompoundFeesFusionCpiAccounts<'a, 'b> {
479 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 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
558pub struct CollectAndCompoundFeesFusionCpi<'a, 'b> {
560 pub __program: &'b solana_account_info::AccountInfo<'a>,
562 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 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 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#[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 #[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 #[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 #[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 #[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 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
1147}
1148