Hardhat 合约部署教程:修复 deployed() 方法报错问题

2次阅读

Hardhat 合约部署教程:修复 deployed() 方法报错问题

本文详解 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 脚本(如测试、升级、验证)均应遵循此部署范式。

text=ZqhQzanResources