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 treasury_address = treasury_pda().0;
123 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
124
125 let mut mask: u32 = 0;
128 for (i, &square) in squares.iter().enumerate() {
129 if square {
130 mask |= 1 << i;
131 }
132 }
133
134 Instruction {
135 program_id: crate::ID,
136 accounts: vec![
137 AccountMeta::new(signer, true),
138 AccountMeta::new(authority, false),
139 AccountMeta::new(automation_address, false),
140 AccountMeta::new(board_address, false),
141 AccountMeta::new(config_address, false),
142 AccountMeta::new(miner_address, false),
143 AccountMeta::new(round_address, false),
144 AccountMeta::new(treasury_address, false),
145 AccountMeta::new_readonly(system_program::ID, false),
146 AccountMeta::new_readonly(crate::ID, false),
147 AccountMeta::new(entropy_var_address, false),
149 AccountMeta::new_readonly(entropy_api::ID, false),
150 ],
151 data: Deploy {
152 amount: amount.to_le_bytes(),
153 squares: mask.to_le_bytes(),
154 }
155 .to_bytes(),
156 }
157}
158
159pub fn buyback(
162 signer: Pubkey,
163 manager: Pubkey,
164 swap_accounts: &[AccountMeta],
165 swap_data: &[u8],
166) -> Instruction {
167 let board_address = board_pda().0;
168 let config_address = config_pda().0;
169 let manager_sol_address = get_associated_token_address(&manager, &SOL_MINT);
170 let mint_address = MINT_ADDRESS;
171 let treasury_address = treasury_pda().0;
172 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
173 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
174 let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
175 let stake_treasury_ore_address =
176 get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
177 let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
178 let mut accounts = vec![
179 AccountMeta::new(signer, true),
180 AccountMeta::new(board_address, false),
181 AccountMeta::new_readonly(config_address, false),
182 AccountMeta::new(manager, false),
183 AccountMeta::new(manager_sol_address, false),
184 AccountMeta::new(mint_address, false),
185 AccountMeta::new(treasury_address, false),
186 AccountMeta::new(treasury_ore_address, false),
187 AccountMeta::new(treasury_sol_address, false),
188 AccountMeta::new(stake_treasury_address, false),
189 AccountMeta::new(stake_treasury_ore_address, false),
190 AccountMeta::new(stake_vesting_address, false),
191 AccountMeta::new_readonly(spl_token::ID, false),
192 AccountMeta::new_readonly(crate::ID, false),
193 AccountMeta::new_readonly(ore_stake_api::ID, false),
194 ];
195 for account in swap_accounts.iter() {
196 let mut acc_clone = account.clone();
197 acc_clone.is_signer = false;
198 accounts.push(acc_clone);
199 }
200 let mut data = Buyback {}.to_bytes();
201 data.extend_from_slice(swap_data);
202 Instruction {
203 program_id: crate::ID,
204 accounts,
205 data,
206 }
207}
208
209pub fn bury(signer: Pubkey, amount: u64) -> Instruction {
212 let board_address = board_pda().0;
213 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
214 let mint_address = MINT_ADDRESS;
215 let treasury_address = treasury_pda().0;
216 let treasury_ore_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
217 let stake_treasury_address = ore_stake_api::state::treasury_pda().0;
218 let stake_treasury_ore_address =
219 get_associated_token_address(&stake_treasury_address, &MINT_ADDRESS);
220 let stake_vesting_address = ore_stake_api::state::vesting_pda().0;
221 let token_program = spl_token::ID;
222 let ore_program = crate::ID;
223 Instruction {
224 program_id: crate::ID,
225 accounts: vec![
226 AccountMeta::new(signer, true),
227 AccountMeta::new(sender_address, false),
228 AccountMeta::new(board_address, false),
229 AccountMeta::new(mint_address, false),
230 AccountMeta::new(treasury_address, false),
231 AccountMeta::new(treasury_ore_address, false),
232 AccountMeta::new(stake_treasury_address, false),
233 AccountMeta::new(stake_treasury_ore_address, false),
234 AccountMeta::new(stake_vesting_address, false),
235 AccountMeta::new_readonly(token_program, false),
236 AccountMeta::new_readonly(ore_program, false),
237 AccountMeta::new_readonly(ore_stake_api::ID, false),
238 ],
239 data: Bury {
240 amount: amount.to_le_bytes(),
241 }
242 .to_bytes(),
243 }
244}
245
246pub fn wrap(signer: Pubkey, amount: u64) -> Instruction {
247 let config_address = config_pda().0;
248 let treasury_address = treasury_pda().0;
249 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
250 Instruction {
251 accounts: vec![
252 AccountMeta::new(signer, true),
253 AccountMeta::new_readonly(config_address, false),
254 AccountMeta::new(treasury_address, false),
255 AccountMeta::new(treasury_sol_address, false),
256 AccountMeta::new_readonly(system_program::ID, false),
257 ],
258 program_id: crate::ID,
259 data: Wrap {
260 amount: amount.to_le_bytes(),
261 }
262 .to_bytes(),
263 }
264}
265
266pub fn reset(
269 signer: Pubkey,
270 fee_collector: Pubkey,
271 round_id: u64,
272 top_miner: Pubkey,
273) -> Instruction {
274 let board_address = board_pda().0;
275 let config_address = config_pda().0;
276 let mint_address = MINT_ADDRESS;
277 let round_address = round_pda(round_id).0;
278 let round_next_address = round_pda(round_id + 1).0;
279 let top_miner_address = miner_pda(top_miner).0;
280 let treasury_address = treasury_pda().0;
281 let treasury_tokens_address = treasury_tokens_address();
282 let entropy_var_address = entropy_api::state::var_pda(board_address, 0).0;
283 let mint_authority_address = ore_mint_api::state::authority_pda().0;
284 Instruction {
285 program_id: crate::ID,
286 accounts: vec![
287 AccountMeta::new(signer, true),
288 AccountMeta::new(board_address, false),
289 AccountMeta::new(config_address, false),
290 AccountMeta::new(fee_collector, false),
291 AccountMeta::new(mint_address, false),
292 AccountMeta::new(round_address, false),
293 AccountMeta::new(round_next_address, false),
294 AccountMeta::new(top_miner_address, false),
295 AccountMeta::new(treasury_address, false),
296 AccountMeta::new(treasury_tokens_address, false),
297 AccountMeta::new_readonly(system_program::ID, false),
298 AccountMeta::new_readonly(spl_token::ID, false),
299 AccountMeta::new_readonly(crate::ID, false),
300 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
301 AccountMeta::new(entropy_var_address, false),
303 AccountMeta::new_readonly(entropy_api::ID, false),
304 AccountMeta::new(mint_authority_address, false),
306 AccountMeta::new_readonly(ore_mint_api::ID, false),
307 ],
308 data: Reset {}.to_bytes(),
309 }
310}
311
312pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
315 let board_address = board_pda().0;
316 let treasury_address = treasury_pda().0;
317 let round_address = round_pda(round_id).0;
318 Instruction {
319 program_id: crate::ID,
320 accounts: vec![
321 AccountMeta::new(signer, true),
322 AccountMeta::new(board_address, false),
323 AccountMeta::new(rent_payer, false),
324 AccountMeta::new(round_address, false),
325 AccountMeta::new(treasury_address, false),
326 AccountMeta::new_readonly(system_program::ID, false),
327 ],
328 data: Close {}.to_bytes(),
329 }
330}
331
332pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
335 let automation_address = automation_pda(authority).0;
336 let miner_address = miner_pda(authority).0;
337 let board_address = board_pda().0;
338 let round_address = round_pda(round_id).0;
339 let treasury_address = treasury_pda().0;
340 Instruction {
341 program_id: crate::ID,
342 accounts: vec![
343 AccountMeta::new(signer, true),
344 AccountMeta::new(authority, false),
345 AccountMeta::new(automation_address, false),
346 AccountMeta::new(board_address, false),
347 AccountMeta::new(miner_address, false),
348 AccountMeta::new(round_address, false),
349 AccountMeta::new(treasury_address, false),
350 AccountMeta::new_readonly(system_program::ID, false),
351 ],
352 data: Checkpoint {}.to_bytes(),
353 }
354}
355
356pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
357 let config_address = config_pda().0;
358 Instruction {
359 program_id: crate::ID,
360 accounts: vec![
361 AccountMeta::new(signer, true),
362 AccountMeta::new(config_address, false),
363 AccountMeta::new_readonly(system_program::ID, false),
364 ],
365 data: SetAdmin {
366 admin: admin.to_bytes(),
367 }
368 .to_bytes(),
369 }
370}
371
372pub fn new_var(
373 signer: Pubkey,
374 provider: Pubkey,
375 id: u64,
376 commit: [u8; 32],
377 samples: u64,
378) -> Instruction {
379 let board_address = board_pda().0;
380 let config_address = config_pda().0;
381 let var_address = entropy_api::state::var_pda(board_address, id).0;
382 Instruction {
383 program_id: crate::ID,
384 accounts: vec![
385 AccountMeta::new(signer, true),
386 AccountMeta::new(board_address, false),
387 AccountMeta::new(config_address, false),
388 AccountMeta::new(provider, false),
389 AccountMeta::new(var_address, false),
390 AccountMeta::new_readonly(system_program::ID, false),
391 AccountMeta::new_readonly(entropy_api::ID, false),
392 ],
393 data: NewVar {
394 id: id.to_le_bytes(),
395 commit: commit,
396 samples: samples.to_le_bytes(),
397 }
398 .to_bytes(),
399 }
400}