td_program_sdk/instructions/
initialize_player.rs

1use std::slice::from_raw_parts;
2
3use solana_program::{
4    instruction::{AccountMeta, Instruction},
5    pubkey::Pubkey, system_program,
6};
7
8use crate::PROGRAM_ID;
9
10use super::{write_bytes, InstructionDiscriminator, UNINIT_BYTE};
11
12#[inline(always)]
13pub fn initialize_player(
14    player: &Pubkey,
15    signer: &Pubkey,
16    last_time_played: u64,
17    bump: u8,
18) -> Instruction {
19    let account_metas: [AccountMeta; 3] = [
20        AccountMeta::new(*player, false),
21        AccountMeta::new(*signer, true),
22        AccountMeta::new_readonly(system_program::ID, false),
23    ];
24
25    // Instruction data layout:
26    // -  [0]: instruction discriminator (1 byte, u8)
27    // -  [1..9]: last_time_played (8 byte, u64)
28    // -  [8]: bump (1 byte, u8)
29    let data_len = 10;
30
31    let mut instruction_data = vec![UNINIT_BYTE; data_len];
32    write_bytes(
33        &mut instruction_data,
34        &[InstructionDiscriminator::InitializePlayer as u8],
35    );
36    write_bytes(&mut instruction_data[1..9], &last_time_played.to_le_bytes());
37    write_bytes(&mut instruction_data[9..10], &bump.to_le_bytes());
38
39    Instruction {
40        program_id: PROGRAM_ID,
41        accounts: account_metas.to_vec(),
42        data: unsafe { from_raw_parts(instruction_data.as_ptr() as _, data_len).to_vec() },
43    }
44}