UPDATED: May 23, 2022
We can use this quick way to do it. Read more here: https://ethereum-waffle.readthedocs.io/en/latest/matchers.html
expect(() => contract.connect(owner).withdrawAllETH()) .to.changeEtherBalance(owner, parseEther(10));
Let's say you are implementing the NFT selling contract. And the owner can withdraw the ETH to herself.
Something like this.
// solidity function withdrawAllETH() onlyOwner { uint256 balance = address(this).balance; Address.sendValue(payable(owner()), balance); }
What do we want to test? 🧑🔧
One of them is to check if the owner receive the ETH correctly! 🤑
Let's do it together! 🔥
Note: I am using Hardhat here as a sample of testing.
// javascript it('owner can withdraw all ETH', async () => { // let's say contract has 5 ETH, owner has 10 ETH // 1. let's do a withdrawal await contract.connect(owner).withdrawAllETH() // 2. Now owner should have 15 ETH, right? expect(await owner.getBalance()).to.eq(parseEther(15)) })
And when we run it.
❌ AssertionError: Expected "14999957824852287212" to be equal 15000000000000000000
What the bug!? 🐞🐞🐞
The test says the actual balance is 14.999.. ETH
not 15 ETH
. Well... I forgot to check about the gas spent. But how do we do it?
Thanks to our beloved StackOverflow thread (as always 😂), we got a solution.
Gas Spent = Gas Used x Effective Gas Price
And we can get the data from the transaction receipt!
Note: we can use
cumulativeGasUsed
instead ofgasUsed
if you want to get the gas spent from the whole block.
The Solution 🌟
Ok, now I know it, let's do this instead.
// 2nd attempt it('owner can withdraw all ETH', async () => { // let's say contract has 5 ETH, owner has 10 ETH // 1. let's do a withdrawal const tx = await contract.connect(owner).withdrawAllETH() // 2. Let's calculate the gas spent const receipt = await tx.wait() const gasSpent = receipt.gasUsed.mul(receipt.effectiveGasPrice) // 3. Now we know, it is 15 ETH minus by gasSpent! expect(await owner.getBalance()).to.eq(parseEther(15).sub(gasSpent)) })
And when we run it.
✔ owner can withdraw all ETH
Yey! And now it works! 🥳🥳🥳
Top comments (1)
informative concept you are sharing with us . i appreciate your work . its helpful for me . lal kitab remedies to control husband