Create Funded Accounts
The most common testing need is creating accounts with SOL. The TestHelpers
trait makes this trivial.
Single Account
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_funded_account() {let mut svm = LiteSVM::new();// Create a funded account with 10 SOLlet alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// The keypair is ready to use immediatelyprintln!("Alice's pubkey: {}", alice.pubkey());}
Multiple Accounts
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_multiple_accounts() {let mut svm = LiteSVM::new();// Create 5 funded accounts, each with 5 SOLlet accounts = svm.create_funded_accounts(5, 5 * LAMPORTS_PER_SOL).unwrap();assert_eq!(accounts.len(), 5);for (i, account) in accounts.iter().enumerate() {println!("Account {}: {}", i, account.pubkey());}}
Token Operations
Create token mints and accounts without the usual boilerplate.
Create a Token Mint
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_token_mint() {let mut svm = LiteSVM::new();// Create authority accountlet authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// Create a token mint with 9 decimals (returns Keypair)let mint = svm.create_token_mint(&authority, 9).unwrap();println!("Mint address: {}", mint.pubkey());}
Create Token Accounts
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_token_accounts() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint (returns Keypair)let mint = svm.create_token_mint(&authority, 9).unwrap();// Create a regular token account (returns Keypair)let token_account = svm.create_token_account(&mint.pubkey(), &user).unwrap();// Or create an Associated Token Account — ATA (returns Pubkey)let ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();println!("Token account: {}", token_account.pubkey());println!("ATA: {}", ata);}
Use ATAs for most cases. Associated Token Accounts are deterministic and follow Solana conventions. Use regular token accounts only when you need multiple accounts for the same mint/owner pair.
Mint Tokens
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_mint_tokens() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint with authoritylet mint = svm.create_token_mint(&authority, 9).unwrap();// Create ATA for user (returns Pubkey)let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();// Mint 1000 tokens to user's ATAsvm.mint_to(&mint.pubkey(), &user_ata, &authority, 1000).unwrap();// Verify the balancesvm.assert_token_balance(&user_ata, 1000);}
PDA Derivation
Derive Program Derived Addresses easily for your tests.
Basic PDA Derivation
use litesvm_utils::{LiteSVM, Pubkey, TestHelpers};#[test]fn test_derive_pda() {let mut svm = LiteSVM::new();let program_id = Pubkey::new_unique();let user = Pubkey::new_unique();// Get PDA with bumplet (pda, bump) = svm.derive_pda(&[b"user_account", user.as_ref()],&program_id,);println!("PDA: {}, Bump: {}", pda, bump);}
Get Just the PDA
use litesvm_utils::{LiteSVM, Pubkey, TestHelpers};#[test]fn test_get_pda() {let mut svm = LiteSVM::new();let program_id = Pubkey::new_unique();// When you don't need the bumplet pda = svm.get_pda(&[b"config"], &program_id);println!("Config PDA: {}", pda);}
Use derive_pda when you need the bump seed (e.g., for CPI calls). Use
get_pda when you only need the address.
Slot Management
Control time progression for testing time-dependent logic.
Get Current Slot
use litesvm_utils::{LiteSVM, TestHelpers};#[test]fn test_get_current_slot() {let mut svm = LiteSVM::new();let slot = svm.get_current_slot();println!("Current slot: {}", slot);}
Advance Slots
use litesvm_utils::{LiteSVM, TestHelpers};#[test]fn test_advance_slots() {let mut svm = LiteSVM::new();let initial_slot = svm.get_current_slot();// Advance by 100 slotssvm.advance_slot(100);let new_slot = svm.get_current_slot();assert_eq!(new_slot, initial_slot + 100);}
Complete Example
Here's a comprehensive example using multiple test helpers together:
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_complete_setup() {let mut svm = LiteSVM::new();// Create accountslet admin = svm.create_funded_account(100 * LAMPORTS_PER_SOL).unwrap();let users = svm.create_funded_accounts(3, 10 * LAMPORTS_PER_SOL).unwrap();// Create token infrastructure (returns Keypair)let mint = svm.create_token_mint(&admin, 6).unwrap(); // 6 decimals like USDC// Create ATAs and mint tokens to each userfor (i, user) in users.iter().enumerate() {// create_associated_token_account returns Pubkeylet ata = svm.create_associated_token_account(&mint.pubkey(), user).unwrap();let amount = (i as u64 + 1) * 1_000_000; // 1, 2, 3 tokenssvm.mint_to(&mint.pubkey(), &ata, &admin, amount).unwrap();// Verifysvm.assert_token_balance(&ata, amount);}// Verify total supplylet total_supply = 1_000_000 + 2_000_000 + 3_000_000;svm.assert_mint_supply(&mint.pubkey(), total_supply);// Test time-based logiclet start_slot = svm.get_current_slot();svm.advance_slot(1000);assert!(svm.get_current_slot() > start_slot);}
Is this page helpful?