Інтеграція фронтенду з @solana/web3.js

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Інтеграція фронтенду з @solana/web3.js
Простий
~2-3 дні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1306
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1218
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    920
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1147
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    610
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    885

Інтеграція фронтенда Solana з @solana/web3.js

Фронтенд Solana не є EVM. Немає ethers.js, немає useContractRead. Модель облікових записів, гаманці через Wallet Adapter, десеріалізація через Borsh — все інакше. Основна пастка для розробників з EVM-фоном — спроба застосувати ті ж паттерни. Це не працює.

Підключення гаманця: Wallet Adapter

@solana/wallet-adapter — стандартний спосіб підключення Phantom, Solflare, Backpack та інших гаманців:

// providers.tsx
import { ConnectionProvider, WalletProvider } from '@solana/wallet-adapter-react'
import { WalletModalProvider } from '@solana/wallet-adapter-react-ui'
import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets'
import { clusterApiUrl } from '@solana/web3.js'

const wallets = [new PhantomWalletAdapter(), new SolflareWalletAdapter()]
const endpoint = clusterApiUrl('mainnet-beta') // або ваш RPC

export function SolanaProviders({ children }: { children: React.ReactNode }) {
  return (
    <ConnectionProvider endpoint={endpoint}>
      <WalletProvider wallets={wallets} autoConnect>
        <WalletModalProvider>
          {children}
        </WalletModalProvider>
      </WalletProvider>
    </ConnectionProvider>
  )
}

Імпорт стилів обов'язковий: import '@solana/wallet-adapter-react-ui/styles.css'. Без цього модаль підключення не відобразиться коректно.

Читання даних з блокчейну

Connection з @solana/web3.js аналогічна PublicClient у viem. Ключові методи:

import { Connection, PublicKey, LAMPORTS_PER_SOL } from '@solana/web3.js'

const connection = new Connection(
  process.env.NEXT_PUBLIC_RPC_URL!,
  'confirmed' // рівень комітування: processed | confirmed | finalized
)

// SOL баланс
const balance = await connection.getBalance(new PublicKey(address))
const solBalance = balance / LAMPORTS_PER_SOL

// Інформація про облік запису (дані облікового запису програми)
const accountInfo = await connection.getAccountInfo(new PublicKey(address))

Рівні комітування — важливий деталь, яку часто упускають. processed — максимально швидко, але транзакція може відкатитися. confirmed — підтверджено ~66% stake. finalized — необоротно. Для UI зазвичай confirmed, для фінансових операцій — finalized.

Робота з SPL токенами

Більшість dApps працюють з SPL токенами, а не нативним SOL. Вам потрібний @solana/spl-token:

import { getAssociatedTokenAddress, getAccount } from '@solana/spl-token'
import { PublicKey } from '@solana/web3.js'

// Адреса token account користувача
const tokenAccount = await getAssociatedTokenAddress(
  new PublicKey(mintAddress),  // адреса mint токена
  new PublicKey(walletAddress) // гаманець власника
)

// Баланс
try {
  const account = await getAccount(connection, tokenAccount)
  const balance = Number(account.amount) / 10 ** decimals
} catch (e) {
  // TokenAccountNotFoundError — облік запису не створений, баланс 0
}

Нюанс: token account може не існувати, якщо користувач ніколи не тримав цей токен. Це не помилка — просто баланс 0. Вам потрібно обробити TokenAccountNotFoundError.

Відправка транзакцій

import { useWallet } from '@solana/wallet-adapter-react'
import { Transaction, SystemProgram, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'

const { publicKey, sendTransaction } = useWallet()

const handleSend = async () => {
  if (!publicKey) return
  
  const { blockhash, lastValidBlockHeight } = 
    await connection.getLatestBlockhash()
  
  const transaction = new Transaction().add(
    SystemProgram.transfer({
      fromPubkey: publicKey,
      toPubkey: new PublicKey(recipient),
      lamports: amount * LAMPORTS_PER_SOL,
    })
  )
  transaction.recentBlockhash = blockhash
  transaction.feePayer = publicKey

  const signature = await sendTransaction(transaction, connection)
  
  // Очікування підтвердження
  await connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight })
}

sendTransaction з wallet adapter автоматично запитує підпис у гаманці користувача.

RPC та Rate Limits

Публічний clusterApiUrl('mainnet-beta') — тільки для розробки, він жорстко лімітований. Для production: Helius, QuickNode, Alchemy (Solana), або власна нода. Helius особливо зручний — надає розширений API з парсингом транзакцій та webhook'ами для on-chain подій.

Інтеграція займає 2–3 дні: налаштування wallet adapter, підключення до RPC, базові операції читання/запису та обробка типових помилок (insufficient funds, blockhash expired, simulation failed).