---
title: Account Setup
description: Set up test accounts and state with LiteSVM
---

Demonstrates setting up test account state directly without transactions.

## Basic Account Setup

```typescript
import {
  createClient,
  address,
  generateKeyPairSigner,
  lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";

const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).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

```typescript
import {
  createClient,
  address,
  generateKeyPairSigner,
  lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";

const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).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:

```typescript
import {
  createClient,
  address,
  generateKeyPairSigner,
  lamports
} from "@solana/kit";
import { litesvm } from "@solana/kit-plugin-litesvm";
import { signer } from "@solana/kit-plugin-signer";

const mySigner = await generateKeyPairSigner();
const client = createClient().use(signer(mySigner)).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);
```

<Callout type="info">
  Using `setAccount` is faster than executing transactions for bulk account
  setup.
</Callout>

## 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
