Налаштування 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 для вашого проєкту. Зв'яжіться з нами — ми оцінимо завдання і запропонуємо оптимальне рішення.
Примітка: ціни на налаштування залежать від обсягу робіт і обговорюються індивідуально.







