solana-program-library/binary-oracle-pair/program/src/state.rs

93 lines
2.1 KiB
Rust

//! State transition types
use borsh::{BorshDeserialize, BorshSerialize};
use solana_program::pubkey::Pubkey;
/// Uninitialized version value, all instances are at least version 1
pub const UNINITIALIZED_VERSION: u8 = 0;
/// Initialized pool version
pub const POOL_VERSION: u8 = 1;
/// Program states.
#[repr(C)]
#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone)]
pub struct Pool {
/// Initialized state.
pub version: u8,
/// Nonce used in program address.
pub bump_seed: u8,
/// Program ID of the tokens
pub token_program_id: Pubkey,
/// Account to deposit into
pub deposit_account: Pubkey,
/// Mint information for token Pass
pub token_pass_mint: Pubkey,
/// Mint information for token Fail
pub token_fail_mint: Pubkey,
/// decider key
pub decider: Pubkey,
/// mint end slot
pub mint_end_slot: u64,
/// decide end slot
pub decide_end_slot: u64,
/// decision status
pub decision: Decision,
}
/// Decision status
#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug, Clone)]
pub enum Decision {
/// Decision was not made
Undecided,
/// Decision set at Pass
Pass,
/// Decision set at Fail
Fail,
}
impl Pool {
/// Length serialized data
pub const LEN: usize = 179;
/// Check if Pool already initialized
pub fn is_initialized(&self) -> bool {
self.version != UNINITIALIZED_VERSION
}
}
mod test {
#[cfg(test)]
use super::*;
#[test]
pub fn test_pool_pack_unpack() {
let p = Pool {
version: 1,
bump_seed: 2,
token_program_id: Pubkey::new_unique(),
deposit_account: Pubkey::new_unique(),
token_pass_mint: Pubkey::new_unique(),
token_fail_mint: Pubkey::new_unique(),
decider: Pubkey::new_unique(),
mint_end_slot: 433,
decide_end_slot: 5546,
decision: Decision::Fail,
};
let packed = p.try_to_vec().unwrap();
let unpacked = Pool::try_from_slice(packed.as_slice()).unwrap();
assert_eq!(p, unpacked);
}
}