Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Comprehensive Solana development skill covering @solana/kit v5, Anchor programs, LiteSVM testing, and security patterns.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
references/kit/overview.md
1---2title: "@solana/kit Quick Start"3description: Quick-start guide for @solana/kit using createClient + .use() plugin composition for RPC, signers, transaction sending, account fetching, and common Solana patterns.4---56# @solana/kit Reference78`@solana/kit` is the JavaScript SDK for building Solana applications. Modular, tree-shakable, full TypeScript support. Clients are built by composing plugins onto `createClient()` via `.use()`.910## Installation1112```bash13npm install @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer14# or: pnpm add @solana/kit @solana/kit-plugin-rpc @solana/kit-plugin-signer15```1617For LiteSVM testing add `@solana/kit-plugin-litesvm`. For Codama-generated program clients add the relevant `@solana-program/*` package(s).1819Minimum version: Solana Kit v6.8.0.2021## Quick Start2223### Local Development2425```ts26import { createClient } from '@solana/kit';27import { solanaLocalRpc } from '@solana/kit-plugin-rpc';28import { signerFromFile } from '@solana/kit-plugin-signer';2930// `signerFromFile` sets BOTH payer and identity to the loaded keypair (the common case).31// Other options:32// - `signer(existingSigner)` // explicit signer you already hold33// - `generatedSigner()` + `airdropSigner(lamports(n))` // fresh local/devnet signer, funded after RPC is installed34// - `payer(...)` + `identity(...)` // when fees and authority come from different keypairs35const client = await createClient()36.use(signerFromFile('~/.config/solana/id.json'))37.use(solanaLocalRpc());3839console.log('Payer:', client.payer.address);40await client.sendTransaction([myInstruction]);41```4243### Production (Mainnet/Devnet)4445```ts46import { createClient } from '@solana/kit';47import { solanaDevnetRpc, solanaMainnetRpc } from '@solana/kit-plugin-rpc';48import { signer } from '@solana/kit-plugin-signer';4950const client = createClient()51.use(signer(mySigner)) // sets payer + identity; use payer(...) + identity(...) if they differ52.use(solanaDevnetRpc()); // or solanaMainnetRpc({ rpcUrl: 'https://...' })5354await client.sendTransaction([myInstruction]);55```5657`solanaDevnetRpc()` defaults to `https://api.devnet.solana.com` and bundles airdrop. `solanaMainnetRpc({ rpcUrl })` is type-narrowed to a mainnet URL — no devnet-only methods like `airdrop`.5859### Testing with LiteSVM6061```ts62import { createClient, lamports } from '@solana/kit';63import { litesvm } from '@solana/kit-plugin-litesvm';64import { airdropSigner, generatedSigner } from '@solana/kit-plugin-signer';6566const client = await createClient()67.use(generatedSigner())68.use(litesvm())69.use(airdropSigner(lamports(1_000_000_000n)));7071client.svm.addProgramFromFile(myProgramAddress, 'program.so');72await client.sendTransaction([myInstruction]);73```7475Full documentation: [LiteSVM](https://www.litesvm.com/docs/typescript/getting-started).7677## Client API7879After applying `solanaRpc` / `solanaLocalRpc` / `solanaDevnetRpc` / `solanaMainnetRpc` (or `litesvm`), the client exposes:8081| Property/Method | Description |82|-----------------|-------------|83| `client.rpc` | RPC methods (`getBalance`, `getAccountInfo`, etc.) |84| `client.rpcSubscriptions` | WebSocket subscriptions (RPC plugins only) |85| `client.payer` | Transaction fee payer signer (set by `signer()` or `payer()`) |86| `client.identity` | Authority signer (set by `signer()` or `identity()`) |87| `client.sendTransaction(instructions)` | Plan + sign + send in one call |88| `client.sendTransactions(plan)` | Execute a planned multi-tx plan |89| `client.planTransaction(s)` | Plan without executing |90| `client.getMinimumBalance(dataSize)` | Rent-exempt minimum lamports |91| `client.airdrop(address, lamports)` | Faucet (devnet/local/litesvm only) |92| `client.svm` | LiteSVM instance (litesvm plugin only) |9394`solanaRpc({ ... })` accepts `rpcUrl` (required) plus `rpcSubscriptionsUrl`, `transactionConfig` (priority fees), `maxConcurrency`, `skipPreflight`, and the underlying `rpcConfig` / `rpcSubscriptionsConfig`. See [plugins.md](plugins.md) for the full options table, plugin catalog, and custom composition.9596## Core Concepts9798### Branded Types99100```ts101import { address, lamports, signature } from '@solana/kit';102103const myAddress = address('So11111111111111111111111111111111111111112');104const myLamports = lamports(1_000_000_000n);105const mySig = signature('5eykt...');106```107108### Signers109110```ts111import { generateKeyPairSigner } from '@solana/kit';112const signer = await generateKeyPairSigner();113// signer.address — the public key114// signer is a TransactionSigner115```116117### Codec Direction118119- **`encode()`**: values → `Uint8Array`120- **`decode()`**: `Uint8Array` → values121122Always use native codecs (e.g., `getBase58Codec()`). Never import bs58.123124See [codecs.md](codecs.md) for full codec patterns.125126## Common Patterns127128### Send SOL Transfer129130```ts131import { createClient, address, lamports } from '@solana/kit';132import { solanaLocalRpc } from '@solana/kit-plugin-rpc';133import { signerFromFile } from '@solana/kit-plugin-signer';134import { getTransferSolInstruction } from '@solana-program/system';135136const client = await createClient()137.use(signerFromFile('~/.config/solana/id.json'))138.use(solanaLocalRpc());139140const ix = getTransferSolInstruction({141source: client.payer,142destination: address('recipient...'),143amount: lamports(1_000_000_000n),144});145146await client.sendTransaction([ix]);147```148149### Fetch Account150151```ts152import { fetchEncodedAccount, assertAccountExists, decodeAccount } from '@solana/kit';153154const account = await fetchEncodedAccount(client.rpc, myAddress);155assertAccountExists(account);156const decoded = decodeAccount(account, myDecoder);157```158159See [accounts.md](accounts.md) for batch fetching, PDAs, subscriptions, and token queries.160161### Token Operations162163Use the `tokenProgram()` plugin from `@solana-program/token` for a fluent token API. It auto-derives ATAs, auto-creates them if needed, and defaults the payer from the client.164165```ts166import { createClient, generateKeyPairSigner } from '@solana/kit';167import { solanaLocalRpc } from '@solana/kit-plugin-rpc';168import { signerFromFile } from '@solana/kit-plugin-signer';169import { tokenProgram } from '@solana-program/token';170171const client = await createClient()172.use(signerFromFile('~/.config/solana/id.json'))173.use(solanaLocalRpc())174.use(tokenProgram());175176const mintAuthority = await generateKeyPairSigner();177const mint = await generateKeyPairSigner();178179// Create a new mint180await client.token.instructions181.createMint({ newMint: mint, decimals: 2, mintAuthority: mintAuthority.address })182.sendTransaction();183184// Mint tokens to an owner's ATA (created automatically if needed)185await client.token.instructions186.mintToATA({187mint: mint.address,188owner: recipientAddress,189mintAuthority,190amount: 1_000_000n,191decimals: 2,192})193.sendTransaction();194195// Transfer tokens to a recipient's ATA (auto-derives source + destination)196await client.token.instructions197.transferToATA({198mint: mint.address,199authority: ownerSigner,200recipient: recipientAddress,201amount: 500n,202decimals: 2,203})204.sendTransaction();205```206207See [programs/token.md](programs/token.md) for low-level instruction patterns and [programs/token-2022.md](programs/token-2022.md) for Token Extensions.208209### Custom Program Operations210211Programs that ship a Kit plugin follow the same `.use()` pattern:212213```ts214import { createClient } from '@solana/kit';215import { solanaDevnetRpc } from '@solana/kit-plugin-rpc';216import { signer } from '@solana/kit-plugin-signer';217import { myProgram } from '@my-programs/operations';218219const client = createClient()220.use(signer(mySigner))221.use(solanaDevnetRpc())222.use(myProgram());223224await client.myProgram.instructions225.handyInstruction({ /* args */ })226.sendTransaction();227```228229### RPC Queries230231```ts232// Balance233const { value: balance } = await client.rpc.getBalance(myAddress).send();234235// Token accounts236const { value: tokenAccs } = await client.rpc.getTokenAccountsByOwner(237owner,238{ mint: mintAddr },239{ encoding: 'jsonParsed' },240).send();241242// Latest blockhash243const { value: blockhash } = await client.rpc.getLatestBlockhash().send();244```245246## Codama Program Clients247248`@solana-program/*` packages are Codama-generated, Kit-compatible instruction builders:249250| Package | Purpose |251|---------|---------|252| `@solana-program/system` | Account creation, transfers, nonces |253| `@solana-program/token` | SPL Token operations |254| `@solana-program/token-2022` | Token Extensions (transfer fees, metadata, etc.) |255| `@solana-program/compute-budget` | CU limits & priority fees |256| `@solana-program/memo` | Memo program |257| `@solana-program/stake` | Staking operations |258259**Note:** These packages export both low-level `get{Name}Instruction()` helpers and higher-level program plugins (e.g., `tokenProgram()`) that attach fluent APIs to the client. ATA functions are in `@solana-program/token` and `@solana-program/token-2022`, not a separate package.260261See [codama.md](codama.md) for naming conventions and patterns.262263## Package Overview264265| Package | Purpose |266|---------|---------|267| `@solana/kit` | Main SDK, re-exports all sub-packages, exports `createClient` |268| `@solana/kit-plugin-rpc` | All-in-one RPC plugins: `solanaRpc`, `solanaMainnetRpc`, `solanaDevnetRpc`, `solanaLocalRpc` (plus low-level `rpc`, `rpcAirdrop`, `rpcTransactionPlanner`, `rpcTransactionPlanExecutor`) |269| `@solana/kit-plugin-signer` | Signer plugins. Default `signer*` variants set both `payer` and `identity` (`signer`, `generatedSigner`, `signerFromFile`). Use `airdropSigner` to fund an already-installed signer; use `generatedSignerWithSol` only when an airdrop function is already installed. Role-specific `payer*` and `identity*` variants for when the two roles differ. |270| `@solana/kit-plugin-litesvm` | All-in-one `litesvm` plugin (Node.js only) for in-memory testing |271| `@solana/kit-plugin-airdrop` | Standalone airdrop plugin (most users get this via `solanaDevnetRpc`/`solanaLocalRpc`) |272| `@solana/kit-plugin-instruction-plan` | `planAndSendTransactions` and instruction batching primitives |273| `@solana/addresses` | Address validation |274| `@solana/accounts` | Account fetching/decoding |275| `@solana/codecs` | Data encoding/decoding |276| `@solana/rpc` | JSON RPC client primitives |277| `@solana/rpc-subscriptions` | WebSocket subscription primitives |278| `@solana/transactions` | Compile/sign/serialize |279| `@solana/transaction-messages` | Build tx messages |280| `@solana/signers` | Signing abstraction |281| `@solana/keychain` | Common Signing Interface for external signers |282| `@solana/instruction-plans` | Multi-instruction batching |283| `@solana/errors` | Error identification/decoding |284| `@solana/functional` | Pipe and compose utilities |285| `@solana/react` | React wallet hooks |286287## Best Practices2882891. **Compose with `.use()`** — `createClient().use(signer(...)).use(solanaRpc(...))`; the signer plugin must come before the RPC/litesvm plugin. Use the role-specific `payer()` + `identity()` variants only when fees and authority come from different keypairs.2902. **Use branded types** — `address()`, `lamports()`, `signature()`.2913. **Use `@solana-program/*`** instruction builders over hand-rolled instruction data.2924. **Handle account existence** — `assertAccountExists()` before decode.2935. **Set compute budget** — pass `transactionConfig` to `solanaRpc({ ... })` or use manual CU estimation for production. See [programs/compute-budget.md](programs/compute-budget.md).294295## Reference Files296297- [plugins.md](plugins.md) — Plugin catalog, custom composition, ordering rules298- [accounts.md](accounts.md) — Fetching, decoding, batch, PDAs, subscriptions299- [codecs.md](codecs.md) — Complete codec patterns300- [react.md](react.md) — React hooks and wallet integration301- [codama.md](codama.md) — Codama patterns, naming conventions, program clients302- [gotchas.md](gotchas.md) — Common type errors & fixes303- [advanced.md](advanced.md) — Manual transaction building, direct RPC, building plugins, custom clients304- [programs/](programs/) — Program client references (system, token, token-2022, compute-budget)305