运行Hardhat Deploy时VRFCoordinatorV2Mock未定义错误原因排查
问题:运行Hardhat Deploy时出现“VRFCoordinatorV2Mock is not defined”错误
我在运行Hardhat部署脚本时遇到了“VRFCoordinatorV2Mock is not defined”错误,该错误出现在其中一个部署脚本中。项目来自Chainlink教程,合约文件夹下的test目录已导入VRFCoordinatorV2Mock.sol合约及所有Chainlink合约,两个部署脚本如下:
第一个部署脚本:
const { network } = require("hardhat") module.exports = async function (hre) { const { getNamedAccounts, deployments } = hre const { deployer } = await getNamedAccounts() const { deploy, log } = deployments const chainId = network.config.chainId let vrfCoordinatorV2Address, subscriptionId const FUND_AMOUNT = "1000000000000000000" let tokenUris = [ "ipfs://QmaVkBn2tKmjbhphU7eyztbvSQU5EXDdqRyXZtRhSGgJGo", "ipfs://QmZYmH5iDbD6v3U2ixoVAjioSzvWJszDzYdbeCLquGSpVm", "ipfs://QmYQC5aGZu2PTH8XzbJrbDnvhj3gVs7ya33H9mqUNvST3d", ] // 测试网/主网环境下使用真实VRF节点,本地网络则部署Mock if (chainId == 31337) { // 部署本地Mock节点 const vrfCoordinatorV2Mock = await ethers.getContract("VRFCoordinatorV2Mock") vrfCoordinatorV2Address = VRFCoordinatorV2Mock.address const tx = await vrfCoordinatorV2Mock.createSubscription() const txReceipt = await tx.wait(1) subscriptionId = txReceipt.events[0].args.subscriptionId await vrfCoordinatorV2Mock.fundSubscription(subscriptionId, FUND_AMOUNT) } else { // 使用真实网络的VRF地址和订阅ID vrfCoordinatorV2Address = "0x6168499c0cFfCaCD319c818142124B7A15E857ab" subscriptionId = "8898" } args = [ vrfCoordinatorV2Address, "0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc", subscriptionId, "500000", tokenUris, ] const randomIpfsNft = await deploy("RandomIpfsNft", { from: deployer, args: args, log: true, }) console.log(randomIpfsNft.address) }
第二个部署脚本:
const BASE_FEE = "250000000000000000" // 0.25 LINK的手续费 const GAS_PRICE_LINK = 1e9 // 每gas消耗0.000000001 LINK module.exports = async function (hre) { const { getNamedAccounts, deployments } = hre const { deployer } = await getNamedAccounts() const { deploy, log } = deployments const chainId = network.config.chainId if (chainId == 31337) { await deploy("VRFCoordinatorV2Mock", { from: deployer, log: true, args: [BASE_FEE, GAS_PRICE_LINK], }) } } module.exports.tags = ["all", "mocks"]
解决方案
这个错误的核心是变量大小写不匹配和部署脚本执行顺序问题,具体修复步骤如下:
1. 修复变量大小写错误
在第一个脚本的chainId == 31337分支中,你用小写定义了vrfCoordinatorV2Mock变量,但后续调用地址时误写为大写的VRFCoordinatorV2Mock.address,JavaScript会将其识别为未定义的变量。
错误代码片段:
const vrfCoordinatorV2Mock = await ethers.getContract("VRFCoordinatorV2Mock") vrfCoordinatorV2Address = VRFCoordinatorV2Mock.address
修正为:
const vrfCoordinatorV2Mock = await ethers.getContract("VRFCoordinatorV2Mock") vrfCoordinatorV2Address = vrfCoordinatorV2Mock.address // 统一为小写变量名
2. 确保Mock合约优先部署
第二个脚本给Mock合约添加了["all", "mocks"]标签,但第一个脚本没有指定依赖标签,可能导致还未部署Mock就尝试获取合约。可以通过以下两种方式解决:
方法一:给第一个脚本添加标签
在第一个部署脚本末尾添加标签,让Hardhat按依赖顺序执行:
module.exports.tags = ["all", "randomipfsnft"]
之后运行npx hardhat deploy即可自动先部署mocks,再部署RandomIpfsNft。
方法二:运行部署时指定标签
执行部署命令时明确包含mocks标签:
npx hardhat deploy --tags all
或者:
npx hardhat deploy --tags mocks,randomipfsnft
3. 可选:添加调试日志
可以在第二个脚本中添加日志输出,确认Mock合约是否成功部署:
if (chainId == 31337) { const mockContract = await deploy("VRFCoordinatorV2Mock", { from: deployer, log: true, args: [BASE_FEE, GAS_PRICE_LINK], }) log(`Mock合约已部署,地址:${mockContract.address}`) }
内容的提问来源于stack exchange,提问作者Blockpain
相关产品推荐
相关产品推荐

