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 buyback(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 = Buyback {}.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 bury(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: Bury {
200 amount: amount.to_le_bytes(),
201 }
202 .to_bytes(),
203 }
204}
205
206pub fn liq(signer: Pubkey, manager: Pubkey) -> Instruction {
209 let board_address = board_pda().0;
210 let config_address = config_pda().0;
211 let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
212 let treasury_address = TREASURY_ADDRESS;
213 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
214 let token_program = spl_token::ID;
215 let ore_program = crate::ID;
216 Instruction {
217 program_id: crate::ID,
218 accounts: vec![
219 AccountMeta::new(signer, true),
220 AccountMeta::new(board_address, false),
221 AccountMeta::new(config_address, false),
222 AccountMeta::new(manager, false),
223 AccountMeta::new(manager_sol_address, false),
224 AccountMeta::new(treasury_address, false),
225 AccountMeta::new(treasury_sol_address, false),
226 AccountMeta::new_readonly(token_program, false),
227 AccountMeta::new_readonly(ore_program, false),
228 ],
229 data: Liq {}.to_bytes(),
230 }
231}
232
233pub fn wrap(signer: Pubkey) -> Instruction {
234 let config_address = config_pda().0;
235 let treasury_address = TREASURY_ADDRESS;
236 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
237 Instruction {
238 accounts: vec![
239 AccountMeta::new(signer, true),
240 AccountMeta::new_readonly(config_address, false),
241 AccountMeta::new(treasury_address, false),
242 AccountMeta::new(treasury_sol_address, false),
243 AccountMeta::new_readonly(system_program::ID, false),
244 ],
245 program_id: crate::ID,
246 data: Wrap {}.to_bytes(),
247 }
248}
249
250pub fn reset(
253 signer: Pubkey,
254 fee_collector: Pubkey,
255 round_id: u64,
256 top_miner: Pubkey,
257) -> Instruction {
258 let board_address = board_pda().0;
259 let config_address = config_pda().0;
260 let mint_address = MINT_ADDRESS;
261 let round_address = round_pda(round_id).0;
262 let round_next_address = round_pda(round_id + 1).0;
263 let top_miner_address = miner_pda(top_miner).0;
264 let treasury_address = TREASURY_ADDRESS;
265 let treasury_tokens_address = treasury_tokens_address();
266 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
267 let mint_authority_address = ore_mint_api::state::authority_pda().0;
268 Instruction {
269 program_id: crate::ID,
270 accounts: vec![
271 AccountMeta::new(signer, true),
272 AccountMeta::new(board_address, false),
273 AccountMeta::new(config_address, false),
274 AccountMeta::new(fee_collector, false),
275 AccountMeta::new(mint_address, false),
276 AccountMeta::new(round_address, false),
277 AccountMeta::new(round_next_address, false),
278 AccountMeta::new(top_miner_address, false),
279 AccountMeta::new(treasury_address, false),
280 AccountMeta::new(treasury_tokens_address, false),
281 AccountMeta::new_readonly(system_program::ID, false),
282 AccountMeta::new_readonly(spl_token::ID, false),
283 AccountMeta::new_readonly(crate::ID, false),
284 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
285 AccountMeta::new(entropy_var_address, false),
287 AccountMeta::new_readonly(entropy_api::ID, false),
288 AccountMeta::new(mint_authority_address, false),
290 AccountMeta::new_readonly(ore_mint_api::ID, false),
291 ],
292 data: Reset {}.to_bytes(),
293 }
294}
295
296pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
299 let board_address = board_pda().0;
300 let treasury_address = TREASURY_ADDRESS;
301 let round_address = round_pda(round_id).0;
302 Instruction {
303 program_id: crate::ID,
304 accounts: vec![
305 AccountMeta::new(signer, true),
306 AccountMeta::new(board_address, false),
307 AccountMeta::new(rent_payer, false),
308 AccountMeta::new(round_address, false),
309 AccountMeta::new(treasury_address, false),
310 AccountMeta::new_readonly(system_program::ID, false),
311 ],
312 data: Close {}.to_bytes(),
313 }
314}
315
316pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
319 let miner_address = miner_pda(authority).0;
320 let board_address = board_pda().0;
321 let round_address = round_pda(round_id).0;
322 let treasury_address = TREASURY_ADDRESS;
323 Instruction {
324 program_id: crate::ID,
325 accounts: vec![
326 AccountMeta::new(signer, true),
327 AccountMeta::new(board_address, false),
328 AccountMeta::new(miner_address, false),
329 AccountMeta::new(round_address, false),
330 AccountMeta::new(treasury_address, false),
331 AccountMeta::new_readonly(system_program::ID, false),
332 ],
333 data: Checkpoint {}.to_bytes(),
334 }
335}
336
337pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
338 let config_address = config_pda().0;
339 Instruction {
340 program_id: crate::ID,
341 accounts: vec![
342 AccountMeta::new(signer, true),
343 AccountMeta::new(config_address, false),
344 AccountMeta::new_readonly(system_program::ID, false),
345 ],
346 data: SetAdmin {
347 admin: admin.to_bytes(),
348 }
349 .to_bytes(),
350 }
351}
352
353pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
354 let config_address = config_pda().0;
355 Instruction {
356 program_id: crate::ID,
357 accounts: vec![
358 AccountMeta::new(signer, true),
359 AccountMeta::new(config_address, false),
360 AccountMeta::new_readonly(system_program::ID, false),
361 ],
362 data: SetAdminFee {
363 admin_fee: admin_fee.to_le_bytes(),
364 }
365 .to_bytes(),
366 }
367}
368
369pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
370 let config_address = config_pda().0;
371 Instruction {
372 program_id: crate::ID,
373 accounts: vec![
374 AccountMeta::new(signer, true),
375 AccountMeta::new(config_address, false),
376 AccountMeta::new_readonly(system_program::ID, false),
377 ],
378 data: SetFeeCollector {
379 fee_collector: fee_collector.to_bytes(),
380 }
381 .to_bytes(),
382 }
383}
384
385pub fn deposit(signer: Pubkey, payer: Pubkey, amount: u64) -> Instruction {
388 let mint_address = MINT_ADDRESS;
389 let stake_address = stake_pda(signer).0;
390 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
391 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
392 let treasury_address = TREASURY_ADDRESS;
393 Instruction {
394 program_id: crate::ID,
395 accounts: vec![
396 AccountMeta::new(signer, true),
397 AccountMeta::new(payer, true),
398 AccountMeta::new(mint_address, false),
399 AccountMeta::new(sender_address, false),
400 AccountMeta::new(stake_address, false),
401 AccountMeta::new(stake_tokens_address, false),
402 AccountMeta::new(treasury_address, false),
403 AccountMeta::new_readonly(system_program::ID, false),
404 AccountMeta::new_readonly(spl_token::ID, false),
405 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
406 ],
407 data: Deposit {
408 amount: amount.to_le_bytes(),
409 }
410 .to_bytes(),
411 }
412}
413
414pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
417 let stake_address = stake_pda(signer).0;
418 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
419 let mint_address = MINT_ADDRESS;
420 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
421 let treasury_address = TREASURY_ADDRESS;
422 Instruction {
423 program_id: crate::ID,
424 accounts: vec![
425 AccountMeta::new(signer, true),
426 AccountMeta::new(mint_address, false),
427 AccountMeta::new(recipient_address, false),
428 AccountMeta::new(stake_address, false),
429 AccountMeta::new(stake_tokens_address, false),
430 AccountMeta::new(treasury_address, false),
431 AccountMeta::new_readonly(system_program::ID, false),
432 AccountMeta::new_readonly(spl_token::ID, false),
433 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
434 ],
435 data: Withdraw {
436 amount: amount.to_le_bytes(),
437 }
438 .to_bytes(),
439 }
440}
441
442pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
445 let automation_address = automation_pda(authority).0;
446 let miner_address = miner_pda(authority).0;
447 Instruction {
448 program_id: crate::ID,
449 accounts: vec![
450 AccountMeta::new(signer, true),
451 AccountMeta::new(automation_address, false),
452 AccountMeta::new(miner_address, false),
453 AccountMeta::new_readonly(system_program::ID, false),
454 ],
455 data: ReloadSOL {}.to_bytes(),
456 }
457}
458
459pub fn claim_yield(signer: Pubkey, amount: u64) -> Instruction {
462 let stake_address = stake_pda(signer).0;
463 let mint_address = MINT_ADDRESS;
464 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
465 let treasury_address = TREASURY_ADDRESS;
466 let treasury_tokens_address = treasury_tokens_address();
467 Instruction {
468 program_id: crate::ID,
469 accounts: vec![
470 AccountMeta::new(signer, true),
471 AccountMeta::new(mint_address, false),
472 AccountMeta::new(recipient_address, false),
473 AccountMeta::new(stake_address, false),
474 AccountMeta::new(treasury_address, false),
475 AccountMeta::new(treasury_tokens_address, false),
476 AccountMeta::new_readonly(system_program::ID, false),
477 AccountMeta::new_readonly(spl_token::ID, false),
478 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
479 ],
480 data: ClaimYield {
481 amount: amount.to_le_bytes(),
482 }
483 .to_bytes(),
484 }
485}
486
487pub fn new_var(
488 signer: Pubkey,
489 provider: Pubkey,
490 id: u64,
491 commit: [u8; 32],
492 samples: u64,
493) -> Instruction {
494 let board_address = board_pda().0;
495 let config_address = config_pda().0;
496 let var_address = entropy_api::state::var_pda(board_address, id).0;
497 Instruction {
498 program_id: crate::ID,
499 accounts: vec![
500 AccountMeta::new(signer, true),
501 AccountMeta::new(board_address, false),
502 AccountMeta::new(config_address, false),
503 AccountMeta::new(provider, false),
504 AccountMeta::new(var_address, false),
505 AccountMeta::new_readonly(system_program::ID, false),
506 AccountMeta::new_readonly(entropy_api::ID, false),
507 ],
508 data: NewVar {
509 id: id.to_le_bytes(),
510 commit: commit,
511 samples: samples.to_le_bytes(),
512 }
513 .to_bytes(),
514 }
515}
516
517pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
518 let config_address = config_pda().0;
519 Instruction {
520 program_id: crate::ID,
521 accounts: vec![
522 AccountMeta::new(signer, true),
523 AccountMeta::new(config_address, false),
524 AccountMeta::new_readonly(new_program, false),
525 ],
526 data: SetSwapProgram {}.to_bytes(),
527 }
528}
529
530pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
531 let board_address = board_pda().0;
532 let config_address = config_pda().0;
533 Instruction {
534 program_id: crate::ID,
535 accounts: vec![
536 AccountMeta::new(signer, true),
537 AccountMeta::new(board_address, false),
538 AccountMeta::new(config_address, false),
539 AccountMeta::new(new_var_address, false),
540 ],
541 data: SetVarAddress {}.to_bytes(),
542 }
543}
544
545pub fn migrate_mint_authority(signer: Pubkey) -> Instruction {
546 let mint_address = MINT_ADDRESS;
547 let config_address = config_pda().0;
548 let mint_authority_address = ore_mint_api::state::authority_pda().0;
549 Instruction {
550 program_id: crate::ID,
551 accounts: vec![
552 AccountMeta::new(signer, true),
553 AccountMeta::new(config_address, false),
554 AccountMeta::new(mint_address, false),
555 AccountMeta::new(mint_authority_address, false),
556 AccountMeta::new_readonly(spl_token::ID, false),
557 ],
558 data: MigrateMintAuthority {}.to_bytes(),
559 }
560}