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)
错误原因
- 合约地址未正确初始化:Hardhat Ethers v6中,
Dappazon.deploy()返回的合约对象需要等待部署交易上链确认后,才能获取有效地址。原代码未等待部署完成就直接访问dappazon.address,导致其值为undefined。 - 余额查询参数无效:由于
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
相关产品推荐
相关产品推荐

