китаев.tech

Foundry — основные команды

Основные команды Foundry для создания проекта, компиляции, тестов, форматирования, локальной сети Anvil и деплоя через forge script.

Что входит в Foundry

Foundry — это набор CLI-инструментов для разработки смарт-контрактов. В отличие от Hardhat, тесты и deploy-скрипты здесь часто пишут на Solidity.

Основные инструменты: forge компилирует, тестирует и запускает скрипты, anvil поднимает локальную Ethereum-сеть, cast отправляет RPC-запросы из терминала.


Создаём проект

bash
forge init foundry-commands-demo
cd foundry-commands-demo

После инициализации структура будет такой:

text
foundry-commands-demo
  foundry.toml
  src
  test
  script
  lib

src хранит контракты, test — Solidity-тесты, script — deploy-скрипты, lib — зависимости вроде forge-std.


Пишем контракт

Замените содержимое src/Counter.sol:

solidity
// 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);
    }
}

Скомпилируйте проект:

bash
forge build

forge build читает foundry.toml, компилирует контракты из src и сохраняет ABI/bytecode в папку out.


Запускаем тесты

Замените содержимое test/Counter.t.sol:

solidity
// 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);
    }
}

Запустите:

bash
forge test

forge test компилирует проект, находит файлы *.t.sol и выполняет функции, которые начинаются с test.


Форматируем Solidity

bash
forge fmt

forge fmt форматирует контракты, тесты и скрипты по стилю Foundry.

Для проверки без изменения файлов используйте:

bash
forge fmt --check

Такую команду удобно запускать в CI: если формат нарушен, команда завершится с ошибкой.


Смотрим стоимость gas

bash
forge snapshot

forge snapshot запускает тесты и сохраняет gas-стоимость функций в файл .gas-snapshot.

После изменения контракта можно сравнить, стала ли функция дороже. Это особенно полезно для циклов, storage-записей и массовых операций.


Поднимаем локальную сеть

bash
anvil

anvil запускает локальный Ethereum RPC на http://127.0.0.1:8545. В терминале появятся тестовые аккаунты, приватные ключи и балансы.

Первый приватный ключ Anvil используется только для локальной разработки:

text
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

Не используйте этот ключ в mainnet, testnet или реальных проектах.


Деплоим через forge script

Замените содержимое script/Counter.s.sol:

solidity
// 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. Во втором выполните:

bash
forge script script/Counter.s.sol --broadcast --rpc-url http://127.0.0.1:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

Foundry отправит транзакцию в локальную сеть и выведет адрес контракта.


Как это работает

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.


Что дальше

Материалы китаev.tech публикуются в образовательных целях и не являются инвестиционной рекомендацией. Примеры кода и описания протоколов — для обучения; использование в продакшне на ваш собственный риск. Дисклеймер и политика конфиденциальности.