1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const CLAIM_ONE_BTC_REWARD_DISCRIMINATOR: [u8; 8] = [53, 168, 61, 211, 206, 81, 133, 175];
12
13#[derive(Debug)]
15pub struct ClaimOneBtcReward {
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 one_btc_vault_iteration: solana_address::Address,
28 pub ticket: solana_address::Address,
34 pub winner: solana_address::Address,
39
40
41 pub btc_mint: solana_address::Address,
42
43
44 pub one_btc_vault_btc_ata: solana_address::Address,
45
46
47 pub winner_btc_ata: solana_address::Address,
48
49
50 pub token_program: solana_address::Address,
51
52
53 pub associated_token_program: solana_address::Address,
54
55
56 pub system_program: solana_address::Address,
57 }
58
59impl ClaimOneBtcReward {
60 pub fn instruction(&self) -> solana_instruction::Instruction {
61 self.instruction_with_remaining_accounts(&[])
62 }
63 #[allow(clippy::arithmetic_side_effects)]
64 #[allow(clippy::vec_init_then_push)]
65 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
66 let mut accounts = Vec::with_capacity(12+ remaining_accounts.len());
67 accounts.push(solana_instruction::AccountMeta::new(
68 self.authority,
69 true
70 ));
71 accounts.push(solana_instruction::AccountMeta::new_readonly(
72 self.satrush_config,
73 false
74 ));
75 accounts.push(solana_instruction::AccountMeta::new(
76 self.one_btc_vault,
77 false
78 ));
79 accounts.push(solana_instruction::AccountMeta::new(
80 self.one_btc_vault_iteration,
81 false
82 ));
83 accounts.push(solana_instruction::AccountMeta::new_readonly(
84 self.ticket,
85 false
86 ));
87 accounts.push(solana_instruction::AccountMeta::new_readonly(
88 self.winner,
89 false
90 ));
91 accounts.push(solana_instruction::AccountMeta::new_readonly(
92 self.btc_mint,
93 false
94 ));
95 accounts.push(solana_instruction::AccountMeta::new(
96 self.one_btc_vault_btc_ata,
97 false
98 ));
99 accounts.push(solana_instruction::AccountMeta::new(
100 self.winner_btc_ata,
101 false
102 ));
103 accounts.push(solana_instruction::AccountMeta::new_readonly(
104 self.token_program,
105 false
106 ));
107 accounts.push(solana_instruction::AccountMeta::new_readonly(
108 self.associated_token_program,
109 false
110 ));
111 accounts.push(solana_instruction::AccountMeta::new_readonly(
112 self.system_program,
113 false
114 ));
115 accounts.extend_from_slice(remaining_accounts);
116 let data = ClaimOneBtcRewardInstructionData::new().try_to_vec().unwrap();
117
118 solana_instruction::Instruction {
119 program_id: crate::SATRUSH_ID,
120 accounts,
121 data,
122 }
123 }
124}
125
126#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
127 pub struct ClaimOneBtcRewardInstructionData {
128 discriminator: [u8; 8],
129 }
130
131impl ClaimOneBtcRewardInstructionData {
132 pub fn new() -> Self {
133 Self {
134 discriminator: [53, 168, 61, 211, 206, 81, 133, 175],
135 }
136 }
137
138 pub(crate) fn try_to_vec(&self) -> Result<Vec<u8>, std::io::Error> {
139 borsh::to_vec(self)
140 }
141 }
142
143impl Default for ClaimOneBtcRewardInstructionData {
144 fn default() -> Self {
145 Self::new()
146 }
147}
148
149
150
151#[derive(Clone, Debug, Default)]
168pub struct ClaimOneBtcRewardBuilder {
169 authority: Option<solana_address::Address>,
170 satrush_config: Option<solana_address::Address>,
171 one_btc_vault: Option<solana_address::Address>,
172 one_btc_vault_iteration: Option<solana_address::Address>,
173 ticket: Option<solana_address::Address>,
174 winner: Option<solana_address::Address>,
175 btc_mint: Option<solana_address::Address>,
176 one_btc_vault_btc_ata: Option<solana_address::Address>,
177 winner_btc_ata: Option<solana_address::Address>,
178 token_program: Option<solana_address::Address>,
179 associated_token_program: Option<solana_address::Address>,
180 system_program: Option<solana_address::Address>,
181 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
182}
183
184impl ClaimOneBtcRewardBuilder {
185 pub fn new() -> Self {
186 Self::default()
187 }
188 #[inline(always)]
189 pub fn authority(&mut self, authority: solana_address::Address) -> &mut Self {
190 self.authority = Some(authority);
191 self
192 }
193 #[inline(always)]
194 pub fn satrush_config(&mut self, satrush_config: solana_address::Address) -> &mut Self {
195 self.satrush_config = Some(satrush_config);
196 self
197 }
198 #[inline(always)]
199 pub fn one_btc_vault(&mut self, one_btc_vault: solana_address::Address) -> &mut Self {
200 self.one_btc_vault = Some(one_btc_vault);
201 self
202 }
203 #[inline(always)]
204 pub fn one_btc_vault_iteration(&mut self, one_btc_vault_iteration: solana_address::Address) -> &mut Self {
205 self.one_btc_vault_iteration = Some(one_btc_vault_iteration);
206 self
207 }
208 #[inline(always)]
211 pub fn ticket(&mut self, ticket: solana_address::Address) -> &mut Self {
212 self.ticket = Some(ticket);
213 self
214 }
215 #[inline(always)]
217 pub fn winner(&mut self, winner: solana_address::Address) -> &mut Self {
218 self.winner = Some(winner);
219 self
220 }
221 #[inline(always)]
222 pub fn btc_mint(&mut self, btc_mint: solana_address::Address) -> &mut Self {
223 self.btc_mint = Some(btc_mint);
224 self
225 }
226 #[inline(always)]
227 pub fn one_btc_vault_btc_ata(&mut self, one_btc_vault_btc_ata: solana_address::Address) -> &mut Self {
228 self.one_btc_vault_btc_ata = Some(one_btc_vault_btc_ata);
229 self
230 }
231 #[inline(always)]
232 pub fn winner_btc_ata(&mut self, winner_btc_ata: solana_address::Address) -> &mut Self {
233 self.winner_btc_ata = Some(winner_btc_ata);
234 self
235 }
236 #[inline(always)]
238 pub fn token_program(&mut self, token_program: solana_address::Address) -> &mut Self {
239 self.token_program = Some(token_program);
240 self
241 }
242 #[inline(always)]
244 pub fn associated_token_program(&mut self, associated_token_program: solana_address::Address) -> &mut Self {
245 self.associated_token_program = Some(associated_token_program);
246 self
247 }
248 #[inline(always)]
250 pub fn system_program(&mut self, system_program: solana_address::Address) -> &mut Self {
251 self.system_program = Some(system_program);
252 self
253 }
254 #[inline(always)]
256 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
257 self.__remaining_accounts.push(account);
258 self
259 }
260 #[inline(always)]
262 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
263 self.__remaining_accounts.extend_from_slice(accounts);
264 self
265 }
266 #[allow(clippy::clone_on_copy)]
267 pub fn instruction(&self) -> solana_instruction::Instruction {
268 let accounts = ClaimOneBtcReward {
269 authority: self.authority.expect("authority is not set"),
270 satrush_config: self.satrush_config.expect("satrush_config is not set"),
271 one_btc_vault: self.one_btc_vault.expect("one_btc_vault is not set"),
272 one_btc_vault_iteration: self.one_btc_vault_iteration.expect("one_btc_vault_iteration is not set"),
273 ticket: self.ticket.expect("ticket is not set"),
274 winner: self.winner.expect("winner is not set"),
275 btc_mint: self.btc_mint.expect("btc_mint is not set"),
276 one_btc_vault_btc_ata: self.one_btc_vault_btc_ata.expect("one_btc_vault_btc_ata is not set"),
277 winner_btc_ata: self.winner_btc_ata.expect("winner_btc_ata is not set"),
278 token_program: self.token_program.unwrap_or(solana_address::address!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")),
279 associated_token_program: self.associated_token_program.unwrap_or(solana_address::address!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL")),
280 system_program: self.system_program.unwrap_or(solana_address::address!("11111111111111111111111111111111")),
281 };
282
283 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
284 }
285}
286
287 pub struct ClaimOneBtcRewardCpiAccounts<'a, 'b> {
289
290
291 pub authority: &'b solana_account_info::AccountInfo<'a>,
292
293
294 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
295
296
297 pub one_btc_vault: &'b solana_account_info::AccountInfo<'a>,
298
299
300 pub one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
301 pub ticket: &'b solana_account_info::AccountInfo<'a>,
307 pub winner: &'b solana_account_info::AccountInfo<'a>,
312
313
314 pub btc_mint: &'b solana_account_info::AccountInfo<'a>,
315
316
317 pub one_btc_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>,
318
319
320 pub winner_btc_ata: &'b solana_account_info::AccountInfo<'a>,
321
322
323 pub token_program: &'b solana_account_info::AccountInfo<'a>,
324
325
326 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
327
328
329 pub system_program: &'b solana_account_info::AccountInfo<'a>,
330 }
331
332pub struct ClaimOneBtcRewardCpi<'a, 'b> {
334 pub __program: &'b solana_account_info::AccountInfo<'a>,
336
337
338 pub authority: &'b solana_account_info::AccountInfo<'a>,
339
340
341 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
342
343
344 pub one_btc_vault: &'b solana_account_info::AccountInfo<'a>,
345
346
347 pub one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
348 pub ticket: &'b solana_account_info::AccountInfo<'a>,
354 pub winner: &'b solana_account_info::AccountInfo<'a>,
359
360
361 pub btc_mint: &'b solana_account_info::AccountInfo<'a>,
362
363
364 pub one_btc_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>,
365
366
367 pub winner_btc_ata: &'b solana_account_info::AccountInfo<'a>,
368
369
370 pub token_program: &'b solana_account_info::AccountInfo<'a>,
371
372
373 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
374
375
376 pub system_program: &'b solana_account_info::AccountInfo<'a>,
377 }
378
379impl<'a, 'b> ClaimOneBtcRewardCpi<'a, 'b> {
380 pub fn new(
381 program: &'b solana_account_info::AccountInfo<'a>,
382 accounts: ClaimOneBtcRewardCpiAccounts<'a, 'b>,
383 ) -> Self {
384 Self {
385 __program: program,
386 authority: accounts.authority,
387 satrush_config: accounts.satrush_config,
388 one_btc_vault: accounts.one_btc_vault,
389 one_btc_vault_iteration: accounts.one_btc_vault_iteration,
390 ticket: accounts.ticket,
391 winner: accounts.winner,
392 btc_mint: accounts.btc_mint,
393 one_btc_vault_btc_ata: accounts.one_btc_vault_btc_ata,
394 winner_btc_ata: accounts.winner_btc_ata,
395 token_program: accounts.token_program,
396 associated_token_program: accounts.associated_token_program,
397 system_program: accounts.system_program,
398 }
399 }
400 #[inline(always)]
401 pub fn invoke(&self) -> solana_program_error::ProgramResult {
402 self.invoke_signed_with_remaining_accounts(&[], &[])
403 }
404 #[inline(always)]
405 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
406 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
407 }
408 #[inline(always)]
409 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
410 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
411 }
412 #[allow(clippy::arithmetic_side_effects)]
413 #[allow(clippy::clone_on_copy)]
414 #[allow(clippy::vec_init_then_push)]
415 pub fn invoke_signed_with_remaining_accounts(
416 &self,
417 signers_seeds: &[&[&[u8]]],
418 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
419 ) -> solana_program_error::ProgramResult {
420 let mut accounts = Vec::with_capacity(12+ remaining_accounts.len());
421 accounts.push(solana_instruction::AccountMeta::new(
422 *self.authority.key,
423 true
424 ));
425 accounts.push(solana_instruction::AccountMeta::new_readonly(
426 *self.satrush_config.key,
427 false
428 ));
429 accounts.push(solana_instruction::AccountMeta::new(
430 *self.one_btc_vault.key,
431 false
432 ));
433 accounts.push(solana_instruction::AccountMeta::new(
434 *self.one_btc_vault_iteration.key,
435 false
436 ));
437 accounts.push(solana_instruction::AccountMeta::new_readonly(
438 *self.ticket.key,
439 false
440 ));
441 accounts.push(solana_instruction::AccountMeta::new_readonly(
442 *self.winner.key,
443 false
444 ));
445 accounts.push(solana_instruction::AccountMeta::new_readonly(
446 *self.btc_mint.key,
447 false
448 ));
449 accounts.push(solana_instruction::AccountMeta::new(
450 *self.one_btc_vault_btc_ata.key,
451 false
452 ));
453 accounts.push(solana_instruction::AccountMeta::new(
454 *self.winner_btc_ata.key,
455 false
456 ));
457 accounts.push(solana_instruction::AccountMeta::new_readonly(
458 *self.token_program.key,
459 false
460 ));
461 accounts.push(solana_instruction::AccountMeta::new_readonly(
462 *self.associated_token_program.key,
463 false
464 ));
465 accounts.push(solana_instruction::AccountMeta::new_readonly(
466 *self.system_program.key,
467 false
468 ));
469 remaining_accounts.iter().for_each(|remaining_account| {
470 accounts.push(solana_instruction::AccountMeta {
471 pubkey: *remaining_account.0.key,
472 is_signer: remaining_account.1,
473 is_writable: remaining_account.2,
474 })
475 });
476 let data = ClaimOneBtcRewardInstructionData::new().try_to_vec().unwrap();
477
478 let instruction = solana_instruction::Instruction {
479 program_id: crate::SATRUSH_ID,
480 accounts,
481 data,
482 };
483 let mut account_infos = Vec::with_capacity(13 + remaining_accounts.len());
484 account_infos.push(self.__program.clone());
485 account_infos.push(self.authority.clone());
486 account_infos.push(self.satrush_config.clone());
487 account_infos.push(self.one_btc_vault.clone());
488 account_infos.push(self.one_btc_vault_iteration.clone());
489 account_infos.push(self.ticket.clone());
490 account_infos.push(self.winner.clone());
491 account_infos.push(self.btc_mint.clone());
492 account_infos.push(self.one_btc_vault_btc_ata.clone());
493 account_infos.push(self.winner_btc_ata.clone());
494 account_infos.push(self.token_program.clone());
495 account_infos.push(self.associated_token_program.clone());
496 account_infos.push(self.system_program.clone());
497 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
498
499 if signers_seeds.is_empty() {
500 solana_cpi::invoke(&instruction, &account_infos)
501 } else {
502 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
503 }
504 }
505}
506
507#[derive(Clone, Debug)]
524pub struct ClaimOneBtcRewardCpiBuilder<'a, 'b> {
525 instruction: Box<ClaimOneBtcRewardCpiBuilderInstruction<'a, 'b>>,
526}
527
528impl<'a, 'b> ClaimOneBtcRewardCpiBuilder<'a, 'b> {
529 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
530 let instruction = Box::new(ClaimOneBtcRewardCpiBuilderInstruction {
531 __program: program,
532 authority: None,
533 satrush_config: None,
534 one_btc_vault: None,
535 one_btc_vault_iteration: None,
536 ticket: None,
537 winner: None,
538 btc_mint: None,
539 one_btc_vault_btc_ata: None,
540 winner_btc_ata: None,
541 token_program: None,
542 associated_token_program: None,
543 system_program: None,
544 __remaining_accounts: Vec::new(),
545 });
546 Self { instruction }
547 }
548 #[inline(always)]
549 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
550 self.instruction.authority = Some(authority);
551 self
552 }
553 #[inline(always)]
554 pub fn satrush_config(&mut self, satrush_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
555 self.instruction.satrush_config = Some(satrush_config);
556 self
557 }
558 #[inline(always)]
559 pub fn one_btc_vault(&mut self, one_btc_vault: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
560 self.instruction.one_btc_vault = Some(one_btc_vault);
561 self
562 }
563 #[inline(always)]
564 pub fn one_btc_vault_iteration(&mut self, one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
565 self.instruction.one_btc_vault_iteration = Some(one_btc_vault_iteration);
566 self
567 }
568 #[inline(always)]
571 pub fn ticket(&mut self, ticket: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
572 self.instruction.ticket = Some(ticket);
573 self
574 }
575 #[inline(always)]
577 pub fn winner(&mut self, winner: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
578 self.instruction.winner = Some(winner);
579 self
580 }
581 #[inline(always)]
582 pub fn btc_mint(&mut self, btc_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
583 self.instruction.btc_mint = Some(btc_mint);
584 self
585 }
586 #[inline(always)]
587 pub fn one_btc_vault_btc_ata(&mut self, one_btc_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
588 self.instruction.one_btc_vault_btc_ata = Some(one_btc_vault_btc_ata);
589 self
590 }
591 #[inline(always)]
592 pub fn winner_btc_ata(&mut self, winner_btc_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
593 self.instruction.winner_btc_ata = Some(winner_btc_ata);
594 self
595 }
596 #[inline(always)]
597 pub fn token_program(&mut self, token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
598 self.instruction.token_program = Some(token_program);
599 self
600 }
601 #[inline(always)]
602 pub fn associated_token_program(&mut self, associated_token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
603 self.instruction.associated_token_program = Some(associated_token_program);
604 self
605 }
606 #[inline(always)]
607 pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
608 self.instruction.system_program = Some(system_program);
609 self
610 }
611 #[inline(always)]
613 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
614 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
615 self
616 }
617 #[inline(always)]
622 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
623 self.instruction.__remaining_accounts.extend_from_slice(accounts);
624 self
625 }
626 #[inline(always)]
627 pub fn invoke(&self) -> solana_program_error::ProgramResult {
628 self.invoke_signed(&[])
629 }
630 #[allow(clippy::clone_on_copy)]
631 #[allow(clippy::vec_init_then_push)]
632 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
633 let instruction = ClaimOneBtcRewardCpi {
634 __program: self.instruction.__program,
635
636 authority: self.instruction.authority.expect("authority is not set"),
637
638 satrush_config: self.instruction.satrush_config.expect("satrush_config is not set"),
639
640 one_btc_vault: self.instruction.one_btc_vault.expect("one_btc_vault is not set"),
641
642 one_btc_vault_iteration: self.instruction.one_btc_vault_iteration.expect("one_btc_vault_iteration is not set"),
643
644 ticket: self.instruction.ticket.expect("ticket is not set"),
645
646 winner: self.instruction.winner.expect("winner is not set"),
647
648 btc_mint: self.instruction.btc_mint.expect("btc_mint is not set"),
649
650 one_btc_vault_btc_ata: self.instruction.one_btc_vault_btc_ata.expect("one_btc_vault_btc_ata is not set"),
651
652 winner_btc_ata: self.instruction.winner_btc_ata.expect("winner_btc_ata is not set"),
653
654 token_program: self.instruction.token_program.expect("token_program is not set"),
655
656 associated_token_program: self.instruction.associated_token_program.expect("associated_token_program is not set"),
657
658 system_program: self.instruction.system_program.expect("system_program is not set"),
659 };
660 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
661 }
662}
663
664#[derive(Clone, Debug)]
665struct ClaimOneBtcRewardCpiBuilderInstruction<'a, 'b> {
666 __program: &'b solana_account_info::AccountInfo<'a>,
667 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
668 satrush_config: Option<&'b solana_account_info::AccountInfo<'a>>,
669 one_btc_vault: Option<&'b solana_account_info::AccountInfo<'a>>,
670 one_btc_vault_iteration: Option<&'b solana_account_info::AccountInfo<'a>>,
671 ticket: Option<&'b solana_account_info::AccountInfo<'a>>,
672 winner: Option<&'b solana_account_info::AccountInfo<'a>>,
673 btc_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
674 one_btc_vault_btc_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
675 winner_btc_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
676 token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
677 associated_token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
678 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
679 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
681}
682