Hardhat部署合约报错:Cannot read properties of undefined (reading 'JsonRpcProvider')
解决Hardhat任务中
Cannot read properties of undefined (reading 'JsonRpcProvider')错误 问题场景
运行自定义Hardhat部署ERC271A合约的任务时,触发以下错误:
TypeError: Cannot read properties of undefined (reading 'JsonRpcProvider') at Object.<anonymous> (/Users/iii/dev/impulse-sk/node_modules/@nomiclabs/hardhat-ethers/src/internal/ethers-provider-wrapper.ts:4:61) at Module._compile (node:internal/modules/cjs/loader:1256:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1310:10) at Module.load (node:internal/modules/cjs/loader:1119:32) at Function.Module._load (node:internal/modules/cjs/loader:960:12) at Module.require (node:internal/modules/cjs/loader:1143:19) at require (node:internal/modules/cjs/helpers:110:18) at Object.<anonymous> (/Users/iii/dev/impulse-sk/node_modules/@nomiclabs/hardhat-ethers/src/internal/provider-proxy.ts:7:1) at Module._compile (node:internal/modules/cjs/loader:1256:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
相关任务代码:
task("deploy-erc271a-contract", "Deploy ERC271A Mint NFT contract", async (taskArgs, hre) => { console.log("Task[deploy-erc271a-contract] getContractFactory for MyERC271A"); const nftERC271AFactory = await ethers.getContractFactory("MyERC271A"); // Start deployment, returning a promise that resolves to a contract object console.log("Task[deploy-erc271a-contract] Contract deploying... "); //Contract takes: name, symbol, delegates[], receivers[], amount[] const nftERC271AContract = await nftERC271AFactory.deploy(taskArgs.name, taskArgs.symbol); await nftERC271AContract.deployed(); console.log("Task[deploy-erc271a-contract] Contract deployed: " + nftERC271AContract.address) return(nftERC271AContract.address); });
解决方案
1. 修复插件与ethers版本兼容性
该错误核心原因是@nomiclabs/hardhat-ethers插件和ethers版本不兼容。执行以下命令安装兼容版本:
npm install --save-dev @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers@5
2. 通过hre对象获取ethers实例
避免直接使用全局ethers,改用Hardhat Runtime Environment(hre)提供的实例,确保环境初始化正确。修改后的任务代码:
task("deploy-erc271a-contract", "Deploy ERC271A Mint NFT contract", async (taskArgs, hre) => { console.log("Task[deploy-erc271a-contract] getContractFactory for MyERC271A"); // 通过hre获取ethers const nftERC271AFactory = await hre.ethers.getContractFactory("MyERC271A"); console.log("Task[deploy-erc271a-contract] Contract deploying... "); // 注意:合约构造函数需要5个参数,当前仅传入2个,需补全剩余参数避免部署失败 const nftERC271AContract = await nftERC271AFactory.deploy(taskArgs.name, taskArgs.symbol, [], [], []); await nftERC271AContract.deployed(); console.log("Task[deploy-erc271a-contract] Contract deployed: " + nftERC271AContract.address); return nftERC271AContract.address; });
3. 验证Hardhat配置
确保hardhat.config.js中正确引入插件:
require("@nomiclabs/hardhat-ethers"); module.exports = { solidity: "0.8.19", // 匹配你的合约Solidity版本 networks: { hardhat: {}, // 其他网络配置 }, };
4. 清理并重装依赖
若上述步骤无效,清理现有依赖后重新安装:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者Mikael
相关产品推荐
相关产品推荐

