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)
运行报错截图:
相关代码文件
部署脚本 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数组顺序,确认是否存在位置不匹配的问题。
- 核对配置键名:检查配置文件中各链的配置项,是否存在拼写错误、重复定义的问题,避免参数读取异常。
解决方案
- 调整部署脚本中args数组的顺序,和Raffle合约构造函数的参数顺序完全对齐,修正后的args数组如下:
const args = [ vrfCoordinatorV2Address, gasLane, // 构造函数第二个参数为bytes32类型的gasLane(keyHash) interval, // 第三个参数为抽奖时间间隔 entranceFee, // 第四个参数为入场费金额 subscriptionId, // 第五个参数为Chainlink VRF订阅ID callbackGasLimit, // 第六个参数为VRF回调gas上限 ]
- 修正配置文件
helper.hardhat-config.js中的错误项:- 删除rinkeby(chainId=4)配置中重复定义的
subscriptionId: "0"行,保留实际可用的订阅ID - 将rinkeby配置中拼写错误的
callBackGasLimit(B大写)改为callbackGasLimit,和脚本读取的键名保持一致
修正完成后重新执行yarn hardhat deploy即可完成部署。
- 删除rinkeby(chainId=4)配置中重复定义的
内容的提问来源于stack exchange,提问作者randomideas
相关产品推荐
相关产品推荐

