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    conditions: AutomationConditions,
37) -> Instruction {
38    let automation_address = automation_pda(signer).0;
39    let miner_address = miner_pda(signer).0;
40    Instruction {
41        program_id: crate::ID,
42        accounts: vec![
43            AccountMeta::new(signer, true),
44            AccountMeta::new(automation_address, false),
45            AccountMeta::new(executor, false),
46            AccountMeta::new(miner_address, false),
47            AccountMeta::new_readonly(system_program::ID, false),
48        ],
49        data: AutomateV2 {
50            amount: amount.to_le_bytes(),
51            deposit: deposit.to_le_bytes(),
52            fee: fee.to_le_bytes(),
53            mask: mask.to_le_bytes(),
54            strategy: strategy as u8,
55            reload: (reload as u64).to_le_bytes(),
56            conditions: conditions.to_bytes(),
57        }
58        .to_bytes(),
59    }
60}
61
62pub fn claim_sol(signer: Pubkey) -> Instruction {
63    let board_address = board_pda().0;
64    let miner_address = miner_pda(signer).0;
65    Instruction {
66        program_id: crate::ID,
67        accounts: vec![
68            AccountMeta::new(signer, true),
69            AccountMeta::new(board_address, false),
70            AccountMeta::new(miner_address, false),
71            AccountMeta::new_readonly(system_program::ID, false),
72            AccountMeta::new_readonly(crate::ID, false),
73        ],
74        data: ClaimSOL {}.to_bytes(),
75    }
76}
77
78// 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] =
79
80pub fn claim_ore(signer: Pubkey, bps: u64) -> Instruction {
81    let board_address = board_pda().0;
82    let miner_address = miner_pda(signer).0;
83    let treasury_address = treasury_pda().0;
84    let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
85    let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
86    Instruction {
87        program_id: crate::ID,
88        accounts: vec![
89            AccountMeta::new(signer, true),
90            AccountMeta::new(board_address, false),
91            AccountMeta::new(miner_address, false),
92            AccountMeta::new(MINT_ADDRESS, false),
93            AccountMeta::new(recipient_address, false),
94            AccountMeta::new(treasury_address, false),
95            AccountMeta::new(treasury_tokens_address, false),
96            AccountMeta::new_readonly(system_program::ID, false),
97            AccountMeta::new_readonly(spl_token::ID, false),
98            AccountMeta::new_readonly(spl_associated_token_account::ID, false),
99            AccountMeta::new_readonly(crate::ID, false),
100        ],
101        data: ClaimORE {
102            bps: bps.to_le_bytes(),
103        }
104        .to_bytes(),
105    }
106}
107
108// let [signer_info, authority_info, automation_info, board_info, miner_info, round_info, system_program] =
109
110pub fn deploy(
111    signer: Pubkey,
112    authority: Pubkey,
113    amount: u64,
114    round_id: u64,
115    squares: [bool; 25],
116) -> Instruction {
117    let automation_address = automation_pda(authority).0;
118    let board_address = board_pda().0;
119    let config_address = config_pda().0;
120    let miner_address = miner_pda(authority).0;
121    let round_address = round_pda(round_id).0;
122    let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
123
124    // Convert array of 25 booleans into a 32-bit mask where each bit represents whether
125    // that square index is selected (1) or not (0)
126    let mut mask: u32 = 0;
127    for (i, &square) in squares.iter().enumerate() {
128        if square {
129            mask |= 1 << i;
130        }
131    }
132
133    Instruction {
134        program_id: crate::ID,
135        accounts: vec![
136            AccountMeta::new(signer, true),
137            AccountMeta::new(authority, false),
138            AccountMeta::new(automation_address, false),
139            AccountMeta::new(board_address, false),
140            AccountMeta::new(config_address, false),
141            AccountMeta::new(miner_address, false),
142            AccountMeta::new(round_address, false),
143            AccountMeta::new_readonly(system_program::ID, false),
144            AccountMeta::new_readonly(crate::ID, false),
145            // Entropy accounts.
146            AccountMeta::new(entropy_var_address, false),
147            AccountMeta::new_readonly(entropy_api::ID, false),
148        ],
149        data: Deploy {
150            amount: amount.to_le_bytes(),
151            squares: mask.to_le_bytes(),
152        }
153        .to_bytes(),
154    }
155}
156
157// 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] =
158
159pub fn buyback(
160    signer: Pubkey,
161    manager: Pubkey,
162    swap_accounts: &[AccountMeta],
163    swap_data: &[u8],
164) -> Instruction {
165    let board_address = board_pda().0;
166    let config_address = config_pda().0;
167    let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
168    let mint_address = MINT_ADDRESS;
169    let treasury_address = treasury_pda().0;
170    let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
171    let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
172    let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
173    let stake_treasury_ore_address =
174        get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
175    let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
176    let mut accounts = vec![
177        AccountMeta::new(signer, true),
178        AccountMeta::new(board_address, false),
179        AccountMeta::new_readonly(config_address, false),
180        AccountMeta::new(manager, false),
181        AccountMeta::new(manager_sol_address, false),
182        AccountMeta::new(mint_address, false),
183        AccountMeta::new(treasury_address, false),
184        AccountMeta::new(treasury_ore_address, false),
185        AccountMeta::new(treasury_sol_address, false),
186        AccountMeta::new(stake_treasury_address, false),
187        AccountMeta::new(stake_treasury_ore_address, false),
188        AccountMeta::new(stake_vesting_address, false),
189        AccountMeta::new_readonly(spl_token::ID, false),
190        AccountMeta::new_readonly(crate::ID, false),
191        AccountMeta::new_readonly(ore_stake_api::ID, false),
192    ];
193    for account in swap_accounts.iter() {
194        let mut acc_clone = account.clone();
195        acc_clone.is_signer = false;
196        accounts.push(acc_clone);
197    }
198    let mut data = Buyback {}.to_bytes();
199    data.extend_from_slice(swap_data);
200    Instruction {
201        program_id: crate::ID,
202        accounts,
203        data,
204    }
205}
206
207// let [signer_info, sender_info, board_info, mint_info, treasury_info, treasury_ore_info, token_program, ore_program] =
208
209pub fn bury(signer: Pubkey, amount: u64) -> Instruction {
210    let board_address = board_pda().0;
211    let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
212    let mint_address = MINT_ADDRESS;
213    let treasury_address = treasury_pda().0;
214    let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
215    let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
216    let stake_treasury_ore_address =
217        get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
218    let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
219    let token_program = spl_token::ID;
220    let ore_program = crate::ID;
221    Instruction {
222        program_id: crate::ID,
223        accounts: vec![
224            AccountMeta::new(signer, true),
225            AccountMeta::new(sender_address, false),
226            AccountMeta::new(board_address, false),
227            AccountMeta::new(mint_address, false),
228            AccountMeta::new(treasury_address, false),
229            AccountMeta::new(treasury_ore_address, false),
230            AccountMeta::new(stake_treasury_address, false),
231            AccountMeta::new(stake_treasury_ore_address, false),
232            AccountMeta::new(stake_vesting_address, false),
233            AccountMeta::new_readonly(token_program, false),
234            AccountMeta::new_readonly(ore_program, false),
235            AccountMeta::new_readonly(ore_stake_api::ID, false),
236        ],
237        data: Bury {
238            amount: amount.to_le_bytes(),
239        }
240        .to_bytes(),
241    }
242}
243
244pub fn wrap(signer: Pubkey, amount: u64) -> Instruction {
245    let config_address = config_pda().0;
246    let treasury_address = treasury_pda().0;
247    let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
248    Instruction {
249        accounts: vec![
250            AccountMeta::new(signer, true),
251            AccountMeta::new_readonly(config_address, false),
252            AccountMeta::new(treasury_address, false),
253            AccountMeta::new(treasury_sol_address, false),
254            AccountMeta::new_readonly(system_program::ID, false),
255        ],
256        program_id: crate::ID,
257        data: Wrap {
258            amount: amount.to_le_bytes(),
259        }
260        .to_bytes(),
261    }
262}
263
264// 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] =
265
266pub fn reset(
267    signer: Pubkey,
268    fee_collector: Pubkey,
269    round_id: u64,
270    top_miner: Pubkey,
271) -> Instruction {
272    let board_address = board_pda().0;
273    let config_address = config_pda().0;
274    let mint_address = MINT_ADDRESS;
275    let round_address = round_pda(round_id).0;
276    let round_next_address = round_pda(round_id + 1).0;
277    let top_miner_address = miner_pda(top_miner).0;
278    let treasury_address = treasury_pda().0;
279    let treasury_tokens_address = treasury_tokens_address();
280    let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
281    let mint_authority_address = ore_mint_api::state::authority_pda().0;
282    Instruction {
283        program_id: crate::ID,
284        accounts: vec![
285            AccountMeta::new(signer, true),
286            AccountMeta::new(board_address, false),
287            AccountMeta::new(config_address, false),
288            AccountMeta::new(fee_collector, false),
289            AccountMeta::new(mint_address, false),
290            AccountMeta::new(round_address, false),
291            AccountMeta::new(round_next_address, false),
292            AccountMeta::new(top_miner_address, false),
293            AccountMeta::new(treasury_address, false),
294            AccountMeta::new(treasury_tokens_address, false),
295            AccountMeta::new_readonly(system_program::ID, false),
296            AccountMeta::new_readonly(spl_token::ID, false),
297            AccountMeta::new_readonly(crate::ID, false),
298            AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
299            // Entropy accounts.
300            AccountMeta::new(entropy_var_address, false),
301            AccountMeta::new_readonly(entropy_api::ID, false),
302            // Mint accounts.
303            AccountMeta::new(mint_authority_address, false),
304            AccountMeta::new_readonly(ore_mint_api::ID, false),
305        ],
306        data: Reset {}.to_bytes(),
307    }
308}
309
310// let [signer_info, board_info, rent_payer_info, round_info, treasury_info, system_program] =
311
312pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
313    let board_address = board_pda().0;
314    let treasury_address = treasury_pda().0;
315    let round_address = round_pda(round_id).0;
316    Instruction {
317        program_id: crate::ID,
318        accounts: vec![
319            AccountMeta::new(signer, true),
320            AccountMeta::new(board_address, false),
321            AccountMeta::new(rent_payer, false),
322            AccountMeta::new(round_address, false),
323            AccountMeta::new(treasury_address, false),
324            AccountMeta::new_readonly(system_program::ID, false),
325        ],
326        data: Close {}.to_bytes(),
327    }
328}
329
330// let [signer_info, automation_info, board_info, miner_info, round_info, treasury_info, system_program] =
331
332pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
333    let automation_address = automation_pda(authority).0;
334    let miner_address = miner_pda(authority).0;
335    let board_address = board_pda().0;
336    let round_address = round_pda(round_id).0;
337    let treasury_address = treasury_pda().0;
338    Instruction {
339        program_id: crate::ID,
340        accounts: vec![
341            AccountMeta::new(signer, true),
342            AccountMeta::new(authority, false),
343            AccountMeta::new(automation_address, false),
344            AccountMeta::new(board_address, false),
345            AccountMeta::new(miner_address, false),
346            AccountMeta::new(round_address, false),
347            AccountMeta::new(treasury_address, false),
348            AccountMeta::new_readonly(system_program::ID, false),
349        ],
350        data: Checkpoint {}.to_bytes(),
351    }
352}
353
354pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
355    let config_address = config_pda().0;
356    Instruction {
357        program_id: crate::ID,
358        accounts: vec![
359            AccountMeta::new(signer, true),
360            AccountMeta::new(config_address, false),
361            AccountMeta::new_readonly(system_program::ID, false),
362        ],
363        data: SetAdmin {
364            admin: admin.to_bytes(),
365        }
366        .to_bytes(),
367    }
368}
369
370// let [signer_info, automation_info, miner_info, system_program] = accounts else {
371
372pub fn reload_sol(signer: Pubkey, authority: Pubkey) -> Instruction {
373    let automation_address = automation_pda(authority).0;
374    let miner_address = miner_pda(authority).0;
375    Instruction {
376        program_id: crate::ID,
377        accounts: vec![
378            AccountMeta::new(signer, true),
379            AccountMeta::new(automation_address, false),
380            AccountMeta::new(miner_address, false),
381            AccountMeta::new_readonly(system_program::ID, false),
382        ],
383        data: ReloadSOL {}.to_bytes(),
384    }
385}
386
387pub fn new_var(
388    signer: Pubkey,
389    provider: Pubkey,
390    id: u64,
391    commit: [u8; 32],
392    samples: u64,
393) -> Instruction {
394    let board_address = board_pda().0;
395    let config_address = config_pda().0;
396    let var_address = entropy_api::state::var_pda(board_address, id).0;
397    Instruction {
398        program_id: crate::ID,
399        accounts: vec![
400            AccountMeta::new(signer, true),
401            AccountMeta::new(board_address, false),
402            AccountMeta::new(config_address, false),
403            AccountMeta::new(provider, false),
404            AccountMeta::new(var_address, false),
405            AccountMeta::new_readonly(system_program::ID, false),
406            AccountMeta::new_readonly(entropy_api::ID, false),
407        ],
408        data: NewVar {
409            id: id.to_le_bytes(),
410            commit: commit,
411            samples: samples.to_le_bytes(),
412        }
413        .to_bytes(),
414    }
415}