Настройка Foundry для разработки

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1 услугВсе 1306 услуг
Настройка Foundry для разработки
Простая
~2-3 часа
Часто задаваемые вопросы
Направления блокчейн-разработки
Этапы блокчейн-разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1221
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1163
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    855
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1056
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    828

Настройка Foundry для разработки

Foundry — это Rust-based toolchain для разработки смарт-контрактов: Forge (тесты и компиляция), Cast (взаимодействие с чейном), Anvil (локальная нода), Chisel (REPL для Solidity). По скорости компиляции и выполнения тестов опережает Hardhat в 10-50 раз на типичных проектах.

Установка и базовая конфигурация

curl -L https://foundry.paradigm.xyz | bash
foundryup  # установка/обновление до последней версии

Структура нового проекта (forge init my-project):

my-project/
├── foundry.toml       # основной конфиг
├── src/               # контракты
├── test/              # тесты (.t.sol)
├── script/            # деплой-скрипты (.s.sol)
└── lib/               # зависимости (git submodules)

foundry.toml — конфигурация компилятора и тестов:

[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc = "0.8.24"
optimizer = true
optimizer_runs = 200
via_ir = false        # включить для сложных контрактов с Stack too deep
fuzz = { runs = 1000 }
invariant = { runs = 256, depth = 500 }

[profile.ci]
fuzz = { runs = 10000 }
invariant = { runs = 1000, depth = 1000 }

Отдельный [profile.ci] позволяет запускать более тяжёлое fuzzing в CI без замедления локальной разработки.

Зависимости через forge install

forge install OpenZeppelin/openzeppelin-contracts
forge install foundry-rs/forge-std

Зависимости — git submodules в lib/. Ремаппинги в foundry.toml:

remappings = [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "forge-std/=lib/forge-std/src/",
]

Anvil — локальная нода

# Запуск с форком mainnet
anvil --fork-url $MAINNET_RPC --fork-block-number 19000000 --chain-id 1

# С предустановленными аккаунтами и балансами
anvil --accounts 10 --balance 1000

Fork mainnet — ключевая фича для тестирования интеграций. Контракт взаимодействует с реальными Uniswap, Aave, Chainlink — без моков, на реальном состоянии чейна на конкретном блоке.

Fuzz и invariant тесты

Foundry 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());
}

Именно invariant тест за 20 минут находит edge case, который ускользал от ручных тестов: при конкретной последовательности deposit → withdraw → deposit с конкретными суммами totalSupply расходился на 1 wei из-за rounding.

Интеграция с CI (GitHub Actions)

- 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 с зависимостями, конфигурацией профилей и CI интеграцией: 2-3 часа для стандартного проекта. Если нужна настройка fork-тестирования с конкретными протоколами и написание базовых invariant тестов — до одного дня.

Стоимость рассчитывается индивидуально.