1use borsh::BorshSerialize;
9use borsh::BorshDeserialize;
10
11pub const SELECT_EPOCH_WINNER_DISCRIMINATOR: [u8; 8] = [222, 36, 211, 175, 4, 220, 2, 251];
12
13#[derive(Debug)]
15pub struct SelectEpochWinner {
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 epoch_vault_page: solana_address::Address,
31 }
32
33impl SelectEpochWinner {
34 pub fn instruction(&self, args: SelectEpochWinnerInstructionArgs) -> solana_instruction::Instruction {
35 self.instruction_with_remaining_accounts(args, &[])
36 }
37 #[allow(clippy::arithmetic_side_effects)]
38 #[allow(clippy::vec_init_then_push)]
39 pub fn instruction_with_remaining_accounts(&self, args: SelectEpochWinnerInstructionArgs, remaining_accounts: &[solana_instruction::AccountMeta]) -> solana_instruction::Instruction {
40 let mut accounts = Vec::with_capacity(5+ remaining_accounts.len());
41 accounts.push(solana_instruction::AccountMeta::new_readonly(
42 self.authority,
43 true
44 ));
45 accounts.push(solana_instruction::AccountMeta::new_readonly(
46 self.satrush_config,
47 false
48 ));
49 accounts.push(solana_instruction::AccountMeta::new(
50 self.epoch_vault,
51 false
52 ));
53 accounts.push(solana_instruction::AccountMeta::new(
54 self.epoch_vault_iteration,
55 false
56 ));
57 accounts.push(solana_instruction::AccountMeta::new_readonly(
58 self.epoch_vault_page,
59 false
60 ));
61 accounts.extend_from_slice(remaining_accounts);
62 let mut data = SelectEpochWinnerInstructionData::new().try_to_vec().unwrap();
63 let mut args = args.try_to_vec().unwrap();
64 data.append(&mut args);
65
66 solana_instruction::Instruction {
67 program_id: crate::SATRUSH_ID,
68 accounts,
69 data,
70 }
71 }
72}
73
74#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
75 pub struct SelectEpochWinnerInstructionData {
76 discriminator: [u8; 8],
77 }
78
79impl SelectEpochWinnerInstructionData {
80 pub fn new() -> Self {
81 Self {
82 discriminator: [222, 36, 211, 175, 4, 220, 2, 251],
83 }
84 }
85
86 pub(crate) fn try_to_vec(&self) -> Result<Vec<u8>, std::io::Error> {
87 borsh::to_vec(self)
88 }
89 }
90
91impl Default for SelectEpochWinnerInstructionData {
92 fn default() -> Self {
93 Self::new()
94 }
95}
96
97#[derive(BorshSerialize, BorshDeserialize, Clone, Debug, Eq, PartialEq)]
98 pub struct SelectEpochWinnerInstructionArgs {
99 pub page_index: u16,
100 }
101
102impl SelectEpochWinnerInstructionArgs {
103 pub(crate) fn try_to_vec(&self) -> Result<Vec<u8>, std::io::Error> {
104 borsh::to_vec(self)
105 }
106}
107
108
109#[derive(Clone, Debug, Default)]
119pub struct SelectEpochWinnerBuilder {
120 authority: Option<solana_address::Address>,
121 satrush_config: Option<solana_address::Address>,
122 epoch_vault: Option<solana_address::Address>,
123 epoch_vault_iteration: Option<solana_address::Address>,
124 epoch_vault_page: Option<solana_address::Address>,
125 page_index: Option<u16>,
126 __remaining_accounts: Vec<solana_instruction::AccountMeta>,
127}
128
129impl SelectEpochWinnerBuilder {
130 pub fn new() -> Self {
131 Self::default()
132 }
133 #[inline(always)]
134 pub fn authority(&mut self, authority: solana_address::Address) -> &mut Self {
135 self.authority = Some(authority);
136 self
137 }
138 #[inline(always)]
139 pub fn satrush_config(&mut self, satrush_config: solana_address::Address) -> &mut Self {
140 self.satrush_config = Some(satrush_config);
141 self
142 }
143 #[inline(always)]
144 pub fn epoch_vault(&mut self, epoch_vault: solana_address::Address) -> &mut Self {
145 self.epoch_vault = Some(epoch_vault);
146 self
147 }
148 #[inline(always)]
149 pub fn epoch_vault_iteration(&mut self, epoch_vault_iteration: solana_address::Address) -> &mut Self {
150 self.epoch_vault_iteration = Some(epoch_vault_iteration);
151 self
152 }
153 #[inline(always)]
154 pub fn epoch_vault_page(&mut self, epoch_vault_page: solana_address::Address) -> &mut Self {
155 self.epoch_vault_page = Some(epoch_vault_page);
156 self
157 }
158 #[inline(always)]
159 pub fn page_index(&mut self, page_index: u16) -> &mut Self {
160 self.page_index = Some(page_index);
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 = SelectEpochWinner {
178 authority: self.authority.expect("authority is not set"),
179 satrush_config: self.satrush_config.expect("satrush_config is not set"),
180 epoch_vault: self.epoch_vault.expect("epoch_vault is not set"),
181 epoch_vault_iteration: self.epoch_vault_iteration.expect("epoch_vault_iteration is not set"),
182 epoch_vault_page: self.epoch_vault_page.expect("epoch_vault_page is not set"),
183 };
184 let args = SelectEpochWinnerInstructionArgs {
185 page_index: self.page_index.clone().expect("page_index is not set"),
186 };
187
188 accounts.instruction_with_remaining_accounts(args, &self.__remaining_accounts)
189 }
190}
191
192 pub struct SelectEpochWinnerCpiAccounts<'a, 'b> {
194
195
196 pub authority: &'b solana_account_info::AccountInfo<'a>,
197
198
199 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
200
201
202 pub epoch_vault: &'b solana_account_info::AccountInfo<'a>,
203
204
205 pub epoch_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
206
207
208 pub epoch_vault_page: &'b solana_account_info::AccountInfo<'a>,
209 }
210
211pub struct SelectEpochWinnerCpi<'a, 'b> {
213 pub __program: &'b solana_account_info::AccountInfo<'a>,
215
216
217 pub authority: &'b solana_account_info::AccountInfo<'a>,
218
219
220 pub satrush_config: &'b solana_account_info::AccountInfo<'a>,
221
222
223 pub epoch_vault: &'b solana_account_info::AccountInfo<'a>,
224
225
226 pub epoch_vault_iteration: &'b solana_account_info::AccountInfo<'a>,
227
228
229 pub epoch_vault_page: &'b solana_account_info::AccountInfo<'a>,
230 pub __args: SelectEpochWinnerInstructionArgs,
232 }
233
234impl<'a, 'b> SelectEpochWinnerCpi<'a, 'b> {
235 pub fn new(
236 program: &'b solana_account_info::AccountInfo<'a>,
237 accounts: SelectEpochWinnerCpiAccounts<'a, 'b>,
238 args: SelectEpochWinnerInstructionArgs,
239 ) -> Self {
240 Self {
241 __program: program,
242 authority: accounts.authority,
243 satrush_config: accounts.satrush_config,
244 epoch_vault: accounts.epoch_vault,
245 epoch_vault_iteration: accounts.epoch_vault_iteration,
246 epoch_vault_page: accounts.epoch_vault_page,
247 __args: args,
248 }
249 }
250 #[inline(always)]
251 pub fn invoke(&self) -> solana_program_error::ProgramResult {
252 self.invoke_signed_with_remaining_accounts(&[], &[])
253 }
254 #[inline(always)]
255 pub fn invoke_with_remaining_accounts(&self, remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> solana_program_error::ProgramResult {
256 self.invoke_signed_with_remaining_accounts(&[], remaining_accounts)
257 }
258 #[inline(always)]
259 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
260 self.invoke_signed_with_remaining_accounts(signers_seeds, &[])
261 }
262 #[allow(clippy::arithmetic_side_effects)]
263 #[allow(clippy::clone_on_copy)]
264 #[allow(clippy::vec_init_then_push)]
265 pub fn invoke_signed_with_remaining_accounts(
266 &self,
267 signers_seeds: &[&[&[u8]]],
268 remaining_accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]
269 ) -> solana_program_error::ProgramResult {
270 let mut accounts = Vec::with_capacity(5+ remaining_accounts.len());
271 accounts.push(solana_instruction::AccountMeta::new_readonly(
272 *self.authority.key,
273 true
274 ));
275 accounts.push(solana_instruction::AccountMeta::new_readonly(
276 *self.satrush_config.key,
277 false
278 ));
279 accounts.push(solana_instruction::AccountMeta::new(
280 *self.epoch_vault.key,
281 false
282 ));
283 accounts.push(solana_instruction::AccountMeta::new(
284 *self.epoch_vault_iteration.key,
285 false
286 ));
287 accounts.push(solana_instruction::AccountMeta::new_readonly(
288 *self.epoch_vault_page.key,
289 false
290 ));
291 remaining_accounts.iter().for_each(|remaining_account| {
292 accounts.push(solana_instruction::AccountMeta {
293 pubkey: *remaining_account.0.key,
294 is_signer: remaining_account.1,
295 is_writable: remaining_account.2,
296 })
297 });
298 let mut data = SelectEpochWinnerInstructionData::new().try_to_vec().unwrap();
299 let mut args = self.__args.try_to_vec().unwrap();
300 data.append(&mut args);
301
302 let instruction = solana_instruction::Instruction {
303 program_id: crate::SATRUSH_ID,
304 accounts,
305 data,
306 };
307 let mut account_infos = Vec::with_capacity(6 + remaining_accounts.len());
308 account_infos.push(self.__program.clone());
309 account_infos.push(self.authority.clone());
310 account_infos.push(self.satrush_config.clone());
311 account_infos.push(self.epoch_vault.clone());
312 account_infos.push(self.epoch_vault_iteration.clone());
313 account_infos.push(self.epoch_vault_page.clone());
314 remaining_accounts.iter().for_each(|remaining_account| account_infos.push(remaining_account.0.clone()));
315
316 if signers_seeds.is_empty() {
317 solana_cpi::invoke(&instruction, &account_infos)
318 } else {
319 solana_cpi::invoke_signed(&instruction, &account_infos, signers_seeds)
320 }
321 }
322}
323
324#[derive(Clone, Debug)]
334pub struct SelectEpochWinnerCpiBuilder<'a, 'b> {
335 instruction: Box<SelectEpochWinnerCpiBuilderInstruction<'a, 'b>>,
336}
337
338impl<'a, 'b> SelectEpochWinnerCpiBuilder<'a, 'b> {
339 pub fn new(program: &'b solana_account_info::AccountInfo<'a>) -> Self {
340 let instruction = Box::new(SelectEpochWinnerCpiBuilderInstruction {
341 __program: program,
342 authority: None,
343 satrush_config: None,
344 epoch_vault: None,
345 epoch_vault_iteration: None,
346 epoch_vault_page: None,
347 page_index: None,
348 __remaining_accounts: Vec::new(),
349 });
350 Self { instruction }
351 }
352 #[inline(always)]
353 pub fn authority(&mut self, authority: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
354 self.instruction.authority = Some(authority);
355 self
356 }
357 #[inline(always)]
358 pub fn satrush_config(&mut self, satrush_config: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
359 self.instruction.satrush_config = Some(satrush_config);
360 self
361 }
362 #[inline(always)]
363 pub fn epoch_vault(&mut self, epoch_vault: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
364 self.instruction.epoch_vault = Some(epoch_vault);
365 self
366 }
367 #[inline(always)]
368 pub fn epoch_vault_iteration(&mut self, epoch_vault_iteration: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
369 self.instruction.epoch_vault_iteration = Some(epoch_vault_iteration);
370 self
371 }
372 #[inline(always)]
373 pub fn epoch_vault_page(&mut self, epoch_vault_page: &'b solana_account_info::AccountInfo<'a>) -> &mut Self {
374 self.instruction.epoch_vault_page = Some(epoch_vault_page);
375 self
376 }
377 #[inline(always)]
378 pub fn page_index(&mut self, page_index: u16) -> &mut Self {
379 self.instruction.page_index = Some(page_index);
380 self
381 }
382 #[inline(always)]
384 pub fn add_remaining_account(&mut self, account: &'b solana_account_info::AccountInfo<'a>, is_writable: bool, is_signer: bool) -> &mut Self {
385 self.instruction.__remaining_accounts.push((account, is_writable, is_signer));
386 self
387 }
388 #[inline(always)]
393 pub fn add_remaining_accounts(&mut self, accounts: &[(&'b solana_account_info::AccountInfo<'a>, bool, bool)]) -> &mut Self {
394 self.instruction.__remaining_accounts.extend_from_slice(accounts);
395 self
396 }
397 #[inline(always)]
398 pub fn invoke(&self) -> solana_program_error::ProgramResult {
399 self.invoke_signed(&[])
400 }
401 #[allow(clippy::clone_on_copy)]
402 #[allow(clippy::vec_init_then_push)]
403 pub fn invoke_signed(&self, signers_seeds: &[&[&[u8]]]) -> solana_program_error::ProgramResult {
404 let args = SelectEpochWinnerInstructionArgs {
405 page_index: self.instruction.page_index.clone().expect("page_index is not set"),
406 };
407 let instruction = SelectEpochWinnerCpi {
408 __program: self.instruction.__program,
409
410 authority: self.instruction.authority.expect("authority is not set"),
411
412 satrush_config: self.instruction.satrush_config.expect("satrush_config is not set"),
413
414 epoch_vault: self.instruction.epoch_vault.expect("epoch_vault is not set"),
415
416 epoch_vault_iteration: self.instruction.epoch_vault_iteration.expect("epoch_vault_iteration is not set"),
417
418 epoch_vault_page: self.instruction.epoch_vault_page.expect("epoch_vault_page is not set"),
419 __args: args,
420 };
421 instruction.invoke_signed_with_remaining_accounts(signers_seeds, &self.instruction.__remaining_accounts)
422 }
423}
424
425#[derive(Clone, Debug)]
426struct SelectEpochWinnerCpiBuilderInstruction<'a, 'b> {
427 __program: &'b solana_account_info::AccountInfo<'a>,
428 authority: Option<&'b solana_account_info::AccountInfo<'a>>,
429 satrush_config: Option<&'b solana_account_info::AccountInfo<'a>>,
430 epoch_vault: Option<&'b solana_account_info::AccountInfo<'a>>,
431 epoch_vault_iteration: Option<&'b solana_account_info::AccountInfo<'a>>,
432 epoch_vault_page: Option<&'b solana_account_info::AccountInfo<'a>>,
433 page_index: Option<u16>,
434 __remaining_accounts: Vec<(&'b solana_account_info::AccountInfo<'a>, bool, bool)>,
436}
437