К основному содержанию
правило

hardhat — правило для Cursor: стандарты Hardhat 3

Правило для Cursor задаёт стандарты проекта на Hardhat 3: конфиг на TypeScript, тесты на Solidity и TypeScript, деплой через Ignition.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/hardhat.mdc
Открыть на GitHub

Что делает hardhat

Правило подключается к Cursor и подсказывает агенту, как вести Ethereum-проект на Hardhat 3. Оно требует перейти на третью версию: вторая для новой разработки не годится. Конфиг — только hardhat.config.ts, с закреплёнными версиями компилятора Solidity и включённым оптимизатором.

Структура проекта расписана по папкам: контракты и Solidity-тесты с расширением .t.sol лежат в contracts/, скрипты деплоя и интеграционные тесты — на TypeScript в scripts/ и test/. Смешивать JavaScript и TypeScript правило не разрешает. Для юнит-тестов на Solidity берётся forge-std и vm.expectRevert вместо префикса testFail; для сквозных сценариев — ethers.js через @nomicfoundation/hardhat-ethers и chai-matchers.

Деплой идёт через Hardhat Ignition: модуль описывает контракты декларативно, а не императивным скриптом. В конфиге есть ссылки на переменные окружения — SEPOLIA_RPC_URL, PRIVATE_KEY, ETHERSCAN_API_KEY, COINMARKETCAP_API_KEY. Без них соответствующие блоки просто не заработают, так что ключи стоит завести заранее. Учтите: Solidity-тесты в Hardhat совместимы с Foundry не полностью — инлайнового NatSpec и скриптовых читкодов вроде startBroadcast там нет.

Какие задачи решает

  • перевести проект с Hardhat 2 на Hardhat 3
  • разложить контракты, тесты и скрипты по папкам без смешивания JS и TS
  • написать юнит-тесты на Solidity с читкодами forge-std
  • описать деплой модулем Ignition вместо ручного скрипта
  • подключить gas reporter и solhint в конфиг

Примеры запросов агенту

  • Создай hardhat.config.ts для Hardhat 3 с закреплёнными версиями Solidity и оптимизатором
  • Разложи проект: контракты в contracts/, интеграционные тесты на TypeScript в test/
  • Опиши деплой контракта модулем Hardhat Ignition в ignition/modules/MyContract.ts

Как установить hardhat

Вручную: положить файлы

.cursor/rules/hardhat.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Вопросы о hardhat

Как установить правило hardhat в Cursor?

Скопируйте файл правила в .cursor/rules/hardhat.mdc в корне проекта. Cursor подхватит его автоматически.

Что делает правило hardhat?

Задаёт агенту стандарты проекта на Hardhat 3: конфиг на TypeScript, структуру папок, тесты на Solidity и TypeScript, деплой через Ignition.

Чем Solidity-тесты в Hardhat отличаются от Foundry?

Они совместимы с Foundry, но есть различия: нет инлайнового NatSpec и скриптовых читкодов вроде startBroadcast.

Исходный текст

