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 user_wrapped_sol_ata = get_associated_token_address(&authority, &SOL_MINT);
257 let round_wrapped_sol_ata = get_associated_token_address(&round_address, &SOL_MINT);
258
259 let mut accounts = vec![
263 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(automation_address, false), AccountMeta::new(board_address, false), AccountMeta::new_readonly(config_address, false), AccountMeta::new(miner_address, false), AccountMeta::new(round_address, false), AccountMeta::new_readonly(system_program::ID, false), AccountMeta::new_readonly(crate::ID, false), AccountMeta::new(user_wrapped_sol_ata, false), AccountMeta::new(round_wrapped_sol_ata, false), AccountMeta::new_readonly(spl_token::ID, false), AccountMeta::new_readonly(SOL_MINT, false), AccountMeta::new_readonly(spl_associated_token_account::ID, false), ];
280
281 if referrer_pubkey != Pubkey::default() {
283 let referral_address = referral_pda(referrer_pubkey).0;
284 accounts.push(AccountMeta::new(referral_address, false)); }
286
287 accounts.push(AccountMeta::new(entropy_var_address, false)); accounts.push(AccountMeta::new_readonly(entropy_rng_api::ID, false)); Instruction {
292 program_id: crate::ID,
293 accounts,
294 data: Deploy {
295 amount: amount.to_le_bytes(),
296 squares: mask.to_le_bytes(),
297 referrer: referrer_bytes,
298 pooled: if pooled { 1 } else { 0 },
299 }
300 .to_bytes(),
301 }
302}
303
304pub fn deploy_auto(
307 signer: Pubkey,
308 authority: Pubkey,
309 amount: u64,
310 round_id: u64,
311 squares: [bool; 25],
312 referrer: Option<Pubkey>,
313 pooled: bool,
314) -> Instruction {
315 let automation_address = automation_pda(authority).0;
316 let board_address = board_pda().0;
317 let config_address = config_pda().0;
318 let miner_address = miner_pda(authority).0;
319 let round_address = round_pda(round_id).0;
320 let entropy_var_address = entropy_rng_api::state::var_pda(board_address, 0).0;
321
322 let mut mask: u32 = 0;
325 for (i, &square) in squares.iter().enumerate() {
326 if square {
327 mask |= 1 << i;
328 }
329 }
330
331 let referrer_pubkey = referrer.unwrap_or(Pubkey::default());
333 let referrer_bytes = referrer_pubkey.to_bytes();
334
335 let mut accounts = vec![
340 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(automation_address, false), AccountMeta::new(board_address, false), AccountMeta::new_readonly(config_address, false), AccountMeta::new(miner_address, false), AccountMeta::new(round_address, false), AccountMeta::new_readonly(system_program::ID, false), AccountMeta::new_readonly(crate::ID, false), AccountMeta::new_readonly(spl_token::ID, false), AccountMeta::new_readonly(SOL_MINT, false), AccountMeta::new_readonly(spl_associated_token_account::ID, false), ];
355
356 if referrer_pubkey != Pubkey::default() {
358 let referral_address = referral_pda(referrer_pubkey).0;
359 accounts.push(AccountMeta::new(referral_address, false)); }
361
362 accounts.push(AccountMeta::new(entropy_var_address, false)); accounts.push(AccountMeta::new_readonly(entropy_rng_api::ID, false)); Instruction {
367 program_id: crate::ID,
368 accounts,
369 data: Deploy {
370 amount: amount.to_le_bytes(),
371 squares: mask.to_le_bytes(),
372 referrer: referrer_bytes,
373 pooled: if pooled { 1 } else { 0 },
374 }
375 .to_bytes(),
376 }
377}
378
379pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
382 let board_address = board_pda().0;
383 let config_address = config_pda().0;
384 let mint_address = MINT_ADDRESS;
385 let treasury_address = TREASURY_ADDRESS;
386 let treasury_oil_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
387 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
388 let mut accounts = vec![
389 AccountMeta::new(signer, true),
390 AccountMeta::new(board_address, false),
391 AccountMeta::new_readonly(config_address, false),
392 AccountMeta::new(mint_address, false),
393 AccountMeta::new(treasury_address, false),
394 AccountMeta::new(treasury_oil_address, false),
395 AccountMeta::new(treasury_sol_address, false),
396 AccountMeta::new_readonly(spl_token::ID, false),
397 AccountMeta::new_readonly(crate::ID, false),
398 ];
399 for account in swap_accounts.iter() {
400 let mut acc_clone = account.clone();
401 acc_clone.is_signer = false;
402 accounts.push(acc_clone);
403 }
404 let mut data = Buyback {}.to_bytes();
405 data.extend_from_slice(swap_data);
406 Instruction {
407 program_id: crate::ID,
408 accounts,
409 data,
410 }
411}
412
413pub fn reset(
416 signer: Pubkey,
417 fee_collector: Pubkey,
418 round_id: u64,
419 top_miner: Pubkey,
420 var_address: Pubkey,
421) -> Instruction {
422 reset_with_miners(signer, fee_collector, round_id, top_miner, var_address, &[])
423}
424
425pub fn reset_with_miners(
426 signer: Pubkey,
427 fee_collector: Pubkey,
428 round_id: u64,
429 top_miner: Pubkey,
430 var_address: Pubkey,
431 miner_accounts: &[Pubkey],
432) -> Instruction {
433 let board_address = board_pda().0;
434 let config_address = config_pda().0;
435 let mint_address = MINT_ADDRESS;
436 let round_address = round_pda(round_id).0;
437 let round_next_address = round_pda(round_id + 1).0;
438 let round_next_wrapped_sol_ata = get_associated_token_address(&round_next_address, &SOL_MINT);
439 let top_miner_address = miner_pda(top_miner).0;
440 let treasury_address = TREASURY_ADDRESS;
441 let treasury_tokens_address = treasury_tokens_address();
442 let pool_address = pool_pda().0;
443 let mint_authority_address = oil_mint_api::state::authority_pda().0;
444 let mut reset_instruction = Instruction {
445 program_id: crate::ID,
446 accounts: vec![
447 AccountMeta::new(signer, true),
448 AccountMeta::new(board_address, false),
449 AccountMeta::new(config_address, false),
450 AccountMeta::new(fee_collector, false),
451 AccountMeta::new(mint_address, false),
452 AccountMeta::new(round_address, false),
453 AccountMeta::new(round_next_address, false),
454 AccountMeta::new(top_miner_address, false),
455 AccountMeta::new(treasury_address, false),
456 AccountMeta::new(pool_address, false),
457 AccountMeta::new(treasury_tokens_address, false),
458 AccountMeta::new_readonly(system_program::ID, false),
459 AccountMeta::new_readonly(spl_token::ID, false),
460 AccountMeta::new_readonly(crate::ID, false),
461 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
462 AccountMeta::new(round_next_wrapped_sol_ata, false),
464 AccountMeta::new_readonly(SOL_MINT, false), AccountMeta::new_readonly(spl_associated_token_account::ID, false),
466 AccountMeta::new(var_address, false),
468 AccountMeta::new_readonly(entropy_rng_api::ID, false),
469 AccountMeta::new(mint_authority_address, false),
471 AccountMeta::new_readonly(oil_mint_api::ID, false),
472 ],
473 data: Reset {}.to_bytes(),
474 };
475
476 for miner_pubkey in miner_accounts {
478 reset_instruction.accounts.push(AccountMeta::new(
479 miner_pda(*miner_pubkey).0,
480 false,
481 ));
482 }
483
484 reset_instruction
485}
486
487pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
490 let miner_address = miner_pda(authority).0;
491 let board_address = board_pda().0;
492 let round_address = round_pda(round_id).0;
493 let treasury_address = TREASURY_ADDRESS;
494 Instruction {
495 program_id: crate::ID,
496 accounts: vec![
497 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(board_address, false),
500 AccountMeta::new(miner_address, false),
501 AccountMeta::new(round_address, false),
502 AccountMeta::new(treasury_address, false),
503 AccountMeta::new_readonly(system_program::ID, false),
504 ],
505 data: Checkpoint {}.to_bytes(),
506 }
507}
508
509pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
510 let config_address = config_pda().0;
511 Instruction {
512 program_id: crate::ID,
513 accounts: vec![
514 AccountMeta::new(signer, true),
515 AccountMeta::new(config_address, false),
516 AccountMeta::new_readonly(system_program::ID, false),
517 ],
518 data: SetAdmin {
519 admin: admin.to_bytes(),
520 }
521 .to_bytes(),
522 }
523}
524
525pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
526 let config_address = config_pda().0;
527 Instruction {
528 program_id: crate::ID,
529 accounts: vec![
530 AccountMeta::new(signer, true),
531 AccountMeta::new(config_address, false),
532 AccountMeta::new_readonly(system_program::ID, false),
533 ],
534 data: SetAdminFee {
535 admin_fee: admin_fee.to_le_bytes(),
536 }
537 .to_bytes(),
538 }
539}
540
541pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
542 let config_address = config_pda().0;
543 Instruction {
544 program_id: crate::ID,
545 accounts: vec![
546 AccountMeta::new(signer, true),
547 AccountMeta::new(config_address, false),
548 AccountMeta::new_readonly(system_program::ID, false),
549 ],
550 data: SetFeeCollector {
551 fee_collector: fee_collector.to_bytes(),
552 }
553 .to_bytes(),
554 }
555}
556
557pub fn set_auction(
558 signer: Pubkey,
559 halving_period_seconds: u64,
560 last_halving_time: u64,
561 base_mining_rates: [u64; 4],
562 auction_duration_seconds: u64,
563 starting_prices: [u64; 4],
564 _well_id: u64, ) -> Instruction {
566 let config_address = config_pda().0;
567 let auction_address = auction_pda().0;
568
569 Instruction {
570 program_id: crate::ID,
571 accounts: vec![
572 AccountMeta::new(signer, true),
573 AccountMeta::new_readonly(config_address, false),
574 AccountMeta::new(auction_address, false),
575 ],
576 data: SetAuction {
577 halving_period_seconds: halving_period_seconds.to_le_bytes(),
578 last_halving_time: last_halving_time.to_le_bytes(),
579 base_mining_rates: [
580 base_mining_rates[0].to_le_bytes(),
581 base_mining_rates[1].to_le_bytes(),
582 base_mining_rates[2].to_le_bytes(),
583 base_mining_rates[3].to_le_bytes(),
584 ],
585 auction_duration_seconds: auction_duration_seconds.to_le_bytes(),
586 starting_prices: [
587 starting_prices[0].to_le_bytes(),
588 starting_prices[1].to_le_bytes(),
589 starting_prices[2].to_le_bytes(),
590 starting_prices[3].to_le_bytes(),
591 ],
592 well_id: 4u64.to_le_bytes(), }
594 .to_bytes(),
595 }
596}
597
598pub fn deposit(signer: Pubkey, authority: Pubkey, amount: u64, lock_duration_days: u64, stake_id: u64) -> Instruction {
601 let mint_address = MINT_ADDRESS;
602 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
604 let sender_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
606 let pool_tokens_address = pool_tokens_address();
607 let miner_address = miner_pda(authority).0; Instruction {
609 program_id: crate::ID,
610 accounts: vec![
611 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(mint_address, false),
614 AccountMeta::new(sender_address, false),
615 AccountMeta::new(stake_address, false),
616 AccountMeta::new(stake_tokens_address, false),
617 AccountMeta::new(pool_address, false),
618 AccountMeta::new(pool_tokens_address, false),
619 AccountMeta::new(miner_address, false),
620 AccountMeta::new_readonly(system_program::ID, false),
621 AccountMeta::new_readonly(spl_token::ID, false),
622 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
623 ],
624 data: Deposit {
625 amount: amount.to_le_bytes(),
626 lock_duration_days: lock_duration_days.to_le_bytes(),
627 stake_id: stake_id.to_le_bytes(),
628 }
629 .to_bytes(),
630 }
631}
632
633pub fn withdraw(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
636 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
638 let mint_address = MINT_ADDRESS;
639 let recipient_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
641 let pool_tokens_address = pool_tokens_address();
642 let miner_address = miner_pda(authority).0; Instruction {
644 program_id: crate::ID,
645 accounts: vec![
646 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(mint_address, false),
649 AccountMeta::new(recipient_address, false),
650 AccountMeta::new(stake_address, false),
651 AccountMeta::new(stake_tokens_address, false),
652 AccountMeta::new(pool_address, false),
653 AccountMeta::new(pool_tokens_address, false),
654 AccountMeta::new(miner_address, false),
655 AccountMeta::new_readonly(system_program::ID, false),
656 AccountMeta::new_readonly(spl_token::ID, false),
657 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
658 ],
659 data: Withdraw {
660 amount: amount.to_le_bytes(),
661 stake_id: stake_id.to_le_bytes(),
662 }
663 .to_bytes(),
664 }
665}
666
667pub fn reload_sol(
677 signer: Pubkey,
678 authority: Pubkey,
679 referrer_miner: Option<Pubkey>,
680 referrer_referral: Option<Pubkey>,
681) -> Instruction {
682 let automation_address = automation_pda(authority).0;
683 let miner_address = miner_pda(authority).0;
684
685 let mut accounts = vec![
686 AccountMeta::new(signer, true),
687 AccountMeta::new(automation_address, false),
688 AccountMeta::new(miner_address, false),
689 AccountMeta::new_readonly(system_program::ID, false),
690 ];
691
692 if let (Some(miner_ref), Some(referral_ref)) = (referrer_miner, referrer_referral) {
694 accounts.push(AccountMeta::new(miner_ref, false));
695 accounts.push(AccountMeta::new(referral_ref, false));
696 }
697
698 Instruction {
699 program_id: crate::ID,
700 accounts,
701 data: ReloadSOL {}.to_bytes(),
702 }
703}
704
705pub fn claim_yield(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
709 let stake_address = stake_pda_with_id(authority, stake_id).0; let pool_address = pool_pda().0;
711 Instruction {
712 program_id: crate::ID,
713 accounts: vec![
714 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(stake_address, false),
717 AccountMeta::new(pool_address, false),
718 AccountMeta::new_readonly(system_program::ID, false),
719 ],
720 data: ClaimYield {
721 amount: amount.to_le_bytes(),
722 }
723 .to_bytes(),
724 }
725}
726
727pub fn new_var(
728 signer: Pubkey,
729 provider: Pubkey,
730 id: u64,
731 commit: [u8; 32],
732 samples: u64,
733) -> Instruction {
734 let board_address = board_pda().0;
735 let config_address = config_pda().0;
736 let var_address = entropy_rng_api::state::var_pda(board_address, id).0;
737 Instruction {
738 program_id: crate::ID,
739 accounts: vec![
740 AccountMeta::new(signer, true),
741 AccountMeta::new(board_address, false),
742 AccountMeta::new(config_address, false),
743 AccountMeta::new(provider, false),
744 AccountMeta::new(var_address, false),
745 AccountMeta::new_readonly(system_program::ID, false),
746 AccountMeta::new_readonly(entropy_rng_api::ID, false),
747 ],
748 data: NewVar {
749 id: id.to_le_bytes(),
750 commit: commit,
751 samples: samples.to_le_bytes(),
752 }
753 .to_bytes(),
754 }
755}
756
757pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
758 let config_address = config_pda().0;
759 Instruction {
760 program_id: crate::ID,
761 accounts: vec![
762 AccountMeta::new(signer, true),
763 AccountMeta::new(config_address, false),
764 AccountMeta::new_readonly(new_program, false),
765 ],
766 data: SetSwapProgram {}.to_bytes(),
767 }
768}
769
770pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
771 let board_address = board_pda().0;
772 let config_address = config_pda().0;
773 Instruction {
774 program_id: crate::ID,
775 accounts: vec![
776 AccountMeta::new(signer, true),
777 AccountMeta::new(board_address, false),
778 AccountMeta::new(config_address, false),
779 AccountMeta::new(new_var_address, false),
780 ],
781 data: SetVarAddress {}.to_bytes(),
782 }
783}
784
785pub fn migrate(signer: Pubkey, miner_authority: Pubkey) -> Instruction {
788 let miner_address = miner_pda(miner_authority).0;
789 Instruction {
790 program_id: crate::ID,
791 accounts: vec![
792 AccountMeta::new(signer, true),
793 AccountMeta::new(miner_address, false),
794 AccountMeta::new_readonly(system_program::ID, false),
795 ],
796 data: Migrate {}.to_bytes(),
797 }
798}
799
800pub fn create_referral(signer: Pubkey) -> Instruction {
802 let referral_address = referral_pda(signer).0;
803 Instruction {
804 program_id: crate::ID,
805 accounts: vec![
806 AccountMeta::new(signer, true),
807 AccountMeta::new(referral_address, false),
808 AccountMeta::new_readonly(system_program::ID, false),
809 ],
810 data: CreateReferral {}.to_bytes(),
811 }
812}
813
814pub fn claim_referral(signer: Pubkey, authority: Pubkey) -> Instruction {
819 let referral_address = referral_pda(authority).0;
820 let referral_oil_address = get_associated_token_address(&referral_address, &MINT_ADDRESS);
821 let recipient_oil_address = get_associated_token_address(&authority, &MINT_ADDRESS);
822 Instruction {
823 program_id: crate::ID,
824 accounts: vec![
825 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(referral_address, false), AccountMeta::new(referral_oil_address, false), AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(recipient_oil_address, false), AccountMeta::new_readonly(system_program::ID, false), AccountMeta::new_readonly(spl_token::ID, false), AccountMeta::new_readonly(spl_associated_token_account::ID, false), ],
835 data: ClaimReferral {}.to_bytes(),
836 }
837}
838
839pub fn place_bid(
847 signer: Pubkey,
848 square_id: u64,
849 fee_collector: Pubkey,
850 pool_account: Option<Pubkey>, previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, referrer: Option<Pubkey>, ) -> Instruction {
855 let well_address = well_pda(square_id).0;
856 let auction_address = auction_pda().0;
857 let treasury_address = treasury_pda().0;
858 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
859 let staking_pool_address = pool_pda().0;
860 let config_address = config_pda().0;
861 let mint_authority_address = oil_mint_api::state::authority_pda().0;
862
863 let mut accounts = vec![
864 AccountMeta::new(signer, true),
865 AccountMeta::new(well_address, false),
866 ];
867
868 if let Some(pool_pubkey) = pool_account {
870 accounts.push(AccountMeta::new(pool_pubkey, false));
871 } else {
872 accounts.push(AccountMeta::new_readonly(system_program::ID, false)); }
875
876 accounts.extend_from_slice(&[
877 AccountMeta::new(auction_address, false),
878 AccountMeta::new(treasury_address, false),
879 AccountMeta::new(treasury_tokens_address, false),
880 AccountMeta::new(MINT_ADDRESS, false),
881 AccountMeta::new(mint_authority_address, false),
882 AccountMeta::new_readonly(oil_mint_api::ID, false),
883 AccountMeta::new(staking_pool_address, false),
884 AccountMeta::new(fee_collector, false),
885 AccountMeta::new(config_address, false),
886 AccountMeta::new_readonly(spl_token::ID, false),
887 AccountMeta::new_readonly(system_program::ID, false),
888 AccountMeta::new_readonly(crate::ID, false), ]);
890
891 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
893 accounts.push(AccountMeta::new(miner_pubkey, false));
894 accounts.push(AccountMeta::new(owner_pubkey, false));
895 }
896
897 if let Some(referrer_pubkey) = referrer {
899 let referral_address = referral_pda(referrer_pubkey).0;
900 accounts.push(AccountMeta::new(referral_address, false));
901 }
902
903 Instruction {
904 program_id: crate::ID,
905 accounts,
906 data: instruction::PlaceBid {
907 square_id: square_id.to_le_bytes(),
908 referrer: referrer.unwrap_or(Pubkey::default()).to_bytes(),
909 }
910 .to_bytes(),
911 }
912}
913
914pub fn claim_auction_oil(
921 signer: Pubkey,
922 well_mask: u8, well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
927 let miner_address = miner_pda(signer).0;
928 let auction_address = auction_pda().0;
929 let treasury_address = treasury_pda().0;
930 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
931 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
932 let mint_authority_address = oil_mint_api::state::authority_pda().0;
933
934 let mut accounts = vec![
935 AccountMeta::new(signer, true),
936 AccountMeta::new(miner_address, false),
937 ];
938
939 for well_opt in well_accounts.iter() {
941 if let Some(well_pubkey) = well_opt {
942 accounts.push(AccountMeta::new(*well_pubkey, false));
943 } else {
944 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
946 }
947 }
948
949 if let Some(auction_pool_pdas) = auction_pool_accounts {
951 for auction_pool_pda_opt in auction_pool_pdas.iter() {
952 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
953 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
954 } else {
955 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
957 }
958 }
959 } else {
960 for _ in 0..4 {
962 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
963 }
964 }
965
966 accounts.extend_from_slice(&[
967 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
969 AccountMeta::new(treasury_tokens_address, false),
970 AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(mint_authority_address, false), AccountMeta::new_readonly(oil_mint_api::ID, false),
973 AccountMeta::new(recipient_address, false),
974 AccountMeta::new_readonly(spl_token::ID, false),
975 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
976 AccountMeta::new_readonly(system_program::ID, false),
977 AccountMeta::new_readonly(crate::ID, false), ]);
979
980 if let Some(bid_pdas) = bid_accounts {
982 for bid_pda_opt in bid_pdas.iter() {
983 if let Some(bid_pubkey) = bid_pda_opt {
984 accounts.push(AccountMeta::new(*bid_pubkey, false));
985 }
986 }
987 }
988
989 Instruction {
990 program_id: crate::ID,
991 accounts,
992 data: ClaimAuctionOIL {
993 well_mask,
994 }
995 .to_bytes(),
996 }
997}
998
999pub fn claim_auction_sol(
1006 signer: Pubkey,
1007 well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1011 let miner_address = miner_pda(signer).0;
1012 let (auction_address, _) = auction_pda();
1013 let treasury_address = treasury_pda().0;
1014
1015 let mut accounts = vec![
1016 AccountMeta::new(signer, true),
1017 AccountMeta::new(miner_address, false),
1018 ];
1019
1020 for well_opt in well_accounts.iter() {
1022 if let Some(well_pubkey) = well_opt {
1023 accounts.push(AccountMeta::new(*well_pubkey, false));
1024 } else {
1025 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1027 }
1028 }
1029
1030 if let Some(auction_pool_pdas) = auction_pool_accounts {
1032 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1033 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1034 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1035 } else {
1036 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1038 }
1039 }
1040 } else {
1041 for _ in 0..4 {
1043 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1044 }
1045 }
1046
1047 accounts.extend_from_slice(&[
1048 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1050 AccountMeta::new_readonly(system_program::ID, false),
1051 AccountMeta::new_readonly(crate::ID, false), ]);
1053
1054 if let Some(bid_pdas) = bid_accounts {
1056 for bid_pda_opt in bid_pdas.iter() {
1057 if let Some(bid_pubkey) = bid_pda_opt {
1058 accounts.push(AccountMeta::new(*bid_pubkey, false));
1059 }
1060 }
1061 }
1062
1063 Instruction {
1064 program_id: crate::ID,
1065 accounts,
1066 data: ClaimAuctionSOL {
1067 _reserved: 0,
1068 }
1069 .to_bytes(),
1070 }
1071}
1072
1073pub fn claim_seeker(signer: Pubkey, mint: Pubkey) -> Instruction {
1074 let seeker_address = seeker_pda(mint).0;
1075 let token_account_address = get_associated_token_address(&signer, &mint);
1076 Instruction {
1077 program_id: crate::ID,
1078 accounts: vec![
1079 AccountMeta::new(signer, true),
1080 AccountMeta::new_readonly(mint, false),
1081 AccountMeta::new(seeker_address, false),
1082 AccountMeta::new(token_account_address, false),
1083 AccountMeta::new_readonly(system_program::ID, false),
1084 ],
1085 data: ClaimSeeker {}.to_bytes(),
1086 }
1087}