Проблема: тесты падают, доверия нет
Представьте: вы деплоите контракт в mainnet, но через час обнаруживаете reentrancy-уязвимость. Пользователи потеряли средства — репутация подорвана, аудит не помог. Каждый час простоя обходится в $5,000, а ущерб от reentrancy-атак превышает $100M. Или типичная ситуация: новый разработчик тратит полдня на установку зависимостей и запуск первого теста. CI-пайплайн упал, но никто не знает почему — логи пусты.
Наша команда с 5-летним опытом в блокчейн-разработке настроила такие среды для 50+ проектов, включая протоколы с суммарным TVL > $1B. В результате время деплоя сократилось на 40%, а число багов в продакшене — на 70%. Это не просто тулчейн — это гарантия стабильности и воспроизводимости.
Какой фреймворк выбрать под задачу?
Для Solidity-проектов сейчас два реальных варианта: Foundry и Hardhat. Они решают разные задачи и часто используются вместе. Выбор зависит от того, что вы тестируете: логику контракта или интеграцию с фронтендом.
| Параметр | Foundry | Hardhat |
|---|---|---|
| Язык тестов | Solidity | TypeScript/JavaScript |
| Скорость выполнения | Очень быстро (revm на Rust) | Медленнее (до 5x) |
| Fuzz-тестирование | Встроено (differential, invariant) | Только через плагины |
| Mainnet fork | vm.createFork() |
--fork-url |
| Frontend интеграция | Сложнее | Проще (ethers.js, Wagmi) |
| Скрипты деплоя | Solidity scripts | TypeScript + ethers.js |
| Отладка транзакций | forge debug |
console.log() в контракте |
Наш стандарт: Foundry для unit и fuzz-тестов, Hardhat для скриптов деплоя и интеграции с frontend. Оба конфига сосуществуют в одном репозитории — это позволяет писать тесты на Solidity, а деплоить через TypeScript.
Как устроена структура проекта?
Используем разделение на модули: contracts/core, contracts/interfaces, test/unit, test/integration, test/invariant, script (Foundry), deploy (Hardhat) и fixtures. Такая организация позволяет отделить модульные тесты (без RPC) от интеграционных (с форком). Unit-тесты должны выполняться за считанные секунды, а интеграционные — только при мерже в main.
Настройка локальной сети, моков и фикстур
Локальная сеть: Anvil вместо Ganache
Anvil (входит в Foundry) — локальный EVM-нод на Rust. Быстрее Ganache в 10 раз, активно поддерживается. Для разработки запускаем в режиме форка mainnet или testnet:
# Форк Ethereum mainnet с конкретным блоком (воспроизводимость)
anvil --fork-url $MAINNET_RPC --fork-block-number 19500000
# Форк с предопределёнными аккаунтами и балансами
anvil --fork-url $MAINNET_RPC --accounts 10 --balance 10000
Форк-тестирование — единственный способ проверить интеграцию с Uniswap, Aave, Chainlink без деплоя на testnet. Транзакция в локальном форке — мгновенно. На Sepolia — 12-15 секунд. Экономия времени на каждой итерации: вместо 15 секунд — 0.1 секунды. Используйте Ethereum testnets для знакомства с сетями.
Моки и фикстуры: изоляция без хрупкости
Для изоляции тестов используем иерархию фикстур:
// BaseFixture.sol — общие зависимости
abstract contract BaseFixture is Test {
MockERC20 token;
MockChainlinkOracle oracle;
function setUp() public virtual {
token = new MockERC20("Test", "TST", 18);
oracle = new MockChainlinkOracle(2000e8); // $2000 price
}
}
// ProtocolFixture.sol — деплой тестируемого протокола
contract ProtocolFixture is BaseFixture {
Protocol protocol;
function setUp() public override {
super.setUp();
protocol = new Protocol(address(token), address(oracle));
}
}
Не используем vm.mockCall для основных зависимостей — это хрупко и не проверяет интерфейс. Создаём полноценные mock-контракты с минимальной реализацией. Такой подход снижает число ложных срабатываний на 30%.
Пошаговая настройка и CI/CD
Подробная инструкция
- Установите Foundry:
curl -L https://foundry.paradigm.xyz | bash. - Создайте конфигурацию:
forge initи настройтеfoundry.tomlпод ваш проект. - Добавьте Hardhat:
npm install --save-dev hardhatи сгенерируйтеhardhat.config.ts. - Запустите локальный нод:
anvilв отдельном терминале. - Напишите первый тест: используйте шаблон из fixture выше.
- Настройте CI: добавьте GitHub Actions workflow (см. ниже).
CI/CD: автоматизация без сюрпризов
Конфигурация GitHub Actions для Foundry:
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
- name: Run unit tests
run: forge test --match-path "test/unit/*" -vvv
- name: Run integration tests
run: forge test --match-path "test/integration/*" --fork-url ${{ secrets.MAINNET_RPC }}
- name: Coverage check
run: forge coverage --min-line-coverage 80
Разделяем unit и integration тесты — unit-тесты должны работать без RPC-ключей. Интеграционные — только на PR в main. Это сокращает время фидбэка до 2 минут.
Testnet и объём работ
Поддержка нескольких сетей
Настраиваем multi-network конфиг в Hardhat:
networks: {
sepolia: {
url: process.env.SEPOLIA_RPC,
accounts: [process.env.DEPLOYER_KEY],
chainId: 11155111,
},
polygon_amoy: {
url: process.env.AMOY_RPC,
accounts: [process.env.DEPLOYER_KEY],
chainId: 80002,
},
}
| Testnet | Chain ID | Faucet | Block Time |
|---|---|---|---|
| Sepolia | 11155111 | Alchemy / Chainlink | 12 sec |
| Polygon Amoy | 80002 | Official Polygon | 2 sec |
| BNB Testnet | 97 | Binance Faucet | 3 sec |
Объём работ и сроки
Отметим: что входит в настройку:
- Конфигурация Foundry и Hardhat (
foundry.toml,hardhat.config.ts) - Набор mock-контрактов (ERC-20, Chainlink Oracle)
- Иерархия фикстур под ваш протокол
- Локальный EVM-нод (Anvil) с форк-режимом
- CI-пайплайн (GitHub Actions) с разделением unit/integration тестов
- Настройка testnet (Sepolia, Polygon Amoy, BNB Chain testnet)
- Документация по запуску и расширению
- Обучение команды (1-2 часа)
Сроки: базовая настройка — 1 рабочий день. С кастомными моками и фикстурами — 1-2 дня. Для проектов с несколькими чейнами (EVM + Solana) — 2-3 дня. Результат: сокращение времени на тестирование до 60%, выявление уязвимостей на ранних стадиях, стабильный CI. Ежемесячная экономия от такого подхода может достигать $10,000.
Заказ настройки тестовой среды
Свяжитесь с нами — мы проведём бесплатный аудит вашего текущего процесса и предложим конфигурацию под ваш протокол. Получите консультацию по оптимизации тестового окружения. Гарантируем: после настройки каждый коммит будет проходить проверку без сюрпризов. Закажите настройку сегодня — начните тестировать с уверенностью.







