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 market: solana_pubkey::Pubkey,
38
39
40 pub tuna_position: solana_pubkey::Pubkey,
41
42
43 pub tuna_position_ata_a: solana_pubkey::Pubkey,
44
45
46 pub tuna_position_ata_b: solana_pubkey::Pubkey,
47 }
48
49impl CloseTunaSpotPosition {
50 pub fn instruction(&self) -> solana_instruction::Instruction {
51 self.instruction_with_remaining_accounts(&[])
52 }
53 #[allow(clippy::arithmetic_side_effects)]
54 #[allow(clippy::vec_init_then_push)]
55 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
56 let mut accounts = Vec::with_capacity(9+ remaining_accounts.len());
57 accounts.push(solana_instruction::AccountMeta::new(
58 self.authority,
59 true
60 ));
61 accounts.push(solana_instruction::AccountMeta::new_readonly(
62 self.mint_a,
63 false
64 ));
65 accounts.push(solana_instruction::AccountMeta::new_readonly(
66 self.mint_b,
67 false
68 ));
69 accounts.push(solana_instruction::AccountMeta::new_readonly(
70 self.token_program_a,
71 false
72 ));
73 accounts.push(solana_instruction::AccountMeta::new_readonly(
74 self.token_program_b,
75 false
76 ));
77 accounts.push(solana_instruction::AccountMeta::new(
78 self.market,
79 false
80 ));
81 accounts.push(solana_instruction::AccountMeta::new(
82 self.tuna_position,
83 false
84 ));
85 accounts.push(solana_instruction::AccountMeta::new(
86 self.tuna_position_ata_a,
87 false
88 ));
89 accounts.push(solana_instruction::AccountMeta::new(
90 self.tuna_position_ata_b,
91 false
92 ));
93 accounts.extend_from_slice(remaining_accounts);
94 let data = borsh::to_vec(&CloseTunaSpotPositionInstructionData::new()).unwrap();
95
96 solana_instruction::Instruction {
97 program_id: crate::TUNA_ID,
98 accounts,
99 data,
100 }
101 }
102}
103
104#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
105#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
106 pub struct CloseTunaSpotPositionInstructionData {
107 discriminator: [u8; 8],
108 }
109
110impl CloseTunaSpotPositionInstructionData {
111 pub fn new() -> Self {
112 Self {
113 discriminator: [4, 189, 171, 84, 110, 220, 10, 8],
114 }
115 }
116}
117
118impl Default for CloseTunaSpotPositionInstructionData {
119 fn default() -> Self {
120 Self::new()
121 }
122}
123
124
125
126#[derive(Clone, Debug, Default)]
140pub struct CloseTunaSpotPositionBuilder {
141 authority: Option<solana_pubkey::Pubkey>,
142 mint_a: Option<solana_pubkey::Pubkey>,
143 mint_b: Option<solana_pubkey::Pubkey>,
144 token_program_a: Option<solana_pubkey::Pubkey>,
145 token_program_b: Option<solana_pubkey::Pubkey>,
146 market: Option<solana_pubkey::Pubkey>,
147 tuna_position: Option<solana_pubkey::Pubkey>,
148 tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
149 tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
150 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
151}
152
153impl CloseTunaSpotPositionBuilder {
154 pub fn new() -> Self {
155 Self::default()
156 }
157 #[inline(always)]
161 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
162 self.authority = Some(authority);
163 self
164 }
165 #[inline(always)]
166 pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
167 self.mint_a = Some(mint_a);
168 self
169 }
170 #[inline(always)]
171 pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
172 self.mint_b = Some(mint_b);
173 self
174 }
175 #[inline(always)]
176 pub fn token_program_a(&mut self, token_program_a: solana_pubkey::Pubkey) -> &mut Self {
177 self.token_program_a = Some(token_program_a);
178 self
179 }
180 #[inline(always)]
181 pub fn token_program_b(&mut self, token_program_b: solana_pubkey::Pubkey) -> &mut Self {
182 self.token_program_b = Some(token_program_b);
183 self
184 }
185 #[inline(always)]
186 pub fn market(&mut self, market: solana_pubkey::Pubkey) -> &mut Self {
187 self.market = Some(market);
188 self
189 }
190 #[inline(always)]
191 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
192 self.tuna_position = Some(tuna_position);
193 self
194 }
195 #[inline(always)]
196 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
197 self.tuna_position_ata_a = Some(tuna_position_ata_a);
198 self
199 }
200 #[inline(always)]
201 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
202 self.tuna_position_ata_b = Some(tuna_position_ata_b);
203 self
204 }
205 #[inline(always)]
207 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
208 self.__remaining_accounts.push(account);
209 self
210 }
211 #[inline(always)]
213 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
214 self.__remaining_accounts.extend_from_slice(accounts);
215 self
216 }
217 #[allow(clippy::clone_on_copy)]
218 pub fn instruction(&self) -> solana_instruction::Instruction {
219 let accounts = CloseTunaSpotPosition {
220 authority: self.authority.expect("authority is not set"),
221 mint_a: self.mint_a.expect("mint_a is not set"),
222 mint_b: self.mint_b.expect("mint_b is not set"),
223 token_program_a: self.token_program_a.expect("token_program_a is not set"),
224 token_program_b: self.token_program_b.expect("token_program_b is not set"),
225 market: self.market.expect("market is not set"),
226 tuna_position: self.tuna_position.expect("tuna_position is not set"),
227 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
228 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
229 };
230
231 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
232 }
233}
234
235 pub struct CloseTunaSpotPositionCpiAccounts<'a, 'b> {
237 pub authority: &'b solana_account_info::AccountInfo<'a>,
244
245
246 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
247
248
249 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
250
251
252 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
253
254
255 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
256
257
258 pub market: &'b solana_account_info::AccountInfo<'a>,
259
260
261 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
262
263
264 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
265
266
267 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
268 }
269
270pub struct CloseTunaSpotPositionCpi<'a, 'b> {
272 pub __program: &'b solana_account_info::AccountInfo<'a>,
274 pub authority: &'b solana_account_info::AccountInfo<'a>,
281
282
283 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
284
285
286 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
287
288
289 pub token_program_a: &'b solana_account_info::AccountInfo<'a>,
290
291
292 pub token_program_b: &'b solana_account_info::AccountInfo<'a>,
293
294
295 pub market: &'b solana_account_info::AccountInfo<'a>,
296
297
298 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
299
300
301 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
302
303
304 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
305 }
306
307impl<'a, 'b> CloseTunaSpotPositionCpi<'a, 'b> {
308 pub fn new(
309 program: &'b solana_account_info::AccountInfo<'a>,
310 accounts: CloseTunaSpotPositionCpiAccounts<'a, 'b>,
311 ) -> Self {
312 Self {
313 __program: program,
314 authority: accounts.authority,
315 mint_a: accounts.mint_a,
316 mint_b: accounts.mint_b,
317 token_program_a: accounts.token_program_a,
318 token_program_b: accounts.token_program_b,
319 market: accounts.market,
320 tuna_position: accounts.tuna_position,
321 tuna_position_ata_a: accounts.tuna_position_ata_a,
322 tuna_position_ata_b: accounts.tuna_position_ata_b,
323 }
324 }
325 #[inline(always)]
326 pub fn invoke(&self) -> solana_program_error::ProgramResult {
327 self.invoke_signed_with_remaining_accounts(&[], &[])
328 }
329 #[inline(always)]
330 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
331 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
332 }
333 #[inline(always)]
334 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
335 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
336 }
337 #[allow(clippy::arithmetic_side_effects)]
338 #[allow(clippy::clone_on_copy)]
339 #[allow(clippy::vec_init_then_push)]
340 pub fn invoke_signed_with_remaining_accounts(
341 &self,
342 signers_seeds: &[&[&[u8]]],
343 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
344 ) -> solana_program_error::ProgramResult {
345 let mut accounts = Vec::with_capacity(9+ remaining_accounts.len());
346 accounts.push(solana_instruction::AccountMeta::new(
347 *self.authority.key,
348 true
349 ));
350 accounts.push(solana_instruction::AccountMeta::new_readonly(
351 *self.mint_a.key,
352 false
353 ));
354 accounts.push(solana_instruction::AccountMeta::new_readonly(
355 *self.mint_b.key,
356 false
357 ));
358 accounts.push(solana_instruction::AccountMeta::new_readonly(
359 *self.token_program_a.key,
360 false
361 ));
362 accounts.push(solana_instruction::AccountMeta::new_readonly(
363 *self.token_program_b.key,
364 false
365 ));
366 accounts.push(solana_instruction::AccountMeta::new(
367 *self.market.key,
368 false
369 ));
370 accounts.push(solana_instruction::AccountMeta::new(
371 *self.tuna_position.key,
372 false
373 ));
374 accounts.push(solana_instruction::AccountMeta::new(
375 *self.tuna_position_ata_a.key,
376 false
377 ));
378 accounts.push(solana_instruction::AccountMeta::new(
379 *self.tuna_position_ata_b.key,
380 false
381 ));
382 remaining_accounts.iter().for_each(|remaining_account| {
383 accounts.push(solana_instruction::AccountMeta {
384 pubkey: *remaining_account.0.key,
385 is_signer: remaining_account.1,
386 is_writable: remaining_account.2,
387 })
388 });
389 let data = borsh::to_vec(&CloseTunaSpotPositionInstructionData::new()).unwrap();
390
391 let instruction = solana_instruction::Instruction {
392 program_id: crate::TUNA_ID,
393 accounts,
394 data,
395 };
396 let mut account_infos = Vec::with_capacity(10 + remaining_accounts.len());
397 account_infos.push(self.__program.clone());
398 account_infos.push(self.authority.clone());
399 account_infos.push(self.mint_a.clone());
400 account_infos.push(self.mint_b.clone());
401 account_infos.push(self.token_program_a.clone());
402 account_infos.push(self.token_program_b.clone());
403 account_infos.push(self.market.clone());
404 account_infos.push(self.tuna_position.clone());
405 account_infos.push(self.tuna_position_ata_a.clone());
406 account_infos.push(self.tuna_position_ata_b.clone());
407 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
408
409 if signers_seeds.is_empty() {
410 solana_cpi::invoke(&instruction, &account_infos)
411 } else {
412 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
413 }
414 }
415}
416
417#[derive(Clone, Debug)]
431pub struct CloseTunaSpotPositionCpiBuilder<'a, 'b> {
432 instruction: Box<CloseTunaSpotPositionCpiBuilderInstruction<'a, 'b>>,
433}
434
435impl<'a, 'b> CloseTunaSpotPositionCpiBuilder<'a, 'b> {
436 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
437 let instruction = Box::new(CloseTunaSpotPositionCpiBuilderInstruction {
438 __program: program,
439 authority: None,
440 mint_a: None,
441 mint_b: None,
442 token_program_a: None,
443 token_program_b: None,
444 market: None,
445 tuna_position: None,
446 tuna_position_ata_a: None,
447 tuna_position_ata_b: None,
448 __remaining_accounts: Vec::new(),
449 });
450 Self { instruction }
451 }
452 #[inline(always)]
456 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
457 self.instruction.authority = Some(authority);
458 self
459 }
460 #[inline(always)]
461 pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
462 self.instruction.mint_a = Some(mint_a);
463 self
464 }
465 #[inline(always)]
466 pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
467 self.instruction.mint_b = Some(mint_b);
468 self
469 }
470 #[inline(always)]
471 pub fn token_program_a(&mut self, token_program_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
472 self.instruction.token_program_a = Some(token_program_a);
473 self
474 }
475 #[inline(always)]
476 pub fn token_program_b(&mut self, token_program_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
477 self.instruction.token_program_b = Some(token_program_b);
478 self
479 }
480 #[inline(always)]
481 pub fn market(&mut self, market: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
482 self.instruction.market = Some(market);
483 self
484 }
485 #[inline(always)]
486 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
487 self.instruction.tuna_position = Some(tuna_position);
488 self
489 }
490 #[inline(always)]
491 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
492 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
493 self
494 }
495 #[inline(always)]
496 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
497 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
498 self
499 }
500 #[inline(always)]
502 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
503 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
504 self
505 }
506 #[inline(always)]
511 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
512 self.instruction.__remaining_accounts.extend_from_slice(accounts);
513 self
514 }
515 #[inline(always)]
516 pub fn invoke(&self) -> solana_program_error::ProgramResult {
517 self.invoke_signed(&[])
518 }
519 #[allow(clippy::clone_on_copy)]
520 #[allow(clippy::vec_init_then_push)]
521 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
522 let instruction = CloseTunaSpotPositionCpi {
523 __program: self.instruction.__program,
524
525 authority: self.instruction.authority.expect("authority is not set"),
526
527 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
528
529 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
530
531 token_program_a: self.instruction.token_program_a.expect("token_program_a is not set"),
532
533 token_program_b: self.instruction.token_program_b.expect("token_program_b is not set"),
534
535 market: self.instruction.market.expect("market is not set"),
536
537 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
538
539 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
540
541 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
542 };
543 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
544 }
545}
546
547#[derive(Clone, Debug)]
548struct CloseTunaSpotPositionCpiBuilderInstruction<'a, 'b> {
549 __program: &'b solana_account_info::AccountInfo<'a>,
550 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
551 mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
552 mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
553 token_program_a: Option<&'b solana_account_info::AccountInfo<'a>>,
554 token_program_b: Option<&'b solana_account_info::AccountInfo<'a>>,
555 market: Option<&'b solana_account_info::AccountInfo<'a>>,
556 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
557 tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
558 tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
559 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
561}
562