You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 13:27:07