devol_accounts_kit/accounts/root/
root_account.rs1use 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, pub wallet_address: Pubkey, pub kyc_provider: Pubkey, pub mints_address: Pubkey, pub instruments_address: Pubkey, pub workers_address: Pubkey, pub clients_count: u32, pub fee_payer: OpenAccountFeePayer, pub light_trader_daily_trade_limit: u64, }
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 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 assert_eq!(mem::size_of::<RootAccount>(), ROOT_ACCOUNT_SIZE);
102 }
103}