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