1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const CREATE_TREASURY_DISCRIMINATOR: [u8; 8] = [254, 98, 217, 51, 25, 88, 140, 45];
12
13#[derive(Debug)]
15pub struct CreateTreasury {
16
17
18 pub authority: solana_address::Address,
19
20
21 pub satrush_config: solana_address::Address,
22
23
24 pub treasury: solana_address::Address,
25
26
27 pub usd_mint: solana_address::Address,
28 pub treasury_usd_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 CreateTreasury {
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.treasury,
62 false
63 ));
64 accounts.push(solana_instruction::AccountMeta::new_readonly(
65 self.usd_mint,
66 false
67 ));
68 accounts.push(solana_instruction::AccountMeta::new(
69 self.treasury_usd_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 = CreateTreasuryInstructionData::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 CreateTreasuryInstructionData {
97 discriminator: [u8; 8],
98 }
99
100impl CreateTreasuryInstructionData {
101 pub fn new() -> Self {
102 Self {
103 discriminator: [254, 98, 217, 51, 25, 88, 140, 45],
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 CreateTreasuryInstructionData {
113 fn default() -> Self {
114 Self::new()
115 }
116}
117
118
119
120#[derive(Clone, Debug, Default)]
133pub struct CreateTreasuryBuilder {
134 authority: Option<solana_address::Address>,
135 satrush_config: Option<solana_address::Address>,
136 treasury: Option<solana_address::Address>,
137 usd_mint: Option<solana_address::Address>,
138 treasury_usd_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 CreateTreasuryBuilder {
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 treasury(&mut self, treasury: solana_address::Address) -> &mut Self {
161 self.treasury = Some(treasury);
162 self
163 }
164 #[inline(always)]
165 pub fn usd_mint(&mut self, usd_mint: solana_address::Address) -> &mut Self {
166 self.usd_mint = Some(usd_mint);
167 self
168 }
169 #[inline(always)]
171 pub fn treasury_usd_ata(&mut self, treasury_usd_ata: solana_address::Address) -> &mut Self {
172 self.treasury_usd_ata = Some(treasury_usd_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 = CreateTreasury {
208 authority: self.authority.expect("authority is not set"),
209 satrush_config: self.satrush_config.expect("satrush_config is not set"),
210 treasury: self.treasury.expect("treasury is not set"),
211 usd_mint: self.usd_mint.expect("usd_mint is not set"),
212 treasury_usd_ata: self.treasury_usd_ata.expect("treasury_usd_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 CreateTreasuryCpiAccounts<'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 treasury: &'b solana_account_info::AccountInfo<'a>,
233
234
235 pub usd_mint: &'b solana_account_info::AccountInfo<'a>,
236 pub treasury_usd_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 CreateTreasuryCpi<'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 treasury: &'b solana_account_info::AccountInfo<'a>,
265
266
267 pub usd_mint: &'b solana_account_info::AccountInfo<'a>,
268 pub treasury_usd_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> CreateTreasuryCpi<'a, 'b> {
285 pub fn new(
286 program: &'b solana_account_info::AccountInfo<'a>,
287 accounts: CreateTreasuryCpiAccounts<'a, 'b>,
288 ) -> Self {
289 Self {
290 __program: program,
291 authority: accounts.authority,
292 satrush_config: accounts.satrush_config,
293 treasury: accounts.treasury,
294 usd_mint: accounts.usd_mint,
295 treasury_usd_ata: accounts.treasury_usd_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.treasury.key,
332 false
333 ));
334 accounts.push(solana_instruction::AccountMeta::new_readonly(
335 *self.usd_mint.key,
336 false
337 ));
338 accounts.push(solana_instruction::AccountMeta::new(
339 *self.treasury_usd_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 = CreateTreasuryInstructionData::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.treasury.clone());
373 account_infos.push(self.usd_mint.clone());
374 account_infos.push(self.treasury_usd_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 CreateTreasuryCpiBuilder<'a, 'b> {
402 instruction: Box<CreateTreasuryCpiBuilderInstruction<'a, 'b>>,
403}
404
405impl<'a, 'b> CreateTreasuryCpiBuilder<'a, 'b> {
406 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
407 let instruction = Box::new(CreateTreasuryCpiBuilderInstruction {
408 __program: program,
409 authority: None,
410 satrush_config: None,
411 treasury: None,
412 usd_mint: None,
413 treasury_usd_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 treasury(&mut self, treasury: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
433 self.instruction.treasury = Some(treasury);
434 self
435 }
436 #[inline(always)]
437 pub fn usd_mint(&mut self, usd_mint: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
438 self.instruction.usd_mint = Some(usd_mint);
439 self
440 }
441 #[inline(always)]
443 pub fn treasury_usd_ata(&mut self, treasury_usd_ata: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
444 self.instruction.treasury_usd_ata = Some(treasury_usd_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 = CreateTreasuryCpi {
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 treasury: self.instruction.treasury.expect("treasury is not set"),
492
493 usd_mint: self.instruction.usd_mint.expect("usd_mint is not set"),
494
495 treasury_usd_ata: self.instruction.treasury_usd_ata.expect("treasury_usd_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 CreateTreasuryCpiBuilderInstruction<'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 treasury: Option<&'b solana_account_info::AccountInfo<'a>>,
513 usd_mint: Option<&'b solana_account_info::AccountInfo<'a>>,
514 treasury_usd_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