Skip to main content

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},
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 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
76// let [signer_info, board_info, miner_info, mint_info, recipient_info, treasury_info, treasury_tokens_info, system_program, token_program, associated_token_program, ore_program] =
77
78pub fn claim_ore(signer: Pubkey, bps: u64) -> 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 {
100            bps: bps.to_le_bytes(),
101        }
102        .to_bytes(),
103    }
104}
105
106// let [signer_info, authority_info, automation_info, board_info, miner_info, round_info, system_program] =
107
108pub fn deploy(
109    signer: Pubkey,
110    authority: Pubkey,
111    amount: u64,
112    round_id: u64,
113    squares: [bool; 25],
114) -> Instruction {
115    let automation_address = automation_pda(authority).0;
116    let board_address = board_pda().0;
117    let config_address = config_pda().0;
118    let miner_address = miner_pda(authority).0;
119    let round_address = round_pda(round_id).0;
120    let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
121
122    // Convert array of 25 booleans into a 32-bit mask where each bit represents whether
123    // that square index is selected (1) or not (0)
124    let mut mask: u32 = 0;
125    for (i, &square) in squares.iter().enumerate() {
126        if square {
127            mask |= 1 << i;
128        }
129    }
130
131    Instruction {
132        program_id: crate::ID,
133        accounts: vec![
134            AccountMeta::new(signer, true),
135            AccountMeta::new(authority, false),
136            AccountMeta::new(automation_address, false),
137            AccountMeta::new(board_address, false),
138            AccountMeta::new(config_address, false),
139            AccountMeta::new(miner_address, false),
140            AccountMeta::new(round_address, false),
141            AccountMeta::new_readonly(system_program::ID, false),
142            AccountMeta::new_readonly(crate::ID, false),
143            // Entropy accounts.
144            AccountMeta::new(entropy_var_address, false),
145            AccountMeta::new_readonly(entropy_api::ID, false),
146        ],
147        data: Deploy {
148            amount: amount.to_le_bytes(),
149            squares: mask.to_le_bytes(),
150        }
151        .to_bytes(),
152    }
153}
154
155// 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] =
156
157pub fn buyback(
158    signer: Pubkey,
159    manager: Pubkey,
160    swap_accounts: &[AccountMeta],
161    swap_data: &[u8],
162) -> Instruction {
163    let board_address = board_pda().0;
164    let config_address = config_pda().0;
165    let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
166    let mint_address = MINT_ADDRESS;
167    let treasury_address = treasury_pda().0;
168    let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
169    let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
170    let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
171    let stake_treasury_ore_address =
172        get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
173    let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
174    let mut accounts = vec![
175        AccountMeta::new(signer, true),
176        AccountMeta::new(board_address, false),
177        AccountMeta::new_readonly(config_address, false),
178        AccountMeta::new(manager, false),
179        AccountMeta::new(manager_sol_address, false),
180        AccountMeta::new(mint_address, false),
181        AccountMeta::new(treasury_address, false),
182        AccountMeta::new(treasury_ore_address, false),
183        AccountMeta::new(treasury_sol_address, false),
184        AccountMeta::new(stake_treasury_address, false),
185        AccountMeta::new(stake_treasury_ore_address, false),
186        AccountMeta::new(stake_vesting_address, false),
187        AccountMeta::new_readonly(spl_token::ID, false),
188        AccountMeta::new_readonly(crate::ID, false),
189        AccountMeta::new_readonly(ore_stake_api::ID, false),
190    ];
191    for account in swap_accounts.iter() {
192        let mut acc_clone = account.clone();
193        acc_clone.is_signer = false;
194        accounts.push(acc_clone);
195    }
196    let mut data = Buyback {}.to_bytes();
197    data.extend_from_slice(swap_data);
198    Instruction {
199        program_id: crate::ID,
200        accounts,
201        data,
202    }
203}
204
205// let [signer_info, sender_info, board_info, mint_info, treasury_info, treasury_ore_info, token_program, ore_program] =
206
207pub fn bury(signer: Pubkey, amount: u64) -> Instruction {
208    let board_address = board_pda().0;
209    let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
210    let mint_address = MINT_ADDRESS;
211    let treasury_address = treasury_pda().0;
212    let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
213    let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
214    let stake_treasury_ore_address =
215        get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
216    let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
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(sender_address, false),
224            AccountMeta::new(board_address, false),
225            AccountMeta::new(mint_address, false),
226            AccountMeta::new(treasury_address, false),
227            AccountMeta::new(treasury_ore_address, false),
228            AccountMeta::new(stake_treasury_address, false),
229            AccountMeta::new(stake_treasury_ore_address, false),
230            AccountMeta::new(stake_vesting_address, false),
231            AccountMeta::new_readonly(token_program, false),
232            AccountMeta::new_readonly(ore_program, false),
233            AccountMeta::new_readonly(ore_stake_api::ID, false),
234        ],
235        data: Bury {
236            amount: amount.to_le_bytes(),
237        }
238        .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
262// 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] =
263
264pub 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            // Entropy accounts.
298            AccountMeta::new(entropy_var_address, false),
299            AccountMeta::new_readonly(entropy_api::ID, false),
300            // Mint accounts.
301            AccountMeta::new(mint_authority_address, false),
302            AccountMeta::new_readonly(ore_mint_api::ID, false),
303        ],
304        data: Reset {}.to_bytes(),
305    }
306}
307
308// let [signer_info, board_info, rent_payer_info, round_info, treasury_info, system_program] =
309
310pub 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
328// let [signer_info, automation_info, board_info, miner_info, round_info, treasury_info, system_program] =
329
330pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
331    let automation_address = automation_pda(authority).0;
332    let miner_address = miner_pda(authority).0;
333    let board_address = board_pda().0;
334    let round_address = round_pda(round_id).0;
335    let treasury_address = treasury_pda().0;
336    Instruction {
337        program_id: crate::ID,
338        accounts: vec![
339            AccountMeta::new(signer, true),
340            AccountMeta::new(authority, false),
341            AccountMeta::new(automation_address, false),
342            AccountMeta::new(board_address, false),
343            AccountMeta::new(miner_address, false),
344            AccountMeta::new(round_address, false),
345            AccountMeta::new(treasury_address, false),
346            AccountMeta::new_readonly(system_program::ID, false),
347        ],
348        data: Checkpoint {}.to_bytes(),
349    }
350}
351
352pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
353    let config_address = config_pda().0;
354    Instruction {
355        program_id: crate::ID,
356        accounts: vec![
357            AccountMeta::new(signer, true),
358            AccountMeta::new(config_address, false),
359            AccountMeta::new_readonly(system_program::ID, false),
360        ],
361        data: SetAdmin {
362            admin: admin.to_bytes(),
363        }
364        .to_bytes(),
365    }
366}
367
368// let [signer_info, automation_info, miner_info, system_program] = accounts else {
369
370pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
371    let automation_address = automation_pda(authority).0;
372    let miner_address = miner_pda(authority).0;
373    Instruction {
374        program_id: crate::ID,
375        accounts: vec![
376            AccountMeta::new(signer, true),
377            AccountMeta::new(automation_address, false),
378            AccountMeta::new(miner_address, false),
379            AccountMeta::new_readonly(system_program::ID, false),
380        ],
381        data: ReloadSOL {}.to_bytes(),
382    }
383}
384
385pub fn new_var(
386    signer: Pubkey,
387    provider: Pubkey,
388    id: u64,
389    commit: [u8; 32],
390    samples: u64,
391) -> Instruction {
392    let board_address = board_pda().0;
393    let config_address = config_pda().0;
394    let var_address = entropy_api::state::var_pda(board_address, id).0;
395    Instruction {
396        program_id: crate::ID,
397        accounts: vec![
398            AccountMeta::new(signer, true),
399            AccountMeta::new(board_address, false),
400            AccountMeta::new(config_address, false),
401            AccountMeta::new(provider, false),
402            AccountMeta::new(var_address, false),
403            AccountMeta::new_readonly(system_program::ID, false),
404            AccountMeta::new_readonly(entropy_api::ID, false),
405        ],
406        data: NewVar {
407            id: id.to_le_bytes(),
408            commit: commit,
409            samples: samples.to_le_bytes(),
410        }
411        .to_bytes(),
412    }
413}