Розробка dApp React — надійне створення фронтенду децентралізованого додатку
Web3 frontend development вимагає особливого підходу: тут немає звичних HTTP-запитів, а користувач працює безпосередньо з блокчейном. Ми використовуємо екосистему wagmi v2 та viem для надійної роботи з EVM-мережами. React hooks wagmi дозволяють легко інтегрувати гаманці та керувати транзакціями. Наш досвід дозволяє уникнути типових помилок та прискорити виведення продукту.
| Характеристика | wagmi + viem | ethers.js v6 |
|---|---|---|
| Розмір бандла (gzip) | ~60 KB | ~200 KB |
| TypeScript support | Відмінний (tree-shakeable) | Хороший, але складніше |
| Кешування | Вбудоване (TanStack Query) | Немає, потрібно писати самим |
| SSR-сумісність | З коробки | Вимагає обгорток |
Детальніше про стек
Ми також використовуємо TanStack Query для кешування та стану сервера, що дозволяє уникнути зайвих RPC-викликів. Вбудований multicall через Multicall3 скорочує кількість запитів у 2-3 рази.Чому ми використовуємо wagmi і viem замість ethers.js?
Розробка фронтенду dApp стикається з неочевидними проблемами: транзакції можуть зависати на години, користувачі перемикають мережі без попередження, RPC-провайдери падають у найневідповідніший момент. Перенесення архітектури звичайних веб-додатків сюди не працює. У dApp немає сесій, авторизації через сервер та гарантованої доступності API. Наш підхід — використовувати екосистему wagmi v2 та viem. Це не просто бібліотеки, а opinionated шар для React, який покриває 90% сценаріїв: від керування гаманцями до кешування даних з ончейну. Wagmi з viem завантажується в 3 рази швидше, ніж ethers.js, що підтверджується бенчмарками.
Як керувати станом транзакцій?
Транзакція в EVM — не HTTP-запит. Вона проходить стадії: pending в mempool → included в блок → confirmed (N підтверджень). Користувач повинен бачити, що відбувається на кожному етапі.
import { useWriteContract, useWaitForTransactionReceipt } from "wagmi"; function MintButton() { const { writeContract, data: hash, isPending } = useWriteContract(); const { isLoading: isConfirming, isSuccess } = useWaitForTransactionReceipt({ hash, confirmations: 2, }); return ( <button disabled={isPending || isConfirming}> {isPending ? "Підписуємо..." : isConfirming ? "Чекаємо блок..." : "Mint"} </button> ); } Такий патерн гарантує, що користувач не надішле повторну транзакцію, поки поточна не підтвердиться. Якщо транзакція зависла більше ніж на 5 хвилин, ми даємо можливість Speed Up (збільшення gas на 10% з тим же nonce) або Cancel (відправлення 0 ETH собі з тим же nonce) — обидві операції через viem sendTransaction.
Як читати дані з контракту ефективно?
Для батчингу запитів використовуємо useReadContracts — він об'єднує кілька викликів в один RPC запит через Multicall3. Wagmi автоматично кешує дані через TanStack Query (за замовчуванням staleTime = 4 секунди). Для DeFi-панелей з даними, що швидко змінюються, знижуємо staleTime до 0 та вмикаємо refetchInterval. Це знижує навантаження на RPC та пришвидшує інтерфейс.
Які типові помилки виникають та як їх вирішувати?
- User rejected (код 4001) — просто закриваємо модалку, не показуємо toast.
- Insufficient funds (код -32000) — показуємо повідомлення з сумою, якої не вистачає.
- Revert з reason — парсимо через
ContractFunctionRevertedErrorз viem:
import { ContractFunctionRevertedError } from "viem"; if (error instanceof ContractFunctionRevertedError) { const reason = error.data?.errorName ?? error.shortMessage; // Показуємо reason } - Stuck transaction — якщо pending > 5 хвилин, даємо UI для Speed Up або Cancel.
Ще одна часта проблема — невідповідність мережі. Ми використовуємо компонент ChainGuard, який перевіряє chainId через useChainId та викликає switchChain при необхідності. Це запобігає cryptic error та покращує UX.
Як інтегрувати гаманець за 5 кроків
- Встановіть wagmi та viem через npm/yarn.
- Налаштуйте
WagmiProviderз конфігурацією мереж та гаманців. - Використовуйте
useConnectтаuseAccountдля підключення. - Реалізуйте
useDisconnectдля виходу. - Додайте ChainGuard для автоматичного перемикання мережі.
Етапи розробки
| Етап | Що робимо | Результат | Термін |
|---|---|---|---|
| Аналітика | Вивчаємо специфікацію контрактів, UX-вимоги | Технічне завдання | 2 дні |
| Проєктування | Схема компонентів, стейт-менеджмент, роутинг | Архітектурний документ | 2 дні |
| Розробка | Підключення гаманців, транзакції, події, UI | Робочий прототип на testnet | 5–10 днів |
| Тестування | QA на Sepolia, edge cases, помилки перемикання мереж | Виправлені баги | 2 дні |
| Деплой | Налаштування продакшен-середовища, моніторинг | Продакшен | 1 день |
Вартість розраховується індивідуально, терміни — від 10 робочих днів. Отримайте консультацію — оцінимо ваш проєкт за 1 день.
Що отримуєте в результаті?
- Архітектура та налаштування — конфігурація wagmi, мультичейн підтримка, SSR-обгортки.
- Інтеграція з контрактами — генерація хуків з ABI, multicall, обробка підтверджень.
- Wallet UX — ChainGuard для контролю мережі, обробка відключення, десктоп/мобільні гаманці.
- Документація — README з описом стеку, змінних середовища, команд.
- Навчання команди — 2 сесії по коду, розбір кастомних хуків.
- Підтримка 3 місяці — консультації по багах, оновлення залежностей.
Чому обирають нас
5+ років досвіду в Web3, 10+ реалізованих dApp, сертифіковані розробники Solidity. Наші рішення працюють на Ethereum, Arbitrum, Optimism, Polygon — адаптуємося під вашу мережу. Економія на газі за рахунок оптимізації викликів — до 40%. Зв'яжіться для оцінки вашого проєкту.
Джерело: Ethereum Virtual Machine (Wikipedia)







