Тестування смарт-контрактів на тестнеті
Локальні тесты на Foundry anvil або Hardhat node проходять — команда вважає контракт готовим до mainnet. Але тестнети регулярно виявляють те, що локальне середовище пропускає: коректність ABI при взаємодії через реальний гаманець, поведінку сторонніх оракулів та протоколів, затримки транзакцій, edge cases з оцінкою газу.
Вибір тестової мережі
Для Ethereum-сумісних мереж актуальні тестнети у 2024-2025:
| Тестнет | Чейн | Особливості |
|---|---|---|
| Sepolia | Ethereum L1 | Основний ETH тестнет, PoS консенсус |
| Holesky | Ethereum L1 | Більший validator set, краще для staking |
| Amoy | Polygon | Заміна Mumbai |
| Arbitrum Sepolia | Arbitrum L2 | ArbOS, L1→L2 messaging |
| Optimism Sepolia | Optimism L2 | OP Stack, fault proofs |
| Base Sepolia | Base L2 | OP Stack, Coinbase |
| BSC Testnet | BNB Chain | Паралельно з mainnet |
Goerli застарів. Не розгортайте туди нічого нового.
Що перевіряти на тестнеті
Верифікація через Etherscan. Розгортання без верифікації — червоний прапор для користувачів та аудиторів. Використовуйте forge verify-contract або hardhat verify. Важливо: версія компілятора та налаштування оптимізації у конфігу мають точно співпадати з тими, що були при розгортанні. Розбіжність в одному налаштуванні — не верифікується.
Взаємодія через Metamask/Safe. Сигнатури функцій, читальні назви параметрів в Etherscan UI, коректні події в Transaction logs. Перевіримо, що ABI опубліковано та фронтенд коректно декодує відповіді.
Оцінка газу. Реальний газ на тестнеті vs локальний. Foundry gas_price в anvil за замовчуванням 1 wei — на тестнеті базова комісія плаває. Тест з vm.txGasPrice() не завжди відражає реальність.
Інтеграція з протоколами. Якщо контракт використовує Chainlink Price Feeds, Uniswap, Aave — розгорнемо їх адреси на тестнеті або використовуємо офіційні розгортання на тестнеті. Chainlink надає Price Feeds на Sepolia. Uniswap V3 розгорнув на Sepolia. Aave V3 — на Sepolia.
Процес тестування
Фаза тестнет-тестування починається після прохідження unit та fuzz тестів у Foundry. Запустимо скрипт розгортання (forge script) з --rpc-url sepolia --broadcast. Після розгортання перевіримо:
- Конструктор ініціалізував змінні коректно (читаємо через cast call)
- Обмеження доступу працюють (спроба виклику owner-функцій з іншої адреси)
- Happy path основних функцій
- Edge cases: нульові суми, макс значення uint256
- События емітуються та декодуються коректно
Для контрактів з можливістю оновлення — тестуємо повний цикл оновлення на тестнеті перед mainnet.
Скрипти розгортання та cast
cast з пакета Foundry — основний інструмент для ручної взаємодії:
# Прочитати змінну
cast call $CONTRACT "owner()" --rpc-url sepolia
# Відправити транзакцію
cast send $CONTRACT "setLimit(uint256)" 1000000 \
--rpc-url sepolia --private-key $PRIVATE_KEY
# Декодувати calldata транзакції
cast 4byte-decode 0xa9059cbb...
Для складних сценаріїв — написати Forge Script з vm.broadcast() замість послідовних cast викликів.
Графіки
Типовое тестнет-тестування нового контракту середнього розміру: 1-3 дні. Включає розгортання, верифікацію, ручне тестування сценаріїв та виправлення знайдених проблем. Для контрактів з багатьма інтеграціями — до тижня.
Вартість залежить від складності контракту та кількості тестуємих сценаріїв.







