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 wrap(signer: Pubkey, use_liquidity: bool, amount: u64) -> Instruction {
407 let config_address = config_pda().0;
408 let treasury_address = TREASURY_ADDRESS;
409 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
410 let data = Wrap {
411 use_liquidity: if use_liquidity { 1 } else { 0 },
412 amount: amount.to_le_bytes(),
413 }
414 .to_bytes();
415 Instruction {
416 program_id: crate::ID,
417 accounts: vec![
418 AccountMeta::new(signer, true),
419 AccountMeta::new_readonly(config_address, false),
420 AccountMeta::new(treasury_address, false),
421 AccountMeta::new(treasury_sol_address, false),
422 AccountMeta::new_readonly(solana_program::system_program::ID, false),
423 ],
424 data,
425 }
426}
427
428pub fn buyback(signer: Pubkey, swap_accounts: &[AccountMeta], swap_data: &[u8]) -> Instruction {
429 let board_address = board_pda().0;
430 let mint_address = MINT_ADDRESS;
431 let treasury_address = TREASURY_ADDRESS;
432 let treasury_oil_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
433 let treasury_sol_address = get_associated_token_address(&treasury_address, &SOL_MINT);
434 let mut accounts = vec![
435 AccountMeta::new(signer, true),
436 AccountMeta::new(board_address, false),
437 AccountMeta::new(mint_address, false),
438 AccountMeta::new(treasury_address, false),
439 AccountMeta::new(treasury_oil_address, false),
440 AccountMeta::new(treasury_sol_address, false),
441 AccountMeta::new_readonly(spl_token::ID, false),
442 AccountMeta::new_readonly(crate::ID, false),
443 ];
444 for account in swap_accounts.iter() {
445 let mut acc_clone = account.clone();
446 acc_clone.is_signer = false;
447 accounts.push(acc_clone);
448 }
449 let mut data = Buyback {}.to_bytes();
450 data.extend_from_slice(swap_data);
451 Instruction {
452 program_id: crate::ID,
453 accounts,
454 data,
455 }
456}
457
458
459pub fn reset(
462 signer: Pubkey,
463 fee_collector: Pubkey,
464 round_id: u64,
465 top_miner: Pubkey,
466 var_address: Pubkey,
467) -> Instruction {
468 reset_with_miners(signer, fee_collector, round_id, top_miner, var_address, &[])
469}
470
471pub fn reset_with_miners(
472 signer: Pubkey,
473 fee_collector: Pubkey,
474 round_id: u64,
475 top_miner: Pubkey,
476 var_address: Pubkey,
477 miner_accounts: &[Pubkey],
478) -> Instruction {
479 let board_address = board_pda().0;
480 let config_address = config_pda().0;
481 let mint_address = MINT_ADDRESS;
482 let round_address = round_pda(round_id).0;
483 let round_next_address = round_pda(round_id + 1).0;
484 let top_miner_address = miner_pda(top_miner).0;
485 let treasury_address = TREASURY_ADDRESS;
486 let treasury_tokens_address = treasury_tokens_address();
487 let pool_address = pool_pda().0;
488 let mint_authority_address = oil_mint_api::state::authority_pda().0;
489 let mut reset_instruction = Instruction {
490 program_id: crate::ID,
491 accounts: vec![
492 AccountMeta::new(signer, true),
493 AccountMeta::new(board_address, false),
494 AccountMeta::new(config_address, false),
495 AccountMeta::new(fee_collector, false),
496 AccountMeta::new(mint_address, false),
497 AccountMeta::new(round_address, false),
498 AccountMeta::new(round_next_address, false),
499 AccountMeta::new(top_miner_address, false),
500 AccountMeta::new(treasury_address, false),
501 AccountMeta::new(pool_address, false),
502 AccountMeta::new(treasury_tokens_address, false),
503 AccountMeta::new_readonly(system_program::ID, false),
504 AccountMeta::new_readonly(spl_token::ID, false),
505 AccountMeta::new_readonly(crate::ID, false),
506 AccountMeta::new_readonly(sysvar::slot_hashes::ID, false),
507 AccountMeta::new_readonly(SOL_MINT, false),
508 AccountMeta::new(var_address, false),
510 AccountMeta::new_readonly(entropy_rng_api::ID, false),
511 AccountMeta::new(mint_authority_address, false),
513 AccountMeta::new_readonly(oil_mint_api::ID, false),
514 ],
515 data: Reset {}.to_bytes(),
516 };
517
518 for miner_pubkey in miner_accounts {
520 reset_instruction.accounts.push(AccountMeta::new(
521 miner_pda(*miner_pubkey).0,
522 false,
523 ));
524 }
525
526 reset_instruction
527}
528
529pub fn checkpoint(signer: Pubkey, authority: Pubkey, round_id: u64) -> Instruction {
532 let miner_address = miner_pda(authority).0;
533 let board_address = board_pda().0;
534 let round_address = round_pda(round_id).0;
535 let treasury_address = TREASURY_ADDRESS;
536 Instruction {
537 program_id: crate::ID,
538 accounts: vec![
539 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(board_address, false),
542 AccountMeta::new(miner_address, false),
543 AccountMeta::new(round_address, false),
544 AccountMeta::new(treasury_address, false),
545 AccountMeta::new_readonly(system_program::ID, false),
546 ],
547 data: Checkpoint {}.to_bytes(),
548 }
549}
550
551pub fn set_admin(signer: Pubkey, admin: Pubkey) -> Instruction {
552 let config_address = config_pda().0;
553 Instruction {
554 program_id: crate::ID,
555 accounts: vec![
556 AccountMeta::new(signer, true),
557 AccountMeta::new(config_address, false),
558 AccountMeta::new_readonly(system_program::ID, false),
559 ],
560 data: SetAdmin {
561 admin: admin.to_bytes(),
562 }
563 .to_bytes(),
564 }
565}
566
567pub fn set_admin_fee(signer: Pubkey, admin_fee: u64) -> Instruction {
568 let config_address = config_pda().0;
569 Instruction {
570 program_id: crate::ID,
571 accounts: vec![
572 AccountMeta::new(signer, true),
573 AccountMeta::new(config_address, false),
574 AccountMeta::new_readonly(system_program::ID, false),
575 ],
576 data: SetAdminFee {
577 admin_fee: admin_fee.to_le_bytes(),
578 }
579 .to_bytes(),
580 }
581}
582
583pub fn set_fee_collector(signer: Pubkey, fee_collector: Pubkey) -> Instruction {
584 let config_address = config_pda().0;
585 Instruction {
586 program_id: crate::ID,
587 accounts: vec![
588 AccountMeta::new(signer, true),
589 AccountMeta::new(config_address, false),
590 AccountMeta::new_readonly(system_program::ID, false),
591 ],
592 data: SetFeeCollector {
593 fee_collector: fee_collector.to_bytes(),
594 }
595 .to_bytes(),
596 }
597}
598
599pub fn set_tge_timestamp(signer: Pubkey, tge_timestamp: i64) -> Instruction {
604 let config_address = config_pda().0;
605 Instruction {
606 program_id: crate::ID,
607 accounts: vec![
608 AccountMeta::new(signer, true),
609 AccountMeta::new(config_address, false),
610 AccountMeta::new_readonly(system_program::ID, false),
611 ],
612 data: SetTgeTimestamp {
613 tge_timestamp: tge_timestamp.to_le_bytes(),
614 }
615 .to_bytes(),
616 }
617}
618
619pub fn set_auction(
620 signer: Pubkey,
621 halving_period_seconds: u64,
622 last_halving_time: u64,
623 base_mining_rates: [u64; 4],
624 auction_duration_seconds: u64,
625 starting_prices: [u64; 4],
626 _well_id: u64, ) -> Instruction {
628 let config_address = config_pda().0;
629 let auction_address = auction_pda().0;
630
631 Instruction {
632 program_id: crate::ID,
633 accounts: vec![
634 AccountMeta::new(signer, true),
635 AccountMeta::new_readonly(config_address, false),
636 AccountMeta::new(auction_address, false),
637 ],
638 data: SetAuction {
639 halving_period_seconds: halving_period_seconds.to_le_bytes(),
640 last_halving_time: last_halving_time.to_le_bytes(),
641 base_mining_rates: [
642 base_mining_rates[0].to_le_bytes(),
643 base_mining_rates[1].to_le_bytes(),
644 base_mining_rates[2].to_le_bytes(),
645 base_mining_rates[3].to_le_bytes(),
646 ],
647 auction_duration_seconds: auction_duration_seconds.to_le_bytes(),
648 starting_prices: [
649 starting_prices[0].to_le_bytes(),
650 starting_prices[1].to_le_bytes(),
651 starting_prices[2].to_le_bytes(),
652 starting_prices[3].to_le_bytes(),
653 ],
654 well_id: 4u64.to_le_bytes(), }
656 .to_bytes(),
657 }
658}
659
660pub fn deposit(signer: Pubkey, authority: Pubkey, amount: u64, lock_duration_days: u64, stake_id: u64) -> Instruction {
663 let mint_address = MINT_ADDRESS;
664 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
666 let sender_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
668 let pool_tokens_address = pool_tokens_address();
669 let miner_address = miner_pda(authority).0; Instruction {
671 program_id: crate::ID,
672 accounts: vec![
673 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(mint_address, false),
676 AccountMeta::new(sender_address, false),
677 AccountMeta::new(stake_address, false),
678 AccountMeta::new(stake_tokens_address, false),
679 AccountMeta::new(pool_address, false),
680 AccountMeta::new(pool_tokens_address, false),
681 AccountMeta::new(miner_address, false),
682 AccountMeta::new_readonly(system_program::ID, false),
683 AccountMeta::new_readonly(spl_token::ID, false),
684 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
685 ],
686 data: Deposit {
687 amount: amount.to_le_bytes(),
688 lock_duration_days: lock_duration_days.to_le_bytes(),
689 stake_id: stake_id.to_le_bytes(),
690 }
691 .to_bytes(),
692 }
693}
694
695pub fn withdraw(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
698 let stake_address = stake_pda_with_id(authority, stake_id).0; let stake_tokens_address = get_associated_token_address(&stake_address, &MINT_ADDRESS);
700 let mint_address = MINT_ADDRESS;
701 let recipient_address = get_associated_token_address(&authority, &MINT_ADDRESS); let pool_address = pool_pda().0;
703 let pool_tokens_address = pool_tokens_address();
704 let miner_address = miner_pda(authority).0; Instruction {
706 program_id: crate::ID,
707 accounts: vec![
708 AccountMeta::new(signer, true), AccountMeta::new(authority, false), AccountMeta::new(mint_address, false),
711 AccountMeta::new(recipient_address, false),
712 AccountMeta::new(stake_address, false),
713 AccountMeta::new(stake_tokens_address, false),
714 AccountMeta::new(pool_address, false),
715 AccountMeta::new(pool_tokens_address, false),
716 AccountMeta::new(miner_address, false),
717 AccountMeta::new_readonly(system_program::ID, false),
718 AccountMeta::new_readonly(spl_token::ID, false),
719 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
720 ],
721 data: Withdraw {
722 amount: amount.to_le_bytes(),
723 stake_id: stake_id.to_le_bytes(),
724 }
725 .to_bytes(),
726 }
727}
728
729pub fn reload_sol(
739 signer: Pubkey,
740 authority: Pubkey,
741 referrer_miner: Option<Pubkey>,
742 referrer_referral: Option<Pubkey>,
743) -> Instruction {
744 let automation_address = automation_pda(authority).0;
745 let miner_address = miner_pda(authority).0;
746
747 let mut accounts = vec![
748 AccountMeta::new(signer, true),
749 AccountMeta::new(automation_address, false),
750 AccountMeta::new(miner_address, false),
751 AccountMeta::new_readonly(system_program::ID, false),
752 ];
753
754 if let (Some(miner_ref), Some(referral_ref)) = (referrer_miner, referrer_referral) {
756 accounts.push(AccountMeta::new(miner_ref, false));
757 accounts.push(AccountMeta::new(referral_ref, false));
758 }
759
760 Instruction {
761 program_id: crate::ID,
762 accounts,
763 data: ReloadSOL {}.to_bytes(),
764 }
765}
766
767pub fn claim_yield(signer: Pubkey, authority: Pubkey, amount: u64, stake_id: u64) -> Instruction {
771 let stake_address = stake_pda_with_id(authority, stake_id).0; let pool_address = pool_pda().0;
773 Instruction {
774 program_id: crate::ID,
775 accounts: vec![
776 AccountMeta::new(signer, true), AccountMeta::new(authority, true), AccountMeta::new(stake_address, false),
779 AccountMeta::new(pool_address, false),
780 AccountMeta::new_readonly(system_program::ID, false),
781 ],
782 data: ClaimYield {
783 amount: amount.to_le_bytes(),
784 }
785 .to_bytes(),
786 }
787}
788
789pub fn new_var(
790 signer: Pubkey,
791 provider: Pubkey,
792 id: u64,
793 commit: [u8; 32],
794 samples: u64,
795) -> Instruction {
796 let board_address = board_pda().0;
797 let config_address = config_pda().0;
798 let var_address = entropy_rng_api::state::var_pda(board_address, id).0;
799 Instruction {
800 program_id: crate::ID,
801 accounts: vec![
802 AccountMeta::new(signer, true),
803 AccountMeta::new(board_address, false),
804 AccountMeta::new(config_address, false),
805 AccountMeta::new(provider, false),
806 AccountMeta::new(var_address, false),
807 AccountMeta::new_readonly(system_program::ID, false),
808 AccountMeta::new_readonly(entropy_rng_api::ID, false),
809 ],
810 data: NewVar {
811 id: id.to_le_bytes(),
812 commit: commit,
813 samples: samples.to_le_bytes(),
814 }
815 .to_bytes(),
816 }
817}
818
819pub fn set_swap_program(signer: Pubkey, new_program: Pubkey) -> Instruction {
820 let config_address = config_pda().0;
821 Instruction {
822 program_id: crate::ID,
823 accounts: vec![
824 AccountMeta::new(signer, true),
825 AccountMeta::new(config_address, false),
826 AccountMeta::new_readonly(new_program, false),
827 ],
828 data: SetSwapProgram {}.to_bytes(),
829 }
830}
831
832pub fn set_var_address(signer: Pubkey, new_var_address: Pubkey) -> Instruction {
833 let board_address = board_pda().0;
834 let config_address = config_pda().0;
835 Instruction {
836 program_id: crate::ID,
837 accounts: vec![
838 AccountMeta::new(signer, true),
839 AccountMeta::new(board_address, false),
840 AccountMeta::new(config_address, false),
841 AccountMeta::new(new_var_address, false),
842 ],
843 data: SetVarAddress {}.to_bytes(),
844 }
845}
846
847pub fn migrate(signer: Pubkey) -> Instruction {
852 let config_address = config_pda().0;
853 let treasury_address = treasury_pda().0;
854 Instruction {
855 program_id: crate::ID,
856 accounts: vec![
857 AccountMeta::new(signer, true),
858 AccountMeta::new(config_address, false),
859 AccountMeta::new(treasury_address, false),
860 AccountMeta::new_readonly(system_program::ID, false),
861 ],
862 data: Migrate {}.to_bytes(),
863 }
864}
865
866pub fn create_referral(signer: Pubkey) -> Instruction {
868 let referral_address = referral_pda(signer).0;
869 Instruction {
870 program_id: crate::ID,
871 accounts: vec![
872 AccountMeta::new(signer, true),
873 AccountMeta::new(referral_address, false),
874 AccountMeta::new_readonly(system_program::ID, false),
875 ],
876 data: CreateReferral {}.to_bytes(),
877 }
878}
879
880pub fn create_whitelist(
884 signer: Pubkey,
885 code_hash: [u8; 32],
886) -> Instruction {
887 let config_address = config_pda().0;
888 let (whitelist_address, _) = Whitelist::pda(code_hash);
889 Instruction {
890 program_id: crate::ID,
891 accounts: vec![
892 AccountMeta::new(signer, true), AccountMeta::new_readonly(config_address, false), AccountMeta::new(whitelist_address, false), AccountMeta::new_readonly(system_program::ID, false), ],
897 data: CreateWhitelist {
898 code_hash,
899 }
900 .to_bytes(),
901 }
902}
903
904pub fn claim_referral(signer: Pubkey, authority: Pubkey) -> Instruction {
909 let referral_address = referral_pda(authority).0;
910 let referral_oil_address = get_associated_token_address(&referral_address, &MINT_ADDRESS);
911 let recipient_oil_address = get_associated_token_address(&authority, &MINT_ADDRESS);
912 Instruction {
913 program_id: crate::ID,
914 accounts: vec![
915 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), ],
925 data: ClaimReferral {}.to_bytes(),
926 }
927}
928
929pub fn place_bid(
938 signer: Pubkey,
939 authority: Pubkey,
940 square_id: u64,
941 fee_collector: Pubkey,
942 previous_owner_miner: Option<Pubkey>, previous_owner: Option<Pubkey>, referrer: Option<Pubkey>, ) -> Instruction {
946 let well_address = well_pda(square_id).0;
947 let auction_address = auction_pda().0;
948 let treasury_address = treasury_pda().0;
949 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
950 let staking_pool_address = pool_pda().0;
951 let config_address = config_pda().0;
952 let mint_authority_address = oil_mint_api::state::authority_pda().0;
953 let bidder_miner_address = miner_pda(authority).0;
954
955 let mut accounts = vec![
956 AccountMeta::new(signer, true), AccountMeta::new(authority, false), ];
959
960 accounts.extend_from_slice(&[
964 AccountMeta::new(well_address, false), AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
967 AccountMeta::new(treasury_tokens_address, false),
968 AccountMeta::new(MINT_ADDRESS, false),
969 AccountMeta::new(mint_authority_address, false),
970 AccountMeta::new_readonly(oil_mint_api::ID, false),
971 AccountMeta::new(staking_pool_address, false),
972 AccountMeta::new(fee_collector, false),
973 AccountMeta::new_readonly(config_address, false),
974 AccountMeta::new_readonly(spl_token::ID, false),
975 AccountMeta::new_readonly(system_program::ID, false),
976 AccountMeta::new_readonly(crate::ID, false), AccountMeta::new(bidder_miner_address, false), ]);
979
980 if let (Some(miner_pubkey), Some(owner_pubkey)) = (previous_owner_miner, previous_owner) {
982 accounts.push(AccountMeta::new(miner_pubkey, false)); accounts.push(AccountMeta::new(owner_pubkey, false)); }
985
986 if let Some(referrer_pubkey) = referrer {
988 let referral_address = referral_pda(referrer_pubkey).0;
989 accounts.push(AccountMeta::new(referral_address, false)); }
991
992 Instruction {
999 program_id: crate::ID,
1000 accounts,
1001 data: instruction::PlaceBid {
1002 square_id: square_id.to_le_bytes(),
1003 referrer: referrer.unwrap_or(Pubkey::default()).to_bytes(),
1004 }
1005 .to_bytes(),
1006 }
1007}
1008
1009pub fn claim_auction_oil(
1016 signer: Pubkey,
1017 well_mask: u8, well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1022 let miner_address = miner_pda(signer).0;
1023 let auction_address = auction_pda().0;
1024 let treasury_address = treasury_pda().0;
1025 let treasury_tokens_address = get_associated_token_address(&treasury_address, &MINT_ADDRESS);
1026 let recipient_address = get_associated_token_address(&signer, &MINT_ADDRESS);
1027 let mint_authority_address = oil_mint_api::state::authority_pda().0;
1028
1029 let mut accounts = vec![
1030 AccountMeta::new(signer, true),
1031 AccountMeta::new(miner_address, false),
1032 ];
1033
1034 for well_opt in well_accounts.iter() {
1036 if let Some(well_pubkey) = well_opt {
1037 accounts.push(AccountMeta::new(*well_pubkey, false));
1038 } else {
1039 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1041 }
1042 }
1043
1044 if let Some(auction_pool_pdas) = auction_pool_accounts {
1046 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1047 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1048 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1049 } else {
1050 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1052 }
1053 }
1054 } else {
1055 for _ in 0..4 {
1057 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1058 }
1059 }
1060
1061 accounts.extend_from_slice(&[
1062 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1064 AccountMeta::new(treasury_tokens_address, false),
1065 AccountMeta::new(MINT_ADDRESS, false), AccountMeta::new(mint_authority_address, false), AccountMeta::new_readonly(oil_mint_api::ID, false),
1068 AccountMeta::new(recipient_address, false),
1069 AccountMeta::new_readonly(spl_token::ID, false),
1070 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
1071 AccountMeta::new_readonly(system_program::ID, false),
1072 AccountMeta::new_readonly(crate::ID, false), ]);
1074
1075 if let Some(bid_pdas) = bid_accounts {
1077 for bid_pda_opt in bid_pdas.iter() {
1078 if let Some(bid_pubkey) = bid_pda_opt {
1079 accounts.push(AccountMeta::new(*bid_pubkey, false));
1080 }
1081 }
1082 }
1083
1084 Instruction {
1085 program_id: crate::ID,
1086 accounts,
1087 data: ClaimAuctionOIL {
1088 well_mask,
1089 }
1090 .to_bytes(),
1091 }
1092}
1093
1094pub fn claim_auction_sol(
1101 signer: Pubkey,
1102 well_accounts: [Option<Pubkey>; 4], auction_pool_accounts: Option<[Option<Pubkey>; 4]>, bid_accounts: Option<[Option<Pubkey>; 4]>, ) -> Instruction {
1106 let miner_address = miner_pda(signer).0;
1107 let (auction_address, _) = auction_pda();
1108 let treasury_address = treasury_pda().0;
1109
1110 let mut accounts = vec![
1111 AccountMeta::new(signer, true),
1112 AccountMeta::new(miner_address, false),
1113 ];
1114
1115 for well_opt in well_accounts.iter() {
1117 if let Some(well_pubkey) = well_opt {
1118 accounts.push(AccountMeta::new(*well_pubkey, false));
1119 } else {
1120 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1122 }
1123 }
1124
1125 if let Some(auction_pool_pdas) = auction_pool_accounts {
1127 for auction_pool_pda_opt in auction_pool_pdas.iter() {
1128 if let Some(auction_pool_pubkey) = auction_pool_pda_opt {
1129 accounts.push(AccountMeta::new(*auction_pool_pubkey, false));
1130 } else {
1131 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1133 }
1134 }
1135 } else {
1136 for _ in 0..4 {
1138 accounts.push(AccountMeta::new_readonly(system_program::ID, false));
1139 }
1140 }
1141
1142 accounts.extend_from_slice(&[
1143 AccountMeta::new(auction_address, false), AccountMeta::new(treasury_address, false),
1145 AccountMeta::new_readonly(system_program::ID, false),
1146 AccountMeta::new_readonly(crate::ID, false), ]);
1148
1149 if let Some(bid_pdas) = bid_accounts {
1151 for bid_pda_opt in bid_pdas.iter() {
1152 if let Some(bid_pubkey) = bid_pda_opt {
1153 accounts.push(AccountMeta::new(*bid_pubkey, false));
1154 }
1155 }
1156 }
1157
1158 Instruction {
1159 program_id: crate::ID,
1160 accounts,
1161 data: ClaimAuctionSOL {
1162 _reserved: 0,
1163 }
1164 .to_bytes(),
1165 }
1166}
1167
1168pub fn claim_seeker(signer: Pubkey, mint: Pubkey) -> Instruction {
1169 let seeker_address = seeker_pda(mint).0;
1170 let token_account_address = get_associated_token_address(&signer, &mint);
1171 Instruction {
1172 program_id: crate::ID,
1173 accounts: vec![
1174 AccountMeta::new(signer, true),
1175 AccountMeta::new_readonly(mint, false),
1176 AccountMeta::new(seeker_address, false),
1177 AccountMeta::new(token_account_address, false),
1178 AccountMeta::new_readonly(system_program::ID, false),
1179 ],
1180 data: ClaimSeeker {}.to_bytes(),
1181 }
1182}