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