I am working on a NFT staking program. I need to create a PDA account with a structure that includes a dynamic Vec.
Here's the structure:
#[account]pub struct UserNftStakeAccount { pub user: Pubkey, pub nft_staked_mints: Vec<Pubkey>, pub stake_start_time: i64, pub reward_accumulated: u64, pub reward_claimed: u64, pub last_reward_calculation_time: i64, }#[derive(Accounts)]pub struct NFTStake<'info> { #[account( init_if_needed, payer = user, space = 8 + std::mem::size_of::<UserNftStakeAccount>(), seeds = [b"nft_stake", user.key().as_ref()], bump, )] . . .}
The nft_staked_mints field is a Vec, and the number of NFTs a user can stake is dynamic. I’m unsure how to calculate the required space for this PDA account since the vector's length is unknown during initialization.
How can I allocate sufficient space for this account without knowing the vector's length beforehand?
Are there any best practices for handling PDA accounts with dynamic data like vectors to avoid over-allocation or under-allocation of space?
Is there a way to resize or dynamically manage account space after initialization in Solana, or should I design the program to predefine maximum limits for vectors?