1use solana_program::pubkey::Pubkey;
2use spl_associated_token_account::get_associated_token_address;
3use steel::*;
4
5use crate::{
6 consts::{BOARD, MINT_ADDRESS, SOL_MINT, TREASURY_ADDRESS},
7 instruction::*,
8 state::*,
9};
10
11pub fn log(signer: Pubkey, msg: &[u8]) -> Instruction {
12 let mut data = Log {}.to_bytes();
13 data.extend_from_slice(msg);
14 Instruction {
15 program_id: crate::ID,
16 accounts: vec![AccountMeta::new(signer, true)],
17 data: data,
18 }
19}
20
21pub fn program_log(accounts: &[AccountInfo], msg: &[u8]) -> Result<(), ProgramError> {
22 invoke_signed(&log(*accounts[0].key, msg), accounts, &crate::ID, &[BOARD])
23}
24
25pub fn automate(
28 signer: Pubkey,
29 amount: u64,
30 deposit: u64,
31 executor: Pubkey,
32 fee: u64,
33 mask: u64,
34 strategy: u8,
35 reload: bool,
36) -> Instruction {
37 let automation_address = automation_pda(signer).0;
38 let miner_address = miner_pda(signer).0;
39 Instruction {
40 program_id: crate::ID,
41 accounts: vec![
42 AccountMeta::new(signer, true),
43 AccountMeta::new(automation_address, false),
44 AccountMeta::new(executor, false),
45 AccountMeta::new(miner_address, false),
46 AccountMeta::new_readonly(system_program::ID, false),
47 ],
48 data: Automate {
49 amount: amount.to_le_bytes(),
50 deposit: deposit.to_le_bytes(),
51 fee: fee.to_le_bytes(),
52 mask: mask.to_le_bytes(),
53 strategy: strategy as u8,
54 reload: (reload as u64).to_le_bytes(),
55 }
56 .to_bytes(),
57 }
58}
59
60pub fn claim_sol(signer: Pubkey) -> Instruction {
61 let miner_address = miner_pda(signer).0;
62 Instruction {
63 program_id: crate::ID,
64 accounts: vec![
65 AccountMeta::new(signer, true),
66 AccountMeta::new(miner_address, false),
67 AccountMeta::new_readonly(system_program::ID, false),
68 ],
69 data: ClaimSOL {}.to_bytes(),
70 }
71}
72
73pub fn claim_ore(signer: Pubkey) -> Instruction {
76 let miner_address = miner_pda(signer).0;
77 let treasury_address = treasury_pda().0;
78 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
79 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
80 Instruction {
81 program_id: crate::ID,
82 accounts: vec![
83 AccountMeta::new(signer, true),
84 AccountMeta::new(miner_address, false),
85 AccountMeta::new(MINT_ADDRESS, false),
86 AccountMeta::new(recipient_address, false),
87 AccountMeta::new(treasury_address, false),
88 AccountMeta::new(treasury_tokens_address, false),
89 AccountMeta::new_readonly(system_program::ID, false),
90 AccountMeta::new_readonly(spl_token::ID, false),
91 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
92 ],
93 data: ClaimORE {}.to_bytes(),
94 }
95}
96
97pub fn deploy(
100 signer: Pubkey,
101 authority: Pubkey,
102 amount: u64,
103 round_id: u64,
104 squares: [bool; 25],
105) -> Instruction {
106 let automation_address = automation_pda(authority).0;
107 let board_address = board_pda().0;
108 let miner_address = miner_pda(authority).0;
109 let round_address = round_pda(round_id).0;
110 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
111
112 let mut mask: u32 = 0;
115 for (i, &square) in squares.iter().enumerate() {
116 if square {
117 mask |= 1 << i;
118 }
119 }
120
121 Instruction {
122 program_id: crate::ID,
123 accounts: vec![
124 AccountMeta::new(signer, true),
125 AccountMeta::new(authority, false),
126 AccountMeta::new(automation_address, false),
127 AccountMeta::new(board_address, false),
128 AccountMeta::new(miner_address, false),
129 AccountMeta::new(round_address, false),
130 AccountMeta::new_readonly(system_program::ID, false),
131 AccountMeta::new(entropy_var_address, false),
133 AccountMeta::new_readonly(entropy_api::ID, false),
134 ],
135 data: Deploy {
136 amount: amount.to_le_bytes(),
137 squares: mask.to_le_bytes(),
138 }
139 .to_bytes(),
140 }
141}
142
143pub fn bury(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
146 let board_address = board_pda().0;
147 let config_address = config_pda().0;
148 let mint_address = MINT_ADDRESS;
149 let treasury_address = TREASURY_ADDRESS;
150 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
151 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
152 let mut accounts = vec![
153 AccountMeta::new(signer, true),
154 AccountMeta::new(board_address, false),
155 AccountMeta::new_readonly(config_address, false),
156 AccountMeta::new(mint_address, false),
157 AccountMeta::new(treasury_address, false),
158 AccountMeta::new(treasury_ore_address, false),
159 AccountMeta::new(treasury_sol_address, false),
160 AccountMeta::new_readonly(spl_token::ID, false),
161 AccountMeta::new_readonly(crate::ID, false),
162 ];
163 for account in swap_accounts.iter() {
164 let mut acc_clone = account.clone();
165 acc_clone.is_signer = false;
166 accounts.push(acc_clone);
167 }
168 let mut data = Bury {}.to_bytes();
169 data.extend_from_slice(swap_data);
170 Instruction {
171 program_id: crate::ID,
172 accounts,
173 data,
174 }
175}
176
177pub fn bury2(signer: Pubkey, amount: u64) -> Instruction {
180 let board_address = board_pda().0;
181 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
182 let mint_address = MINT_ADDRESS;
183 let treasury_address = TREASURY_ADDRESS;
184 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
185 let token_program = spl_token::ID;
186 let ore_program = crate::ID;
187 Instruction {
188 program_id: crate::ID,
189 accounts: vec![
190 AccountMeta::new(signer, true),
191 AccountMeta::new(sender_address, false),
192 AccountMeta::new(board_address, false),
193 AccountMeta::new(mint_address, false),
194 AccountMeta::new(treasury_address, false),
195 AccountMeta::new(treasury_ore_address, false),
196 AccountMeta::new_readonly(token_program, false),
197 AccountMeta::new_readonly(ore_program, false),
198 ],
199 data: Bury2 {
200 amount: amount.to_le_bytes(),
201 }
202 .to_bytes(),
203 }
204}
205
206pub fn wrap(signer: Pubkey) -> Instruction {
207 let config_address = config_pda().0;
208 let treasury_address = TREASURY_ADDRESS;
209 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
210 Instruction {
211 accounts: vec![
212 AccountMeta::new(signer, true),
213 AccountMeta::new_readonly(config_address, false),
214 AccountMeta::new(treasury_address, false),
215 AccountMeta::new(treasury_sol_address, false),
216 AccountMeta::new_readonly(system_program::ID, false),
217 ],
218 program_id: crate::ID,
219 data: Wrap {}.to_bytes(),
220 }
221}
222
223pub fn reset(
226 signer: Pubkey,
227 fee_collector: Pubkey,
228 round_id: u64,
229 top_miner: Pubkey,
230) -> Instruction {
231 let board_address = board_pda().0;
232 let config_address = config_pda().0;
233 let mint_address = MINT_ADDRESS;
234 let round_address = round_pda(round_id).0;
235 let round_next_address = round_pda(round_id + 1).0;
236 let top_miner_address = miner_pda(top_miner).0;
237 let treasury_address = TREASURY_ADDRESS;
238 let treasury_tokens_address = treasury_tokens_address();
239 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
240 Instruction {
241 program_id: crate::ID,
242 accounts: vec![
243 AccountMeta::new(signer, true),
244 AccountMeta::new(board_address, false),
245 AccountMeta::new(config_address, false),
246 AccountMeta::new(fee_collector, false),
247 AccountMeta::new(mint_address, false),
248 AccountMeta::new(round_address, false),
249 AccountMeta::new(round_next_address, false),
250 AccountMeta::new(top_miner_address, false),
251 AccountMeta::new(treasury_address, false),
252 AccountMeta::new(treasury_tokens_address, false),
253 AccountMeta::new_readonly(system_program::ID, false),
254 AccountMeta::new_readonly(spl_token::ID, false),
255 AccountMeta::new_readonly(crate::ID, false),
256 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
257 AccountMeta::new(entropy_var_address, false),
259 AccountMeta::new_readonly(entropy_api::ID, false),
260 ],
261 data: Reset {}.to_bytes(),
262 }
263}
264
265pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
268 let board_address = board_pda().0;
269 let treasury_address = TREASURY_ADDRESS;
270 let round_address = round_pda(round_id).0;
271 Instruction {
272 program_id: crate::ID,
273 accounts: vec![
274 AccountMeta::new(signer, true),
275 AccountMeta::new(board_address, false),
276 AccountMeta::new(rent_payer, false),
277 AccountMeta::new(round_address, false),
278 AccountMeta::new(treasury_address, false),
279 AccountMeta::new_readonly(system_program::ID, false),
280 ],
281 data: Close {}.to_bytes(),
282 }
283}
284
285pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
288 let miner_address = miner_pda(authority).0;
289 let board_address = board_pda().0;
290 let round_address = round_pda(round_id).0;
291 let treasury_address = TREASURY_ADDRESS;
292 Instruction {
293 program_id: crate::ID,
294 accounts: vec![
295 AccountMeta::new(signer, true),
296 AccountMeta::new(board_address, false),
297 AccountMeta::new(miner_address, false),
298 AccountMeta::new(round_address, false),
299 AccountMeta::new(treasury_address, false),
300 AccountMeta::new_readonly(system_program::ID, false),
301 ],
302 data: Checkpoint {}.to_bytes(),
303 }
304}
305
306pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
307 let config_address = config_pda().0;
308 Instruction {
309 program_id: crate::ID,
310 accounts: vec![
311 AccountMeta::new(signer, true),
312 AccountMeta::new(config_address, false),
313 AccountMeta::new_readonly(system_program::ID, false),
314 ],
315 data: SetAdmin {
316 admin: admin.to_bytes(),
317 }
318 .to_bytes(),
319 }
320}
321
322pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
323 let config_address = config_pda().0;
324 Instruction {
325 program_id: crate::ID,
326 accounts: vec![
327 AccountMeta::new(signer, true),
328 AccountMeta::new(config_address, false),
329 AccountMeta::new_readonly(system_program::ID, false),
330 ],
331 data: SetAdminFee {
332 admin_fee: admin_fee.to_le_bytes(),
333 }
334 .to_bytes(),
335 }
336}
337
338pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
339 let config_address = config_pda().0;
340 Instruction {
341 program_id: crate::ID,
342 accounts: vec![
343 AccountMeta::new(signer, true),
344 AccountMeta::new(config_address, false),
345 AccountMeta::new_readonly(system_program::ID, false),
346 ],
347 data: SetFeeCollector {
348 fee_collector: fee_collector.to_bytes(),
349 }
350 .to_bytes(),
351 }
352}
353
354pub fn deposit(signer: Pubkey, payer: Pubkey, amount: u64) -> Instruction {
357 let mint_address = MINT_ADDRESS;
358 let stake_address = stake_pda(signer).0;
359 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
360 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
361 let treasury_address = TREASURY_ADDRESS;
362 Instruction {
363 program_id: crate::ID,
364 accounts: vec![
365 AccountMeta::new(signer, true),
366 AccountMeta::new(payer, true),
367 AccountMeta::new(mint_address, false),
368 AccountMeta::new(sender_address, false),
369 AccountMeta::new(stake_address, false),
370 AccountMeta::new(stake_tokens_address, false),
371 AccountMeta::new(treasury_address, false),
372 AccountMeta::new_readonly(system_program::ID, false),
373 AccountMeta::new_readonly(spl_token::ID, false),
374 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
375 ],
376 data: Deposit {
377 amount: amount.to_le_bytes(),
378 }
379 .to_bytes(),
380 }
381}
382
383pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
386 let stake_address = stake_pda(signer).0;
387 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
388 let mint_address = MINT_ADDRESS;
389 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
390 let treasury_address = TREASURY_ADDRESS;
391 Instruction {
392 program_id: crate::ID,
393 accounts: vec![
394 AccountMeta::new(signer, true),
395 AccountMeta::new(mint_address, false),
396 AccountMeta::new(recipient_address, false),
397 AccountMeta::new(stake_address, false),
398 AccountMeta::new(stake_tokens_address, false),
399 AccountMeta::new(treasury_address, false),
400 AccountMeta::new_readonly(system_program::ID, false),
401 AccountMeta::new_readonly(spl_token::ID, false),
402 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
403 ],
404 data: Withdraw {
405 amount: amount.to_le_bytes(),
406 }
407 .to_bytes(),
408 }
409}
410
411pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
414 let automation_address = automation_pda(authority).0;
415 let miner_address = miner_pda(authority).0;
416 Instruction {
417 program_id: crate::ID,
418 accounts: vec![
419 AccountMeta::new(signer, true),
420 AccountMeta::new(automation_address, false),
421 AccountMeta::new(miner_address, false),
422 AccountMeta::new_readonly(system_program::ID, false),
423 ],
424 data: ReloadSOL {}.to_bytes(),
425 }
426}
427
428pub fn claim_yield(signer: Pubkey, amount: u64) -> Instruction {
431 let stake_address = stake_pda(signer).0;
432 let mint_address = MINT_ADDRESS;
433 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
434 let treasury_address = TREASURY_ADDRESS;
435 let treasury_tokens_address = treasury_tokens_address();
436 Instruction {
437 program_id: crate::ID,
438 accounts: vec![
439 AccountMeta::new(signer, true),
440 AccountMeta::new(mint_address, false),
441 AccountMeta::new(recipient_address, false),
442 AccountMeta::new(stake_address, false),
443 AccountMeta::new(treasury_address, false),
444 AccountMeta::new(treasury_tokens_address, false),
445 AccountMeta::new_readonly(system_program::ID, false),
446 AccountMeta::new_readonly(spl_token::ID, false),
447 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
448 ],
449 data: ClaimYield {
450 amount: amount.to_le_bytes(),
451 }
452 .to_bytes(),
453 }
454}
455
456pub fn new_var(
457 signer: Pubkey,
458 provider: Pubkey,
459 id: u64,
460 commit: [u8; 32],
461 samples: u64,
462) -> Instruction {
463 let board_address = board_pda().0;
464 let config_address = config_pda().0;
465 let var_address = entropy_api::state::var_pda(board_address, id).0;
466 Instruction {
467 program_id: crate::ID,
468 accounts: vec![
469 AccountMeta::new(signer, true),
470 AccountMeta::new(board_address, false),
471 AccountMeta::new(config_address, false),
472 AccountMeta::new(provider, false),
473 AccountMeta::new(var_address, false),
474 AccountMeta::new_readonly(system_program::ID, false),
475 AccountMeta::new_readonly(entropy_api::ID, false),
476 ],
477 data: NewVar {
478 id: id.to_le_bytes(),
479 commit: commit,
480 samples: samples.to_le_bytes(),
481 }
482 .to_bytes(),
483 }
484}
485
486pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
487 let config_address = config_pda().0;
488 Instruction {
489 program_id: crate::ID,
490 accounts: vec![
491 AccountMeta::new(signer, true),
492 AccountMeta::new(config_address, false),
493 AccountMeta::new_readonly(new_program, false),
494 ],
495 data: SetSwapProgram {}.to_bytes(),
496 }
497}
498
499pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
500 let board_address = board_pda().0;
501 let config_address = config_pda().0;
502 Instruction {
503 program_id: crate::ID,
504 accounts: vec![
505 AccountMeta::new(signer, true),
506 AccountMeta::new(board_address, false),
507 AccountMeta::new(config_address, false),
508 AccountMeta::new(new_var_address, false),
509 ],
510 data: SetVarAddress {}.to_bytes(),
511 }
512}
513
514pub fn migrate_automation(signer: Pubkey, authority: Pubkey) -> Instruction {
517 let config_address = config_pda().0;
518 let automation_address = automation_pda(authority).0;
519 Instruction {
520 program_id: crate::ID,
521 accounts: vec![
522 AccountMeta::new(signer, true),
523 AccountMeta::new(authority, false),
524 AccountMeta::new(config_address, false),
525 AccountMeta::new(automation_address, false),
526 AccountMeta::new_readonly(system_program::ID, false),
527 ],
528 data: MigrateAutomation {}.to_bytes(),
529 }
530}
531
532pub fn admin_execute(signer: Pubkey, ix_accounts: &[AccountMeta], ix_data: &[u8]) -> Instruction {
533 let config_address = config_pda().0;
534 let mint_address = MINT_ADDRESS;
535 let treasury_address = TREASURY_ADDRESS;
536 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
537 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
538 let mut accounts = vec![
539 AccountMeta::new(signer, true),
540 AccountMeta::new_readonly(config_address, false),
541 AccountMeta::new(mint_address, false),
542 AccountMeta::new(treasury_address, false),
543 AccountMeta::new(treasury_ore_address, false),
544 AccountMeta::new(treasury_sol_address, false),
545 ];
546 for account in ix_accounts.iter() {
547 let mut acc_clone = account.clone();
548 acc_clone.is_signer = if acc_clone.pubkey == treasury_address {
549 false
550 } else {
551 acc_clone.is_signer
552 };
553 accounts.push(acc_clone);
554 }
555 let mut data = AdminExecute {}.to_bytes();
556 data.extend_from_slice(ix_data);
557 Instruction {
558 program_id: crate::ID,
559 accounts,
560 data,
561 }
562}