Тестирование смарт-контрактов на тестнете
Локальные тесты на Foundry anvil или Hardhat node проходят — и команда считает контракт готовым к mainnet. Но тестнет регулярно выявляет то, что локальная среда пропускает: корректность ABI при взаимодействии через реальный кошелёк, поведение сторонних оракулов и протоколов, задержки транзакций, edge cases с gas estimation.
Выбор тестовой сети
Для 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. Важно: compiler version и optimization settings в конфиге должны точно совпадать с теми, что были при деплое. Расхождение в одну настройку — не верифицируется.
Взаимодействие через Metamask/Safe. Сигнатуры функций, читаемые названия параметров в Etherscan UI, корректные события в Transaction logs. Проверяем, что ABI published и frontend корректно декодирует ответы.
Gas estimation. Реальный газ на тестнете 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 основных функций
- Граничные случаи: нулевые суммы, максимальные значения uint256
- События эмитируются и декодируются корректно
Для контрактов с upgradeability — тестируем полный цикл upgrade на тестнете перед 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 дня. Сюда входит деплой, верификация, ручное тестирование сценариев и исправление найденных issues. Для контрактов с множеством интеграций — до недели.
Стоимость рассчитывается в зависимости от сложности контракта и количества тестируемых сценариев.







