1use solana_program::pubkey::Pubkey;
2use spl_associated_token_account::get_associated_token_address;
3use steel::*;
4
5use crate::{
6 consts::{AUCTION, BOARD, MINT_ADDRESS, SOL_MINT, TREASURY_ADDRESS},
7 instruction::{self, *},
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 let (board_address, _) = board_pda();
24 invoke_signed(&log(board_address, msg), accounts, &crate::ID, &[BOARD])
25}
26
27pub fn auction_program_log(accounts: &[AccountInfo], msg: &[u8]) -> Result<(), ProgramError> {
29 let (auction_address, _) = auction_pda();
31 invoke_signed(&log(auction_address, msg), accounts, &crate::ID, &[AUCTION])
32}
33
34pub fn automate(
78 signer: Pubkey,
79 amount: u64,
80 deposit: u64,
81 executor: Pubkey,
82 fee: u64,
83 mask: u64,
84 strategy: u8,
85 reload: bool,
86 referrer: Option<Pubkey>,
87 pooled: bool,
88 is_new_miner: bool,
89) -> Instruction {
90 let automation_address = automation_pda(signer).0;
91 let miner_address = miner_pda(signer).0;
92 let referrer_pk = referrer.unwrap_or(Pubkey::default());
93
94 let mut accounts = vec![
95 AccountMeta::new(signer, true),
96 AccountMeta::new(automation_address, false),
97 AccountMeta::new(executor, false),
98 AccountMeta::new(miner_address, false),
99 AccountMeta::new_readonly(system_program::ID, false),
100 ];
101
102 if is_new_miner && referrer.is_some() && referrer_pk != Pubkey::default() {
104 let referral_address = referral_pda(referrer_pk).0;
105 accounts.push(AccountMeta::new(referral_address, false));
106 }
107
108 Instruction {
109 program_id: crate::ID,
110 accounts,
111 data: Automate {
112 amount: amount.to_le_bytes(),
113 deposit: deposit.to_le_bytes(),
114 fee: fee.to_le_bytes(),
115 mask: mask.to_le_bytes(),
116 strategy: strategy as u8,
117 reload: (reload as u64).to_le_bytes(),
118 referrer: referrer_pk.to_bytes(),
119 pooled: pooled as u8,
120 }
121 .to_bytes(),
122 }
123}
124
125pub fn claim_sol(
133 signer: Pubkey,
134 referrer_miner: Option<Pubkey>, referrer_referral: Option<Pubkey>, ) -> Instruction {
137 let miner_address = miner_pda(signer).0;
138
139 let mut accounts = vec![
140 AccountMeta::new(signer, true),
141 AccountMeta::new(miner_address, false),
142 AccountMeta::new_readonly(system_program::ID, false),
143 ];
144
145 if let (Some(miner_pubkey), Some(referral_pubkey)) = (referrer_miner, referrer_referral) {
147 accounts.push(AccountMeta::new(miner_pubkey, false));
148 accounts.push(AccountMeta::new(referral_pubkey, false));
149 }
150
151 Instruction {
152 program_id: crate::ID,
153 accounts,
154 data: ClaimSOL {}.to_bytes(),
155 }
156}
157
158pub fn claim_oil(
168 signer: Pubkey,
169 referrer_miner: Option<Pubkey>, referrer_referral: Option<Pubkey>, referrer_referral_oil_ata: Option<Pubkey>, ) -> Instruction {
173 let miner_address = miner_pda(signer).0;
174 let treasury_address = treasury_pda().0;
175 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
176 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
177
178 let mut accounts = vec![
179 AccountMeta::new(signer, true),
180 AccountMeta::new(miner_address, false),
181 AccountMeta::new(MINT_ADDRESS, false),
182 AccountMeta::new(recipient_address, false),
183 AccountMeta::new(treasury_address, false),
184 AccountMeta::new(treasury_tokens_address, false),
185 AccountMeta::new_readonly(system_program::ID, false),
186 AccountMeta::new_readonly(spl_token::ID, false),
187 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
188 ];
189
190 if let (Some(miner_pubkey), Some(referral_pubkey), Some(oil_ata_pubkey)) =
192 (referrer_miner, referrer_referral, referrer_referral_oil_ata) {
193 accounts.push(AccountMeta::new(miner_pubkey, false));
194 accounts.push(AccountMeta::new(referral_pubkey, false));
195 accounts.push(AccountMeta::new(oil_ata_pubkey, false));
196 }
197
198 Instruction {
199 program_id: crate::ID,
200 accounts,
201 data: ClaimOIL {}.to_bytes(),
202 }
203}
204
205
206pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
207 let board_address = board_pda().0;
208 let round_address = round_pda(round_id).0;
209 let treasury_address = TREASURY_ADDRESS;
210 Instruction {
211 program_id: crate::ID,
212 accounts: vec![
213 AccountMeta::new(signer, true),
214 AccountMeta::new(board_address, false),
215 AccountMeta::new(rent_payer, false),
216 AccountMeta::new(round_address, false),
217 AccountMeta::new(treasury_address, false),
218 AccountMeta::new_readonly(system_program::ID, false),
219 ],
220 data: Close {}.to_bytes(),
221 }
222}
223
224pub fn deploy(
227 signer: Pubkey,
228 authority: Pubkey,
229 amount: u64,
230 round_id: u64,
231 squares: [bool; 25],
232 referrer: Option<Pubkey>,
233 pooled: bool,
234) -> Instruction {
235 let automation_address = automation_pda(authority).0;
236 let board_address = board_pda().0;
237 let config_address = config_pda().0;
238 let miner_address = miner_pda(authority).0;
239 let round_address = round_pda(round_id).0;
240 let entropy_var_address = entropy_rng_api::state::var_pda(board_address, 0).0;
241
242 let mut mask: u32 = 0;
245 for (i, &square) in squares.iter().enumerate() {
246 if square {
247 mask |= 1 << i;
248 }
249 }
250
251 let referrer_pubkey = referrer.unwrap_or(Pubkey::default());
253 let referrer_bytes = referrer_pubkey.to_bytes();
254
255 let mut accounts = vec![
256 AccountMeta::new(signer, true),
257 AccountMeta::new(authority, false),
258 AccountMeta::new(automation_address, false),
259 AccountMeta::new(board_address, false),
260 AccountMeta::new(config_address, false),
261 AccountMeta::new(miner_address, false),
262 AccountMeta::new(round_address, false),
263 AccountMeta::new_readonly(system_program::ID, false),
264 AccountMeta::new_readonly(crate::ID, false),
265 AccountMeta::new(entropy_var_address, false),
267 AccountMeta::new_readonly(entropy_rng_api::ID, false),
268 ];
269
270 if referrer_pubkey != Pubkey::default() {
272 let referral_address = referral_pda(referrer_pubkey).0;
273 accounts.push(AccountMeta::new(referral_address, false));
274 }
275
276 Instruction {
277 program_id: crate::ID,
278 accounts,
279 data: Deploy {
280 amount: amount.to_le_bytes(),
281 squares: mask.to_le_bytes(),
282 referrer: referrer_bytes,
283 pooled: if pooled { 1 } else { 0 },
284 }
285 .to_bytes(),
286 }
287}
288
289pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
292 let board_address = board_pda().0;
293 let config_address = config_pda().0;
294 let mint_address = MINT_ADDRESS;
295 let treasury_address = TREASURY_ADDRESS;
296 let treasury_oil_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
297 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
298 let mut accounts = vec![
299 AccountMeta::new(signer, true),
300 AccountMeta::new(board_address, false),
301 AccountMeta::new_readonly(config_address, false),
302 AccountMeta::new(mint_address, false),
303 AccountMeta::new(treasury_address, false),
304 AccountMeta::new(treasury_oil_address, false),
305 AccountMeta::new(treasury_sol_address, false),
306 AccountMeta::new_readonly(spl_token::ID, false),
307 AccountMeta::new_readonly(crate::ID, false),
308 ];
309 for account in swap_accounts.iter() {
310 let mut acc_clone = account.clone();
311 acc_clone.is_signer = false;
312 accounts.push(acc_clone);
313 }
314 let mut data = Buyback {}.to_bytes();
315 data.extend_from_slice(swap_data);
316 Instruction {
317 program_id: crate::ID,
318 accounts,
319 data,
320 }
321}
322
323pub fn reset(
326 signer: Pubkey,
327 fee_collector: Pubkey,
328 round_id: u64,
329 top_miner: Pubkey,
330 var_address: Pubkey,
331) -> Instruction {
332 let board_address = board_pda().0;
333 let config_address = config_pda().0;
334 let mint_address = MINT_ADDRESS;
335 let round_address = round_pda(round_id).0;
336 let round_next_address = round_pda(round_id + 1).0;
337 let top_miner_address = miner_pda(top_miner).0;
338 let treasury_address = TREASURY_ADDRESS;
339 let treasury_tokens_address = treasury_tokens_address();
340 let pool_address = pool_pda().0;
341 let mint_authority_address = oil_mint_api::state::authority_pda().0;
342 Instruction {
343 program_id: crate::ID,
344 accounts: vec![
345 AccountMeta::new(signer, true),
346 AccountMeta::new(board_address, false),
347 AccountMeta::new(config_address, false),
348 AccountMeta::new(fee_collector, false),
349 AccountMeta::new(mint_address, false),
350 AccountMeta::new(round_address, false),
351 AccountMeta::new(round_next_address, false),
352 AccountMeta::new(top_miner_address, false),
353 AccountMeta::new(treasury_address, false),
354 AccountMeta::new(pool_address, false),
355 AccountMeta::new(treasury_tokens_address, false),
356 AccountMeta::new_readonly(system_program::ID, false),
357 AccountMeta::new_readonly(spl_token::ID, false),
358 AccountMeta::new_readonly(crate::ID, false),
359 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
360 AccountMeta::new(var_address, false),
362 AccountMeta::new_readonly(entropy_rng_api::ID, false),
363 AccountMeta::new(mint_authority_address, false),
365 AccountMeta::new_readonly(oil_mint_api::ID, false),
366 ],
367 data: Reset {}.to_bytes(),
368 }
369}
370
371pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
374 let miner_address = miner_pda(authority).0;
375 let board_address = board_pda().0;
376 let round_address = round_pda(round_id).0;
377 let treasury_address = TREASURY_ADDRESS;
378 Instruction {
379 program_id: crate::ID,
380 accounts: vec![
381 AccountMeta::new(signer, true),
382 AccountMeta::new(board_address, false),
383 AccountMeta::new(miner_address, false),
384 AccountMeta::new(round_address, false),
385 AccountMeta::new(treasury_address, false),
386 AccountMeta::new_readonly(system_program::ID, false),
387 ],
388 data: Checkpoint {}.to_bytes(),
389 }
390}
391
392pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
393 let config_address = config_pda().0;
394 Instruction {
395 program_id: crate::ID,
396 accounts: vec![
397 AccountMeta::new(signer, true),
398 AccountMeta::new(config_address, false),
399 AccountMeta::new_readonly(system_program::ID, false),
400 ],
401 data: SetAdmin {
402 admin: admin.to_bytes(),
403 }
404 .to_bytes(),
405 }
406}
407
408pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
409 let config_address = config_pda().0;
410 Instruction {
411 program_id: crate::ID,
412 accounts: vec![
413 AccountMeta::new(signer, true),
414 AccountMeta::new(config_address, false),
415 AccountMeta::new_readonly(system_program::ID, false),
416 ],
417 data: SetAdminFee {
418 admin_fee: admin_fee.to_le_bytes(),
419 }
420 .to_bytes(),
421 }
422}
423
424pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
425 let config_address = config_pda().0;
426 Instruction {
427 program_id: crate::ID,
428 accounts: vec![
429 AccountMeta::new(signer, true),
430 AccountMeta::new(config_address, false),
431 AccountMeta::new_readonly(system_program::ID, false),
432 ],
433 data: SetFeeCollector {
434 fee_collector: fee_collector.to_bytes(),
435 }
436 .to_bytes(),
437 }
438}
439
440pub fn set_auction(
441 signer: Pubkey,
442 halving_period_seconds: u64,
443 last_halving_time: u64,
444 base_mining_rates: [u64; 4],
445 auction_duration_seconds: u64,
446 starting_prices: [u64; 4],
447 _well_id: u64, ) -> Instruction {
449 let config_address = config_pda().0;
450 let auction_address = auction_pda().0;
451
452 Instruction {
453 program_id: crate::ID,
454 accounts: vec![
455 AccountMeta::new(signer, true),
456 AccountMeta::new_readonly(config_address, false),
457 AccountMeta::new(auction_address, false),
458 ],
459 data: SetAuction {
460 halving_period_seconds: halving_period_seconds.to_le_bytes(),
461 last_halving_time: last_halving_time.to_le_bytes(),
462 base_mining_rates: [
463 base_mining_rates[0].to_le_bytes(),
464 base_mining_rates[1].to_le_bytes(),
465 base_mining_rates[2].to_le_bytes(),
466 base_mining_rates[3].to_le_bytes(),
467 ],
468 auction_duration_seconds: auction_duration_seconds.to_le_bytes(),
469 starting_prices: [
470 starting_prices[0].to_le_bytes(),
471 starting_prices[1].to_le_bytes(),
472 starting_prices[2].to_le_bytes(),
473 starting_prices[3].to_le_bytes(),
474 ],
475 well_id: 4u64.to_le_bytes(), }
477 .to_bytes(),
478 }
479}
480
481pub fn deposit(signer: Pubkey, payer: Pubkey, amount: u64, lock_duration_days: u64, stake_id: u64) -> Instruction {
484 let mint_address = MINT_ADDRESS;
485 let stake_address = stake_pda_with_id(signer, stake_id).0;
486 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
487 let sender_address = get_associated_token_address(&signer, &MINT_ADDRESS);
488 let pool_address = pool_pda().0;
489 let pool_tokens_address = pool_tokens_address();
490 let miner_address = miner_pda(signer).0;
491 Instruction {
492 program_id: crate::ID,
493 accounts: vec![
494 AccountMeta::new(signer, true),
495 AccountMeta::new(payer, true),
496 AccountMeta::new(mint_address, false),
497 AccountMeta::new(sender_address, false),
498 AccountMeta::new(stake_address, false),
499 AccountMeta::new(stake_tokens_address, false),
500 AccountMeta::new(pool_address, false),
501 AccountMeta::new(pool_tokens_address, false),
502 AccountMeta::new(miner_address, false),
503 AccountMeta::new_readonly(system_program::ID, false),
504 AccountMeta::new_readonly(spl_token::ID, false),
505 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
506 ],
507 data: Deposit {
508 amount: amount.to_le_bytes(),
509 lock_duration_days: lock_duration_days.to_le_bytes(),
510 stake_id: stake_id.to_le_bytes(),
511 }
512 .to_bytes(),
513 }
514}
515
516pub fn withdraw(signer: Pubkey, amount: u64, stake_id: u64) -> Instruction {
519 let stake_address = stake_pda_with_id(signer, stake_id).0;
520 let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
521 let mint_address = MINT_ADDRESS;
522 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
523 let pool_address = pool_pda().0;
524 let pool_tokens_address = pool_tokens_address();
525 let miner_address = miner_pda(signer).0;
526 Instruction {
527 program_id: crate::ID,
528 accounts: vec![
529 AccountMeta::new(signer, true),
530 AccountMeta::new(mint_address, false),
531 AccountMeta::new(recipient_address, false),
532 AccountMeta::new(stake_address, false),
533 AccountMeta::new(stake_tokens_address, false),
534 AccountMeta::new(pool_address, false),
535 AccountMeta::new(pool_tokens_address, false),
536 AccountMeta::new(miner_address, false),
537 AccountMeta::new_readonly(system_program::ID, false),
538 AccountMeta::new_readonly(spl_token::ID, false),
539 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
540 ],
541 data: Withdraw {
542 amount: amount.to_le_bytes(),
543 stake_id: stake_id.to_le_bytes(),
544 }
545 .to_bytes(),
546 }
547}
548
549pub fn reload_sol(
559 signer: Pubkey,
560 authority: Pubkey,
561 referrer_miner: Option<Pubkey>,
562 referrer_referral: Option<Pubkey>,
563) -> Instruction {
564 let automation_address = automation_pda(authority).0;
565 let miner_address = miner_pda(authority).0;
566
567 let mut accounts = vec![
568 AccountMeta::new(signer, true),
569 AccountMeta::new(automation_address, false),
570 AccountMeta::new(miner_address, false),
571 AccountMeta::new_readonly(system_program::ID, false),
572 ];
573
574 if let (Some(miner_ref), Some(referral_ref)) = (referrer_miner, referrer_referral) {
576 accounts.push(AccountMeta::new(miner_ref, false));
577 accounts.push(AccountMeta::new(referral_ref, false));
578 }
579
580 Instruction {
581 program_id: crate::ID,
582 accounts,
583 data: ReloadSOL {}.to_bytes(),
584 }
585}
586
587pub fn claim_yield(signer: Pubkey, amount: u64, stake_id: u64) -> Instruction {
591 let stake_address = stake_pda_with_id(signer, stake_id).0;
592 let recipient_address = signer; let pool_address = pool_pda().0;
594 Instruction {
595 program_id: crate::ID,
596 accounts: vec![
597 AccountMeta::new(signer, true),
598 AccountMeta::new(recipient_address, false), AccountMeta::new(stake_address, false),
600 AccountMeta::new(pool_address, false),
601 AccountMeta::new_readonly(system_program::ID, false),
602 ],
603 data: ClaimYield {
604 amount: amount.to_le_bytes(),
605 }
606 .to_bytes(),
607 }
608}
609
610pub fn new_var(
611 signer: Pubkey,
612 provider: Pubkey,
613 id: u64,
614 commit: [u8; 32],
615 samples: u64,
616) -> Instruction {
617 let board_address = board_pda().0;
618 let config_address = config_pda().0;
619 let var_address = entropy_rng_api::state::var_pda(board_address, id).0;
620 Instruction {
621 program_id: crate::ID,
622 accounts: vec![
623 AccountMeta::new(signer, true),
624 AccountMeta::new(board_address, false),
625 AccountMeta::new(config_address, false),
626 AccountMeta::new(provider, false),
627 AccountMeta::new(var_address, false),
628 AccountMeta::new_readonly(system_program::ID, false),
629 AccountMeta::new_readonly(entropy_rng_api::ID, false),
630 ],
631 data: NewVar {
632 id: id.to_le_bytes(),
633 commit: commit,
634 samples: samples.to_le_bytes(),
635 }
636 .to_bytes(),
637 }
638}
639
640pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
641 let config_address = config_pda().0;
642 Instruction {
643 program_id: crate::ID,
644 accounts: vec![
645 AccountMeta::new(signer, true),
646 AccountMeta::new(config_address, false),
647 AccountMeta::new_readonly(new_program, false),
648 ],
649 data: SetSwapProgram {}.to_bytes(),
650 }
651}
652
653pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
654 let board_address = board_pda().0;
655 let config_address = config_pda().0;
656 Instruction {
657 program_id: crate::ID,
658 accounts: vec![
659 AccountMeta::new(signer, true),
660 AccountMeta::new(board_address, false),
661 AccountMeta::new(config_address, false),
662 AccountMeta::new(new_var_address, false),
663 ],
664 data: SetVarAddress {}.to_bytes(),
665 }
666}
667
668pub fn migrate(signer: Pubkey, miner_authority: Pubkey) -> Instruction {
671 let miner_address = miner_pda(miner_authority).0;
672 Instruction {
673 program_id: crate::ID,
674 accounts: vec![
675 AccountMeta::new(signer, true),
676 AccountMeta::new(miner_address, false),
677 AccountMeta::new_readonly(system_program::ID, false),
678 ],
679 data: Migrate {}.to_bytes(),
680 }
681}
682
683pub fn migrate_treasury(signer: Pubkey) -> Instruction {
686 let treasury_address = treasury_pda().0;
687 Instruction {
688 program_id: crate::ID,
689 accounts: vec![
690 AccountMeta::new(signer, true),
691 AccountMeta::new(treasury_address, false),
692 AccountMeta::new_readonly(system_program::ID, false),
693 ],
694 data: Migrate {}.to_bytes(),
695 }
696}
697
698pub fn create_referral(signer: Pubkey) -> Instruction {
700 let referral_address = referral_pda(signer).0;
701 Instruction {
702 program_id: crate::ID,
703 accounts: vec![
704 AccountMeta::new(signer, true),
705 AccountMeta::new(referral_address, false),
706 AccountMeta::new_readonly(system_program::ID, false),
707 ],
708 data: CreateReferral {}.to_bytes(),
709 }
710}
711
712pub fn claim_referral(signer: Pubkey) -> Instruction {
715 let referral_address = referral_pda(signer).0;
716 let referral_oil_address = get_associated_token_address(&referral_address, &MINT_ADDRESS);
717 let recipient_oil_address = get_associated_token_address(&signer, &MINT_ADDRESS);
718 Instruction {
719 program_id: crate::ID,
720 accounts: vec![
721 AccountMeta::new(signer, true),
722 AccountMeta::new(referral_address, false),
723 AccountMeta::new(referral_oil_address, false), AccountMeta::new(MINT_ADDRESS, false),
725 AccountMeta::new(recipient_oil_address, false), AccountMeta::new_readonly(system_program::ID, false),
727 AccountMeta::new_readonly(spl_token::ID, false),
728 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
729 ],
730 data: ClaimReferral {}.to_bytes(),
731 }
732}
733
734pub fn place_bid(
742 signer: Pubkey,
743 square_id: u64,
744 fee_collector: Pubkey,
745 pool_account: Option<Pubkey>, previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, referrer: Option<Pubkey>, ) -> Instruction {
750 let well_address = well_pda(square_id).0;
751 let auction_address = auction_pda().0;
752 let treasury_address = treasury_pda().0;
753 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
754 let staking_pool_address = pool_pda().0;
755 let config_address = config_pda().0;
756 let mint_authority_address = oil_mint_api::state::authority_pda().0;
757
758 let mut accounts = vec![
759 AccountMeta::new(signer, true),
760 AccountMeta::new(well_address, false),
761 ];
762
763 if let Some(pool_pubkey) = pool_account {
765 accounts.push(AccountMeta::new(pool_pubkey, false));
766 } else {
767 accounts.push(AccountMeta::new_readonly(system_program::ID, false)); }
770
771 accounts.extend_from_slice(&[
772 AccountMeta::new(auction_address, false),
773 AccountMeta::new(treasury_address, false),
774 AccountMeta::new(treasury_tokens_address, false),
775 AccountMeta::new(MINT_ADDRESS, false),
776 AccountMeta::new(mint_authority_address, false),
777 AccountMeta::new_readonly(oil_mint_api::ID, false),
778 AccountMeta::new(staking_pool_address, false),
779 AccountMeta::new(fee_collector, false),
780 AccountMeta::new(config_address, false),
781 AccountMeta::new_readonly(spl_token::ID, false),
782 AccountMeta::new_readonly(system_program::ID, false),
783 AccountMeta::new_readonly(crate::ID, false), ]);
785
786 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
788 accounts.push(AccountMeta::new(miner_pubkey, false));
789 accounts.push(AccountMeta::new(owner_pubkey, false));
790 }
791
792 if let Some(referrer_pubkey) = referrer {
794 let referral_address = referral_pda(referrer_pubkey).0;
795 accounts.push(AccountMeta::new(referral_address, false));
796 }
797
798 Instruction {
799 program_id: crate::ID,
800 accounts,
801 data: instruction::PlaceBid {
802 square_id: square_id.to_le_bytes(),
803 referrer: referrer.unwrap_or(Pubkey::default()).to_bytes(),
804 }
805 .to_bytes(),
806 }
807}
808
809pub fn join_auction_pool(
815 signer: Pubkey,
816 square_id: u64,
817 epoch_id: u64, amount: u64, auction_pool_account: Pubkey, fee_collector: Option<Pubkey>, previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, ) -> Instruction {
824 let miner_address = miner_pda(signer).0;
825 let bid_address = bid_pda(signer, square_id, epoch_id).0;
826 let well_address = well_pda(square_id).0;
827 let auction_address = auction_pda().0;
828
829 let mut accounts = vec![
830 AccountMeta::new(signer, true),
831 AccountMeta::new(miner_address, false), AccountMeta::new(bid_address, false),
833 AccountMeta::new(well_address, false),
834 AccountMeta::new(auction_pool_account, false), AccountMeta::new(auction_address, false),
836 AccountMeta::new_readonly(system_program::ID, false),
837 AccountMeta::new_readonly(crate::ID, false), ];
839
840 if let Some(fee_collector_pubkey) = fee_collector {
842 let treasury_address = treasury_pda().0;
843 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
844 let staking_pool_address = pool_pda().0;
845 let config_address = config_pda().0;
846 let mint_authority_address = oil_mint_api::state::authority_pda().0;
847
848 accounts.push(AccountMeta::new(treasury_address, false));
849 accounts.push(AccountMeta::new(treasury_tokens_address, false));
850 accounts.push(AccountMeta::new(MINT_ADDRESS, false));
851 accounts.push(AccountMeta::new(mint_authority_address, false));
852 accounts.push(AccountMeta::new_readonly(oil_mint_api::ID, false));
853 accounts.push(AccountMeta::new(staking_pool_address, false));
854 accounts.push(AccountMeta::new(fee_collector_pubkey, false));
855 accounts.push(AccountMeta::new(config_address, false));
856 accounts.push(AccountMeta::new_readonly(spl_token::ID, false));
857
858 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
860 accounts.push(AccountMeta::new(miner_pubkey, false));
861 accounts.push(AccountMeta::new(owner_pubkey, false));
862 }
863 }
864
865 Instruction {
866 program_id: crate::ID,
867 accounts,
868 data: JoinAuctionPool {
869 square_id: square_id.to_le_bytes(),
870 amount: amount.to_le_bytes(),
871 }
872 .to_bytes(),
873 }
874}
875
876pub fn claim_auction_oil(
883 signer: Pubkey,
884 well_mask: u8, well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
889 let miner_address = miner_pda(signer).0;
890 let auction_address = auction_pda().0;
891 let treasury_address = treasury_pda().0;
892 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
893 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
894 let mint_authority_address = oil_mint_api::state::authority_pda().0;
895
896 let mut accounts = vec![
897 AccountMeta::new(signer, true),
898 AccountMeta::new(miner_address, false),
899 ];
900
901 for well_opt in well_accounts.iter() {
903 if let Some(well_pubkey) = well_opt {
904 accounts.push(AccountMeta::new(*well_pubkey, false));
905 } else {
906 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
908 }
909 }
910
911 if let Some(auction_pool_pdas) = auction_pool_accounts {
913 for auction_pool_pda_opt in auction_pool_pdas.iter() {
914 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
915 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
916 } else {
917 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
919 }
920 }
921 } else {
922 for _ in 0..4 {
924 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
925 }
926 }
927
928 accounts.extend_from_slice(&[
929 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
931 AccountMeta::new(treasury_tokens_address, false),
932 AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(mint_authority_address, false), AccountMeta::new_readonly(oil_mint_api::ID, false),
935 AccountMeta::new(recipient_address, false),
936 AccountMeta::new_readonly(spl_token::ID, false),
937 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
938 AccountMeta::new_readonly(system_program::ID, false),
939 AccountMeta::new_readonly(crate::ID, false), ]);
941
942 if let Some(bid_pdas) = bid_accounts {
944 for bid_pda_opt in bid_pdas.iter() {
945 if let Some(bid_pubkey) = bid_pda_opt {
946 accounts.push(AccountMeta::new(*bid_pubkey, false));
947 }
948 }
949 }
950
951 Instruction {
952 program_id: crate::ID,
953 accounts,
954 data: ClaimAuctionOIL {
955 well_mask,
956 }
957 .to_bytes(),
958 }
959}
960
961pub fn claim_auction_sol(
968 signer: Pubkey,
969 well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
973 let miner_address = miner_pda(signer).0;
974 let (auction_address, _) = auction_pda();
975 let treasury_address = treasury_pda().0;
976
977 let mut accounts = vec![
978 AccountMeta::new(signer, true),
979 AccountMeta::new(miner_address, false),
980 ];
981
982 for well_opt in well_accounts.iter() {
984 if let Some(well_pubkey) = well_opt {
985 accounts.push(AccountMeta::new(*well_pubkey, false));
986 } else {
987 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
989 }
990 }
991
992 if let Some(auction_pool_pdas) = auction_pool_accounts {
994 for auction_pool_pda_opt in auction_pool_pdas.iter() {
995 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
996 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
997 } else {
998 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1000 }
1001 }
1002 } else {
1003 for _ in 0..4 {
1005 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1006 }
1007 }
1008
1009 accounts.extend_from_slice(&[
1010 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1012 AccountMeta::new_readonly(system_program::ID, false),
1013 AccountMeta::new_readonly(crate::ID, false), ]);
1015
1016 if let Some(bid_pdas) = bid_accounts {
1018 for bid_pda_opt in bid_pdas.iter() {
1019 if let Some(bid_pubkey) = bid_pda_opt {
1020 accounts.push(AccountMeta::new(*bid_pubkey, false));
1021 }
1022 }
1023 }
1024
1025 Instruction {
1026 program_id: crate::ID,
1027 accounts,
1028 data: ClaimAuctionSOL {
1029 _reserved: 0,
1030 }
1031 .to_bytes(),
1032 }
1033}