I'm stuck on my last test for the NftMarketPlace unit tests. I want it to revert if the withdrawal is not successful. I have searched how to write tests for boolean values but I didn't find anything helpful.

The way I had thought of doing it, is having a player 3 who tries to withdraw the funds and since the nft doesn't belong to them then the transfer fails. See my test. This doesn't work as fails with a massive error

error (error is way too long - just pasting the first 3 lines)

 reverts if transfer fails:
     Error: invalid signer or provider (argument="signerOrProvider", value={"interface":{"fragments":[{"name":null,"type":"constructor","inputs":[],"payable":false,"stateMutability":"nonpayable","gas":null,"_isFragment":true},{"type":"error","name":"NftMarketplace__AlreadyListed","inputs":[{"name":"nftAddress","type":"address","indexed":null,"components":null,"arrayLength":null,"arrayChildren":null,"baseType":"address","_isParamType":true},{"name":"tokenId","type":"uint256","indexed":null,"components":null,"arrayLength":null,"arrayChildren":null,"baseType":"uint256","_isParamType":true}] .................................................(error is way too long)

.sol snipet

function withdrawProceeds() external {
        uint256 proceeds = s_proceeds[msg.sender];
        if (proceeds <= 0) {
            revert NftMarketplace__NoProceeds();
        s_proceeds[msg.sender] = 0; // setting state first to avoid any chance for RE-ENTRANCY ATTACK
        (bool success, ) = payable(msg.sender).call{value: proceeds}("");
        if (!success) {
            revert NftMarketplace__TransferFailed();

My test

it("reverts if transfer fails", async () => {
                player1 = accounts[2]
                await nftMarketplace.listItem(basicNft.address, TOKEN_ID, PRICE) // list the nft
                const playerConnectedNftMarketplace = nftMarketplace.connect(player) // connect player 1
                await playerConnectedNftMarketplace.buyItem(basicNft.address, TOKEN_ID, { // have player 1 buy the nft so deployer can have some proceeds. 
                    //This is to avoid reverting with NftMarketplace__NoProceeds()
                    // buys nft
                    value: PRICE,
                const proceeds = await nftMarketplace.getProceeds(deployer.address) // so there are proceeds at this point
                const player1NftMarketplace = nftMarketplace.connect(player1)
                nftMarketplace = await ethers.getContract("NftMarketplace", player1NftMarketplace)
                await expect(
                ).to.be.revertedWithCustomError(nftMarketplace, "NftMarketplace__TransferFailed")

Repo: https://github.com/kihiuFrank/hardhat-nft-marketplace



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.