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