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