
本文详解 Hardhat 2.x+ 版本中合约部署流程的变更,重点解决因 deployed() 方法被移除导致的 TypeError,并提供兼容 ethers.js v6 的正确部署写法。
本文详解 hardhat 2.x+ 版本中合约部署流程的变更,重点解决因 `deployed()` 方法被移除导致的 typeerror,并提供兼容 ethers.js v6 的正确部署写法。
在使用最新版 Hardhat(≥2.14.0)及配套工具链(如 @nomicfoundation/hardhat-toolbox)时,你可能会遇到如下典型错误:
TypeError: simpleStorage.deployed is not a function
at main (/scripts/deploy.js:11:25)该错误的根本原因在于:Hardhat 已正式弃用 contract.deployed() 方法。这一变更源于 Hardhat 团队对底层测试与部署逻辑的重构——自 @nomicfoundation/hardhat-ethers v3 起,合约部署返回的是一个 ContractDeployTransaction 类型的 Promise 对象(即 Contract 实例的部署交易),而不再自动挂载 .deployed() 方法。取而代之的是更语义清晰、行为更可控的 .waitForDeployment() 方法。
✅ 正确写法(适配 Hardhat v2.17.1 + ethers.js v6):
const { ethers } = require("hardhat");
async function main() {
const SimpleStorageFactory = await ethers.getContractFactory("SimpleStorage");
console.log("Deploying contract...");
const simpleStorage = await SimpleStorageFactory.deploy();
// ✅ 替换为 waitForDeployment() —— 等待交易确认并获取已部署合约实例
await simpleStorage.waitForDeployment();
console.log(`Deployed contract to: ${await simpleStorage.getAddress()}`);
}
main()
.then(() => process.exit(0))
.catch((error) => {
console.error("Deployment failed:", error);
process.exit(1);
});? 关键变更说明:
- simpleStorage.deployed() → ❌ 已移除,调用即报错
- await simpleStorage.waitForDeployment() → ✅ 必须调用,确保合约已成功上链并可交互
- simpleStorage.address → ⚠️ 已弃用(v6+ ethers 中 address 属性延迟初始化)
- await simpleStorage.getAddress() → ✅ 推荐方式,安全获取部署地址
? 补充提示:
- 若需等待特定区块确认数(例如 2 个区块),可传入选项:
await simpleStorage.waitForDeployment(2);
- 部署过程中可通过 simpleStorage.deploymentTransaction 查看原始交易哈希;
- 建议始终配合 try/catch 处理网络异常或 Gas 不足等失败场景;
- 运行前请确认 hardhat.config.js 中已正确配置网络(如 localhost 或 sepolia),并启动本地节点(npx hardhat node)或设置对应 RPC URL。
掌握这一变更不仅是解决报错的关键,更是构建健壮、可维护的智能合约自动化脚本的基础。后续所有 Hardhat 脚本(如测试、升级、验证)均应遵循此部署范式。










