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![
339 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), ];
354
355 if referrer_pubkey != Pubkey::default() {
357 let referral_address = referral_pda(referrer_pubkey).0;
358 accounts.push(AccountMeta::new(referral_address, false)); }
360
361 accounts.push(AccountMeta::new(entropy_var_address, false)); accounts.push(AccountMeta::new_readonly(entropy_rng_api::ID, false)); Instruction {
366 program_id: crate::ID,
367 accounts,
368 data: Deploy {
369 amount: amount.to_le_bytes(),
370 squares: mask.to_le_bytes(),
371 referrer: referrer_bytes,
372 pooled: if pooled { 1 } else { 0 },
373 }
374 .to_bytes(),
375 }
376}
377
378pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
381 let board_address = board_pda().0;
382 let config_address = config_pda().0;
383 let mint_address = MINT_ADDRESS;
384 let treasury_address = TREASURY_ADDRESS;
385 let treasury_oil_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
386 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
387 let mut accounts = vec![
388 AccountMeta::new(signer, true),
389 AccountMeta::new(board_address, false),
390 AccountMeta::new_readonly(config_address, false),
391 AccountMeta::new(mint_address, false),
392 AccountMeta::new(treasury_address, false),
393 AccountMeta::new(treasury_oil_address, false),
394 AccountMeta::new(treasury_sol_address, false),
395 AccountMeta::new_readonly(spl_token::ID, false),
396 AccountMeta::new_readonly(crate::ID, false),
397 ];
398 for account in swap_accounts.iter() {
399 let mut acc_clone = account.clone();
400 acc_clone.is_signer = false;
401 accounts.push(acc_clone);
402 }
403 let mut data = Buyback {}.to_bytes();
404 data.extend_from_slice(swap_data);
405 Instruction {
406 program_id: crate::ID,
407 accounts,
408 data,
409 }
410}
411
412pub fn reset(
415 signer: Pubkey,
416 fee_collector: Pubkey,
417 round_id: u64,
418 top_miner: Pubkey,
419 var_address: Pubkey,
420) -> Instruction {
421 reset_with_miners(signer, fee_collector, round_id, top_miner, var_address, &[])
422}
423
424pub fn reset_with_miners(
425 signer: Pubkey,
426 fee_collector: Pubkey,
427 round_id: u64,
428 top_miner: Pubkey,
429 var_address: Pubkey,
430 miner_accounts: &[Pubkey],
431) -> Instruction {
432 let board_address = board_pda().0;
433 let config_address = config_pda().0;
434 let mint_address = MINT_ADDRESS;
435 let round_address = round_pda(round_id).0;
436 let round_next_address = round_pda(round_id + 1).0;
437 let top_miner_address = miner_pda(top_miner).0;
438 let treasury_address = TREASURY_ADDRESS;
439 let treasury_tokens_address = treasury_tokens_address();
440 let pool_address = pool_pda().0;
441 let mint_authority_address = oil_mint_api::state::authority_pda().0;
442 let mut reset_instruction = Instruction {
443 program_id: crate::ID,
444 accounts: vec![
445 AccountMeta::new(signer, true),
446 AccountMeta::new(board_address, false),
447 AccountMeta::new(config_address, false),
448 AccountMeta::new(fee_collector, false),
449 AccountMeta::new(mint_address, false),
450 AccountMeta::new(round_address, false),
451 AccountMeta::new(round_next_address, false),
452 AccountMeta::new(top_miner_address, false),
453 AccountMeta::new(treasury_address, false),
454 AccountMeta::new(pool_address, false),
455 AccountMeta::new(treasury_tokens_address, false),
456 AccountMeta::new_readonly(system_program::ID, false),
457 AccountMeta::new_readonly(spl_token::ID, false),
458 AccountMeta::new_readonly(crate::ID, false),
459 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
460 AccountMeta::new(var_address, false),
462 AccountMeta::new_readonly(entropy_rng_api::ID, false),
463 AccountMeta::new(mint_authority_address, false),
465 AccountMeta::new_readonly(oil_mint_api::ID, false),
466 ],
467 data: Reset {}.to_bytes(),
468 };
469
470 for miner_pubkey in miner_accounts {
472 reset_instruction.accounts.push(AccountMeta::new(
473 miner_pda(*miner_pubkey).0,
474 false,
475 ));
476 }
477
478 reset_instruction
479}
480
481pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
484 let miner_address = miner_pda(authority).0;
485 let board_address = board_pda().0;
486 let round_address = round_pda(round_id).0;
487 let treasury_address = TREASURY_ADDRESS;
488 Instruction {
489 program_id: crate::ID,
490 accounts: vec![
491 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(board_address, false),
494 AccountMeta::new(miner_address, false),
495 AccountMeta::new(round_address, false),
496 AccountMeta::new(treasury_address, false),
497 AccountMeta::new_readonly(system_program::ID, false),
498 ],
499 data: Checkpoint {}.to_bytes(),
500 }
501}
502
503pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
504 let config_address = config_pda().0;
505 Instruction {
506 program_id: crate::ID,
507 accounts: vec![
508 AccountMeta::new(signer, true),
509 AccountMeta::new(config_address, false),
510 AccountMeta::new_readonly(system_program::ID, false),
511 ],
512 data: SetAdmin {
513 admin: admin.to_bytes(),
514 }
515 .to_bytes(),
516 }
517}
518
519pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
520 let config_address = config_pda().0;
521 Instruction {
522 program_id: crate::ID,
523 accounts: vec![
524 AccountMeta::new(signer, true),
525 AccountMeta::new(config_address, false),
526 AccountMeta::new_readonly(system_program::ID, false),
527 ],
528 data: SetAdminFee {
529 admin_fee: admin_fee.to_le_bytes(),
530 }
531 .to_bytes(),
532 }
533}
534
535pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
536 let config_address = config_pda().0;
537 Instruction {
538 program_id: crate::ID,
539 accounts: vec![
540 AccountMeta::new(signer, true),
541 AccountMeta::new(config_address, false),
542 AccountMeta::new_readonly(system_program::ID, false),
543 ],
544 data: SetFeeCollector {
545 fee_collector: fee_collector.to_bytes(),
546 }
547 .to_bytes(),
548 }
549}
550
551pub fn set_auction(
552 signer: Pubkey,
553 halving_period_seconds: u64,
554 last_halving_time: u64,
555 base_mining_rates: [u64; 4],
556 auction_duration_seconds: u64,
557 starting_prices: [u64; 4],
558 _well_id: u64, ) -> Instruction {
560 let config_address = config_pda().0;
561 let auction_address = auction_pda().0;
562
563 Instruction {
564 program_id: crate::ID,
565 accounts: vec![
566 AccountMeta::new(signer, true),
567 AccountMeta::new_readonly(config_address, false),
568 AccountMeta::new(auction_address, false),
569 ],
570 data: SetAuction {
571 halving_period_seconds: halving_period_seconds.to_le_bytes(),
572 last_halving_time: last_halving_time.to_le_bytes(),
573 base_mining_rates: [
574 base_mining_rates[0].to_le_bytes(),
575 base_mining_rates[1].to_le_bytes(),
576 base_mining_rates[2].to_le_bytes(),
577 base_mining_rates[3].to_le_bytes(),
578 ],
579 auction_duration_seconds: auction_duration_seconds.to_le_bytes(),
580 starting_prices: [
581 starting_prices[0].to_le_bytes(),
582 starting_prices[1].to_le_bytes(),
583 starting_prices[2].to_le_bytes(),
584 starting_prices[3].to_le_bytes(),
585 ],
586 well_id: 4u64.to_le_bytes(), }
588 .to_bytes(),
589 }
590}
591
592pub fn deposit(signer: Pubkey, authority: Pubkey, amount: u64, lock_duration_days: u64, stake_id: u64) -> Instruction {
595 let mint_address = MINT_ADDRESS;
596 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
598 let sender_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
600 let pool_tokens_address = pool_tokens_address();
601 let miner_address = miner_pda(authority).0; Instruction {
603 program_id: crate::ID,
604 accounts: vec![
605 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(mint_address, false),
608 AccountMeta::new(sender_address, false),
609 AccountMeta::new(stake_address, false),
610 AccountMeta::new(stake_tokens_address, false),
611 AccountMeta::new(pool_address, false),
612 AccountMeta::new(pool_tokens_address, false),
613 AccountMeta::new(miner_address, false),
614 AccountMeta::new_readonly(system_program::ID, false),
615 AccountMeta::new_readonly(spl_token::ID, false),
616 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
617 ],
618 data: Deposit {
619 amount: amount.to_le_bytes(),
620 lock_duration_days: lock_duration_days.to_le_bytes(),
621 stake_id: stake_id.to_le_bytes(),
622 }
623 .to_bytes(),
624 }
625}
626
627pub fn withdraw(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
630 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
632 let mint_address = MINT_ADDRESS;
633 let recipient_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
635 let pool_tokens_address = pool_tokens_address();
636 let miner_address = miner_pda(authority).0; Instruction {
638 program_id: crate::ID,
639 accounts: vec![
640 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(mint_address, false),
643 AccountMeta::new(recipient_address, false),
644 AccountMeta::new(stake_address, false),
645 AccountMeta::new(stake_tokens_address, false),
646 AccountMeta::new(pool_address, false),
647 AccountMeta::new(pool_tokens_address, false),
648 AccountMeta::new(miner_address, false),
649 AccountMeta::new_readonly(system_program::ID, false),
650 AccountMeta::new_readonly(spl_token::ID, false),
651 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
652 ],
653 data: Withdraw {
654 amount: amount.to_le_bytes(),
655 stake_id: stake_id.to_le_bytes(),
656 }
657 .to_bytes(),
658 }
659}
660
661pub fn reload_sol(
671 signer: Pubkey,
672 authority: Pubkey,
673 referrer_miner: Option<Pubkey>,
674 referrer_referral: Option<Pubkey>,
675) -> Instruction {
676 let automation_address = automation_pda(authority).0;
677 let miner_address = miner_pda(authority).0;
678
679 let mut accounts = vec![
680 AccountMeta::new(signer, true),
681 AccountMeta::new(automation_address, false),
682 AccountMeta::new(miner_address, false),
683 AccountMeta::new_readonly(system_program::ID, false),
684 ];
685
686 if let (Some(miner_ref), Some(referral_ref)) = (referrer_miner, referrer_referral) {
688 accounts.push(AccountMeta::new(miner_ref, false));
689 accounts.push(AccountMeta::new(referral_ref, false));
690 }
691
692 Instruction {
693 program_id: crate::ID,
694 accounts,
695 data: ReloadSOL {}.to_bytes(),
696 }
697}
698
699pub fn claim_yield(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
703 let stake_address = stake_pda_with_id(authority, stake_id).0; let pool_address = pool_pda().0;
705 Instruction {
706 program_id: crate::ID,
707 accounts: vec![
708 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(stake_address, false),
711 AccountMeta::new(pool_address, false),
712 AccountMeta::new_readonly(system_program::ID, false),
713 ],
714 data: ClaimYield {
715 amount: amount.to_le_bytes(),
716 }
717 .to_bytes(),
718 }
719}
720
721pub fn new_var(
722 signer: Pubkey,
723 provider: Pubkey,
724 id: u64,
725 commit: [u8; 32],
726 samples: u64,
727) -> Instruction {
728 let board_address = board_pda().0;
729 let config_address = config_pda().0;
730 let var_address = entropy_rng_api::state::var_pda(board_address, id).0;
731 Instruction {
732 program_id: crate::ID,
733 accounts: vec![
734 AccountMeta::new(signer, true),
735 AccountMeta::new(board_address, false),
736 AccountMeta::new(config_address, false),
737 AccountMeta::new(provider, false),
738 AccountMeta::new(var_address, false),
739 AccountMeta::new_readonly(system_program::ID, false),
740 AccountMeta::new_readonly(entropy_rng_api::ID, false),
741 ],
742 data: NewVar {
743 id: id.to_le_bytes(),
744 commit: commit,
745 samples: samples.to_le_bytes(),
746 }
747 .to_bytes(),
748 }
749}
750
751pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
752 let config_address = config_pda().0;
753 Instruction {
754 program_id: crate::ID,
755 accounts: vec![
756 AccountMeta::new(signer, true),
757 AccountMeta::new(config_address, false),
758 AccountMeta::new_readonly(new_program, false),
759 ],
760 data: SetSwapProgram {}.to_bytes(),
761 }
762}
763
764pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
765 let board_address = board_pda().0;
766 let config_address = config_pda().0;
767 Instruction {
768 program_id: crate::ID,
769 accounts: vec![
770 AccountMeta::new(signer, true),
771 AccountMeta::new(board_address, false),
772 AccountMeta::new(config_address, false),
773 AccountMeta::new(new_var_address, false),
774 ],
775 data: SetVarAddress {}.to_bytes(),
776 }
777}
778
779pub fn migrate(signer: Pubkey, miner_authority: Pubkey) -> Instruction {
782 let miner_address = miner_pda(miner_authority).0;
783 Instruction {
784 program_id: crate::ID,
785 accounts: vec![
786 AccountMeta::new(signer, true),
787 AccountMeta::new(miner_address, false),
788 AccountMeta::new_readonly(system_program::ID, false),
789 ],
790 data: Migrate {}.to_bytes(),
791 }
792}
793
794pub fn create_referral(signer: Pubkey) -> Instruction {
796 let referral_address = referral_pda(signer).0;
797 Instruction {
798 program_id: crate::ID,
799 accounts: vec![
800 AccountMeta::new(signer, true),
801 AccountMeta::new(referral_address, false),
802 AccountMeta::new_readonly(system_program::ID, false),
803 ],
804 data: CreateReferral {}.to_bytes(),
805 }
806}
807
808pub fn claim_referral(signer: Pubkey) -> Instruction {
811 let referral_address = referral_pda(signer).0;
812 let referral_oil_address = get_associated_token_address(&referral_address, &MINT_ADDRESS);
813 let recipient_oil_address = get_associated_token_address(&signer, &MINT_ADDRESS);
814 Instruction {
815 program_id: crate::ID,
816 accounts: vec![
817 AccountMeta::new(signer, true),
818 AccountMeta::new(referral_address, false),
819 AccountMeta::new(referral_oil_address, false), AccountMeta::new(MINT_ADDRESS, false),
821 AccountMeta::new(recipient_oil_address, false), AccountMeta::new_readonly(system_program::ID, false),
823 AccountMeta::new_readonly(spl_token::ID, false),
824 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
825 ],
826 data: ClaimReferral {}.to_bytes(),
827 }
828}
829
830pub fn place_bid(
838 signer: Pubkey,
839 square_id: u64,
840 fee_collector: Pubkey,
841 pool_account: Option<Pubkey>, previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, referrer: Option<Pubkey>, ) -> Instruction {
846 let well_address = well_pda(square_id).0;
847 let auction_address = auction_pda().0;
848 let treasury_address = treasury_pda().0;
849 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
850 let staking_pool_address = pool_pda().0;
851 let config_address = config_pda().0;
852 let mint_authority_address = oil_mint_api::state::authority_pda().0;
853
854 let mut accounts = vec![
855 AccountMeta::new(signer, true),
856 AccountMeta::new(well_address, false),
857 ];
858
859 if let Some(pool_pubkey) = pool_account {
861 accounts.push(AccountMeta::new(pool_pubkey, false));
862 } else {
863 accounts.push(AccountMeta::new_readonly(system_program::ID, false)); }
866
867 accounts.extend_from_slice(&[
868 AccountMeta::new(auction_address, false),
869 AccountMeta::new(treasury_address, false),
870 AccountMeta::new(treasury_tokens_address, false),
871 AccountMeta::new(MINT_ADDRESS, false),
872 AccountMeta::new(mint_authority_address, false),
873 AccountMeta::new_readonly(oil_mint_api::ID, false),
874 AccountMeta::new(staking_pool_address, false),
875 AccountMeta::new(fee_collector, false),
876 AccountMeta::new(config_address, false),
877 AccountMeta::new_readonly(spl_token::ID, false),
878 AccountMeta::new_readonly(system_program::ID, false),
879 AccountMeta::new_readonly(crate::ID, false), ]);
881
882 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
884 accounts.push(AccountMeta::new(miner_pubkey, false));
885 accounts.push(AccountMeta::new(owner_pubkey, false));
886 }
887
888 if let Some(referrer_pubkey) = referrer {
890 let referral_address = referral_pda(referrer_pubkey).0;
891 accounts.push(AccountMeta::new(referral_address, false));
892 }
893
894 Instruction {
895 program_id: crate::ID,
896 accounts,
897 data: instruction::PlaceBid {
898 square_id: square_id.to_le_bytes(),
899 referrer: referrer.unwrap_or(Pubkey::default()).to_bytes(),
900 }
901 .to_bytes(),
902 }
903}
904
905pub fn claim_auction_oil(
912 signer: Pubkey,
913 well_mask: u8, well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
918 let miner_address = miner_pda(signer).0;
919 let auction_address = auction_pda().0;
920 let treasury_address = treasury_pda().0;
921 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
922 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
923 let mint_authority_address = oil_mint_api::state::authority_pda().0;
924
925 let mut accounts = vec![
926 AccountMeta::new(signer, true),
927 AccountMeta::new(miner_address, false),
928 ];
929
930 for well_opt in well_accounts.iter() {
932 if let Some(well_pubkey) = well_opt {
933 accounts.push(AccountMeta::new(*well_pubkey, false));
934 } else {
935 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
937 }
938 }
939
940 if let Some(auction_pool_pdas) = auction_pool_accounts {
942 for auction_pool_pda_opt in auction_pool_pdas.iter() {
943 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
944 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
945 } else {
946 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
948 }
949 }
950 } else {
951 for _ in 0..4 {
953 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
954 }
955 }
956
957 accounts.extend_from_slice(&[
958 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
960 AccountMeta::new(treasury_tokens_address, false),
961 AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(mint_authority_address, false), AccountMeta::new_readonly(oil_mint_api::ID, false),
964 AccountMeta::new(recipient_address, false),
965 AccountMeta::new_readonly(spl_token::ID, false),
966 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
967 AccountMeta::new_readonly(system_program::ID, false),
968 AccountMeta::new_readonly(crate::ID, false), ]);
970
971 if let Some(bid_pdas) = bid_accounts {
973 for bid_pda_opt in bid_pdas.iter() {
974 if let Some(bid_pubkey) = bid_pda_opt {
975 accounts.push(AccountMeta::new(*bid_pubkey, false));
976 }
977 }
978 }
979
980 Instruction {
981 program_id: crate::ID,
982 accounts,
983 data: ClaimAuctionOIL {
984 well_mask,
985 }
986 .to_bytes(),
987 }
988}
989
990pub fn claim_auction_sol(
997 signer: Pubkey,
998 well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1002 let miner_address = miner_pda(signer).0;
1003 let (auction_address, _) = auction_pda();
1004 let treasury_address = treasury_pda().0;
1005
1006 let mut accounts = vec![
1007 AccountMeta::new(signer, true),
1008 AccountMeta::new(miner_address, false),
1009 ];
1010
1011 for well_opt in well_accounts.iter() {
1013 if let Some(well_pubkey) = well_opt {
1014 accounts.push(AccountMeta::new(*well_pubkey, false));
1015 } else {
1016 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1018 }
1019 }
1020
1021 if let Some(auction_pool_pdas) = auction_pool_accounts {
1023 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1024 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1025 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1026 } else {
1027 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1029 }
1030 }
1031 } else {
1032 for _ in 0..4 {
1034 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1035 }
1036 }
1037
1038 accounts.extend_from_slice(&[
1039 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1041 AccountMeta::new_readonly(system_program::ID, false),
1042 AccountMeta::new_readonly(crate::ID, false), ]);
1044
1045 if let Some(bid_pdas) = bid_accounts {
1047 for bid_pda_opt in bid_pdas.iter() {
1048 if let Some(bid_pubkey) = bid_pda_opt {
1049 accounts.push(AccountMeta::new(*bid_pubkey, false));
1050 }
1051 }
1052 }
1053
1054 Instruction {
1055 program_id: crate::ID,
1056 accounts,
1057 data: ClaimAuctionSOL {
1058 _reserved: 0,
1059 }
1060 .to_bytes(),
1061 }
1062}
1063
1064pub fn claim_seeker(signer: Pubkey, mint: Pubkey) -> Instruction {
1065 let seeker_address = seeker_pda(mint).0;
1066 let token_account_address = get_associated_token_address(&signer, &mint);
1067 Instruction {
1068 program_id: crate::ID,
1069 accounts: vec![
1070 AccountMeta::new(signer, true),
1071 AccountMeta::new_readonly(mint, false),
1072 AccountMeta::new(seeker_address, false),
1073 AccountMeta::new(token_account_address, false),
1074 AccountMeta::new_readonly(system_program::ID, false),
1075 ],
1076 data: ClaimSeeker {}.to_bytes(),
1077 }
1078}