spl_record/
state.rs

1//! Program state
2use {
3    bytemuck::{Pod, Zeroable},
4    solana_program_pack::IsInitialized,
5    solana_pubkey::Pubkey,
6};
7
8/// Header type for recorded account data
9#[repr(C)]
10#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
11pub struct RecordData {
12    /// Struct version, allows for upgrades to the program
13    pub version: u8,
14
15    /// The account allowed to update the data
16    pub authority: Pubkey,
17}
18
19impl RecordData {
20    /// Version to fill in on new created accounts
21    pub const CURRENT_VERSION: u8 = 1;
22
23    /// Start of writable account data, after version and authority
24    pub const WRITABLE_START_INDEX: usize = 33;
25}
26
27impl IsInitialized for RecordData {
28    /// Is initialized
29    fn is_initialized(&self) -> bool {
30        self.version == Self::CURRENT_VERSION
31    }
32}
33
34#[cfg(test)]
35pub mod tests {
36    use {super::*, solana_program_error::ProgramError};
37
38    /// Version for tests
39    pub const TEST_VERSION: u8 = 1;
40    /// Pubkey for tests
41    pub const TEST_PUBKEY: Pubkey = Pubkey::new_from_array([100; 32]);
42    /// Bytes for tests
43    pub const TEST_BYTES: [u8; 8] = [42; 8];
44    /// RecordData for tests
45    pub const TEST_RECORD_DATA: RecordData = RecordData {
46        version: TEST_VERSION,
47        authority: TEST_PUBKEY,
48    };
49
50    #[test]
51    fn serialize_data() {
52        let mut expected = vec![TEST_VERSION];
53        expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
54        assert_eq!(bytemuck::bytes_of(&TEST_RECORD_DATA), expected);
55        assert_eq!(
56            *bytemuck::try_from_bytes::<RecordData>(&expected).unwrap(),
57            TEST_RECORD_DATA,
58        );
59    }
60
61    #[test]
62    fn deserialize_invalid_slice() {
63        let mut expected = vec![TEST_VERSION];
64        expected.extend_from_slice(&TEST_PUBKEY.to_bytes());
65        expected.extend_from_slice(&TEST_BYTES);
66        let err = bytemuck::try_from_bytes::<RecordData>(&expected)
67            .map_err(|_| ProgramError::InvalidArgument)
68            .unwrap_err();
69        assert_eq!(err, ProgramError::InvalidArgument);
70    }
71}