1use crate::generated::types::RemainingAccountsInfo;
9use borsh::BorshSerialize;
10use borsh::BorshDeserialize;
11
12#[derive(Debug)]
14pub struct LiquidatePositionFusion {
15 pub authority: solana_program::pubkey::Pubkey,
22
23
24 pub tuna_config: solana_program::pubkey::Pubkey,
25
26
27 pub mint_a: solana_program::pubkey::Pubkey,
28
29
30 pub mint_b: solana_program::pubkey::Pubkey,
31
32
33 pub token_program_a: solana_program::pubkey::Pubkey,
34
35
36 pub token_program_b: solana_program::pubkey::Pubkey,
37
38
39 pub market: solana_program::pubkey::Pubkey,
40
41
42 pub vault_a: solana_program::pubkey::Pubkey,
43
44
45 pub vault_b: solana_program::pubkey::Pubkey,
46
47
48 pub vault_a_ata: solana_program::pubkey::Pubkey,
49
50
51 pub vault_b_ata: solana_program::pubkey::Pubkey,
52
53
54 pub tuna_position: solana_program::pubkey::Pubkey,
55
56
57 pub tuna_position_ata: solana_program::pubkey::Pubkey,
58
59
60 pub tuna_position_ata_a: solana_program::pubkey::Pubkey,
61
62
63 pub tuna_position_ata_b: solana_program::pubkey::Pubkey,
64
65
66 pub liquidation_fee_recipient_ata_a: solana_program::pubkey::Pubkey,
67
68
69 pub liquidation_fee_recipient_ata_b: solana_program::pubkey::Pubkey,
70
71
72 pub pyth_oracle_price_feed_a: solana_program::pubkey::Pubkey,
73
74
75 pub pyth_oracle_price_feed_b: solana_program::pubkey::Pubkey,
76 pub fusionamm_program: solana_program::pubkey::Pubkey,
83
84
85 pub fusion_pool: solana_program::pubkey::Pubkey,
86
87
88 pub fusion_position: solana_program::pubkey::Pubkey,
89
90
91 pub memo_program: solana_program::pubkey::Pubkey,
92 }
93
94impl LiquidatePositionFusion {
95 pub fn instruction(&self, args: LiquidatePositionFusionInstructionArgs) -> solana_program::instruction::Instruction {
96 self.instruction_with_remaining_accounts(args, &[])
97 }
98 #[allow(clippy::arithmetic_side_effects)]
99 #[allow(clippy::vec_init_then_push)]
100 pub fn instruction_with_remaining_accounts(&self, args: LiquidatePositionFusionInstructionArgs, remaining_accounts: &[solana_program::instruction::AccountMeta]) -> solana_program::instruction::Instruction {
101 let mut accounts = Vec::with_capacity(23+ remaining_accounts.len());
102 accounts.push(solana_program::instruction::AccountMeta::new(
103 self.authority,
104 true
105 ));
106 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
107 self.tuna_config,
108 false
109 ));
110 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
111 self.mint_a,
112 false
113 ));
114 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
115 self.mint_b,
116 false
117 ));
118 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
119 self.token_program_a,
120 false
121 ));
122 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
123 self.token_program_b,
124 false
125 ));
126 accounts.push(solana_program::instruction::AccountMeta::new(
127 self.market,
128 false
129 ));
130 accounts.push(solana_program::instruction::AccountMeta::new(
131 self.vault_a,
132 false
133 ));
134 accounts.push(solana_program::instruction::AccountMeta::new(
135 self.vault_b,
136 false
137 ));
138 accounts.push(solana_program::instruction::AccountMeta::new(
139 self.vault_a_ata,
140 false
141 ));
142 accounts.push(solana_program::instruction::AccountMeta::new(
143 self.vault_b_ata,
144 false
145 ));
146 accounts.push(solana_program::instruction::AccountMeta::new(
147 self.tuna_position,
148 false
149 ));
150 accounts.push(solana_program::instruction::AccountMeta::new(
151 self.tuna_position_ata,
152 false
153 ));
154 accounts.push(solana_program::instruction::AccountMeta::new(
155 self.tuna_position_ata_a,
156 false
157 ));
158 accounts.push(solana_program::instruction::AccountMeta::new(
159 self.tuna_position_ata_b,
160 false
161 ));
162 accounts.push(solana_program::instruction::AccountMeta::new(
163 self.liquidation_fee_recipient_ata_a,
164 false
165 ));
166 accounts.push(solana_program::instruction::AccountMeta::new(
167 self.liquidation_fee_recipient_ata_b,
168 false
169 ));
170 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
171 self.pyth_oracle_price_feed_a,
172 false
173 ));
174 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
175 self.pyth_oracle_price_feed_b,
176 false
177 ));
178 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
179 self.fusionamm_program,
180 false
181 ));
182 accounts.push(solana_program::instruction::AccountMeta::new(
183 self.fusion_pool,
184 false
185 ));
186 accounts.push(solana_program::instruction::AccountMeta::new(
187 self.fusion_position,
188 false
189 ));
190 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
191 self.memo_program,
192 false
193 ));
194 accounts.extend_from_slice(remaining_accounts);
195 let mut data = borsh::to_vec(&LiquidatePositionFusionInstructionData::new()).unwrap();
196 let mut args = borsh::to_vec(&args).unwrap();
197 data.append(&mut args);
198
199 solana_program::instruction::Instruction {
200 program_id: crate::TUNA_ID,
201 accounts,
202 data,
203 }
204 }
205}
206
207#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
208#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
209 pub struct LiquidatePositionFusionInstructionData {
210 discriminator: [u8; 8],
211 }
212
213impl LiquidatePositionFusionInstructionData {
214 pub fn new() -> Self {
215 Self {
216 discriminator: [57, 160, 162, 122, 114, 173, 138, 220],
217 }
218 }
219}
220
221impl Default for LiquidatePositionFusionInstructionData {
222 fn default() -> Self {
223 Self::new()
224 }
225}
226
227#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
228#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
229 pub struct LiquidatePositionFusionInstructionArgs {
230 pub withdraw_percent: u32,
231 pub remaining_accounts_info: RemainingAccountsInfo,
232 }
233
234
235#[derive(Clone, Debug, Default)]
263pub struct LiquidatePositionFusionBuilder {
264 authority: Option<solana_program::pubkey::Pubkey>,
265 tuna_config: Option<solana_program::pubkey::Pubkey>,
266 mint_a: Option<solana_program::pubkey::Pubkey>,
267 mint_b: Option<solana_program::pubkey::Pubkey>,
268 token_program_a: Option<solana_program::pubkey::Pubkey>,
269 token_program_b: Option<solana_program::pubkey::Pubkey>,
270 market: Option<solana_program::pubkey::Pubkey>,
271 vault_a: Option<solana_program::pubkey::Pubkey>,
272 vault_b: Option<solana_program::pubkey::Pubkey>,
273 vault_a_ata: Option<solana_program::pubkey::Pubkey>,
274 vault_b_ata: Option<solana_program::pubkey::Pubkey>,
275 tuna_position: Option<solana_program::pubkey::Pubkey>,
276 tuna_position_ata: Option<solana_program::pubkey::Pubkey>,
277 tuna_position_ata_a: Option<solana_program::pubkey::Pubkey>,
278 tuna_position_ata_b: Option<solana_program::pubkey::Pubkey>,
279 liquidation_fee_recipient_ata_a: Option<solana_program::pubkey::Pubkey>,
280 liquidation_fee_recipient_ata_b: Option<solana_program::pubkey::Pubkey>,
281 pyth_oracle_price_feed_a: Option<solana_program::pubkey::Pubkey>,
282 pyth_oracle_price_feed_b: Option<solana_program::pubkey::Pubkey>,
283 fusionamm_program: Option<solana_program::pubkey::Pubkey>,
284 fusion_pool: Option<solana_program::pubkey::Pubkey>,
285 fusion_position: Option<solana_program::pubkey::Pubkey>,
286 memo_program: Option<solana_program::pubkey::Pubkey>,
287 withdraw_percent: Option<u32>,
288 remaining_accounts_info: Option<RemainingAccountsInfo>,
289 __remaining_accounts: Vec<solana_program::instruction::AccountMeta>,
290}
291
292impl LiquidatePositionFusionBuilder {
293 pub fn new() -> Self {
294 Self::default()
295 }
296 #[inline(always)]
300 pub fn authority(&mut self, authority: solana_program::pubkey::Pubkey) -> &mut Self {
301 self.authority = Some(authority);
302 self
303 }
304 #[inline(always)]
305 pub fn tuna_config(&mut self, tuna_config: solana_program::pubkey::Pubkey) -> &mut Self {
306 self.tuna_config = Some(tuna_config);
307 self
308 }
309 #[inline(always)]
310 pub fn mint_a(&mut self, mint_a: solana_program::pubkey::Pubkey) -> &mut Self {
311 self.mint_a = Some(mint_a);
312 self
313 }
314 #[inline(always)]
315 pub fn mint_b(&mut self, mint_b: solana_program::pubkey::Pubkey) -> &mut Self {
316 self.mint_b = Some(mint_b);
317 self
318 }
319 #[inline(always)]
320 pub fn token_program_a(&mut self, token_program_a: solana_program::pubkey::Pubkey) -> &mut Self {
321 self.token_program_a = Some(token_program_a);
322 self
323 }
324 #[inline(always)]
325 pub fn token_program_b(&mut self, token_program_b: solana_program::pubkey::Pubkey) -> &mut Self {
326 self.token_program_b = Some(token_program_b);
327 self
328 }
329 #[inline(always)]
330 pub fn market(&mut self, market: solana_program::pubkey::Pubkey) -> &mut Self {
331 self.market = Some(market);
332 self
333 }
334 #[inline(always)]
335 pub fn vault_a(&mut self, vault_a: solana_program::pubkey::Pubkey) -> &mut Self {
336 self.vault_a = Some(vault_a);
337 self
338 }
339 #[inline(always)]
340 pub fn vault_b(&mut self, vault_b: solana_program::pubkey::Pubkey) -> &mut Self {
341 self.vault_b = Some(vault_b);
342 self
343 }
344 #[inline(always)]
345 pub fn vault_a_ata(&mut self, vault_a_ata: solana_program::pubkey::Pubkey) -> &mut Self {
346 self.vault_a_ata = Some(vault_a_ata);
347 self
348 }
349 #[inline(always)]
350 pub fn vault_b_ata(&mut self, vault_b_ata: solana_program::pubkey::Pubkey) -> &mut Self {
351 self.vault_b_ata = Some(vault_b_ata);
352 self
353 }
354 #[inline(always)]
355 pub fn tuna_position(&mut self, tuna_position: solana_program::pubkey::Pubkey) -> &mut Self {
356 self.tuna_position = Some(tuna_position);
357 self
358 }
359 #[inline(always)]
360 pub fn tuna_position_ata(&mut self, tuna_position_ata: solana_program::pubkey::Pubkey) -> &mut Self {
361 self.tuna_position_ata = Some(tuna_position_ata);
362 self
363 }
364 #[inline(always)]
365 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_program::pubkey::Pubkey) -> &mut Self {
366 self.tuna_position_ata_a = Some(tuna_position_ata_a);
367 self
368 }
369 #[inline(always)]
370 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_program::pubkey::Pubkey) -> &mut Self {
371 self.tuna_position_ata_b = Some(tuna_position_ata_b);
372 self
373 }
374 #[inline(always)]
375 pub fn liquidation_fee_recipient_ata_a(&mut self, liquidation_fee_recipient_ata_a: solana_program::pubkey::Pubkey) -> &mut Self {
376 self.liquidation_fee_recipient_ata_a = Some(liquidation_fee_recipient_ata_a);
377 self
378 }
379 #[inline(always)]
380 pub fn liquidation_fee_recipient_ata_b(&mut self, liquidation_fee_recipient_ata_b: solana_program::pubkey::Pubkey) -> &mut Self {
381 self.liquidation_fee_recipient_ata_b = Some(liquidation_fee_recipient_ata_b);
382 self
383 }
384 #[inline(always)]
385 pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: solana_program::pubkey::Pubkey) -> &mut Self {
386 self.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
387 self
388 }
389 #[inline(always)]
390 pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: solana_program::pubkey::Pubkey) -> &mut Self {
391 self.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
392 self
393 }
394 #[inline(always)]
398 pub fn fusionamm_program(&mut self, fusionamm_program: solana_program::pubkey::Pubkey) -> &mut Self {
399 self.fusionamm_program = Some(fusionamm_program);
400 self
401 }
402 #[inline(always)]
403 pub fn fusion_pool(&mut self, fusion_pool: solana_program::pubkey::Pubkey) -> &mut Self {
404 self.fusion_pool = Some(fusion_pool);
405 self
406 }
407 #[inline(always)]
408 pub fn fusion_position(&mut self, fusion_position: solana_program::pubkey::Pubkey) -> &mut Self {
409 self.fusion_position = Some(fusion_position);
410 self
411 }
412 #[inline(always)]
413 pub fn memo_program(&mut self, memo_program: solana_program::pubkey::Pubkey) -> &mut Self {
414 self.memo_program = Some(memo_program);
415 self
416 }
417 #[inline(always)]
418 pub fn withdraw_percent(&mut self, withdraw_percent: u32) -> &mut Self {
419 self.withdraw_percent = Some(withdraw_percent);
420 self
421 }
422 #[inline(always)]
423 pub fn remaining_accounts_info(&mut self, remaining_accounts_info: RemainingAccountsInfo) -> &mut Self {
424 self.remaining_accounts_info = Some(remaining_accounts_info);
425 self
426 }
427 #[inline(always)]
429 pub fn add_remaining_account(&mut self, account: solana_program::instruction::AccountMeta) -> &mut Self {
430 self.__remaining_accounts.push(account);
431 self
432 }
433 #[inline(always)]
435 pub fn add_remaining_accounts(&mut self, accounts: &[solana_program::instruction::AccountMeta]) -> &mut Self {
436 self.__remaining_accounts.extend_from_slice(accounts);
437 self
438 }
439 #[allow(clippy::clone_on_copy)]
440 pub fn instruction(&self) -> solana_program::instruction::Instruction {
441 let accounts = LiquidatePositionFusion {
442 authority: self.authority.expect("authority is not set"),
443 tuna_config: self.tuna_config.expect("tuna_config is not set"),
444 mint_a: self.mint_a.expect("mint_a is not set"),
445 mint_b: self.mint_b.expect("mint_b is not set"),
446 token_program_a: self.token_program_a.expect("token_program_a is not set"),
447 token_program_b: self.token_program_b.expect("token_program_b is not set"),
448 market: self.market.expect("market is not set"),
449 vault_a: self.vault_a.expect("vault_a is not set"),
450 vault_b: self.vault_b.expect("vault_b is not set"),
451 vault_a_ata: self.vault_a_ata.expect("vault_a_ata is not set"),
452 vault_b_ata: self.vault_b_ata.expect("vault_b_ata is not set"),
453 tuna_position: self.tuna_position.expect("tuna_position is not set"),
454 tuna_position_ata: self.tuna_position_ata.expect("tuna_position_ata is not set"),
455 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
456 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
457 liquidation_fee_recipient_ata_a: self.liquidation_fee_recipient_ata_a.expect("liquidation_fee_recipient_ata_a is not set"),
458 liquidation_fee_recipient_ata_b: self.liquidation_fee_recipient_ata_b.expect("liquidation_fee_recipient_ata_b is not set"),
459 pyth_oracle_price_feed_a: self.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
460 pyth_oracle_price_feed_b: self.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
461 fusionamm_program: self.fusionamm_program.expect("fusionamm_program is not set"),
462 fusion_pool: self.fusion_pool.expect("fusion_pool is not set"),
463 fusion_position: self.fusion_position.expect("fusion_position is not set"),
464 memo_program: self.memo_program.expect("memo_program is not set"),
465 };
466 let args = LiquidatePositionFusionInstructionArgs {
467 withdraw_percent: self.withdraw_percent.clone().expect("withdraw_percent is not set"),
468 remaining_accounts_info: self.remaining_accounts_info.clone().expect("remaining_accounts_info is not set"),
469 };
470
471 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
472 }
473}
474
475 pub struct LiquidatePositionFusionCpiAccounts<'a, 'b> {
477 pub authority: &'b solana_program::account_info::AccountInfo<'a>,
484
485
486 pub tuna_config: &'b solana_program::account_info::AccountInfo<'a>,
487
488
489 pub mint_a: &'b solana_program::account_info::AccountInfo<'a>,
490
491
492 pub mint_b: &'b solana_program::account_info::AccountInfo<'a>,
493
494
495 pub token_program_a: &'b solana_program::account_info::AccountInfo<'a>,
496
497
498 pub token_program_b: &'b solana_program::account_info::AccountInfo<'a>,
499
500
501 pub market: &'b solana_program::account_info::AccountInfo<'a>,
502
503
504 pub vault_a: &'b solana_program::account_info::AccountInfo<'a>,
505
506
507 pub vault_b: &'b solana_program::account_info::AccountInfo<'a>,
508
509
510 pub vault_a_ata: &'b solana_program::account_info::AccountInfo<'a>,
511
512
513 pub vault_b_ata: &'b solana_program::account_info::AccountInfo<'a>,
514
515
516 pub tuna_position: &'b solana_program::account_info::AccountInfo<'a>,
517
518
519 pub tuna_position_ata: &'b solana_program::account_info::AccountInfo<'a>,
520
521
522 pub tuna_position_ata_a: &'b solana_program::account_info::AccountInfo<'a>,
523
524
525 pub tuna_position_ata_b: &'b solana_program::account_info::AccountInfo<'a>,
526
527
528 pub liquidation_fee_recipient_ata_a: &'b solana_program::account_info::AccountInfo<'a>,
529
530
531 pub liquidation_fee_recipient_ata_b: &'b solana_program::account_info::AccountInfo<'a>,
532
533
534 pub pyth_oracle_price_feed_a: &'b solana_program::account_info::AccountInfo<'a>,
535
536
537 pub pyth_oracle_price_feed_b: &'b solana_program::account_info::AccountInfo<'a>,
538 pub fusionamm_program: &'b solana_program::account_info::AccountInfo<'a>,
545
546
547 pub fusion_pool: &'b solana_program::account_info::AccountInfo<'a>,
548
549
550 pub fusion_position: &'b solana_program::account_info::AccountInfo<'a>,
551
552
553 pub memo_program: &'b solana_program::account_info::AccountInfo<'a>,
554 }
555
556pub struct LiquidatePositionFusionCpi<'a, 'b> {
558 pub __program: &'b solana_program::account_info::AccountInfo<'a>,
560 pub authority: &'b solana_program::account_info::AccountInfo<'a>,
567
568
569 pub tuna_config: &'b solana_program::account_info::AccountInfo<'a>,
570
571
572 pub mint_a: &'b solana_program::account_info::AccountInfo<'a>,
573
574
575 pub mint_b: &'b solana_program::account_info::AccountInfo<'a>,
576
577
578 pub token_program_a: &'b solana_program::account_info::AccountInfo<'a>,
579
580
581 pub token_program_b: &'b solana_program::account_info::AccountInfo<'a>,
582
583
584 pub market: &'b solana_program::account_info::AccountInfo<'a>,
585
586
587 pub vault_a: &'b solana_program::account_info::AccountInfo<'a>,
588
589
590 pub vault_b: &'b solana_program::account_info::AccountInfo<'a>,
591
592
593 pub vault_a_ata: &'b solana_program::account_info::AccountInfo<'a>,
594
595
596 pub vault_b_ata: &'b solana_program::account_info::AccountInfo<'a>,
597
598
599 pub tuna_position: &'b solana_program::account_info::AccountInfo<'a>,
600
601
602 pub tuna_position_ata: &'b solana_program::account_info::AccountInfo<'a>,
603
604
605 pub tuna_position_ata_a: &'b solana_program::account_info::AccountInfo<'a>,
606
607
608 pub tuna_position_ata_b: &'b solana_program::account_info::AccountInfo<'a>,
609
610
611 pub liquidation_fee_recipient_ata_a: &'b solana_program::account_info::AccountInfo<'a>,
612
613
614 pub liquidation_fee_recipient_ata_b: &'b solana_program::account_info::AccountInfo<'a>,
615
616
617 pub pyth_oracle_price_feed_a: &'b solana_program::account_info::AccountInfo<'a>,
618
619
620 pub pyth_oracle_price_feed_b: &'b solana_program::account_info::AccountInfo<'a>,
621 pub fusionamm_program: &'b solana_program::account_info::AccountInfo<'a>,
628
629
630 pub fusion_pool: &'b solana_program::account_info::AccountInfo<'a>,
631
632
633 pub fusion_position: &'b solana_program::account_info::AccountInfo<'a>,
634
635
636 pub memo_program: &'b solana_program::account_info::AccountInfo<'a>,
637 pub __args: LiquidatePositionFusionInstructionArgs,
639 }
640
641impl<'a, 'b> LiquidatePositionFusionCpi<'a, 'b> {
642 pub fn new(
643 program: &'b solana_program::account_info::AccountInfo<'a>,
644 accounts: LiquidatePositionFusionCpiAccounts<'a, 'b>,
645 args: LiquidatePositionFusionInstructionArgs,
646 ) -> Self {
647 Self {
648 __program: program,
649 authority: accounts.authority,
650 tuna_config: accounts.tuna_config,
651 mint_a: accounts.mint_a,
652 mint_b: accounts.mint_b,
653 token_program_a: accounts.token_program_a,
654 token_program_b: accounts.token_program_b,
655 market: accounts.market,
656 vault_a: accounts.vault_a,
657 vault_b: accounts.vault_b,
658 vault_a_ata: accounts.vault_a_ata,
659 vault_b_ata: accounts.vault_b_ata,
660 tuna_position: accounts.tuna_position,
661 tuna_position_ata: accounts.tuna_position_ata,
662 tuna_position_ata_a: accounts.tuna_position_ata_a,
663 tuna_position_ata_b: accounts.tuna_position_ata_b,
664 liquidation_fee_recipient_ata_a: accounts.liquidation_fee_recipient_ata_a,
665 liquidation_fee_recipient_ata_b: accounts.liquidation_fee_recipient_ata_b,
666 pyth_oracle_price_feed_a: accounts.pyth_oracle_price_feed_a,
667 pyth_oracle_price_feed_b: accounts.pyth_oracle_price_feed_b,
668 fusionamm_program: accounts.fusionamm_program,
669 fusion_pool: accounts.fusion_pool,
670 fusion_position: accounts.fusion_position,
671 memo_program: accounts.memo_program,
672 __args: args,
673 }
674 }
675 #[inline(always)]
676 pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult {
677 self.invoke_signed_with_remaining_accounts(&[], &[])
678 }
679 #[inline(always)]
680 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_program::account_info::AccountInfo<'a>, bool, bool)]) -> solana_program::entrypoint::ProgramResult {
681 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
682 }
683 #[inline(always)]
684 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program::entrypoint::ProgramResult {
685 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
686 }
687 #[allow(clippy::arithmetic_side_effects)]
688 #[allow(clippy::clone_on_copy)]
689 #[allow(clippy::vec_init_then_push)]
690 pub fn invoke_signed_with_remaining_accounts(
691 &self,
692 signers_seeds: &[&[&[u8]]],
693 remaining_accounts: &[(&'b solana_program::account_info::AccountInfo<'a>, bool, bool)]
694 ) -> solana_program::entrypoint::ProgramResult {
695 let mut accounts = Vec::with_capacity(23+ remaining_accounts.len());
696 accounts.push(solana_program::instruction::AccountMeta::new(
697 *self.authority.key,
698 true
699 ));
700 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
701 *self.tuna_config.key,
702 false
703 ));
704 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
705 *self.mint_a.key,
706 false
707 ));
708 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
709 *self.mint_b.key,
710 false
711 ));
712 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
713 *self.token_program_a.key,
714 false
715 ));
716 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
717 *self.token_program_b.key,
718 false
719 ));
720 accounts.push(solana_program::instruction::AccountMeta::new(
721 *self.market.key,
722 false
723 ));
724 accounts.push(solana_program::instruction::AccountMeta::new(
725 *self.vault_a.key,
726 false
727 ));
728 accounts.push(solana_program::instruction::AccountMeta::new(
729 *self.vault_b.key,
730 false
731 ));
732 accounts.push(solana_program::instruction::AccountMeta::new(
733 *self.vault_a_ata.key,
734 false
735 ));
736 accounts.push(solana_program::instruction::AccountMeta::new(
737 *self.vault_b_ata.key,
738 false
739 ));
740 accounts.push(solana_program::instruction::AccountMeta::new(
741 *self.tuna_position.key,
742 false
743 ));
744 accounts.push(solana_program::instruction::AccountMeta::new(
745 *self.tuna_position_ata.key,
746 false
747 ));
748 accounts.push(solana_program::instruction::AccountMeta::new(
749 *self.tuna_position_ata_a.key,
750 false
751 ));
752 accounts.push(solana_program::instruction::AccountMeta::new(
753 *self.tuna_position_ata_b.key,
754 false
755 ));
756 accounts.push(solana_program::instruction::AccountMeta::new(
757 *self.liquidation_fee_recipient_ata_a.key,
758 false
759 ));
760 accounts.push(solana_program::instruction::AccountMeta::new(
761 *self.liquidation_fee_recipient_ata_b.key,
762 false
763 ));
764 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
765 *self.pyth_oracle_price_feed_a.key,
766 false
767 ));
768 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
769 *self.pyth_oracle_price_feed_b.key,
770 false
771 ));
772 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
773 *self.fusionamm_program.key,
774 false
775 ));
776 accounts.push(solana_program::instruction::AccountMeta::new(
777 *self.fusion_pool.key,
778 false
779 ));
780 accounts.push(solana_program::instruction::AccountMeta::new(
781 *self.fusion_position.key,
782 false
783 ));
784 accounts.push(solana_program::instruction::AccountMeta::new_readonly(
785 *self.memo_program.key,
786 false
787 ));
788 remaining_accounts.iter().for_each(|remaining_account| {
789 accounts.push(solana_program::instruction::AccountMeta {
790 pubkey: *remaining_account.0.key,
791 is_signer: remaining_account.1,
792 is_writable: remaining_account.2,
793 })
794 });
795 let mut data = borsh::to_vec(&LiquidatePositionFusionInstructionData::new()).unwrap();
796 let mut args = borsh::to_vec(&self.__args).unwrap();
797 data.append(&mut args);
798
799 let instruction = solana_program::instruction::Instruction {
800 program_id: crate::TUNA_ID,
801 accounts,
802 data,
803 };
804 let mut account_infos = Vec::with_capacity(24 + remaining_accounts.len());
805 account_infos.push(self.__program.clone());
806 account_infos.push(self.authority.clone());
807 account_infos.push(self.tuna_config.clone());
808 account_infos.push(self.mint_a.clone());
809 account_infos.push(self.mint_b.clone());
810 account_infos.push(self.token_program_a.clone());
811 account_infos.push(self.token_program_b.clone());
812 account_infos.push(self.market.clone());
813 account_infos.push(self.vault_a.clone());
814 account_infos.push(self.vault_b.clone());
815 account_infos.push(self.vault_a_ata.clone());
816 account_infos.push(self.vault_b_ata.clone());
817 account_infos.push(self.tuna_position.clone());
818 account_infos.push(self.tuna_position_ata.clone());
819 account_infos.push(self.tuna_position_ata_a.clone());
820 account_infos.push(self.tuna_position_ata_b.clone());
821 account_infos.push(self.liquidation_fee_recipient_ata_a.clone());
822 account_infos.push(self.liquidation_fee_recipient_ata_b.clone());
823 account_infos.push(self.pyth_oracle_price_feed_a.clone());
824 account_infos.push(self.pyth_oracle_price_feed_b.clone());
825 account_infos.push(self.fusionamm_program.clone());
826 account_infos.push(self.fusion_pool.clone());
827 account_infos.push(self.fusion_position.clone());
828 account_infos.push(self.memo_program.clone());
829 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
830
831 if signers_seeds.is_empty() {
832 solana_program::program::invoke(&instruction, &account_infos)
833 } else {
834 solana_program::program::invoke_signed(&instruction, &account_infos, signers_seeds)
835 }
836 }
837}
838
839#[derive(Clone, Debug)]
867pub struct LiquidatePositionFusionCpiBuilder<'a, 'b> {
868 instruction: Box<LiquidatePositionFusionCpiBuilderInstruction<'a, 'b>>,
869}
870
871impl<'a, 'b> LiquidatePositionFusionCpiBuilder<'a, 'b> {
872 pub fn new(program: &'b solana_program::account_info::AccountInfo<'a>) -> Self {
873 let instruction = Box::new(LiquidatePositionFusionCpiBuilderInstruction {
874 __program: program,
875 authority: None,
876 tuna_config: None,
877 mint_a: None,
878 mint_b: None,
879 token_program_a: None,
880 token_program_b: None,
881 market: None,
882 vault_a: None,
883 vault_b: None,
884 vault_a_ata: None,
885 vault_b_ata: None,
886 tuna_position: None,
887 tuna_position_ata: None,
888 tuna_position_ata_a: None,
889 tuna_position_ata_b: None,
890 liquidation_fee_recipient_ata_a: None,
891 liquidation_fee_recipient_ata_b: None,
892 pyth_oracle_price_feed_a: None,
893 pyth_oracle_price_feed_b: None,
894 fusionamm_program: None,
895 fusion_pool: None,
896 fusion_position: None,
897 memo_program: None,
898 withdraw_percent: None,
899 remaining_accounts_info: None,
900 __remaining_accounts: Vec::new(),
901 });
902 Self { instruction }
903 }
904 #[inline(always)]
908 pub fn authority(&mut self, authority: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
909 self.instruction.authority = Some(authority);
910 self
911 }
912 #[inline(always)]
913 pub fn tuna_config(&mut self, tuna_config: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
914 self.instruction.tuna_config = Some(tuna_config);
915 self
916 }
917 #[inline(always)]
918 pub fn mint_a(&mut self, mint_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
919 self.instruction.mint_a = Some(mint_a);
920 self
921 }
922 #[inline(always)]
923 pub fn mint_b(&mut self, mint_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
924 self.instruction.mint_b = Some(mint_b);
925 self
926 }
927 #[inline(always)]
928 pub fn token_program_a(&mut self, token_program_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
929 self.instruction.token_program_a = Some(token_program_a);
930 self
931 }
932 #[inline(always)]
933 pub fn token_program_b(&mut self, token_program_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
934 self.instruction.token_program_b = Some(token_program_b);
935 self
936 }
937 #[inline(always)]
938 pub fn market(&mut self, market: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
939 self.instruction.market = Some(market);
940 self
941 }
942 #[inline(always)]
943 pub fn vault_a(&mut self, vault_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
944 self.instruction.vault_a = Some(vault_a);
945 self
946 }
947 #[inline(always)]
948 pub fn vault_b(&mut self, vault_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
949 self.instruction.vault_b = Some(vault_b);
950 self
951 }
952 #[inline(always)]
953 pub fn vault_a_ata(&mut self, vault_a_ata: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
954 self.instruction.vault_a_ata = Some(vault_a_ata);
955 self
956 }
957 #[inline(always)]
958 pub fn vault_b_ata(&mut self, vault_b_ata: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
959 self.instruction.vault_b_ata = Some(vault_b_ata);
960 self
961 }
962 #[inline(always)]
963 pub fn tuna_position(&mut self, tuna_position: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
964 self.instruction.tuna_position = Some(tuna_position);
965 self
966 }
967 #[inline(always)]
968 pub fn tuna_position_ata(&mut self, tuna_position_ata: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
969 self.instruction.tuna_position_ata = Some(tuna_position_ata);
970 self
971 }
972 #[inline(always)]
973 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
974 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
975 self
976 }
977 #[inline(always)]
978 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
979 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
980 self
981 }
982 #[inline(always)]
983 pub fn liquidation_fee_recipient_ata_a(&mut self, liquidation_fee_recipient_ata_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
984 self.instruction.liquidation_fee_recipient_ata_a = Some(liquidation_fee_recipient_ata_a);
985 self
986 }
987 #[inline(always)]
988 pub fn liquidation_fee_recipient_ata_b(&mut self, liquidation_fee_recipient_ata_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
989 self.instruction.liquidation_fee_recipient_ata_b = Some(liquidation_fee_recipient_ata_b);
990 self
991 }
992 #[inline(always)]
993 pub fn pyth_oracle_price_feed_a(&mut self, pyth_oracle_price_feed_a: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
994 self.instruction.pyth_oracle_price_feed_a = Some(pyth_oracle_price_feed_a);
995 self
996 }
997 #[inline(always)]
998 pub fn pyth_oracle_price_feed_b(&mut self, pyth_oracle_price_feed_b: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
999 self.instruction.pyth_oracle_price_feed_b = Some(pyth_oracle_price_feed_b);
1000 self
1001 }
1002 #[inline(always)]
1006 pub fn fusionamm_program(&mut self, fusionamm_program: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
1007 self.instruction.fusionamm_program = Some(fusionamm_program);
1008 self
1009 }
1010 #[inline(always)]
1011 pub fn fusion_pool(&mut self, fusion_pool: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
1012 self.instruction.fusion_pool = Some(fusion_pool);
1013 self
1014 }
1015 #[inline(always)]
1016 pub fn fusion_position(&mut self, fusion_position: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
1017 self.instruction.fusion_position = Some(fusion_position);
1018 self
1019 }
1020 #[inline(always)]
1021 pub fn memo_program(&mut self, memo_program: &'b solana_program::account_info::AccountInfo<'a>) -> &mut Self {
1022 self.instruction.memo_program = Some(memo_program);
1023 self
1024 }
1025 #[inline(always)]
1026 pub fn withdraw_percent(&mut self, withdraw_percent: u32) -> &mut Self {
1027 self.instruction.withdraw_percent = Some(withdraw_percent);
1028 self
1029 }
1030 #[inline(always)]
1031 pub fn remaining_accounts_info(&mut self, remaining_accounts_info: RemainingAccountsInfo) -> &mut Self {
1032 self.instruction.remaining_accounts_info = Some(remaining_accounts_info);
1033 self
1034 }
1035 #[inline(always)]
1037 pub fn add_remaining_account(&mut self, account: &'b solana_program::account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
1038 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
1039 self
1040 }
1041 #[inline(always)]
1046 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_program::account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
1047 self.instruction.__remaining_accounts.extend_from_slice(accounts);
1048 self
1049 }
1050 #[inline(always)]
1051 pub fn invoke(&self) -> solana_program::entrypoint::ProgramResult {
1052 self.invoke_signed(&[])
1053 }
1054 #[allow(clippy::clone_on_copy)]
1055 #[allow(clippy::vec_init_then_push)]
1056 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program::entrypoint::ProgramResult {
1057 let args = LiquidatePositionFusionInstructionArgs {
1058 withdraw_percent: self.instruction.withdraw_percent.clone().expect("withdraw_percent is not set"),
1059 remaining_accounts_info: self.instruction.remaining_accounts_info.clone().expect("remaining_accounts_info is not set"),
1060 };
1061 let instruction = LiquidatePositionFusionCpi {
1062 __program: self.instruction.__program,
1063
1064 authority: self.instruction.authority.expect("authority is not set"),
1065
1066 tuna_config: self.instruction.tuna_config.expect("tuna_config is not set"),
1067
1068 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
1069
1070 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
1071
1072 token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
1073
1074 token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
1075
1076 market: self.instruction.market.expect("market is not set"),
1077
1078 vault_a: self.instruction.vault_a.expect("vault_a is not set"),
1079
1080 vault_b: self.instruction.vault_b.expect("vault_b is not set"),
1081
1082 vault_a_ata: self.instruction.vault_a_ata.expect("vault_a_ata is not set"),
1083
1084 vault_b_ata: self.instruction.vault_b_ata.expect("vault_b_ata is not set"),
1085
1086 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
1087
1088 tuna_position_ata: self.instruction.tuna_position_ata.expect("tuna_position_ata is not set"),
1089
1090 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
1091
1092 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
1093
1094 liquidation_fee_recipient_ata_a: self.instruction.liquidation_fee_recipient_ata_a.expect("liquidation_fee_recipient_ata_a is not set"),
1095
1096 liquidation_fee_recipient_ata_b: self.instruction.liquidation_fee_recipient_ata_b.expect("liquidation_fee_recipient_ata_b is not set"),
1097
1098 pyth_oracle_price_feed_a: self.instruction.pyth_oracle_price_feed_a.expect("pyth_oracle_price_feed_a is not set"),
1099
1100 pyth_oracle_price_feed_b: self.instruction.pyth_oracle_price_feed_b.expect("pyth_oracle_price_feed_b is not set"),
1101
1102 fusionamm_program: self.instruction.fusionamm_program.expect("fusionamm_program is not set"),
1103
1104 fusion_pool: self.instruction.fusion_pool.expect("fusion_pool is not set"),
1105
1106 fusion_position: self.instruction.fusion_position.expect("fusion_position is not set"),
1107
1108 memo_program: self.instruction.memo_program.expect("memo_program is not set"),
1109 __args: args,
1110 };
1111 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
1112 }
1113}
1114
1115#[derive(Clone, Debug)]
1116struct LiquidatePositionFusionCpiBuilderInstruction<'a, 'b> {
1117 __program: &'b solana_program::account_info::AccountInfo<'a>,
1118 authority: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1119 tuna_config: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1120 mint_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1121 mint_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1122 token_program_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1123 token_program_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1124 market: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1125 vault_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1126 vault_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1127 vault_a_ata: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1128 vault_b_ata: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1129 tuna_position: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1130 tuna_position_ata: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1131 tuna_position_ata_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1132 tuna_position_ata_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1133 liquidation_fee_recipient_ata_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1134 liquidation_fee_recipient_ata_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1135 pyth_oracle_price_feed_a: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1136 pyth_oracle_price_feed_b: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1137 fusionamm_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1138 fusion_pool: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1139 fusion_position: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1140 memo_program: Option<&'b solana_program::account_info::AccountInfo<'a>>,
1141 withdraw_percent: Option<u32>,
1142 remaining_accounts_info: Option<RemainingAccountsInfo>,
1143 __remaining_accounts: Vec<(&'b solana_program::account_info::AccountInfo<'a>, bool, bool)>,
1145}
1146