shadow_drive_sdk/models/
storage_acct.rs1use std::str::FromStr;
2
3use anchor_lang::prelude::Pubkey;
4use serde::{Deserialize, Deserializer};
5#[derive(Clone, Debug, Deserialize)]
6pub struct StorageAccount {
7 #[serde(deserialize_with = "deserialize_pubkey")]
8 pub storage_account: Pubkey,
9
10 pub reserved_bytes: u64,
12
13 pub current_usage: u64,
15
16 pub immutable: bool,
18
19 pub to_be_deleted: bool,
21
22 pub delete_request_epoch: u32,
24
25 #[serde(alias = "owner1", deserialize_with = "deserialize_pubkey")]
27 pub owner_1: Pubkey,
28
29 #[serde(alias = "owner2", deserialize_with = "deserialize_pubkey")]
31 pub owner_2: Pubkey,
32
33 pub account_counter_seed: u32,
35
36 pub creation_time: u32,
38
39 pub creation_epoch: u32,
41
42 pub last_fee_epoch: u32,
44
45 pub identifier: String,
48}
49
50#[derive(Clone, Debug, Deserialize)]
52pub struct StorageAccountV2 {
53 #[serde(deserialize_with = "deserialize_pubkey")]
54 pub storage_account: Pubkey,
55
56 pub reserved_bytes: u64,
58
59 pub current_usage: u64,
61
62 pub immutable: bool,
64
65 pub to_be_deleted: bool,
67
68 pub delete_request_epoch: u32,
70
71 #[serde(alias = "owner1", deserialize_with = "deserialize_pubkey")]
73 pub owner_1: Pubkey,
74
75 pub account_counter_seed: u32,
77
78 pub creation_time: u32,
80
81 pub creation_epoch: u32,
83
84 pub last_fee_epoch: u32,
86
87 pub identifier: String,
90}
91
92fn deserialize_pubkey<'de, D>(deserializer: D) -> Result<Pubkey, D::Error>
93where
94 D: Deserializer<'de>,
95{
96 let s = String::deserialize(deserializer)?;
97 Pubkey::from_str(&s).map_err(serde::de::Error::custom)
98}
99
100#[derive(Debug, Deserialize)]
101#[serde(tag = "version")]
102pub enum StorageAcct {
103 V1(StorageAccount),
104 V2(StorageAccountV2),
105}
106
107impl StorageAcct {
108 pub fn is_immutable(&self) -> bool {
109 match self {
110 StorageAcct::V1(acct) => acct.immutable,
111 StorageAcct::V2(acct) => acct.immutable,
112 }
113 }
114 pub fn storage(&self) -> u64 {
115 match self {
116 StorageAcct::V1(acct) => acct.reserved_bytes,
117 StorageAcct::V2(acct) => acct.reserved_bytes,
118 }
119 }
120
121 pub fn to_be_deleted(&self) -> bool {
122 match self {
123 StorageAcct::V1(acct) => acct.to_be_deleted,
124 StorageAcct::V2(acct) => acct.to_be_deleted,
125 }
126 }
127
128 pub fn is_owner(&self, account: Pubkey) -> bool {
129 match self {
130 StorageAcct::V1(acct) => (acct.owner_1 == account) | (acct.owner_2 == account),
131 StorageAcct::V2(acct) => acct.owner_1 == account,
132 }
133 }
134}