Настройка 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 тестов — до одного дня.
Стоимость рассчитывается индивидуально.







