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::FEE_COLLECTOR,
12 instruction::*,
13 state::*,
14};
15
16fn program_id() -> Pubkey {
17 crate::ID
18}
19
20pub fn initialize(
22 authority: Pubkey,
23 dojo_mint: Pubkey,
24) -> Instruction {
25 let config_address = config_pda(&program_id()).0;
26 let game_address = game_pda(&program_id()).0;
27 let treasury_address = treasury_pda(&program_id()).0;
28 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
29
30 Instruction {
31 program_id: program_id(),
32 accounts: vec![
33 AccountMeta::new(authority, true),
34 AccountMeta::new(config_address, false),
35 AccountMeta::new(game_address, false),
36 AccountMeta::new(treasury_address, false),
37 AccountMeta::new(treasury_ata, false),
38 AccountMeta::new_readonly(dojo_mint, false),
39 AccountMeta::new_readonly(spl_token::ID, false),
40 AccountMeta::new_readonly(spl_associated_token_account::ID, false),
41 AccountMeta::new_readonly(system_program::ID, false),
42 ],
43 data: Initialize {}.to_bytes(),
44 }
45}
46
47pub fn buy_starter_pack(
50 signer: Pubkey,
51 referrer: Option<Pubkey>,
52) -> Instruction {
53 let config_address = config_pda(&program_id()).0;
54 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
55 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
56 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
57 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
58 let treasury_address = treasury_pda(&program_id()).0;
59
60 let referrer_bytes = referrer.map(|p| p.to_bytes()).unwrap_or([0u8; 32]);
61
62 let game_address = game_pda(&program_id()).0;
63 let mut accounts = vec![
64 AccountMeta::new(signer, true),
65 AccountMeta::new(config_address, false),
66 AccountMeta::new(game_address, false),
67 AccountMeta::new(dojo_address, false),
68 AccountMeta::new(barracks_address, false),
69 AccountMeta::new(forge_address, false),
70 AccountMeta::new(tasks_address, false),
71 AccountMeta::new(treasury_address, false),
72 AccountMeta::new(FEE_COLLECTOR, false),
73 AccountMeta::new_readonly(system_program::ID, false),
74 ];
75 if let Some(ref_dojo) = referrer {
76 let (referral_address, _) = referral_pda(&program_id(), &ref_dojo);
77 accounts.push(AccountMeta::new_readonly(ref_dojo, false));
78 accounts.push(AccountMeta::new(referral_address, false));
79 }
80
81 Instruction {
82 program_id: program_id(),
83 accounts,
84 data: BuyStarterPack { referrer: referrer_bytes }.to_bytes(),
85 }
86}
87
88pub fn recruit_shogun_tickets(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
91 let config_address = config_pda(&program_id()).0;
92 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
93 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
94
95 Instruction {
96 program_id: program_id(),
97 accounts: vec![
98 AccountMeta::new(signer, true),
99 AccountMeta::new_readonly(config_address, false),
100 AccountMeta::new(dojo_address, false),
101 AccountMeta::new(tasks_address, false),
102 ],
103 data: RecruitShogunTickets {
104 count: count.to_le_bytes(),
105 seed,
106 }
107 .to_bytes(),
108 }
109}
110
111pub fn recruit_shogun_sol(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
114 let config_address = config_pda(&program_id()).0;
115 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
116 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
117
118 Instruction {
119 program_id: program_id(),
120 accounts: vec![
121 AccountMeta::new(signer, true),
122 AccountMeta::new_readonly(config_address, false),
123 AccountMeta::new(dojo_address, false),
124 AccountMeta::new(tasks_address, false),
125 AccountMeta::new(FEE_COLLECTOR, false),
126 ],
127 data: RecruitShogunSol {
128 count: count.to_le_bytes(),
129 seed,
130 }
131 .to_bytes(),
132 }
133}
134
135pub fn seat_shogun(signer: Pubkey, slot: u64, rarity: u64, element: u64) -> Instruction {
137 let config_address = config_pda(&program_id()).0;
138 let game_address = game_pda(&program_id()).0;
139 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
140 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
141
142 Instruction {
143 program_id: program_id(),
144 accounts: vec![
145 AccountMeta::new(signer, true),
146 AccountMeta::new_readonly(config_address, false),
147 AccountMeta::new(game_address, false),
148 AccountMeta::new(dojo_address, false),
149 AccountMeta::new(barracks_address, false),
150 ],
151 data: SeatShogun {
152 slot: slot.to_le_bytes(),
153 rarity: rarity.to_le_bytes(),
154 element: element.to_le_bytes(),
155 }
156 .to_bytes(),
157 }
158}
159
160pub fn replace_shogun(signer: Pubkey, slot: u64, new_rarity: u64, new_element: u64) -> Instruction {
162 let config_address = config_pda(&program_id()).0;
163 let game_address = game_pda(&program_id()).0;
164 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
165 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
166
167 Instruction {
168 program_id: program_id(),
169 accounts: vec![
170 AccountMeta::new(signer, true),
171 AccountMeta::new_readonly(config_address, false),
172 AccountMeta::new(game_address, false),
173 AccountMeta::new(dojo_address, false),
174 AccountMeta::new(barracks_address, false),
175 ],
176 data: ReplaceShogun {
177 slot: slot.to_le_bytes(),
178 new_rarity: new_rarity.to_le_bytes(),
179 new_element: new_element.to_le_bytes(),
180 }
181 .to_bytes(),
182 }
183}
184
185pub fn seat_shogun_fill_all(
187 signer: Pubkey,
188 entries: impl IntoIterator<Item = (u64, u64)>,
189) -> Instruction {
190 let config_address = config_pda(&program_id()).0;
191 let game_address = game_pda(&program_id()).0;
192 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
193 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
194
195 let mut arr: [SeatShogunFillAllEntry; 12] = [SeatShogunFillAllEntry {
196 rarity: [0; 8],
197 element: [0; 8],
198 }; 12];
199 let mut count = 0u8;
200 for (i, (rarity, element)) in entries.into_iter().take(12).enumerate() {
201 arr[i] = SeatShogunFillAllEntry {
202 rarity: rarity.to_le_bytes(),
203 element: element.to_le_bytes(),
204 };
205 count += 1;
206 }
207
208 Instruction {
209 program_id: program_id(),
210 accounts: vec![
211 AccountMeta::new(signer, true),
212 AccountMeta::new_readonly(config_address, false),
213 AccountMeta::new(game_address, false),
214 AccountMeta::new(dojo_address, false),
215 AccountMeta::new(barracks_address, false),
216 ],
217 data: SeatShogunFillAll {
218 count,
219 _pad: [0; 7],
220 entries: arr,
221 }
222 .to_bytes(),
223 }
224}
225
226pub fn dine(signer: Pubkey, dojo_mint: Pubkey, slot: u64, tier: u64) -> Instruction {
228 let config_address = config_pda(&program_id()).0;
229 let game_address = game_pda(&program_id()).0;
230 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
231 let treasury_address = treasury_pda(&program_id()).0;
232 let user_ata = get_associated_token_address(&signer, &dojo_mint);
233 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
234 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
235
236 Instruction {
237 program_id: program_id(),
238 accounts: vec![
239 AccountMeta::new(signer, true),
240 AccountMeta::new_readonly(config_address, false),
241 AccountMeta::new(game_address, false),
242 AccountMeta::new(dojo_address, false),
243 AccountMeta::new(barracks_address, false),
244 AccountMeta::new(user_ata, false),
245 AccountMeta::new(treasury_ata, false),
246 AccountMeta::new(dojo_mint, false),
247 AccountMeta::new(treasury_address, false),
248 AccountMeta::new_readonly(spl_token::ID, false),
249 ],
250 data: Dine {
251 tier: tier.to_le_bytes(),
252 slot: slot.to_le_bytes(),
253 }
254 .to_bytes(),
255 }
256}
257
258pub fn upgrade_barracks_shards(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
260 let config_address = config_pda(&program_id()).0;
261 let game_address = game_pda(&program_id()).0;
262 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
263 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
264 let treasury_address = treasury_pda(&program_id()).0;
265 let user_ata = get_associated_token_address(&signer, &dojo_mint);
266 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
267
268 Instruction {
269 program_id: program_id(),
270 accounts: vec![
271 AccountMeta::new(signer, true),
272 AccountMeta::new_readonly(config_address, false),
273 AccountMeta::new(game_address, false),
274 AccountMeta::new(dojo_address, false),
275 AccountMeta::new(barracks_address, false),
276 AccountMeta::new(user_ata, false),
277 AccountMeta::new(treasury_ata, false),
278 AccountMeta::new(dojo_mint, false),
279 AccountMeta::new(treasury_address, false),
280 AccountMeta::new_readonly(spl_token::ID, false),
281 ],
282 data: UpgradeBarracksShards {}.to_bytes(),
283 }
284}
285
286pub fn upgrade_barracks_sol(signer: Pubkey) -> Instruction {
288 let config_address = config_pda(&program_id()).0;
289 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
290 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
291
292 Instruction {
293 program_id: program_id(),
294 accounts: vec![
295 AccountMeta::new(signer, true),
296 AccountMeta::new_readonly(config_address, false),
297 AccountMeta::new(dojo_address, false),
298 AccountMeta::new(barracks_address, false),
299 AccountMeta::new(FEE_COLLECTOR, false),
300 AccountMeta::new_readonly(system_program::ID, false),
301 ],
302 data: UpgradeBarracksSol {}.to_bytes(),
303 }
304}
305
306pub fn upgrade_forge(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
308 let config_address = config_pda(&program_id()).0;
309 let game_address = game_pda(&program_id()).0;
310 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
311 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
312 let treasury_address = treasury_pda(&program_id()).0;
313 let user_ata = get_associated_token_address(&signer, &dojo_mint);
314 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
315
316 Instruction {
317 program_id: program_id(),
318 accounts: vec![
319 AccountMeta::new(signer, true),
320 AccountMeta::new_readonly(config_address, false),
321 AccountMeta::new(game_address, false),
322 AccountMeta::new(dojo_address, false),
323 AccountMeta::new(forge_address, false),
324 AccountMeta::new(FEE_COLLECTOR, false),
325 AccountMeta::new_readonly(system_program::ID, 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: UpgradeForge {}.to_bytes(),
333 }
334}
335
336pub fn merge_shogun(signer: Pubkey, merge_type: u64, seed: [u8; 32]) -> Instruction {
339 let config_address = config_pda(&program_id()).0;
340 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
341 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
342
343 Instruction {
344 program_id: program_id(),
345 accounts: vec![
346 AccountMeta::new(signer, true),
347 AccountMeta::new_readonly(config_address, false),
348 AccountMeta::new(dojo_address, false),
349 AccountMeta::new(tasks_address, false),
350 ],
351 data: MergeShogun {
352 merge_type: merge_type.to_le_bytes(),
353 seed,
354 }
355 .to_bytes(),
356 }
357}
358
359pub fn prestige_upgrade(signer: Pubkey, slot: u64) -> Instruction {
361 let config_address = config_pda(&program_id()).0;
362 let game_address = game_pda(&program_id()).0;
363 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
364 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
365 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
366
367 Instruction {
368 program_id: program_id(),
369 accounts: vec![
370 AccountMeta::new(signer, true),
371 AccountMeta::new_readonly(config_address, false),
372 AccountMeta::new(game_address, false),
373 AccountMeta::new(dojo_address, false),
374 AccountMeta::new(barracks_address, false),
375 AccountMeta::new(tasks_address, false),
376 ],
377 data: PrestigeUpgrade {
378 slot: slot.to_le_bytes(),
379 }
380 .to_bytes(),
381 }
382}
383
384pub fn level_up_shogun(signer: Pubkey, dojo_mint: Pubkey, slot: u64) -> Instruction {
386 let config_address = config_pda(&program_id()).0;
387 let game_address = game_pda(&program_id()).0;
388 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
389 let treasury_address = treasury_pda(&program_id()).0;
390 let user_ata = get_associated_token_address(&signer, &dojo_mint);
391 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
392 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
393
394 Instruction {
395 program_id: program_id(),
396 accounts: vec![
397 AccountMeta::new(signer, true),
398 AccountMeta::new_readonly(config_address, false),
399 AccountMeta::new(game_address, false),
400 AccountMeta::new(dojo_address, false),
401 AccountMeta::new(barracks_address, false),
402 AccountMeta::new(user_ata, false),
403 AccountMeta::new(treasury_ata, false),
404 AccountMeta::new(dojo_mint, false),
405 AccountMeta::new(treasury_address, false),
406 AccountMeta::new_readonly(spl_token::ID, false),
407 ],
408 data: LevelUpShogun {
409 slot: slot.to_le_bytes(),
410 }
411 .to_bytes(),
412 }
413}
414
415pub fn claim_shards(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
418 let config_address = config_pda(&program_id()).0;
419 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
420 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
421 let (barracks_address, _) = barracks_pda(&program_id(), &dojo_address);
422 let treasury_address = treasury_pda(&program_id()).0;
423 let dojo_ata = get_associated_token_address(&signer, &dojo_mint);
424
425 Instruction {
426 program_id: program_id(),
427 accounts: vec![
428 AccountMeta::new(signer, true),
429 AccountMeta::new_readonly(config_address, false),
430 AccountMeta::new(dojo_address, false),
431 AccountMeta::new(forge_address, false),
432 AccountMeta::new(barracks_address, false),
433 AccountMeta::new(dojo_ata, false),
434 AccountMeta::new(dojo_mint, false),
435 AccountMeta::new(treasury_address, false),
436 AccountMeta::new_readonly(spl_token::ID, false),
437 ],
438 data: ClaimShards {}.to_bytes(),
439 }
440}
441
442pub fn claim_referral_reward(signer: Pubkey, referrer_dojo: Pubkey) -> Instruction {
444 let (referral_address, _) = referral_pda(&program_id(), &referrer_dojo);
445 let treasury_address = treasury_pda(&program_id()).0;
446
447 Instruction {
448 program_id: program_id(),
449 accounts: vec![
450 AccountMeta::new(signer, true),
451 AccountMeta::new(referrer_dojo, false),
452 AccountMeta::new(referral_address, false),
453 AccountMeta::new(treasury_address, false),
454 AccountMeta::new_readonly(system_program::ID, false),
455 ],
456 data: ClaimReferralReward {}.to_bytes(),
457 }
458}
459
460pub fn claim_recruit_reward(signer: Pubkey) -> Instruction {
462 let config_address = config_pda(&program_id()).0;
463 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
464 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
465
466 Instruction {
467 program_id: program_id(),
468 accounts: vec![
469 AccountMeta::new(signer, true),
470 AccountMeta::new_readonly(config_address, false),
471 AccountMeta::new(dojo_address, false),
472 AccountMeta::new(tasks_address, false),
473 ],
474 data: ClaimRecruitReward {}.to_bytes(),
475 }
476}
477
478pub fn claim_forge_reward(signer: Pubkey) -> Instruction {
480 let config_address = config_pda(&program_id()).0;
481 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
482 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
483
484 Instruction {
485 program_id: program_id(),
486 accounts: vec![
487 AccountMeta::new(signer, true),
488 AccountMeta::new_readonly(config_address, false),
489 AccountMeta::new(dojo_address, false),
490 AccountMeta::new(tasks_address, false),
491 ],
492 data: ClaimForgeReward {}.to_bytes(),
493 }
494}
495
496pub fn claim_dine_reward(signer: Pubkey) -> Instruction {
498 let config_address = config_pda(&program_id()).0;
499 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
500 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
501
502 Instruction {
503 program_id: program_id(),
504 accounts: vec![
505 AccountMeta::new(signer, true),
506 AccountMeta::new_readonly(config_address, false),
507 AccountMeta::new(dojo_address, false),
508 AccountMeta::new(tasks_address, false),
509 ],
510 data: ClaimDineReward {}.to_bytes(),
511 }
512}
513
514pub fn ed25519_verify_instruction_for_daily_claim(
517 dojo_pda: Pubkey,
518 signature: [u8; 64],
519) -> Instruction {
520 use crate::consts::{CLAIM_TASK_PREFIX, DAILY_TASK_START, TASK_VERIFIER};
521 let mut message = Vec::with_capacity(CLAIM_TASK_PREFIX.len() + 32 + 8);
522 message.extend_from_slice(CLAIM_TASK_PREFIX);
523 message.extend_from_slice(dojo_pda.as_ref());
524 message.extend_from_slice(&DAILY_TASK_START.to_le_bytes());
525 let verifier_bytes: [u8; 32] = TASK_VERIFIER.to_bytes();
526 crate::utils::new_ed25519_instruction_with_signature(&message, &signature, &verifier_bytes)
527}
528
529pub fn claim_daily_reward(signer: Pubkey, signature: [u8; 64]) -> Instruction {
532 let config_address = config_pda(&program_id()).0;
533 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
534 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
535 let instructions_sysvar = solana_program::sysvar::instructions::ID;
536
537 Instruction {
538 program_id: program_id(),
539 accounts: vec![
540 AccountMeta::new(signer, true),
541 AccountMeta::new_readonly(config_address, false),
542 AccountMeta::new(dojo_address, false),
543 AccountMeta::new(tasks_address, false),
544 AccountMeta::new_readonly(instructions_sysvar, false),
545 ],
546 data: ClaimDailyReward { signature }.to_bytes(),
547 }
548}
549
550pub fn claim_collection_reward(signer: Pubkey, collection_index: u8) -> Instruction {
553 let config_address = config_pda(&program_id()).0;
554 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
555 let (tasks_address, _) = tasks_pda(&program_id(), &dojo_address);
556
557 Instruction {
558 program_id: program_id(),
559 accounts: vec![
560 AccountMeta::new(signer, true),
561 AccountMeta::new_readonly(config_address, false),
562 AccountMeta::new(dojo_address, false),
563 AccountMeta::new(tasks_address, false),
564 ],
565 data: ClaimCollectionReward { collection_index }.to_bytes(),
566 }
567}
568
569pub fn buy_flash_sale(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
571 let config_address = config_pda(&program_id()).0;
572 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
573 let treasury_address = treasury_pda(&program_id()).0;
574 let user_ata = get_associated_token_address(&signer, &dojo_mint);
575 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
576
577 Instruction {
578 program_id: program_id(),
579 accounts: vec![
580 AccountMeta::new(signer, true),
581 AccountMeta::new_readonly(config_address, false),
582 AccountMeta::new(dojo_address, false),
583 AccountMeta::new(user_ata, false),
584 AccountMeta::new_readonly(treasury_address, false),
585 AccountMeta::new(treasury_ata, false),
586 AccountMeta::new_readonly(spl_token::ID, false),
587 ],
588 data: BuyFlashSale {}.to_bytes(),
589 }
590}
591
592pub fn buy_tickets_with_shards(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
594 let config_address = config_pda(&program_id()).0;
595 let game_address = game_pda(&program_id()).0;
596 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
597 let treasury_address = treasury_pda(&program_id()).0;
598 let user_ata = get_associated_token_address(&signer, &dojo_mint);
599 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
600
601 Instruction {
602 program_id: program_id(),
603 accounts: vec![
604 AccountMeta::new(signer, true),
605 AccountMeta::new_readonly(config_address, false),
606 AccountMeta::new(game_address, false),
607 AccountMeta::new(dojo_address, false),
608 AccountMeta::new(user_ata, false),
609 AccountMeta::new(treasury_ata, false),
610 AccountMeta::new(dojo_mint, false),
611 AccountMeta::new(treasury_address, false),
612 AccountMeta::new_readonly(spl_token::ID, false),
613 ],
614 data: BuyTicketsWithShards {}.to_bytes(),
615 }
616}
617
618pub fn buy_bundle(signer: Pubkey) -> Instruction {
620 let config_address = config_pda(&program_id()).0;
621 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
622
623 Instruction {
624 program_id: program_id(),
625 accounts: vec![
626 AccountMeta::new(signer, true),
627 AccountMeta::new_readonly(config_address, false),
628 AccountMeta::new(dojo_address, false),
629 AccountMeta::new(FEE_COLLECTOR, false),
630 AccountMeta::new_readonly(system_program::ID, false),
631 ],
632 data: BuyBundle {}.to_bytes(),
633 }
634}
635
636pub fn clear_forge_cooldown(signer: Pubkey, dojo_mint: Pubkey) -> Instruction {
638 let config_address = config_pda(&program_id()).0;
639 let game_address = game_pda(&program_id()).0;
640 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
641 let (forge_address, _) = forge_pda(&program_id(), &dojo_address);
642 let treasury_address = treasury_pda(&program_id()).0;
643 let user_ata = get_associated_token_address(&signer, &dojo_mint);
644 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
645
646 Instruction {
647 program_id: program_id(),
648 accounts: vec![
649 AccountMeta::new(signer, true),
650 AccountMeta::new_readonly(config_address, false),
651 AccountMeta::new(game_address, false),
652 AccountMeta::new(dojo_address, false),
653 AccountMeta::new(forge_address, false),
654 AccountMeta::new(user_ata, false),
655 AccountMeta::new(treasury_ata, false),
656 AccountMeta::new(dojo_mint, false),
657 AccountMeta::new(treasury_address, false),
658 AccountMeta::new_readonly(spl_token::ID, false),
659 ],
660 data: ClearForgeCooldown {}.to_bytes(),
661 }
662}
663
664pub fn set_genesis_slot(authority: Pubkey, genesis_slot: u64, halving_period_slots: u64) -> Instruction {
666 let config_address = config_pda(&program_id()).0;
667 let game_address = game_pda(&program_id()).0;
668
669 Instruction {
670 program_id: program_id(),
671 accounts: vec![
672 AccountMeta::new(authority, true),
673 AccountMeta::new(config_address, false),
674 AccountMeta::new(game_address, false),
675 ],
676 data: SetGenesisSlot {
677 genesis_slot: genesis_slot.to_le_bytes(),
678 halving_period_slots: halving_period_slots.to_le_bytes(),
679 }
680 .to_bytes(),
681 }
682}
683
684pub fn migrate_dojo(signer: Pubkey) -> Instruction {
686 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
687
688 Instruction {
689 program_id: program_id(),
690 accounts: vec![
691 AccountMeta::new(signer, true),
692 AccountMeta::new(dojo_address, false),
693 AccountMeta::new_readonly(system_program::ID, false),
694 ],
695 data: MigrateDojo {}.to_bytes(),
696 }
697}
698
699pub fn roll_scene_section_amethyst(signer: Pubkey, count: u64, seed: [u8; 32]) -> Instruction {
702 let config_address = config_pda(&program_id()).0;
703 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
704 let (scenes_address, _) = scenes_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(scenes_address, false),
713 AccountMeta::new_readonly(system_program::ID, false),
714 ],
715 data: RollSceneSectionAmethyst {
716 count: count.to_le_bytes(),
717 seed,
718 }
719 .to_bytes(),
720 }
721}
722
723pub fn roll_scene_section_shards(
726 signer: Pubkey,
727 count: u64,
728 dojo_mint: Pubkey,
729 seed: [u8; 32],
730) -> Instruction {
731 let config_address = config_pda(&program_id()).0;
732 let game_address = game_pda(&program_id()).0;
733 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
734 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
735 let treasury_address = treasury_pda(&program_id()).0;
736 let user_ata = get_associated_token_address(&signer, &dojo_mint);
737 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
738
739 Instruction {
740 program_id: program_id(),
741 accounts: vec![
742 AccountMeta::new(signer, true),
743 AccountMeta::new_readonly(config_address, false),
744 AccountMeta::new(game_address, false),
745 AccountMeta::new(dojo_address, false),
746 AccountMeta::new(scenes_address, false),
747 AccountMeta::new(user_ata, false),
748 AccountMeta::new(treasury_ata, false),
749 AccountMeta::new_readonly(dojo_mint, false),
750 AccountMeta::new(treasury_address, false),
751 AccountMeta::new_readonly(spl_token::ID, false),
752 AccountMeta::new_readonly(system_program::ID, false),
753 ],
754 data: RollSceneSectionShards {
755 count: count.to_le_bytes(),
756 seed,
757 }
758 .to_bytes(),
759 }
760}
761
762pub fn salvage_scene_section(
765 signer: Pubkey,
766 items: impl IntoIterator<Item = (u8, u8, u16)>,
767) -> Instruction {
768 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
769 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
770
771 let items: Vec<_> = items.into_iter().take(64).collect();
772 let item_count = items.len() as u8;
773 let mut salvage_items = [SalvageItem {
774 scene_id: 0,
775 section_id: 0,
776 count: 0,
777 }; 64];
778 for (i, (scene_id, section_id, count)) in items.into_iter().enumerate() {
779 salvage_items[i] = SalvageItem {
780 scene_id,
781 section_id,
782 count,
783 };
784 }
785
786 Instruction {
787 program_id: program_id(),
788 accounts: vec![
789 AccountMeta::new(signer, true),
790 AccountMeta::new(dojo_address, false),
791 AccountMeta::new(scenes_address, false),
792 ],
793 data: SalvageSceneSection {
794 item_count,
795 _pad: [0; 3],
796 items: salvage_items,
797 }
798 .to_bytes(),
799 }
800}
801
802pub fn buy_scene(signer: Pubkey, scene_id: u64) -> Instruction {
804 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
805 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
806
807 Instruction {
808 program_id: program_id(),
809 accounts: vec![
810 AccountMeta::new(signer, true),
811 AccountMeta::new(dojo_address, false),
812 AccountMeta::new(scenes_address, false),
813 AccountMeta::new_readonly(system_program::ID, false),
814 ],
815 data: BuyScene {
816 scene_id: scene_id.to_le_bytes(),
817 }
818 .to_bytes(),
819 }
820}
821
822pub fn buy_scene_dojo(signer: Pubkey, dojo_mint: Pubkey, scene_id: u64) -> Instruction {
824 let config_address = config_pda(&program_id()).0;
825 let (dojo_address, _) = dojo_pda(&program_id(), &signer);
826 let (scenes_address, _) = scenes_pda(&program_id(), &dojo_address);
827 let treasury_address = treasury_pda(&program_id()).0;
828 let user_ata = get_associated_token_address(&signer, &dojo_mint);
829 let treasury_ata = get_associated_token_address(&treasury_address, &dojo_mint);
830
831 Instruction {
832 program_id: program_id(),
833 accounts: vec![
834 AccountMeta::new(signer, true),
835 AccountMeta::new_readonly(config_address, false),
836 AccountMeta::new(dojo_address, false),
837 AccountMeta::new(scenes_address, false),
838 AccountMeta::new(user_ata, false),
839 AccountMeta::new(treasury_ata, false),
840 AccountMeta::new(dojo_mint, false),
841 AccountMeta::new(treasury_address, false),
842 AccountMeta::new_readonly(spl_token::ID, false),
843 AccountMeta::new_readonly(system_program::ID, false),
844 ],
845 data: BuySceneDojo {
846 scene_id: scene_id.to_le_bytes(),
847 }
848 .to_bytes(),
849 }
850}
851
852pub fn log(config: Pubkey, msg: &[u8]) -> Instruction {
854 let mut data = Log {
855 _reserved: [0u8; 8],
856 }
857 .to_bytes();
858 data.extend_from_slice(msg);
859 Instruction {
860 program_id: program_id(),
861 accounts: vec![AccountMeta::new(config, true)],
862 data,
863 }
864}