entropy_api/state/
var.rs

1use steel::*;
2
3use super::EntropyAccount;
4
5#[repr(C)]
6#[derive(Clone, Copy, Debug, PartialEq, Pod, Zeroable)]
7pub struct Var {
8    /// The creator of the variable.
9    pub authority: Pubkey,
10
11    /// The provider of the entropy data.
12    pub provider: Pubkey,
13
14    /// The commit provided by Entropy provider.
15    pub commit: [u8; 32],
16
17    /// The revealed seed.
18    pub seed: [u8; 32],
19
20    /// The slot hash
21    pub slot_hash: [u8; 32],
22
23    /// The current value of the variable.
24    pub value: [u8; 32],
25
26    /// The number of random variables remaining to be sampled.
27    pub samples: u64,
28
29    /// Whether or not the Entropy provider should automatically sample the slot hash.
30    pub is_auto: u64,
31
32    /// The slot at which the variable was opened.
33    pub start_at: u64,
34
35    /// The slot at which the variable should sample the slothash.
36    pub end_at: u64,
37}
38
39impl Var {
40    pub fn is_valid(&self, seed: [u8; 32]) -> bool {
41        if self.slot_hash == [0; 32] {
42            return false;
43        }
44        if self.value != [0; 32] {
45            return false;
46        }
47        if self.samples == 0 {
48            return false;
49        }
50        let expected_commit = solana_program::keccak::hash(&seed).to_bytes();
51        expected_commit == self.commit
52    }
53}
54
55account!(EntropyAccount, Var);