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

Hardhat部署Raffle合约报gaslane参数数据长度错误求助

问题描述

执行yarn hardhat deploy命令部署合约时抛出如下错误:

Error: incorrect data length (argument="gaslane", value={"type":"BigNumber","hex":"0x2386f26fc10000"}, code=INVALID_ARGUMENT, version=abi/5.6.4)

运行报错截图:
Hardhat部署报错截图

相关代码文件

部署脚本 01-deploy-raffle.js

const { network, ethers } = require("hardhat")
const { developmentChains, networkConfig } = require("../helper.hardhat-config")
const { verify } = require("../helper.hardhat-config")

const VRF_SUB_FUND_AMOUNT = ethers.utils.parseEther("30")

module.exports = async function ({ getNamedAccounts, deployments }) {
const { deploy, log } = deployments
const { deployer } = await getNamedAccounts()
const chainId = network.config.chainId
let vrfCoordinatorV2Address, subscriptionId

if (developmentChains.includes(network.name)) {
    const vrfCoordinatorV2Mock = await ethers.getContract("VRFCoordinatorV2Mock")
    vrfCoordinatorV2Address = vrfCoordinatorV2Mock.address
    const transactionResponse = await vrfCoordinatorV2Mock.createSubscription()
    const transactionReciept = await transactionResponse.wait(1)
    subscriptionId = transactionReciept.events[0].args.subId

    await vrfCoordinatorV2Mock.fundSubscription(subscriptionId, VRF_SUB_FUND_AMOUNT)
} else {
    vrfCoordinatorV2Address = networkConfig[chainId]["vrfCoordinatorV2"]
    subscriptionId = networkConfig[chainId]["subscriptionId"]
}

const callbackGasLimit = networkConfig[chainId]["callbackGasLimit"]
const entranceFee = networkConfig[chainId]["entranceFee"]
const interval = networkConfig[chainId]["interval"]
const gasLane = networkConfig[chainId]["gasLane"]

const args = [
    vrfCoordinatorV2Address,
    interval,
    entranceFee,
    gasLane,
    subscriptionId,
    callbackGasLimit,
]
const raffle = await deploy("Raffle", {
    from: deployer,
    args: args,
    log: true,
    waitConfirmations: network.config.blockConfirmations || 1,
})

if (!developmentChains.includes(network.name) && process.env.ETHERSCAN_API_KEY) {
    log("Verifying...")
    await verify(raffle.address, args)
}

log("----------------------------------------------------------------------------------")
}

module.exports.tags = ["all", "raffle"]

配置文件 helper.hardhat-config.js

const { ethers } = require("hardhat")

const networkConfig = {
4: {
    name: "rinkeby",
    subscriptionId: "6926",
    vrfCoordinatorV2: "0x6168499c0cFfCaCD319c818142124B7A15E857ab",
    entranceFee: ethers.utils.parseEther("0.01"),
    gasLane: "0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc",
    subscriptionId: "0",
    callBackGasLimit: "500000",
    interval: "30",
},
31337: {
    name: "hardhat",
    entranceFee: ethers.utils.parseEther("0.01"),
    gasLane: "0xd89b2bf150e3b9e13446986e571fb9cab24b13cea0a43ea20a6049a85cc807cc",
    callbackGasLimit: "500000",
    interval: "30",
},
}

const developmentChains = ["hardhat", "localhost"]
module.exports = {
networkConfig,
developmentChains,
}
排查思路
  • 从报错信息切入:错误明确提示gaslane参数收到了不符合格式要求的BigNumber值,该值的十六进制为0x2386f26fc10000,正好对应配置中entranceFee(0.01ETH)的解析结果,说明参数传递时出现错位,本该传入bytes32格式哈希的gasLane位置,被传入了入场费参数。
  • 核对参数顺序:对比Raffle合约构造函数定义的参数顺序,和部署脚本中传入的args数组顺序,确认是否存在位置不匹配的问题。
  • 核对配置键名:检查配置文件中各链的配置项,是否存在拼写错误、重复定义的问题,避免参数读取异常。
解决方案
  1. 调整部署脚本中args数组的顺序,和Raffle合约构造函数的参数顺序完全对齐,修正后的args数组如下:
const args = [
    vrfCoordinatorV2Address,
    gasLane, // 构造函数第二个参数为bytes32类型的gasLane(keyHash)
    interval, // 第三个参数为抽奖时间间隔
    entranceFee, // 第四个参数为入场费金额
    subscriptionId, // 第五个参数为Chainlink VRF订阅ID
    callbackGasLimit, // 第六个参数为VRF回调gas上限
]
  1. 修正配置文件helper.hardhat-config.js中的错误项:
    • 删除rinkeby(chainId=4)配置中重复定义的subscriptionId: "0"行,保留实际可用的订阅ID
    • 将rinkeby配置中拼写错误的callBackGasLimit(B大写)改为callbackGasLimit,和脚本读取的键名保持一致
      修正完成后重新执行yarn hardhat deploy即可完成部署。

内容的提问来源于stack exchange,提问作者randomideas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:51:34