Hardhat网络部署智能合约报错:TypeError: Cannot read properties of undefined (reading 'getContractFactory')求助
解决Hardhat部署合约时的TypeError: Cannot read properties of undefined (reading 'getContractFactory')
嘿,我刚踩过几乎一模一样的坑,给你拆解下问题根源和修复步骤:
首先,这个报错的核心是ethers对象没被正确初始化,导致调用getContractFactory时找不到它。另外你的代码里还有个异步操作的小问题,我一起给你修正:
问题1:异步操作未正确等待
你调用SimpleStorageFactory.deploy()的时候没加await,这会导致simpleStorage是个Promise对象,后续的deployed()调用肯定会出问题——不过这不是当前报错的直接原因,但必须一起修复。
问题2:ethers对象未被正确加载
最常见的原因是你直接用node命令运行部署脚本了,而不是通过Hardhat的CLI来执行。Hardhat的ethers模块依赖它的专属运行环境,直接用node运行的话这个环境没被初始化,ethers自然就是undefined。
修复后的完整代码
把你的部署脚本改成这样:
const { ethers } = require("hardhat"); async function main() { const SimpleStorageFactory = await ethers.getContractFactory("SimpleStorage"); console.log("Deploying...."); // 这里必须加await,deploy是异步方法 const simpleStorage = await SimpleStorageFactory.deploy(); // 等待合约完全部署完成 await simpleStorage.deployed(); console.log(`合约部署完成,地址是:${simpleStorage.address}`); } // 别忘了处理异步错误,避免脚本异常挂掉 main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); });
正确的运行方式
别用node scripts/你的部署文件名.js,改用Hardhat命令:
npx hardhat run scripts/你的部署文件名.js --network hardhat
如果省略--network hardhat,默认就是用Hardhat本地测试网,完全没问题。
额外排查点
如果还是报错,试试把导入语句改成这样,明确从Hardhat运行环境(hre)里获取ethers:
const hre = require("hardhat"); const ethers = hre.ethers;
有时候这种方式能解决版本兼容的小问题。另外确保你的项目根目录有hardhat.config.js,里面至少配置了solidity版本,比如:
module.exports = { solidity: "0.8.19", // 换成你合约实际使用的版本 };
内容的提问来源于stack exchange,提问作者Salem_
相关产品推荐
相关产品推荐

