Account Setup Example
Demonstrates setting up test account state directly without transactions.
Basic Account Setup
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 exemptionconst 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 dataconst 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 separatelyconst balance = client.svm.getBalance(testAddress);console.log("Balance:", balance, "lamports");
Setting Up Multiple Accounts
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 dataconst 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 RPCconsole.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 {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 IDconst 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 discriminatordata[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 minimumconst minBalance = client.svm.minimumBalanceForRentExemption(BigInt(data.length));// Set the accountclient.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
- Direct State:
setAccountsets account state without transactions - Rent Exemption: Use
minimumBalanceForRentExemptionto calculate required lamports - Account Structure: Provide all required fields: address, data, executable, lamports, programAddress, space
- Verification: Use
getAccountorclient.rpc.getAccountInfoto verify
Is this page helpful?