1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use anchor_lang::prelude::*;

use crate::{majority, MAX_FULFILLMENT_AUTHORITIES_COUNT};

/// This account is now obsolete and exists as a legacy to observe the old requests.
#[account]
#[cfg_attr(feature = "sdk", derive(Debug))]
pub struct Randomness {
    pub seed: [u8; 32],
    pub randomness: [u8; 64],
    pub responses: Vec<RandomnessResponse>,
}

impl Randomness {
    pub const SIZE: usize =
        32 + 64 + 4 + RandomnessResponse::SIZE * majority(MAX_FULFILLMENT_AUTHORITIES_COUNT);

    /// Returns fulfilled randomness.
    ///
    /// Returns `None` if randomness is not yet fulfilled.
    pub const fn fulfilled(&self) -> Option<&[u8; 64]> {
        if !matches!(
            self.randomness,
            [
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                0, 0, 0, 0, 0, 0, 0, 0,
            ]
        ) {
            Some(&self.randomness)
        } else {
            None
        }
    }
}

#[derive(AnchorDeserialize, AnchorSerialize, Clone)]
#[cfg_attr(feature = "sdk", derive(Debug))]
pub struct RandomnessResponse {
    pub pubkey: Pubkey,
    pub randomness: [u8; 64],
}

impl RandomnessResponse {
    pub const SIZE: usize = 32 + 64;
}