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
25pub 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
76pub 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
103pub 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 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 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
152pub 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
194pub 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
231pub 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
278pub 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 AccountMeta::new(entropy_var_address, false),
315 AccountMeta::new_readonly(entropy_api::ID, false),
316 AccountMeta::new(mint_authority_address, false),
318 AccountMeta::new_readonly(ore_mint_api::ID, false),
319 ],
320 data: Reset {}.to_bytes(),
321 }
322}
323
324pub 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
344pub 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
381pub 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}