Foundry — основные команды
Основные команды Foundry для создания проекта, компиляции, тестов, форматирования, локальной сети Anvil и деплоя через forge script.
Что входит в Foundry
Foundry — это набор CLI-инструментов для разработки смарт-контрактов. В отличие от Hardhat, тесты и deploy-скрипты здесь часто пишут на Solidity.
Основные инструменты: forge компилирует, тестирует и запускает скрипты, anvil поднимает локальную Ethereum-сеть, cast отправляет RPC-запросы из терминала.
Создаём проект
forge init foundry-commands-demo
cd foundry-commands-demoПосле инициализации структура будет такой:
foundry-commands-demo
foundry.toml
src
test
script
libsrc хранит контракты, test — Solidity-тесты, script — deploy-скрипты, lib — зависимости вроде forge-std.
Пишем контракт
Замените содержимое src/Counter.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Counter {
uint256 public value;
event Incremented(uint256 newValue);
function increment() external {
value += 1;
emit Incremented(value);
}
}Скомпилируйте проект:
forge buildforge build читает foundry.toml, компилирует контракты из src и сохраняет ABI/bytecode в папку out.
Запускаем тесты
Замените содержимое test/Counter.t.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Test} from "forge-std/Test.sol";
import {Counter} from "../src/Counter.sol";
contract CounterTest is Test {
Counter private counter;
function setUp() public {
counter = new Counter();
}
function testIncrement() public {
counter.increment();
assertEq(counter.value(), 1);
}
}Запустите:
forge testforge test компилирует проект, находит файлы *.t.sol и выполняет функции, которые начинаются с test.
Форматируем Solidity
forge fmtforge fmt форматирует контракты, тесты и скрипты по стилю Foundry.
Для проверки без изменения файлов используйте:
forge fmt --checkТакую команду удобно запускать в CI: если формат нарушен, команда завершится с ошибкой.
Смотрим стоимость gas
forge snapshotforge snapshot запускает тесты и сохраняет gas-стоимость функций в файл .gas-snapshot.
После изменения контракта можно сравнить, стала ли функция дороже. Это особенно полезно для циклов, storage-записей и массовых операций.
Поднимаем локальную сеть
anvilanvil запускает локальный Ethereum RPC на http://127.0.0.1:8545. В терминале появятся тестовые аккаунты, приватные ключи и балансы.
Первый приватный ключ Anvil используется только для локальной разработки:
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80Не используйте этот ключ в mainnet, testnet или реальных проектах.
Деплоим через forge script
Замените содержимое script/Counter.s.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Script, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
contract CounterScript is Script {
function run() public {
vm.startBroadcast();
Counter counter = new Counter();
console.log(unicode"Адрес Counter:", address(counter));
vm.stopBroadcast();
}
}В первом терминале оставьте запущенным anvil. Во втором выполните:
forge script script/Counter.s.sol --broadcast --rpc-url http://127.0.0.1:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80Foundry отправит транзакцию в локальную сеть и выведет адрес контракта.
Как это работает
forge init — создаёт Foundry-проект с src, test, script и foundry.toml.
forge build — компилирует Solidity и создаёт артефакты в out.
forge test — запускает Solidity-тесты в локальной EVM.
forge fmt — форматирует Solidity-файлы.
forge snapshot — измеряет gas в тестах и сохраняет результат.
anvil — запускает локальный RPC-узел с тестовыми аккаунтами.
forge script --broadcast — выполняет Solidity-скрипт и реально отправляет транзакции в выбранную сеть.
Частые ошибки
Запустили forge script, но контракт не появился в Anvil → добавьте --broadcast. Без этого Foundry только симулирует выполнение.
Anvil не принимает транзакцию → проверьте, что anvil запущен, а --rpc-url равен http://127.0.0.1:8545.
Тест не запускается → файл должен лежать в test, заканчиваться на .t.sol, а функция должна начинаться с test.
Что дальше
- Hardhat — основные команды — сравнить workflow Hardhat и Foundry
- Первый контракт — написать и задеплоить — пройти deploy-сценарий на Hardhat
- Gas в Ethereum — понять, почему
forge snapshotпоказывает важные цифры