はじめに
スマートコントラクトを書き始めたものの、「テストってどう書けばいいんだろう」「デプロイのたびに手作業でネットワークを切り替えるのが面倒」と感じたことはありませんか。JavaScriptでの単体テストは書けても、Solidityのロジックそのものを高速に検証したい、複数のチェーンを想定して開発したい、といった悩みは意外と根深いものです。
そんな課題を解決してくれるのが、Ethereum開発環境の定番として長年支持されてきたHardhatです。特に最新のHardhat 3では、Foundry互換のSolidityテストやマルチチェーン対応など、これまでの悩みを直接解消する機能が数多く追加されました。この記事では、Hardhatの基本的な使い方から、実践的なユースケースまでを紹介します。
Hardhatとは
Hardhatは、Nomic Foundationが開発するプロフェッショナル向けのEthereum開発環境です。コントラクトのコンパイル、テスト、デプロイ、デバッグといった一連の開発フローを、1つのツールチェーンでまとめて扱えるのが特徴です。
2025年にリリースされたHardhat 3では、内部アーキテクチャが大きく刷新され、Solidityによるテスト記述やマルチチェーンのシミュレーションなど、開発体験を底上げする機能が追加されています。
主な特徴
- Foundry互換のSolidityテスト - JavaScript/TypeScriptだけでなく、Solidityでも単体テスト・ファジングテストが書け、実行速度が非常に高速です
- マルチチェーンシミュレーション - Ethereum MainnetだけでなくOP Mainnetなど、異なるチェーンタイプのネットワークを同時にシミュレートできます
- 豊富なプラグインエコシステム - viem、ethers.js、Hardhat Ignitionなど公式・コミュニティ製のプラグインで機能を拡張できます
- 組み込みのコードカバレッジ -
--coverageオプションを付けるだけで、Solidity/TypeScriptどちらのテストでもカバレッジを計測できます - 宣言的な設定ファイル - プラグインの副作用に依存しない、見通しの良い設定管理が可能です
インストール
Hardhatは空のディレクトリで対話形式のセットアップを行うのが最も簡単な始め方です。
mkdir my-hardhat-project
cd my-hardhat-project
npx hardhat --init
npm/yarn/pnpmのどれを使っている場合でも、npx部分をそれぞれのランナーコマンドに置き換えるだけで動作します。
# npm
npm install --save-dev hardhat
# yarn
yarn add --dev hardhat
# pnpm
pnpm add --save-dev hardhat
--initコマンドを実行すると、TypeScriptプロジェクトの雛形作成や、サンプルコントラクト・テストの生成まで対話式で進めてくれます。
基本的な使い方
まずはシンプルなSolidityコントラクトを用意し、Solidityでテストを書いてみましょう。Hardhat 3ではFoundry互換のcheatcodeを使ったテストが標準でサポートされています。
// contracts/Counter.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
contract Counter {
uint public count;
function increment() public {
count += 1;
}
}
// contracts/Counter.t.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {Test} from "forge-std/Test.sol";
import {Counter} from "./Counter.sol";
contract CounterTest is Test {
Counter public counter;
function setUp() public {
counter = new Counter();
}
function test_Increment() public {
counter.increment();
assertEq(counter.count(), 1);
}
}
テストの実行はシンプルなコマンド1つです。
npx hardhat test solidity
TypeScriptで統合テストを書きたい場合は、viemまたはethers.jsのプラグインを使ってこれまで通りのフローも継続できます。
npm install --save-dev @nomicfoundation/hardhat-toolbox-viem
// test/Counter.ts
import { expect } from "chai";
import { network } from "hardhat";
describe("Counter", async function () {
const { viem } = await network.connect();
it("should increment the counter", async function () {
const counter = await viem.deployContract("Counter");
await counter.write.increment();
const count = await counter.read.count();
expect(count).to.equal(1n);
});
});
npx hardhat test
実践的なユースケース
実際のプロジェクトでは、複数のネットワーク設定を切り替えながら開発することが多くなります。Hardhat 3では設定ファイルで簡単にネットワークを追加でき、コマンドラインから接続先を選択できます。
// hardhat.config.ts
import type { HardhatUserConfig } from "hardhat/config";
import hardhatToolboxViem from "@nomicfoundation/hardhat-toolbox-viem";
const config: HardhatUserConfig = {
plugins: [hardhatToolboxViem],
solidity: "0.8.28",
networks: {
hardhatOp: {
type: "edr-simulated",
chainType: "op",
},
sepolia: {
type: "http",
chainType: "l1",
url: process.env.SEPOLIA_RPC_URL ?? "",
accounts: process.env.SEPOLIA_PRIVATE_KEY
? [process.env.SEPOLIA_PRIVATE_KEY]
: [],
},
},
};
export default config;
秘密鍵やRPC URLのような機密情報は、環境変数から読み込むConfiguration Variablesの仕組みを使うことで、設定ファイルに直接書かずに済みます。
デプロイには公式の宣言的デプロイシステム「Hardhat Ignition」を使うと、デプロイ手順そのものをコード資産として管理できます。
// ignition/modules/Counter.ts
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
export default buildModule("CounterModule", (m) => {
const counter = m.contract("Counter");
return { counter };
});
npx hardhat ignition deploy ignition/modules/Counter.ts --network sepolia
テストのカバレッジを確認したいときは、テストコマンドに--coverageを付けるだけです。
npx hardhat test --coverage
CI上でチェーンごとの互換性を担保したい、ガスコストを継続的に監視したい、といった要件にも、SolidityテストとTypeScriptテストを併用しながら柔軟に対応できます。
まとめ
Hardhatは、コンパイル・テスト・デプロイという開発フロー全体をカバーするEthereum開発環境として、多くのプロジェクトで採用されてきました。特にHardhat 3では、Foundry互換の高速なSolidityテストやマルチチェーンシミュレーションが加わったことで、「テストが遅い」「複数チェーンを想定した検証がしづらい」といった従来の悩みが大きく解消されています。
まずはnpx hardhat --initでサンプルプロジェクトを作り、SolidityテストとTypeScriptテストの両方を試してみることをおすすめします。既存のHardhat 2プロジェクトを持っている方は、公式の移行ガイドを参考にしながら段階的にアップグレードしてみてください。
