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