1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const CREATE_SATS_VAULT_DISCRIMINATOR: [u8; 8] = [159, 29, 126, 216, 29, 240, 141, 61];
12
13#[derive(Debug)]
15pub struct CreateSatsVault {
16
17
18 pub authority: solana_address::Address,
19
20
21 pub satrush_config: solana_address::Address,
22
23
24 pub sats_vault: solana_address::Address,
25
26
27 pub btc_mint: solana_address::Address,
28 pub sats_vault_btc_ata: solana_address::Address,
33
34
35 pub token_program: solana_address::Address,
36
37
38 pub associated_token_program: solana_address::Address,
39
40
41 pub system_program: solana_address::Address,
42 }
43
44impl CreateSatsVault {
45 pub fn instruction(&self) -> solana_instruction::Instruction {
46 self.instruction_with_remaining_accounts(&[])
47 }
48 #[allow(clippy::arithmetic_side_effects)]
49 #[allow(clippy::vec_init_then_push)]
50 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
51 let mut accounts = Vec::with_capacity(8+ remaining_accounts.len());
52 accounts.push(solana_instruction::AccountMeta::new(
53 self.authority,
54 true
55 ));
56 accounts.push(solana_instruction::AccountMeta::new_readonly(
57 self.satrush_config,
58 false
59 ));
60 accounts.push(solana_instruction::AccountMeta::new(
61 self.sats_vault,
62 false
63 ));
64 accounts.push(solana_instruction::AccountMeta::new_readonly(
65 self.btc_mint,
66 false
67 ));
68 accounts.push(solana_instruction::AccountMeta::new(
69 self.sats_vault_btc_ata,
70 false
71 ));
72 accounts.push(solana_instruction::AccountMeta::new_readonly(
73 self.token_program,
74 false
75 ));
76 accounts.push(solana_instruction::AccountMeta::new_readonly(
77 self.associated_token_program,
78 false
79 ));
80 accounts.push(solana_instruction::AccountMeta::new_readonly(
81 self.system_program,
82 false
83 ));
84 accounts.extend_from_slice(remaining_accounts);
85 let data = CreateSatsVaultInstructionData::new().try_to_vec().unwrap();
86
87 solana_instruction::Instruction {
88 program_id: crate::SATRUSH_ID,
89 accounts,
90 data,
91 }
92 }
93}
94
95#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
96 pub struct CreateSatsVaultInstructionData {
97 discriminator: [u8; 8],
98 }
99
100impl CreateSatsVaultInstructionData {
101 pub fn new() -> Self {
102 Self {
103 discriminator: [159, 29, 126, 216, 29, 240, 141, 61],
104 }
105 }
106
107 pub(crate) fn try_to_vec(&self) -> Result<Vec<u8>, std::io::Error> {
108 borsh::to_vec(self)
109 }
110 }
111
112impl Default for CreateSatsVaultInstructionData {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117
118
119
120#[derive(Clone, Debug, Default)]
133pub struct CreateSatsVaultBuilder {
134 authority: Option<solana_address::Address>,
135 satrush_config: Option<solana_address::Address>,
136 sats_vault: Option<solana_address::Address>,
137 btc_mint: Option<solana_address::Address>,
138 sats_vault_btc_ata: Option<solana_address::Address>,
139 token_program: Option<solana_address::Address>,
140 associated_token_program: Option<solana_address::Address>,
141 system_program: Option<solana_address::Address>,
142 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
143}
144
145impl CreateSatsVaultBuilder {
146 pub fn new() -> Self {
147 Self::default()
148 }
149 #[inline(always)]
150 pub fn authority(&mut self, authority: solana_address::Address) -> &mut Self {
151 self.authority = Some(authority);
152 self
153 }
154 #[inline(always)]
155 pub fn satrush_config(&mut self, satrush_config: solana_address::Address) -> &mut Self {
156 self.satrush_config = Some(satrush_config);
157 self
158 }
159 #[inline(always)]
160 pub fn sats_vault(&mut self, sats_vault: solana_address::Address) -> &mut Self {
161 self.sats_vault = Some(sats_vault);
162 self
163 }
164 #[inline(always)]
165 pub fn btc_mint(&mut self, btc_mint: solana_address::Address) -> &mut Self {
166 self.btc_mint = Some(btc_mint);
167 self
168 }
169 #[inline(always)]
171 pub fn sats_vault_btc_ata(&mut self, sats_vault_btc_ata: solana_address::Address) -> &mut Self {
172 self.sats_vault_btc_ata = Some(sats_vault_btc_ata);
173 self
174 }
175 #[inline(always)]
177 pub fn token_program(&mut self, token_program: solana_address::Address) -> &mut Self {
178 self.token_program = Some(token_program);
179 self
180 }
181 #[inline(always)]
183 pub fn associated_token_program(&mut self, associated_token_program: solana_address::Address) -> &mut Self {
184 self.associated_token_program = Some(associated_token_program);
185 self
186 }
187 #[inline(always)]
189 pub fn system_program(&mut self, system_program: solana_address::Address) -> &mut Self {
190 self.system_program = Some(system_program);
191 self
192 }
193 #[inline(always)]
195 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
196 self.__remaining_accounts.push(account);
197 self
198 }
199 #[inline(always)]
201 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
202 self.__remaining_accounts.extend_from_slice(accounts);
203 self
204 }
205 #[allow(clippy::clone_on_copy)]
206 pub fn instruction(&self) -> solana_instruction::Instruction {
207 let accounts = CreateSatsVault {
208 authority: self.authority.expect("authority is not set"),
209 satrush_config: self.satrush_config.expect("satrush_config is not set"),
210 sats_vault: self.sats_vault.expect("sats_vault is not set"),
211 btc_mint: self.btc_mint.expect("btc_mint is not set"),
212 sats_vault_btc_ata: self.sats_vault_btc_ata.expect("sats_vault_btc_ata is not set"),
213 token_program: self.token_program.unwrap_or(solana_address::address!("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA")),
214 associated_token_program: self.associated_token_program.unwrap_or(solana_address::address!("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL")),
215 system_program: self.system_program.unwrap_or(solana_address::address!("11111111111111111111111111111111")),
216 };
217
218 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
219 }
220}
221
222 pub struct CreateSatsVaultCpiAccounts<'a, 'b> {
224
225
226 pub authority: &'b solana_account_info::AccountInfo<'a>,
227
228
229 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
230
231
232 pub sats_vault: &'b solana_account_info::AccountInfo<'a>,
233
234
235 pub btc_mint: &'b solana_account_info::AccountInfo<'a>,
236 pub sats_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>,
241
242
243 pub token_program: &'b solana_account_info::AccountInfo<'a>,
244
245
246 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
247
248
249 pub system_program: &'b solana_account_info::AccountInfo<'a>,
250 }
251
252pub struct CreateSatsVaultCpi<'a, 'b> {
254 pub __program: &'b solana_account_info::AccountInfo<'a>,
256
257
258 pub authority: &'b solana_account_info::AccountInfo<'a>,
259
260
261 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
262
263
264 pub sats_vault: &'b solana_account_info::AccountInfo<'a>,
265
266
267 pub btc_mint: &'b solana_account_info::AccountInfo<'a>,
268 pub sats_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>,
273
274
275 pub token_program: &'b solana_account_info::AccountInfo<'a>,
276
277
278 pub associated_token_program: &'b solana_account_info::AccountInfo<'a>,
279
280
281 pub system_program: &'b solana_account_info::AccountInfo<'a>,
282 }
283
284impl<'a, 'b> CreateSatsVaultCpi<'a, 'b> {
285 pub fn new(
286 program: &'b solana_account_info::AccountInfo<'a>,
287 accounts: CreateSatsVaultCpiAccounts<'a, 'b>,
288 ) -> Self {
289 Self {
290 __program: program,
291 authority: accounts.authority,
292 satrush_config: accounts.satrush_config,
293 sats_vault: accounts.sats_vault,
294 btc_mint: accounts.btc_mint,
295 sats_vault_btc_ata: accounts.sats_vault_btc_ata,
296 token_program: accounts.token_program,
297 associated_token_program: accounts.associated_token_program,
298 system_program: accounts.system_program,
299 }
300 }
301 #[inline(always)]
302 pub fn invoke(&self) -> solana_program_error::ProgramResult {
303 self.invoke_signed_with_remaining_accounts(&[], &[])
304 }
305 #[inline(always)]
306 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
307 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
308 }
309 #[inline(always)]
310 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
311 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
312 }
313 #[allow(clippy::arithmetic_side_effects)]
314 #[allow(clippy::clone_on_copy)]
315 #[allow(clippy::vec_init_then_push)]
316 pub fn invoke_signed_with_remaining_accounts(
317 &self,
318 signers_seeds: &[&[&[u8]]],
319 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
320 ) -> solana_program_error::ProgramResult {
321 let mut accounts = Vec::with_capacity(8+ remaining_accounts.len());
322 accounts.push(solana_instruction::AccountMeta::new(
323 *self.authority.key,
324 true
325 ));
326 accounts.push(solana_instruction::AccountMeta::new_readonly(
327 *self.satrush_config.key,
328 false
329 ));
330 accounts.push(solana_instruction::AccountMeta::new(
331 *self.sats_vault.key,
332 false
333 ));
334 accounts.push(solana_instruction::AccountMeta::new_readonly(
335 *self.btc_mint.key,
336 false
337 ));
338 accounts.push(solana_instruction::AccountMeta::new(
339 *self.sats_vault_btc_ata.key,
340 false
341 ));
342 accounts.push(solana_instruction::AccountMeta::new_readonly(
343 *self.token_program.key,
344 false
345 ));
346 accounts.push(solana_instruction::AccountMeta::new_readonly(
347 *self.associated_token_program.key,
348 false
349 ));
350 accounts.push(solana_instruction::AccountMeta::new_readonly(
351 *self.system_program.key,
352 false
353 ));
354 remaining_accounts.iter().for_each(|remaining_account| {
355 accounts.push(solana_instruction::AccountMeta {
356 pubkey: *remaining_account.0.key,
357 is_signer: remaining_account.1,
358 is_writable: remaining_account.2,
359 })
360 });
361 let data = CreateSatsVaultInstructionData::new().try_to_vec().unwrap();
362
363 let instruction = solana_instruction::Instruction {
364 program_id: crate::SATRUSH_ID,
365 accounts,
366 data,
367 };
368 let mut account_infos = Vec::with_capacity(9 + remaining_accounts.len());
369 account_infos.push(self.__program.clone());
370 account_infos.push(self.authority.clone());
371 account_infos.push(self.satrush_config.clone());
372 account_infos.push(self.sats_vault.clone());
373 account_infos.push(self.btc_mint.clone());
374 account_infos.push(self.sats_vault_btc_ata.clone());
375 account_infos.push(self.token_program.clone());
376 account_infos.push(self.associated_token_program.clone());
377 account_infos.push(self.system_program.clone());
378 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
379
380 if signers_seeds.is_empty() {
381 solana_cpi::invoke(&instruction, &account_infos)
382 } else {
383 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
384 }
385 }
386}
387
388#[derive(Clone, Debug)]
401pub struct CreateSatsVaultCpiBuilder<'a, 'b> {
402 instruction: Box<CreateSatsVaultCpiBuilderInstruction<'a, 'b>>,
403}
404
405impl<'a, 'b> CreateSatsVaultCpiBuilder<'a, 'b> {
406 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
407 let instruction = Box::new(CreateSatsVaultCpiBuilderInstruction {
408 __program: program,
409 authority: None,
410 satrush_config: None,
411 sats_vault: None,
412 btc_mint: None,
413 sats_vault_btc_ata: None,
414 token_program: None,
415 associated_token_program: None,
416 system_program: None,
417 __remaining_accounts: Vec::new(),
418 });
419 Self { instruction }
420 }
421 #[inline(always)]
422 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
423 self.instruction.authority = Some(authority);
424 self
425 }
426 #[inline(always)]
427 pub fn satrush_config(&mut self, satrush_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
428 self.instruction.satrush_config = Some(satrush_config);
429 self
430 }
431 #[inline(always)]
432 pub fn sats_vault(&mut self, sats_vault: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
433 self.instruction.sats_vault = Some(sats_vault);
434 self
435 }
436 #[inline(always)]
437 pub fn btc_mint(&mut self, btc_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
438 self.instruction.btc_mint = Some(btc_mint);
439 self
440 }
441 #[inline(always)]
443 pub fn sats_vault_btc_ata(&mut self, sats_vault_btc_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
444 self.instruction.sats_vault_btc_ata = Some(sats_vault_btc_ata);
445 self
446 }
447 #[inline(always)]
448 pub fn token_program(&mut self, token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
449 self.instruction.token_program = Some(token_program);
450 self
451 }
452 #[inline(always)]
453 pub fn associated_token_program(&mut self, associated_token_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
454 self.instruction.associated_token_program = Some(associated_token_program);
455 self
456 }
457 #[inline(always)]
458 pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
459 self.instruction.system_program = Some(system_program);
460 self
461 }
462 #[inline(always)]
464 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
465 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
466 self
467 }
468 #[inline(always)]
473 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
474 self.instruction.__remaining_accounts.extend_from_slice(accounts);
475 self
476 }
477 #[inline(always)]
478 pub fn invoke(&self) -> solana_program_error::ProgramResult {
479 self.invoke_signed(&[])
480 }
481 #[allow(clippy::clone_on_copy)]
482 #[allow(clippy::vec_init_then_push)]
483 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
484 let instruction = CreateSatsVaultCpi {
485 __program: self.instruction.__program,
486
487 authority: self.instruction.authority.expect("authority is not set"),
488
489 satrush_config: self.instruction.satrush_config.expect("satrush_config is not set"),
490
491 sats_vault: self.instruction.sats_vault.expect("sats_vault is not set"),
492
493 btc_mint: self.instruction.btc_mint.expect("btc_mint is not set"),
494
495 sats_vault_btc_ata: self.instruction.sats_vault_btc_ata.expect("sats_vault_btc_ata is not set"),
496
497 token_program: self.instruction.token_program.expect("token_program is not set"),
498
499 associated_token_program: self.instruction.associated_token_program.expect("associated_token_program is not set"),
500
501 system_program: self.instruction.system_program.expect("system_program is not set"),
502 };
503 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
504 }
505}
506
507#[derive(Clone, Debug)]
508struct CreateSatsVaultCpiBuilderInstruction<'a, 'b> {
509 __program: &'b solana_account_info::AccountInfo<'a>,
510 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
511 satrush_config: Option<&'b solana_account_info::AccountInfo<'a>>,
512 sats_vault: Option<&'b solana_account_info::AccountInfo<'a>>,
513 btc_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
514 sats_vault_btc_ata: Option<&'b solana_account_info::AccountInfo<'a>>,
515 token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
516 associated_token_program: Option<&'b solana_account_info::AccountInfo<'a>>,
517 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
518 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
520}
521