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 authority: Pubkey,
80 amount: u64,
81 deposit: u64,
82 executor: Pubkey,
83 fee: u64,
84 mask: u64,
85 strategy: u8,
86 reload: bool,
87 referrer: Option<Pubkey>,
88 pooled: bool,
89 is_new_miner: bool,
90) -> Instruction {
91 let automation_address = automation_pda(authority).0;
92 let miner_address = miner_pda(authority).0;
93 let config_address = config_pda().0;
94 let referrer_pk = referrer.unwrap_or(Pubkey::default());
95
96 let mut accounts = vec![
97 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(automation_address, false), AccountMeta::new(executor, false), AccountMeta::new(miner_address, false), AccountMeta::new_readonly(system_program::ID, false), AccountMeta::new_readonly(crate::ID, false), AccountMeta::new_readonly(config_address, false), ];
106
107 if is_new_miner && referrer.is_some() && referrer_pk != Pubkey::default() {
112 let referral_address = referral_pda(referrer_pk).0;
113 accounts.push(AccountMeta::new(referral_address, false));
114 }
115
116 Instruction {
117 program_id: crate::ID,
118 accounts,
119 data: Automate {
120 amount: amount.to_le_bytes(),
121 deposit: deposit.to_le_bytes(),
122 fee: fee.to_le_bytes(),
123 mask: mask.to_le_bytes(),
124 strategy: strategy as u8,
125 reload: (reload as u64).to_le_bytes(),
126 referrer: referrer_pk.to_bytes(),
127 pooled: pooled as u8,
128 }
129 .to_bytes(),
130 }
131}
132
133pub fn claim_sol(
141 signer: Pubkey,
142 referrer_miner: Option<Pubkey>, referrer_referral: Option<Pubkey>, ) -> Instruction {
145 let miner_address = miner_pda(signer).0;
146
147 let mut accounts = vec![
148 AccountMeta::new(signer, true),
149 AccountMeta::new(miner_address, false),
150 AccountMeta::new_readonly(system_program::ID, false),
151 ];
152
153 if let (Some(miner_pubkey), Some(referral_pubkey)) = (referrer_miner, referrer_referral) {
155 accounts.push(AccountMeta::new(miner_pubkey, false));
156 accounts.push(AccountMeta::new(referral_pubkey, false));
157 }
158
159 Instruction {
160 program_id: crate::ID,
161 accounts,
162 data: ClaimSOL {}.to_bytes(),
163 }
164}
165
166pub fn claim_oil(
176 signer: Pubkey,
177 referrer_miner: Option<Pubkey>, referrer_referral: Option<Pubkey>, referrer_referral_oil_ata: Option<Pubkey>, ) -> Instruction {
181 let miner_address = miner_pda(signer).0;
182 let treasury_address = treasury_pda().0;
183 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
184 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
185
186 let mut accounts = vec![
187 AccountMeta::new(signer, true),
188 AccountMeta::new(miner_address, false),
189 AccountMeta::new(MINT_ADDRESS, false),
190 AccountMeta::new(recipient_address, false),
191 AccountMeta::new(treasury_address, false),
192 AccountMeta::new(treasury_tokens_address, false),
193 AccountMeta::new_readonly(system_program::ID, false),
194 AccountMeta::new_readonly(spl_token::ID, false),
195 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
196 ];
197
198 if let (Some(miner_pubkey), Some(referral_pubkey), Some(oil_ata_pubkey)) =
200 (referrer_miner, referrer_referral, referrer_referral_oil_ata) {
201 accounts.push(AccountMeta::new(miner_pubkey, false));
202 accounts.push(AccountMeta::new(referral_pubkey, false));
203 accounts.push(AccountMeta::new(oil_ata_pubkey, false));
204 }
205
206 Instruction {
207 program_id: crate::ID,
208 accounts,
209 data: ClaimOIL {}.to_bytes(),
210 }
211}
212
213
214pub fn close(signer: Pubkey, round_id: u64, rent_payer: Pubkey) -> Instruction {
215 let board_address = board_pda().0;
216 let round_address = round_pda(round_id).0;
217 let treasury_address = TREASURY_ADDRESS;
218 Instruction {
219 program_id: crate::ID,
220 accounts: vec![
221 AccountMeta::new(signer, true),
222 AccountMeta::new(board_address, false),
223 AccountMeta::new(rent_payer, false),
224 AccountMeta::new(round_address, false),
225 AccountMeta::new(treasury_address, false),
226 AccountMeta::new_readonly(system_program::ID, false),
227 ],
228 data: Close {}.to_bytes(),
229 }
230}
231
232pub fn deploy(
244 signer: Pubkey,
245 authority: Pubkey,
246 amount: u64,
247 round_id: u64,
248 squares: [bool; 25],
249 referrer: Option<Pubkey>,
250 pooled: bool,
251) -> Instruction {
252 let automation_address = automation_pda(authority).0;
253 let board_address = board_pda().0;
254 let config_address = config_pda().0;
255 let miner_address = miner_pda(authority).0;
256 let round_address = round_pda(round_id).0;
257 let entropy_var_address = entropy_rng_api::state::var_pda(board_address, 0).0;
258
259 let mut mask: u32 = 0;
262 for (i, &square) in squares.iter().enumerate() {
263 if square {
264 mask |= 1 << i;
265 }
266 }
267
268 let referrer_pubkey = referrer.unwrap_or(Pubkey::default());
270 let referrer_bytes = referrer_pubkey.to_bytes();
271
272 let user_wrapped_sol_ata = get_associated_token_address(&authority, &SOL_MINT);
274 let round_wrapped_sol_ata = get_associated_token_address(&round_address, &SOL_MINT);
275
276 let mut accounts = vec![
280 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), ];
297
298 if referrer_pubkey != Pubkey::default() {
300 let referral_address = referral_pda(referrer_pubkey).0;
301 accounts.push(AccountMeta::new(referral_address, false)); }
303
304 accounts.push(AccountMeta::new(entropy_var_address, false)); accounts.push(AccountMeta::new_readonly(entropy_rng_api::ID, false)); Instruction {
309 program_id: crate::ID,
310 accounts,
311 data: Deploy {
312 amount: amount.to_le_bytes(),
313 squares: mask.to_le_bytes(),
314 referrer: referrer_bytes,
315 pooled: if pooled { 1 } else { 0 },
316 }
317 .to_bytes(),
318 }
319}
320
321pub fn deploy_auto(
332 signer: Pubkey,
333 authority: Pubkey,
334 amount: u64,
335 round_id: u64,
336 squares: [bool; 25],
337 referrer: Option<Pubkey>,
338 pooled: bool,
339) -> Instruction {
340 let automation_address = automation_pda(authority).0;
341 let board_address = board_pda().0;
342 let config_address = config_pda().0;
343 let miner_address = miner_pda(authority).0;
344 let round_address = round_pda(round_id).0;
345 let entropy_var_address = entropy_rng_api::state::var_pda(board_address, 0).0;
346
347 let mut mask: u32 = 0;
350 for (i, &square) in squares.iter().enumerate() {
351 if square {
352 mask |= 1 << i;
353 }
354 }
355
356 let referrer_pubkey = referrer.unwrap_or(Pubkey::default());
358 let referrer_bytes = referrer_pubkey.to_bytes();
359
360 let mut accounts = vec![
365 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), ];
380
381 if referrer_pubkey != Pubkey::default() {
383 let referral_address = referral_pda(referrer_pubkey).0;
384 accounts.push(AccountMeta::new(referral_address, false)); }
386
387 accounts.push(AccountMeta::new(entropy_var_address, false)); accounts.push(AccountMeta::new_readonly(entropy_rng_api::ID, false)); Instruction {
392 program_id: crate::ID,
393 accounts,
394 data: Deploy {
395 amount: amount.to_le_bytes(),
396 squares: mask.to_le_bytes(),
397 referrer: referrer_bytes,
398 pooled: if pooled { 1 } else { 0 },
399 }
400 .to_bytes(),
401 }
402}
403
404pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
407 let board_address = board_pda().0;
408 let config_address = config_pda().0;
409 let mint_address = MINT_ADDRESS;
410 let treasury_address = TREASURY_ADDRESS;
411 let treasury_oil_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
412 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
413 let mut accounts = vec![
414 AccountMeta::new(signer, true),
415 AccountMeta::new(board_address, false),
416 AccountMeta::new_readonly(config_address, false),
417 AccountMeta::new(mint_address, false),
418 AccountMeta::new(treasury_address, false),
419 AccountMeta::new(treasury_oil_address, false),
420 AccountMeta::new(treasury_sol_address, false),
421 AccountMeta::new_readonly(spl_token::ID, false),
422 AccountMeta::new_readonly(crate::ID, false),
423 ];
424 for account in swap_accounts.iter() {
425 let mut acc_clone = account.clone();
426 acc_clone.is_signer = false;
427 accounts.push(acc_clone);
428 }
429 let mut data = Buyback {}.to_bytes();
430 data.extend_from_slice(swap_data);
431 Instruction {
432 program_id: crate::ID,
433 accounts,
434 data,
435 }
436}
437
438pub fn reset(
441 signer: Pubkey,
442 fee_collector: Pubkey,
443 round_id: u64,
444 top_miner: Pubkey,
445 var_address: Pubkey,
446) -> Instruction {
447 reset_with_miners(signer, fee_collector, round_id, top_miner, var_address, &[])
448}
449
450pub fn reset_with_miners(
451 signer: Pubkey,
452 fee_collector: Pubkey,
453 round_id: u64,
454 top_miner: Pubkey,
455 var_address: Pubkey,
456 miner_accounts: &[Pubkey],
457) -> Instruction {
458 let board_address = board_pda().0;
459 let config_address = config_pda().0;
460 let mint_address = MINT_ADDRESS;
461 let round_address = round_pda(round_id).0;
462 let round_next_address = round_pda(round_id + 1).0;
463 let top_miner_address = miner_pda(top_miner).0;
464 let treasury_address = TREASURY_ADDRESS;
465 let treasury_tokens_address = treasury_tokens_address();
466 let pool_address = pool_pda().0;
467 let mint_authority_address = oil_mint_api::state::authority_pda().0;
468 let mut reset_instruction = Instruction {
469 program_id: crate::ID,
470 accounts: vec![
471 AccountMeta::new(signer, true),
472 AccountMeta::new(board_address, false),
473 AccountMeta::new(config_address, false),
474 AccountMeta::new(fee_collector, false),
475 AccountMeta::new(mint_address, false),
476 AccountMeta::new(round_address, false),
477 AccountMeta::new(round_next_address, false),
478 AccountMeta::new(top_miner_address, false),
479 AccountMeta::new(treasury_address, false),
480 AccountMeta::new(pool_address, false),
481 AccountMeta::new(treasury_tokens_address, false),
482 AccountMeta::new_readonly(system_program::ID, false),
483 AccountMeta::new_readonly(spl_token::ID, false),
484 AccountMeta::new_readonly(crate::ID, false),
485 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
486 AccountMeta::new_readonly(SOL_MINT, false),
487 AccountMeta::new(var_address, false),
489 AccountMeta::new_readonly(entropy_rng_api::ID, false),
490 AccountMeta::new(mint_authority_address, false),
492 AccountMeta::new_readonly(oil_mint_api::ID, false),
493 ],
494 data: Reset {}.to_bytes(),
495 };
496
497 for miner_pubkey in miner_accounts {
499 reset_instruction.accounts.push(AccountMeta::new(
500 miner_pda(*miner_pubkey).0,
501 false,
502 ));
503 }
504
505 reset_instruction
506}
507
508pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
511 let miner_address = miner_pda(authority).0;
512 let board_address = board_pda().0;
513 let round_address = round_pda(round_id).0;
514 let treasury_address = TREASURY_ADDRESS;
515 Instruction {
516 program_id: crate::ID,
517 accounts: vec![
518 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(board_address, false),
521 AccountMeta::new(miner_address, false),
522 AccountMeta::new(round_address, false),
523 AccountMeta::new(treasury_address, false),
524 AccountMeta::new_readonly(system_program::ID, false),
525 ],
526 data: Checkpoint {}.to_bytes(),
527 }
528}
529
530pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
531 let config_address = config_pda().0;
532 Instruction {
533 program_id: crate::ID,
534 accounts: vec![
535 AccountMeta::new(signer, true),
536 AccountMeta::new(config_address, false),
537 AccountMeta::new_readonly(system_program::ID, false),
538 ],
539 data: SetAdmin {
540 admin: admin.to_bytes(),
541 }
542 .to_bytes(),
543 }
544}
545
546pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
547 let config_address = config_pda().0;
548 Instruction {
549 program_id: crate::ID,
550 accounts: vec![
551 AccountMeta::new(signer, true),
552 AccountMeta::new(config_address, false),
553 AccountMeta::new_readonly(system_program::ID, false),
554 ],
555 data: SetAdminFee {
556 admin_fee: admin_fee.to_le_bytes(),
557 }
558 .to_bytes(),
559 }
560}
561
562pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
563 let config_address = config_pda().0;
564 Instruction {
565 program_id: crate::ID,
566 accounts: vec![
567 AccountMeta::new(signer, true),
568 AccountMeta::new(config_address, false),
569 AccountMeta::new_readonly(system_program::ID, false),
570 ],
571 data: SetFeeCollector {
572 fee_collector: fee_collector.to_bytes(),
573 }
574 .to_bytes(),
575 }
576}
577
578pub fn set_tge_timestamp(signer: Pubkey, tge_timestamp: i64) -> Instruction {
583 let config_address = config_pda().0;
584 Instruction {
585 program_id: crate::ID,
586 accounts: vec![
587 AccountMeta::new(signer, true),
588 AccountMeta::new(config_address, false),
589 AccountMeta::new_readonly(system_program::ID, false),
590 ],
591 data: SetTgeTimestamp {
592 tge_timestamp: tge_timestamp.to_le_bytes(),
593 }
594 .to_bytes(),
595 }
596}
597
598pub fn set_auction(
599 signer: Pubkey,
600 halving_period_seconds: u64,
601 last_halving_time: u64,
602 base_mining_rates: [u64; 4],
603 auction_duration_seconds: u64,
604 starting_prices: [u64; 4],
605 _well_id: u64, ) -> Instruction {
607 let config_address = config_pda().0;
608 let auction_address = auction_pda().0;
609
610 Instruction {
611 program_id: crate::ID,
612 accounts: vec![
613 AccountMeta::new(signer, true),
614 AccountMeta::new_readonly(config_address, false),
615 AccountMeta::new(auction_address, false),
616 ],
617 data: SetAuction {
618 halving_period_seconds: halving_period_seconds.to_le_bytes(),
619 last_halving_time: last_halving_time.to_le_bytes(),
620 base_mining_rates: [
621 base_mining_rates[0].to_le_bytes(),
622 base_mining_rates[1].to_le_bytes(),
623 base_mining_rates[2].to_le_bytes(),
624 base_mining_rates[3].to_le_bytes(),
625 ],
626 auction_duration_seconds: auction_duration_seconds.to_le_bytes(),
627 starting_prices: [
628 starting_prices[0].to_le_bytes(),
629 starting_prices[1].to_le_bytes(),
630 starting_prices[2].to_le_bytes(),
631 starting_prices[3].to_le_bytes(),
632 ],
633 well_id: 4u64.to_le_bytes(), }
635 .to_bytes(),
636 }
637}
638
639pub fn deposit(signer: Pubkey, authority: Pubkey, amount: u64, lock_duration_days: u64, stake_id: u64) -> Instruction {
642 let mint_address = MINT_ADDRESS;
643 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
645 let sender_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
647 let pool_tokens_address = pool_tokens_address();
648 let miner_address = miner_pda(authority).0; Instruction {
650 program_id: crate::ID,
651 accounts: vec![
652 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(mint_address, false),
655 AccountMeta::new(sender_address, false),
656 AccountMeta::new(stake_address, false),
657 AccountMeta::new(stake_tokens_address, false),
658 AccountMeta::new(pool_address, false),
659 AccountMeta::new(pool_tokens_address, false),
660 AccountMeta::new(miner_address, false),
661 AccountMeta::new_readonly(system_program::ID, false),
662 AccountMeta::new_readonly(spl_token::ID, false),
663 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
664 ],
665 data: Deposit {
666 amount: amount.to_le_bytes(),
667 lock_duration_days: lock_duration_days.to_le_bytes(),
668 stake_id: stake_id.to_le_bytes(),
669 }
670 .to_bytes(),
671 }
672}
673
674pub fn withdraw(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
677 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
679 let mint_address = MINT_ADDRESS;
680 let recipient_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
682 let pool_tokens_address = pool_tokens_address();
683 let miner_address = miner_pda(authority).0; Instruction {
685 program_id: crate::ID,
686 accounts: vec![
687 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(mint_address, false),
690 AccountMeta::new(recipient_address, false),
691 AccountMeta::new(stake_address, false),
692 AccountMeta::new(stake_tokens_address, false),
693 AccountMeta::new(pool_address, false),
694 AccountMeta::new(pool_tokens_address, false),
695 AccountMeta::new(miner_address, false),
696 AccountMeta::new_readonly(system_program::ID, false),
697 AccountMeta::new_readonly(spl_token::ID, false),
698 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
699 ],
700 data: Withdraw {
701 amount: amount.to_le_bytes(),
702 stake_id: stake_id.to_le_bytes(),
703 }
704 .to_bytes(),
705 }
706}
707
708pub fn reload_sol(
718 signer: Pubkey,
719 authority: Pubkey,
720 referrer_miner: Option<Pubkey>,
721 referrer_referral: Option<Pubkey>,
722) -> Instruction {
723 let automation_address = automation_pda(authority).0;
724 let miner_address = miner_pda(authority).0;
725
726 let mut accounts = vec![
727 AccountMeta::new(signer, true),
728 AccountMeta::new(automation_address, false),
729 AccountMeta::new(miner_address, false),
730 AccountMeta::new_readonly(system_program::ID, false),
731 ];
732
733 if let (Some(miner_ref), Some(referral_ref)) = (referrer_miner, referrer_referral) {
735 accounts.push(AccountMeta::new(miner_ref, false));
736 accounts.push(AccountMeta::new(referral_ref, false));
737 }
738
739 Instruction {
740 program_id: crate::ID,
741 accounts,
742 data: ReloadSOL {}.to_bytes(),
743 }
744}
745
746pub fn claim_yield(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
750 let stake_address = stake_pda_with_id(authority, stake_id).0; let pool_address = pool_pda().0;
752 Instruction {
753 program_id: crate::ID,
754 accounts: vec![
755 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(stake_address, false),
758 AccountMeta::new(pool_address, false),
759 AccountMeta::new_readonly(system_program::ID, false),
760 ],
761 data: ClaimYield {
762 amount: amount.to_le_bytes(),
763 }
764 .to_bytes(),
765 }
766}
767
768pub fn new_var(
769 signer: Pubkey,
770 provider: Pubkey,
771 id: u64,
772 commit: [u8; 32],
773 samples: u64,
774) -> Instruction {
775 let board_address = board_pda().0;
776 let config_address = config_pda().0;
777 let var_address = entropy_rng_api::state::var_pda(board_address, id).0;
778 Instruction {
779 program_id: crate::ID,
780 accounts: vec![
781 AccountMeta::new(signer, true),
782 AccountMeta::new(board_address, false),
783 AccountMeta::new(config_address, false),
784 AccountMeta::new(provider, false),
785 AccountMeta::new(var_address, false),
786 AccountMeta::new_readonly(system_program::ID, false),
787 AccountMeta::new_readonly(entropy_rng_api::ID, false),
788 ],
789 data: NewVar {
790 id: id.to_le_bytes(),
791 commit: commit,
792 samples: samples.to_le_bytes(),
793 }
794 .to_bytes(),
795 }
796}
797
798pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
799 let config_address = config_pda().0;
800 Instruction {
801 program_id: crate::ID,
802 accounts: vec![
803 AccountMeta::new(signer, true),
804 AccountMeta::new(config_address, false),
805 AccountMeta::new_readonly(new_program, false),
806 ],
807 data: SetSwapProgram {}.to_bytes(),
808 }
809}
810
811pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
812 let board_address = board_pda().0;
813 let config_address = config_pda().0;
814 Instruction {
815 program_id: crate::ID,
816 accounts: vec![
817 AccountMeta::new(signer, true),
818 AccountMeta::new(board_address, false),
819 AccountMeta::new(config_address, false),
820 AccountMeta::new(new_var_address, false),
821 ],
822 data: SetVarAddress {}.to_bytes(),
823 }
824}
825
826pub fn migrate(signer: Pubkey) -> Instruction {
831 let config_address = config_pda().0;
832 let treasury_address = treasury_pda().0;
833 Instruction {
834 program_id: crate::ID,
835 accounts: vec![
836 AccountMeta::new(signer, true),
837 AccountMeta::new(config_address, false),
838 AccountMeta::new(treasury_address, false),
839 AccountMeta::new_readonly(system_program::ID, false),
840 ],
841 data: Migrate {}.to_bytes(),
842 }
843}
844
845pub fn create_referral(signer: Pubkey) -> Instruction {
847 let referral_address = referral_pda(signer).0;
848 Instruction {
849 program_id: crate::ID,
850 accounts: vec![
851 AccountMeta::new(signer, true),
852 AccountMeta::new(referral_address, false),
853 AccountMeta::new_readonly(system_program::ID, false),
854 ],
855 data: CreateReferral {}.to_bytes(),
856 }
857}
858
859pub fn create_whitelist(
863 signer: Pubkey,
864 code_hash: [u8; 32],
865) -> Instruction {
866 let config_address = config_pda().0;
867 let (whitelist_address, _) = Whitelist::pda(code_hash);
868 Instruction {
869 program_id: crate::ID,
870 accounts: vec![
871 AccountMeta::new(signer, true), AccountMeta::new_readonly(config_address, false), AccountMeta::new(whitelist_address, false), AccountMeta::new_readonly(system_program::ID, false), ],
876 data: CreateWhitelist {
877 code_hash,
878 }
879 .to_bytes(),
880 }
881}
882
883pub fn claim_referral(signer: Pubkey, authority: Pubkey) -> Instruction {
888 let referral_address = referral_pda(authority).0;
889 let referral_oil_address = get_associated_token_address(&referral_address, &MINT_ADDRESS);
890 let recipient_oil_address = get_associated_token_address(&authority, &MINT_ADDRESS);
891 Instruction {
892 program_id: crate::ID,
893 accounts: vec![
894 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), ],
904 data: ClaimReferral {}.to_bytes(),
905 }
906}
907
908pub fn place_bid(
917 signer: Pubkey,
918 authority: Pubkey,
919 square_id: u64,
920 fee_collector: Pubkey,
921 previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, referrer: Option<Pubkey>, ) -> Instruction {
925 let well_address = well_pda(square_id).0;
926 let auction_address = auction_pda().0;
927 let treasury_address = treasury_pda().0;
928 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
929 let staking_pool_address = pool_pda().0;
930 let config_address = config_pda().0;
931 let mint_authority_address = oil_mint_api::state::authority_pda().0;
932 let bidder_miner_address = miner_pda(authority).0;
933
934 let mut accounts = vec![
935 AccountMeta::new(signer, true), AccountMeta::new(authority, false), ];
938
939 accounts.extend_from_slice(&[
943 AccountMeta::new(well_address, false), AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
946 AccountMeta::new(treasury_tokens_address, false),
947 AccountMeta::new(MINT_ADDRESS, false),
948 AccountMeta::new(mint_authority_address, false),
949 AccountMeta::new_readonly(oil_mint_api::ID, false),
950 AccountMeta::new(staking_pool_address, false),
951 AccountMeta::new(fee_collector, false),
952 AccountMeta::new_readonly(config_address, false),
953 AccountMeta::new_readonly(spl_token::ID, false),
954 AccountMeta::new_readonly(system_program::ID, false),
955 AccountMeta::new_readonly(crate::ID, false), AccountMeta::new(bidder_miner_address, false), ]);
958
959 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
961 accounts.push(AccountMeta::new(miner_pubkey, false)); accounts.push(AccountMeta::new(owner_pubkey, false)); }
964
965 if let Some(referrer_pubkey) = referrer {
967 let referral_address = referral_pda(referrer_pubkey).0;
968 accounts.push(AccountMeta::new(referral_address, false)); }
970
971 Instruction {
978 program_id: crate::ID,
979 accounts,
980 data: instruction::PlaceBid {
981 square_id: square_id.to_le_bytes(),
982 referrer: referrer.unwrap_or(Pubkey::default()).to_bytes(),
983 }
984 .to_bytes(),
985 }
986}
987
988pub fn claim_auction_oil(
995 signer: Pubkey,
996 well_mask: u8, well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1001 let miner_address = miner_pda(signer).0;
1002 let auction_address = auction_pda().0;
1003 let treasury_address = treasury_pda().0;
1004 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
1005 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
1006 let mint_authority_address = oil_mint_api::state::authority_pda().0;
1007
1008 let mut accounts = vec![
1009 AccountMeta::new(signer, true),
1010 AccountMeta::new(miner_address, false),
1011 ];
1012
1013 for well_opt in well_accounts.iter() {
1015 if let Some(well_pubkey) = well_opt {
1016 accounts.push(AccountMeta::new(*well_pubkey, false));
1017 } else {
1018 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1020 }
1021 }
1022
1023 if let Some(auction_pool_pdas) = auction_pool_accounts {
1025 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1026 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1027 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1028 } else {
1029 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1031 }
1032 }
1033 } else {
1034 for _ in 0..4 {
1036 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1037 }
1038 }
1039
1040 accounts.extend_from_slice(&[
1041 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1043 AccountMeta::new(treasury_tokens_address, false),
1044 AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(mint_authority_address, false), AccountMeta::new_readonly(oil_mint_api::ID, false),
1047 AccountMeta::new(recipient_address, false),
1048 AccountMeta::new_readonly(spl_token::ID, false),
1049 AccountMeta::new_readonly(spl_associated_token_account::ID, 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: ClaimAuctionOIL {
1067 well_mask,
1068 }
1069 .to_bytes(),
1070 }
1071}
1072
1073pub fn claim_auction_sol(
1080 signer: Pubkey,
1081 well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1085 let miner_address = miner_pda(signer).0;
1086 let (auction_address, _) = auction_pda();
1087 let treasury_address = treasury_pda().0;
1088
1089 let mut accounts = vec![
1090 AccountMeta::new(signer, true),
1091 AccountMeta::new(miner_address, false),
1092 ];
1093
1094 for well_opt in well_accounts.iter() {
1096 if let Some(well_pubkey) = well_opt {
1097 accounts.push(AccountMeta::new(*well_pubkey, false));
1098 } else {
1099 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1101 }
1102 }
1103
1104 if let Some(auction_pool_pdas) = auction_pool_accounts {
1106 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1107 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1108 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1109 } else {
1110 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1112 }
1113 }
1114 } else {
1115 for _ in 0..4 {
1117 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1118 }
1119 }
1120
1121 accounts.extend_from_slice(&[
1122 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1124 AccountMeta::new_readonly(system_program::ID, false),
1125 AccountMeta::new_readonly(crate::ID, false), ]);
1127
1128 if let Some(bid_pdas) = bid_accounts {
1130 for bid_pda_opt in bid_pdas.iter() {
1131 if let Some(bid_pubkey) = bid_pda_opt {
1132 accounts.push(AccountMeta::new(*bid_pubkey, false));
1133 }
1134 }
1135 }
1136
1137 Instruction {
1138 program_id: crate::ID,
1139 accounts,
1140 data: ClaimAuctionSOL {
1141 _reserved: 0,
1142 }
1143 .to_bytes(),
1144 }
1145}
1146
1147pub fn claim_seeker(signer: Pubkey, mint: Pubkey) -> Instruction {
1148 let seeker_address = seeker_pda(mint).0;
1149 let token_account_address = get_associated_token_address(&signer, &mint);
1150 Instruction {
1151 program_id: crate::ID,
1152 accounts: vec![
1153 AccountMeta::new(signer, true),
1154 AccountMeta::new_readonly(mint, false),
1155 AccountMeta::new(seeker_address, false),
1156 AccountMeta::new(token_account_address, false),
1157 AccountMeta::new_readonly(system_program::ID, false),
1158 ],
1159 data: ClaimSeeker {}.to_bytes(),
1160 }
1161}