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},
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 board_address = board_pda().0;
62 let miner_address = miner_pda(signer).0;
63 Instruction {
64 program_id: crate::ID,
65 accounts: vec![
66 AccountMeta::new(signer, true),
67 AccountMeta::new(board_address, false),
68 AccountMeta::new(miner_address, false),
69 AccountMeta::new_readonly(system_program::ID, false),
70 AccountMeta::new_readonly(crate::ID, false),
71 ],
72 data: ClaimSOL {}.to_bytes(),
73 }
74}
75
76pub fn claim_ore(signer: Pubkey) -> Instruction {
79 let board_address = board_pda().0;
80 let miner_address = miner_pda(signer).0;
81 let treasury_address = treasury_pda().0;
82 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
83 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
84 Instruction {
85 program_id: crate::ID,
86 accounts: vec![
87 AccountMeta::new(signer, true),
88 AccountMeta::new(board_address, false),
89 AccountMeta::new(miner_address, false),
90 AccountMeta::new(MINT_ADDRESS, false),
91 AccountMeta::new(recipient_address, false),
92 AccountMeta::new(treasury_address, false),
93 AccountMeta::new(treasury_tokens_address, false),
94 AccountMeta::new_readonly(system_program::ID, false),
95 AccountMeta::new_readonly(spl_token::ID, false),
96 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
97 AccountMeta::new_readonly(crate::ID, false),
98 ],
99 data: ClaimORE {}.to_bytes(),
100 }
101}
102
103pub fn deploy(
106 signer: Pubkey,
107 authority: Pubkey,
108 amount: u64,
109 round_id: u64,
110 squares: [bool; 25],
111) -> Instruction {
112 let automation_address = automation_pda(authority).0;
113 let board_address = board_pda().0;
114 let config_address = config_pda().0;
115 let miner_address = miner_pda(authority).0;
116 let round_address = round_pda(round_id).0;
117 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
118
119 let mut mask: u32 = 0;
122 for (i, &square) in squares.iter().enumerate() {
123 if square {
124 mask |= 1 << i;
125 }
126 }
127
128 Instruction {
129 program_id: crate::ID,
130 accounts: vec![
131 AccountMeta::new(signer, true),
132 AccountMeta::new(authority, false),
133 AccountMeta::new(automation_address, false),
134 AccountMeta::new(board_address, false),
135 AccountMeta::new(config_address, false),
136 AccountMeta::new(miner_address, false),
137 AccountMeta::new(round_address, false),
138 AccountMeta::new_readonly(system_program::ID, false),
139 AccountMeta::new_readonly(crate::ID, false),
140 AccountMeta::new(entropy_var_address, false),
142 AccountMeta::new_readonly(entropy_api::ID, false),
143 ],
144 data: Deploy {
145 amount: amount.to_le_bytes(),
146 squares: mask.to_le_bytes(),
147 }
148 .to_bytes(),
149 }
150}
151
152pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
155 let board_address = board_pda().0;
156 let config_address = config_pda().0;
157 let mint_address = MINT_ADDRESS;
158 let treasury_address = treasury_pda().0;
159 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
160 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
161 let mut accounts = vec![
162 AccountMeta::new(signer, true),
163 AccountMeta::new(board_address, false),
164 AccountMeta::new_readonly(config_address, false),
165 AccountMeta::new(mint_address, false),
166 AccountMeta::new(treasury_address, false),
167 AccountMeta::new(treasury_ore_address, false),
168 AccountMeta::new(treasury_sol_address, false),
169 AccountMeta::new_readonly(spl_token::ID, false),
170 AccountMeta::new_readonly(crate::ID, false),
171 ];
172 for account in swap_accounts.iter() {
173 let mut acc_clone = account.clone();
174 acc_clone.is_signer = false;
175 accounts.push(acc_clone);
176 }
177 let mut data = Buyback {}.to_bytes();
178 data.extend_from_slice(swap_data);
179 Instruction {
180 program_id: crate::ID,
181 accounts,
182 data,
183 }
184}
185
186pub fn bury(signer: Pubkey, amount: u64) -> Instruction {
189 let board_address = board_pda().0;
190 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
191 let mint_address = MINT_ADDRESS;
192 let treasury_address = treasury_pda().0;
193 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
194 let token_program = spl_token::ID;
195 let ore_program = crate::ID;
196 Instruction {
197 program_id: crate::ID,
198 accounts: vec![
199 AccountMeta::new(signer, true),
200 AccountMeta::new(sender_address, false),
201 AccountMeta::new(board_address, false),
202 AccountMeta::new(mint_address, false),
203 AccountMeta::new(treasury_address, false),
204 AccountMeta::new(treasury_ore_address, false),
205 AccountMeta::new_readonly(token_program, false),
206 AccountMeta::new_readonly(ore_program, false),
207 ],
208 data: Bury {
209 amount: amount.to_le_bytes(),
210 }
211 .to_bytes(),
212 }
213}
214
215pub fn liq(signer: Pubkey, manager: Pubkey) -> Instruction {
218 let board_address = board_pda().0;
219 let config_address = config_pda().0;
220 let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
221 let treasury_address = treasury_pda().0;
222 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
223 let token_program = spl_token::ID;
224 let ore_program = crate::ID;
225 Instruction {
226 program_id: crate::ID,
227 accounts: vec![
228 AccountMeta::new(signer, true),
229 AccountMeta::new(board_address, false),
230 AccountMeta::new(config_address, false),
231 AccountMeta::new(manager, false),
232 AccountMeta::new(manager_sol_address, false),
233 AccountMeta::new(treasury_address, false),
234 AccountMeta::new(treasury_sol_address, false),
235 AccountMeta::new_readonly(token_program, false),
236 AccountMeta::new_readonly(ore_program, false),
237 ],
238 data: Liq {}.to_bytes(),
239 }
240}
241
242pub fn wrap(signer: Pubkey, amount: u64) -> Instruction {
243 let config_address = config_pda().0;
244 let treasury_address = treasury_pda().0;
245 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
246 Instruction {
247 accounts: vec![
248 AccountMeta::new(signer, true),
249 AccountMeta::new_readonly(config_address, false),
250 AccountMeta::new(treasury_address, false),
251 AccountMeta::new(treasury_sol_address, false),
252 AccountMeta::new_readonly(system_program::ID, false),
253 ],
254 program_id: crate::ID,
255 data: Wrap {
256 amount: amount.to_le_bytes(),
257 }
258 .to_bytes(),
259 }
260}
261
262pub fn reset(
265 signer: Pubkey,
266 fee_collector: Pubkey,
267 round_id: u64,
268 top_miner: Pubkey,
269) -> Instruction {
270 let board_address = board_pda().0;
271 let config_address = config_pda().0;
272 let mint_address = MINT_ADDRESS;
273 let round_address = round_pda(round_id).0;
274 let round_next_address = round_pda(round_id + 1).0;
275 let top_miner_address = miner_pda(top_miner).0;
276 let treasury_address = treasury_pda().0;
277 let treasury_tokens_address = treasury_tokens_address();
278 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
279 let mint_authority_address = ore_mint_api::state::authority_pda().0;
280 Instruction {
281 program_id: crate::ID,
282 accounts: vec![
283 AccountMeta::new(signer, true),
284 AccountMeta::new(board_address, false),
285 AccountMeta::new(config_address, false),
286 AccountMeta::new(fee_collector, false),
287 AccountMeta::new(mint_address, false),
288 AccountMeta::new(round_address, false),
289 AccountMeta::new(round_next_address, false),
290 AccountMeta::new(top_miner_address, false),
291 AccountMeta::new(treasury_address, false),
292 AccountMeta::new(treasury_tokens_address, false),
293 AccountMeta::new_readonly(system_program::ID, false),
294 AccountMeta::new_readonly(spl_token::ID, false),
295 AccountMeta::new_readonly(crate::ID, false),
296 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
297 AccountMeta::new(entropy_var_address, false),
299 AccountMeta::new_readonly(entropy_api::ID, false),
300 AccountMeta::new(mint_authority_address, false),
302 AccountMeta::new_readonly(ore_mint_api::ID, false),
303 ],
304 data: Reset {}.to_bytes(),
305 }
306}
307
308pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
311 let board_address = board_pda().0;
312 let treasury_address = treasury_pda().0;
313 let round_address = round_pda(round_id).0;
314 Instruction {
315 program_id: crate::ID,
316 accounts: vec![
317 AccountMeta::new(signer, true),
318 AccountMeta::new(board_address, false),
319 AccountMeta::new(rent_payer, false),
320 AccountMeta::new(round_address, false),
321 AccountMeta::new(treasury_address, false),
322 AccountMeta::new_readonly(system_program::ID, false),
323 ],
324 data: Close {}.to_bytes(),
325 }
326}
327
328pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
331 let miner_address = miner_pda(authority).0;
332 let board_address = board_pda().0;
333 let round_address = round_pda(round_id).0;
334 let treasury_address = treasury_pda().0;
335 Instruction {
336 program_id: crate::ID,
337 accounts: vec![
338 AccountMeta::new(signer, true),
339 AccountMeta::new(board_address, false),
340 AccountMeta::new(miner_address, false),
341 AccountMeta::new(round_address, false),
342 AccountMeta::new(treasury_address, false),
343 AccountMeta::new_readonly(system_program::ID, false),
344 ],
345 data: Checkpoint {}.to_bytes(),
346 }
347}
348
349pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
350 let config_address = config_pda().0;
351 Instruction {
352 program_id: crate::ID,
353 accounts: vec![
354 AccountMeta::new(signer, true),
355 AccountMeta::new(config_address, false),
356 AccountMeta::new_readonly(system_program::ID, false),
357 ],
358 data: SetAdmin {
359 admin: admin.to_bytes(),
360 }
361 .to_bytes(),
362 }
363}
364
365pub fn deposit(signer: Pubkey, payer: Pubkey, amount: u64, compound_fee: u64) -> Instruction {
368 let mint_address = MINT_ADDRESS;
369 let stake_address = stake_pda(signer).0;
370 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
371 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
372 let treasury_address = treasury_pda().0;
373 Instruction {
374 program_id: crate::ID,
375 accounts: vec![
376 AccountMeta::new(signer, true),
377 AccountMeta::new(payer, true),
378 AccountMeta::new(mint_address, false),
379 AccountMeta::new(sender_address, false),
380 AccountMeta::new(stake_address, false),
381 AccountMeta::new(stake_tokens_address, false),
382 AccountMeta::new(treasury_address, false),
383 AccountMeta::new_readonly(system_program::ID, false),
384 AccountMeta::new_readonly(spl_token::ID, false),
385 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
386 ],
387 data: Deposit {
388 amount: amount.to_le_bytes(),
389 compound_fee: compound_fee.to_le_bytes(),
390 }
391 .to_bytes(),
392 }
393}
394
395pub fn withdraw(signer: Pubkey, amount: u64) -> Instruction {
398 let stake_address = stake_pda(signer).0;
399 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
400 let mint_address = MINT_ADDRESS;
401 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
402 let treasury_address = treasury_pda().0;
403 Instruction {
404 program_id: crate::ID,
405 accounts: vec![
406 AccountMeta::new(signer, true),
407 AccountMeta::new(mint_address, false),
408 AccountMeta::new(recipient_address, false),
409 AccountMeta::new(stake_address, false),
410 AccountMeta::new(stake_tokens_address, false),
411 AccountMeta::new(treasury_address, false),
412 AccountMeta::new_readonly(system_program::ID, false),
413 AccountMeta::new_readonly(spl_token::ID, false),
414 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
415 ],
416 data: Withdraw {
417 amount: amount.to_le_bytes(),
418 }
419 .to_bytes(),
420 }
421}
422
423pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
426 let automation_address = automation_pda(authority).0;
427 let miner_address = miner_pda(authority).0;
428 Instruction {
429 program_id: crate::ID,
430 accounts: vec![
431 AccountMeta::new(signer, true),
432 AccountMeta::new(automation_address, false),
433 AccountMeta::new(miner_address, false),
434 AccountMeta::new_readonly(system_program::ID, false),
435 ],
436 data: ReloadSOL {}.to_bytes(),
437 }
438}
439
440pub fn claim_yield(signer: Pubkey, amount: u64) -> Instruction {
443 let stake_address = stake_pda(signer).0;
444 let mint_address = MINT_ADDRESS;
445 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
446 let treasury_address = treasury_pda().0;
447 let treasury_tokens_address = treasury_tokens_address();
448 Instruction {
449 program_id: crate::ID,
450 accounts: vec![
451 AccountMeta::new(signer, true),
452 AccountMeta::new(mint_address, false),
453 AccountMeta::new(recipient_address, false),
454 AccountMeta::new(stake_address, false),
455 AccountMeta::new(treasury_address, false),
456 AccountMeta::new(treasury_tokens_address, false),
457 AccountMeta::new_readonly(system_program::ID, false),
458 AccountMeta::new_readonly(spl_token::ID, false),
459 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
460 ],
461 data: ClaimYield {
462 amount: amount.to_le_bytes(),
463 }
464 .to_bytes(),
465 }
466}
467
468pub fn compound_yield(signer: Pubkey) -> Instruction {
469 let stake_address = stake_pda(signer).0;
470 let mint_address = MINT_ADDRESS;
471 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
472 let treasury_address = treasury_pda().0;
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(stake_address, false),
480 AccountMeta::new(stake_tokens_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 ],
486 data: CompoundYield {}.to_bytes(),
487 }
488}
489
490pub fn new_var(
491 signer: Pubkey,
492 provider: Pubkey,
493 id: u64,
494 commit: [u8; 32],
495 samples: u64,
496) -> Instruction {
497 let board_address = board_pda().0;
498 let config_address = config_pda().0;
499 let var_address = entropy_api::state::var_pda(board_address, id).0;
500 Instruction {
501 program_id: crate::ID,
502 accounts: vec![
503 AccountMeta::new(signer, true),
504 AccountMeta::new(board_address, false),
505 AccountMeta::new(config_address, false),
506 AccountMeta::new(provider, false),
507 AccountMeta::new(var_address, false),
508 AccountMeta::new_readonly(system_program::ID, false),
509 AccountMeta::new_readonly(entropy_api::ID, false),
510 ],
511 data: NewVar {
512 id: id.to_le_bytes(),
513 commit: commit,
514 samples: samples.to_le_bytes(),
515 }
516 .to_bytes(),
517 }
518}