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(
698 signer: Pubkey,
699 signer_sgt_token_account: Pubkey,
700 sgt_mint: Pubkey,
701) -> Instruction {
702 let config_address = config_pda(&program_id()).0;
703 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
704 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
705
706 Instruction {
707 program_id: program_id(),
708 accounts: vec![
709 AccountMeta::new(signer, true),
710 AccountMeta::new_readonly(config_address, false),
711 AccountMeta::new(dojo_address, false),
712 AccountMeta::new(tasks_address, false),
713 AccountMeta::new_readonly(signer_sgt_token_account, false),
714 AccountMeta::new_readonly(sgt_mint, false),
715 AccountMeta::new_readonly(spl_token_2022::ID, false),
716 ],
717 data: ClaimSeekerTaskReward {}.to_bytes(),
718 }
719}
720
721pub fn claim_collection_reward(signer: Pubkey, collection_index: u8) -> Instruction {
724 let config_address = config_pda(&program_id()).0;
725 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
726 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
727
728 Instruction {
729 program_id: program_id(),
730 accounts: vec![
731 AccountMeta::new(signer, true),
732 AccountMeta::new_readonly(config_address, false),
733 AccountMeta::new(dojo_address, false),
734 AccountMeta::new(tasks_address, false),
735 ],
736 data: ClaimCollectionReward { collection_index }.to_bytes(),
737 }
738}
739
740pub fn buy_flash_sale(signer: Pubkey) -> Instruction {
742 let config_address = config_pda(&program_id()).0;
743 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
744 let treasury_address = treasury_pda(&program_id()).0;
745 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
746 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
747
748 Instruction {
749 program_id: program_id(),
750 accounts: vec![
751 AccountMeta::new(signer, true),
752 AccountMeta::new_readonly(config_address, false),
753 AccountMeta::new(dojo_address, false),
754 AccountMeta::new(user_ata, false),
755 AccountMeta::new_readonly(treasury_address, false),
756 AccountMeta::new(treasury_ata, false),
757 AccountMeta::new_readonly(spl_token::ID, false),
758 ],
759 data: BuyFlashSale {}.to_bytes(),
760 }
761}
762
763pub fn buy_tickets_with_shards(signer: Pubkey) -> Instruction {
765 let config_address = config_pda(&program_id()).0;
766 let game_address = game_pda(&program_id()).0;
767 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
768 let treasury_address = treasury_pda(&program_id()).0;
769 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
770 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
771
772 Instruction {
773 program_id: program_id(),
774 accounts: vec![
775 AccountMeta::new(signer, true),
776 AccountMeta::new_readonly(config_address, false),
777 AccountMeta::new(game_address, false),
778 AccountMeta::new(dojo_address, false),
779 AccountMeta::new(user_ata, false),
780 AccountMeta::new(treasury_ata, false),
781 AccountMeta::new(DOJO_MINT, false),
782 AccountMeta::new(treasury_address, false),
783 AccountMeta::new_readonly(spl_token::ID, false),
784 ],
785 data: BuyTicketsWithShards {}.to_bytes(),
786 }
787}
788
789pub fn buy_bundle(signer: Pubkey) -> Instruction {
791 let config_address = config_pda(&program_id()).0;
792 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
793
794 Instruction {
795 program_id: program_id(),
796 accounts: vec![
797 AccountMeta::new(signer, true),
798 AccountMeta::new_readonly(config_address, false),
799 AccountMeta::new(dojo_address, false),
800 AccountMeta::new(FEE_COLLECTOR, false),
801 AccountMeta::new_readonly(system_program::ID, false),
802 ],
803 data: BuyBundle {}.to_bytes(),
804 }
805}
806
807pub fn clear_forge_cooldown(signer: Pubkey) -> Instruction {
809 let config_address = config_pda(&program_id()).0;
810 let game_address = game_pda(&program_id()).0;
811 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
812 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
813 let treasury_address = treasury_pda(&program_id()).0;
814 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
815 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
816
817 Instruction {
818 program_id: program_id(),
819 accounts: vec![
820 AccountMeta::new(signer, true),
821 AccountMeta::new_readonly(config_address, false),
822 AccountMeta::new(game_address, false),
823 AccountMeta::new(dojo_address, false),
824 AccountMeta::new(forge_address, false),
825 AccountMeta::new(user_ata, false),
826 AccountMeta::new(treasury_ata, false),
827 AccountMeta::new(DOJO_MINT, false),
828 AccountMeta::new(treasury_address, false),
829 AccountMeta::new_readonly(spl_token::ID, false),
830 ],
831 data: ClearForgeCooldown {}.to_bytes(),
832 }
833}
834
835pub fn set_genesis_slot(authority: Pubkey, genesis_slot: u64, halving_period_slots: u64) -> Instruction {
837 let config_address = config_pda(&program_id()).0;
838 let game_address = game_pda(&program_id()).0;
839
840 Instruction {
841 program_id: program_id(),
842 accounts: vec![
843 AccountMeta::new(authority, true),
844 AccountMeta::new(config_address, false),
845 AccountMeta::new(game_address, false),
846 ],
847 data: SetGenesisSlot {
848 genesis_slot: genesis_slot.to_le_bytes(),
849 halving_period_slots: halving_period_slots.to_le_bytes(),
850 }
851 .to_bytes(),
852 }
853}
854
855pub fn roll_scene_section_amethyst(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
858 let config_address = config_pda(&program_id()).0;
859 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
860 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
861
862 Instruction {
863 program_id: program_id(),
864 accounts: vec![
865 AccountMeta::new(signer, true),
866 AccountMeta::new_readonly(config_address, false),
867 AccountMeta::new(dojo_address, false),
868 AccountMeta::new(scenes_address, false),
869 AccountMeta::new_readonly(system_program::ID, false),
870 ],
871 data: RollSceneSectionAmethyst {
872 count: count.to_le_bytes(),
873 seed,
874 }
875 .to_bytes(),
876 }
877}
878
879pub fn roll_scene_section_shards(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
882 let config_address = config_pda(&program_id()).0;
883 let game_address = game_pda(&program_id()).0;
884 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
885 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
886 let treasury_address = treasury_pda(&program_id()).0;
887 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
888 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
889
890 Instruction {
891 program_id: program_id(),
892 accounts: vec![
893 AccountMeta::new(signer, true),
894 AccountMeta::new_readonly(config_address, false),
895 AccountMeta::new(game_address, false),
896 AccountMeta::new(dojo_address, false),
897 AccountMeta::new(scenes_address, false),
898 AccountMeta::new(user_ata, false),
899 AccountMeta::new(treasury_ata, false),
900 AccountMeta::new(DOJO_MINT, false),
901 AccountMeta::new(treasury_address, false),
902 AccountMeta::new_readonly(spl_token::ID, false),
903 AccountMeta::new_readonly(system_program::ID, false),
904 ],
905 data: RollSceneSectionShards {
906 count: count.to_le_bytes(),
907 seed,
908 }
909 .to_bytes(),
910 }
911}
912
913pub fn salvage_scene_section(signer: Pubkey) -> Instruction {
915 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
916 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
917
918 Instruction {
919 program_id: program_id(),
920 accounts: vec![
921 AccountMeta::new(signer, true),
922 AccountMeta::new(dojo_address, false),
923 AccountMeta::new(scenes_address, false),
924 ],
925 data: SalvageSceneSection {}.to_bytes(),
926 }
927}
928
929pub fn update_active_scene(signer: Pubkey, scene_id: u64) -> Instruction {
932 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
933 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
934 let game_address = game_pda(&program_id()).0;
935 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
936
937 Instruction {
938 program_id: program_id(),
939 accounts: vec![
940 AccountMeta::new(signer, true),
941 AccountMeta::new(dojo_address, false),
942 AccountMeta::new(scenes_address, false),
943 AccountMeta::new(game_address, false),
944 AccountMeta::new(barracks_address, false),
945 ],
946 data: UpdateActiveScene {
947 scene_id: scene_id.to_le_bytes(),
948 }
949 .to_bytes(),
950 }
951}
952
953pub fn buy_scene(signer: Pubkey, scene_id: u64) -> Instruction {
955 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
956 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
957
958 Instruction {
959 program_id: program_id(),
960 accounts: vec![
961 AccountMeta::new(signer, true),
962 AccountMeta::new(dojo_address, false),
963 AccountMeta::new(scenes_address, false),
964 AccountMeta::new_readonly(system_program::ID, false),
965 ],
966 data: BuyScene {
967 scene_id: scene_id.to_le_bytes(),
968 }
969 .to_bytes(),
970 }
971}
972
973pub fn buy_scene_dojo(signer: Pubkey, scene_id: u64) -> Instruction {
975 let config_address = config_pda(&program_id()).0;
976 let (game_address, _) = game_pda(&program_id());
977 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
978 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
979 let treasury_address = treasury_pda(&program_id()).0;
980 let user_ata = get_associated_token_address(&signer, &DOJO_MINT);
981 let treasury_ata = get_associated_token_address(&treasury_address, &DOJO_MINT);
982
983 Instruction {
984 program_id: program_id(),
985 accounts: vec![
986 AccountMeta::new(signer, true),
987 AccountMeta::new_readonly(config_address, false),
988 AccountMeta::new(game_address, false),
989 AccountMeta::new(dojo_address, false),
990 AccountMeta::new(scenes_address, false),
991 AccountMeta::new(user_ata, false),
992 AccountMeta::new(treasury_ata, false),
993 AccountMeta::new(DOJO_MINT, false),
994 AccountMeta::new(treasury_address, false),
995 AccountMeta::new_readonly(spl_token::ID, false),
996 AccountMeta::new_readonly(system_program::ID, false),
997 ],
998 data: BuySceneDojo {
999 scene_id: scene_id.to_le_bytes(),
1000 }
1001 .to_bytes(),
1002 }
1003}
1004
1005pub fn log(config: Pubkey, msg: &[u8]) -> Instruction {
1007 let mut data = Log {
1008 _reserved: [0u8; 8],
1009 }
1010 .to_bytes();
1011 data.extend_from_slice(msg);
1012 Instruction {
1013 program_id: program_id(),
1014 accounts: vec![AccountMeta::new(config, true)],
1015 data,
1016 }
1017}