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