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