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 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
78pub 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
108pub 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 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 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
157pub 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
207pub 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
264pub 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 AccountMeta::new(entropy_var_address, false),
301 AccountMeta::new_readonly(entropy_api::ID, false),
302 AccountMeta::new(mint_authority_address, false),
304 AccountMeta::new_readonly(ore_mint_api::ID, false),
305 ],
306 data: Reset {}.to_bytes(),
307 }
308}
309
310pub 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
330pub 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
370pub 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}