1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const CLOSE_TUNA_LP_POSITION_ORCA_DISCRIMINATOR: [u8; 8] = [253, 98, 90, 239, 191, 36, 161, 26];
12
13#[derive(Debug)]
15pub struct CloseTunaLpPositionOrca {
16 pub authority: solana_pubkey::Pubkey,
23
24
25 pub mint_a: solana_pubkey::Pubkey,
26
27
28 pub mint_b: solana_pubkey::Pubkey,
29
30
31 pub tuna_position: solana_pubkey::Pubkey,
32
33
34 pub tuna_position_mint: solana_pubkey::Pubkey,
35
36
37 pub tuna_position_ata: solana_pubkey::Pubkey,
38
39
40 pub tuna_position_ata_a: solana_pubkey::Pubkey,
41
42
43 pub tuna_position_ata_b: solana_pubkey::Pubkey,
44 pub whirlpool_program: solana_pubkey::Pubkey,
51
52
53 pub orca_position: solana_pubkey::Pubkey,
54
55
56 pub token_program_a: solana_pubkey::Pubkey,
57
58
59 pub token_program_b: solana_pubkey::Pubkey,
60 pub token2022_program: solana_pubkey::Pubkey,
67 }
68
69impl CloseTunaLpPositionOrca {
70 pub fn instruction(&self) -> solana_instruction::Instruction {
71 self.instruction_with_remaining_accounts(&[])
72 }
73 #[allow(clippy::arithmetic_side_effects)]
74 #[allow(clippy::vec_init_then_push)]
75 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
76 let mut accounts = Vec::with_capacity(13+ remaining_accounts.len());
77 accounts.push(solana_instruction::AccountMeta::new(
78 self.authority,
79 true
80 ));
81 accounts.push(solana_instruction::AccountMeta::new_readonly(
82 self.mint_a,
83 false
84 ));
85 accounts.push(solana_instruction::AccountMeta::new_readonly(
86 self.mint_b,
87 false
88 ));
89 accounts.push(solana_instruction::AccountMeta::new(
90 self.tuna_position,
91 false
92 ));
93 accounts.push(solana_instruction::AccountMeta::new(
94 self.tuna_position_mint,
95 false
96 ));
97 accounts.push(solana_instruction::AccountMeta::new(
98 self.tuna_position_ata,
99 false
100 ));
101 accounts.push(solana_instruction::AccountMeta::new(
102 self.tuna_position_ata_a,
103 false
104 ));
105 accounts.push(solana_instruction::AccountMeta::new(
106 self.tuna_position_ata_b,
107 false
108 ));
109 accounts.push(solana_instruction::AccountMeta::new_readonly(
110 self.whirlpool_program,
111 false
112 ));
113 accounts.push(solana_instruction::AccountMeta::new(
114 self.orca_position,
115 false
116 ));
117 accounts.push(solana_instruction::AccountMeta::new_readonly(
118 self.token_program_a,
119 false
120 ));
121 accounts.push(solana_instruction::AccountMeta::new_readonly(
122 self.token_program_b,
123 false
124 ));
125 accounts.push(solana_instruction::AccountMeta::new_readonly(
126 self.token2022_program,
127 false
128 ));
129 accounts.extend_from_slice(remaining_accounts);
130 let data = borsh::to_vec(&CloseTunaLpPositionOrcaInstructionData::new()).unwrap();
131
132 solana_instruction::Instruction {
133 program_id: crate::TUNA_ID,
134 accounts,
135 data,
136 }
137 }
138}
139
140#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
141#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
142 pub struct CloseTunaLpPositionOrcaInstructionData {
143 discriminator: [u8; 8],
144 }
145
146impl CloseTunaLpPositionOrcaInstructionData {
147 pub fn new() -> Self {
148 Self {
149 discriminator: [253, 98, 90, 239, 191, 36, 161, 26],
150 }
151 }
152}
153
154impl Default for CloseTunaLpPositionOrcaInstructionData {
155 fn default() -> Self {
156 Self::new()
157 }
158}
159
160
161
162#[derive(Clone, Debug, Default)]
180pub struct CloseTunaLpPositionOrcaBuilder {
181 authority: Option<solana_pubkey::Pubkey>,
182 mint_a: Option<solana_pubkey::Pubkey>,
183 mint_b: Option<solana_pubkey::Pubkey>,
184 tuna_position: Option<solana_pubkey::Pubkey>,
185 tuna_position_mint: Option<solana_pubkey::Pubkey>,
186 tuna_position_ata: Option<solana_pubkey::Pubkey>,
187 tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
188 tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
189 whirlpool_program: Option<solana_pubkey::Pubkey>,
190 orca_position: Option<solana_pubkey::Pubkey>,
191 token_program_a: Option<solana_pubkey::Pubkey>,
192 token_program_b: Option<solana_pubkey::Pubkey>,
193 token2022_program: Option<solana_pubkey::Pubkey>,
194 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
195}
196
197impl CloseTunaLpPositionOrcaBuilder {
198 pub fn new() -> Self {
199 Self::default()
200 }
201 #[inline(always)]
205 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
206 self.authority = Some(authority);
207 self
208 }
209 #[inline(always)]
210 pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
211 self.mint_a = Some(mint_a);
212 self
213 }
214 #[inline(always)]
215 pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
216 self.mint_b = Some(mint_b);
217 self
218 }
219 #[inline(always)]
220 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
221 self.tuna_position = Some(tuna_position);
222 self
223 }
224 #[inline(always)]
225 pub fn tuna_position_mint(&mut self, tuna_position_mint: solana_pubkey::Pubkey) -> &mut Self {
226 self.tuna_position_mint = Some(tuna_position_mint);
227 self
228 }
229 #[inline(always)]
230 pub fn tuna_position_ata(&mut self, tuna_position_ata: solana_pubkey::Pubkey) -> &mut Self {
231 self.tuna_position_ata = Some(tuna_position_ata);
232 self
233 }
234 #[inline(always)]
235 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
236 self.tuna_position_ata_a = Some(tuna_position_ata_a);
237 self
238 }
239 #[inline(always)]
240 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
241 self.tuna_position_ata_b = Some(tuna_position_ata_b);
242 self
243 }
244 #[inline(always)]
248 pub fn whirlpool_program(&mut self, whirlpool_program: solana_pubkey::Pubkey) -> &mut Self {
249 self.whirlpool_program = Some(whirlpool_program);
250 self
251 }
252 #[inline(always)]
253 pub fn orca_position(&mut self, orca_position: solana_pubkey::Pubkey) -> &mut Self {
254 self.orca_position = Some(orca_position);
255 self
256 }
257 #[inline(always)]
258 pub fn token_program_a(&mut self, token_program_a: solana_pubkey::Pubkey) -> &mut Self {
259 self.token_program_a = Some(token_program_a);
260 self
261 }
262 #[inline(always)]
263 pub fn token_program_b(&mut self, token_program_b: solana_pubkey::Pubkey) -> &mut Self {
264 self.token_program_b = Some(token_program_b);
265 self
266 }
267 #[inline(always)]
271 pub fn token2022_program(&mut self, token2022_program: solana_pubkey::Pubkey) -> &mut Self {
272 self.token2022_program = Some(token2022_program);
273 self
274 }
275 #[inline(always)]
277 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
278 self.__remaining_accounts.push(account);
279 self
280 }
281 #[inline(always)]
283 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
284 self.__remaining_accounts.extend_from_slice(accounts);
285 self
286 }
287 #[allow(clippy::clone_on_copy)]
288 pub fn instruction(&self) -> solana_instruction::Instruction {
289 let accounts = CloseTunaLpPositionOrca {
290 authority: self.authority.expect("authority is not set"),
291 mint_a: self.mint_a.expect("mint_a is not set"),
292 mint_b: self.mint_b.expect("mint_b is not set"),
293 tuna_position: self.tuna_position.expect("tuna_position is not set"),
294 tuna_position_mint: self.tuna_position_mint.expect("tuna_position_mint is not set"),
295 tuna_position_ata: self.tuna_position_ata.expect("tuna_position_ata is not set"),
296 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
297 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
298 whirlpool_program: self.whirlpool_program.expect("whirlpool_program is not set"),
299 orca_position: self.orca_position.expect("orca_position is not set"),
300 token_program_a: self.token_program_a.expect("token_program_a is not set"),
301 token_program_b: self.token_program_b.expect("token_program_b is not set"),
302 token2022_program: self.token2022_program.expect("token2022_program is not set"),
303 };
304
305 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
306 }
307}
308
309 pub struct CloseTunaLpPositionOrcaCpiAccounts<'a, 'b> {
311 pub authority: &'b solana_account_info::AccountInfo<'a>,
318
319
320 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
321
322
323 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
324
325
326 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
327
328
329 pub tuna_position_mint: &'b solana_account_info::AccountInfo<'a>,
330
331
332 pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
333
334
335 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
336
337
338 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
339 pub whirlpool_program: &'b solana_account_info::AccountInfo<'a>,
346
347
348 pub orca_position: &'b solana_account_info::AccountInfo<'a>,
349
350
351 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
352
353
354 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
355 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
362 }
363
364pub struct CloseTunaLpPositionOrcaCpi<'a, 'b> {
366 pub __program: &'b solana_account_info::AccountInfo<'a>,
368 pub authority: &'b solana_account_info::AccountInfo<'a>,
375
376
377 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
378
379
380 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
381
382
383 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
384
385
386 pub tuna_position_mint: &'b solana_account_info::AccountInfo<'a>,
387
388
389 pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
390
391
392 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
393
394
395 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
396 pub whirlpool_program: &'b solana_account_info::AccountInfo<'a>,
403
404
405 pub orca_position: &'b solana_account_info::AccountInfo<'a>,
406
407
408 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
409
410
411 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
412 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
419 }
420
421impl<'a, 'b> CloseTunaLpPositionOrcaCpi<'a, 'b> {
422 pub fn new(
423 program: &'b solana_account_info::AccountInfo<'a>,
424 accounts: CloseTunaLpPositionOrcaCpiAccounts<'a, 'b>,
425 ) -> Self {
426 Self {
427 __program: program,
428 authority: accounts.authority,
429 mint_a: accounts.mint_a,
430 mint_b: accounts.mint_b,
431 tuna_position: accounts.tuna_position,
432 tuna_position_mint: accounts.tuna_position_mint,
433 tuna_position_ata: accounts.tuna_position_ata,
434 tuna_position_ata_a: accounts.tuna_position_ata_a,
435 tuna_position_ata_b: accounts.tuna_position_ata_b,
436 whirlpool_program: accounts.whirlpool_program,
437 orca_position: accounts.orca_position,
438 token_program_a: accounts.token_program_a,
439 token_program_b: accounts.token_program_b,
440 token2022_program: accounts.token2022_program,
441 }
442 }
443 #[inline(always)]
444 pub fn invoke(&self) -> solana_program_error::ProgramResult {
445 self.invoke_signed_with_remaining_accounts(&[], &[])
446 }
447 #[inline(always)]
448 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
449 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
450 }
451 #[inline(always)]
452 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
453 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
454 }
455 #[allow(clippy::arithmetic_side_effects)]
456 #[allow(clippy::clone_on_copy)]
457 #[allow(clippy::vec_init_then_push)]
458 pub fn invoke_signed_with_remaining_accounts(
459 &self,
460 signers_seeds: &[&[&[u8]]],
461 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
462 ) -> solana_program_error::ProgramResult {
463 let mut accounts = Vec::with_capacity(13+ remaining_accounts.len());
464 accounts.push(solana_instruction::AccountMeta::new(
465 *self.authority.key,
466 true
467 ));
468 accounts.push(solana_instruction::AccountMeta::new_readonly(
469 *self.mint_a.key,
470 false
471 ));
472 accounts.push(solana_instruction::AccountMeta::new_readonly(
473 *self.mint_b.key,
474 false
475 ));
476 accounts.push(solana_instruction::AccountMeta::new(
477 *self.tuna_position.key,
478 false
479 ));
480 accounts.push(solana_instruction::AccountMeta::new(
481 *self.tuna_position_mint.key,
482 false
483 ));
484 accounts.push(solana_instruction::AccountMeta::new(
485 *self.tuna_position_ata.key,
486 false
487 ));
488 accounts.push(solana_instruction::AccountMeta::new(
489 *self.tuna_position_ata_a.key,
490 false
491 ));
492 accounts.push(solana_instruction::AccountMeta::new(
493 *self.tuna_position_ata_b.key,
494 false
495 ));
496 accounts.push(solana_instruction::AccountMeta::new_readonly(
497 *self.whirlpool_program.key,
498 false
499 ));
500 accounts.push(solana_instruction::AccountMeta::new(
501 *self.orca_position.key,
502 false
503 ));
504 accounts.push(solana_instruction::AccountMeta::new_readonly(
505 *self.token_program_a.key,
506 false
507 ));
508 accounts.push(solana_instruction::AccountMeta::new_readonly(
509 *self.token_program_b.key,
510 false
511 ));
512 accounts.push(solana_instruction::AccountMeta::new_readonly(
513 *self.token2022_program.key,
514 false
515 ));
516 remaining_accounts.iter().for_each(|remaining_account| {
517 accounts.push(solana_instruction::AccountMeta {
518 pubkey: *remaining_account.0.key,
519 is_signer: remaining_account.1,
520 is_writable: remaining_account.2,
521 })
522 });
523 let data = borsh::to_vec(&CloseTunaLpPositionOrcaInstructionData::new()).unwrap();
524
525 let instruction = solana_instruction::Instruction {
526 program_id: crate::TUNA_ID,
527 accounts,
528 data,
529 };
530 let mut account_infos = Vec::with_capacity(14 + remaining_accounts.len());
531 account_infos.push(self.__program.clone());
532 account_infos.push(self.authority.clone());
533 account_infos.push(self.mint_a.clone());
534 account_infos.push(self.mint_b.clone());
535 account_infos.push(self.tuna_position.clone());
536 account_infos.push(self.tuna_position_mint.clone());
537 account_infos.push(self.tuna_position_ata.clone());
538 account_infos.push(self.tuna_position_ata_a.clone());
539 account_infos.push(self.tuna_position_ata_b.clone());
540 account_infos.push(self.whirlpool_program.clone());
541 account_infos.push(self.orca_position.clone());
542 account_infos.push(self.token_program_a.clone());
543 account_infos.push(self.token_program_b.clone());
544 account_infos.push(self.token2022_program.clone());
545 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
546
547 if signers_seeds.is_empty() {
548 solana_cpi::invoke(&instruction, &account_infos)
549 } else {
550 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
551 }
552 }
553}
554
555#[derive(Clone, Debug)]
573pub struct CloseTunaLpPositionOrcaCpiBuilder<'a, 'b> {
574 instruction: Box<CloseTunaLpPositionOrcaCpiBuilderInstruction<'a, 'b>>,
575}
576
577impl<'a, 'b> CloseTunaLpPositionOrcaCpiBuilder<'a, 'b> {
578 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
579 let instruction = Box::new(CloseTunaLpPositionOrcaCpiBuilderInstruction {
580 __program: program,
581 authority: None,
582 mint_a: None,
583 mint_b: None,
584 tuna_position: None,
585 tuna_position_mint: None,
586 tuna_position_ata: None,
587 tuna_position_ata_a: None,
588 tuna_position_ata_b: None,
589 whirlpool_program: None,
590 orca_position: None,
591 token_program_a: None,
592 token_program_b: None,
593 token2022_program: None,
594 __remaining_accounts: Vec::new(),
595 });
596 Self { instruction }
597 }
598 #[inline(always)]
602 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
603 self.instruction.authority = Some(authority);
604 self
605 }
606 #[inline(always)]
607 pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
608 self.instruction.mint_a = Some(mint_a);
609 self
610 }
611 #[inline(always)]
612 pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
613 self.instruction.mint_b = Some(mint_b);
614 self
615 }
616 #[inline(always)]
617 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
618 self.instruction.tuna_position = Some(tuna_position);
619 self
620 }
621 #[inline(always)]
622 pub fn tuna_position_mint(&mut self, tuna_position_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
623 self.instruction.tuna_position_mint = Some(tuna_position_mint);
624 self
625 }
626 #[inline(always)]
627 pub fn tuna_position_ata(&mut self, tuna_position_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
628 self.instruction.tuna_position_ata = Some(tuna_position_ata);
629 self
630 }
631 #[inline(always)]
632 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
633 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
634 self
635 }
636 #[inline(always)]
637 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
638 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
639 self
640 }
641 #[inline(always)]
645 pub fn whirlpool_program(&mut self, whirlpool_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
646 self.instruction.whirlpool_program = Some(whirlpool_program);
647 self
648 }
649 #[inline(always)]
650 pub fn orca_position(&mut self, orca_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
651 self.instruction.orca_position = Some(orca_position);
652 self
653 }
654 #[inline(always)]
655 pub fn token_program_a(&mut self, token_program_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
656 self.instruction.token_program_a = Some(token_program_a);
657 self
658 }
659 #[inline(always)]
660 pub fn token_program_b(&mut self, token_program_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
661 self.instruction.token_program_b = Some(token_program_b);
662 self
663 }
664 #[inline(always)]
668 pub fn token2022_program(&mut self, token2022_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
669 self.instruction.token2022_program = Some(token2022_program);
670 self
671 }
672 #[inline(always)]
674 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
675 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
676 self
677 }
678 #[inline(always)]
683 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
684 self.instruction.__remaining_accounts.extend_from_slice(accounts);
685 self
686 }
687 #[inline(always)]
688 pub fn invoke(&self) -> solana_program_error::ProgramResult {
689 self.invoke_signed(&[])
690 }
691 #[allow(clippy::clone_on_copy)]
692 #[allow(clippy::vec_init_then_push)]
693 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
694 let instruction = CloseTunaLpPositionOrcaCpi {
695 __program: self.instruction.__program,
696
697 authority: self.instruction.authority.expect("authority is not set"),
698
699 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
700
701 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
702
703 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
704
705 tuna_position_mint: self.instruction.tuna_position_mint.expect("tuna_position_mint is not set"),
706
707 tuna_position_ata: self.instruction.tuna_position_ata.expect("tuna_position_ata is not set"),
708
709 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
710
711 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
712
713 whirlpool_program: self.instruction.whirlpool_program.expect("whirlpool_program is not set"),
714
715 orca_position: self.instruction.orca_position.expect("orca_position is not set"),
716
717 token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
718
719 token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
720
721 token2022_program: self.instruction.token2022_program.expect("token2022_program is not set"),
722 };
723 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
724 }
725}
726
727#[derive(Clone, Debug)]
728struct CloseTunaLpPositionOrcaCpiBuilderInstruction<'a, 'b> {
729 __program: &'b solana_account_info::AccountInfo<'a>,
730 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
731 mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
732 mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
733 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
734 tuna_position_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
735 tuna_position_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
736 tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
737 tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
738 whirlpool_program: Option<&'b solana_account_info::AccountInfo<'a>>,
739 orca_position: Option<&'b solana_account_info::AccountInfo<'a>>,
740 token_program_a: Option<&'b solana_account_info::AccountInfo<'a>>,
741 token_program_b: Option<&'b solana_account_info::AccountInfo<'a>>,
742 token2022_program: Option<&'b solana_account_info::AccountInfo<'a>>,
743 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
745}
746