1use crate::generated::types::PoolToken;
9use borsh::BorshSerialize;
10use borsh::BorshDeserialize;
11
12pub const RESET_TUNA_SPOT_POSITION_DISCRIMINATOR: [u8; 8] = [194, 68, 113, 71, 103, 77, 29, 127];
13
14#[derive(Debug)]
16pub struct ResetTunaSpotPosition {
17
18
19 pub authority: solana_pubkey::Pubkey,
20
21
22 pub mint_a: solana_pubkey::Pubkey,
23
24
25 pub mint_b: solana_pubkey::Pubkey,
26
27
28 pub tuna_position: solana_pubkey::Pubkey,
29
30
31 pub tuna_position_ata_a: solana_pubkey::Pubkey,
32
33
34 pub tuna_position_ata_b: solana_pubkey::Pubkey,
35 }
36
37impl ResetTunaSpotPosition {
38 pub fn instruction(&self, args: ResetTunaSpotPositionInstructionArgs) -> solana_instruction::Instruction {
39 self.instruction_with_remaining_accounts(args, &[])
40 }
41 #[allow(clippy::arithmetic_side_effects)]
42 #[allow(clippy::vec_init_then_push)]
43 pub fn instruction_with_remaining_accounts(&self, args: ResetTunaSpotPositionInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
44 let mut accounts = Vec::with_capacity(6+ remaining_accounts.len());
45 accounts.push(solana_instruction::AccountMeta::new_readonly(
46 self.authority,
47 true
48 ));
49 accounts.push(solana_instruction::AccountMeta::new_readonly(
50 self.mint_a,
51 false
52 ));
53 accounts.push(solana_instruction::AccountMeta::new_readonly(
54 self.mint_b,
55 false
56 ));
57 accounts.push(solana_instruction::AccountMeta::new(
58 self.tuna_position,
59 false
60 ));
61 accounts.push(solana_instruction::AccountMeta::new(
62 self.tuna_position_ata_a,
63 false
64 ));
65 accounts.push(solana_instruction::AccountMeta::new(
66 self.tuna_position_ata_b,
67 false
68 ));
69 accounts.extend_from_slice(remaining_accounts);
70 let mut data = borsh::to_vec(&ResetTunaSpotPositionInstructionData::new()).unwrap();
71 let mut args = borsh::to_vec(&args).unwrap();
72 data.append(&mut args);
73
74 solana_instruction::Instruction {
75 program_id: crate::TUNA_ID,
76 accounts,
77 data,
78 }
79 }
80}
81
82#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
83#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
84 pub struct ResetTunaSpotPositionInstructionData {
85 discriminator: [u8; 8],
86 }
87
88impl ResetTunaSpotPositionInstructionData {
89 pub fn new() -> Self {
90 Self {
91 discriminator: [194, 68, 113, 71, 103, 77, 29, 127],
92 }
93 }
94}
95
96impl Default for ResetTunaSpotPositionInstructionData {
97 fn default() -> Self {
98 Self::new()
99 }
100}
101
102#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
103#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
104 pub struct ResetTunaSpotPositionInstructionArgs {
105 pub position_token: PoolToken,
106 pub collateral_token: PoolToken,
107 }
108
109
110#[derive(Clone, Debug, Default)]
121pub struct ResetTunaSpotPositionBuilder {
122 authority: Option<solana_pubkey::Pubkey>,
123 mint_a: Option<solana_pubkey::Pubkey>,
124 mint_b: Option<solana_pubkey::Pubkey>,
125 tuna_position: Option<solana_pubkey::Pubkey>,
126 tuna_position_ata_a: Option<solana_pubkey::Pubkey>,
127 tuna_position_ata_b: Option<solana_pubkey::Pubkey>,
128 position_token: Option<PoolToken>,
129 collateral_token: Option<PoolToken>,
130 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
131}
132
133impl ResetTunaSpotPositionBuilder {
134 pub fn new() -> Self {
135 Self::default()
136 }
137 #[inline(always)]
138 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
139 self.authority = Some(authority);
140 self
141 }
142 #[inline(always)]
143 pub fn mint_a(&mut self, mint_a: solana_pubkey::Pubkey) -> &mut Self {
144 self.mint_a = Some(mint_a);
145 self
146 }
147 #[inline(always)]
148 pub fn mint_b(&mut self, mint_b: solana_pubkey::Pubkey) -> &mut Self {
149 self.mint_b = Some(mint_b);
150 self
151 }
152 #[inline(always)]
153 pub fn tuna_position(&mut self, tuna_position: solana_pubkey::Pubkey) -> &mut Self {
154 self.tuna_position = Some(tuna_position);
155 self
156 }
157 #[inline(always)]
158 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: solana_pubkey::Pubkey) -> &mut Self {
159 self.tuna_position_ata_a = Some(tuna_position_ata_a);
160 self
161 }
162 #[inline(always)]
163 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: solana_pubkey::Pubkey) -> &mut Self {
164 self.tuna_position_ata_b = Some(tuna_position_ata_b);
165 self
166 }
167 #[inline(always)]
168 pub fn position_token(&mut self, position_token: PoolToken) -> &mut Self {
169 self.position_token = Some(position_token);
170 self
171 }
172 #[inline(always)]
173 pub fn collateral_token(&mut self, collateral_token: PoolToken) -> &mut Self {
174 self.collateral_token = Some(collateral_token);
175 self
176 }
177 #[inline(always)]
179 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
180 self.__remaining_accounts.push(account);
181 self
182 }
183 #[inline(always)]
185 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
186 self.__remaining_accounts.extend_from_slice(accounts);
187 self
188 }
189 #[allow(clippy::clone_on_copy)]
190 pub fn instruction(&self) -> solana_instruction::Instruction {
191 let accounts = ResetTunaSpotPosition {
192 authority: self.authority.expect("authority is not set"),
193 mint_a: self.mint_a.expect("mint_a is not set"),
194 mint_b: self.mint_b.expect("mint_b is not set"),
195 tuna_position: self.tuna_position.expect("tuna_position is not set"),
196 tuna_position_ata_a: self.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
197 tuna_position_ata_b: self.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
198 };
199 let args = ResetTunaSpotPositionInstructionArgs {
200 position_token: self.position_token.clone().expect("position_token is not set"),
201 collateral_token: self.collateral_token.clone().expect("collateral_token is not set"),
202 };
203
204 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
205 }
206}
207
208 pub struct ResetTunaSpotPositionCpiAccounts<'a, 'b> {
210
211
212 pub authority: &'b solana_account_info::AccountInfo<'a>,
213
214
215 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
216
217
218 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
219
220
221 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
222
223
224 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
225
226
227 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
228 }
229
230pub struct ResetTunaSpotPositionCpi<'a, 'b> {
232 pub __program: &'b solana_account_info::AccountInfo<'a>,
234
235
236 pub authority: &'b solana_account_info::AccountInfo<'a>,
237
238
239 pub mint_a: &'b solana_account_info::AccountInfo<'a>,
240
241
242 pub mint_b: &'b solana_account_info::AccountInfo<'a>,
243
244
245 pub tuna_position: &'b solana_account_info::AccountInfo<'a>,
246
247
248 pub tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>,
249
250
251 pub tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>,
252 pub __args: ResetTunaSpotPositionInstructionArgs,
254 }
255
256impl<'a, 'b> ResetTunaSpotPositionCpi<'a, 'b> {
257 pub fn new(
258 program: &'b solana_account_info::AccountInfo<'a>,
259 accounts: ResetTunaSpotPositionCpiAccounts<'a, 'b>,
260 args: ResetTunaSpotPositionInstructionArgs,
261 ) -> Self {
262 Self {
263 __program: program,
264 authority: accounts.authority,
265 mint_a: accounts.mint_a,
266 mint_b: accounts.mint_b,
267 tuna_position: accounts.tuna_position,
268 tuna_position_ata_a: accounts.tuna_position_ata_a,
269 tuna_position_ata_b: accounts.tuna_position_ata_b,
270 __args: args,
271 }
272 }
273 #[inline(always)]
274 pub fn invoke(&self) -> solana_program_error::ProgramResult {
275 self.invoke_signed_with_remaining_accounts(&[], &[])
276 }
277 #[inline(always)]
278 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
279 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
280 }
281 #[inline(always)]
282 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
283 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
284 }
285 #[allow(clippy::arithmetic_side_effects)]
286 #[allow(clippy::clone_on_copy)]
287 #[allow(clippy::vec_init_then_push)]
288 pub fn invoke_signed_with_remaining_accounts(
289 &self,
290 signers_seeds: &[&[&[u8]]],
291 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
292 ) -> solana_program_error::ProgramResult {
293 let mut accounts = Vec::with_capacity(6+ remaining_accounts.len());
294 accounts.push(solana_instruction::AccountMeta::new_readonly(
295 *self.authority.key,
296 true
297 ));
298 accounts.push(solana_instruction::AccountMeta::new_readonly(
299 *self.mint_a.key,
300 false
301 ));
302 accounts.push(solana_instruction::AccountMeta::new_readonly(
303 *self.mint_b.key,
304 false
305 ));
306 accounts.push(solana_instruction::AccountMeta::new(
307 *self.tuna_position.key,
308 false
309 ));
310 accounts.push(solana_instruction::AccountMeta::new(
311 *self.tuna_position_ata_a.key,
312 false
313 ));
314 accounts.push(solana_instruction::AccountMeta::new(
315 *self.tuna_position_ata_b.key,
316 false
317 ));
318 remaining_accounts.iter().for_each(|remaining_account| {
319 accounts.push(solana_instruction::AccountMeta {
320 pubkey: *remaining_account.0.key,
321 is_signer: remaining_account.1,
322 is_writable: remaining_account.2,
323 })
324 });
325 let mut data = borsh::to_vec(&ResetTunaSpotPositionInstructionData::new()).unwrap();
326 let mut args = borsh::to_vec(&self.__args).unwrap();
327 data.append(&mut args);
328
329 let instruction = solana_instruction::Instruction {
330 program_id: crate::TUNA_ID,
331 accounts,
332 data,
333 };
334 let mut account_infos = Vec::with_capacity(7 + remaining_accounts.len());
335 account_infos.push(self.__program.clone());
336 account_infos.push(self.authority.clone());
337 account_infos.push(self.mint_a.clone());
338 account_infos.push(self.mint_b.clone());
339 account_infos.push(self.tuna_position.clone());
340 account_infos.push(self.tuna_position_ata_a.clone());
341 account_infos.push(self.tuna_position_ata_b.clone());
342 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
343
344 if signers_seeds.is_empty() {
345 solana_cpi::invoke(&instruction, &account_infos)
346 } else {
347 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
348 }
349 }
350}
351
352#[derive(Clone, Debug)]
363pub struct ResetTunaSpotPositionCpiBuilder<'a, 'b> {
364 instruction: Box<ResetTunaSpotPositionCpiBuilderInstruction<'a, 'b>>,
365}
366
367impl<'a, 'b> ResetTunaSpotPositionCpiBuilder<'a, 'b> {
368 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
369 let instruction = Box::new(ResetTunaSpotPositionCpiBuilderInstruction {
370 __program: program,
371 authority: None,
372 mint_a: None,
373 mint_b: None,
374 tuna_position: None,
375 tuna_position_ata_a: None,
376 tuna_position_ata_b: None,
377 position_token: None,
378 collateral_token: None,
379 __remaining_accounts: Vec::new(),
380 });
381 Self { instruction }
382 }
383 #[inline(always)]
384 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
385 self.instruction.authority = Some(authority);
386 self
387 }
388 #[inline(always)]
389 pub fn mint_a(&mut self, mint_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
390 self.instruction.mint_a = Some(mint_a);
391 self
392 }
393 #[inline(always)]
394 pub fn mint_b(&mut self, mint_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
395 self.instruction.mint_b = Some(mint_b);
396 self
397 }
398 #[inline(always)]
399 pub fn tuna_position(&mut self, tuna_position: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
400 self.instruction.tuna_position = Some(tuna_position);
401 self
402 }
403 #[inline(always)]
404 pub fn tuna_position_ata_a(&mut self, tuna_position_ata_a: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
405 self.instruction.tuna_position_ata_a = Some(tuna_position_ata_a);
406 self
407 }
408 #[inline(always)]
409 pub fn tuna_position_ata_b(&mut self, tuna_position_ata_b: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
410 self.instruction.tuna_position_ata_b = Some(tuna_position_ata_b);
411 self
412 }
413 #[inline(always)]
414 pub fn position_token(&mut self, position_token: PoolToken) -> &mut Self {
415 self.instruction.position_token = Some(position_token);
416 self
417 }
418 #[inline(always)]
419 pub fn collateral_token(&mut self, collateral_token: PoolToken) -> &mut Self {
420 self.instruction.collateral_token = Some(collateral_token);
421 self
422 }
423 #[inline(always)]
425 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
426 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
427 self
428 }
429 #[inline(always)]
434 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
435 self.instruction.__remaining_accounts.extend_from_slice(accounts);
436 self
437 }
438 #[inline(always)]
439 pub fn invoke(&self) -> solana_program_error::ProgramResult {
440 self.invoke_signed(&[])
441 }
442 #[allow(clippy::clone_on_copy)]
443 #[allow(clippy::vec_init_then_push)]
444 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
445 let args = ResetTunaSpotPositionInstructionArgs {
446 position_token: self.instruction.position_token.clone().expect("position_token is not set"),
447 collateral_token: self.instruction.collateral_token.clone().expect("collateral_token is not set"),
448 };
449 let instruction = ResetTunaSpotPositionCpi {
450 __program: self.instruction.__program,
451
452 authority: self.instruction.authority.expect("authority is not set"),
453
454 mint_a: self.instruction.mint_a.expect("mint_a is not set"),
455
456 mint_b: self.instruction.mint_b.expect("mint_b is not set"),
457
458 tuna_position: self.instruction.tuna_position.expect("tuna_position is not set"),
459
460 tuna_position_ata_a: self.instruction.tuna_position_ata_a.expect("tuna_position_ata_a is not set"),
461
462 tuna_position_ata_b: self.instruction.tuna_position_ata_b.expect("tuna_position_ata_b is not set"),
463 __args: args,
464 };
465 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
466 }
467}
468
469#[derive(Clone, Debug)]
470struct ResetTunaSpotPositionCpiBuilderInstruction<'a, 'b> {
471 __program: &'b solana_account_info::AccountInfo<'a>,
472 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
473 mint_a: Option<&'b solana_account_info::AccountInfo<'a>>,
474 mint_b: Option<&'b solana_account_info::AccountInfo<'a>>,
475 tuna_position: Option<&'b solana_account_info::AccountInfo<'a>>,
476 tuna_position_ata_a: Option<&'b solana_account_info::AccountInfo<'a>>,
477 tuna_position_ata_b: Option<&'b solana_account_info::AccountInfo<'a>>,
478 position_token: Option<PoolToken>,
479 collateral_token: Option<PoolToken>,
480 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
482}
483