Отладка и тестирование Solidity: настройка Foundry, Hardhat, Anvil

Проблема: тесты падают, доверия нет Представьте: вы деплоите контракт в mainnet, но через час обнаруживаете reentrancy-уязвимость. Пользователи потеряли средства — репутация подорвана, аудит не помог. Каждый час простоя обходится в $5,000, а ущерб от reentrancy-атак превышает $100M. Или типичная

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1004
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Проблема: тесты падают, доверия нет

Представьте: вы деплоите контракт в 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

Подробная инструкция
  1. Установите Foundry: curl -L https://foundry.paradigm.xyz | bash.
  2. Создайте конфигурацию: forge init и настройте foundry.toml под ваш проект.
  3. Добавьте Hardhat: npm install --save-dev hardhat и сгенерируйте hardhat.config.ts.
  4. Запустите локальный нод: anvil в отдельном терминале.
  5. Напишите первый тест: используйте шаблон из fixture выше.
  6. Настройте 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.

Заказ настройки тестовой среды

Свяжитесь с нами — мы проведём бесплатный аудит вашего текущего процесса и предложим конфигурацию под ваш протокол. Получите консультацию по оптимизации тестового окружения. Гарантируем: после настройки каждый коммит будет проходить проверку без сюрпризов. Закажите настройку сегодня — начните тестировать с уверенностью.