如何在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.
相关产品推荐
相关产品推荐

