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

Hardhat测试智能合约时地址未定义部署失败求助

解决Dappazon智能合约测试中的合约地址undefined及余额查询错误

问题概述

在Windows平台测试Dappazon智能合约时,执行npx hardhat test后控制台多次输出Contract Address: undefined,且Buying模块的"Updates the contract balance"测试项抛出错误:

TypeError: unsupported addressable value (argument="target", value=null, code=INVALID_ARGUMENT, version=6.12.0)

错误原因

  1. 合约地址未正确初始化:Hardhat Ethers v6中,Dappazon.deploy()返回的合约对象需要等待部署交易上链确认后,才能获取有效地址。原代码未等待部署完成就直接访问dappazon.address,导致其值为undefined。
  2. 余额查询参数无效:由于dappazon.address为null/undefined,调用ethers.provider.getBalance()时传入了无效参数,触发类型校验错误。

解决步骤

1. 修正合约部署流程

在部署合约后,调用waitForDeployment()方法等待交易确认,同时使用getAddress()异步获取合约地址(Ethers v6中address属性已弃用):

//Deploy contract
const Dappazon = await ethers.getContractFactory("Dappazon")
dappazon = await Dappazon.deploy()
await dappazon.waitForDeployment() // 等待部署交易确认
console.log("Contract Address:", await dappazon.getAddress()); // 异步获取合约地址

2. 修复余额查询代码

将余额查询逻辑中的地址参数替换为getAddress()的返回值,确保传入有效地址:

it("Updates the contract balance", async () => {
    const contractAddress = await dappazon.getAddress()
    console.log("Contract Address:", contractAddress);
    const result = await ethers.provider.getBalance(contractAddress)
    console.log("Contract Balance:", result.toString());
    expect(result).to.equal(COST)
})

3. 统一适配Ethers v6 API

检查测试代码中所有Ethers相关调用,确保符合v6规范:

  • 替换所有dappazon.address为await dappazon.getAddress()
  • 确认ethers.getSigners()、ethers.getContractFactory等方法调用无版本兼容问题

修正后的核心代码片段

describe("Dappazon", () => {
    let dappazon
    let deployer, buyer

    beforeEach(async () => {
        [deployer, buyer] = await ethers.getSigners()

        const Dappazon = await ethers.getContractFactory("Dappazon")
        dappazon = await Dappazon.deploy()
        await dappazon.waitForDeployment()
        console.log("Contract Address:", await dappazon.getAddress());
    })

    // 其他测试用例保持不变

    describe("Buying", () => {
        // 其他测试用例保持不变

        it("Updates the contract balance", async () => {
            const contractAddress = await dappazon.getAddress()
            console.log("Contract Address:", contractAddress);
            const result = await ethers.provider.getBalance(contractAddress)
            console.log("Contract Balance:", result.toString());
            expect(result).to.equal(COST)
        })
    })
})

验证修复

重新执行npx hardhat test,控制台将输出有效的合约地址,且所有测试用例(包括"Updates the contract balance")能正常通过。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:47:09