Налаштування 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 тестів — до одного дня.
Вартість розраховується індивідуально.







