LiteSVM Docs
Examples

Account Setup

Set up test accounts and state with LiteSVM

Account Setup Example

Demonstrates setting up test account state directly without transactions.

Basic Account Setup

import { address, createEmptyClient, lamports } from '@solana/kit';
import { litesvm } from '@solana/kit-plugins';

const client = createEmptyClient().use(litesvm());

// Calculate minimum balance for rent exemption
const dataSize = 100n;
const minBalance = client.svm.minimumBalanceForRentExemption(dataSize);
console.log(`Minimum balance for ${dataSize} bytes:`, minBalance, 'lamports');

// Set account state directly (no transaction needed)
const programId = address('11111111111111111111111111111111');
const accountData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

const testAddress = address('REPLACE_WITH_TEST_ADDRESS'); // or use generateKeyPairSigner()

client.svm.setAccount({
    address: testAddress,
    data: accountData,
    executable: false,
    lamports: lamports(minBalance),
    programAddress: programId,
    space: BigInt(accountData.length),
});

console.log('Account state set successfully');

// Retrieve the account data
const retrieved = client.svm.getAccount(testAddress);

if (retrieved.exists) {
    console.log('Retrieved account:');
    console.log('  Address:', retrieved.address);
    console.log('  Lamports:', retrieved.lamports);
    console.log('  Owner:', retrieved.programAddress);
    console.log('  Executable:', retrieved.executable);
    console.log('  Data:', Array.from(retrieved.data));
}

// Get balance separately
const balance = client.svm.getBalance(testAddress);
console.log('Balance:', balance, 'lamports');

Setting Up Multiple Accounts

import { address, createEmptyClient, lamports } from '@solana/kit';
import { litesvm } from '@solana/kit-plugins';

const client = createEmptyClient().use(litesvm());
const programId = address('11111111111111111111111111111111');

// Set up multiple accounts with different data
const account1 = address('Account111111111111111111111111111'); // replace or generateKeyPairSigner()
const account2 = address('Account211111111111111111111111111'); // replace or generateKeyPairSigner()
const account3 = address('Account311111111111111111111111111'); // replace or generateKeyPairSigner()
const account4 = address('Account411111111111111111111111111'); // replace or generateKeyPairSigner()
const account5 = address('Account511111111111111111111111111'); // replace or generateKeyPairSigner()
const accounts = [account1, account2, account3, account4, account5];

for (const [index, accountAddress] of accounts.entries()) {
    const customData = new Uint8Array([index, index + 1, index + 2]);

    client.svm.setAccount({
        address: accountAddress,
        data: customData,
        executable: false,
        lamports: lamports(1_000_000n),
        programAddress: programId,
        space: BigInt(customData.length),
    });

    console.log(`Account ${index}: ${accountAddress}`);
}

// Verify accounts via RPC
console.log('\nVerifying via RPC:');
const { value: rpcAccounts } = await client.rpc
    .getMultipleAccounts(accounts)
    .send();

rpcAccounts.forEach((acc, i) => {
    if (acc) {
        console.log(`  Account ${i}: ${acc.lamports} lamports, data: ${acc.data[0]}`);
    }
});

Program Data Account Setup

Set up a program-owned data account:

import { address, createEmptyClient, lamports } from '@solana/kit';
import { litesvm } from '@solana/kit-plugins';

const client = createEmptyClient().use(litesvm());

// Your program ID
const programId = address('YourProgramId111111111111111111111111111'); // replace or generateKeyPairSigner()
const dataAccountAddress = address('DataAccount111111111111111111111111111'); // replace or generateKeyPairSigner()

// Serialize your account data structure
// This example uses a simple layout: [u8 discriminator, u64 counter, pubkey owner]
const data = new Uint8Array(1 + 8 + 32);
const view = new DataView(data.buffer);

// Set discriminator
data[0] = 0x01;

// Set counter (u64 little-endian)
view.setBigUint64(1, 100n, true);

// Set owner pubkey (32 bytes)
// In practice, you'd decode a real address here

// Calculate rent-exempt minimum
const minBalance = client.svm.minimumBalanceForRentExemption(BigInt(data.length));

// Set the account
client.svm.setAccount({
    address: dataAccountAddress,
    data,
    executable: false,
    lamports: lamports(minBalance),
    programAddress: programId,
    space: BigInt(data.length),
});

console.log('Program data account set up:', dataAccountAddress);

Using setAccount is faster than executing transactions for bulk account setup.

Key Points

  1. Direct State: setAccount sets account state without transactions
  2. Rent Exemption: Use minimumBalanceForRentExemption to calculate required lamports
  3. Account Structure: Provide all required fields: address, data, executable, lamports, programAddress, space
  4. Verification: Use getAccount or client.rpc.getAccountInfo to verify