Skip to content

Commit 7ef755e

Browse files
committed
feat: address comments
1 parent 8033c8d commit 7ef755e

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

programs/dynamic-fee-sharing/src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,7 @@ pub enum FeeVaultError {
4343

4444
#[msg("Type cast error")]
4545
TypeCastFailed,
46+
47+
#[msg("Invalid account discriminator")]
48+
InvalidDiscriminator,
4649
}

programs/dynamic-fee-sharing/src/instructions/operator/ix_remove_user.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::constants::seeds::USER_UNCLAIMED_FEE_PREFIX;
22
use crate::event::EvtRemoveUser;
33
use crate::math::SafeMath;
44
use crate::state::{FeeVault, UserUnclaimedFee};
5-
use crate::utils::account::create_pda_account_with_anchor_discriminator;
5+
use crate::utils::account::{create_pda_account_with_anchor_discriminator, load_account_data_mut};
66
use anchor_lang::prelude::*;
77

88
#[event_cpi]
@@ -59,7 +59,7 @@ pub fn handle_remove_user(ctx: Context<RemoveUserCtx>, index: u8) -> Result<()>
5959

6060
let mut data = user_unclaimed_fee.try_borrow_mut_data()?;
6161

62-
let user_unclaimed_fee = bytemuck::from_bytes_mut::<UserUnclaimedFee>(&mut data[8..]);
62+
let user_unclaimed_fee = load_account_data_mut::<UserUnclaimedFee>(&mut data)?;
6363
user_unclaimed_fee.unclaimed_fee =
6464
user_unclaimed_fee.unclaimed_fee.safe_add(unclaimed_fee)?;
6565
}

programs/dynamic-fee-sharing/src/state/fee_vault.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,11 +220,12 @@ impl FeeVault {
220220
.iter()
221221
.filter(|u| u.address.ne(&Pubkey::default()))
222222
.count();
223+
// user_count include the user being removed. after removal user count should be at least MIN_USER
223224
require!(user_count > MIN_USER, FeeVaultError::InvalidNumberOfUsers);
224225

225-
let unclaimed_fee = self.users[index].get_total_pending_fee(self.fee_per_share)?;
226+
let unclaimed_fee = user.get_total_pending_fee(self.fee_per_share)?;
226227

227-
self.total_share = self.total_share.safe_sub(self.users[index].share)?;
228+
self.total_share = self.total_share.safe_sub(user.share)?;
228229

229230
// shift users to the left
230231
for i in index..MAX_USER - 1 {

programs/dynamic-fee-sharing/src/utils/account.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::error::FeeVaultError;
12
use anchor_lang::prelude::*;
23
use anchor_lang::solana_program::program::{invoke, invoke_signed};
34
use anchor_lang::solana_program::system_instruction;
@@ -86,3 +87,12 @@ pub fn create_pda_account_with_anchor_discriminator<'a, T: Discriminator + Space
8687

8788
Ok(())
8889
}
90+
91+
/// Validates the Anchor discriminator and returns a mutable bytemuck reference.
92+
pub fn load_account_data_mut<T: Discriminator + bytemuck::Pod>(
93+
data: &mut [u8],
94+
) -> Result<&mut T> {
95+
let (disc, rest) = data.split_at_mut(T::DISCRIMINATOR.len());
96+
require!(disc == T::DISCRIMINATOR, FeeVaultError::InvalidDiscriminator);
97+
Ok(bytemuck::from_bytes_mut::<T>(rest))
98+
}

0 commit comments

Comments
 (0)