Настройка Foundry для разработки смарт-контрактов
Мы интегрируем Foundry в ваш пайплайн разработки смарт-контрактов. В отличие от Hardhat, Rust-based Foundry даёт выигрыш в скорости до 50× на тестах, но требует грамотной настройки профилей и зависимостей. Без этого вы рискуете получить нестабильные билды или пропустить реентерабельность на этапе тестирования.
Жизнь блокчейн-разработчика — это бесконечные итерации: скомпилировали, запустили тесты, нашли баг, исправили, снова запустили. Foundry делает этот цикл в десятки раз быстрее, но чтобы раскрыть его потенциал, нужно правильно настроить конфигурацию. Мы поможем вам сделать это под ключ. За 5 лет работы мы настроили Foundry для 50+ проектов — от простых ERC-20 до сложных DeFi-протоколов на L2.
Почему Foundry быстрее Hardhat?
Foundry написан на Rust и компилирует Solidity через solc напрямую, без лишних промежуточных слоёв. Тесты выполняются в нативной среде, fuzzing работает из коробки. Результат — скорость компиляции и тестов в 10–50 раз выше на типичных DeFi-проектах. Как отмечено в документации Foundry, benchmark на проекте с 200 тестами показывает 3 секунды против 45 секунд у Hardhat.
Установка и базовая конфигурация
Команда foundryup устанавливает последнюю версию toolchain. Проект инициализируется через forge init my-project. Базовая структура:
my-project/ ├── foundry.toml ├── src/ ├── test/ ├── script/ └── lib/ Файл foundry.toml — сердце конфигурации. Мы настраиваем два профиля: быстрый для локальной разработки и более глубокий для CI.
| Параметр | [profile.default] | [profile.ci] |
|---|---|---|
| fuzz.runs | 1000 | 10000 |
| invariant.runs | 256 | 1000 |
| invariant.depth | 500 | 1000 |
Такой подход позволяет за минуты тестировать базовую логику локально и получать надёжные результаты на CI.
[profile.default] src = "src" out = "out" libs = ["lib"] solc = "0.8.24" optimizer = true optimizer_runs = 200 fuzz = { runs = 1000 } invariant = { runs = 256, depth = 500 } [profile.ci] fuzz = { runs = 10000 } invariant = { runs = 1000, depth = 1000 } Как настроить профиль CI в Foundry?
Профиль CI требует более агрессивного fuzzing и depth для invariant тестов. Настройте его отдельно в foundry.toml и запускайте через forge test --profile ci -vvv. В CI-пайплайне мы также включаем --gas-report и дополнительные проверки Slither.
Зависимости через forge install
Подключаем OpenZeppelin, forge-std и другие библиотеки.
forge install OpenZeppelin/openzeppelin-contracts forge install foundry-rs/forge-std После установки добавляем remappings:
remappings = [ "@openzeppelin/=lib/openzeppelin-contracts/", "forge-std/=lib/forge-std/src/", ] Зависимости хранятся как git submodules — это стандарт для Foundry, обеспечивающий воспроизводимость.
Совет: как избежать конфликтов remappings
Если несколько библиотек экспортируют одинаковые пути, используйте приоритет в foundry.toml: remappings обрабатываются в порядке объявления. Всегда проверяйте компиляцию после установки новой зависимости.
Как настроить форк-тестирование с Anvil?
Anvil — локальная нода с возможностью форка mainnet. Это ключевая фича для интеграционных тестов.
anvil --fork-url $MAINNET_RPC --fork-block-number 19000000 --chain-id 1 Вы получаете копию состояния mainnet на конкретном блоке без моков. Наш опыт показывает, что именно форк-тесты выявляют неочевидные ошибки, которые не ловятся юнит-тестами. В одном проекте invariant тест за 20 минут нашёл три логические ошибки, которые ускользали от ручных тестов: при цепочке deposit → withdraw → deposit totalSupply расходился на 1 wei из-за округления.
Fuzz и invariant тесты
Fuzzing работает автоматически — достаточно передать случайный параметр в тест.
function testFuzz_Deposit(uint256 amount) public { amount = bound(amount, 1, 1e27); token.mint(alice, amount); vm.prank(alice); vault.deposit(amount); assertEq(vault.balanceOf(alice), amount); } Invariant тесты проверяют, что системные инварианты сохраняются после любых последовательностей вызовов.
function invariant_TotalSupplyEqualsDeposits() public { assertEq(vault.totalSupply(), vault.totalDeposits()); } Интеграция с CI (GitHub Actions)
Мы настраиваем пайплайн, который запускает тесты с профилем CI на каждом коммите.
- name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 - name: Run tests run: forge test --profile ci -v env: FOUNDRY_ETH_RPC_URL: ${{ secrets.MAINNET_RPC }} Что входит в настройку
- Конфигурация foundry.toml с профилями default/ci
- Установка и ремаппинг зависимостей (OpenZeppelin, forge-std)
- Настройка Anvil с форком mainnet для интеграционных тестов
- Написание базовых fuzz и invariant тестов
- CI пайплайн с GitHub Actions (GitLab, CircleCI по запросу)
- Документация по используемым флагам и командам
Сроки
Настройка Foundry с зависимостями, профилями и CI — от 2 до 6 часов в зависимости от сложности проекта. Время включает написание шаблонных тестов и отладку форка. Стоимость рассчитывается индивидуально.
Почему выбирают нашу настройку?
Мы не просто копируем шаблонные конфиги — мы анализируем структуру вашего проекта, подбираем оптимальные параметры fuzzing и invariant, настраиваем gas-репортинг. Более 5 лет опыта в блокчейн-разработке и 50+ успешных проектов — это гарантия, что ваша конфигурация будет работать стабильно.
Получите консультацию по настройке Foundry для вашего проекта. Свяжитесь с нами — мы оценим задачи и предложим оптимальное решение.
Примечание: цены на настройку зависят от объёма работ и обсуждаются индивидуально.







