1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const LIQUIDATE_TUNA_SPOT_POSITION_JUPITER_DISCRIMINATOR: [u8; 8] = [202, 175, 176, 66, 139, 120, 175, 193];
12
13#[derive(Debug)]
15pub struct LiquidateTunaSpotPositionJupiter {
16 pub authority: solana_pubkey::Pubkey,
23
24
25 pub tuna_config: solana_pubkey::Pubkey,
26
27
28 pub mint_a: solana_pubkey::Pubkey,
29
30
31 pub mint_b: solana_pubkey::Pubkey,
32
33
34 pub token_program_a: solana_pubkey::Pubkey,
35
36
37 pub token_program_b: solana_pubkey::Pubkey,
38
39
40 pub market: solana_pubkey::Pubkey,
41
42
43 pub vault_a: solana_pubkey::Pubkey,
44
45
46 pub vault_b: solana_pubkey::Pubkey,
47
48
49 pub vault_a_ata: solana_pubkey::Pubkey,
50
51
52 pub vault_b_ata: solana_pubkey::Pubkey,
53
54
55 pub tuna_position: solana_pubkey::Pubkey,
56
57
58 pub tuna_position_ata_a: solana_pubkey::Pubkey,
59
60
61 pub tuna_position_ata_b: solana_pubkey::Pubkey,
62
63
64 pub fee_recipient_ata_a: solana_pubkey::Pubkey,
65
66
67 pub fee_recipient_ata_b: solana_pubkey::Pubkey,
68
69
70 pub tuna_position_owner: solana_pubkey::Pubkey,
71
72
73 pub tuna_position_owner_ata_a: solana_pubkey::Pubkey,
74
75
76 pub tuna_position_owner_ata_b: solana_pubkey::Pubkey,
77
78
79 pub pyth_oracle_price_feed_a: solana_pubkey::Pubkey,
80
81
82 pub pyth_oracle_price_feed_b: solana_pubkey::Pubkey,
83
84
85 pub pool: solana_pubkey::Pubkey,
86 pub jupiter_program: solana_pubkey::Pubkey,
93
94
95 pub jupiter_event_authority: solana_pubkey::Pubkey,
96
97
98 pub jupiter_program_authority: solana_pubkey::Pubkey,
99 pub token_program: solana_pubkey::Pubkey,
106
107
108 pub memo_program: solana_pubkey::Pubkey,
109
110
111 pub system_program: solana_pubkey::Pubkey,
112 }
113
114impl LiquidateTunaSpotPositionJupiter {
115 pub fn instruction(&self, args: LiquidateTunaSpotPositionJupiterInstructionArgs) -> solana_instruction::Instruction {
116 self.instruction_with_remaining_accounts(args, &[])
117 }
118 #[allow(clippy::arithmetic_side_effects)]
119 #[allow(clippy::vec_init_then_push)]
120 pub fn instruction_with_remaining_accounts(&self, args: LiquidateTunaSpotPositionJupiterInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
121 let mut accounts = Vec::with_capacity(28+ remaining_accounts.len());
122 accounts.push(solana_instruction::AccountMeta::new(
123 self.authority,
124 true
125 ));
126 accounts.push(solana_instruction::AccountMeta::new_readonly(
127 self.tuna_config,
128 false
129 ));
130 accounts.push(solana_instruction::AccountMeta::new_readonly(
131 self.mint_a,
132 false
133 ));
134 accounts.push(solana_instruction::AccountMeta::new_readonly(
135 self.mint_b,
136 false
137 ));
138 accounts.push(solana_instruction::AccountMeta::new_readonly(
139 self.token_program_a,
140 false
141 ));
142 accounts.push(solana_instruction::AccountMeta::new_readonly(
143 self.token_program_b,
144 false
145 ));
146 accounts.push(solana_instruction::AccountMeta::new(
147 self.market,
148 false
149 ));
150 accounts.push(solana_instruction::AccountMeta::new(
151 self.vault_a,
152 false
153 ));
154 accounts.push(solana_instruction::AccountMeta::new(
155 self.vault_b,
156 false
157 ));
158 accounts.push(solana_instruction::AccountMeta::new(
159 self.vault_a_ata,
160 false
161 ));
162 accounts.push(solana_instruction::AccountMeta::new(
163 self.vault_b_ata,
164 false
165 ));
166 accounts.push(solana_instruction::AccountMeta::new(
167 self.tuna_position,
168 false
169 ));
170 accounts.push(solana_instruction::AccountMeta::new(
171 self.tuna_position_ata_a,
172 false
173 ));
174 accounts.push(solana_instruction::AccountMeta::new(
175 self.tuna_position_ata_b,
176 false
177 ));
178 accounts.push(solana_instruction::AccountMeta::new(
179 self.fee_recipient_ata_a,
180 false
181 ));
182 accounts.push(solana_instruction::AccountMeta::new(
183 self.fee_recipient_ata_b,
184 false
185 ));
186 accounts.push(solana_instruction::AccountMeta::new(
187 self.tuna_position_owner,
188 false
189 ));
190 accounts.push(solana_instruction::AccountMeta::new(
191 self.tuna_position_owner_ata_a,
192 false
193 ));
194 accounts.push(solana_instruction::AccountMeta::new(
195 self.tuna_position_owner_ata_b,
196 false
197 ));
198 accounts.push(solana_instruction::AccountMeta::new_readonly(
199 self.pyth_oracle_price_feed_a,
200 false
201 ));
202 accounts.push(solana_instruction::AccountMeta::new_readonly(
203 self.pyth_oracle_price_feed_b,
204 false
205 ));
206 accounts.push(solana_instruction::AccountMeta::new_readonly(
207 self.pool,
208 false
209 ));
210 accounts.push(solana_instruction::AccountMeta::new_readonly(
211 self.jupiter_program,
212 false
213 ));
214 accounts.push(solana_instruction::AccountMeta::new_readonly(
215 self.jupiter_event_authority,
216 false
217 ));
218 accounts.push(solana_instruction::AccountMeta::new_readonly(
219 self.jupiter_program_authority,
220 false
221 ));
222 accounts.push(solana_instruction::AccountMeta::new_readonly(
223 self.token_program,
224 false
225 ));
226 accounts.push(solana_instruction::AccountMeta::new_readonly(
227 self.memo_program,
228 false
229 ));
230 accounts.push(solana_instruction::AccountMeta::new_readonly(
231 self.system_program,
232 false
233 ));
234 accounts.extend_from_slice(remaining_accounts);
235 let mut data = borsh::to_vec(&LiquidateTunaSpotPositionJupiterInstructionData::new()).unwrap();
236 let mut args = borsh::to_vec(&args).unwrap();
237 data.append(&mut args);
238
239 solana_instruction::Instruction {
240 program_id: crate::TUNA_ID,
241 accounts,
242 data,
243 }
244 }
245}
246
247#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
248#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
249 pub struct LiquidateTunaSpotPositionJupiterInstructionData {
250 discriminator: [u8; 8],
251 }
252
253impl LiquidateTunaSpotPositionJupiterInstructionData {
254 pub fn new() -> Self {
255 Self {
256 discriminator: [202, 175, 176, 66, 139, 120, 175, 193],
257 }
258 }
259}
260
261impl Default for LiquidateTunaSpotPositionJupiterInstructionData {
262 fn default() -> Self {
263 Self::new()
264 }
265}
266
267#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
268#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
269 pub struct LiquidateTunaSpotPositionJupiterInstructionArgs {
270 pub decrease_percent: u32,
271 pub route_data: Vec<u8>,
272 }
273
274
275#[derive(Clone, Debug, Default)]
308pub struct LiquidateTunaSpotPositionJupiterBuilder {
309 authority: Option<solana_pubkey::Pubkey>,
310 tuna_config: Option<solana_pubkey::Pubkey>,
311 mint_a: Option<solana_pubkey::Pubkey>,
312 mint_b: Option<solana_pubkey::Pubkey>,
313 token_program_a: Option<solana_pubkey::Pubkey>,
314 token_program_b: Option<solana_pubkey::Pubkey>,
315 market: Option<solana_pubkey::Pubkey>,
316 vault_a: Option<solana_pubkey::Pubkey>,
317 vault_b: Option<solana_pubkey::Pubkey>,
318 vault_a_ata: Option<solana_pubkey::Pubkey>,
319 vault_b_ata: Option<solana_pubkey::Pubkey>,
320 tuna_position: Option<solana_pubkey::Pubkey>,
321 tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
322 tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
323 fee_recipient_ata_a: Option<solana_pubkey::Pubkey>,
324 fee_recipient_ata_b: Option<solana_pubkey::Pubkey>,
325 tuna_position_owner: Option<solana_pubkey::Pubkey>,
326 tuna_position_owner_ata_a: Option<solana_pubkey::Pubkey>,
327 tuna_position_owner_ata_b: Option<solana_pubkey::Pubkey>,
328 pyth_oracle_price_feed_a: Option<solana_pubkey::Pubkey>,
329 pyth_oracle_price_feed_b: Option<solana_pubkey::Pubkey>,
330 pool: Option<solana_pubkey::Pubkey>,
331 jupiter_program: Option<solana_pubkey::Pubkey>,
332 jupiter_event_authority: Option<solana_pubkey::Pubkey>,
333 jupiter_program_authority: Option<solana_pubkey::Pubkey>,
334 token_program: Option<solana_pubkey::Pubkey>,
335 memo_program: Option<solana_pubkey::Pubkey>,
336 system_program: Option<solana_pubkey::Pubkey>,
337 decrease_percent: Option<u32>,
338 route_data: Option<Vec<u8>>,
339 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
340}
341
342impl LiquidateTunaSpotPositionJupiterBuilder {
343 pub fn new() -> Self {
344 Self::default()
345 }
346 #[inline(always)]
350 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
351 self.authority = Some(authority);
352 self
353 }
354 #[inline(always)]
355 pub fn tuna_config(&mut self, tuna_config: solana_pubkey::Pubkey) -> &mut Self {
356 self.tuna_config = Some(tuna_config);
357 self
358 }
359 #[inline(always)]
360 pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
361 self.mint_a = Some(mint_a);
362 self
363 }
364 #[inline(always)]
365 pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
366 self.mint_b = Some(mint_b);
367 self
368 }
369 #[inline(always)]
370 pub fn token_program_a(&mut self, token_program_a: solana_pubkey::Pubkey) -> &mut Self {
371 self.token_program_a = Some(token_program_a);
372 self
373 }
374 #[inline(always)]
375 pub fn token_program_b(&mut self, token_program_b: solana_pubkey::Pubkey) -> &mut Self {
376 self.token_program_b = Some(token_program_b);
377 self
378 }
379 #[inline(always)]
380 pub fn market(&mut self, market: solana_pubkey::Pubkey) -> &mut Self {
381 self.market = Some(market);
382 self
383 }
384 #[inline(always)]
385 pub fn vault_a(&mut self, vault_a: solana_pubkey::Pubkey) -> &mut Self {
386 self.vault_a = Some(vault_a);
387 self
388 }
389 #[inline(always)]
390 pub fn vault_b(&mut self, vault_b: solana_pubkey::Pubkey) -> &mut Self {
391 self.vault_b = Some(vault_b);
392 self
393 }
394 #[inline(always)]
395 pub fn vault_a_ata(&mut self, vault_a_ata: solana_pubkey::Pubkey) -> &mut Self {
396 self.vault_a_ata = Some(vault_a_ata);
397 self
398 }
399 #[inline(always)]
400 pub fn vault_b_ata(&mut self, vault_b_ata: solana_pubkey::Pubkey) -> &mut Self {
401 self.vault_b_ata = Some(vault_b_ata);
402 self
403 }
404 #[inline(always)]
405 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
406 self.tuna_position = Some(tuna_position);
407 self
408 }
409 #[inline(always)]
410 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
411 self.tuna_position_ata_a = Some(tuna_position_ata_a);
412 self
413 }
414 #[inline(always)]
415 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
416 self.tuna_position_ata_b = Some(tuna_position_ata_b);
417 self
418 }
419 #[inline(always)]
420 pub fn fee_recipient_ata_a(&mut self, fee_recipient_ata_a: solana_pubkey::Pubkey) -> &mut Self {
421 self.fee_recipient_ata_a = Some(fee_recipient_ata_a);
422 self
423 }
424 #[inline(always)]
425 pub fn fee_recipient_ata_b(&mut self, fee_recipient_ata_b: solana_pubkey::Pubkey) -> &mut Self {
426 self.fee_recipient_ata_b = Some(fee_recipient_ata_b);
427 self
428 }
429 #[inline(always)]
430 pub fn tuna_position_owner(&mut self, tuna_position_owner: solana_pubkey::Pubkey) -> &mut Self {
431 self.tuna_position_owner = Some(tuna_position_owner);
432 self
433 }
434 #[inline(always)]
435 pub fn tuna_position_owner_ata_a(&mut self, tuna_position_owner_ata_a: solana_pubkey::Pubkey) -> &mut Self {
436 self.tuna_position_owner_ata_a = Some(tuna_position_owner_ata_a);
437 self
438 }
439 #[inline(always)]
440 pub fn tuna_position_owner_ata_b(&mut self, tuna_position_owner_ata_b: solana_pubkey::Pubkey) -> &mut Self {
441 self.tuna_position_owner_ata_b = Some(tuna_position_owner_ata_b);
442 self
443 }
444 #[inline(always)]
445 pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: solana_pubkey::Pubkey) -> &mut Self {
446 self.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
447 self
448 }
449 #[inline(always)]
450 pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: solana_pubkey::Pubkey) -> &mut Self {
451 self.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
452 self
453 }
454 #[inline(always)]
455 pub fn pool(&mut self, pool: solana_pubkey::Pubkey) -> &mut Self {
456 self.pool = Some(pool);
457 self
458 }
459 #[inline(always)]
463 pub fn jupiter_program(&mut self, jupiter_program: solana_pubkey::Pubkey) -> &mut Self {
464 self.jupiter_program = Some(jupiter_program);
465 self
466 }
467 #[inline(always)]
468 pub fn jupiter_event_authority(&mut self, jupiter_event_authority: solana_pubkey::Pubkey) -> &mut Self {
469 self.jupiter_event_authority = Some(jupiter_event_authority);
470 self
471 }
472 #[inline(always)]
473 pub fn jupiter_program_authority(&mut self, jupiter_program_authority: solana_pubkey::Pubkey) -> &mut Self {
474 self.jupiter_program_authority = Some(jupiter_program_authority);
475 self
476 }
477 #[inline(always)]
482 pub fn token_program(&mut self, token_program: solana_pubkey::Pubkey) -> &mut Self {
483 self.token_program = Some(token_program);
484 self
485 }
486 #[inline(always)]
487 pub fn memo_program(&mut self, memo_program: solana_pubkey::Pubkey) -> &mut Self {
488 self.memo_program = Some(memo_program);
489 self
490 }
491 #[inline(always)]
493 pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self {
494 self.system_program = Some(system_program);
495 self
496 }
497 #[inline(always)]
498 pub fn decrease_percent(&mut self, decrease_percent: u32) -> &mut Self {
499 self.decrease_percent = Some(decrease_percent);
500 self
501 }
502 #[inline(always)]
503 pub fn route_data(&mut self, route_data: Vec<u8>) -> &mut Self {
504 self.route_data = Some(route_data);
505 self
506 }
507 #[inline(always)]
509 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
510 self.__remaining_accounts.push(account);
511 self
512 }
513 #[inline(always)]
515 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
516 self.__remaining_accounts.extend_from_slice(accounts);
517 self
518 }
519 #[allow(clippy::clone_on_copy)]
520 pub fn instruction(&self) -> solana_instruction::Instruction {
521 let accounts = LiquidateTunaSpotPositionJupiter {
522 authority: self.authority.expect("authority is not set"),
523 tuna_config: self.tuna_config.expect("tuna_config is not set"),
524 mint_a: self.mint_a.expect("mint_a is not set"),
525 mint_b: self.mint_b.expect("mint_b is not set"),
526 token_program_a: self.token_program_a.expect("token_program_a is not set"),
527 token_program_b: self.token_program_b.expect("token_program_b is not set"),
528 market: self.market.expect("market is not set"),
529 vault_a: self.vault_a.expect("vault_a is not set"),
530 vault_b: self.vault_b.expect("vault_b is not set"),
531 vault_a_ata: self.vault_a_ata.expect("vault_a_ata is not set"),
532 vault_b_ata: self.vault_b_ata.expect("vault_b_ata is not set"),
533 tuna_position: self.tuna_position.expect("tuna_position is not set"),
534 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
535 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
536 fee_recipient_ata_a: self.fee_recipient_ata_a.expect("fee_recipient_ata_a is not set"),
537 fee_recipient_ata_b: self.fee_recipient_ata_b.expect("fee_recipient_ata_b is not set"),
538 tuna_position_owner: self.tuna_position_owner.expect("tuna_position_owner is not set"),
539 tuna_position_owner_ata_a: self.tuna_position_owner_ata_a.expect("tuna_position_owner_ata_a is not set"),
540 tuna_position_owner_ata_b: self.tuna_position_owner_ata_b.expect("tuna_position_owner_ata_b is not set"),
541 pyth_oracle_price_feed_a: self.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
542 pyth_oracle_price_feed_b: self.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
543 pool: self.pool.expect("pool is not set"),
544 jupiter_program: self.jupiter_program.expect("jupiter_program is not set"),
545 jupiter_event_authority: self.jupiter_event_authority.expect("jupiter_event_authority is not set"),
546 jupiter_program_authority: self.jupiter_program_authority.expect("jupiter_program_authority is not set"),
547 token_program: self.token_program.unwrap_or(solana_pubkey::pubkey!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")),
548 memo_program: self.memo_program.expect("memo_program is not set"),
549 system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")),
550 };
551 let args = LiquidateTunaSpotPositionJupiterInstructionArgs {
552 decrease_percent: self.decrease_percent.clone().expect("decrease_percent is not set"),
553 route_data: self.route_data.clone().expect("route_data is not set"),
554 };
555
556 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
557 }
558}
559
560 pub struct LiquidateTunaSpotPositionJupiterCpiAccounts<'a, 'b> {
562 pub authority: &'b solana_account_info::AccountInfo<'a>,
569
570
571 pub tuna_config: &'b solana_account_info::AccountInfo<'a>,
572
573
574 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
575
576
577 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
578
579
580 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
581
582
583 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
584
585
586 pub market: &'b solana_account_info::AccountInfo<'a>,
587
588
589 pub vault_a: &'b solana_account_info::AccountInfo<'a>,
590
591
592 pub vault_b: &'b solana_account_info::AccountInfo<'a>,
593
594
595 pub vault_a_ata: &'b solana_account_info::AccountInfo<'a>,
596
597
598 pub vault_b_ata: &'b solana_account_info::AccountInfo<'a>,
599
600
601 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
602
603
604 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
605
606
607 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
608
609
610 pub fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>,
611
612
613 pub fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>,
614
615
616 pub tuna_position_owner: &'b solana_account_info::AccountInfo<'a>,
617
618
619 pub tuna_position_owner_ata_a: &'b solana_account_info::AccountInfo<'a>,
620
621
622 pub tuna_position_owner_ata_b: &'b solana_account_info::AccountInfo<'a>,
623
624
625 pub pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>,
626
627
628 pub pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>,
629
630
631 pub pool: &'b solana_account_info::AccountInfo<'a>,
632 pub jupiter_program: &'b solana_account_info::AccountInfo<'a>,
639
640
641 pub jupiter_event_authority: &'b solana_account_info::AccountInfo<'a>,
642
643
644 pub jupiter_program_authority: &'b solana_account_info::AccountInfo<'a>,
645 pub token_program: &'b solana_account_info::AccountInfo<'a>,
652
653
654 pub memo_program: &'b solana_account_info::AccountInfo<'a>,
655
656
657 pub system_program: &'b solana_account_info::AccountInfo<'a>,
658 }
659
660pub struct LiquidateTunaSpotPositionJupiterCpi<'a, 'b> {
662 pub __program: &'b solana_account_info::AccountInfo<'a>,
664 pub authority: &'b solana_account_info::AccountInfo<'a>,
671
672
673 pub tuna_config: &'b solana_account_info::AccountInfo<'a>,
674
675
676 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
677
678
679 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
680
681
682 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
683
684
685 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
686
687
688 pub market: &'b solana_account_info::AccountInfo<'a>,
689
690
691 pub vault_a: &'b solana_account_info::AccountInfo<'a>,
692
693
694 pub vault_b: &'b solana_account_info::AccountInfo<'a>,
695
696
697 pub vault_a_ata: &'b solana_account_info::AccountInfo<'a>,
698
699
700 pub vault_b_ata: &'b solana_account_info::AccountInfo<'a>,
701
702
703 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
704
705
706 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
707
708
709 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
710
711
712 pub fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>,
713
714
715 pub fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>,
716
717
718 pub tuna_position_owner: &'b solana_account_info::AccountInfo<'a>,
719
720
721 pub tuna_position_owner_ata_a: &'b solana_account_info::AccountInfo<'a>,
722
723
724 pub tuna_position_owner_ata_b: &'b solana_account_info::AccountInfo<'a>,
725
726
727 pub pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>,
728
729
730 pub pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>,
731
732
733 pub pool: &'b solana_account_info::AccountInfo<'a>,
734 pub jupiter_program: &'b solana_account_info::AccountInfo<'a>,
741
742
743 pub jupiter_event_authority: &'b solana_account_info::AccountInfo<'a>,
744
745
746 pub jupiter_program_authority: &'b solana_account_info::AccountInfo<'a>,
747 pub token_program: &'b solana_account_info::AccountInfo<'a>,
754
755
756 pub memo_program: &'b solana_account_info::AccountInfo<'a>,
757
758
759 pub system_program: &'b solana_account_info::AccountInfo<'a>,
760 pub __args: LiquidateTunaSpotPositionJupiterInstructionArgs,
762 }
763
764impl<'a, 'b> LiquidateTunaSpotPositionJupiterCpi<'a, 'b> {
765 pub fn new(
766 program: &'b solana_account_info::AccountInfo<'a>,
767 accounts: LiquidateTunaSpotPositionJupiterCpiAccounts<'a, 'b>,
768 args: LiquidateTunaSpotPositionJupiterInstructionArgs,
769 ) -> Self {
770 Self {
771 __program: program,
772 authority: accounts.authority,
773 tuna_config: accounts.tuna_config,
774 mint_a: accounts.mint_a,
775 mint_b: accounts.mint_b,
776 token_program_a: accounts.token_program_a,
777 token_program_b: accounts.token_program_b,
778 market: accounts.market,
779 vault_a: accounts.vault_a,
780 vault_b: accounts.vault_b,
781 vault_a_ata: accounts.vault_a_ata,
782 vault_b_ata: accounts.vault_b_ata,
783 tuna_position: accounts.tuna_position,
784 tuna_position_ata_a: accounts.tuna_position_ata_a,
785 tuna_position_ata_b: accounts.tuna_position_ata_b,
786 fee_recipient_ata_a: accounts.fee_recipient_ata_a,
787 fee_recipient_ata_b: accounts.fee_recipient_ata_b,
788 tuna_position_owner: accounts.tuna_position_owner,
789 tuna_position_owner_ata_a: accounts.tuna_position_owner_ata_a,
790 tuna_position_owner_ata_b: accounts.tuna_position_owner_ata_b,
791 pyth_oracle_price_feed_a: accounts.pyth_oracle_price_feed_a,
792 pyth_oracle_price_feed_b: accounts.pyth_oracle_price_feed_b,
793 pool: accounts.pool,
794 jupiter_program: accounts.jupiter_program,
795 jupiter_event_authority: accounts.jupiter_event_authority,
796 jupiter_program_authority: accounts.jupiter_program_authority,
797 token_program: accounts.token_program,
798 memo_program: accounts.memo_program,
799 system_program: accounts.system_program,
800 __args: args,
801 }
802 }
803 #[inline(always)]
804 pub fn invoke(&self) -> solana_program_error::ProgramResult {
805 self.invoke_signed_with_remaining_accounts(&[], &[])
806 }
807 #[inline(always)]
808 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
809 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
810 }
811 #[inline(always)]
812 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
813 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
814 }
815 #[allow(clippy::arithmetic_side_effects)]
816 #[allow(clippy::clone_on_copy)]
817 #[allow(clippy::vec_init_then_push)]
818 pub fn invoke_signed_with_remaining_accounts(
819 &self,
820 signers_seeds: &[&[&[u8]]],
821 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
822 ) -> solana_program_error::ProgramResult {
823 let mut accounts = Vec::with_capacity(28+ remaining_accounts.len());
824 accounts.push(solana_instruction::AccountMeta::new(
825 *self.authority.key,
826 true
827 ));
828 accounts.push(solana_instruction::AccountMeta::new_readonly(
829 *self.tuna_config.key,
830 false
831 ));
832 accounts.push(solana_instruction::AccountMeta::new_readonly(
833 *self.mint_a.key,
834 false
835 ));
836 accounts.push(solana_instruction::AccountMeta::new_readonly(
837 *self.mint_b.key,
838 false
839 ));
840 accounts.push(solana_instruction::AccountMeta::new_readonly(
841 *self.token_program_a.key,
842 false
843 ));
844 accounts.push(solana_instruction::AccountMeta::new_readonly(
845 *self.token_program_b.key,
846 false
847 ));
848 accounts.push(solana_instruction::AccountMeta::new(
849 *self.market.key,
850 false
851 ));
852 accounts.push(solana_instruction::AccountMeta::new(
853 *self.vault_a.key,
854 false
855 ));
856 accounts.push(solana_instruction::AccountMeta::new(
857 *self.vault_b.key,
858 false
859 ));
860 accounts.push(solana_instruction::AccountMeta::new(
861 *self.vault_a_ata.key,
862 false
863 ));
864 accounts.push(solana_instruction::AccountMeta::new(
865 *self.vault_b_ata.key,
866 false
867 ));
868 accounts.push(solana_instruction::AccountMeta::new(
869 *self.tuna_position.key,
870 false
871 ));
872 accounts.push(solana_instruction::AccountMeta::new(
873 *self.tuna_position_ata_a.key,
874 false
875 ));
876 accounts.push(solana_instruction::AccountMeta::new(
877 *self.tuna_position_ata_b.key,
878 false
879 ));
880 accounts.push(solana_instruction::AccountMeta::new(
881 *self.fee_recipient_ata_a.key,
882 false
883 ));
884 accounts.push(solana_instruction::AccountMeta::new(
885 *self.fee_recipient_ata_b.key,
886 false
887 ));
888 accounts.push(solana_instruction::AccountMeta::new(
889 *self.tuna_position_owner.key,
890 false
891 ));
892 accounts.push(solana_instruction::AccountMeta::new(
893 *self.tuna_position_owner_ata_a.key,
894 false
895 ));
896 accounts.push(solana_instruction::AccountMeta::new(
897 *self.tuna_position_owner_ata_b.key,
898 false
899 ));
900 accounts.push(solana_instruction::AccountMeta::new_readonly(
901 *self.pyth_oracle_price_feed_a.key,
902 false
903 ));
904 accounts.push(solana_instruction::AccountMeta::new_readonly(
905 *self.pyth_oracle_price_feed_b.key,
906 false
907 ));
908 accounts.push(solana_instruction::AccountMeta::new_readonly(
909 *self.pool.key,
910 false
911 ));
912 accounts.push(solana_instruction::AccountMeta::new_readonly(
913 *self.jupiter_program.key,
914 false
915 ));
916 accounts.push(solana_instruction::AccountMeta::new_readonly(
917 *self.jupiter_event_authority.key,
918 false
919 ));
920 accounts.push(solana_instruction::AccountMeta::new_readonly(
921 *self.jupiter_program_authority.key,
922 false
923 ));
924 accounts.push(solana_instruction::AccountMeta::new_readonly(
925 *self.token_program.key,
926 false
927 ));
928 accounts.push(solana_instruction::AccountMeta::new_readonly(
929 *self.memo_program.key,
930 false
931 ));
932 accounts.push(solana_instruction::AccountMeta::new_readonly(
933 *self.system_program.key,
934 false
935 ));
936 remaining_accounts.iter().for_each(|remaining_account| {
937 accounts.push(solana_instruction::AccountMeta {
938 pubkey: *remaining_account.0.key,
939 is_signer: remaining_account.1,
940 is_writable: remaining_account.2,
941 })
942 });
943 let mut data = borsh::to_vec(&LiquidateTunaSpotPositionJupiterInstructionData::new()).unwrap();
944 let mut args = borsh::to_vec(&self.__args).unwrap();
945 data.append(&mut args);
946
947 let instruction = solana_instruction::Instruction {
948 program_id: crate::TUNA_ID,
949 accounts,
950 data,
951 };
952 let mut account_infos = Vec::with_capacity(29 + remaining_accounts.len());
953 account_infos.push(self.__program.clone());
954 account_infos.push(self.authority.clone());
955 account_infos.push(self.tuna_config.clone());
956 account_infos.push(self.mint_a.clone());
957 account_infos.push(self.mint_b.clone());
958 account_infos.push(self.token_program_a.clone());
959 account_infos.push(self.token_program_b.clone());
960 account_infos.push(self.market.clone());
961 account_infos.push(self.vault_a.clone());
962 account_infos.push(self.vault_b.clone());
963 account_infos.push(self.vault_a_ata.clone());
964 account_infos.push(self.vault_b_ata.clone());
965 account_infos.push(self.tuna_position.clone());
966 account_infos.push(self.tuna_position_ata_a.clone());
967 account_infos.push(self.tuna_position_ata_b.clone());
968 account_infos.push(self.fee_recipient_ata_a.clone());
969 account_infos.push(self.fee_recipient_ata_b.clone());
970 account_infos.push(self.tuna_position_owner.clone());
971 account_infos.push(self.tuna_position_owner_ata_a.clone());
972 account_infos.push(self.tuna_position_owner_ata_b.clone());
973 account_infos.push(self.pyth_oracle_price_feed_a.clone());
974 account_infos.push(self.pyth_oracle_price_feed_b.clone());
975 account_infos.push(self.pool.clone());
976 account_infos.push(self.jupiter_program.clone());
977 account_infos.push(self.jupiter_event_authority.clone());
978 account_infos.push(self.jupiter_program_authority.clone());
979 account_infos.push(self.token_program.clone());
980 account_infos.push(self.memo_program.clone());
981 account_infos.push(self.system_program.clone());
982 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
983
984 if signers_seeds.is_empty() {
985 solana_cpi::invoke(&instruction, &account_infos)
986 } else {
987 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
988 }
989 }
990}
991
992#[derive(Clone, Debug)]
1025pub struct LiquidateTunaSpotPositionJupiterCpiBuilder<'a, 'b> {
1026 instruction: Box<LiquidateTunaSpotPositionJupiterCpiBuilderInstruction<'a, 'b>>,
1027}
1028
1029impl<'a, 'b> LiquidateTunaSpotPositionJupiterCpiBuilder<'a, 'b> {
1030 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
1031 let instruction = Box::new(LiquidateTunaSpotPositionJupiterCpiBuilderInstruction {
1032 __program: program,
1033 authority: None,
1034 tuna_config: None,
1035 mint_a: None,
1036 mint_b: None,
1037 token_program_a: None,
1038 token_program_b: None,
1039 market: None,
1040 vault_a: None,
1041 vault_b: None,
1042 vault_a_ata: None,
1043 vault_b_ata: None,
1044 tuna_position: None,
1045 tuna_position_ata_a: None,
1046 tuna_position_ata_b: None,
1047 fee_recipient_ata_a: None,
1048 fee_recipient_ata_b: None,
1049 tuna_position_owner: None,
1050 tuna_position_owner_ata_a: None,
1051 tuna_position_owner_ata_b: None,
1052 pyth_oracle_price_feed_a: None,
1053 pyth_oracle_price_feed_b: None,
1054 pool: None,
1055 jupiter_program: None,
1056 jupiter_event_authority: None,
1057 jupiter_program_authority: None,
1058 token_program: None,
1059 memo_program: None,
1060 system_program: None,
1061 decrease_percent: None,
1062 route_data: None,
1063 __remaining_accounts: Vec::new(),
1064 });
1065 Self { instruction }
1066 }
1067 #[inline(always)]
1071 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1072 self.instruction.authority = Some(authority);
1073 self
1074 }
1075 #[inline(always)]
1076 pub fn tuna_config(&mut self, tuna_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1077 self.instruction.tuna_config = Some(tuna_config);
1078 self
1079 }
1080 #[inline(always)]
1081 pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1082 self.instruction.mint_a = Some(mint_a);
1083 self
1084 }
1085 #[inline(always)]
1086 pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1087 self.instruction.mint_b = Some(mint_b);
1088 self
1089 }
1090 #[inline(always)]
1091 pub fn token_program_a(&mut self, token_program_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1092 self.instruction.token_program_a = Some(token_program_a);
1093 self
1094 }
1095 #[inline(always)]
1096 pub fn token_program_b(&mut self, token_program_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1097 self.instruction.token_program_b = Some(token_program_b);
1098 self
1099 }
1100 #[inline(always)]
1101 pub fn market(&mut self, market: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1102 self.instruction.market = Some(market);
1103 self
1104 }
1105 #[inline(always)]
1106 pub fn vault_a(&mut self, vault_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1107 self.instruction.vault_a = Some(vault_a);
1108 self
1109 }
1110 #[inline(always)]
1111 pub fn vault_b(&mut self, vault_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1112 self.instruction.vault_b = Some(vault_b);
1113 self
1114 }
1115 #[inline(always)]
1116 pub fn vault_a_ata(&mut self, vault_a_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1117 self.instruction.vault_a_ata = Some(vault_a_ata);
1118 self
1119 }
1120 #[inline(always)]
1121 pub fn vault_b_ata(&mut self, vault_b_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1122 self.instruction.vault_b_ata = Some(vault_b_ata);
1123 self
1124 }
1125 #[inline(always)]
1126 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1127 self.instruction.tuna_position = Some(tuna_position);
1128 self
1129 }
1130 #[inline(always)]
1131 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1132 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
1133 self
1134 }
1135 #[inline(always)]
1136 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1137 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
1138 self
1139 }
1140 #[inline(always)]
1141 pub fn fee_recipient_ata_a(&mut self, fee_recipient_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1142 self.instruction.fee_recipient_ata_a = Some(fee_recipient_ata_a);
1143 self
1144 }
1145 #[inline(always)]
1146 pub fn fee_recipient_ata_b(&mut self, fee_recipient_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1147 self.instruction.fee_recipient_ata_b = Some(fee_recipient_ata_b);
1148 self
1149 }
1150 #[inline(always)]
1151 pub fn tuna_position_owner(&mut self, tuna_position_owner: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1152 self.instruction.tuna_position_owner = Some(tuna_position_owner);
1153 self
1154 }
1155 #[inline(always)]
1156 pub fn tuna_position_owner_ata_a(&mut self, tuna_position_owner_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1157 self.instruction.tuna_position_owner_ata_a = Some(tuna_position_owner_ata_a);
1158 self
1159 }
1160 #[inline(always)]
1161 pub fn tuna_position_owner_ata_b(&mut self, tuna_position_owner_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1162 self.instruction.tuna_position_owner_ata_b = Some(tuna_position_owner_ata_b);
1163 self
1164 }
1165 #[inline(always)]
1166 pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1167 self.instruction.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
1168 self
1169 }
1170 #[inline(always)]
1171 pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1172 self.instruction.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
1173 self
1174 }
1175 #[inline(always)]
1176 pub fn pool(&mut self, pool: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1177 self.instruction.pool = Some(pool);
1178 self
1179 }
1180 #[inline(always)]
1184 pub fn jupiter_program(&mut self, jupiter_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1185 self.instruction.jupiter_program = Some(jupiter_program);
1186 self
1187 }
1188 #[inline(always)]
1189 pub fn jupiter_event_authority(&mut self, jupiter_event_authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1190 self.instruction.jupiter_event_authority = Some(jupiter_event_authority);
1191 self
1192 }
1193 #[inline(always)]
1194 pub fn jupiter_program_authority(&mut self, jupiter_program_authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1195 self.instruction.jupiter_program_authority = Some(jupiter_program_authority);
1196 self
1197 }
1198 #[inline(always)]
1202 pub fn token_program(&mut self, token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1203 self.instruction.token_program = Some(token_program);
1204 self
1205 }
1206 #[inline(always)]
1207 pub fn memo_program(&mut self, memo_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1208 self.instruction.memo_program = Some(memo_program);
1209 self
1210 }
1211 #[inline(always)]
1212 pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
1213 self.instruction.system_program = Some(system_program);
1214 self
1215 }
1216 #[inline(always)]
1217 pub fn decrease_percent(&mut self, decrease_percent: u32) -> &mut Self {
1218 self.instruction.decrease_percent = Some(decrease_percent);
1219 self
1220 }
1221 #[inline(always)]
1222 pub fn route_data(&mut self, route_data: Vec<u8>) -> &mut Self {
1223 self.instruction.route_data = Some(route_data);
1224 self
1225 }
1226 #[inline(always)]
1228 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
1229 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
1230 self
1231 }
1232 #[inline(always)]
1237 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
1238 self.instruction.__remaining_accounts.extend_from_slice(accounts);
1239 self
1240 }
1241 #[inline(always)]
1242 pub fn invoke(&self) -> solana_program_error::ProgramResult {
1243 self.invoke_signed(&[])
1244 }
1245 #[allow(clippy::clone_on_copy)]
1246 #[allow(clippy::vec_init_then_push)]
1247 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
1248 let args = LiquidateTunaSpotPositionJupiterInstructionArgs {
1249 decrease_percent: self.instruction.decrease_percent.clone().expect("decrease_percent is not set"),
1250 route_data: self.instruction.route_data.clone().expect("route_data is not set"),
1251 };
1252 let instruction = LiquidateTunaSpotPositionJupiterCpi {
1253 __program: self.instruction.__program,
1254
1255 authority: self.instruction.authority.expect("authority is not set"),
1256
1257 tuna_config: self.instruction.tuna_config.expect("tuna_config is not set"),
1258
1259 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
1260
1261 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
1262
1263 token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
1264
1265 token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
1266
1267 market: self.instruction.market.expect("market is not set"),
1268
1269 vault_a: self.instruction.vault_a.expect("vault_a is not set"),
1270
1271 vault_b: self.instruction.vault_b.expect("vault_b is not set"),
1272
1273 vault_a_ata: self.instruction.vault_a_ata.expect("vault_a_ata is not set"),
1274
1275 vault_b_ata: self.instruction.vault_b_ata.expect("vault_b_ata is not set"),
1276
1277 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
1278
1279 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
1280
1281 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
1282
1283 fee_recipient_ata_a: self.instruction.fee_recipient_ata_a.expect("fee_recipient_ata_a is not set"),
1284
1285 fee_recipient_ata_b: self.instruction.fee_recipient_ata_b.expect("fee_recipient_ata_b is not set"),
1286
1287 tuna_position_owner: self.instruction.tuna_position_owner.expect("tuna_position_owner is not set"),
1288
1289 tuna_position_owner_ata_a: self.instruction.tuna_position_owner_ata_a.expect("tuna_position_owner_ata_a is not set"),
1290
1291 tuna_position_owner_ata_b: self.instruction.tuna_position_owner_ata_b.expect("tuna_position_owner_ata_b is not set"),
1292
1293 pyth_oracle_price_feed_a: self.instruction.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
1294
1295 pyth_oracle_price_feed_b: self.instruction.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
1296
1297 pool: self.instruction.pool.expect("pool is not set"),
1298
1299 jupiter_program: self.instruction.jupiter_program.expect("jupiter_program is not set"),
1300
1301 jupiter_event_authority: self.instruction.jupiter_event_authority.expect("jupiter_event_authority is not set"),
1302
1303 jupiter_program_authority: self.instruction.jupiter_program_authority.expect("jupiter_program_authority is not set"),
1304
1305 token_program: self.instruction.token_program.expect("token_program is not set"),
1306
1307 memo_program: self.instruction.memo_program.expect("memo_program is not set"),
1308
1309 system_program: self.instruction.system_program.expect("system_program is not set"),
1310 __args: args,
1311 };
1312 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
1313 }
1314}
1315
1316#[derive(Clone, Debug)]
1317struct LiquidateTunaSpotPositionJupiterCpiBuilderInstruction<'a, 'b> {
1318 __program: &'b solana_account_info::AccountInfo<'a>,
1319 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
1320 tuna_config: Option<&'b solana_account_info::AccountInfo<'a>>,
1321 mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1322 mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1323 token_program_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1324 token_program_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1325 market: Option<&'b solana_account_info::AccountInfo<'a>>,
1326 vault_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1327 vault_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1328 vault_a_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
1329 vault_b_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
1330 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
1331 tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1332 tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1333 fee_recipient_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1334 fee_recipient_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1335 tuna_position_owner: Option<&'b solana_account_info::AccountInfo<'a>>,
1336 tuna_position_owner_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1337 tuna_position_owner_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1338 pyth_oracle_price_feed_a: Option<&'b solana_account_info::AccountInfo<'a>>,
1339 pyth_oracle_price_feed_b: Option<&'b solana_account_info::AccountInfo<'a>>,
1340 pool: Option<&'b solana_account_info::AccountInfo<'a>>,
1341 jupiter_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1342 jupiter_event_authority: Option<&'b solana_account_info::AccountInfo<'a>>,
1343 jupiter_program_authority: Option<&'b solana_account_info::AccountInfo<'a>>,
1344 token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1345 memo_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1346 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
1347 decrease_percent: Option<u32>,
1348 route_data: Option<Vec<u8>>,
1349 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
1351}
1352