Solana Kit (@solana/kit) — це високорівневий TypeScript-пакет із сімейства Solana Web3.js v2, який спрощує взаємодію з блокчейном Solana у frontend- та backend-застосунках. На відміну від попереднього покоління бібліотек, Kit пропонує функціональний API, сувору типізацію та сумісність із сучасними бандлерами через tree-shaking.

Цей довідник проведе вас від встановлення до першого робочого запиту на Devnet. Усі приклади розраховані на середовище Node.js 18+ та кластер Devnet.

Що таке Solana Kit

Сучасний набір інструментів для Solana-frontend

@solana/kit — це зручна оболонка (convenience layer) над низькорівневими пакетами @solana/web3.js v2. Він не замінює ядро, а агрегує найчастіші операції в єдину точку входу:

  • Створення RPC-клієнта для зв'язку з кластером
  • Генерація та обробка адрес (Account Public Keys)
  • Формування транзакцій та підписів
  • Отримання балансів, станів акаунтів, інформації про блоки

Архітектурно Kit належить до монорепозиторію @solana/web3.js v2 і залежить від пакетів @solana/rpc, @solana/addresses, @solana/transactions та інших. Ви не імпортуєте їх окремо — Kit робить це за вас.

Відмінності від @solana/web3.js

Головна різниця — покоління API:

  • @solana/web3.js v1 (стабільний, широко використовуваний) — об'єктно-орієнтований підхід з класами Connection, Transaction, Keypair
  • @solana/kit (частина v2-екосистеми) — функціональний підхід: замість класів використовуються фабричні функції та незмінні об'єкти

Наприклад, у v1 ви створюєте new Connection(endpoint), а в Kit — викликаєте createSolanaRpc(endpoint). Результат концептуально схожий, але типи та внутрішня структура відрізняються. Kit не є прямою заміною web3.js v1. Це окрема гілка розвитку з іншим API-контрактом.

Встановлення та налаштування

npm install @solana/kit

Передумови:

  • Node.js 18 або новіший
  • npm 9+ або сумісний пакетний менеджер
  • Доступ до інтернету для зв'язку з Devnet RPC

Встановлення:

npm install @solana/kit

Перевірте встановлену версію:

npm ls @solana/kit

Очікуваний результат: виведення версії пакета без помилок залежностей. Актуальну версію на момент вашого читання перевірте на сторінці пакета в npm-реєстрі, оскільки екосистема v2 активно оновлюється.

Базова конфігурація

Створіть мінімальний скрипт для перевірки зв'язку з Devnet. Збережіть як test-rpc.ts і запустіть через npx tsx test-rpc.ts:

import { createSolanaRpc, address } from '@solana/kit';

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

const testAddress = address('11111111111111111111111111111111');
const balance = await rpc.getBalance(testAddress).send();

console.log('Баланс системної програми:', balance.value, 'lamports');

Очікуваний результат: Баланс системної програми: 0 lamports. Якщо ви отримали цей вивід — RPC-клієнт працює коректно.

Важлива деталь: функція address() перетворює рядок на типізований об'єкт Address. У v2 адреси — це не просто рядки, а спеціальні типи, що запобігає плутанині між рядковими літералами та справжніми публічними ключами.

Основні можливості

Створення транзакцій

У Solana Kit транзакція формується крок за кроком: створюється повідомлення (message), додаються інструкції, потім повідомлення підписується та серіалізується.

Концептуальний приклад — формування транзакції переказу SOL на Devnet. Для роботи цього прикладу також потрібен пакет системної програми:

npm install @solana-program/system
import {
  createSolanaRpc,
  address,
  generateKeyPairSigner,
  appendTransactionInstruction,
  compressTransactionMessage,
  createTransactionMessage,
  getBase58EncodedAddress,
  setTransactionMessageFeePayer,
  setTransactionMessageLifetimeUsingBlockhash,
  signTransactionMessageWithSigners,
} from '@solana/kit';
import { getTransferSolInstruction } from '@solana-program/system';

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

// Генеруємо пару ключів для відправника
const sender = await generateKeyPairSigner();
const recipientAddress = address('11111111111111111111111111111111');

// Отримуємо останній blockhash
const { value: latestBlockhash } = await rpc.getLatestBlockhash().send();

// Формуємо транзакцію
const message = createTransactionMessage({ version: 'legacy' });
setTransactionMessageFeePayer(sender.address, message);
setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, message);

const transferInstruction = getTransferSolInstruction({
  amount: 1_000_000n, // 0.001 SOL у lamports
  destination: recipientAddress,
  source: sender.address,
});

appendTransactionInstruction(transferInstruction, message);

// Підписуємо
const signedTransaction = await signTransactionMessageWithSigners(message);
const serialized = compressTransactionMessage(signedTransaction);

console.log('Відправник:', getBase58EncodedAddress(sender.address));
console.log('Транзакцію сформовано. Для відправки потрібен SOL на балансі відправника.');

Цей приклад демонструє формування транзакції, але не відправляє її. Щоб реально надіслати транзакцію на Devnet, відправник повинен мати баланс у lamports. Отримати тестові токени можна через кран (faucet) — це окрема тема, яка не розглядається в цьому матеріалі.

