在Goerli测试网通过Hardhat进行集成测试时无法设置合约状态变量
本地Hardhat Node测试正常,Goerli测试网设置合约状态变量失败
我在本地Hardhat Node上运行单元测试时,合约状态变量能正常设置,但在Goerli测试网执行相同测试时失败。
测试代码
const { getNamedAccounts, deployments, ethers, network } = require("hardhat") const { developmentChains, networkConfig } = require("../../helper-hardhat-config") const { assert, expect } = require("chai") const fs = require("fs") const path = require("path") developmentChains.includes(network.name) ? describe.skip : describe("Whoopy Staging Tests", function () { let whoopy, deployer, player, cloneAddress, clonedContract, txReceipt, tx, accountConnectedClone, manager, create const chainId = network.config.chainId beforeEach(async function () { accounts = await ethers.getSigners() deployer = accounts[0] player = accounts[1] await deployments.fixture(["all"]) const dir = path.resolve( __dirname, "/Users/boss/hardhat-smartcontract-whoopy/artifacts/contracts/Whoopy.sol/Whoopy.json" ) const file = fs.readFileSync(dir, "utf8") const json = JSON.parse(file) const abi = json.abi whoopy = await ethers.getContract("Whoopy", deployer) manager = await ethers.getContract("VRFv2SubscriptionManager", deployer) wf = await ethers.getContract("WhoopyFactory", deployer) tx = await (await wf.connect(player).createClone(player.address)) txReceipt = await tx.wait(1) cloneAddress = await txReceipt.events[1].args._instance clonedContract = new ethers.Contract(cloneAddress, abi, player) accountConnectedClone = clonedContract.connect(player) }) describe("Whoopy Tests", function () { beforeEach(async function () { create = await accountConnectedClone.createWhoopy( "Test", 1, { value: ethers.utils.parseUnits("10000000000000000", "wei"), gasLimit: 3000000 }) console.log(create) }) it("creates Whoopy correctly", async function () { const whoopyName = await accountConnectedClone.getWhoopyName() const num = await accountConnectedClone.getNum() expect(whoopyName).to.equal("Test") expect(num).to.equal(1) }) })
合约函数
function createWhoopy( //to be created only once string memory s_whoopyName, uint256 s_num, ) public payable restricted { whoopyName = s_whoopyName; num = s_num; }
报错信息
AssertionError: expected '' to equal 'Test' + expected - actual +Test
账户拥有足够测试ETH,Hardhat的Goerli配置正确,但测试始终失败,求指导。
排查与解决方向
等待交易上链确认
本地Hardhat Node是瞬时出块,但Goerli测试网需要等待区块打包。当前代码发送createWhoopy交易后直接读取状态,可能交易还未上链。修改代码添加等待逻辑:create = await accountConnectedClone.createWhoopy( "Test", 1, { value: ethers.utils.parseUnits("10000000000000000", "wei"), gasLimit: 3000000 }) await create.wait() // 新增该行,确保交易被区块确认校验
restricted修饰器权限
确认player地址在Goerli测试网的克隆合约中满足restricted修饰器的要求。如果修饰器内部使用return而非revert,交易不会报错但状态变量不会更新。检查修饰器逻辑,确保权限验证失败时会抛出异常。通过事件名称获取克隆地址
代码中依赖txReceipt.events[1]获取克隆地址,不同链上的事件索引可能因合约日志输出差异变化。改用事件名称过滤更可靠:const cloneEvent = txReceipt.events.find(evt => evt.event === "CloneCreated") // 替换为实际事件名 cloneAddress = cloneEvent.args._instance检查克隆合约初始化逻辑
确认WhoopyFactory的createClone函数正确初始化了克隆合约的权限状态,比如将restricted修饰器依赖的地址设置为player。本地测试可能因环境默认值满足条件,但测试网中初始化逻辑可能未正确执行。查看链上交易详情
在Goerli Etherscan搜索createWhoopy交易的哈希,检查交易状态、gas消耗、输入参数是否正确。若交易失败,Etherscan会显示具体失败原因,直接定位问题。
内容的提问来源于stack exchange,提问作者ethereumboy
相关产品推荐
相关产品推荐

