td_program_sdk/instructions/
update_player_game_values.rs

1use std::slice::from_raw_parts;
2
3use solana_sdk::{
4    instruction::{AccountMeta, Instruction},
5    pubkey::Pubkey,
6};
7
8use crate::PROGRAM_ID;
9
10use super::{write_bytes, InstructionDiscriminator, UNINIT_BYTE};
11
12
13#[inline(always)]
14pub fn update_player_game_values(
15    player: &Pubkey,
16    signer: &Pubkey,
17    last_time_played: u64,
18    wave_count: u8,
19) -> Instruction {
20    let account_metas: [AccountMeta; 2] = [
21        AccountMeta::new(*player, false),
22        AccountMeta::new(*signer, true),
23    ];
24
25    // Instruction data layout:
26    // -  [0]: instruction discriminator (1 byte, u8)
27    // -  [1..9]: last_time_played (8 byte, u64)
28    // -  [8]: wave count (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::UpdatePlayerGameValues 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], &wave_count.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}