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

如何在Waffle测试中设置并读取指定合约/钱包地址的余额?

Waffle测试原生代币余额设置与读取解决方案

问题原因说明

你遇到的返回0不符合预期的问题,通常是余额设置时机错误、地址参数传错、异步操作未等待、查询逻辑有误四类原因导致,可按以下步骤操作正确设置和读取余额:


1. 正确配置初始余额

只有Waffle的MockProvider支持主动修改地址余额,配置时注意区分配置对象是钱包还是合约:

  • 配置钱包地址初始余额
const { MockProvider } = require('@ethereum-waffle/provider');
const { utils } = require('ethers');

const provider = new MockProvider();
const [testWallet] = provider.getWallets();

// 给测试钱包设置10 ETH初始余额,单位为wei,必须加await等待操作完成
await provider.setBalance(testWallet.address, utils.parseEther('10'));
  • 配置合约地址初始余额

注意:必须在合约部署完成、拿到确定的合约地址后再执行余额设置,部署前设置无效

// 假设已完成合约部署得到实例myContract
await provider.setBalance(myContract.address, utils.parseEther('5'));

2. 正确读取余额

2.1 测试脚本直接读取(无需调用合约)

直接调用provider的getBalance方法即可拿到对应地址的原生代币余额:

// 读取钱包余额
const walletBalance = await provider.getBalance(testWallet.address);
// 读取合约余额
const contractBalance = await provider.getBalance(myContract.address);

2.2 调用合约方法读取余额的注意事项

如果你的测试逻辑依赖合约封装的余额查询方法,首先确认合约逻辑无误:

// 通用合约余额查询方法示例
// 查询指定地址余额
function getExternalBalance(address account) public view returns (uint256) {
    return account.balance;
}
// 查询合约自身余额
function getSelfBalance() public view returns (uint256) {
    return address(this).balance;
}
  • 调用查询指定地址的方法时,确认传入的地址参数是你要查询的目标地址,不要误传零地址、部署者地址
  • 断言时注意单位匹配,余额返回值默认是wei单位,需要和同单位的预期值做对比:
// 正确断言示例
expect(await myContract.getExternalBalance(testWallet.address)).to.equal(utils.parseEther('10'));

3. 常见错误排查

  • 遗漏await关键字:setBalance是异步方法,未加await会导致设置还未生效就执行查询,返回旧余额0
  • 误用其他Provider:只有MockProvider支持setBalance方法,如果你使用的是Hardhat默认Provider、以太坊公共节点Provider,需要使用对应网络的余额设置方法(比如Hardhat的hardhat_setBalanceRPC调用)
  • 交易消耗gas未计算:如果设置余额后你发起了链上交易,需要扣除对应消耗的gas费用再做断言,否则会出现数值不匹配

内容的提问来源于stack exchange,提问作者a.t.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:21:03