Créer des comptes financés
Le besoin de test le plus courant est de créer des comptes avec des SOL. Le
trait TestHelpers rend cela trivial.
Compte unique
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());}
Comptes multiples
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());}}
Opérations sur les tokens
Créez des mints de tokens et des comptes sans le boilerplate habituel.
Créer un mint de token
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());}
Créer des 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);}
Utilisez les ATA dans la plupart des cas. Les associated token accounts sont déterministes et respectent les conventions de Solana. Utilisez des token accounts classiques uniquement lorsque vous avez besoin de plusieurs comptes pour la même paire mint/propriétaire.
Minter des 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);}
Dérivation de PDA
Dérivez facilement des Program Derived Addresses pour vos tests.
Dérivation de PDA basique
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);}
Obtenir uniquement le 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);}
Utilisez derive_pda lorsque vous avez besoin du bump seed (par ex., pour les
appels CPI). Utilisez get_pda lorsque vous n'avez besoin que de l'adresse.
Gestion des slot
Contrôlez la progression du temps pour tester la logique dépendante du temps.
Obtenir le slot actuel
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);}
Avancer les 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);}
Exemple complet
Voici un exemple complet utilisant plusieurs assistants de test ensemble :
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?