1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const CLOSE_TUNA_SPOT_POSITION_DISCRIMINATOR: [u8; 8] = [4, 189, 171, 84, 110, 220, 10, 8];
12
13#[derive(Debug)]
15pub struct CloseTunaSpotPosition {
16 pub authority: solana_pubkey::Pubkey,
23
24
25 pub mint_a: solana_pubkey::Pubkey,
26
27
28 pub mint_b: solana_pubkey::Pubkey,
29
30
31 pub token_program_a: solana_pubkey::Pubkey,
32
33
34 pub token_program_b: solana_pubkey::Pubkey,
35
36
37 pub tuna_position: solana_pubkey::Pubkey,
38
39
40 pub tuna_position_ata_a: solana_pubkey::Pubkey,
41
42
43 pub tuna_position_ata_b: solana_pubkey::Pubkey,
44 }
45
46impl CloseTunaSpotPosition {
47 pub fn instruction(&self) -> solana_instruction::Instruction {
48 self.instruction_with_remaining_accounts(&[])
49 }
50 #[allow(clippy::arithmetic_side_effects)]
51 #[allow(clippy::vec_init_then_push)]
52 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
53 let mut accounts = Vec::with_capacity(8+ remaining_accounts.len());
54 accounts.push(solana_instruction::AccountMeta::new(
55 self.authority,
56 true
57 ));
58 accounts.push(solana_instruction::AccountMeta::new_readonly(
59 self.mint_a,
60 false
61 ));
62 accounts.push(solana_instruction::AccountMeta::new_readonly(
63 self.mint_b,
64 false
65 ));
66 accounts.push(solana_instruction::AccountMeta::new_readonly(
67 self.token_program_a,
68 false
69 ));
70 accounts.push(solana_instruction::AccountMeta::new_readonly(
71 self.token_program_b,
72 false
73 ));
74 accounts.push(solana_instruction::AccountMeta::new(
75 self.tuna_position,
76 false
77 ));
78 accounts.push(solana_instruction::AccountMeta::new(
79 self.tuna_position_ata_a,
80 false
81 ));
82 accounts.push(solana_instruction::AccountMeta::new(
83 self.tuna_position_ata_b,
84 false
85 ));
86 accounts.extend_from_slice(remaining_accounts);
87 let data = borsh::to_vec(&CloseTunaSpotPositionInstructionData::new()).unwrap();
88
89 solana_instruction::Instruction {
90 program_id: crate::TUNA_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))]
99 pub struct CloseTunaSpotPositionInstructionData {
100 discriminator: [u8; 8],
101 }
102
103impl CloseTunaSpotPositionInstructionData {
104 pub fn new() -> Self {
105 Self {
106 discriminator: [4, 189, 171, 84, 110, 220, 10, 8],
107 }
108 }
109}
110
111impl Default for CloseTunaSpotPositionInstructionData {
112 fn default() -> Self {
113 Self::new()
114 }
115}
116
117
118
119#[derive(Clone, Debug, Default)]
132pub struct CloseTunaSpotPositionBuilder {
133 authority: Option<solana_pubkey::Pubkey>,
134 mint_a: Option<solana_pubkey::Pubkey>,
135 mint_b: Option<solana_pubkey::Pubkey>,
136 token_program_a: Option<solana_pubkey::Pubkey>,
137 token_program_b: Option<solana_pubkey::Pubkey>,
138 tuna_position: Option<solana_pubkey::Pubkey>,
139 tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
140 tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
141 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
142}
143
144impl CloseTunaSpotPositionBuilder {
145 pub fn new() -> Self {
146 Self::default()
147 }
148 #[inline(always)]
152 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
153 self.authority = Some(authority);
154 self
155 }
156 #[inline(always)]
157 pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
158 self.mint_a = Some(mint_a);
159 self
160 }
161 #[inline(always)]
162 pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
163 self.mint_b = Some(mint_b);
164 self
165 }
166 #[inline(always)]
167 pub fn token_program_a(&mut self, token_program_a: solana_pubkey::Pubkey) -> &mut Self {
168 self.token_program_a = Some(token_program_a);
169 self
170 }
171 #[inline(always)]
172 pub fn token_program_b(&mut self, token_program_b: solana_pubkey::Pubkey) -> &mut Self {
173 self.token_program_b = Some(token_program_b);
174 self
175 }
176 #[inline(always)]
177 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
178 self.tuna_position = Some(tuna_position);
179 self
180 }
181 #[inline(always)]
182 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
183 self.tuna_position_ata_a = Some(tuna_position_ata_a);
184 self
185 }
186 #[inline(always)]
187 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
188 self.tuna_position_ata_b = Some(tuna_position_ata_b);
189 self
190 }
191 #[inline(always)]
193 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
194 self.__remaining_accounts.push(account);
195 self
196 }
197 #[inline(always)]
199 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
200 self.__remaining_accounts.extend_from_slice(accounts);
201 self
202 }
203 #[allow(clippy::clone_on_copy)]
204 pub fn instruction(&self) -> solana_instruction::Instruction {
205 let accounts = CloseTunaSpotPosition {
206 authority: self.authority.expect("authority is not set"),
207 mint_a: self.mint_a.expect("mint_a is not set"),
208 mint_b: self.mint_b.expect("mint_b is not set"),
209 token_program_a: self.token_program_a.expect("token_program_a is not set"),
210 token_program_b: self.token_program_b.expect("token_program_b is not set"),
211 tuna_position: self.tuna_position.expect("tuna_position is not set"),
212 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
213 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
214 };
215
216 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
217 }
218}
219
220 pub struct CloseTunaSpotPositionCpiAccounts<'a, 'b> {
222 pub authority: &'b solana_account_info::AccountInfo<'a>,
229
230
231 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
232
233
234 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
235
236
237 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
238
239
240 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
241
242
243 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
244
245
246 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
247
248
249 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
250 }
251
252pub struct CloseTunaSpotPositionCpi<'a, 'b> {
254 pub __program: &'b solana_account_info::AccountInfo<'a>,
256 pub authority: &'b solana_account_info::AccountInfo<'a>,
263
264
265 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
266
267
268 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
269
270
271 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
272
273
274 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
275
276
277 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
278
279
280 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
281
282
283 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
284 }
285
286impl<'a, 'b> CloseTunaSpotPositionCpi<'a, 'b> {
287 pub fn new(
288 program: &'b solana_account_info::AccountInfo<'a>,
289 accounts: CloseTunaSpotPositionCpiAccounts<'a, 'b>,
290 ) -> Self {
291 Self {
292 __program: program,
293 authority: accounts.authority,
294 mint_a: accounts.mint_a,
295 mint_b: accounts.mint_b,
296 token_program_a: accounts.token_program_a,
297 token_program_b: accounts.token_program_b,
298 tuna_position: accounts.tuna_position,
299 tuna_position_ata_a: accounts.tuna_position_ata_a,
300 tuna_position_ata_b: accounts.tuna_position_ata_b,
301 }
302 }
303 #[inline(always)]
304 pub fn invoke(&self) -> solana_program_error::ProgramResult {
305 self.invoke_signed_with_remaining_accounts(&[], &[])
306 }
307 #[inline(always)]
308 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
309 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
310 }
311 #[inline(always)]
312 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
313 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
314 }
315 #[allow(clippy::arithmetic_side_effects)]
316 #[allow(clippy::clone_on_copy)]
317 #[allow(clippy::vec_init_then_push)]
318 pub fn invoke_signed_with_remaining_accounts(
319 &self,
320 signers_seeds: &[&[&[u8]]],
321 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
322 ) -> solana_program_error::ProgramResult {
323 let mut accounts = Vec::with_capacity(8+ remaining_accounts.len());
324 accounts.push(solana_instruction::AccountMeta::new(
325 *self.authority.key,
326 true
327 ));
328 accounts.push(solana_instruction::AccountMeta::new_readonly(
329 *self.mint_a.key,
330 false
331 ));
332 accounts.push(solana_instruction::AccountMeta::new_readonly(
333 *self.mint_b.key,
334 false
335 ));
336 accounts.push(solana_instruction::AccountMeta::new_readonly(
337 *self.token_program_a.key,
338 false
339 ));
340 accounts.push(solana_instruction::AccountMeta::new_readonly(
341 *self.token_program_b.key,
342 false
343 ));
344 accounts.push(solana_instruction::AccountMeta::new(
345 *self.tuna_position.key,
346 false
347 ));
348 accounts.push(solana_instruction::AccountMeta::new(
349 *self.tuna_position_ata_a.key,
350 false
351 ));
352 accounts.push(solana_instruction::AccountMeta::new(
353 *self.tuna_position_ata_b.key,
354 false
355 ));
356 remaining_accounts.iter().for_each(|remaining_account| {
357 accounts.push(solana_instruction::AccountMeta {
358 pubkey: *remaining_account.0.key,
359 is_signer: remaining_account.1,
360 is_writable: remaining_account.2,
361 })
362 });
363 let data = borsh::to_vec(&CloseTunaSpotPositionInstructionData::new()).unwrap();
364
365 let instruction = solana_instruction::Instruction {
366 program_id: crate::TUNA_ID,
367 accounts,
368 data,
369 };
370 let mut account_infos = Vec::with_capacity(9 + remaining_accounts.len());
371 account_infos.push(self.__program.clone());
372 account_infos.push(self.authority.clone());
373 account_infos.push(self.mint_a.clone());
374 account_infos.push(self.mint_b.clone());
375 account_infos.push(self.token_program_a.clone());
376 account_infos.push(self.token_program_b.clone());
377 account_infos.push(self.tuna_position.clone());
378 account_infos.push(self.tuna_position_ata_a.clone());
379 account_infos.push(self.tuna_position_ata_b.clone());
380 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
381
382 if signers_seeds.is_empty() {
383 solana_cpi::invoke(&instruction, &account_infos)
384 } else {
385 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
386 }
387 }
388}
389
390#[derive(Clone, Debug)]
403pub struct CloseTunaSpotPositionCpiBuilder<'a, 'b> {
404 instruction: Box<CloseTunaSpotPositionCpiBuilderInstruction<'a, 'b>>,
405}
406
407impl<'a, 'b> CloseTunaSpotPositionCpiBuilder<'a, 'b> {
408 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
409 let instruction = Box::new(CloseTunaSpotPositionCpiBuilderInstruction {
410 __program: program,
411 authority: None,
412 mint_a: None,
413 mint_b: None,
414 token_program_a: None,
415 token_program_b: None,
416 tuna_position: None,
417 tuna_position_ata_a: None,
418 tuna_position_ata_b: None,
419 __remaining_accounts: Vec::new(),
420 });
421 Self { instruction }
422 }
423 #[inline(always)]
427 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
428 self.instruction.authority = Some(authority);
429 self
430 }
431 #[inline(always)]
432 pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
433 self.instruction.mint_a = Some(mint_a);
434 self
435 }
436 #[inline(always)]
437 pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
438 self.instruction.mint_b = Some(mint_b);
439 self
440 }
441 #[inline(always)]
442 pub fn token_program_a(&mut self, token_program_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
443 self.instruction.token_program_a = Some(token_program_a);
444 self
445 }
446 #[inline(always)]
447 pub fn token_program_b(&mut self, token_program_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
448 self.instruction.token_program_b = Some(token_program_b);
449 self
450 }
451 #[inline(always)]
452 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
453 self.instruction.tuna_position = Some(tuna_position);
454 self
455 }
456 #[inline(always)]
457 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
458 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
459 self
460 }
461 #[inline(always)]
462 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
463 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
464 self
465 }
466 #[inline(always)]
468 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
469 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
470 self
471 }
472 #[inline(always)]
477 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
478 self.instruction.__remaining_accounts.extend_from_slice(accounts);
479 self
480 }
481 #[inline(always)]
482 pub fn invoke(&self) -> solana_program_error::ProgramResult {
483 self.invoke_signed(&[])
484 }
485 #[allow(clippy::clone_on_copy)]
486 #[allow(clippy::vec_init_then_push)]
487 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
488 let instruction = CloseTunaSpotPositionCpi {
489 __program: self.instruction.__program,
490
491 authority: self.instruction.authority.expect("authority is not set"),
492
493 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
494
495 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
496
497 token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
498
499 token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
500
501 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
502
503 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
504
505 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
506 };
507 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
508 }
509}
510
511#[derive(Clone, Debug)]
512struct CloseTunaSpotPositionCpiBuilderInstruction<'a, 'b> {
513 __program: &'b solana_account_info::AccountInfo<'a>,
514 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
515 mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
516 mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
517 token_program_a: Option<&'b solana_account_info::AccountInfo<'a>>,
518 token_program_b: Option<&'b solana_account_info::AccountInfo<'a>>,
519 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
520 tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
521 tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
522 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
524}
525