spl_binary_oracle_pair/
state.rs

1//! State transition types
2
3use borsh::{BorshDeserialize, BorshSerialize};
4use solana_program::pubkey::Pubkey;
5
6/// Uninitialized version value, all instances are at least version 1
7pub const UNINITIALIZED_VERSION: u8 = 0;
8/// Initialized pool version
9pub const POOL_VERSION: u8 = 1;
10
11/// Program states.
12#[repr(C)]
13#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone)]
14pub struct Pool {
15    /// Initialized state.
16    pub version: u8,
17
18    /// Nonce used in program address.
19    pub bump_seed: u8,
20
21    /// Program ID of the tokens
22    pub token_program_id: Pubkey,
23
24    /// Account to deposit into
25    pub deposit_account: Pubkey,
26
27    /// Mint information for token Pass
28    pub token_pass_mint: Pubkey,
29
30    /// Mint information for token Fail
31    pub token_fail_mint: Pubkey,
32
33    /// decider key
34    pub decider: Pubkey,
35
36    /// mint end slot
37    pub mint_end_slot: u64,
38
39    /// decide end slot
40    pub decide_end_slot: u64,
41
42    /// decision status
43    pub decision: Decision,
44}
45
46/// Decision status
47#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone)]
48pub enum Decision {
49    /// Decision was not made
50    Undecided,
51    /// Decision set at Pass
52    Pass,
53    /// Decision set at Fail
54    Fail,
55}
56
57impl Pool {
58    /// Length serialized data
59    pub const LEN: usize = 179;
60
61    /// Check if Pool already initialized
62    pub fn is_initialized(&self) -> bool {
63        self.version != UNINITIALIZED_VERSION
64    }
65}
66
67mod test {
68    #[cfg(test)]
69    use super::*;
70
71    #[test]
72    pub fn test_pool_pack_unpack() {
73        let p = Pool {
74            version: 1,
75            bump_seed: 2,
76            token_program_id: Pubkey::new_unique(),
77            deposit_account: Pubkey::new_unique(),
78            token_pass_mint: Pubkey::new_unique(),
79            token_fail_mint: Pubkey::new_unique(),
80            decider: Pubkey::new_unique(),
81            mint_end_slot: 433,
82            decide_end_slot: 5546,
83            decision: Decision::Fail,
84        };
85
86        let packed = p.try_to_vec().unwrap();
87
88        let unpacked = Pool::try_from_slice(packed.as_slice()).unwrap();
89
90        assert_eq!(p, unpacked);
91    }
92}