Настройка Hardhat для разработки
Hardhat без настройки — это просто компилятор Solidity с локальным узлом. Hardhat с правильной конфигурацией — это полноценная среда, где разработчик не тратит время на рутину: компиляция инкрементальная, тесты запускаются в параллель, деплой идемпотентен, CI/CD знает что делать без ручных инструкций.
Базовая конфигурация
Минимальный hardhat.config.ts для production-проекта:
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox"; // ethers, waffle, chai, gas reporter
import "@openzeppelin/hardhat-upgrades";
import "hardhat-deploy";
import "hardhat-contract-sizer";
const config: HardhatUserConfig = {
solidity: {
version: "0.8.24",
settings: {
optimizer: { enabled: true, runs: 200 },
viaIR: true, // снижает gas, нужен для сложных контрактов
},
},
networks: {
hardhat: {
forking: { url: process.env.ALCHEMY_MAINNET_URL! },
chainId: 1,
},
polygon: {
url: process.env.ALCHEMY_POLYGON_URL!,
accounts: [process.env.DEPLOYER_PRIVATE_KEY!],
gasPrice: "auto",
},
},
gasReporter: {
enabled: process.env.REPORT_GAS === "true",
currency: "USD",
coinmarketcap: process.env.CMC_API_KEY,
},
};
viaIR: true важен для контрактов, которые компилятор Solidity не может скомпилировать без него (Stack too deep). С IR-компилятором этой ошибки нет, но время компиляции растёт на 30-50%.
Плагины, которые реально нужны
hardhat-deploy — управление деплоями с поддержкой named accounts, fixtures, и тегирования. Деплойные скрипты хранят artifacts в deployments/ и идемпотентны: повторный запуск не деплоит уже задеплоенное. Незаменим при работе с несколькими сетями.
hardhat-contract-sizer — проверка размера контракта. EIP-170 ограничивает bytecode 24576 байтами. Получить это ограничение неожиданно на mainnet-деплое — неприятно. Плагин показывает размер после каждой компиляции.
@nomicfoundation/hardhat-toolbox — мета-плагин, который включает hardhat-ethers, hardhat-waffle, hardhat-chai-matchers, hardhat-network-helpers, hardhat-verify. Одна зависимость вместо шести.
@openzeppelin/hardhat-upgrades — если проект использует UUPS или Transparent Proxy. Плагин проверяет storage compatibility при апгрейде до деплоя: если новый контракт нарушает storage layout, вы узнаете об этом до того, как потеряете данные на mainnet.
Организация тестов и fixtures
Медленные тесты — это следствие неправильных fixtures. Паттерн loadFixture из hardhat-network-helpers позволяет снапшотить состояние сети после деплоя и откатываться к нему перед каждым тестом вместо повторного деплоя:
async function deployTokenFixture() {
const [owner, alice, bob] = await ethers.getSigners();
const Token = await ethers.getContractFactory("MyToken");
const token = await Token.deploy(ethers.parseEther("1000000"));
return { token, owner, alice, bob };
}
it("transfers tokens", async () => {
const { token, alice } = await loadFixture(deployTokenFixture);
// состояние всегда чистое, без повторного деплоя
});
На большом тест-сьюте (200+ тестов) разница между loadFixture и beforeEach с деплоем — 5 минут vs 30 секунд.
CI/CD интеграция
GitHub Actions для автоматического запуска тестов и верификации:
- name: Run tests
run: npx hardhat test --network hardhat
env:
ALCHEMY_MAINNET_URL: ${{ secrets.ALCHEMY_URL }}
- name: Verify contract
run: npx hardhat verify --network polygon ${{ steps.deploy.outputs.address }}
env:
POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_KEY }}
Верификация в CI требует, чтобы constructor arguments были детерминированы или сохранялись как артефакты деплоя. hardhat-deploy сохраняет аргументы в deployments/polygon/ContractName.json автоматически.
Настройка занимает 2-3 часа. Стоимость рассчитывается индивидуально.







