Skip to main content
Sigvex

Rent Exemption Violation Remediation

How to fix rent exemption requirement violations.

Rent Exemption Violation Remediation

Overview

Related Detector: Rent Exemption Violation

Accounts below rent-exempt minimum are subject to deletion. The fix is to always use Rent::get()?.minimum_balance(data_len) when creating accounts and to verify remaining balance meets the threshold after any lamport withdrawal.

Before (Vulnerable)

// Vulnerable: hardcoded lamport value
invoke(&system_instruction::create_account(payer, vault, 1_000_000, space, &program_id), accounts)

After (Fixed)

let rent = Rent::get()?;
let lamports = rent.minimum_balance(space as usize);
invoke(&system_instruction::create_account(payer, vault, lamports, space, &program_id), accounts)

Alternative Mitigations

Anchor init Macro

the account-validation framework’s init constraint automatically calculates rent-exempt balance:

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = user, space = 8 + Vault::INIT_SPACE)]
    pub vault: Account<'info, Vault>,
    #[account(mut)]
    pub user: Signer<'info>,
    pub system_program: Program<'info, System>,
}

Common Mistakes

Mistake: Not Checking After Withdrawal

// WRONG: withdrawal may drop below rent-exempt minimum
**vault.lamports.borrow_mut() -= withdraw_amount;

Always verify: vault.lamports() - amount >= rent.minimum_balance(vault.data_len()).

References