名称: web3-hardhat
描述: 用于 Solidity 开发的 Hardhat 工具链参考。适用于处理 hardhat.config.ts、ethers.js 测试、部署脚本或 Hardhat 插件。涵盖配置、测试、部署和常用插件。
Hardhat 工具链参考
核心命令
npx hardhat compile # 编译合约
npx hardhat test # 运行测试
npx hardhat test --grep "mint" # 过滤测试
npx hardhat node # 本地节点
npx hardhat run scripts/deploy.ts --network sepolia # 部署
npx hardhat verify --network mainnet ADDR arg1 arg2 # 验证
npx hardhat coverage # 测试覆盖率
npx hardhat clean # 清理构建产物
配置
hardhat.config.ts
import { HardhatUserConfig } from "hardhat/config"
import "@nomicfoundation/hardhat-toolbox" // ethers, chai, coverage, gas, typechain, verify
import "hardhat-deploy" // 可选:部署管理
const config: HardhatUserConfig = {
solidity: {
version: "0.8.28",
settings: {
optimizer: { enabled: true, runs: 200 },
viaIR: false,
},
},
networks: {
hardhat: {
forking: {
url: process.env.ETH_RPC_URL || "",
enabled: !!process.env.FORK,
},
},
mainnet: {
url: process.env.ETH_RPC_URL || "",
accounts: process.env.DEPLOYER_KEY ? [process.env.DEPLOYER_KEY] : [],
},
base: {
url: process.env.BASE_RPC_URL || "https://mainnet.base.org",
accounts: process.env.DEPLOYER_KEY ? [process.env.DEPLOYER_KEY] : [],
},
sepolia: {
url: process.env.SEPOLIA_RPC_URL || "",
accounts: process.env.DEPLOYER_KEY ? [process.env.DEPLOYER_KEY] : [],
},
},
etherscan: {
apiKey: {
mainnet: process.env.ETHERSCAN_API_KEY || "",
base: process.env.BASESCAN_API_KEY || "",
},
},
}
export default config
测试 (ethers.js + chai)
基础测试
import { expect } from "chai"
import { ethers } from "hardhat"
import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers"
describe("MyToken", function () {
async function deployFixture() {
const [owner, alice, bob] = await ethers.getSigners()
const Token = await ethers.getContractFactory("MyToken")
const token = await Token.deploy("MyToken", "MTK")
return { token, owner, alice, bob }
}
it("应该铸造代币", async function () {
const { token, alice } = await loadFixture(deployFixture)
await token.connect(alice).mint(100)
expect(await token.balanceOf(alice.address)).to.equal(100)
})
})
测试夹具 (loadFixture)
- 在测试之间创建快照并恢复 — 比重新部署快得多
- 对于部署,始终使用
loadFixture 而不是 beforeEach
时间操作
import { time } from "@nomicfoundation/hardhat-toolbox/network-helpers"
await time.increase(3600) // 前进1小时
await time.increaseTo(timestamp) // 设置到特定时间
await time.latest() // 获取当前区块时间戳
事件测试
await expect(token.transfer(alice.address, 100))
.to.emit(token, "Transfer")
.withArgs(owner.address, alice.address, 100)
回滚测试
await expect(token.connect(alice).adminMint(100))
.to.be.revertedWithCustomError(token, "OwnableUnauthorizedAccount")
.withArgs(alice.address)
部署
使用 Hardhat Ignition (推荐)
// ignition/modules/MyToken.ts
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"
export default buildModule("MyToken", (m) => {
const token = m.contract("MyToken", ["MyToken", "MTK"])
return { token }
})
npx hardhat ignition deploy ignition/modules/MyToken.ts --network sepolia
使用脚本
// scripts/deploy.ts
import { ethers } from "hardhat"
async function main() {
const Token = await ethers.getContractFactory("MyToken")
const token = await Token.deploy("MyToken", "MTK")
await token.waitForDeployment()
console.log("部署地址:", await token.getAddress())
}
main().catch(console.error)
常用插件
| 插件 |
用途 |
@nomicfoundation/hardhat-toolbox |
一体化工具包 (ethers, chai, coverage 等) |
@nomicfoundation/hardhat-verify |
合约验证 |
hardhat-deploy |
部署管理 |
hardhat-gas-reporter |
函数Gas消耗报告 |
@typechain/hardhat |
合约的 TypeScript 类型 |
solidity-coverage |
测试覆盖率 |
Hardhat 与 Foundry 对比
| 特性 |
Hardhat |
Foundry |
| 语言 |
TypeScript |
Solidity |
| 速度 |
较慢 |
快得多 |
| 生态系统 |
插件生态更丰富 |
正在发展 |
| 测试 |
JS/TS 测试 |
Solidity 测试 |
| 模糊测试 |
有限 |
内置 |
| 调试 |
console.log |
跟踪 + console.log |
| 最佳适用场景 |
JS/TS 团队,复杂部署 |
性能,Solidity原生开发 |
许多项目两者都用:Foundry 用于测试,Hardhat 用于部署/脚本。