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