Ми розробляємо multicall-контракти для batch-операцій, що скорочують RPC-запити до 90% та економлять газ до 70%. Наприклад, читання стану десяти контрактів окремо вимагає десяти RPC-запитів, тоді як Multicall об'єднує їх в один. Завдяки цьому завантаження dApp на публічних ендпоінтах скорочується з 3 секунд до 0.3 секунди — у 10 разів швидше, ніж послідовні виклики. Це приклад gas optimization batch: економія газу до 70% означає зниження витрат на $0.50 при batch з 10 транзакцій. Наші рішення забезпечують пакетні виклики blockchain з мінімальним навантаженням на ноду.
Ми маємо 5+ років досвіду в Web3 та успішно запустили понад 20 смарт-контрактів для DeFi-протоколів, NFT-маркетплейсів та кросс-чейн мостів. Кожен контракт проходить аудит безпеки, а вартість розробки кастомного multicall починається від $500 за просту read-агрегацію до $3000 за складний multi-step batch з аудитом. Гарантуємо відповідність найкращим практикам. Розробка смарт контрактів web3 — наша спеціалізація, ми виконуємо проєкти під ключ.
Як Multicall3 знижує RPC-навантаження?
Multicall3 (контракт на адресі 0xcA11bde05977b3631167028862bE2a173976CA11) задеплоєний у 50+ мережах. Він приймає масив (address target, bytes callData), виконує всі call-и та повертає результати. Для read-only запитів використовується eth_call, при цьому всі виклики виконуються за один RPC-запит. Це оптимізація RPC запитів у дії.
Типове використання через wagmi/viem для агрегації:
import { useReadContracts } from 'wagmi'; const { data } = useReadContracts({ contracts: [ { address: token1, abi: erc20Abi, functionName: 'balanceOf', args: [user] }, { address: token2, abi: erc20Abi, functionName: 'balanceOf', args: [user] }, { address: pool, abi: poolAbi, functionName: 'getReserves' }, { address: oracle, abi: oracleAbi, functionName: 'latestAnswer' }, ] }); // один RPC запит замість чотирьох Wagmi використовує Multicall3 під капотом: всі виклики в одному useReadContracts згортаються в один eth_call. Якщо мережа не підтримує Multicall3, wagmi fallback-ає до паралельних eth_call, що все одно економить час. Економія газу до 70% у batch-операціях — це і є gas optimization batch.
Коли кастомний контракт виграє?
Multicall3 не зберігає стан, не перевіряє авторизацію, не підтримує нативний ETH на окремі виклики. Для write-операцій з кастомною логікою пишемо власний контракт. Кастомний multicall solidity — саме те, що потрібно.
Паттерн self-multicall — контракт викликає сам себе через кілька функцій в одній транзакції. OpenZeppelin Multicall реалізує це через Multicall.sol:
abstract contract Multicall { function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success, _getRevertMsg(result)); results[i] = result; } } } delegatecall на address(this) — контракт викликає свої функції від імені оригінального msg.sender. Це дозволяє робити approve + deposit в одному виклику, де обидва кроки бачать однаковий msg.sender.
Критичне попередження щодо безпеки
delegatecall на address(this) з користувацьким data — потенційна вразливість. Якщо контракт не ізольований від привілейованих функцій, атакуючий може скласти data, який викликає transferOwnership. OpenZeppelin попереджає: не використовуйте цей паттерн з контрактами, де авторизація залежить від msg.sender, без додаткових перевірок. Ми при розробці обов'язково застосовуємо перевірки прав доступу на кожному кроці: кожна функція, доступна через self-multicall, перевіряє msg.sender.
Як реалізувати атомарні batch транзакції?
Для складних DeFi операцій (flash loan → swap → repay) потрібен контракт з проміжним станом, який відкочує все при помилці будь-якого кроку:
contract AtomicBatcher { struct Step { address target; bytes callData; uint256 value; uint256 minReturnValue; // перевірка результату } function executeBatch(Step[] calldata steps) external payable returns (bytes[] memory results) { results = new bytes[](steps.length); for (uint256 i = 0; i < steps.length; i++) { (bool success, bytes memory result) = steps[i].target.call{ value: steps[i].value }(steps[i].callData); require(success, string(abi.encodePacked("Step ", i, " failed"))); if (steps[i].minReturnValue > 0) { uint256 returnValue = abi.decode(result, (uint256)); require(returnValue >= steps[i].minReturnValue, "Slippage exceeded"); } results[i] = result; } // повернути невитрачений ETH if (address(this).balance > 0) { (bool sent,) = msg.sender.call{value: address(this).balance}(""); require(sent); } } } minReturnValue — вбудований захист від slippage на кожному кроці. Swap повернув менше мінімуму — вся транзакція відкочується. Кастомний контракт зменшує газові витрати у 3 рази у порівнянні з Multicall3 для складних multi-step операцій. Це ще один приклад, як кастомний multicall solidity забезпечує ефективність.
Порівняння Multicall3 та кастомного контракту
Таблиця порівняння
| Сценарій | Multicall3 | Кастомний |
|---|---|---|
| Агрегація read-запитів | Достатньо | Надмірно |
| Декілька ERC-20 transfer | Достатньо | Надмірно |
| Approve + protocol action (один токен) | Достатньо | Достатньо |
| Flash loan + arbitrage + repay | Не підходить | Потрібен |
| Умовні дії (якщо результат кроку X > Y) | Не підходить | Потрібен |
| Розподіл ETH за адресами з різними сумами | Не підходить | Потрібен |
Оцінка тривалості розробки
| Складність | Орієнтовна тривалість | Вартість, $ |
|---|---|---|
| Проста (read aggregation) | 1 день | 500 |
| Середня (write batch з перевірками) | 2-3 дні | 1500 |
| Складна (multi-step DeFi) | 3-5 днів | 3000 |
Що входить в роботу
- Аналіз вимог та проектування архітектури.
- Написання та тестування Solidity-контракту (Foundry, Tenderly).
- Аудит безпеки (Slither, Mythril, ручний review).
- Деплой та верифікація коду на Etherscan.
- Документація (Natspec, README) та доступ до репозиторію.
- 1 місяць інцидент-менеджменту та підтримки.
- Навчання команди замовника роботі з контрактом.
Покроковий процес розробки
Розгорніть для деталей
- Аналіз вимог — визначаємо сценарії використання, вимоги до безпеки та gas-ліміти.
- Проектування архітектури — обираємо між Multicall3 та кастомним контрактом, проектуємо структуру даних.
- Написання коду — реалізуємо Solidity-контракт з урахуванням gas optimization та перевірок.
- Тестування — модульні тести на Foundry, стрес-тести на Tenderly, симуляція.
- Аудит безпеки — статичний аналіз (Slither, Mythril), ручний review досвідченими розробниками.
- Деплой та верифікація — розгортання в цільовій мережі, верифікація коду на Etherscan.
- Документація та підтримка — Natspec, README, 1 місяць інцидент-менеджменту.
Ми також виконуємо deploy multicall contract в різних мережах та забезпечуємо подальшу підтримку. Замовте розробку — наші інженери оцінять ваш проєкт за один день. Напишіть нам, і ми зробимо оцінку безкоштовно. Досвід — 5+ років, понад 20 успішних запусків. Гарантуємо чистоту коду та проходження зовнішнього аудиту.







