1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const TRIGGER_ONE_BTC_DRAW_DISCRIMINATOR: [u8; 8] = [252, 210, 238, 28, 169, 118, 28, 11];
12
13#[derive(Debug)]
15pub struct TriggerOneBtcDraw {
16
17
18 pub authority: solana_address::Address,
19
20
21 pub satrush_config: solana_address::Address,
22 pub one_btc_vault: solana_address::Address,
27
28
29 pub one_btc_vault_iteration: solana_address::Address,
30
31
32 pub next_one_btc_vault_iteration: solana_address::Address,
33
34
35 pub system_program: solana_address::Address,
36 }
37
38impl TriggerOneBtcDraw {
39 pub fn instruction(&self) -> solana_instruction::Instruction {
40 self.instruction_with_remaining_accounts(&[])
41 }
42 #[allow(clippy::arithmetic_side_effects)]
43 #[allow(clippy::vec_init_then_push)]
44 pub fn instruction_with_remaining_accounts(&self, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
45 let mut accounts = Vec::with_capacity(6+ remaining_accounts.len());
46 accounts.push(solana_instruction::AccountMeta::new(
47 self.authority,
48 true
49 ));
50 accounts.push(solana_instruction::AccountMeta::new_readonly(
51 self.satrush_config,
52 false
53 ));
54 accounts.push(solana_instruction::AccountMeta::new(
55 self.one_btc_vault,
56 false
57 ));
58 accounts.push(solana_instruction::AccountMeta::new(
59 self.one_btc_vault_iteration,
60 false
61 ));
62 accounts.push(solana_instruction::AccountMeta::new(
63 self.next_one_btc_vault_iteration,
64 false
65 ));
66 accounts.push(solana_instruction::AccountMeta::new_readonly(
67 self.system_program,
68 false
69 ));
70 accounts.extend_from_slice(remaining_accounts);
71 let data = TriggerOneBtcDrawInstructionData::new().try_to_vec().unwrap();
72
73 solana_instruction::Instruction {
74 program_id: crate::SATRUSH_ID,
75 accounts,
76 data,
77 }
78 }
79}
80
81#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
82 pub struct TriggerOneBtcDrawInstructionData {
83 discriminator: [u8; 8],
84 }
85
86impl TriggerOneBtcDrawInstructionData {
87 pub fn new() -> Self {
88 Self {
89 discriminator: [252, 210, 238, 28, 169, 118, 28, 11],
90 }
91 }
92
93 pub(crate) fn try_to_vec(&self) -> Result<Vec<u8>, std::io::Error> {
94 borsh::to_vec(self)
95 }
96 }
97
98impl Default for TriggerOneBtcDrawInstructionData {
99 fn default() -> Self {
100 Self::new()
101 }
102}
103
104
105
106#[derive(Clone, Debug, Default)]
117pub struct TriggerOneBtcDrawBuilder {
118 authority: Option<solana_address::Address>,
119 satrush_config: Option<solana_address::Address>,
120 one_btc_vault: Option<solana_address::Address>,
121 one_btc_vault_iteration: Option<solana_address::Address>,
122 next_one_btc_vault_iteration: Option<solana_address::Address>,
123 system_program: Option<solana_address::Address>,
124 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
125}
126
127impl TriggerOneBtcDrawBuilder {
128 pub fn new() -> Self {
129 Self::default()
130 }
131 #[inline(always)]
132 pub fn authority(&mut self, authority: solana_address::Address) -> &mut Self {
133 self.authority = Some(authority);
134 self
135 }
136 #[inline(always)]
137 pub fn satrush_config(&mut self, satrush_config: solana_address::Address) -> &mut Self {
138 self.satrush_config = Some(satrush_config);
139 self
140 }
141 #[inline(always)]
143 pub fn one_btc_vault(&mut self, one_btc_vault: solana_address::Address) -> &mut Self {
144 self.one_btc_vault = Some(one_btc_vault);
145 self
146 }
147 #[inline(always)]
148 pub fn one_btc_vault_iteration(&mut self, one_btc_vault_iteration: solana_address::Address) -> &mut Self {
149 self.one_btc_vault_iteration = Some(one_btc_vault_iteration);
150 self
151 }
152 #[inline(always)]
153 pub fn next_one_btc_vault_iteration(&mut self, next_one_btc_vault_iteration: solana_address::Address) -> &mut Self {
154 self.next_one_btc_vault_iteration = Some(next_one_btc_vault_iteration);
155 self
156 }
157 #[inline(always)]
159 pub fn system_program(&mut self, system_program: solana_address::Address) -> &mut Self {
160 self.system_program = Some(system_program);
161 self
162 }
163 #[inline(always)]
165 pub fn add_remaining_account(&mut self, account: solana_instruction::AccountMeta) -> &mut Self {
166 self.__remaining_accounts.push(account);
167 self
168 }
169 #[inline(always)]
171 pub fn add_remaining_accounts(&mut self, accounts: &[solana_instruction::AccountMeta]) -> &mut Self {
172 self.__remaining_accounts.extend_from_slice(accounts);
173 self
174 }
175 #[allow(clippy::clone_on_copy)]
176 pub fn instruction(&self) -> solana_instruction::Instruction {
177 let accounts = TriggerOneBtcDraw {
178 authority: self.authority.expect("authority is not set"),
179 satrush_config: self.satrush_config.expect("satrush_config is not set"),
180 one_btc_vault: self.one_btc_vault.expect("one_btc_vault is not set"),
181 one_btc_vault_iteration: self.one_btc_vault_iteration.expect("one_btc_vault_iteration is not set"),
182 next_one_btc_vault_iteration: self.next_one_btc_vault_iteration.expect("next_one_btc_vault_iteration is not set"),
183 system_program: self.system_program.unwrap_or(solana_address::address!("11111111111111111111111111111111")),
184 };
185
186 accounts.instruction_with_remaining_accounts(&self.__remaining_accounts)
187 }
188}
189
190 pub struct TriggerOneBtcDrawCpiAccounts<'a, 'b> {
192
193
194 pub authority: &'b solana_account_info::AccountInfo<'a>,
195
196
197 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
198 pub one_btc_vault: &'b solana_account_info::AccountInfo<'a>,
203
204
205 pub one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
206
207
208 pub next_one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
209
210
211 pub system_program: &'b solana_account_info::AccountInfo<'a>,
212 }
213
214pub struct TriggerOneBtcDrawCpi<'a, 'b> {
216 pub __program: &'b solana_account_info::AccountInfo<'a>,
218
219
220 pub authority: &'b solana_account_info::AccountInfo<'a>,
221
222
223 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
224 pub one_btc_vault: &'b solana_account_info::AccountInfo<'a>,
229
230
231 pub one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
232
233
234 pub next_one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
235
236
237 pub system_program: &'b solana_account_info::AccountInfo<'a>,
238 }
239
240impl<'a, 'b> TriggerOneBtcDrawCpi<'a, 'b> {
241 pub fn new(
242 program: &'b solana_account_info::AccountInfo<'a>,
243 accounts: TriggerOneBtcDrawCpiAccounts<'a, 'b>,
244 ) -> Self {
245 Self {
246 __program: program,
247 authority: accounts.authority,
248 satrush_config: accounts.satrush_config,
249 one_btc_vault: accounts.one_btc_vault,
250 one_btc_vault_iteration: accounts.one_btc_vault_iteration,
251 next_one_btc_vault_iteration: accounts.next_one_btc_vault_iteration,
252 system_program: accounts.system_program,
253 }
254 }
255 #[inline(always)]
256 pub fn invoke(&self) -> solana_program_error::ProgramResult {
257 self.invoke_signed_with_remaining_accounts(&[], &[])
258 }
259 #[inline(always)]
260 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
261 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
262 }
263 #[inline(always)]
264 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
265 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
266 }
267 #[allow(clippy::arithmetic_side_effects)]
268 #[allow(clippy::clone_on_copy)]
269 #[allow(clippy::vec_init_then_push)]
270 pub fn invoke_signed_with_remaining_accounts(
271 &self,
272 signers_seeds: &[&[&[u8]]],
273 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
274 ) -> solana_program_error::ProgramResult {
275 let mut accounts = Vec::with_capacity(6+ remaining_accounts.len());
276 accounts.push(solana_instruction::AccountMeta::new(
277 *self.authority.key,
278 true
279 ));
280 accounts.push(solana_instruction::AccountMeta::new_readonly(
281 *self.satrush_config.key,
282 false
283 ));
284 accounts.push(solana_instruction::AccountMeta::new(
285 *self.one_btc_vault.key,
286 false
287 ));
288 accounts.push(solana_instruction::AccountMeta::new(
289 *self.one_btc_vault_iteration.key,
290 false
291 ));
292 accounts.push(solana_instruction::AccountMeta::new(
293 *self.next_one_btc_vault_iteration.key,
294 false
295 ));
296 accounts.push(solana_instruction::AccountMeta::new_readonly(
297 *self.system_program.key,
298 false
299 ));
300 remaining_accounts.iter().for_each(|remaining_account| {
301 accounts.push(solana_instruction::AccountMeta {
302 pubkey: *remaining_account.0.key,
303 is_signer: remaining_account.1,
304 is_writable: remaining_account.2,
305 })
306 });
307 let data = TriggerOneBtcDrawInstructionData::new().try_to_vec().unwrap();
308
309 let instruction = solana_instruction::Instruction {
310 program_id: crate::SATRUSH_ID,
311 accounts,
312 data,
313 };
314 let mut account_infos = Vec::with_capacity(7 + remaining_accounts.len());
315 account_infos.push(self.__program.clone());
316 account_infos.push(self.authority.clone());
317 account_infos.push(self.satrush_config.clone());
318 account_infos.push(self.one_btc_vault.clone());
319 account_infos.push(self.one_btc_vault_iteration.clone());
320 account_infos.push(self.next_one_btc_vault_iteration.clone());
321 account_infos.push(self.system_program.clone());
322 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
323
324 if signers_seeds.is_empty() {
325 solana_cpi::invoke(&instruction, &account_infos)
326 } else {
327 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
328 }
329 }
330}
331
332#[derive(Clone, Debug)]
343pub struct TriggerOneBtcDrawCpiBuilder<'a, 'b> {
344 instruction: Box<TriggerOneBtcDrawCpiBuilderInstruction<'a, 'b>>,
345}
346
347impl<'a, 'b> TriggerOneBtcDrawCpiBuilder<'a, 'b> {
348 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
349 let instruction = Box::new(TriggerOneBtcDrawCpiBuilderInstruction {
350 __program: program,
351 authority: None,
352 satrush_config: None,
353 one_btc_vault: None,
354 one_btc_vault_iteration: None,
355 next_one_btc_vault_iteration: None,
356 system_program: None,
357 __remaining_accounts: Vec::new(),
358 });
359 Self { instruction }
360 }
361 #[inline(always)]
362 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
363 self.instruction.authority = Some(authority);
364 self
365 }
366 #[inline(always)]
367 pub fn satrush_config(&mut self, satrush_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
368 self.instruction.satrush_config = Some(satrush_config);
369 self
370 }
371 #[inline(always)]
373 pub fn one_btc_vault(&mut self, one_btc_vault: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
374 self.instruction.one_btc_vault = Some(one_btc_vault);
375 self
376 }
377 #[inline(always)]
378 pub fn one_btc_vault_iteration(&mut self, one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
379 self.instruction.one_btc_vault_iteration = Some(one_btc_vault_iteration);
380 self
381 }
382 #[inline(always)]
383 pub fn next_one_btc_vault_iteration(&mut self, next_one_btc_vault_iteration: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
384 self.instruction.next_one_btc_vault_iteration = Some(next_one_btc_vault_iteration);
385 self
386 }
387 #[inline(always)]
388 pub fn system_program(&mut self, system_program: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
389 self.instruction.system_program = Some(system_program);
390 self
391 }
392 #[inline(always)]
394 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
395 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
396 self
397 }
398 #[inline(always)]
403 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
404 self.instruction.__remaining_accounts.extend_from_slice(accounts);
405 self
406 }
407 #[inline(always)]
408 pub fn invoke(&self) -> solana_program_error::ProgramResult {
409 self.invoke_signed(&[])
410 }
411 #[allow(clippy::clone_on_copy)]
412 #[allow(clippy::vec_init_then_push)]
413 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
414 let instruction = TriggerOneBtcDrawCpi {
415 __program: self.instruction.__program,
416
417 authority: self.instruction.authority.expect("authority is not set"),
418
419 satrush_config: self.instruction.satrush_config.expect("satrush_config is not set"),
420
421 one_btc_vault: self.instruction.one_btc_vault.expect("one_btc_vault is not set"),
422
423 one_btc_vault_iteration: self.instruction.one_btc_vault_iteration.expect("one_btc_vault_iteration is not set"),
424
425 next_one_btc_vault_iteration: self.instruction.next_one_btc_vault_iteration.expect("next_one_btc_vault_iteration is not set"),
426
427 system_program: self.instruction.system_program.expect("system_program is not set"),
428 };
429 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
430 }
431}
432
433#[derive(Clone, Debug)]
434struct TriggerOneBtcDrawCpiBuilderInstruction<'a, 'b> {
435 __program: &'b solana_account_info::AccountInfo<'a>,
436 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
437 satrush_config: Option<&'b solana_account_info::AccountInfo<'a>>,
438 one_btc_vault: Option<&'b solana_account_info::AccountInfo<'a>>,
439 one_btc_vault_iteration: Option<&'b solana_account_info::AccountInfo<'a>>,
440 next_one_btc_vault_iteration: Option<&'b solana_account_info::AccountInfo<'a>>,
441 system_program: Option<&'b solana_account_info::AccountInfo<'a>>,
442 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
444}
445