Зверніть увагу: getTransferSolInstruction імпортується з @solana-program/system, а не з @solana/kit. Інструкції для програм у v2-екосистемі рознесені по окремих пакетах.

Робота з акаунтами та підписами

Solana Kit розрізняє кілька концепцій, які в web3.js v1 часто змішувалися:

  • Address — публічний ключ акаунта, створюється через address() або читається через getBase58EncodedAddress()
  • KeyPairSigner — пара ключів, що може підписувати транзакції, створюється через generateKeyPairSigner()
  • Signer — загальна абстракція для будь-чого, що може підписати (ключова пара, зовнішній гаманець тощо)

Приклад генерації ключової пари та отримання адреси:

import { generateKeyPairSigner, getBase58EncodedAddress } from '@solana/kit';

const keyPair = await generateKeyPairSigner();
const publicKey = getBase58EncodedAddress(keyPair.address);

console.log('Публічний ключ:', publicKey);

Очікуваний результат: рядок із 43–44 символів у форматі Base58. Кожен виклик generateKeyPairSigner() створює нову унікальну пару — це корисно для тестів, але не для production, де приватні ключі треба зберігати безпечно.

Порівняння з web3.js

Коли обрати Solana Kit замість web3.js

Вибір залежить від контексту проєкту:

Критерій @solana/web3.js v1 @solana/kit (v2)
Стабільність Доведена роками, найширша підтримка Активний розвиток, API може змінюватися між мінорними версіями
Документація та приклади Велика кількість посібників, відповідей на форумах Обмежена, переважно офіційна документація v2
TypeScript Підтримка є, але типи менш суворі Нативна сувора типізація з самого початку
Tree-shaking Обмежений через класову архітектуру Проєктовано для tree-shaking з першого дня
Сумісність з Anchor Повна, стандарт де-факто Потребує додаткової конфігурації
Екосистема інструментів Найширша Зростаюча

Рекомендація для початківця: якщо ви вчитеся за існуючими туторіалами або працюєте з Anchor — почніть з web3.js v1. Якщо ви стартуєте новий проєкт з нуля і готові орієнтуватися на актуальну документацію v2 — Solana Kit буде природнішим вибором.

Міграція з web3.js на Solana Kit

Міграція — це не заміна викликів один на один, а переписування з іншою ментальною моделлю. Основні відповідності:

  • new Connection(url)createSolanaRpc(url)
  • new PublicKey(str)address(str)
  • new Keypair()generateKeyPairSigner()
  • connection.getBalance(pubkey)rpc.getBalance(addr).send()
  • transaction.add(instruction)appendTransactionInstruction(instruction, message)

Зверніть увагу на .send() у кінці RPC-викликів. У v2 більшість запитів повертають об'єкт-запит, який треба явно виконати через .send(). Це дозволяє повторно використовувати налаштований запит або комбінувати їх.

Типові помилки

Невідповідність версій пакетів

Solana Kit залежить від низки пакетів з монорепозиторію v2. Якщо версії не узгоджені — виникають помилки типізації або виконання.

Типова помилка — встановлення пакетів із жорстко вказаними різними версіями:

npm install @solana/[email protected]
npm install @solana-program/[email protected]

Проблема: різні мінорні версії можуть бути несумісні між собою.

Правильний підхід — встановлювати без вказання версій, щоб npm вирішив сумісність автоматично:

npm install @solana/kit @solana-program/system

Або вказувати однакову мінорну версію для всіх пакетів v2-екосистеми. Точну таблицю сумісності версій перевірте в офіційному репозиторії @solana/web3.js на GitHub.

Ознака змішування пакетів v1 та v2 в одному файлі — помилки на кшталт Type 'Address' is not assignable to type 'PublicKey'. Якщо бачите це, перевірте імпорти: ймовірно, ви використовуєте типи з обох поколінь одночасно.

Невірний імпорт модулів

Поширена помилка — намагатися імпортувати щось з @solana/kit, що насправді належить до іншого пакета v2-екосистеми.

Інструкції для програм (System, Token, Stake) не входять до @solana/kit. Вони розташовані в окремих пакетах:

  • System Program: @solana-program/system
  • Token Program: @solana-program/token
  • Stake Program: @solana-program/stake

Якщо ви намагаєтеся імпортувати getTransferSolInstruction з @solana/kit — отримаєте помилку Module not found. Правильний шлях: import { getTransferSolInstruction } from '@solana-program/system'.

Ще одна часта помилка — використання звичайних рядків там, де очікується тип Address:

// Неправильно — передається рядок
await rpc.getBalance('11111111111111111111111111111111').send();

// Правильно — рядок обгорнутий у address()
await rpc.getBalance(address('11111111111111111111111111111111')).send();

TypeScript може не завжди спіймати цю помилку на етапі компіляції залежно від конфігурації, але виконання завершиться помилкою. Завжди використовуйте address() для перетворення рядкових літералів у типізовані адреси.

Перелік усіх експортів @solana/kit та їх точні сигнатури перевіряйте в офіційній документації — API v2 продовжує розвиватися, і імена функцій можуть змінюватися між мінорними релізами.

Джерела