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 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    // Convert array of 25 booleans into a 32-bit mask where each bit represents whether
113    // that square index is selected (1) or not (0)
114    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            // Entropy accounts.
132            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
143// 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] =
144
145pub 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
177// let [signer_info, sender_info, board_info, mint_info, treasury_info, treasury_ore_info, token_program, ore_program] =
178
179pub 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
206// let [signer_info, board_info, config_info, manager_info, manager_sol_info, treasury_info, treasury_sol_info, token_program, ore_program] =
207
208pub 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
250// 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] =
251
252pub 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            // Entropy accounts.
286            AccountMeta::new(entropy_var_address, false),
287            AccountMeta::new_readonly(entropy_api::ID, false),
288            // Mint accounts.
289            AccountMeta::new(mint_authority_address, false),
290            AccountMeta::new_readonly(ore_mint_api::ID, false),
291        ],
292        data: Reset {}.to_bytes(),
293    }
294}
295
296// let [signer_info, board_info, rent_payer_info, round_info, treasury_info, system_program] =
297
298pub 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
316// let [signer_info, automation_info, board_info, miner_info, round_info, treasury_info, system_program] =
317
318pub 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
385// let [signer_info, mint_info, sender_info, stake_info, stake_tokens_info, treasury_info, system_program, token_program, associated_token_program] =
386
387pub 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
414// let [signer_info, mint_info, recipient_info, stake_info, stake_tokens_info, treasury_info, system_program, token_program, associated_token_program] =
415
416pub 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
442// let [signer_info, automation_info, miner_info, system_program] = accounts else {
443
444pub 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
459// let [signer_info, mint_info, recipient_info, stake_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program] =
460
461pub 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}