1use crate::generated::types::PositionLockType;
9use borsh::BorshSerialize;
10use borsh::BorshDeserialize;
11
12pub const LOCK_LP_POSITION_FUSION_DISCRIMINATOR: [u8; 8] = [231, 87, 69, 13, 113, 64, 173, 208];
13
14#[derive(Debug)]
16pub struct LockLpPositionFusion {
17
18
19 pub authority: solana_pubkey::Pubkey,
20
21
22 pub tuna_position: solana_pubkey::Pubkey,
23
24
25 pub tuna_position_ata: solana_pubkey::Pubkey,
26
27
28 pub tuna_position_mint: solana_pubkey::Pubkey,
29 pub fusionamm_program: solana_pubkey::Pubkey,
36
37
38 pub fusion_pool: solana_pubkey::Pubkey,
39
40
41 pub position_lock: solana_pubkey::Pubkey,
42 pub token2022_program: solana_pubkey::Pubkey,
49
50
51 pub system_program: solana_pubkey::Pubkey,
52 }
53
54impl LockLpPositionFusion {
55 pub fn instruction(&self, args: LockLpPositionFusionInstructionArgs) -> solana_instruction::Instruction {
56 self.instruction_with_remaining_accounts(args, &[])
57 }
58 #[allow(clippy::arithmetic_side_effects)]
59 #[allow(clippy::vec_init_then_push)]
60 pub fn instruction_with_remaining_accounts(&self, args: LockLpPositionFusionInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
61 let mut accounts = Vec::with_capacity(9+ remaining_accounts.len());
62 accounts.push(solana_instruction::AccountMeta::new_readonly(
63 self.authority,
64 true
65 ));
66 accounts.push(solana_instruction::AccountMeta::new(
67 self.tuna_position,
68 false
69 ));
70 accounts.push(solana_instruction::AccountMeta::new(
71 self.tuna_position_ata,
72 false
73 ));
74 accounts.push(solana_instruction::AccountMeta::new(
75 self.tuna_position_mint,
76 false
77 ));
78 accounts.push(solana_instruction::AccountMeta::new_readonly(
79 self.fusionamm_program,
80 false
81 ));
82 accounts.push(solana_instruction::AccountMeta::new(
83 self.fusion_pool,
84 false
85 ));
86 accounts.push(solana_instruction::AccountMeta::new(
87 self.position_lock,
88 false
89 ));
90 accounts.push(solana_instruction::AccountMeta::new_readonly(
91 self.token2022_program,
92 false
93 ));
94 accounts.push(solana_instruction::AccountMeta::new_readonly(
95 self.system_program,
96 false
97 ));
98 accounts.extend_from_slice(remaining_accounts);
99 let mut data = borsh::to_vec(&LockLpPositionFusionInstructionData::new()).unwrap();
100 let mut args = borsh::to_vec(&args).unwrap();
101 data.append(&mut args);
102
103 solana_instruction::Instruction {
104 program_id: crate::TUNA_ID,
105 accounts,
106 data,
107 }
108 }
109}
110
111#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
112#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
113 pub struct LockLpPositionFusionInstructionData {
114 discriminator: [u8; 8],
115 }
116
117impl LockLpPositionFusionInstructionData {
118 pub fn new() -> Self {
119 Self {
120 discriminator: [231, 87, 69, 13, 113, 64, 173, 208],
121 }
122 }
123}
124
125impl Default for LockLpPositionFusionInstructionData {
126 fn default() -> Self {
127 Self::new()
128 }
129}
130
131#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
132#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
133 pub struct LockLpPositionFusionInstructionArgs {
134 pub lock_type: PositionLockType,
135 }
136
137
138#[derive(Clone, Debug, Default)]
152pub struct LockLpPositionFusionBuilder {
153 authority: Option<solana_pubkey::Pubkey>,
154 tuna_position: Option<solana_pubkey::Pubkey>,
155 tuna_position_ata: Option<solana_pubkey::Pubkey>,
156 tuna_position_mint: Option<solana_pubkey::Pubkey>,
157 fusionamm_program: Option<solana_pubkey::Pubkey>,
158 fusion_pool: Option<solana_pubkey::Pubkey>,
159 position_lock: Option<solana_pubkey::Pubkey>,
160 token2022_program: Option<solana_pubkey::Pubkey>,
161 system_program: Option<solana_pubkey::Pubkey>,
162 lock_type: Option<PositionLockType>,
163 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
164}
165
166impl LockLpPositionFusionBuilder {
167 pub fn new() -> Self {
168 Self::default()
169 }
170 #[inline(always)]
171 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
172 self.authority = Some(authority);
173 self
174 }
175 #[inline(always)]
176 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
177 self.tuna_position = Some(tuna_position);
178 self
179 }
180 #[inline(always)]
181 pub fn tuna_position_ata(&mut self, tuna_position_ata: solana_pubkey::Pubkey) -> &mut Self {
182 self.tuna_position_ata = Some(tuna_position_ata);
183 self
184 }
185 #[inline(always)]
186 pub fn tuna_position_mint(&mut self, tuna_position_mint: solana_pubkey::Pubkey) -> &mut Self {
187 self.tuna_position_mint = Some(tuna_position_mint);
188 self
189 }
190 #[inline(always)]
194 pub fn fusionamm_program(&mut self, fusionamm_program: solana_pubkey::Pubkey) -> &mut Self {
195 self.fusionamm_program = Some(fusionamm_program);
196 self
197 }
198 #[inline(always)]
199 pub fn fusion_pool(&mut self, fusion_pool: solana_pubkey::Pubkey) -> &mut Self {
200 self.fusion_pool = Some(fusion_pool);
201 self
202 }
203 #[inline(always)]
204 pub fn position_lock(&mut self, position_lock: solana_pubkey::Pubkey) -> &mut Self {
205 self.position_lock = Some(position_lock);
206 self
207 }
208 #[inline(always)]
212 pub fn token2022_program(&mut self, token2022_program: solana_pubkey::Pubkey) -> &mut Self {
213 self.token2022_program = Some(token2022_program);
214 self
215 }
216 #[inline(always)]
218 pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self {
219 self.system_program = Some(system_program);
220 self
221 }
222 #[inline(always)]
223 pub fn lock_type(&mut self, lock_type: PositionLockType) -> &mut Self {
224 self.lock_type = Some(lock_type);
225 self
226 }
227 #[inline(always)]
229 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
230 self.__remaining_accounts.push(account);
231 self
232 }
233 #[inline(always)]
235 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
236 self.__remaining_accounts.extend_from_slice(accounts);
237 self
238 }
239 #[allow(clippy::clone_on_copy)]
240 pub fn instruction(&self) -> solana_instruction::Instruction {
241 let accounts = LockLpPositionFusion {
242 authority: self.authority.expect("authority is not set"),
243 tuna_position: self.tuna_position.expect("tuna_position is not set"),
244 tuna_position_ata: self.tuna_position_ata.expect("tuna_position_ata is not set"),
245 tuna_position_mint: self.tuna_position_mint.expect("tuna_position_mint is not set"),
246 fusionamm_program: self.fusionamm_program.expect("fusionamm_program is not set"),
247 fusion_pool: self.fusion_pool.expect("fusion_pool is not set"),
248 position_lock: self.position_lock.expect("position_lock is not set"),
249 token2022_program: self.token2022_program.expect("token2022_program is not set"),
250 system_program: self.system_program.unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")),
251 };
252 let args = LockLpPositionFusionInstructionArgs {
253 lock_type: self.lock_type.clone().expect("lock_type is not set"),
254 };
255
256 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
257 }
258}
259
260 pub struct LockLpPositionFusionCpiAccounts<'a, 'b> {
262
263
264 pub authority: &'b solana_account_info::AccountInfo<'a>,
265
266
267 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
268
269
270 pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
271
272
273 pub tuna_position_mint: &'b solana_account_info::AccountInfo<'a>,
274 pub fusionamm_program: &'b solana_account_info::AccountInfo<'a>,
281
282
283 pub fusion_pool: &'b solana_account_info::AccountInfo<'a>,
284
285
286 pub position_lock: &'b solana_account_info::AccountInfo<'a>,
287 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
294
295
296 pub system_program: &'b solana_account_info::AccountInfo<'a>,
297 }
298
299pub struct LockLpPositionFusionCpi<'a, 'b> {
301 pub __program: &'b solana_account_info::AccountInfo<'a>,
303
304
305 pub authority: &'b solana_account_info::AccountInfo<'a>,
306
307
308 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
309
310
311 pub tuna_position_ata: &'b solana_account_info::AccountInfo<'a>,
312
313
314 pub tuna_position_mint: &'b solana_account_info::AccountInfo<'a>,
315 pub fusionamm_program: &'b solana_account_info::AccountInfo<'a>,
322
323
324 pub fusion_pool: &'b solana_account_info::AccountInfo<'a>,
325
326
327 pub position_lock: &'b solana_account_info::AccountInfo<'a>,
328 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
335
336
337 pub system_program: &'b solana_account_info::AccountInfo<'a>,
338 pub __args: LockLpPositionFusionInstructionArgs,
340 }
341
342impl<'a, 'b> LockLpPositionFusionCpi<'a, 'b> {
343 pub fn new(
344 program: &'b solana_account_info::AccountInfo<'a>,
345 accounts: LockLpPositionFusionCpiAccounts<'a, 'b>,
346 args: LockLpPositionFusionInstructionArgs,
347 ) -> Self {
348 Self {
349 __program: program,
350 authority: accounts.authority,
351 tuna_position: accounts.tuna_position,
352 tuna_position_ata: accounts.tuna_position_ata,
353 tuna_position_mint: accounts.tuna_position_mint,
354 fusionamm_program: accounts.fusionamm_program,
355 fusion_pool: accounts.fusion_pool,
356 position_lock: accounts.position_lock,
357 token2022_program: accounts.token2022_program,
358 system_program: accounts.system_program,
359 __args: args,
360 }
361 }
362 #[inline(always)]
363 pub fn invoke(&self) -> solana_program_error::ProgramResult {
364 self.invoke_signed_with_remaining_accounts(&[], &[])
365 }
366 #[inline(always)]
367 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
368 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
369 }
370 #[inline(always)]
371 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
372 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
373 }
374 #[allow(clippy::arithmetic_side_effects)]
375 #[allow(clippy::clone_on_copy)]
376 #[allow(clippy::vec_init_then_push)]
377 pub fn invoke_signed_with_remaining_accounts(
378 &self,
379 signers_seeds: &[&[&[u8]]],
380 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
381 ) -> solana_program_error::ProgramResult {
382 let mut accounts = Vec::with_capacity(9+ remaining_accounts.len());
383 accounts.push(solana_instruction::AccountMeta::new_readonly(
384 *self.authority.key,
385 true
386 ));
387 accounts.push(solana_instruction::AccountMeta::new(
388 *self.tuna_position.key,
389 false
390 ));
391 accounts.push(solana_instruction::AccountMeta::new(
392 *self.tuna_position_ata.key,
393 false
394 ));
395 accounts.push(solana_instruction::AccountMeta::new(
396 *self.tuna_position_mint.key,
397 false
398 ));
399 accounts.push(solana_instruction::AccountMeta::new_readonly(
400 *self.fusionamm_program.key,
401 false
402 ));
403 accounts.push(solana_instruction::AccountMeta::new(
404 *self.fusion_pool.key,
405 false
406 ));
407 accounts.push(solana_instruction::AccountMeta::new(
408 *self.position_lock.key,
409 false
410 ));
411 accounts.push(solana_instruction::AccountMeta::new_readonly(
412 *self.token2022_program.key,
413 false
414 ));
415 accounts.push(solana_instruction::AccountMeta::new_readonly(
416 *self.system_program.key,
417 false
418 ));
419 remaining_accounts.iter().for_each(|remaining_account| {
420 accounts.push(solana_instruction::AccountMeta {
421 pubkey: *remaining_account.0.key,
422 is_signer: remaining_account.1,
423 is_writable: remaining_account.2,
424 })
425 });
426 let mut data = borsh::to_vec(&LockLpPositionFusionInstructionData::new()).unwrap();
427 let mut args = borsh::to_vec(&self.__args).unwrap();
428 data.append(&mut args);
429
430 let instruction = solana_instruction::Instruction {
431 program_id: crate::TUNA_ID,
432 accounts,
433 data,
434 };
435 let mut account_infos = Vec::with_capacity(10 + remaining_accounts.len());
436 account_infos.push(self.__program.clone());
437 account_infos.push(self.authority.clone());
438 account_infos.push(self.tuna_position.clone());
439 account_infos.push(self.tuna_position_ata.clone());
440 account_infos.push(self.tuna_position_mint.clone());
441 account_infos.push(self.fusionamm_program.clone());
442 account_infos.push(self.fusion_pool.clone());
443 account_infos.push(self.position_lock.clone());
444 account_infos.push(self.token2022_program.clone());
445 account_infos.push(self.system_program.clone());
446 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
447
448 if signers_seeds.is_empty() {
449 solana_cpi::invoke(&instruction, &account_infos)
450 } else {
451 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
452 }
453 }
454}
455
456#[derive(Clone, Debug)]
470pub struct LockLpPositionFusionCpiBuilder<'a, 'b> {
471 instruction: Box<LockLpPositionFusionCpiBuilderInstruction<'a, 'b>>,
472}
473
474impl<'a, 'b> LockLpPositionFusionCpiBuilder<'a, 'b> {
475 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
476 let instruction = Box::new(LockLpPositionFusionCpiBuilderInstruction {
477 __program: program,
478 authority: None,
479 tuna_position: None,
480 tuna_position_ata: None,
481 tuna_position_mint: None,
482 fusionamm_program: None,
483 fusion_pool: None,
484 position_lock: None,
485 token2022_program: None,
486 system_program: None,
487 lock_type: None,
488 __remaining_accounts: Vec::new(),
489 });
490 Self { instruction }
491 }
492 #[inline(always)]
493 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
494 self.instruction.authority = Some(authority);
495 self
496 }
497 #[inline(always)]
498 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
499 self.instruction.tuna_position = Some(tuna_position);
500 self
501 }
502 #[inline(always)]
503 pub fn tuna_position_ata(&mut self, tuna_position_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
504 self.instruction.tuna_position_ata = Some(tuna_position_ata);
505 self
506 }
507 #[inline(always)]
508 pub fn tuna_position_mint(&mut self, tuna_position_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
509 self.instruction.tuna_position_mint = Some(tuna_position_mint);
510 self
511 }
512 #[inline(always)]
516 pub fn fusionamm_program(&mut self, fusionamm_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
517 self.instruction.fusionamm_program = Some(fusionamm_program);
518 self
519 }
520 #[inline(always)]
521 pub fn fusion_pool(&mut self, fusion_pool: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
522 self.instruction.fusion_pool = Some(fusion_pool);
523 self
524 }
525 #[inline(always)]
526 pub fn position_lock(&mut self, position_lock: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
527 self.instruction.position_lock = Some(position_lock);
528 self
529 }
530 #[inline(always)]
534 pub fn token2022_program(&mut self, token2022_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
535 self.instruction.token2022_program = Some(token2022_program);
536 self
537 }
538 #[inline(always)]
539 pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
540 self.instruction.system_program = Some(system_program);
541 self
542 }
543 #[inline(always)]
544 pub fn lock_type(&mut self, lock_type: PositionLockType) -> &mut Self {
545 self.instruction.lock_type = Some(lock_type);
546 self
547 }
548 #[inline(always)]
550 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
551 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
552 self
553 }
554 #[inline(always)]
559 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
560 self.instruction.__remaining_accounts.extend_from_slice(accounts);
561 self
562 }
563 #[inline(always)]
564 pub fn invoke(&self) -> solana_program_error::ProgramResult {
565 self.invoke_signed(&[])
566 }
567 #[allow(clippy::clone_on_copy)]
568 #[allow(clippy::vec_init_then_push)]
569 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
570 let args = LockLpPositionFusionInstructionArgs {
571 lock_type: self.instruction.lock_type.clone().expect("lock_type is not set"),
572 };
573 let instruction = LockLpPositionFusionCpi {
574 __program: self.instruction.__program,
575
576 authority: self.instruction.authority.expect("authority is not set"),
577
578 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
579
580 tuna_position_ata: self.instruction.tuna_position_ata.expect("tuna_position_ata is not set"),
581
582 tuna_position_mint: self.instruction.tuna_position_mint.expect("tuna_position_mint is not set"),
583
584 fusionamm_program: self.instruction.fusionamm_program.expect("fusionamm_program is not set"),
585
586 fusion_pool: self.instruction.fusion_pool.expect("fusion_pool is not set"),
587
588 position_lock: self.instruction.position_lock.expect("position_lock is not set"),
589
590 token2022_program: self.instruction.token2022_program.expect("token2022_program is not set"),
591
592 system_program: self.instruction.system_program.expect("system_program is not set"),
593 __args: args,
594 };
595 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
596 }
597}
598
599#[derive(Clone, Debug)]
600struct LockLpPositionFusionCpiBuilderInstruction<'a, 'b> {
601 __program: &'b solana_account_info::AccountInfo<'a>,
602 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
603 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
604 tuna_position_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
605 tuna_position_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
606 fusionamm_program: Option<&'b solana_account_info::AccountInfo<'a>>,
607 fusion_pool: Option<&'b solana_account_info::AccountInfo<'a>>,
608 position_lock: Option<&'b solana_account_info::AccountInfo<'a>>,
609 token2022_program: Option<&'b solana_account_info::AccountInfo<'a>>,
610 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
611 lock_type: Option<PositionLockType>,
612 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
614}
615