1use solana_program::{
4 instruction::{AccountMeta, Instruction},
5 pubkey::Pubkey,
6};
7use solana_sdk_ids::system_program;
8use spl_associated_token_account::get_associated_token_address;
9
10use crate::{
11 consts::{DOJO_MINT, FEE_COLLECTOR},
12 instruction::*,
13 state::*,
14};
15
16fn program_id() -> Pubkey {
17 crate::ID
18}
19
20pub fn initialize(authority: Pubkey) -> Instruction {
22 let config_address = config_pda(&program_id()).0;
23 let game_address = game_pda(&program_id()).0;
24 let treasury_address = treasury_pda(&program_id()).0;
25 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
26
27 Instruction {
28 program_id: program_id(),
29 accounts: vec![
30 AccountMeta::new(authority, true),
31 AccountMeta::new(config_address, false),
32 AccountMeta::new(game_address, false),
33 AccountMeta::new(treasury_address, false),
34 AccountMeta::new(treasury_ata, false),
35 AccountMeta::new_readonly(DOJO_MINT, false),
36 AccountMeta::new_readonly(spl_token::ID, false),
37 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
38 AccountMeta::new_readonly(system_program::ID, false),
39 ],
40 data: Initialize {}.to_bytes(),
41 }
42}
43
44pub fn buy_starter_pack(
47 signer: Pubkey,
48 referrer: Option<Pubkey>,
49) -> Instruction {
50 let config_address = config_pda(&program_id()).0;
51 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
52 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
53 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
54 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
55 let treasury_address = treasury_pda(&program_id()).0;
56
57 let referrer_bytes = referrer.map(|p| p.to_bytes()).unwrap_or([0u8; 32]);
58
59 let game_address = game_pda(&program_id()).0;
60 let mut accounts = vec![
61 AccountMeta::new(signer, true),
62 AccountMeta::new(config_address, false),
63 AccountMeta::new(game_address, false),
64 AccountMeta::new(dojo_address, false),
65 AccountMeta::new(barracks_address, false),
66 AccountMeta::new(forge_address, false),
67 AccountMeta::new(tasks_address, false),
68 AccountMeta::new(treasury_address, false),
69 AccountMeta::new(FEE_COLLECTOR, false),
70 AccountMeta::new_readonly(system_program::ID, false),
71 ];
72 if let Some(ref_dojo) = referrer {
73 let (referral_address, _) = referral_pda(&program_id(), &ref_dojo);
74 accounts.push(AccountMeta::new_readonly(ref_dojo, false));
75 accounts.push(AccountMeta::new(referral_address, false));
76 }
77
78 Instruction {
79 program_id: program_id(),
80 accounts,
81 data: BuyStarterPack { referrer: referrer_bytes }.to_bytes(),
82 }
83}
84
85pub fn recruit_shogun_tickets(
89 signer: Pubkey,
90 count: u64,
91 seed: [u8; 32],
92 prestige: Option<Pubkey>,
93) -> Instruction {
94 let config_address = config_pda(&program_id()).0;
95 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
96 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
97
98 let mut accounts = vec![
99 AccountMeta::new(signer, true),
100 AccountMeta::new_readonly(config_address, false),
101 AccountMeta::new(dojo_address, false),
102 AccountMeta::new(tasks_address, false),
103 ];
104 if let Some(addr) = prestige {
105 accounts.push(AccountMeta::new(addr, false));
106 }
107
108 Instruction {
109 program_id: program_id(),
110 accounts,
111 data: RecruitShogunTickets {
112 count: count.to_le_bytes(),
113 seed,
114 }
115 .to_bytes(),
116 }
117}
118
119pub fn recruit_shogun_sol(
123 signer: Pubkey,
124 count: u64,
125 seed: [u8; 32],
126 prestige: Option<Pubkey>,
127) -> Instruction {
128 let config_address = config_pda(&program_id()).0;
129 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
130 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
131
132 let mut accounts = vec![
133 AccountMeta::new(signer, true),
134 AccountMeta::new_readonly(config_address, false),
135 AccountMeta::new(dojo_address, false),
136 AccountMeta::new(tasks_address, false),
137 AccountMeta::new(FEE_COLLECTOR, false),
138 ];
139 if let Some(addr) = prestige {
140 accounts.push(AccountMeta::new(addr, false));
141 }
142
143 Instruction {
144 program_id: program_id(),
145 accounts,
146 data: RecruitShogunSol {
147 count: count.to_le_bytes(),
148 seed,
149 }
150 .to_bytes(),
151 }
152}
153
154pub fn seat_shogun(
157 signer: Pubkey,
158 slot: u64,
159 rarity: u64,
160 element: u64,
161 prestige: Option<Pubkey>,
162) -> Instruction {
163 let config_address = config_pda(&program_id()).0;
164 let game_address = game_pda(&program_id()).0;
165 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
166 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
167
168 let mut accounts = vec![
169 AccountMeta::new(signer, true),
170 AccountMeta::new_readonly(config_address, false),
171 AccountMeta::new(game_address, false),
172 AccountMeta::new(dojo_address, false),
173 AccountMeta::new(barracks_address, false),
174 ];
175 if let Some(addr) = prestige {
176 accounts.push(AccountMeta::new(addr, false));
177 }
178
179 Instruction {
180 program_id: program_id(),
181 accounts,
182 data: SeatShogun {
183 slot: slot.to_le_bytes(),
184 rarity: rarity.to_le_bytes(),
185 element: element.to_le_bytes(),
186 }
187 .to_bytes(),
188 }
189}
190
191pub fn replace_shogun(
194 signer: Pubkey,
195 slot: u64,
196 new_rarity: u64,
197 new_element: u64,
198 prestige: Option<Pubkey>,
199) -> Instruction {
200 let config_address = config_pda(&program_id()).0;
201 let game_address = game_pda(&program_id()).0;
202 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
203 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
204
205 let mut accounts = vec![
206 AccountMeta::new(signer, true),
207 AccountMeta::new_readonly(config_address, false),
208 AccountMeta::new(game_address, false),
209 AccountMeta::new(dojo_address, false),
210 AccountMeta::new(barracks_address, false),
211 ];
212 if let Some(addr) = prestige {
213 accounts.push(AccountMeta::new(addr, false));
214 }
215
216 Instruction {
217 program_id: program_id(),
218 accounts,
219 data: ReplaceShogun {
220 slot: slot.to_le_bytes(),
221 new_rarity: new_rarity.to_le_bytes(),
222 new_element: new_element.to_le_bytes(),
223 }
224 .to_bytes(),
225 }
226}
227
228pub fn seat_shogun_fill_all(
231 signer: Pubkey,
232 entries: impl IntoIterator<Item = (u64, u64)>,
233 prestige: Option<Pubkey>,
234) -> Instruction {
235 let config_address = config_pda(&program_id()).0;
236 let game_address = game_pda(&program_id()).0;
237 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
238 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
239
240 let mut arr: [SeatShogunFillAllEntry; 12] = [SeatShogunFillAllEntry {
241 rarity: [0; 8],
242 element: [0; 8],
243 }; 12];
244 let mut count = 0u8;
245 for (i, (rarity, element)) in entries.into_iter().take(12).enumerate() {
246 arr[i] = SeatShogunFillAllEntry {
247 rarity: rarity.to_le_bytes(),
248 element: element.to_le_bytes(),
249 };
250 count += 1;
251 }
252
253 let mut accounts = vec![
254 AccountMeta::new(signer, true),
255 AccountMeta::new_readonly(config_address, false),
256 AccountMeta::new(game_address, false),
257 AccountMeta::new(dojo_address, false),
258 AccountMeta::new(barracks_address, false),
259 ];
260 if let Some(addr) = prestige {
261 accounts.push(AccountMeta::new(addr, false));
262 }
263
264 Instruction {
265 program_id: program_id(),
266 accounts,
267 data: SeatShogunFillAll {
268 count,
269 _pad: [0; 7],
270 entries: arr,
271 }
272 .to_bytes(),
273 }
274}
275
276pub fn dine(signer: Pubkey, slot: u64, tier: u64) -> Instruction {
278 let config_address = config_pda(&program_id()).0;
279 let game_address = game_pda(&program_id()).0;
280 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
281 let treasury_address = treasury_pda(&program_id()).0;
282 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
283 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
284 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
285
286 Instruction {
287 program_id: program_id(),
288 accounts: vec![
289 AccountMeta::new(signer, true),
290 AccountMeta::new_readonly(config_address, false),
291 AccountMeta::new(game_address, false),
292 AccountMeta::new(dojo_address, false),
293 AccountMeta::new(barracks_address, false),
294 AccountMeta::new(user_ata, false),
295 AccountMeta::new(treasury_ata, false),
296 AccountMeta::new(DOJO_MINT, false),
297 AccountMeta::new(treasury_address, false),
298 AccountMeta::new_readonly(spl_token::ID, false),
299 ],
300 data: Dine {
301 tier: tier.to_le_bytes(),
302 slot: slot.to_le_bytes(),
303 }
304 .to_bytes(),
305 }
306}
307
308pub fn upgrade_barracks_shards(signer: Pubkey) -> Instruction {
310 let config_address = config_pda(&program_id()).0;
311 let game_address = game_pda(&program_id()).0;
312 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
313 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
314 let treasury_address = treasury_pda(&program_id()).0;
315 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
316 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
317
318 Instruction {
319 program_id: program_id(),
320 accounts: vec![
321 AccountMeta::new(signer, true),
322 AccountMeta::new_readonly(config_address, false),
323 AccountMeta::new(game_address, false),
324 AccountMeta::new(dojo_address, false),
325 AccountMeta::new(barracks_address, false),
326 AccountMeta::new(user_ata, false),
327 AccountMeta::new(treasury_ata, false),
328 AccountMeta::new(DOJO_MINT, false),
329 AccountMeta::new(treasury_address, false),
330 AccountMeta::new_readonly(spl_token::ID, false),
331 ],
332 data: UpgradeBarracksShards {}.to_bytes(),
333 }
334}
335
336pub fn upgrade_barracks_sol(signer: Pubkey) -> Instruction {
338 let config_address = config_pda(&program_id()).0;
339 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
340 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
341
342 Instruction {
343 program_id: program_id(),
344 accounts: vec![
345 AccountMeta::new(signer, true),
346 AccountMeta::new_readonly(config_address, false),
347 AccountMeta::new(dojo_address, false),
348 AccountMeta::new(barracks_address, false),
349 AccountMeta::new(FEE_COLLECTOR, false),
350 AccountMeta::new_readonly(system_program::ID, false),
351 ],
352 data: UpgradeBarracksSol {}.to_bytes(),
353 }
354}
355
356pub fn upgrade_forge(signer: Pubkey) -> Instruction {
358 let config_address = config_pda(&program_id()).0;
359 let game_address = game_pda(&program_id()).0;
360 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
361 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
362 let treasury_address = treasury_pda(&program_id()).0;
363 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
364 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
365
366 Instruction {
367 program_id: program_id(),
368 accounts: vec![
369 AccountMeta::new(signer, true),
370 AccountMeta::new_readonly(config_address, false),
371 AccountMeta::new(game_address, false),
372 AccountMeta::new(dojo_address, false),
373 AccountMeta::new(forge_address, false),
374 AccountMeta::new(FEE_COLLECTOR, false),
375 AccountMeta::new_readonly(system_program::ID, false),
376 AccountMeta::new(user_ata, false),
377 AccountMeta::new(treasury_ata, false),
378 AccountMeta::new(DOJO_MINT, false),
379 AccountMeta::new(treasury_address, false),
380 AccountMeta::new_readonly(spl_token::ID, false),
381 ],
382 data: UpgradeForge {}.to_bytes(),
383 }
384}
385
386pub fn merge_shogun(
390 signer: Pubkey,
391 merge_type: u64,
392 seed: [u8; 32],
393 prestige: Option<Pubkey>,
394) -> Instruction {
395 let config_address = config_pda(&program_id()).0;
396 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
397 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
398
399 let mut accounts = vec![
400 AccountMeta::new(signer, true),
401 AccountMeta::new_readonly(config_address, false),
402 AccountMeta::new(dojo_address, false),
403 AccountMeta::new(tasks_address, false),
404 ];
405 if let Some(addr) = prestige {
406 accounts.push(AccountMeta::new(addr, false));
407 }
408
409 Instruction {
410 program_id: program_id(),
411 accounts,
412 data: MergeShogun {
413 merge_type: merge_type.to_le_bytes(),
414 seed,
415 }
416 .to_bytes(),
417 }
418}
419
420pub fn prestige_upgrade(signer: Pubkey, slot: u64, prestige: Option<Pubkey>) -> Instruction {
423 let config_address = config_pda(&program_id()).0;
424 let game_address = game_pda(&program_id()).0;
425 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
426 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
427 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
428
429 let mut accounts = vec![
430 AccountMeta::new(signer, true),
431 AccountMeta::new_readonly(config_address, false),
432 AccountMeta::new(game_address, false),
433 AccountMeta::new(dojo_address, false),
434 AccountMeta::new(barracks_address, false),
435 AccountMeta::new(tasks_address, false),
436 ];
437 if let Some(addr) = prestige {
438 accounts.push(AccountMeta::new(addr, false));
439 }
440
441 Instruction {
442 program_id: program_id(),
443 accounts,
444 data: PrestigeUpgrade {
445 slot: slot.to_le_bytes(),
446 }
447 .to_bytes(),
448 }
449}
450
451pub fn prestige_fodder_shogun(
454 signer: Pubkey,
455 collection_index: u8,
456 from_prestige: u64,
457) -> Instruction {
458 let config_address = config_pda(&program_id()).0;
459 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
460 let (prestige_address, _) = prestige_pda(&program_id(), &dojo_address);
461 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
462
463 Instruction {
464 program_id: program_id(),
465 accounts: vec![
466 AccountMeta::new(signer, true),
467 AccountMeta::new_readonly(config_address, false),
468 AccountMeta::new(dojo_address, false),
469 AccountMeta::new(prestige_address, false),
470 AccountMeta::new(tasks_address, false),
471 AccountMeta::new_readonly(system_program::ID, false),
472 ],
473 data: PrestigeFodderShogun {
474 collection_index,
475 _pad: [0; 7],
476 from_prestige: from_prestige.to_le_bytes(),
477 }
478 .to_bytes(),
479 }
480}
481
482pub fn level_up_shogun(signer: Pubkey, slot: u64) -> Instruction {
484 let config_address = config_pda(&program_id()).0;
485 let game_address = game_pda(&program_id()).0;
486 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
487 let treasury_address = treasury_pda(&program_id()).0;
488 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
489 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
490 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
491
492 Instruction {
493 program_id: program_id(),
494 accounts: vec![
495 AccountMeta::new(signer, true),
496 AccountMeta::new_readonly(config_address, false),
497 AccountMeta::new(game_address, false),
498 AccountMeta::new(dojo_address, false),
499 AccountMeta::new(barracks_address, false),
500 AccountMeta::new(user_ata, false),
501 AccountMeta::new(treasury_ata, false),
502 AccountMeta::new(DOJO_MINT, false),
503 AccountMeta::new(treasury_address, false),
504 AccountMeta::new_readonly(spl_token::ID, false),
505 ],
506 data: LevelUpShogun {
507 slot: slot.to_le_bytes(),
508 }
509 .to_bytes(),
510 }
511}
512
513pub fn claim_shards(signer: Pubkey) -> Instruction {
516 let config_address = config_pda(&program_id()).0;
517 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
518 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
519 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
520 let game_address = game_pda(&program_id()).0;
521 let treasury_address = treasury_pda(&program_id()).0;
522 let dojo_ata = get_associated_token_address(&signer, &DOJO_MINT);
523
524 Instruction {
525 program_id: program_id(),
526 accounts: vec![
527 AccountMeta::new(signer, true),
528 AccountMeta::new_readonly(config_address, false),
529 AccountMeta::new(dojo_address, false),
530 AccountMeta::new(forge_address, false),
531 AccountMeta::new(barracks_address, false),
532 AccountMeta::new_readonly(game_address, false),
533 AccountMeta::new(dojo_ata, false),
534 AccountMeta::new(DOJO_MINT, false),
535 AccountMeta::new(treasury_address, false),
536 AccountMeta::new_readonly(spl_token::ID, false),
537 ],
538 data: ClaimShards {}.to_bytes(),
539 }
540}
541
542pub fn claim_referral_reward(signer: Pubkey, referrer_dojo: Pubkey) -> Instruction {
544 let (referral_address, _) = referral_pda(&program_id(), &referrer_dojo);
545 let treasury_address = treasury_pda(&program_id()).0;
546
547 Instruction {
548 program_id: program_id(),
549 accounts: vec![
550 AccountMeta::new(signer, true),
551 AccountMeta::new(referrer_dojo, false),
552 AccountMeta::new(referral_address, false),
553 AccountMeta::new(treasury_address, false),
554 AccountMeta::new_readonly(system_program::ID, false),
555 ],
556 data: ClaimReferralReward {}.to_bytes(),
557 }
558}
559
560pub fn claim_recruit_reward(signer: Pubkey) -> Instruction {
562 let config_address = config_pda(&program_id()).0;
563 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
564 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
565
566 Instruction {
567 program_id: program_id(),
568 accounts: vec![
569 AccountMeta::new(signer, true),
570 AccountMeta::new_readonly(config_address, false),
571 AccountMeta::new(dojo_address, false),
572 AccountMeta::new(tasks_address, false),
573 ],
574 data: ClaimRecruitReward {}.to_bytes(),
575 }
576}
577
578pub fn claim_forge_reward(signer: Pubkey) -> Instruction {
580 let config_address = config_pda(&program_id()).0;
581 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
582 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
583
584 Instruction {
585 program_id: program_id(),
586 accounts: vec![
587 AccountMeta::new(signer, true),
588 AccountMeta::new_readonly(config_address, false),
589 AccountMeta::new(dojo_address, false),
590 AccountMeta::new(tasks_address, false),
591 ],
592 data: ClaimForgeReward {}.to_bytes(),
593 }
594}
595
596pub fn claim_dine_reward(signer: Pubkey) -> Instruction {
598 let config_address = config_pda(&program_id()).0;
599 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
600 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
601
602 Instruction {
603 program_id: program_id(),
604 accounts: vec![
605 AccountMeta::new(signer, true),
606 AccountMeta::new_readonly(config_address, false),
607 AccountMeta::new(dojo_address, false),
608 AccountMeta::new(tasks_address, false),
609 ],
610 data: ClaimDineReward {}.to_bytes(),
611 }
612}
613
614pub fn ed25519_verify_instruction_for_daily_claim(
617 dojo_pda: Pubkey,
618 signature: [u8; 64],
619) -> Instruction {
620 use crate::consts::{CLAIM_TASK_PREFIX, DAILY_TASK_START, TASK_VERIFIER};
621 let mut message = Vec::with_capacity(CLAIM_TASK_PREFIX.len() + 32 + 8);
622 message.extend_from_slice(CLAIM_TASK_PREFIX);
623 message.extend_from_slice(dojo_pda.as_ref());
624 message.extend_from_slice(&DAILY_TASK_START.to_le_bytes());
625 let verifier_bytes: [u8; 32] = TASK_VERIFIER.to_bytes();
626 crate::utils::new_ed25519_instruction_with_signature(&message, &signature, &verifier_bytes)
627}
628
629pub fn claim_daily_reward(signer: Pubkey, signature: [u8; 64]) -> Instruction {
632 let config_address = config_pda(&program_id()).0;
633 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
634 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
635 let instructions_sysvar = solana_program::sysvar::instructions::ID;
636
637 Instruction {
638 program_id: program_id(),
639 accounts: vec![
640 AccountMeta::new(signer, true),
641 AccountMeta::new_readonly(config_address, false),
642 AccountMeta::new(dojo_address, false),
643 AccountMeta::new(tasks_address, false),
644 AccountMeta::new_readonly(instructions_sysvar, false),
645 ],
646 data: ClaimDailyReward { signature }.to_bytes(),
647 }
648}
649
650pub fn ed25519_verify_instruction_for_off_chain_task(
652 dojo_pda: Pubkey,
653 task_id: u64,
654 signature: [u8; 64],
655) -> Instruction {
656 use crate::consts::{CLAIM_TASK_PREFIX, TASK_VERIFIER};
657 let mut message = Vec::with_capacity(CLAIM_TASK_PREFIX.len() + 32 + 8);
658 message.extend_from_slice(CLAIM_TASK_PREFIX);
659 message.extend_from_slice(dojo_pda.as_ref());
660 message.extend_from_slice(&task_id.to_le_bytes());
661 let verifier_bytes: [u8; 32] = TASK_VERIFIER.to_bytes();
662 crate::utils::new_ed25519_instruction_with_signature(&message, &signature, &verifier_bytes)
663}
664
665pub fn claim_off_chain_task_reward(
668 signer: Pubkey,
669 task_id: u64,
670 signature: [u8; 64],
671) -> Instruction {
672 let config_address = config_pda(&program_id()).0;
673 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
674 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
675 let instructions_sysvar = solana_program::sysvar::instructions::ID;
676
677 Instruction {
678 program_id: program_id(),
679 accounts: vec![
680 AccountMeta::new(signer, true),
681 AccountMeta::new_readonly(config_address, false),
682 AccountMeta::new(dojo_address, false),
683 AccountMeta::new(tasks_address, false),
684 AccountMeta::new_readonly(instructions_sysvar, false),
685 ],
686 data: ClaimOffChainTaskReward {
687 task_id: task_id.to_le_bytes(),
688 signature,
689 }
690 .to_bytes(),
691 }
692}
693
694pub fn claim_seeker_task_reward(
699 signer: Pubkey,
700 signer_sgt_token_account: Pubkey,
701 sgt_mint: Pubkey,
702) -> Instruction {
703 let config_address = config_pda(&program_id()).0;
704 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
705 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
706 let (seeker_address, _) = seeker_pda(&program_id(), &sgt_mint);
707
708 Instruction {
709 program_id: program_id(),
710 accounts: vec![
711 AccountMeta::new(signer, true),
712 AccountMeta::new_readonly(config_address, false),
713 AccountMeta::new(dojo_address, false),
714 AccountMeta::new(tasks_address, false),
715 AccountMeta::new_readonly(signer_sgt_token_account, false),
716 AccountMeta::new_readonly(sgt_mint, false),
717 AccountMeta::new_readonly(spl_token_2022::ID, false),
718 AccountMeta::new(seeker_address, false),
719 AccountMeta::new_readonly(system_program::ID, false),
720 ],
721 data: ClaimSeekerTaskReward {}.to_bytes(),
722 }
723}
724
725pub fn claim_collection_reward(signer: Pubkey, collection_index: u8) -> Instruction {
728 let config_address = config_pda(&program_id()).0;
729 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
730 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
731
732 Instruction {
733 program_id: program_id(),
734 accounts: vec![
735 AccountMeta::new(signer, true),
736 AccountMeta::new_readonly(config_address, false),
737 AccountMeta::new(dojo_address, false),
738 AccountMeta::new(tasks_address, false),
739 ],
740 data: ClaimCollectionReward { collection_index }.to_bytes(),
741 }
742}
743
744pub fn buy_flash_sale(signer: Pubkey) -> Instruction {
746 let config_address = config_pda(&program_id()).0;
747 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
748 let treasury_address = treasury_pda(&program_id()).0;
749 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
750 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
751
752 Instruction {
753 program_id: program_id(),
754 accounts: vec![
755 AccountMeta::new(signer, true),
756 AccountMeta::new_readonly(config_address, false),
757 AccountMeta::new(dojo_address, false),
758 AccountMeta::new(user_ata, false),
759 AccountMeta::new_readonly(treasury_address, false),
760 AccountMeta::new(treasury_ata, false),
761 AccountMeta::new_readonly(spl_token::ID, false),
762 ],
763 data: BuyFlashSale {}.to_bytes(),
764 }
765}
766
767pub fn buy_tickets_with_shards(signer: Pubkey) -> Instruction {
769 let config_address = config_pda(&program_id()).0;
770 let game_address = game_pda(&program_id()).0;
771 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
772 let treasury_address = treasury_pda(&program_id()).0;
773 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
774 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
775
776 Instruction {
777 program_id: program_id(),
778 accounts: vec![
779 AccountMeta::new(signer, true),
780 AccountMeta::new_readonly(config_address, false),
781 AccountMeta::new(game_address, false),
782 AccountMeta::new(dojo_address, false),
783 AccountMeta::new(user_ata, false),
784 AccountMeta::new(treasury_ata, false),
785 AccountMeta::new(DOJO_MINT, false),
786 AccountMeta::new(treasury_address, false),
787 AccountMeta::new_readonly(spl_token::ID, false),
788 ],
789 data: BuyTicketsWithShards {}.to_bytes(),
790 }
791}
792
793pub fn buy_bundle(signer: Pubkey) -> Instruction {
795 let config_address = config_pda(&program_id()).0;
796 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
797
798 Instruction {
799 program_id: program_id(),
800 accounts: vec![
801 AccountMeta::new(signer, true),
802 AccountMeta::new_readonly(config_address, false),
803 AccountMeta::new(dojo_address, false),
804 AccountMeta::new(FEE_COLLECTOR, false),
805 AccountMeta::new_readonly(system_program::ID, false),
806 ],
807 data: BuyBundle {}.to_bytes(),
808 }
809}
810
811pub fn clear_forge_cooldown(signer: Pubkey) -> Instruction {
813 let config_address = config_pda(&program_id()).0;
814 let game_address = game_pda(&program_id()).0;
815 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
816 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
817 let treasury_address = treasury_pda(&program_id()).0;
818 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
819 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
820
821 Instruction {
822 program_id: program_id(),
823 accounts: vec![
824 AccountMeta::new(signer, true),
825 AccountMeta::new_readonly(config_address, false),
826 AccountMeta::new(game_address, false),
827 AccountMeta::new(dojo_address, false),
828 AccountMeta::new(forge_address, false),
829 AccountMeta::new(user_ata, false),
830 AccountMeta::new(treasury_ata, false),
831 AccountMeta::new(DOJO_MINT, false),
832 AccountMeta::new(treasury_address, false),
833 AccountMeta::new_readonly(spl_token::ID, false),
834 ],
835 data: ClearForgeCooldown {}.to_bytes(),
836 }
837}
838
839pub fn set_genesis_slot(authority: Pubkey, genesis_slot: u64, halving_period_slots: u64) -> Instruction {
841 let config_address = config_pda(&program_id()).0;
842 let game_address = game_pda(&program_id()).0;
843
844 Instruction {
845 program_id: program_id(),
846 accounts: vec![
847 AccountMeta::new(authority, true),
848 AccountMeta::new(config_address, false),
849 AccountMeta::new(game_address, false),
850 ],
851 data: SetGenesisSlot {
852 genesis_slot: genesis_slot.to_le_bytes(),
853 halving_period_slots: halving_period_slots.to_le_bytes(),
854 }
855 .to_bytes(),
856 }
857}
858
859pub fn roll_scene_section_amethyst(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
862 let config_address = config_pda(&program_id()).0;
863 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
864 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
865
866 Instruction {
867 program_id: program_id(),
868 accounts: vec![
869 AccountMeta::new(signer, true),
870 AccountMeta::new_readonly(config_address, false),
871 AccountMeta::new(dojo_address, false),
872 AccountMeta::new(scenes_address, false),
873 AccountMeta::new_readonly(system_program::ID, false),
874 ],
875 data: RollSceneSectionAmethyst {
876 count: count.to_le_bytes(),
877 seed,
878 }
879 .to_bytes(),
880 }
881}
882
883pub fn roll_scene_section_shards(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
886 let config_address = config_pda(&program_id()).0;
887 let game_address = game_pda(&program_id()).0;
888 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
889 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
890 let treasury_address = treasury_pda(&program_id()).0;
891 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
892 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
893
894 Instruction {
895 program_id: program_id(),
896 accounts: vec![
897 AccountMeta::new(signer, true),
898 AccountMeta::new_readonly(config_address, false),
899 AccountMeta::new(game_address, false),
900 AccountMeta::new(dojo_address, false),
901 AccountMeta::new(scenes_address, false),
902 AccountMeta::new(user_ata, false),
903 AccountMeta::new(treasury_ata, false),
904 AccountMeta::new(DOJO_MINT, false),
905 AccountMeta::new(treasury_address, false),
906 AccountMeta::new_readonly(spl_token::ID, false),
907 AccountMeta::new_readonly(system_program::ID, false),
908 ],
909 data: RollSceneSectionShards {
910 count: count.to_le_bytes(),
911 seed,
912 }
913 .to_bytes(),
914 }
915}
916
917pub fn salvage_scene_section(signer: Pubkey) -> Instruction {
919 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
920 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
921
922 Instruction {
923 program_id: program_id(),
924 accounts: vec![
925 AccountMeta::new(signer, true),
926 AccountMeta::new(dojo_address, false),
927 AccountMeta::new(scenes_address, false),
928 ],
929 data: SalvageSceneSection {}.to_bytes(),
930 }
931}
932
933pub fn update_active_scene(signer: Pubkey, scene_id: u64) -> Instruction {
936 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
937 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
938 let game_address = game_pda(&program_id()).0;
939 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
940
941 Instruction {
942 program_id: program_id(),
943 accounts: vec![
944 AccountMeta::new(signer, true),
945 AccountMeta::new(dojo_address, false),
946 AccountMeta::new(scenes_address, false),
947 AccountMeta::new(game_address, false),
948 AccountMeta::new(barracks_address, false),
949 ],
950 data: UpdateActiveScene {
951 scene_id: scene_id.to_le_bytes(),
952 }
953 .to_bytes(),
954 }
955}
956
957pub fn buy_scene(signer: Pubkey, scene_id: u64) -> Instruction {
959 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
960 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
961
962 Instruction {
963 program_id: program_id(),
964 accounts: vec![
965 AccountMeta::new(signer, true),
966 AccountMeta::new(dojo_address, false),
967 AccountMeta::new(scenes_address, false),
968 AccountMeta::new_readonly(system_program::ID, false),
969 ],
970 data: BuyScene {
971 scene_id: scene_id.to_le_bytes(),
972 }
973 .to_bytes(),
974 }
975}
976
977pub fn buy_scene_dojo(signer: Pubkey, scene_id: u64) -> Instruction {
979 let config_address = config_pda(&program_id()).0;
980 let (game_address, _) = game_pda(&program_id());
981 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
982 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
983 let treasury_address = treasury_pda(&program_id()).0;
984 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
985 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
986
987 Instruction {
988 program_id: program_id(),
989 accounts: vec![
990 AccountMeta::new(signer, true),
991 AccountMeta::new_readonly(config_address, false),
992 AccountMeta::new(game_address, false),
993 AccountMeta::new(dojo_address, false),
994 AccountMeta::new(scenes_address, false),
995 AccountMeta::new(user_ata, false),
996 AccountMeta::new(treasury_ata, false),
997 AccountMeta::new(DOJO_MINT, false),
998 AccountMeta::new(treasury_address, false),
999 AccountMeta::new_readonly(spl_token::ID, false),
1000 AccountMeta::new_readonly(system_program::ID, false),
1001 ],
1002 data: BuySceneDojo {
1003 scene_id: scene_id.to_le_bytes(),
1004 }
1005 .to_bytes(),
1006 }
1007}
1008
1009pub fn log(config: Pubkey, msg: &[u8]) -> Instruction {
1011 let mut data = Log {
1012 _reserved: [0u8; 8],
1013 }
1014 .to_bytes();
1015 data.extend_from_slice(msg);
1016 Instruction {
1017 program_id: program_id(),
1018 accounts: vec![AccountMeta::new(config, true)],
1019 data,
1020 }
1021}