hardhat.mdc · CC0-1.0
---
description: Ensure Hardhat projects follow modern best practices for configuration, testing, deployment, and security using TypeScript and Hardhat 3's Rust runtime.
globs: **/*.{js,jsx}
---
# hardhat Best Practices

Hardhat 3 is the definitive standard for Ethereum development. These rules enforce a modern, secure, and efficient workflow leveraging its Rust runtime, TypeScript support, and robust testing tools.

## 1. Adopt Hardhat 3 Immediately

Migrate all projects to Hardhat 3. Its Rust-powered runtime offers superior performance, instant stack traces, and enhanced debugging. Hardhat 2 is deprecated for new development.

## 2. Standardized Project Configuration (`hardhat.config.ts`)

Always use TypeScript for your Hardhat configuration. Pin Solidity compiler versions, enable Solidity test conventions, and activate essential plugins.

**✅ GOOD: `hardhat.config.ts`**

```typescript
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox"; // Includes Ethers, Chai, Verify, etc.
import "@nomicfoundation/hardhat-ignition";
import "hardhat-gas-reporter";
import "solidity-coverage";
import "@nomicfoundation/hardhat-solhint"; // For Solhint

const config: HardhatUserConfig = {
  solidity: {
    compilers: [
      { version: "0.8.20" }, // Pin specific, stable Solidity versions
      { version: "0.8.21" },
    ],
    settings: {
      optimizer: {
        enabled: true,
        runs: 200,
      },
    },
  },
  networks: {
    hardhat: {
      // Hardhat Network for local development and testing
      chainId: 31337,
    },
    // Example for a testnet:
    sepolia: {
      url: process.env.SEPOLIA_RPC_URL || "",
      accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
    },
  },
  paths: {
    sources: "./contracts",
    tests: "./test",
    cache: "./cache",
    artifacts: "./artifacts",
    // Enable Solidity test file convention (e.g., `contracts/MyContract.t.sol`)
    // This is the default, but explicitly setting it is good practice.
    // tests: { solidity: "./contracts" } // If you want .t.sol files in contracts/
  },
  gasReporter: {
    enabled: process.env.REPORT_GAS !== undefined,
    currency: "USD",
    coinmarketcap: process.env.COINMARKETCAP_API_KEY,
  },
  typechain: {
    outDir: "typechain-types",
    target: "ethers-v6", // Use ethers-v6 for modern projects
  },
  etherscan: {
    apiKey: process.env.ETHERSCAN_API_KEY,
  },
};

export default config;
```

## 3. Opinionated Code Organization

Maintain a clean, predictable project structure. Use TypeScript for all non-Solidity code (scripts, tasks, tests).

**✅ GOOD: Project Structure**

```
.
├── contracts/
│   ├── MyContract.sol
│   └── MyContract.t.sol  // Solidity unit tests
├── scripts/
│   └── deploy.ts         // TypeScript deployment scripts
├── test/
│   └── MyContract.test.ts // TypeScript integration tests
├── hardhat.config.ts
├── package.json
├── tsconfig.json
└── README.md
```

**❌ BAD: Mixing JavaScript and TypeScript, inconsistent test locations**

```
.
├── contracts/
│   └── MyContract.sol
├── scripts/
│   └── deploy.js         // JavaScript deployment script
├── test/
│   ├── MyContract.test.js // JavaScript tests
│   └── MyContract.sol.js  // Solidity tests in JS? No.
├── hardhat.config.js     // JavaScript config
└── ...
```

## 4. Comprehensive Testing Strategy

Combine fast Solidity unit tests for core logic with expressive TypeScript integration tests for full system validation.

-   **Solidity Unit Tests (`.t.sol`)**: For fast, isolated checks of contract logic.
    -   Place these directly in `contracts/` with a `.t.sol` extension.
    -   Avoid `testFail` prefix; use `vm.expectRevert` for clarity.
    -   Hardhat's Solidity tests are Foundry-compatible but have differences (no inline NatSpec, no scripting cheatcodes like `startBroadcast`).
-   **TypeScript Integration Tests (`.test.ts`)**: For end-to-end scenarios, contract interactions, and network state changes.
    -   Use `ethers.js` (via `@nomicfoundation/hardhat-ethers`) and `chai-matchers`.
    -   Leverage Hardhat Network Helpers for advanced scenarios.

**✅ GOOD: Solidity Unit Test (`contracts/MyContract.t.sol`)**

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "forge-std/Test.sol"; // Use forge-std for cheatcodes

contract MyContractTest is Test {
    MyContract public myContract;

    function setUp() public {
        myContract = new MyContract();
    }

    function test_InitialGreeting() public {
        assertEq(myContract.greeting(), "Hello, Hardhat!");
    }

    function test_SetGreeting() public {
        myContract.setGreeting("Hola!");
        assertEq(myContract.greeting(), "Hola!");
    }

    function testRevert_SetGreetingEmpty() public {
        vm.expectRevert("Greeting cannot be empty");
        myContract.setGreeting("");
    }
}

contract MyContract {
    string public greeting;

    constructor() {
        greeting = "Hello, Hardhat!";
    }

    function setGreeting(string memory _greeting) public {
        require(bytes(_greeting).length > 0, "Greeting cannot be empty");
        greeting = _greeting;
    }
}
```

**✅ GOOD: TypeScript Integration Test (`test/MyContract.test.ts`)**

```typescript
import { expect } from "chai";
import { ethers } from "hardhat";
import { MyContract } from "../typechain-types"; // Typechain for type safety

describe("MyContract (Integration)", function () {
  let myContract: MyContract;

  beforeEach(async function () {
    const MyContractFactory = await ethers.getContractFactory("MyContract");
    myContract = await MyContractFactory.deploy();
    await myContract.waitForDeployment();
  });

  it("should return the initial greeting", async function () {
    expect(await myContract.greeting()).to.equal("Hello, Hardhat!");
  });

  it("should allow setting a new greeting", async function () {
    const newGreeting = "Bonjour!";
    await myContract.setGreeting(newGreeting);
    expect(await myContract.greeting()).to.equal(newGreeting);
  });

  it("should revert if setting an empty greeting", async function () {
    await expect(myContract.setGreeting("")).to.be.revertedWith("Greeting cannot be empty");
  });
});
```

## 5. Secure Deployment with Hardhat Ignition

Use Hardhat Ignition for declarative, reliable, and secure deployments. It handles complex dependencies and ensures atomic deployments.

**✅ GOOD: Ignition Deployment (`ignition/modules/MyContract.ts`)**

```typescript
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";

const MyContractModule = buildModule("MyContractModule", (m) => {
  const myContract = m.contract("MyContract");
  return { myContract };
});

export default MyContractModule;
```

**❌ BAD: Manual, imperative deployment scripts prone to errors**

```typescript
// scripts/deploy.ts (without Ignition)
import { ethers } from "hardhat";

async function main() {
  const MyContract = await ethers.getContractFactory("MyContract");
  const myContract = await MyContract.deploy();
  await myContract.waitForDeployment();
  console.log(`MyContract deployed to ${myContract.target}`);
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
```

## 6. Smart Contract Security Fundamentals

Adhere to core security principles throughout the development lifecycle.

-   **Documentation**: Use Natspec for all Solidity contracts and functions.
-   **Minimal On-chain Logic**: Pre-process data off-chain to keep on-chain verification simple.
-   **Upgradeability**: Make a deliberate choice (e.g., UUPS proxy, contract migration). Document the procedure rigorously.
-   **Core Principles**: Apply "Defense in Depth," "Least Privilege," and "Secure Defaults."
-   **Multi-chain Simulation**: Test on target L2s (Optimism OP Stack, Base) to validate behavior before mainnet deployment.

## 7. Avoid Common Hardhat Solidity Test Pitfalls

Hardhat's Solidity testing framework is powerful but has specific conventions.

-   **`testFail` Anti-pattern**: Do not use `testFail` as a prefix. It's less explicit and not supported by default.
    **❌ BAD**
    ```solidity
    function testFail_SetGreetingEmpty() public {
        myContract.setGreeting(""); // Hardhat won't treat this as a passing test on revert
    }
    ```
    **✅ GOOD**
    ```solidity
    function testRevert_SetGreetingEmpty() public {
        vm.expectRevert("Greeting cannot be empty");
        myContract.setGreeting("");
    }
    ```
-   **Foundry Differences**: Hardhat does not support:
    -   Inline configuration via NatSpec.
    -   Scripting cheatcodes (`startBroadcast`, `stopBroadcast`).
    -   Foundry's `fixture` cheatcodes (rely on programmatic setup in `setUp`).
    -   `getCode` and `getDeployedCode` cheatcodes.

## 8. Performance and Maintainability

-   **TypeScript Everywhere**: Use TypeScript for all Hardhat scripts, tasks, and tests for static type safety, better IDE support, and fewer runtime errors.
-   **CI Integration**: Integrate your test suite into CI pipelines to automatically vet every pull request.
-   **Gas Reporting & Coverage**: Always enable `hardhat-gas-reporter` and `solidity-coverage` to monitor contract efficiency and test thoroughness.

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Похожие правила IDE

Все правила IDE по теме «Языки программирования» →
solidity-hardhat-cursorrules-prompt-file PatrickJS Правило для Cursor, которое настраивает ИИ-ассистента на разработку смарт-контрактов на Solidity с проверками безопасности и работой через Hardhat. ★ 41 011звёзд репо ethereum Mindrally Задаёт агенту правила разработки смарт-контрактов Ethereum: паттерны безопасности, интеграция OpenZeppelin, тесты на Hardhat. CX Codex +1 737установок solidity-security Seth Hobson Скилл помогает писать и проверять Solidity-контракты с учётом типовых уязвимостей. Пригодится для аудита, DeFi и подготовки к профессиональной проверке. CX Codex 15 382установок web3-testing Seth Hobson Скилл помогает тестировать Solidity-контракты через Hardhat и Foundry: от модульных проверок до форка mainnet. Подойдёт для тестовых наборов и DeFi-протоколов. CX Codex 10 800установок solidity Mindrally Скилл для написания и ревью Solidity-контрактов: паттерны защиты от reentrancy, оптимизация gas, тесты и связка с React-фронтендом. CX Codex +1 721установок x-ray pashov Собирает папку x-ray/ с отчётом о готовности протокола к аудиту: обзор, модель угроз, инварианты, анализ тестов и история разработки. CX Codex +1 324установок

Из того же набора69

junit Правило для Cursor задаёт стиль юнит-тестов на JUnit 5 в Java-проектах: имена, структура, параметризация. Пригодится, когда тесты пишет агент и хочется единый вид. ★ 3 579звёзд репо jest Правило задаёт команде единый стиль тестов на Jest: конфиг, изоляция, моки и асинхронные проверки. Пригодится, если тесты в проекте пишут несколько человек. ★ 3 579звёзд репо java Правило задаёт агенту стиль кода Java: Google Java Style, именование, иммутабельность, Stream API и работа с ресурсами. ★ 3 579звёзд репо httpx Правило для Cursor задаёт, как работать с httpx в Python: переиспользовать клиент, включать HTTP/2, настраивать таймауты. Пригодится, если агент пишет сетевой код. ★ 3 579звёзд репо grafana Правило задаёт команде единый стиль работы с дашбордами, алертами и источниками данных Grafana в виде кода: структура, визуальные стандарты, оптимизация запросов. ★ 3 579звёзд репо godot Правило для Cursor задаёт агенту стиль разработки на Godot 4.x: композиция сцен вместо наследования, сигналы вместо прямых вызовов, аккуратная работа с ресурсами. ★ 3 579звёзд репо github-actions Правило для Cursor задаёт жёсткие требования к workflow GitHub Actions: переиспользуемые сборки, кэш зависимостей, минимум прав у токена. ★ 3 579звёзд репо gcp Правило для Cursor задаёт, как писать, разворачивать и сопровождать приложения на Google Cloud: IaC, идемпотентность, права сервисных аккаунтов. ★ 3 579звёзд репо

Спонсоры проекта

Компании, которые помогают держать аналитику открытой