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