From 7bc9faedbd5829c39c550f10d0eb7e09c0841812 Mon Sep 17 00:00:00 2001 From: hana <81144685+2501babe@users.noreply.github.com> Date: Fri, 13 Mar 2026 07:35:18 -0700 Subject: [PATCH] program: use `size_of()` uniformly --- program/src/instruction.rs | 11 +++++------ program/src/processor.rs | 8 ++++---- program/src/state.rs | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/program/src/instruction.rs b/program/src/instruction.rs index 49b7dcf8..7627d05d 100644 --- a/program/src/instruction.rs +++ b/program/src/instruction.rs @@ -180,11 +180,11 @@ pub fn initialize( minimum_pool_balance: u64, ) -> Vec { let pool_address = find_pool_address(program_id, vote_account_address); - let pool_rent = rent.minimum_balance(std::mem::size_of::()); + let pool_rent = rent.minimum_balance(SinglePool::size_of()); let stake_address = find_pool_stake_address(program_id, &pool_address); let onramp_address = find_pool_onramp_address(program_id, &pool_address); - let stake_space = std::mem::size_of::(); + let stake_space = stake::state::StakeStateV2::size_of(); let stake_rent = rent.minimum_balance(stake_space); let stake_rent_plus_minimum = stake_rent.saturating_add(minimum_pool_balance); @@ -344,8 +344,7 @@ pub fn deposit_stake( /// Creates all necessary instructions to withdraw stake into a given stake /// account. If a new stake account is required, the user should first include /// `system_instruction::create_account` with account size -/// `std::mem::size_of::()` and owner -/// `stake::program::id()`. +/// `stake::state::StakeStateV2::size_of()` and owner `stake::program::id()`. pub fn withdraw( program_id: &Pubkey, pool_address: &Pubkey, @@ -438,7 +437,7 @@ pub fn create_and_delegate_user_stake( stake_amount: u64, ) -> Vec { let pool_address = find_pool_address(program_id, vote_account_address); - let stake_space = std::mem::size_of::(); + let stake_space = stake::state::StakeStateV2::size_of(); let lamports = rent .minimum_balance(stake_space) .saturating_add(stake_amount); @@ -557,7 +556,7 @@ pub fn create_pool_onramp( rent: &Rent, ) -> Vec { let onramp_address = find_pool_onramp_address(program_id, pool_address); - let stake_space = std::mem::size_of::(); + let stake_space = stake::state::StakeStateV2::size_of(); let stake_rent = rent.minimum_balance(stake_space); vec![ diff --git a/program/src/processor.rs b/program/src/processor.rs index dae12701..a4380dfa 100644 --- a/program/src/processor.rs +++ b/program/src/processor.rs @@ -18,7 +18,7 @@ use { }, borsh::BorshDeserialize, solana_account_info::{next_account_info, AccountInfo}, - solana_borsh::v1::{get_packed_len, try_from_slice_unchecked}, + solana_borsh::v1::try_from_slice_unchecked, solana_clock::{Clock, Epoch}, solana_cpi::invoke_signed, solana_msg::msg, @@ -626,7 +626,7 @@ impl Processor { let mint_authority_signers = &[&mint_authority_seeds[..]]; // create the pool. user has already transferred in rent - let pool_space = get_packed_len::(); + let pool_space = SinglePool::size_of(); if !rent.is_exempt(pool_info.lamports(), pool_space) { return Err(SinglePoolError::WrongRentAmount.into()); } @@ -681,7 +681,7 @@ impl Processor { // create the pool stake account. user has already transferred in rent plus at // least the minimum let minimum_pool_balance = minimum_pool_balance()?; - let stake_space = std::mem::size_of::(); + let stake_space = StakeStateV2::size_of(); let stake_rent_plus_initial = rent .minimum_balance(stake_space) .saturating_add(minimum_pool_balance); @@ -1411,7 +1411,7 @@ impl Processor { let stake_authority_signers = &[&stake_authority_seeds[..]]; // create the pool on-ramp account. user has already transferred in rent - let stake_space = std::mem::size_of::(); + let stake_space = StakeStateV2::size_of(); let stake_rent = rent.minimum_balance(stake_space); if pool_onramp_info.lamports() < stake_rent { diff --git a/program/src/state.rs b/program/src/state.rs index a9f508a5..3c23c0a2 100644 --- a/program/src/state.rs +++ b/program/src/state.rs @@ -28,6 +28,11 @@ pub struct SinglePool { pub vote_account_address: Pubkey, } impl SinglePool { + /// Onchain serialized size of `SinglePool` + pub const fn size_of() -> usize { + 33 + } + /// Create a `SinglePool` struct from its account info pub fn from_account_info( account_info: &AccountInfo, @@ -55,3 +60,13 @@ impl SinglePool { Ok(pool) } } + +#[cfg(test)] +mod tests { + use {super::*, solana_borsh::v1::get_packed_len}; + + #[test] + fn single_pool_size_of() { + assert_eq!(SinglePool::size_of(), get_packed_len::()); + } +}