Documentación de SolanaLiteSVMRustCajas adicionaleslitesvm-utils

Utilidades de Prueba

Crear Cuentas con Fondos

La necesidad de prueba más común es crear cuentas con SOL. El trait TestHelpers hace que esto sea trivial.

Cuenta Individual

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 SOL
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
// The keypair is ready to use immediately
println!("Alice's pubkey: {}", alice.pubkey());
}

Múltiples Cuentas

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 SOL
let 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());
}
}

Operaciones con Tokens

Crea mints de tokens y cuentas sin el código repetitivo habitual.

Crear 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 account
let 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());
}

Crear 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);
}

Usa ATAs en la mayoría de los casos. Los Associated Token Accounts son deterministas y siguen las convenciones de Solana. Usa token accounts regulares solo cuando necesites varias cuentas para el mismo par mint/propietario.

Acuñar 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 authority
let 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 ATA
svm.mint_to(&mint.pubkey(), &user_ata, &authority, 1000).unwrap();
// Verify the balance
svm.assert_token_balance(&user_ata, 1000);
}

Derivación de PDA

Deriva Program Derived Addresses fácilmente para tus pruebas.

Derivación Básica de PDA

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 bump
let (pda, bump) = svm.derive_pda(
&[b"user_account", user.as_ref()],
&program_id,
);
println!("PDA: {}, Bump: {}", pda, bump);
}

Obtener Solo el 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 bump
let pda = svm.get_pda(&[b"config"], &program_id);
println!("Config PDA: {}", pda);
}

Usa derive_pda cuando necesites el bump seed (por ejemplo, para llamadas CPI). Usa get_pda cuando solo necesites la dirección.

Gestión de Slot

Controla el progreso del tiempo para probar la lógica dependiente del tiempo.

Obtener el slot actual

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);
}

Avanzar 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 slots
svm.advance_slot(100);
let new_slot = svm.get_current_slot();
assert_eq!(new_slot, initial_slot + 100);
}

Ejemplo completo

Aquí tienes un ejemplo completo que utiliza varios helpers de prueba juntos:

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 accounts
let 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 user
for (i, user) in users.iter().enumerate() {
// create_associated_token_account returns Pubkey
let ata = svm.create_associated_token_account(&mint.pubkey(), user).unwrap();
let amount = (i as u64 + 1) * 1_000_000; // 1, 2, 3 tokens
svm.mint_to(&mint.pubkey(), &ata, &admin, amount).unwrap();
// Verify
svm.assert_token_balance(&ata, amount);
}
// Verify total supply
let total_supply = 1_000_000 + 2_000_000 + 3_000_000;
svm.assert_mint_supply(&mint.pubkey(), total_supply);
// Test time-based logic
let start_slot = svm.get_current_slot();
svm.advance_slot(1000);
assert!(svm.get_current_slot() > start_slot);
}

Is this page helpful?

Tabla de Contenidos

Editar Página