部署Hardhat项目遇TypeError:无法读取undefined的ethUsdPriceFeed属性
问题排查与解决
核心错误原因
错误Cannot read properties of undefined (reading 'ethUsdPriceFeed')指向两个关键问题:
- 出错的
01-deploy-fund-me.js文件未正确导入networkConfig,或该配置对象中没有当前网络chainId对应的ethUsdPriceFeed字段; - 当前部署的网络
chainId未在networkConfig中定义。
分步修复方案
1. 检查01-deploy-fund-me.js的导入语句
确保文件顶部已导入networkConfig:
const { networkConfig, developmentChains } = require("../helper-hardhat-config")
如果缺失这行,networkConfig会是undefined,自然无法读取ethUsdPriceFeed属性。
2. 验证helper-hardhat-config.js的配置完整性
打开helper-hardhat-config.js,确认networkConfig包含当前部署网络的chainId,且对应配置中存在ethUsdPriceFeed字段。示例配置:
const networkConfig = { 5: { // Goerli测试网chainId name: "goerli", ethUsdPriceFeed: "0xD4a33860578De61DBAbDc8BFdb98FD742fA7028e" }, 31337: { // 本地Hardhat网络chainId name: "localhost" // 本地网络用mock合约,无需真实喂价地址 } // 其他网络配置... }
3. 完善01-deploy-fund-me.js的部署逻辑
区分开发链与主网/测试网的喂价地址来源:
const { network, getNamedAccounts, deployments } = require("hardhat") const { networkConfig, developmentChains } = require("../helper-hardhat-config") module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, log, get } = deployments const { deployer } = await getNamedAccounts() const chainId = network.config.chainId let ethUsdPriceFeedAddress if (developmentChains.includes(network.name)) { // 开发链下获取已部署的Mock合约地址 const mockAggregator = await get("MockV3Aggregator") ethUsdPriceFeedAddress = mockAggregator.address } else { // 非开发链下使用networkConfig中的真实喂价地址 ethUsdPriceFeedAddress = networkConfig[chainId]["ethUsdPriceFeed"] } // 部署FundMe合约 await deploy("FundMe", { from: deployer, args: [ethUsdPriceFeedAddress], log: true, waitConfirmations: network.config.blockConfirmations || 1 }) } module.exports.tags = ["all", "fundme"]
4. 修复mock部署代码的语法错误
你提供的mock部署代码中,args参数应该用数组而非括号,否则会导致部署失败:
// 错误写法 args: (DECIMALS, INITIAL_ANSWER), // 正确写法 args: [DECIMALS, INITIAL_ANSWER],
验证步骤
- 先执行
npx hardhat deploy --tags mocks确保mock合约部署成功; - 再执行
npx hardhat deploy部署FundMe合约,确认错误消失。
内容的提问来源于stack exchange,提问作者ameymeow
相关产品推荐
相关产品推荐

