AgentSkillsCN

solana-kit

使用 @solana/kit 构建 Solana 应用。当您被要求“使用 @solana/kit”、“Solana Kit”、“创建交易”、“发送交易”、“签署交易”、“获取账户”、“解码账户”、“Solana RPC”、“getAccountInfo”、“getBalance”、“Solana 编码器”、“编码字节”、“解码字节”、“Solana 钱包”、“连接钱包”、“签署消息”、“使用 SignAndSendTransaction”时,或在处理任何 @solana/* 包时,均可选用此技能。

SKILL.md
--- frontmatter
name: solana-kit
description: Build Solana apps with @solana/kit. Use when asked to "use @solana/kit", "solana kit", "create a transaction", "send a transaction", "sign a transaction", "fetch account", "decode account", "solana RPC", "getAccountInfo", "getBalance", "solana codec", "encode bytes", "decode bytes", "solana wallet", "connect wallet", "sign message", "useSignAndSendTransaction", or work with any @solana/* packages.

Solana Kit

@solana/kit is the JavaScript SDK for building Solana applications. Modular, tree-shakable, full TypeScript support.

Core Concepts

Imports

ts
// Convenience (includes all packages)
import { address, createSolanaRpc, lamports } from '@solana/kit';

// Individual packages (smaller bundles)
import { address } from '@solana/addresses';
import { createSolanaRpc } from '@solana/rpc';

Codec Direction

  • encode(): values → Uint8Array
  • decode(): Uint8Array → values

Branded Types

ts
import { address, lamports, signature } from '@solana/kit';
const myAddress = address('So11111111111111111111111111111111111111112');
const myLamports = lamports(1_000_000_000n);

Quick Patterns

RPC Client

ts
import { createSolanaRpc, createSolanaRpcSubscriptions, devnet } from '@solana/kit';

const rpc = createSolanaRpc(devnet('https://api.devnet.solana.com'));
const rpcSubs = createSolanaRpcSubscriptions(devnet('wss://api.devnet.solana.com'));

Build & Send Transaction

ts
import {
  pipe, createTransactionMessage, setTransactionMessageFeePayerSigner,
  setTransactionMessageLifetimeUsingBlockhash, appendTransactionMessageInstruction,
  signAndSendTransactionMessageWithSigners,
} from '@solana/kit';

const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

const message = pipe(
  createTransactionMessage({ version: 0 }),
  m => setTransactionMessageFeePayerSigner(signer, m),
  m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),
  m => appendTransactionMessageInstruction(myInstruction, m),
);

const signature = await signAndSendTransactionMessageWithSigners(message);

Compute Budget (Required for production)

Always set compute units and priority fee:

ts
import {
  getSetComputeUnitPriceInstruction,
  estimateComputeUnitLimitFactory,
  estimateAndUpdateProvisoryComputeUnitLimitFactory,
} from '@solana-program/compute-budget';

// Setup estimator
const estimateAndUpdateCU = estimateAndUpdateProvisoryComputeUnitLimitFactory(
  estimateComputeUnitLimitFactory({ rpc })
);

// Build message with priority fee
let message = pipe(
  createTransactionMessage({ version: 0 }),
  m => setTransactionMessageFeePayerSigner(signer, m),
  m => setTransactionMessageLifetimeUsingBlockhash(blockhash, m),
  m => appendTransactionMessageInstruction(instruction, m),
  m => prependTransactionMessageInstruction(getSetComputeUnitPriceInstruction({ microLamports: 1000n }), m),
);

// Estimate and set CU limit via simulation
message = await estimateAndUpdateCU(message);

// ⚠️ IMPORTANT: Refresh blockhash after estimation (simulation takes time)
const { value: freshBlockhash } = await rpc.getLatestBlockhash().send();
message = setTransactionMessageLifetimeUsingBlockhash(freshBlockhash, message);

Fetch Account

ts
import { fetchEncodedAccount, assertAccountExists, decodeAccount } from '@solana/kit';

const account = await fetchEncodedAccount(rpc, myAddress);
assertAccountExists(account);
const decoded = decodeAccount(account, myDecoder);

Codec Example

ts
import { getStructCodec, getU32Codec, getU64Codec, addCodecSizePrefix, getUtf8Codec } from '@solana/kit';

type MyData = { name: string; amount: bigint };
const codec = getStructCodec([
  ['name', addCodecSizePrefix(getUtf8Codec(), getU32Codec())],
  ['amount', getU64Codec()],
]);

const bytes = codec.encode({ name: 'test', amount: 100n });
const data = codec.decode(bytes);

Package Overview

PackagePurpose
@solana/kitMain entry, re-exports all
@solana/addressesAddress validation
@solana/accountsAccount fetching/decoding
@solana/codecsData encoding/decoding
@solana/rpcJSON RPC client
@solana/rpc-subscriptionsWebSocket subscriptions
@solana/transactionsCompile/sign/serialize
@solana/transaction-messagesBuild tx messages
@solana/signersSigning abstraction
@solana/reactReact wallet hooks
@solana-program/compute-budgetCU limits & priority fees

Best Practices

  1. Use pipe() for transaction building
  2. Use branded typesaddress(), lamports(), signature()
  3. Always set compute budget — estimate CUs, set priority fee
  4. Handle account existenceassertAccountExists() before decode
  5. Use factoriessendAndConfirmTransactionFactory(), airdropFactory()

Reference Files

For detailed patterns:

  • references/accounts.md — Fetching, parsing, decoding accounts
  • references/codecs.md — Complete codec patterns
  • references/rpc.md — RPC methods and subscriptions
  • references/react.md — React hooks and wallet integration
  • references/transactions.md — Transaction building, signing, compute budget