1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11#[derive(Debug)]
13pub struct SwapRewardOrca {
14
15
16 pub authority: solana_pubkey::Pubkey,
17
18
19 pub treasury: solana_pubkey::Pubkey,
20
21
22 pub input_token_mint: solana_pubkey::Pubkey,
23
24
25 pub reward_token_mint: solana_pubkey::Pubkey,
26
27
28 pub input_token_program: solana_pubkey::Pubkey,
29
30
31 pub reward_token_program: solana_pubkey::Pubkey,
32
33
34 pub input_token_account: solana_pubkey::Pubkey,
35
36
37 pub reward_token_account: solana_pubkey::Pubkey,
38
39
40 pub whirlpool_program: solana_pubkey::Pubkey,
41
42
43 pub whirlpool: solana_pubkey::Pubkey,
44
45
46 pub memo_program: solana_pubkey::Pubkey,
47 }
48
49impl SwapRewardOrca {
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(11+ remaining_accounts.len());
57 accounts.push(solana_instruction::AccountMeta::new(
58 self.authority,
59 true
60 ));
61 accounts.push(solana_instruction::AccountMeta::new(
62 self.treasury,
63 false
64 ));
65 accounts.push(solana_instruction::AccountMeta::new_readonly(
66 self.input_token_mint,
67 false
68 ));
69 accounts.push(solana_instruction::AccountMeta::new_readonly(
70 self.reward_token_mint,
71 false
72 ));
73 accounts.push(solana_instruction::AccountMeta::new_readonly(
74 self.input_token_program,
75 false
76 ));
77 accounts.push(solana_instruction::AccountMeta::new_readonly(
78 self.reward_token_program,
79 false
80 ));
81 accounts.push(solana_instruction::AccountMeta::new(
82 self.input_token_account,
83 false
84 ));
85 accounts.push(solana_instruction::AccountMeta::new(
86 self.reward_token_account,
87 false
88 ));
89 accounts.push(solana_instruction::AccountMeta::new_readonly(
90 self.whirlpool_program,
91 false
92 ));
93 accounts.push(solana_instruction::AccountMeta::new(
94 self.whirlpool,
95 false
96 ));
97 accounts.push(solana_instruction::AccountMeta::new_readonly(
98 self.memo_program,
99 false
100 ));
101 accounts.extend_from_slice(remaining_accounts);
102 let data = borsh::to_vec(&SwapRewardOrcaInstructionData::new()).unwrap();
103
104 solana_instruction::Instruction {
105 program_id: crate::TUNA_STAKING_ID,
106 accounts,
107 data,
108 }
109 }
110}
111
112#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
113#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
114 pub struct SwapRewardOrcaInstructionData {
115 discriminator: [u8; 8],
116 }
117
118impl SwapRewardOrcaInstructionData {
119 pub fn new() -> Self {
120 Self {
121 discriminator: [43, 202, 126, 117, 222, 128, 208, 163],
122 }
123 }
124}
125
126impl Default for SwapRewardOrcaInstructionData {
127 fn default() -> Self {
128 Self::new()
129 }
130}
131
132
133
134#[derive(Clone, Debug, Default)]
150pub struct SwapRewardOrcaBuilder {
151 authority: Option<solana_pubkey::Pubkey>,
152 treasury: Option<solana_pubkey::Pubkey>,
153 input_token_mint: Option<solana_pubkey::Pubkey>,
154 reward_token_mint: Option<solana_pubkey::Pubkey>,
155 input_token_program: Option<solana_pubkey::Pubkey>,
156 reward_token_program: Option<solana_pubkey::Pubkey>,
157 input_token_account: Option<solana_pubkey::Pubkey>,
158 reward_token_account: Option<solana_pubkey::Pubkey>,
159 whirlpool_program: Option<solana_pubkey::Pubkey>,
160 whirlpool: Option<solana_pubkey::Pubkey>,
161 memo_program: Option<solana_pubkey::Pubkey>,
162 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
163}
164
165impl SwapRewardOrcaBuilder {
166 pub fn new() -> Self {
167 Self::default()
168 }
169 #[inline(always)]
170 pub fn authority(&mut self, authority: solana_pubkey::Pubkey) -> &mut Self {
171 self.authority = Some(authority);
172 self
173 }
174 #[inline(always)]
175 pub fn treasury(&mut self, treasury: solana_pubkey::Pubkey) -> &mut Self {
176 self.treasury = Some(treasury);
177 self
178 }
179 #[inline(always)]
180 pub fn input_token_mint(&mut self, input_token_mint: solana_pubkey::Pubkey) -> &mut Self {
181 self.input_token_mint = Some(input_token_mint);
182 self
183 }
184 #[inline(always)]
185 pub fn reward_token_mint(&mut self, reward_token_mint: solana_pubkey::Pubkey) -> &mut Self {
186 self.reward_token_mint = Some(reward_token_mint);
187 self
188 }
189 #[inline(always)]
190 pub fn input_token_program(&mut self, input_token_program: solana_pubkey::Pubkey) -> &mut Self {
191 self.input_token_program = Some(input_token_program);
192 self
193 }
194 #[inline(always)]
195 pub fn reward_token_program(&mut self, reward_token_program: solana_pubkey::Pubkey) -> &mut Self {
196 self.reward_token_program = Some(reward_token_program);
197 self
198 }
199 #[inline(always)]
200 pub fn input_token_account(&mut self, input_token_account: solana_pubkey::Pubkey) -> &mut Self {
201 self.input_token_account = Some(input_token_account);
202 self
203 }
204 #[inline(always)]
205 pub fn reward_token_account(&mut self, reward_token_account: solana_pubkey::Pubkey) -> &mut Self {
206 self.reward_token_account = Some(reward_token_account);
207 self
208 }
209 #[inline(always)]
210 pub fn whirlpool_program(&mut self, whirlpool_program: solana_pubkey::Pubkey) -> &mut Self {
211 self.whirlpool_program = Some(whirlpool_program);
212 self
213 }
214 #[inline(always)]
215 pub fn whirlpool(&mut self, whirlpool: solana_pubkey::Pubkey) -> &mut Self {
216 self.whirlpool = Some(whirlpool);
217 self
218 }
219 #[inline(always)]
220 pub fn memo_program(&mut self, memo_program: solana_pubkey::Pubkey) -> &mut Self {
221 self.memo_program = Some(memo_program);
222 self
223 }
224 #[inline(always)]
226 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
227 self.__remaining_accounts.push(account);
228 self
229 }
230 #[inline(always)]
232 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
233 self.__remaining_accounts.extend_from_slice(accounts);
234 self
235 }
236 #[allow(clippy::clone_on_copy)]
237 pub fn instruction(&self) -> solana_instruction::Instruction {
238 let accounts = SwapRewardOrca {
239 authority: self.authority.expect("authority is not set"),
240 treasury: self.treasury.expect("treasury is not set"),
241 input_token_mint: self.input_token_mint.expect("input_token_mint is not set"),
242 reward_token_mint: self.reward_token_mint.expect("reward_token_mint is not set"),
243 input_token_program: self.input_token_program.expect("input_token_program is not set"),
244 reward_token_program: self.reward_token_program.expect("reward_token_program is not set"),
245 input_token_account: self.input_token_account.expect("input_token_account is not set"),
246 reward_token_account: self.reward_token_account.expect("reward_token_account is not set"),
247 whirlpool_program: self.whirlpool_program.expect("whirlpool_program is not set"),
248 whirlpool: self.whirlpool.expect("whirlpool is not set"),
249 memo_program: self.memo_program.expect("memo_program is not set"),
250 };
251
252 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
253 }
254}
255
256 pub struct SwapRewardOrcaCpiAccounts<'a, 'b> {
258
259
260 pub authority: &'b solana_account_info::AccountInfo<'a>,
261
262
263 pub treasury: &'b solana_account_info::AccountInfo<'a>,
264
265
266 pub input_token_mint: &'b solana_account_info::AccountInfo<'a>,
267
268
269 pub reward_token_mint: &'b solana_account_info::AccountInfo<'a>,
270
271
272 pub input_token_program: &'b solana_account_info::AccountInfo<'a>,
273
274
275 pub reward_token_program: &'b solana_account_info::AccountInfo<'a>,
276
277
278 pub input_token_account: &'b solana_account_info::AccountInfo<'a>,
279
280
281 pub reward_token_account: &'b solana_account_info::AccountInfo<'a>,
282
283
284 pub whirlpool_program: &'b solana_account_info::AccountInfo<'a>,
285
286
287 pub whirlpool: &'b solana_account_info::AccountInfo<'a>,
288
289
290 pub memo_program: &'b solana_account_info::AccountInfo<'a>,
291 }
292
293pub struct SwapRewardOrcaCpi<'a, 'b> {
295 pub __program: &'b solana_account_info::AccountInfo<'a>,
297
298
299 pub authority: &'b solana_account_info::AccountInfo<'a>,
300
301
302 pub treasury: &'b solana_account_info::AccountInfo<'a>,
303
304
305 pub input_token_mint: &'b solana_account_info::AccountInfo<'a>,
306
307
308 pub reward_token_mint: &'b solana_account_info::AccountInfo<'a>,
309
310
311 pub input_token_program: &'b solana_account_info::AccountInfo<'a>,
312
313
314 pub reward_token_program: &'b solana_account_info::AccountInfo<'a>,
315
316
317 pub input_token_account: &'b solana_account_info::AccountInfo<'a>,
318
319
320 pub reward_token_account: &'b solana_account_info::AccountInfo<'a>,
321
322
323 pub whirlpool_program: &'b solana_account_info::AccountInfo<'a>,
324
325
326 pub whirlpool: &'b solana_account_info::AccountInfo<'a>,
327
328
329 pub memo_program: &'b solana_account_info::AccountInfo<'a>,
330 }
331
332impl<'a, 'b> SwapRewardOrcaCpi<'a, 'b> {
333 pub fn new(
334 program: &'b solana_account_info::AccountInfo<'a>,
335 accounts: SwapRewardOrcaCpiAccounts<'a, 'b>,
336 ) -> Self {
337 Self {
338 __program: program,
339 authority: accounts.authority,
340 treasury: accounts.treasury,
341 input_token_mint: accounts.input_token_mint,
342 reward_token_mint: accounts.reward_token_mint,
343 input_token_program: accounts.input_token_program,
344 reward_token_program: accounts.reward_token_program,
345 input_token_account: accounts.input_token_account,
346 reward_token_account: accounts.reward_token_account,
347 whirlpool_program: accounts.whirlpool_program,
348 whirlpool: accounts.whirlpool,
349 memo_program: accounts.memo_program,
350 }
351 }
352 #[inline(always)]
353 pub fn invoke(&self) -> solana_program_entrypoint::ProgramResult {
354 self.invoke_signed_with_remaining_accounts(&[], &[])
355 }
356 #[inline(always)]
357 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_entrypoint::ProgramResult {
358 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
359 }
360 #[inline(always)]
361 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_entrypoint::ProgramResult {
362 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
363 }
364 #[allow(clippy::arithmetic_side_effects)]
365 #[allow(clippy::clone_on_copy)]
366 #[allow(clippy::vec_init_then_push)]
367 pub fn invoke_signed_with_remaining_accounts(
368 &self,
369 signers_seeds: &[&[&[u8]]],
370 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
371 ) -> solana_program_entrypoint::ProgramResult {
372 let mut accounts = Vec::with_capacity(11+ remaining_accounts.len());
373 accounts.push(solana_instruction::AccountMeta::new(
374 *self.authority.key,
375 true
376 ));
377 accounts.push(solana_instruction::AccountMeta::new(
378 *self.treasury.key,
379 false
380 ));
381 accounts.push(solana_instruction::AccountMeta::new_readonly(
382 *self.input_token_mint.key,
383 false
384 ));
385 accounts.push(solana_instruction::AccountMeta::new_readonly(
386 *self.reward_token_mint.key,
387 false
388 ));
389 accounts.push(solana_instruction::AccountMeta::new_readonly(
390 *self.input_token_program.key,
391 false
392 ));
393 accounts.push(solana_instruction::AccountMeta::new_readonly(
394 *self.reward_token_program.key,
395 false
396 ));
397 accounts.push(solana_instruction::AccountMeta::new(
398 *self.input_token_account.key,
399 false
400 ));
401 accounts.push(solana_instruction::AccountMeta::new(
402 *self.reward_token_account.key,
403 false
404 ));
405 accounts.push(solana_instruction::AccountMeta::new_readonly(
406 *self.whirlpool_program.key,
407 false
408 ));
409 accounts.push(solana_instruction::AccountMeta::new(
410 *self.whirlpool.key,
411 false
412 ));
413 accounts.push(solana_instruction::AccountMeta::new_readonly(
414 *self.memo_program.key,
415 false
416 ));
417 remaining_accounts.iter().for_each(|remaining_account| {
418 accounts.push(solana_instruction::AccountMeta {
419 pubkey: *remaining_account.0.key,
420 is_signer: remaining_account.1,
421 is_writable: remaining_account.2,
422 })
423 });
424 let data = borsh::to_vec(&SwapRewardOrcaInstructionData::new()).unwrap();
425
426 let instruction = solana_instruction::Instruction {
427 program_id: crate::TUNA_STAKING_ID,
428 accounts,
429 data,
430 };
431 let mut account_infos = Vec::with_capacity(12 + remaining_accounts.len());
432 account_infos.push(self.__program.clone());
433 account_infos.push(self.authority.clone());
434 account_infos.push(self.treasury.clone());
435 account_infos.push(self.input_token_mint.clone());
436 account_infos.push(self.reward_token_mint.clone());
437 account_infos.push(self.input_token_program.clone());
438 account_infos.push(self.reward_token_program.clone());
439 account_infos.push(self.input_token_account.clone());
440 account_infos.push(self.reward_token_account.clone());
441 account_infos.push(self.whirlpool_program.clone());
442 account_infos.push(self.whirlpool.clone());
443 account_infos.push(self.memo_program.clone());
444 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
445
446 if signers_seeds.is_empty() {
447 solana_cpi::invoke(&instruction, &account_infos)
448 } else {
449 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
450 }
451 }
452}
453
454#[derive(Clone, Debug)]
470pub struct SwapRewardOrcaCpiBuilder<'a, 'b> {
471 instruction: Box<SwapRewardOrcaCpiBuilderInstruction<'a, 'b>>,
472}
473
474impl<'a, 'b> SwapRewardOrcaCpiBuilder<'a, 'b> {
475 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
476 let instruction = Box::new(SwapRewardOrcaCpiBuilderInstruction {
477 __program: program,
478 authority: None,
479 treasury: None,
480 input_token_mint: None,
481 reward_token_mint: None,
482 input_token_program: None,
483 reward_token_program: None,
484 input_token_account: None,
485 reward_token_account: None,
486 whirlpool_program: None,
487 whirlpool: None,
488 memo_program: None,
489 __remaining_accounts: Vec::new(),
490 });
491 Self { instruction }
492 }
493 #[inline(always)]
494 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
495 self.instruction.authority = Some(authority);
496 self
497 }
498 #[inline(always)]
499 pub fn treasury(&mut self, treasury: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
500 self.instruction.treasury = Some(treasury);
501 self
502 }
503 #[inline(always)]
504 pub fn input_token_mint(&mut self, input_token_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
505 self.instruction.input_token_mint = Some(input_token_mint);
506 self
507 }
508 #[inline(always)]
509 pub fn reward_token_mint(&mut self, reward_token_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
510 self.instruction.reward_token_mint = Some(reward_token_mint);
511 self
512 }
513 #[inline(always)]
514 pub fn input_token_program(&mut self, input_token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
515 self.instruction.input_token_program = Some(input_token_program);
516 self
517 }
518 #[inline(always)]
519 pub fn reward_token_program(&mut self, reward_token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
520 self.instruction.reward_token_program = Some(reward_token_program);
521 self
522 }
523 #[inline(always)]
524 pub fn input_token_account(&mut self, input_token_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
525 self.instruction.input_token_account = Some(input_token_account);
526 self
527 }
528 #[inline(always)]
529 pub fn reward_token_account(&mut self, reward_token_account: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
530 self.instruction.reward_token_account = Some(reward_token_account);
531 self
532 }
533 #[inline(always)]
534 pub fn whirlpool_program(&mut self, whirlpool_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
535 self.instruction.whirlpool_program = Some(whirlpool_program);
536 self
537 }
538 #[inline(always)]
539 pub fn whirlpool(&mut self, whirlpool: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
540 self.instruction.whirlpool = Some(whirlpool);
541 self
542 }
543 #[inline(always)]
544 pub fn memo_program(&mut self, memo_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
545 self.instruction.memo_program = Some(memo_program);
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_entrypoint::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_entrypoint::ProgramResult {
570 let instruction = SwapRewardOrcaCpi {
571 __program: self.instruction.__program,
572
573 authority: self.instruction.authority.expect("authority is not set"),
574
575 treasury: self.instruction.treasury.expect("treasury is not set"),
576
577 input_token_mint: self.instruction.input_token_mint.expect("input_token_mint is not set"),
578
579 reward_token_mint: self.instruction.reward_token_mint.expect("reward_token_mint is not set"),
580
581 input_token_program: self.instruction.input_token_program.expect("input_token_program is not set"),
582
583 reward_token_program: self.instruction.reward_token_program.expect("reward_token_program is not set"),
584
585 input_token_account: self.instruction.input_token_account.expect("input_token_account is not set"),
586
587 reward_token_account: self.instruction.reward_token_account.expect("reward_token_account is not set"),
588
589 whirlpool_program: self.instruction.whirlpool_program.expect("whirlpool_program is not set"),
590
591 whirlpool: self.instruction.whirlpool.expect("whirlpool is not set"),
592
593 memo_program: self.instruction.memo_program.expect("memo_program is not set"),
594 };
595 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
596 }
597}
598
599#[derive(Clone, Debug)]
600struct SwapRewardOrcaCpiBuilderInstruction<'a, 'b> {
601 __program: &'b solana_account_info::AccountInfo<'a>,
602 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
603 treasury: Option<&'b solana_account_info::AccountInfo<'a>>,
604 input_token_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
605 reward_token_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
606 input_token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
607 reward_token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
608 input_token_account: Option<&'b solana_account_info::AccountInfo<'a>>,
609 reward_token_account: Option<&'b solana_account_info::AccountInfo<'a>>,
610 whirlpool_program: Option<&'b solana_account_info::AccountInfo<'a>>,
611 whirlpool: Option<&'b solana_account_info::AccountInfo<'a>>,
612 memo_program: Option<&'b solana_account_info::AccountInfo<'a>>,
613 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
615}
616