Hardhat部署FundMe报错:未找到MockV3Aggregator部署实例
问题描述
执行部署命令 yarn hardhat deploy --tags fundme 部署FundMe项目时,触发MockV3Aggregator相关错误,完整报错信息如下:
Error: ERROR processing /Users/mohameduzair/blockChain/JSweb3_2/fundMe_hardhat/deploy/01-deploy-fundMe.js: Error: No deployment found for: MockV3Aggregator at Object.get (/Users/mohameduzair/blockChain/JSweb3_2/fundMe_hardhat/node_modules/hardhat-deploy/src/DeploymentsManager.ts:162:17)
现有相关代码
01-deploy-fundMe.js 部署脚本
module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, log } = deployments const { deployer } = await getNamedAccounts() const chainId = network.config.chainId let ethUsdPriceFeedAddress if (developmentChains.includes(network.name)) { // if (chainId === 31337) { const ethUsdAggregator = await deployments.get("MockV3Aggregator") ethUsdPriceFeedAddress = ethUsdAggregator.address } else { ethUsdPriceFeedAddress = networkConfig[chainId]["ethUsdPriceFeed"] } const fundMe = await deploy("FundMe", { from: deployer, args: [ethUsdPriceFeedAddress], log: true, }) log(`FundMe deployed at ${fundMe.address}`) log(`-------------------------!!!--------------------------`) } module.exports.tags = ["all", "fundme"]
MockV3Aggregator.sol 合约代码
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; // pragma solidity >=0.6.6 <0.8.7; import "@chainlink/contracts/src/v0.6/tests/MockV3Aggregator.sol";
错误原因
报错核心是:执行带fundme标签的部署命令时,Hardhat只会运行匹配fundme标签的部署脚本,不会自动执行Mock合约的部署逻辑,deployments.get("MockV3Aggregator")找不到已部署的MockV3Aggregator实例,直接抛出错误。
修复步骤
按以下顺序排查修复即可:
- 补全MockV3Aggregator的部署脚本,在
deploy目录下新建00-deploy-mocks.js(文件名前缀数字必须小于FundMe部署脚本的前缀,保证执行顺序在前),代码参考如下:
const { network } = require("hardhat") // 从配置文件引入常量,需要提前在helper-hardhat-config.js中定义 const { developmentChains, DECIMALS, INITIAL_PRICE } = require("../helper-hardhat-config") module.exports = async ({ getNamedAccounts, deployments }) => { const { deploy, log } = deployments const { deployer } = await getNamedAccounts() if (developmentChains.includes(network.name)) { log("Detected local development chain, deploying price feed mock...") await deploy("MockV3Aggregator", { from: deployer, args: [DECIMALS, INITIAL_PRICE], log: true }) log("Mock contract deployed completed") log("----------------------------------------") } } module.exports.tags = ["all", "mocks"]
配置文件中需要定义的常量参考:developmentChains = ["hardhat", "localhost"],DECIMALS = 8,INITIAL_PRICE = 200000000000(对应ETH初始价格2000USD)
- 检查01-deploy-fundMe.js顶部是否正确引入了
developmentChains和networkConfig变量,否则判断本地链的逻辑不会生效。 - 检查
hardhat.config.js中是否已经注册hardhat-deploy、@nomiclabs/hardhat-ethers依赖插件,缺失插件会导致部署功能异常。 - 部署时选择以下任意一种方式即可解决找不到Mock的问题:
- 先执行
yarn hardhat deploy --tags mocks完成Mock合约部署,再执行yarn hardhat deploy --tags fundme部署FundMe - 直接执行
yarn hardhat deploy,hardhat-deploy会按文件名顺序执行所有带all标签的脚本,先部署Mock再部署业务合约,不会出现依赖缺失问题。
- 先执行
内容的提问来源于stack exchange,提问作者uzair
相关产品推荐
相关产品推荐

