我正在尝试为我拥有的智能合约编写测试。为了简单起见,下面是智能合约的样子:
注意:我硬编码了这个值,以便100%确定离开合约的值。
function withdraw(uint256 tokenId, address to, address owner) external returns (uint256 amount) {
amount = _positionManager.withdraw(tokenId, owner);
_wrapper.withdraw(amount);
//(bool success, ) = to.call{value: amount }("");
(bool success, ) = to.call{value: 100000000000000000 }("");
// failed transfer...
require(success, "3FM:FT");
emit Withdraw(to, amount);
}
我有一个测试,看起来像这样:
const provider = ethers.getDefaultProvider();
const oldBalance = await provider.getBalance(owner.address);
console.log('Old Balance:' + oldBalance);
await fundManager.withdraw(defaultTokenId, owner.address, owner.address);
const newBalance = await provider.getBalance(owner.address);
const expectedAmount = oldBalance.add(BigNumber.from("100000000000000000"));
console.log('New Balance:' + newBalance);
expect(newBalance).to.equal(expectedAmount);
当我查看控制台时,它显示新余额与旧余额相同。但是我的智能合约不会抛出
我有一种感觉,这与hardhat的工作方式有关,它只是忽略了值。我如何验证余额是否正确发送?
编辑:其他信息
我已经验证了我的硬帽配置不会静默失败,通过将成功变量替换为显式的false
这些是运行测试返回的日志:
老余额:276014338387200新的平衡:276014338387200
- 我有一种感觉,这一定是一个棘手的问题,因为无论我在同一账户的初始存款中赚了多少,我总是以相同的余额返回。
问题出在这行代码上:
const provider = ethers.getDefaultProvider();
默认的提供者不一定是你在测试中使用的提供者,相反,你需要像这样在醚上访问提供者:
ethers.provider.getBalance(owner.address);