solana-kit by sendaifun/skills
npx skills add https://github.com/sendaifun/skills --skill solana-kit使用 @solana/kit 构建 Solana 应用程序的综合指南 - 这是来自 Anza 的现代化、可摇树优化、零依赖的 JavaScript SDK。
Solana Kit(前身为 web3.js 2.0)是对 Solana JavaScript SDK 的完全重写,具有以下特点:
npm install @solana/kit
如需特定程序交互:
npm install @solana-program/system @solana-program/token
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports,
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
sendAndConfirmTransactionFactory,
getSignatureFromTransaction,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const LAMPORTS_PER_SOL = BigInt(1_000_000_000);
async function transferSol() {
// 1. 连接到 RPC
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
// 2. 创建签名者
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
// 3. 获取区块哈希
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// 4. 使用 pipe 构建交易
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(sender.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstruction(
getTransferSolInstruction({
amount: lamports(LAMPORTS_PER_SOL / BigInt(10)), // 0.1 SOL
destination: recipient.address,
source: sender,
}),
tx
)
);
// 5. 签名
const signedTx = await signTransactionMessageWithSigners(transactionMessage);
// 6. 发送并确认
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signedTx, { commitment: "confirmed" });
console.log("签名:", getSignatureFromTransaction(signedTx));
}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
Kit 分离了 HTTP 和 WebSocket 连接:
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
// HTTP 用于请求
const rpc = createSolanaRpc("https://api.devnet.solana.com");
// WebSocket 用于订阅
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
// 进行 RPC 调用
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();
const { value: blockhash } = await rpc.getLatestBlockhash().send();
Kit 使用签名者接口,而非直接使用密钥对:
import {
generateKeyPairSigner,
createKeyPairSignerFromBytes,
address,
} from "@solana/kit";
// 生成新的签名者
const signer = await generateKeyPairSigner();
console.log("地址:", signer.address);
// 从现有密钥(Uint8Array)创建
const existing = await createKeyPairSignerFromBytes(secretKeyBytes);
// 从字符串创建地址
const addr = address("11111111111111111111111111111111");
Kit 通过 pipe 使用函数式组合:
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
appendTransactionMessageInstructions,
prependTransactionMessageInstructions,
} from "@solana/kit";
const tx = pipe(
createTransactionMessage({ version: 0 }), // 创建 v0 消息
(tx) => setTransactionMessageFeePayer(payer.address, tx), // 设置费用支付者
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx), // 设置生命周期
(tx) => appendTransactionMessageInstruction(instruction1, tx), // 添加指令
(tx) => appendTransactionMessageInstructions([instruction2, instruction3], tx), // 添加多个
);
import {
signTransactionMessageWithSigners,
partiallySignTransactionMessageWithSigners,
getSignatureFromTransaction,
} from "@solana/kit";
// 使用交易中的所有签名者进行签名
const signedTx = await signTransactionMessageWithSigners(transactionMessage);
// 部分签名(用于多重签名)
const partiallySignedTx = await partiallySignTransactionMessageWithSigners(
transactionMessage
);
// 在发送前获取签名
const signature = getSignatureFromTransaction(signedTx);
import {
sendAndConfirmTransactionFactory,
sendTransactionWithoutConfirmingFactory,
getBase64EncodedWireTransaction,
} from "@solana/kit";
// 发送并确认(推荐)
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signedTx, { commitment: "confirmed" });
// 发送但不等待确认
const send = sendTransactionWithoutConfirmingFactory({ rpc });
await send(signedTx, { commitment: "confirmed" });
// 手动编码(底层)
const encoded = getBase64EncodedWireTransaction(signedTx);
await rpc.sendTransaction(encoded, { encoding: "base64" }).send();
import {
fetchEncodedAccount,
fetchEncodedAccounts,
assertAccountExists,
} from "@solana/kit";
// 获取单个账户
const account = await fetchEncodedAccount(rpc, address);
if (account.exists) {
console.log("Lamports:", account.lamports);
console.log("所有者:", account.programAddress);
console.log("数据:", account.data);
}
// 获取多个账户
const accounts = await fetchEncodedAccounts(rpc, [addr1, addr2, addr3]);
// 断言账户存在(如果不存在则抛出错误)
assertAccountExists(account);
| 导入 | 描述 |
|---|---|
@solana/kit | 主包 - 包含以下所有内容 |
| 包 | 用途 |
|---|---|
@solana/rpc | RPC 客户端创建 |
@solana/rpc-subscriptions | WebSocket 订阅 |
@solana/signers | 签名接口 |
@solana/addresses | 地址工具 |
@solana/keys | 密钥生成 |
@solana/transactions | 交易编译 |
@solana/transaction-messages | 消息构建 |
@solana/accounts | 账户获取 |
@solana/codecs | 数据编码/解码 |
@solana/errors | 错误处理 |
| 包 | 程序 |
|---|---|
@solana-program/system | 系统程序 |
@solana-program/token | SPL 代币 |
@solana-program/token-2022 | 代币扩展 |
@solana-program/memo | 备忘录程序 |
@solana-program/compute-budget | 计算预算 |
@solana-program/address-lookup-table | 查找表 |
import {
signTransactionMessageWithSigners,
sendAndConfirmTransactionFactory,
getSignatureFromTransaction,
CompilableTransactionMessage,
TransactionMessageWithBlockhashLifetime,
Commitment,
} from "@solana/kit";
function createTransactionSender(rpc: Rpc, rpcSubscriptions: RpcSubscriptions) {
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
return async (
txMessage: CompilableTransactionMessage & TransactionMessageWithBlockhashLifetime,
commitment: Commitment = "confirmed"
) => {
const signedTx = await signTransactionMessageWithSigners(txMessage);
await sendAndConfirm(signedTx, { commitment, skipPreflight: false });
return getSignatureFromTransaction(signedTx);
};
}
// 用法
const sendTx = createTransactionSender(rpc, rpcSubscriptions);
const signature = await sendTx(transactionMessage);
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstructions,
IInstruction,
} from "@solana/kit";
async function buildTransaction(
rpc: Rpc,
feePayer: Address,
instructions: IInstruction[]
) {
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
return pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(feePayer, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstructions(instructions, tx)
);
}
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
const computeInstructions = [
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: 1000n }),
];
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions(computeInstructions, tx), // 前置!
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);
import {
setTransactionMessageAddressLookupTable,
} from "@solana/kit";
// 获取查找表
const lookupTableAccount = await fetchAddressLookupTable(rpc, lookupTableAddress);
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => setTransactionMessageAddressLookupTable(tx, lookupTableAccount),
(tx) => appendTransactionMessageInstructions(instructions, tx),
);
Kit 提供了全面的 TypeScript 类型:
import type {
Address,
Signature,
Lamports,
TransactionMessage,
Rpc,
RpcSubscriptions,
KeyPairSigner,
} from "@solana/kit";
// 地址是品牌化的字符串
const addr: Address = address("11111111111111111111111111111111");
// Lamports 是品牌化的 bigint
const amount: Lamports = lamports(1_000_000_000n);
// 类型安全的 RPC 响应
const response = await rpc.getBalance(addr).send();
// response.value 被类型化为 Lamports
仅导入所需内容 - Kit 是可摇树优化的
// 良好 - 仅导入使用的内容
import { createSolanaRpc, generateKeyPairSigner } from "@solana/kit";
// 同样良好 - 使用子包以获得更小的打包体积
import { createSolanaRpc } from "@solana/rpc";
import { generateKeyPairSigner } from "@solana/signers";
复用 RPC 连接 - 不要为每个请求创建连接
// 创建一次
const rpc = createSolanaRpc(endpoint);
// 到处复用
await rpc.getBalance(addr1).send();
await rpc.getBalance(addr2).send();
尽可能批量请求
// 在一个请求中获取多个账户
const accounts = await fetchEncodedAccounts(rpc, [addr1, addr2, addr3]);
谨慎使用 skipPreflight - 更快但不进行模拟
await sendAndConfirm(tx, { commitment: "confirmed", skipPreflight: true });
import { isSolanaError, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS } from "@solana/errors";
try {
await sendAndConfirm(signedTx, { commitment: "confirmed" });
} catch (error) {
if (isSolanaError(error, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS)) {
console.error("交易 SOL 不足");
} else if (isSolanaError(error)) {
console.error("Solana 错误:", error.context);
} else {
throw error;
}
}
请参阅单独的迁移技能或使用 @solana/compat 进行互操作:
import {
fromLegacyPublicKey,
fromLegacyKeypair,
fromVersionedTransaction,
fromLegacyTransactionInstruction,
} from "@solana/compat";
// 将旧的 PublicKey 转换为 Kit 的 Address
const address = fromLegacyPublicKey(legacyPublicKey);
// 将旧的 Keypair 转换为 Kit 的 CryptoKeyPair(异步)
const keyPair = await fromLegacyKeypair(legacyKeypair);
// 将旧的 VersionedTransaction 转换为 Kit 的 Transaction
const kitTransaction = fromVersionedTransaction(legacyVersionedTx);
// 将旧的 TransactionInstruction 转换为 Kit 的 Instruction
const kitInstruction = fromLegacyTransactionInstruction(legacyInstruction);
注意:兼容包用于从旧类型转换到 Kit 类型。对于反向转换,您可能需要手动构造旧对象。
Kit 相比 web3.js 1.x 带来了显著的性能提升:
| 指标 | web3.js 1.x | @solana/kit | 提升 |
|---|---|---|---|
| 密钥对生成 | ~50ms | ~5ms | 快 10 倍 |
| 交易签名 | ~20ms | ~2ms | 快 10 倍 |
| 打包体积 | 311KB | 226KB | 减小 26% |
| 确认延迟 | ~400ms | ~200ms | 快约 200ms |
基准测试来自 Triton One 的 Ping Thing 服务和 Solana Explorer 测试
solana-kit/
├── SKILL.md # 本文件
├── resources/
│ ├── packages-reference.md # 完整的包文档
│ └── api-quick-reference.md # 快速查找表
├── examples/
│ ├── transfer-sol/ # 基础 SOL 转账
│ ├── create-token/ # SPL 代币创建
│ ├── fetch-accounts/ # 账户获取和解码
│ └── subscriptions/ # 实时订阅
├── templates/
│ └── project-template.ts # 可复制的入门模板
└── docs/
├── advanced-patterns.md # 复杂模式
└── troubleshooting.md # 常见问题
每周安装量
118
仓库
GitHub 星标数
68
首次出现
2026年1月24日
安全审计
已安装于
opencode97
codex91
gemini-cli90
github-copilot88
cursor87
claude-code81
A comprehensive guide for building Solana applications with @solana/kit - the modern, tree-shakeable, zero-dependency JavaScript SDK from Anza.
Solana Kit (formerly web3.js 2.0) is a complete rewrite of the Solana JavaScript SDK with:
npm install @solana/kit
For specific program interactions:
npm install @solana-program/system @solana-program/token
import {
createSolanaRpc,
createSolanaRpcSubscriptions,
generateKeyPairSigner,
lamports,
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
signTransactionMessageWithSigners,
sendAndConfirmTransactionFactory,
getSignatureFromTransaction,
} from "@solana/kit";
import { getTransferSolInstruction } from "@solana-program/system";
const LAMPORTS_PER_SOL = BigInt(1_000_000_000);
async function transferSol() {
// 1. Connect to RPC
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
// 2. Create signers
const sender = await generateKeyPairSigner();
const recipient = await generateKeyPairSigner();
// 3. Get blockhash
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
// 4. Build transaction with pipe
const transactionMessage = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(sender.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstruction(
getTransferSolInstruction({
amount: lamports(LAMPORTS_PER_SOL / BigInt(10)), // 0.1 SOL
destination: recipient.address,
source: sender,
}),
tx
)
);
// 5. Sign
const signedTx = await signTransactionMessageWithSigners(transactionMessage);
// 6. Send and confirm
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signedTx, { commitment: "confirmed" });
console.log("Signature:", getSignatureFromTransaction(signedTx));
}
Kit separates HTTP and WebSocket connections:
import { createSolanaRpc, createSolanaRpcSubscriptions } from "@solana/kit";
// HTTP for requests
const rpc = createSolanaRpc("https://api.devnet.solana.com");
// WebSocket for subscriptions
const rpcSubscriptions = createSolanaRpcSubscriptions("wss://api.devnet.solana.com");
// Make RPC calls
const slot = await rpc.getSlot().send();
const balance = await rpc.getBalance(address).send();
const { value: blockhash } = await rpc.getLatestBlockhash().send();
Kit uses signer interfaces instead of keypairs directly:
import {
generateKeyPairSigner,
createKeyPairSignerFromBytes,
address,
} from "@solana/kit";
// Generate new signer
const signer = await generateKeyPairSigner();
console.log("Address:", signer.address);
// From existing secret key (Uint8Array)
const existing = await createKeyPairSignerFromBytes(secretKeyBytes);
// Create address from string
const addr = address("11111111111111111111111111111111");
Kit uses functional composition via pipe:
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstruction,
appendTransactionMessageInstructions,
prependTransactionMessageInstructions,
} from "@solana/kit";
const tx = pipe(
createTransactionMessage({ version: 0 }), // Create v0 message
(tx) => setTransactionMessageFeePayer(payer.address, tx), // Set fee payer
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx), // Set lifetime
(tx) => appendTransactionMessageInstruction(instruction1, tx), // Add instruction
(tx) => appendTransactionMessageInstructions([instruction2, instruction3], tx), // Add multiple
);
import {
signTransactionMessageWithSigners,
partiallySignTransactionMessageWithSigners,
getSignatureFromTransaction,
} from "@solana/kit";
// Sign with all signers in the transaction
const signedTx = await signTransactionMessageWithSigners(transactionMessage);
// Partial signing (for multisig)
const partiallySignedTx = await partiallySignTransactionMessageWithSigners(
transactionMessage
);
// Get signature before sending
const signature = getSignatureFromTransaction(signedTx);
import {
sendAndConfirmTransactionFactory,
sendTransactionWithoutConfirmingFactory,
getBase64EncodedWireTransaction,
} from "@solana/kit";
// Send with confirmation (recommended)
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
await sendAndConfirm(signedTx, { commitment: "confirmed" });
// Send without waiting for confirmation
const send = sendTransactionWithoutConfirmingFactory({ rpc });
await send(signedTx, { commitment: "confirmed" });
// Manual encoding (low-level)
const encoded = getBase64EncodedWireTransaction(signedTx);
await rpc.sendTransaction(encoded, { encoding: "base64" }).send();
import {
fetchEncodedAccount,
fetchEncodedAccounts,
assertAccountExists,
} from "@solana/kit";
// Fetch single account
const account = await fetchEncodedAccount(rpc, address);
if (account.exists) {
console.log("Lamports:", account.lamports);
console.log("Owner:", account.programAddress);
console.log("Data:", account.data);
}
// Fetch multiple accounts
const accounts = await fetchEncodedAccounts(rpc, [addr1, addr2, addr3]);
// Assert account exists (throws if not)
assertAccountExists(account);
| Import | Description |
|---|---|
@solana/kit | Main package - includes everything below |
| Package | Purpose |
|---|---|
@solana/rpc | RPC client creation |
@solana/rpc-subscriptions | WebSocket subscriptions |
@solana/signers | Signing interfaces |
@solana/addresses | Address utilities |
@solana/keys | Key generation |
@solana/transactions | Transaction compilation |
| Package | Program |
|---|---|
@solana-program/system | System Program |
@solana-program/token | SPL Token |
@solana-program/token-2022 | Token Extensions |
@solana-program/memo | Memo Program |
@solana-program/compute-budget | Compute Budget |
@solana-program/address-lookup-table |
import {
signTransactionMessageWithSigners,
sendAndConfirmTransactionFactory,
getSignatureFromTransaction,
CompilableTransactionMessage,
TransactionMessageWithBlockhashLifetime,
Commitment,
} from "@solana/kit";
function createTransactionSender(rpc: Rpc, rpcSubscriptions: RpcSubscriptions) {
const sendAndConfirm = sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions });
return async (
txMessage: CompilableTransactionMessage & TransactionMessageWithBlockhashLifetime,
commitment: Commitment = "confirmed"
) => {
const signedTx = await signTransactionMessageWithSigners(txMessage);
await sendAndConfirm(signedTx, { commitment, skipPreflight: false });
return getSignatureFromTransaction(signedTx);
};
}
// Usage
const sendTx = createTransactionSender(rpc, rpcSubscriptions);
const signature = await sendTx(transactionMessage);
import {
pipe,
createTransactionMessage,
setTransactionMessageFeePayer,
setTransactionMessageLifetimeUsingBlockhash,
appendTransactionMessageInstructions,
IInstruction,
} from "@solana/kit";
async function buildTransaction(
rpc: Rpc,
feePayer: Address,
instructions: IInstruction[]
) {
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();
return pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(feePayer, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx),
(tx) => appendTransactionMessageInstructions(instructions, tx)
);
}
import {
getSetComputeUnitLimitInstruction,
getSetComputeUnitPriceInstruction,
} from "@solana-program/compute-budget";
const computeInstructions = [
getSetComputeUnitLimitInstruction({ units: 200_000 }),
getSetComputeUnitPriceInstruction({ microLamports: 1000n }),
];
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => prependTransactionMessageInstructions(computeInstructions, tx), // Prepend!
(tx) => appendTransactionMessageInstruction(mainInstruction, tx),
);
import {
setTransactionMessageAddressLookupTable,
} from "@solana/kit";
// Fetch lookup table
const lookupTableAccount = await fetchAddressLookupTable(rpc, lookupTableAddress);
const tx = pipe(
createTransactionMessage({ version: 0 }),
(tx) => setTransactionMessageFeePayer(payer.address, tx),
(tx) => setTransactionMessageLifetimeUsingBlockhash(blockhash, tx),
(tx) => setTransactionMessageAddressLookupTable(tx, lookupTableAccount),
(tx) => appendTransactionMessageInstructions(instructions, tx),
);
Kit provides comprehensive TypeScript types:
import type {
Address,
Signature,
Lamports,
TransactionMessage,
Rpc,
RpcSubscriptions,
KeyPairSigner,
} from "@solana/kit";
// Addresses are branded strings
const addr: Address = address("11111111111111111111111111111111");
// Lamports are branded bigints
const amount: Lamports = lamports(1_000_000_000n);
// Type-safe RPC responses
const response = await rpc.getBalance(addr).send();
// response.value is typed as Lamports
Import only what you need - Kit is tree-shakeable
// Good - only imports what's used
import { createSolanaRpc, generateKeyPairSigner } from "@solana/kit";
// Also good - use subpackages for smaller bundles
import { createSolanaRpc } from "@solana/rpc";
import { generateKeyPairSigner } from "@solana/signers";
Reuse RPC connections - Don't create per request
// Create once
const rpc = createSolanaRpc(endpoint);
// Reuse everywhere
await rpc.getBalance(addr1).send();
await rpc.getBalance(addr2).send();
Batch requests when possible
// Fetch multiple accounts in one request
const accounts = await fetchEncodedAccounts(rpc, [addr1, addr2, addr3]);
Use skipPreflight carefully - Faster but no simulation
await sendAndConfirm(tx, { commitment: "confirmed", skipPreflight: true });
import { isSolanaError, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS } from "@solana/errors";
try {
await sendAndConfirm(signedTx, { commitment: "confirmed" });
} catch (error) {
if (isSolanaError(error, SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS)) {
console.error("Not enough SOL for transaction");
} else if (isSolanaError(error)) {
console.error("Solana error:", error.context);
} else {
throw error;
}
}
See the separate migration skill or use @solana/compat for interoperability:
import {
fromLegacyPublicKey,
fromLegacyKeypair,
fromVersionedTransaction,
fromLegacyTransactionInstruction,
} from "@solana/compat";
// Convert legacy PublicKey to Kit Address
const address = fromLegacyPublicKey(legacyPublicKey);
// Convert legacy Keypair to Kit CryptoKeyPair (async)
const keyPair = await fromLegacyKeypair(legacyKeypair);
// Convert legacy VersionedTransaction to Kit Transaction
const kitTransaction = fromVersionedTransaction(legacyVersionedTx);
// Convert legacy TransactionInstruction to Kit Instruction
const kitInstruction = fromLegacyTransactionInstruction(legacyInstruction);
Note : The compat package converts FROM legacy TO Kit types. For reverse conversion, you may need to manually construct legacy objects.
Kit delivers significant performance improvements over web3.js 1.x:
| Metric | web3.js 1.x | @solana/kit | Improvement |
|---|---|---|---|
| Keypair Generation | ~50ms | ~5ms | 10x faster |
| Transaction Signing | ~20ms | ~2ms | 10x faster |
| Bundle Size | 311KB | 226KB | 26% smaller |
| Confirmation Latency | ~400ms | ~200ms | ~200ms faster |
Benchmarks from Triton One's Ping Thing service and Solana Explorer testing
solana-kit/
├── SKILL.md # This file
├── resources/
│ ├── packages-reference.md # Complete package documentation
│ └── api-quick-reference.md # Quick lookup table
├── examples/
│ ├── transfer-sol/ # Basic SOL transfer
│ ├── create-token/ # SPL token creation
│ ├── fetch-accounts/ # Account fetching & decoding
│ └── subscriptions/ # Real-time subscriptions
├── templates/
│ └── project-template.ts # Copy-paste starter
└── docs/
├── advanced-patterns.md # Complex patterns
└── troubleshooting.md # Common issues
Weekly Installs
118
Repository
GitHub Stars
68
First Seen
Jan 24, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode97
codex91
gemini-cli90
github-copilot88
cursor87
claude-code81
Node.js 环境配置指南:多环境管理、类型安全与最佳实践
10,500 周安装
@solana/transaction-messages | Message building |
@solana/accounts | Account fetching |
@solana/codecs | Data encoding/decoding |
@solana/errors | Error handling |
| Lookup Tables |