1use borsh::BorshDeserialize;
9use borsh::BorshSerialize;
10
11#[derive(Debug)]
13pub struct OpenPositionWithTokenExtensions {
14 pub funder: solana_pubkey::Pubkey,
15
16 pub owner: solana_pubkey::Pubkey,
17
18 pub position: solana_pubkey::Pubkey,
19
20 pub position_mint: solana_pubkey::Pubkey,
21
22 pub position_token_account: solana_pubkey::Pubkey,
23
24 pub whirlpool: solana_pubkey::Pubkey,
25
26 pub token2022_program: solana_pubkey::Pubkey,
27
28 pub system_program: solana_pubkey::Pubkey,
29
30 pub associated_token_program: solana_pubkey::Pubkey,
31
32 pub metadata_update_auth: solana_pubkey::Pubkey,
33}
34
35impl OpenPositionWithTokenExtensions {
36 pub fn instruction(
37 &self,
38 args: OpenPositionWithTokenExtensionsInstructionArgs,
39 ) -> solana_instruction::Instruction {
40 self.instruction_with_remaining_accounts(args, &[])
41 }
42 #[allow(clippy::arithmetic_side_effects)]
43 #[allow(clippy::vec_init_then_push)]
44 pub fn instruction_with_remaining_accounts(
45 &self,
46 args: OpenPositionWithTokenExtensionsInstructionArgs,
47 remaining_accounts: &[solana_instruction::AccountMeta],
48 ) -> solana_instruction::Instruction {
49 let mut accounts = Vec::with_capacity(10 + remaining_accounts.len());
50 accounts.push(solana_instruction::AccountMeta::new(self.funder, true));
51 accounts.push(solana_instruction::AccountMeta::new_readonly(
52 self.owner, false,
53 ));
54 accounts.push(solana_instruction::AccountMeta::new(self.position, false));
55 accounts.push(solana_instruction::AccountMeta::new(
56 self.position_mint,
57 true,
58 ));
59 accounts.push(solana_instruction::AccountMeta::new(
60 self.position_token_account,
61 false,
62 ));
63 accounts.push(solana_instruction::AccountMeta::new_readonly(
64 self.whirlpool,
65 false,
66 ));
67 accounts.push(solana_instruction::AccountMeta::new_readonly(
68 self.token2022_program,
69 false,
70 ));
71 accounts.push(solana_instruction::AccountMeta::new_readonly(
72 self.system_program,
73 false,
74 ));
75 accounts.push(solana_instruction::AccountMeta::new_readonly(
76 self.associated_token_program,
77 false,
78 ));
79 accounts.push(solana_instruction::AccountMeta::new_readonly(
80 self.metadata_update_auth,
81 false,
82 ));
83 accounts.extend_from_slice(remaining_accounts);
84 let mut data =
85 borsh::to_vec(&OpenPositionWithTokenExtensionsInstructionData::new()).unwrap();
86 let mut args = borsh::to_vec(&args).unwrap();
87 data.append(&mut args);
88
89 solana_instruction::Instruction {
90 program_id: crate::WHIRLPOOL_ID,
91 accounts,
92 data,
93 }
94 }
95}
96
97#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
98#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
99pub struct OpenPositionWithTokenExtensionsInstructionData {
100 discriminator: [u8; 8],
101}
102
103impl OpenPositionWithTokenExtensionsInstructionData {
104 pub fn new() -> Self {
105 Self {
106 discriminator: [212, 47, 95, 92, 114, 102, 131, 250],
107 }
108 }
109}
110
111impl Default for OpenPositionWithTokenExtensionsInstructionData {
112 fn default() -> Self {
113 Self::new()
114 }
115}
116
117#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
118#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
119pub struct OpenPositionWithTokenExtensionsInstructionArgs {
120 pub tick_lower_index: i32,
121 pub tick_upper_index: i32,
122 pub with_token_metadata_extension: bool,
123}
124
125#[derive(Clone, Debug, Default)]
140pub struct OpenPositionWithTokenExtensionsBuilder {
141 funder: Option<solana_pubkey::Pubkey>,
142 owner: Option<solana_pubkey::Pubkey>,
143 position: Option<solana_pubkey::Pubkey>,
144 position_mint: Option<solana_pubkey::Pubkey>,
145 position_token_account: Option<solana_pubkey::Pubkey>,
146 whirlpool: Option<solana_pubkey::Pubkey>,
147 token2022_program: Option<solana_pubkey::Pubkey>,
148 system_program: Option<solana_pubkey::Pubkey>,
149 associated_token_program: Option<solana_pubkey::Pubkey>,
150 metadata_update_auth: Option<solana_pubkey::Pubkey>,
151 tick_lower_index: Option<i32>,
152 tick_upper_index: Option<i32>,
153 with_token_metadata_extension: Option<bool>,
154 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
155}
156
157impl OpenPositionWithTokenExtensionsBuilder {
158 pub fn new() -> Self {
159 Self::default()
160 }
161 #[inline(always)]
162 pub fn funder(&mut self, funder: solana_pubkey::Pubkey) -> &mut Self {
163 self.funder = Some(funder);
164 self
165 }
166 #[inline(always)]
167 pub fn owner(&mut self, owner: solana_pubkey::Pubkey) -> &mut Self {
168 self.owner = Some(owner);
169 self
170 }
171 #[inline(always)]
172 pub fn position(&mut self, position: solana_pubkey::Pubkey) -> &mut Self {
173 self.position = Some(position);
174 self
175 }
176 #[inline(always)]
177 pub fn position_mint(&mut self, position_mint: solana_pubkey::Pubkey) -> &mut Self {
178 self.position_mint = Some(position_mint);
179 self
180 }
181 #[inline(always)]
182 pub fn position_token_account(
183 &mut self,
184 position_token_account: solana_pubkey::Pubkey,
185 ) -> &mut Self {
186 self.position_token_account = Some(position_token_account);
187 self
188 }
189 #[inline(always)]
190 pub fn whirlpool(&mut self, whirlpool: solana_pubkey::Pubkey) -> &mut Self {
191 self.whirlpool = Some(whirlpool);
192 self
193 }
194 #[inline(always)]
195 pub fn token2022_program(&mut self, token2022_program: solana_pubkey::Pubkey) -> &mut Self {
196 self.token2022_program = Some(token2022_program);
197 self
198 }
199 #[inline(always)]
201 pub fn system_program(&mut self, system_program: solana_pubkey::Pubkey) -> &mut Self {
202 self.system_program = Some(system_program);
203 self
204 }
205 #[inline(always)]
206 pub fn associated_token_program(
207 &mut self,
208 associated_token_program: solana_pubkey::Pubkey,
209 ) -> &mut Self {
210 self.associated_token_program = Some(associated_token_program);
211 self
212 }
213 #[inline(always)]
214 pub fn metadata_update_auth(
215 &mut self,
216 metadata_update_auth: solana_pubkey::Pubkey,
217 ) -> &mut Self {
218 self.metadata_update_auth = Some(metadata_update_auth);
219 self
220 }
221 #[inline(always)]
222 pub fn tick_lower_index(&mut self, tick_lower_index: i32) -> &mut Self {
223 self.tick_lower_index = Some(tick_lower_index);
224 self
225 }
226 #[inline(always)]
227 pub fn tick_upper_index(&mut self, tick_upper_index: i32) -> &mut Self {
228 self.tick_upper_index = Some(tick_upper_index);
229 self
230 }
231 #[inline(always)]
232 pub fn with_token_metadata_extension(
233 &mut self,
234 with_token_metadata_extension: bool,
235 ) -> &mut Self {
236 self.with_token_metadata_extension = Some(with_token_metadata_extension);
237 self
238 }
239 #[inline(always)]
241 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
242 self.__remaining_accounts.push(account);
243 self
244 }
245 #[inline(always)]
247 pub fn add_remaining_accounts(
248 &mut self,
249 accounts: &[solana_instruction::AccountMeta],
250 ) -> &mut Self {
251 self.__remaining_accounts.extend_from_slice(accounts);
252 self
253 }
254 #[allow(clippy::clone_on_copy)]
255 pub fn instruction(&self) -> solana_instruction::Instruction {
256 let accounts = OpenPositionWithTokenExtensions {
257 funder: self.funder.expect("funder is not set"),
258 owner: self.owner.expect("owner is not set"),
259 position: self.position.expect("position is not set"),
260 position_mint: self.position_mint.expect("position_mint is not set"),
261 position_token_account: self
262 .position_token_account
263 .expect("position_token_account is not set"),
264 whirlpool: self.whirlpool.expect("whirlpool is not set"),
265 token2022_program: self
266 .token2022_program
267 .expect("token2022_program is not set"),
268 system_program: self
269 .system_program
270 .unwrap_or(solana_pubkey::pubkey!("11111111111111111111111111111111")),
271 associated_token_program: self
272 .associated_token_program
273 .expect("associated_token_program is not set"),
274 metadata_update_auth: self
275 .metadata_update_auth
276 .expect("metadata_update_auth is not set"),
277 };
278 let args = OpenPositionWithTokenExtensionsInstructionArgs {
279 tick_lower_index: self
280 .tick_lower_index
281 .clone()
282 .expect("tick_lower_index is not set"),
283 tick_upper_index: self
284 .tick_upper_index
285 .clone()
286 .expect("tick_upper_index is not set"),
287 with_token_metadata_extension: self
288 .with_token_metadata_extension
289 .clone()
290 .expect("with_token_metadata_extension is not set"),
291 };
292
293 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
294 }
295}
296
297pub struct OpenPositionWithTokenExtensionsCpiAccounts<'a, 'b> {
299 pub funder: &'b solana_account_info::AccountInfo<'a>,
300
301 pub owner: &'b solana_account_info::AccountInfo<'a>,
302
303 pub position: &'b solana_account_info::AccountInfo<'a>,
304
305 pub position_mint: &'b solana_account_info::AccountInfo<'a>,
306
307 pub position_token_account: &'b solana_account_info::AccountInfo<'a>,
308
309 pub whirlpool: &'b solana_account_info::AccountInfo<'a>,
310
311 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
312
313 pub system_program: &'b solana_account_info::AccountInfo<'a>,
314
315 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
316
317 pub metadata_update_auth: &'b solana_account_info::AccountInfo<'a>,
318}
319
320pub struct OpenPositionWithTokenExtensionsCpi<'a, 'b> {
322 pub __program: &'b solana_account_info::AccountInfo<'a>,
324
325 pub funder: &'b solana_account_info::AccountInfo<'a>,
326
327 pub owner: &'b solana_account_info::AccountInfo<'a>,
328
329 pub position: &'b solana_account_info::AccountInfo<'a>,
330
331 pub position_mint: &'b solana_account_info::AccountInfo<'a>,
332
333 pub position_token_account: &'b solana_account_info::AccountInfo<'a>,
334
335 pub whirlpool: &'b solana_account_info::AccountInfo<'a>,
336
337 pub token2022_program: &'b solana_account_info::AccountInfo<'a>,
338
339 pub system_program: &'b solana_account_info::AccountInfo<'a>,
340
341 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
342
343 pub metadata_update_auth: &'b solana_account_info::AccountInfo<'a>,
344 pub __args: OpenPositionWithTokenExtensionsInstructionArgs,
346}
347
348impl<'a, 'b> OpenPositionWithTokenExtensionsCpi<'a, 'b> {
349 pub fn new(
350 program: &'b solana_account_info::AccountInfo<'a>,
351 accounts: OpenPositionWithTokenExtensionsCpiAccounts<'a, 'b>,
352 args: OpenPositionWithTokenExtensionsInstructionArgs,
353 ) -> Self {
354 Self {
355 __program: program,
356 funder: accounts.funder,
357 owner: accounts.owner,
358 position: accounts.position,
359 position_mint: accounts.position_mint,
360 position_token_account: accounts.position_token_account,
361 whirlpool: accounts.whirlpool,
362 token2022_program: accounts.token2022_program,
363 system_program: accounts.system_program,
364 associated_token_program: accounts.associated_token_program,
365 metadata_update_auth: accounts.metadata_update_auth,
366 __args: args,
367 }
368 }
369 #[inline(always)]
370 pub fn invoke(&self) -> solana_program_entrypoint::ProgramResult {
371 self.invoke_signed_with_remaining_accounts(&[], &[])
372 }
373 #[inline(always)]
374 pub fn invoke_with_remaining_accounts(
375 &self,
376 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
377 ) -> solana_program_entrypoint::ProgramResult {
378 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
379 }
380 #[inline(always)]
381 pub fn invoke_signed(
382 &self,
383 signers_seeds: &[&[&[u8]]],
384 ) -> solana_program_entrypoint::ProgramResult {
385 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
386 }
387 #[allow(clippy::arithmetic_side_effects)]
388 #[allow(clippy::clone_on_copy)]
389 #[allow(clippy::vec_init_then_push)]
390 pub fn invoke_signed_with_remaining_accounts(
391 &self,
392 signers_seeds: &[&[&[u8]]],
393 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
394 ) -> solana_program_entrypoint::ProgramResult {
395 let mut accounts = Vec::with_capacity(10 + remaining_accounts.len());
396 accounts.push(solana_instruction::AccountMeta::new(*self.funder.key, true));
397 accounts.push(solana_instruction::AccountMeta::new_readonly(
398 *self.owner.key,
399 false,
400 ));
401 accounts.push(solana_instruction::AccountMeta::new(
402 *self.position.key,
403 false,
404 ));
405 accounts.push(solana_instruction::AccountMeta::new(
406 *self.position_mint.key,
407 true,
408 ));
409 accounts.push(solana_instruction::AccountMeta::new(
410 *self.position_token_account.key,
411 false,
412 ));
413 accounts.push(solana_instruction::AccountMeta::new_readonly(
414 *self.whirlpool.key,
415 false,
416 ));
417 accounts.push(solana_instruction::AccountMeta::new_readonly(
418 *self.token2022_program.key,
419 false,
420 ));
421 accounts.push(solana_instruction::AccountMeta::new_readonly(
422 *self.system_program.key,
423 false,
424 ));
425 accounts.push(solana_instruction::AccountMeta::new_readonly(
426 *self.associated_token_program.key,
427 false,
428 ));
429 accounts.push(solana_instruction::AccountMeta::new_readonly(
430 *self.metadata_update_auth.key,
431 false,
432 ));
433 remaining_accounts.iter().for_each(|remaining_account| {
434 accounts.push(solana_instruction::AccountMeta {
435 pubkey: *remaining_account.0.key,
436 is_signer: remaining_account.1,
437 is_writable: remaining_account.2,
438 })
439 });
440 let mut data =
441 borsh::to_vec(&OpenPositionWithTokenExtensionsInstructionData::new()).unwrap();
442 let mut args = borsh::to_vec(&self.__args).unwrap();
443 data.append(&mut args);
444
445 let instruction = solana_instruction::Instruction {
446 program_id: crate::WHIRLPOOL_ID,
447 accounts,
448 data,
449 };
450 let mut account_infos = Vec::with_capacity(11 + remaining_accounts.len());
451 account_infos.push(self.__program.clone());
452 account_infos.push(self.funder.clone());
453 account_infos.push(self.owner.clone());
454 account_infos.push(self.position.clone());
455 account_infos.push(self.position_mint.clone());
456 account_infos.push(self.position_token_account.clone());
457 account_infos.push(self.whirlpool.clone());
458 account_infos.push(self.token2022_program.clone());
459 account_infos.push(self.system_program.clone());
460 account_infos.push(self.associated_token_program.clone());
461 account_infos.push(self.metadata_update_auth.clone());
462 remaining_accounts
463 .iter()
464 .for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
465
466 if signers_seeds.is_empty() {
467 solana_cpi::invoke(&instruction, &account_infos)
468 } else {
469 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
470 }
471 }
472}
473
474#[derive(Clone, Debug)]
489pub struct OpenPositionWithTokenExtensionsCpiBuilder<'a, 'b> {
490 instruction: Box<OpenPositionWithTokenExtensionsCpiBuilderInstruction<'a, 'b>>,
491}
492
493impl<'a, 'b> OpenPositionWithTokenExtensionsCpiBuilder<'a, 'b> {
494 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
495 let instruction = Box::new(OpenPositionWithTokenExtensionsCpiBuilderInstruction {
496 __program: program,
497 funder: None,
498 owner: None,
499 position: None,
500 position_mint: None,
501 position_token_account: None,
502 whirlpool: None,
503 token2022_program: None,
504 system_program: None,
505 associated_token_program: None,
506 metadata_update_auth: None,
507 tick_lower_index: None,
508 tick_upper_index: None,
509 with_token_metadata_extension: None,
510 __remaining_accounts: Vec::new(),
511 });
512 Self { instruction }
513 }
514 #[inline(always)]
515 pub fn funder(&mut self, funder: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
516 self.instruction.funder = Some(funder);
517 self
518 }
519 #[inline(always)]
520 pub fn owner(&mut self, owner: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
521 self.instruction.owner = Some(owner);
522 self
523 }
524 #[inline(always)]
525 pub fn position(&mut self, position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
526 self.instruction.position = Some(position);
527 self
528 }
529 #[inline(always)]
530 pub fn position_mint(
531 &mut self,
532 position_mint: &'b solana_account_info::AccountInfo<'a>,
533 ) -> &mut Self {
534 self.instruction.position_mint = Some(position_mint);
535 self
536 }
537 #[inline(always)]
538 pub fn position_token_account(
539 &mut self,
540 position_token_account: &'b solana_account_info::AccountInfo<'a>,
541 ) -> &mut Self {
542 self.instruction.position_token_account = Some(position_token_account);
543 self
544 }
545 #[inline(always)]
546 pub fn whirlpool(&mut self, whirlpool: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
547 self.instruction.whirlpool = Some(whirlpool);
548 self
549 }
550 #[inline(always)]
551 pub fn token2022_program(
552 &mut self,
553 token2022_program: &'b solana_account_info::AccountInfo<'a>,
554 ) -> &mut Self {
555 self.instruction.token2022_program = Some(token2022_program);
556 self
557 }
558 #[inline(always)]
559 pub fn system_program(
560 &mut self,
561 system_program: &'b solana_account_info::AccountInfo<'a>,
562 ) -> &mut Self {
563 self.instruction.system_program = Some(system_program);
564 self
565 }
566 #[inline(always)]
567 pub fn associated_token_program(
568 &mut self,
569 associated_token_program: &'b solana_account_info::AccountInfo<'a>,
570 ) -> &mut Self {
571 self.instruction.associated_token_program = Some(associated_token_program);
572 self
573 }
574 #[inline(always)]
575 pub fn metadata_update_auth(
576 &mut self,
577 metadata_update_auth: &'b solana_account_info::AccountInfo<'a>,
578 ) -> &mut Self {
579 self.instruction.metadata_update_auth = Some(metadata_update_auth);
580 self
581 }
582 #[inline(always)]
583 pub fn tick_lower_index(&mut self, tick_lower_index: i32) -> &mut Self {
584 self.instruction.tick_lower_index = Some(tick_lower_index);
585 self
586 }
587 #[inline(always)]
588 pub fn tick_upper_index(&mut self, tick_upper_index: i32) -> &mut Self {
589 self.instruction.tick_upper_index = Some(tick_upper_index);
590 self
591 }
592 #[inline(always)]
593 pub fn with_token_metadata_extension(
594 &mut self,
595 with_token_metadata_extension: bool,
596 ) -> &mut Self {
597 self.instruction.with_token_metadata_extension = Some(with_token_metadata_extension);
598 self
599 }
600 #[inline(always)]
602 pub fn add_remaining_account(
603 &mut self,
604 account: &'b solana_account_info::AccountInfo<'a>,
605 is_writable: bool,
606 is_signer: bool,
607 ) -> &mut Self {
608 self.instruction
609 .__remaining_accounts
610 .push((account, is_writable, is_signer));
611 self
612 }
613 #[inline(always)]
618 pub fn add_remaining_accounts(
619 &mut self,
620 accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)],
621 ) -> &mut Self {
622 self.instruction
623 .__remaining_accounts
624 .extend_from_slice(accounts);
625 self
626 }
627 #[inline(always)]
628 pub fn invoke(&self) -> solana_program_entrypoint::ProgramResult {
629 self.invoke_signed(&[])
630 }
631 #[allow(clippy::clone_on_copy)]
632 #[allow(clippy::vec_init_then_push)]
633 pub fn invoke_signed(
634 &self,
635 signers_seeds: &[&[&[u8]]],
636 ) -> solana_program_entrypoint::ProgramResult {
637 let args = OpenPositionWithTokenExtensionsInstructionArgs {
638 tick_lower_index: self
639 .instruction
640 .tick_lower_index
641 .clone()
642 .expect("tick_lower_index is not set"),
643 tick_upper_index: self
644 .instruction
645 .tick_upper_index
646 .clone()
647 .expect("tick_upper_index is not set"),
648 with_token_metadata_extension: self
649 .instruction
650 .with_token_metadata_extension
651 .clone()
652 .expect("with_token_metadata_extension is not set"),
653 };
654 let instruction = OpenPositionWithTokenExtensionsCpi {
655 __program: self.instruction.__program,
656
657 funder: self.instruction.funder.expect("funder is not set"),
658
659 owner: self.instruction.owner.expect("owner is not set"),
660
661 position: self.instruction.position.expect("position is not set"),
662
663 position_mint: self
664 .instruction
665 .position_mint
666 .expect("position_mint is not set"),
667
668 position_token_account: self
669 .instruction
670 .position_token_account
671 .expect("position_token_account is not set"),
672
673 whirlpool: self.instruction.whirlpool.expect("whirlpool is not set"),
674
675 token2022_program: self
676 .instruction
677 .token2022_program
678 .expect("token2022_program is not set"),
679
680 system_program: self
681 .instruction
682 .system_program
683 .expect("system_program is not set"),
684
685 associated_token_program: self
686 .instruction
687 .associated_token_program
688 .expect("associated_token_program is not set"),
689
690 metadata_update_auth: self
691 .instruction
692 .metadata_update_auth
693 .expect("metadata_update_auth is not set"),
694 __args: args,
695 };
696 instruction.invoke_signed_with_remaining_accounts(
697 signers_seeds,
698 &self.instruction.__remaining_accounts,
699 )
700 }
701}
702
703#[derive(Clone, Debug)]
704struct OpenPositionWithTokenExtensionsCpiBuilderInstruction<'a, 'b> {
705 __program: &'b solana_account_info::AccountInfo<'a>,
706 funder: Option<&'b solana_account_info::AccountInfo<'a>>,
707 owner: Option<&'b solana_account_info::AccountInfo<'a>>,
708 position: Option<&'b solana_account_info::AccountInfo<'a>>,
709 position_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
710 position_token_account: Option<&'b solana_account_info::AccountInfo<'a>>,
711 whirlpool: Option<&'b solana_account_info::AccountInfo<'a>>,
712 token2022_program: Option<&'b solana_account_info::AccountInfo<'a>>,
713 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
714 associated_token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
715 metadata_update_auth: Option<&'b solana_account_info::AccountInfo<'a>>,
716 tick_lower_index: Option<i32>,
717 tick_upper_index: Option<i32>,
718 with_token_metadata_extension: Option<bool>,
719 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
721}