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 config_address = config_pda().0;
109 let miner_address = miner_pda(authority).0;
110 let round_address = round_pda(round_id).0;
111 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
112
113 let mut mask: u32 = 0;
116 for (i, &square) in squares.iter().enumerate() {
117 if square {
118 mask |= 1 << i;
119 }
120 }
121
122 Instruction {
123 program_id: crate::ID,
124 accounts: vec![
125 AccountMeta::new(signer, true),
126 AccountMeta::new(authority, false),
127 AccountMeta::new(automation_address, false),
128 AccountMeta::new(board_address, false),
129 AccountMeta::new(config_address, false),
130 AccountMeta::new(miner_address, false),
131 AccountMeta::new(round_address, false),
132 AccountMeta::new_readonly(system_program::ID, false),
133 AccountMeta::new_readonly(crate::ID, false),
134 AccountMeta::new(entropy_var_address, false),
136 AccountMeta::new_readonly(entropy_api::ID, false),
137 ],
138 data: Deploy {
139 amount: amount.to_le_bytes(),
140 squares: mask.to_le_bytes(),
141 }
142 .to_bytes(),
143 }
144}
145
146pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
149 let board_address = board_pda().0;
150 let config_address = config_pda().0;
151 let mint_address = MINT_ADDRESS;
152 let treasury_address = TREASURY_ADDRESS;
153 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
154 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
155 let mut accounts = vec![
156 AccountMeta::new(signer, true),
157 AccountMeta::new(board_address, false),
158 AccountMeta::new_readonly(config_address, false),
159 AccountMeta::new(mint_address, false),
160 AccountMeta::new(treasury_address, false),
161 AccountMeta::new(treasury_ore_address, false),
162 AccountMeta::new(treasury_sol_address, false),
163 AccountMeta::new_readonly(spl_token::ID, false),
164 AccountMeta::new_readonly(crate::ID, false),
165 ];
166 for account in swap_accounts.iter() {
167 let mut acc_clone = account.clone();
168 acc_clone.is_signer = false;
169 accounts.push(acc_clone);
170 }
171 let mut data = Buyback {}.to_bytes();
172 data.extend_from_slice(swap_data);
173 Instruction {
174 program_id: crate::ID,
175 accounts,
176 data,
177 }
178}
179
180pub fn bury(signer: Pubkey, amount: u64) -> Instruction {
183 let board_address = board_pda().0;
184 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
185 let mint_address = MINT_ADDRESS;
186 let treasury_address = TREASURY_ADDRESS;
187 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
188 let token_program = spl_token::ID;
189 let ore_program = crate::ID;
190 Instruction {
191 program_id: crate::ID,
192 accounts: vec![
193 AccountMeta::new(signer, true),
194 AccountMeta::new(sender_address, false),
195 AccountMeta::new(board_address, false),
196 AccountMeta::new(mint_address, false),
197 AccountMeta::new(treasury_address, false),
198 AccountMeta::new(treasury_ore_address, false),
199 AccountMeta::new_readonly(token_program, false),
200 AccountMeta::new_readonly(ore_program, false),
201 ],
202 data: Bury {
203 amount: amount.to_le_bytes(),
204 }
205 .to_bytes(),
206 }
207}
208
209pub fn liq(signer: Pubkey, manager: Pubkey) -> Instruction {
212 let board_address = board_pda().0;
213 let config_address = config_pda().0;
214 let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
215 let treasury_address = TREASURY_ADDRESS;
216 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
217 let token_program = spl_token::ID;
218 let ore_program = crate::ID;
219 Instruction {
220 program_id: crate::ID,
221 accounts: vec![
222 AccountMeta::new(signer, true),
223 AccountMeta::new(board_address, false),
224 AccountMeta::new(config_address, false),
225 AccountMeta::new(manager, false),
226 AccountMeta::new(manager_sol_address, false),
227 AccountMeta::new(treasury_address, false),
228 AccountMeta::new(treasury_sol_address, false),
229 AccountMeta::new_readonly(token_program, false),
230 AccountMeta::new_readonly(ore_program, false),
231 ],
232 data: Liq {}.to_bytes(),
233 }
234}
235
236pub fn wrap(signer: Pubkey, amount: u64) -> Instruction {
237 let config_address = config_pda().0;
238 let treasury_address = TREASURY_ADDRESS;
239 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
240 Instruction {
241 accounts: vec![
242 AccountMeta::new(signer, true),
243 AccountMeta::new_readonly(config_address, false),
244 AccountMeta::new(treasury_address, false),
245 AccountMeta::new(treasury_sol_address, false),
246 AccountMeta::new_readonly(system_program::ID, false),
247 ],
248 program_id: crate::ID,
249 data: Wrap {
250 amount: amount.to_le_bytes(),
251 }
252 .to_bytes(),
253 }
254}
255
256pub fn reset(
259 signer: Pubkey,
260 fee_collector: Pubkey,
261 round_id: u64,
262 top_miner: Pubkey,
263) -> Instruction {
264 let board_address = board_pda().0;
265 let config_address = config_pda().0;
266 let mint_address = MINT_ADDRESS;
267 let round_address = round_pda(round_id).0;
268 let round_next_address = round_pda(round_id + 1).0;
269 let top_miner_address = miner_pda(top_miner).0;
270 let treasury_address = TREASURY_ADDRESS;
271 let treasury_tokens_address = treasury_tokens_address();
272 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
273 let mint_authority_address = ore_mint_api::state::authority_pda().0;
274 Instruction {
275 program_id: crate::ID,
276 accounts: vec![
277 AccountMeta::new(signer, true),
278 AccountMeta::new(board_address, false),
279 AccountMeta::new(config_address, false),
280 AccountMeta::new(fee_collector, false),
281 AccountMeta::new(mint_address, false),
282 AccountMeta::new(round_address, false),
283 AccountMeta::new(round_next_address, false),
284 AccountMeta::new(top_miner_address, false),
285 AccountMeta::new(treasury_address, false),
286 AccountMeta::new(treasury_tokens_address, false),
287 AccountMeta::new_readonly(system_program::ID, false),
288 AccountMeta::new_readonly(spl_token::ID, false),
289 AccountMeta::new_readonly(crate::ID, false),
290 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
291 AccountMeta::new(entropy_var_address, false),
293 AccountMeta::new_readonly(entropy_api::ID, false),
294 AccountMeta::new(mint_authority_address, false),
296 AccountMeta::new_readonly(ore_mint_api::ID, false),
297 ],
298 data: Reset {}.to_bytes(),
299 }
300}
301
302pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
305 let board_address = board_pda().0;
306 let treasury_address = TREASURY_ADDRESS;
307 let round_address = round_pda(round_id).0;
308 Instruction {
309 program_id: crate::ID,
310 accounts: vec![
311 AccountMeta::new(signer, true),
312 AccountMeta::new(board_address, false),
313 AccountMeta::new(rent_payer, false),
314 AccountMeta::new(round_address, false),
315 AccountMeta::new(treasury_address, false),
316 AccountMeta::new_readonly(system_program::ID, false),
317 ],
318 data: Close {}.to_bytes(),
319 }
320}
321
322pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
325 let miner_address = miner_pda(authority).0;
326 let board_address = board_pda().0;
327 let round_address = round_pda(round_id).0;
328 let treasury_address = TREASURY_ADDRESS;
329 Instruction {
330 program_id: crate::ID,
331 accounts: vec![
332 AccountMeta::new(signer, true),
333 AccountMeta::new(board_address, false),
334 AccountMeta::new(miner_address, false),
335 AccountMeta::new(round_address, false),
336 AccountMeta::new(treasury_address, false),
337 AccountMeta::new_readonly(system_program::ID, false),
338 ],
339 data: Checkpoint {}.to_bytes(),
340 }
341}
342
343pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
344 let config_address = config_pda().0;
345 Instruction {
346 program_id: crate::ID,
347 accounts: vec![
348 AccountMeta::new(signer, true),
349 AccountMeta::new(config_address, false),
350 AccountMeta::new_readonly(system_program::ID, false),
351 ],
352 data: SetAdmin {
353 admin: admin.to_bytes(),
354 }
355 .to_bytes(),
356 }
357}
358
359pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
360 let config_address = config_pda().0;
361 Instruction {
362 program_id: crate::ID,
363 accounts: vec![
364 AccountMeta::new(signer, true),
365 AccountMeta::new(config_address, false),
366 AccountMeta::new_readonly(system_program::ID, false),
367 ],
368 data: SetAdminFee {
369 admin_fee: admin_fee.to_le_bytes(),
370 }
371 .to_bytes(),
372 }
373}
374
375pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
376 let config_address = config_pda().0;
377 Instruction {
378 program_id: crate::ID,
379 accounts: vec![
380 AccountMeta::new(signer, true),
381 AccountMeta::new(config_address, false),
382 AccountMeta::new_readonly(system_program::ID, false),
383 ],
384 data: SetFeeCollector {
385 fee_collector: fee_collector.to_bytes(),
386 }
387 .to_bytes(),
388 }
389}
390
391pub fn deposit(signer: Pubkey, payer: Pubkey, amount: u64, compound_fee: u64) -> Instruction {
394 let mint_address = MINT_ADDRESS;
395 let stake_address = stake_pda(signer).0;
396 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
397 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
398 let treasury_address = TREASURY_ADDRESS;
399 Instruction {
400 program_id: crate::ID,
401 accounts: vec![
402 AccountMeta::new(signer, true),
403 AccountMeta::new(payer, true),
404 AccountMeta::new(mint_address, false),
405 AccountMeta::new(sender_address, false),
406 AccountMeta::new(stake_address, false),
407 AccountMeta::new(stake_tokens_address, false),
408 AccountMeta::new(treasury_address, false),
409 AccountMeta::new_readonly(system_program::ID, false),
410 AccountMeta::new_readonly(spl_token::ID, false),
411 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
412 ],
413 data: Deposit {
414 amount: amount.to_le_bytes(),
415 compound_fee: compound_fee.to_le_bytes(),
416 }
417 .to_bytes(),
418 }
419}
420
421pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
424 let stake_address = stake_pda(signer).0;
425 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
426 let mint_address = MINT_ADDRESS;
427 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
428 let treasury_address = TREASURY_ADDRESS;
429 Instruction {
430 program_id: crate::ID,
431 accounts: vec![
432 AccountMeta::new(signer, true),
433 AccountMeta::new(mint_address, false),
434 AccountMeta::new(recipient_address, false),
435 AccountMeta::new(stake_address, false),
436 AccountMeta::new(stake_tokens_address, false),
437 AccountMeta::new(treasury_address, false),
438 AccountMeta::new_readonly(system_program::ID, false),
439 AccountMeta::new_readonly(spl_token::ID, false),
440 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
441 ],
442 data: Withdraw {
443 amount: amount.to_le_bytes(),
444 }
445 .to_bytes(),
446 }
447}
448
449pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
452 let automation_address = automation_pda(authority).0;
453 let miner_address = miner_pda(authority).0;
454 Instruction {
455 program_id: crate::ID,
456 accounts: vec![
457 AccountMeta::new(signer, true),
458 AccountMeta::new(automation_address, false),
459 AccountMeta::new(miner_address, false),
460 AccountMeta::new_readonly(system_program::ID, false),
461 ],
462 data: ReloadSOL {}.to_bytes(),
463 }
464}
465
466pub fn claim_yield(signer: Pubkey, amount: u64) -> Instruction {
469 let stake_address = stake_pda(signer).0;
470 let mint_address = MINT_ADDRESS;
471 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
472 let treasury_address = TREASURY_ADDRESS;
473 let treasury_tokens_address = treasury_tokens_address();
474 Instruction {
475 program_id: crate::ID,
476 accounts: vec![
477 AccountMeta::new(signer, true),
478 AccountMeta::new(mint_address, false),
479 AccountMeta::new(recipient_address, false),
480 AccountMeta::new(stake_address, false),
481 AccountMeta::new(treasury_address, false),
482 AccountMeta::new(treasury_tokens_address, false),
483 AccountMeta::new_readonly(system_program::ID, false),
484 AccountMeta::new_readonly(spl_token::ID, false),
485 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
486 ],
487 data: ClaimYield {
488 amount: amount.to_le_bytes(),
489 }
490 .to_bytes(),
491 }
492}
493
494pub fn compound_yield(signer: Pubkey) -> Instruction {
495 let stake_address = stake_pda(signer).0;
496 let mint_address = MINT_ADDRESS;
497 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
498 let treasury_address = TREASURY_ADDRESS;
499 let treasury_tokens_address = treasury_tokens_address();
500 Instruction {
501 program_id: crate::ID,
502 accounts: vec![
503 AccountMeta::new(signer, true),
504 AccountMeta::new(mint_address, false),
505 AccountMeta::new(stake_address, false),
506 AccountMeta::new(stake_tokens_address, false),
507 AccountMeta::new(treasury_address, false),
508 AccountMeta::new(treasury_tokens_address, false),
509 AccountMeta::new_readonly(system_program::ID, false),
510 AccountMeta::new_readonly(spl_token::ID, false),
511 ],
512 data: CompoundYield {}.to_bytes(),
513 }
514}
515
516pub fn new_var(
517 signer: Pubkey,
518 provider: Pubkey,
519 id: u64,
520 commit: [u8; 32],
521 samples: u64,
522) -> Instruction {
523 let board_address = board_pda().0;
524 let config_address = config_pda().0;
525 let var_address = entropy_api::state::var_pda(board_address, id).0;
526 Instruction {
527 program_id: crate::ID,
528 accounts: vec![
529 AccountMeta::new(signer, true),
530 AccountMeta::new(board_address, false),
531 AccountMeta::new(config_address, false),
532 AccountMeta::new(provider, false),
533 AccountMeta::new(var_address, false),
534 AccountMeta::new_readonly(system_program::ID, false),
535 AccountMeta::new_readonly(entropy_api::ID, false),
536 ],
537 data: NewVar {
538 id: id.to_le_bytes(),
539 commit: commit,
540 samples: samples.to_le_bytes(),
541 }
542 .to_bytes(),
543 }
544}
545
546pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
547 let config_address = config_pda().0;
548 Instruction {
549 program_id: crate::ID,
550 accounts: vec![
551 AccountMeta::new(signer, true),
552 AccountMeta::new(config_address, false),
553 AccountMeta::new_readonly(new_program, false),
554 ],
555 data: SetSwapProgram {}.to_bytes(),
556 }
557}
558
559pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
560 let board_address = board_pda().0;
561 let config_address = config_pda().0;
562 Instruction {
563 program_id: crate::ID,
564 accounts: vec![
565 AccountMeta::new(signer, true),
566 AccountMeta::new(board_address, false),
567 AccountMeta::new(config_address, false),
568 AccountMeta::new(new_var_address, false),
569 ],
570 data: SetVarAddress {}.to_bytes(),
571 }
572}