ore_api/
sdk.rs

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
25// let [signer_info, automation_info, executor_info, miner_info, system_program] = accounts else {
26
27pub 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
73// let [signer_info, miner_info, mint_info, recipient_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program] =
74
75pub 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
97// let [signer_info, authority_info, automation_info, board_info, miner_info, round_info, system_program] =
98
99pub 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    // Convert array of 25 booleans into a 32-bit mask where each bit represents whether
114    // that square index is selected (1) or not (0)
115    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            // Entropy accounts.
135            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
146// let [pool, user_source_token, user_destination_token, a_vault, b_vault, a_token_vault, b_token_vault, a_vault_lp_mint, b_vault_lp_mint, a_vault_lp, b_vault_lp, protocol_token_fee, user_key, vault_program, token_program] =
147
148pub 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
180// let [signer_info, sender_info, board_info, mint_info, treasury_info, treasury_ore_info, token_program, ore_program] =
181
182pub 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
209// let [signer_info, board_info, config_info, manager_info, manager_sol_info, treasury_info, treasury_sol_info, token_program, ore_program] =
210
211pub 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
256// let [signer_info, board_info, config_info, fee_collector_info, mint_info, round_info, round_next_info, top_miner_info, treasury_info, treasury_tokens_info, system_program, token_program, ore_program, slot_hashes_sysvar] =
257
258pub 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            // Entropy accounts.
292            AccountMeta::new(entropy_var_address, false),
293            AccountMeta::new_readonly(entropy_api::ID, false),
294            // Mint accounts.
295            AccountMeta::new(mint_authority_address, false),
296            AccountMeta::new_readonly(ore_mint_api::ID, false),
297        ],
298        data: Reset {}.to_bytes(),
299    }
300}
301
302// let [signer_info, board_info, rent_payer_info, round_info, treasury_info, system_program] =
303
304pub 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
322// let [signer_info, automation_info, board_info, miner_info, round_info, treasury_info, system_program] =
323
324pub 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
391// let [signer_info, mint_info, sender_info, stake_info, stake_tokens_info, treasury_info, system_program, token_program, associated_token_program] =
392
393pub 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
421// let [signer_info, mint_info, recipient_info, stake_info, stake_tokens_info, treasury_info, system_program, token_program, associated_token_program] =
422
423pub 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
449// let [signer_info, automation_info, miner_info, system_program] = accounts else {
450
451pub 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
466// let [signer_info, mint_info, recipient_info, stake_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program] =
467
468pub 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}