devol_accounts_kit/accounts/root/
root_account.rs

1use serde::{Deserialize, Serialize};
2use solana_program::pubkey::Pubkey;
3use crate::accounts::account_header::AccountHeader;
4use crate::accounts::devol_account::DevolAccount;
5use crate::accounts::devol_regular_account::DevolRegularAccount;
6use crate::dvl_error::DvlError;
7use crate::errors::AccountTag;
8
9pub const ROOT_ACCOUNT_VERSION_OFFSET: usize = 0;
10pub const ROOT_ACCOUNT_ADMIN_ADDRESS_OFFSET: usize = 8;
11pub const ROOT_ACCOUNT_WALLET_ADDRESS_OFFSET: usize = 40;
12pub const ROOT_ACCOUNT_KYC_PROVIDER_OFFSET: usize = 72;
13pub const ROOT_ACCOUNT_MINTS_ADDRESS_OFFSET: usize = 104;
14pub const ROOT_ACCOUNT_INSTRUMENTS_ADDRESS_OFFSET: usize = 136;
15pub const ROOT_ACCOUNT_WORKERS_ADDRESS_OFFSET: usize = 168;
16pub const ROOT_ACCOUNT_CLIENTS_COUNT_OFFSET: usize = 200;
17pub const ROOT_ACCOUNT_KYC_METHOD_OFFSET: usize = 204;
18pub const ROOT_ACCOUNT_MAX_LIGHT_VOLUME_OFFSET: usize = 208;
19pub const ROOT_ACCOUNT_SIZE: usize = 216;
20pub const ROOT_ACCOUNT_TAG: u8 = 0;
21pub const ROOT_ACCOUNT_VERSION: u32 = 2;
22
23#[derive(PartialEq, PartialOrd, Clone, Copy, Serialize, Deserialize)]
24#[repr(u32)]
25pub enum OpenAccountFeePayer {
26    Client = 0,
27    Devol = 1,
28}
29
30#[derive(Clone, Copy)]
31#[repr(C)]
32pub struct RootAccount {
33    pub header: AccountHeader,             // 40 bytes, ROOT_ACCOUNT_VERSION_OFFSET
34    pub wallet_address: Pubkey,            // 32 bytes, ROOT_ACCOUNT_WALLET_ADDRESS_OFFSET
35    pub kyc_provider: Pubkey,              // 32 bytes, ROOT_ACCOUNT_KYC_PROVIDER_OFFSET
36    pub mints_address: Pubkey,             // 32 bytes, ROOT_ACCOUNT_MINTS_ADDRESS_OFFSET
37    pub instruments_address: Pubkey,       // 32 bytes, ROOT_ACCOUNT_INSTRUMENTS_ADDRESS_OFFSET
38    pub workers_address: Pubkey,           // 32 bytes, ROOT_ACCOUNT_WORKERS_ADDRESS_OFFSET
39    pub clients_count: u32,                //  4 bytes, ROOT_ACCOUNT_CLIENTS_COUNT_OFFSET
40    pub fee_payer: OpenAccountFeePayer,    //  4 bytes, ROOT_ACCOUNT_KYC_METHOD_OFFSET
41    pub light_trader_daily_trade_limit: u64,             //  8 bytes, ROOT_ACCOUNT_MAX_LIGHT_VOLUME_OFFSET
42}
43
44impl DevolRegularAccount for RootAccount {}
45impl DevolAccount for RootAccount {
46    #[inline(always)]
47    fn expected_size() -> usize { ROOT_ACCOUNT_SIZE }
48
49    #[inline(always)]
50    fn expected_tag() -> u8 { ROOT_ACCOUNT_TAG }
51
52    #[inline(always)]
53    fn expected_version() -> u32 { ROOT_ACCOUNT_VERSION }
54
55    #[inline(always)]
56    fn check_root(_: AccountTag, _: &AccountHeader, _: &Pubkey) -> Result<(), DvlError> {
57        Ok(())
58    }
59}
60
61#[cfg(test)]
62impl Default for RootAccount {
63    fn default() -> Self {
64        Self {
65            header: AccountHeader::default(),
66            wallet_address: Pubkey::default(),
67            kyc_provider: Pubkey::default(),
68            mints_address: Pubkey::default(),
69            instruments_address: Pubkey::default(),
70            workers_address: Pubkey::default(),
71            clients_count: 0,
72            fee_payer: OpenAccountFeePayer::Devol,
73            light_trader_daily_trade_limit: 0,
74        }
75    }
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81    use std::mem;
82
83    #[test]
84    fn test_root_account_offsets() {
85
86        let account = RootAccount::default();
87
88        let base_ptr = &account as *const _ as usize;
89        // checking fields size and offset
90        assert_eq!(&account.header as *const _ as usize  - base_ptr, ROOT_ACCOUNT_VERSION_OFFSET);
91        assert_eq!(&account.wallet_address as *const _ as usize  - base_ptr, ROOT_ACCOUNT_WALLET_ADDRESS_OFFSET);
92        assert_eq!(&account.kyc_provider as *const _ as usize  - base_ptr, ROOT_ACCOUNT_KYC_PROVIDER_OFFSET);
93        assert_eq!(&account.mints_address as *const _ as usize  - base_ptr, ROOT_ACCOUNT_MINTS_ADDRESS_OFFSET);
94        assert_eq!(&account.instruments_address as *const _ as usize  - base_ptr, ROOT_ACCOUNT_INSTRUMENTS_ADDRESS_OFFSET);
95        assert_eq!(&account.workers_address as *const _ as usize  - base_ptr, ROOT_ACCOUNT_WORKERS_ADDRESS_OFFSET);
96        assert_eq!(&account.clients_count as *const _ as usize  - base_ptr, ROOT_ACCOUNT_CLIENTS_COUNT_OFFSET);
97        assert_eq!(&account.fee_payer as *const _ as usize  - base_ptr, ROOT_ACCOUNT_KYC_METHOD_OFFSET);
98        assert_eq!(&account.light_trader_daily_trade_limit as *const _ as usize  - base_ptr, ROOT_ACCOUNT_MAX_LIGHT_VOLUME_OFFSET);
99
100        // checking total size
101        assert_eq!(mem::size_of::<RootAccount>(), ROOT_ACCOUNT_SIZE);
102    }
103}