shadow_drive_user_staking/instructions/
initialize_config.rs1use crate::constants::*;
2use crate::errors::ErrorCodes;
3use anchor_lang::prelude::*;
4
5pub fn handler(
7 ctx: Context<InitializeStorageConfig>,
8 uploader: Pubkey,
9 admin_2: Option<Pubkey>,
10 ) -> Result<()> {
13 msg!("Initializing StorageConfig");
14 {
15 let storage_config = &mut ctx.accounts.storage_config;
16
17 storage_config.shades_per_gib = INITIAL_STORAGE_COST;
19
20 storage_config.storage_available = INITIAL_STORAGE_AVAILABLE;
22
23 storage_config.admin_2 = admin_2.unwrap_or(ctx.accounts.admin_1.key());
25 storage_config.uploader = uploader;
30
31 storage_config.mutable_fee_start_epoch = None;
33 storage_config.shades_per_gib_per_epoch = 0;
34 storage_config.crank_bps = INITIAL_CRANK_FEE_BPS;
35
36 storage_config.max_account_size = MAX_ACCOUNT_SIZE;
38 storage_config.min_account_size = MIN_ACCOUNT_SIZE;
39 }
40
41 Ok(())
42}
43
44#[derive(Accounts)]
45pub struct InitializeStorageConfig<'info> {
48 #[account(
52 init,
53 payer = admin_1,
54 seeds = [
55 "storage-config".as_bytes()
56 ],
57 space = std::mem::size_of::<StorageConfig>() + 4, bump,
59 )]
60 pub storage_config: Box<Account<'info, StorageConfig>>,
61
62 #[account(mut, address=crate::constants::admin1::ID)]
65 pub admin_1: Signer<'info>,
66
67 pub system_program: Program<'info, System>,
69
70 pub rent: Sysvar<'info, Rent>,
72}
73
74#[account]
75pub struct StorageConfig {
76 pub shades_per_gib: u64,
78
79 pub storage_available: u128,
81
82 pub token_account: Pubkey,
84
85 pub admin_2: Pubkey,
87
88 pub uploader: Pubkey,
95
96 pub mutable_fee_start_epoch: Option<u32>,
98
99 pub shades_per_gib_per_epoch: u64,
101
102 pub crank_bps: u16,
104
105 pub max_account_size: u64,
107
108 pub min_account_size: u64,
110}
111
112impl StorageConfig {
113 pub fn validate_storage(&self, storage: u64) -> Result<u64> {
114 if storage <= self.max_account_size && storage >= self.min_account_size {
115 Ok(storage)
116 } else if storage < self.min_account_size {
117 msg!("Tiny account, failing");
118 Err(ErrorCodes::AccountTooSmall.into())
119 } else {
120 msg!("Very large account, failing");
121 Err(ErrorCodes::ExceededStorageLimit.into())
122 }
123 }
124}