add test suites for DivideNFT audited function
This commit is contained in:
@@ -32,8 +32,6 @@ contract TokenDiverTest is Test {
|
||||
}
|
||||
|
||||
function test_assertSetUp() public view {
|
||||
// then what?
|
||||
|
||||
// USER has the ERC721 NFT of TOKEN_ID
|
||||
assertTrue(address(erc721Mock.ownerOf(TOKEN_ID)) == address(USER));
|
||||
|
||||
@@ -41,44 +39,243 @@ contract TokenDiverTest is Test {
|
||||
assertTrue(address(erc721Mock.ownerOf(TOKEN_ID)) != address(USER2));
|
||||
}
|
||||
|
||||
/*
|
||||
function testDivideNft() public {
|
||||
|
||||
vm.startPrank(USER);
|
||||
function test_divideNftSuccessfully() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
tokenDivider.divideNft(address(erc721Mock), TOKEN_ID, AMOUNT);
|
||||
vm.stopPrank();
|
||||
ERC20Mock erc20Mock = ERC20Mock(tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address);
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
TOKEN_ID,
|
||||
AMOUNT
|
||||
);
|
||||
vm.stopPrank();
|
||||
|
||||
console.log("ERC20 Token name is: ", erc20Mock.name());
|
||||
console.log("ERC20 Token symbol is: ", erc20Mock.symbol());
|
||||
assertEq(tokenDivider.getErc20TotalMintedAmount(address(erc20Mock)), AMOUNT);
|
||||
assertEq(erc721Mock.ownerOf(TOKEN_ID), address(tokenDivider));
|
||||
assertEq(tokenDivider.getBalanceOf(USER, address(erc20Mock)), AMOUNT);
|
||||
ERC20Mock erc20Mock = ERC20Mock(
|
||||
tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address
|
||||
);
|
||||
|
||||
// assert if NFT already moved to tokenDivider
|
||||
assertEq(
|
||||
erc721Mock.ownerOf(TOKEN_ID),
|
||||
address(tokenDivider)
|
||||
);
|
||||
// assert if USER has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(USER, address(erc20Mock)),
|
||||
AMOUNT
|
||||
);
|
||||
}
|
||||
|
||||
function test_failIf_sendNFTDuringDivide() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
modifier nftDivided() {
|
||||
vm.startPrank(USER);
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
tokenDivider.divideNft(address(erc721Mock), TOKEN_ID, AMOUNT);
|
||||
vm.stopPrank();
|
||||
|
||||
_;
|
||||
|
||||
}
|
||||
|
||||
function testDivideNftFailsIsSenderIsNotNftOwner() public {
|
||||
vm.prank(USER);
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
vm.startPrank(USER2);
|
||||
vm.expectRevert(TokenDivider.TokenDivider__NotFromNftOwner.selector);
|
||||
tokenDivider.divideNft(address(erc721Mock), TOKEN_ID, AMOUNT);
|
||||
vm.stopPrank();
|
||||
// send the NFT to USER2
|
||||
erc721Mock.safeTransferFrom(
|
||||
address(USER),
|
||||
address(USER2),
|
||||
TOKEN_ID
|
||||
);
|
||||
|
||||
vm.expectRevert(
|
||||
TokenDivider.TokenDivider__NotFromNftOwner.selector
|
||||
);
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
TOKEN_ID,
|
||||
AMOUNT
|
||||
);
|
||||
|
||||
vm.stopPrank();
|
||||
}
|
||||
|
||||
function test_sendNFTBeforeDivide() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
// send the NFT to USER2
|
||||
erc721Mock.safeTransferFrom(
|
||||
address(USER),
|
||||
address(USER2),
|
||||
TOKEN_ID
|
||||
);
|
||||
|
||||
vm.stopPrank();
|
||||
|
||||
vm.startPrank(USER2);
|
||||
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
TOKEN_ID,
|
||||
AMOUNT
|
||||
);
|
||||
|
||||
vm.stopPrank();
|
||||
|
||||
ERC20Mock erc20Mock = ERC20Mock(
|
||||
tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address
|
||||
);
|
||||
|
||||
// assert if USER2 has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(USER2, address(erc20Mock)),
|
||||
AMOUNT
|
||||
);
|
||||
}
|
||||
|
||||
function test_failIf_nonExistenceNftTokenId() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
vm.expectRevert();
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
404,
|
||||
AMOUNT
|
||||
);
|
||||
vm.stopPrank();
|
||||
}
|
||||
|
||||
function test_failWhen_reMintTheDividedERC20Token() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
TOKEN_ID,
|
||||
AMOUNT
|
||||
);
|
||||
vm.stopPrank();
|
||||
|
||||
ERC20Mock erc20Mock = ERC20Mock(
|
||||
tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address
|
||||
);
|
||||
|
||||
// assert if USER has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(USER, address(erc20Mock)),
|
||||
AMOUNT
|
||||
);
|
||||
|
||||
vm.startPrank(USER2);
|
||||
erc20Mock.mint(address(USER2), AMOUNT);
|
||||
vm.stopPrank();
|
||||
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(
|
||||
USER,
|
||||
address(erc20Mock)
|
||||
),
|
||||
AMOUNT
|
||||
);
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(
|
||||
USER2,
|
||||
address(erc20Mock)
|
||||
),
|
||||
erc20Mock.balanceOf(address(USER2))
|
||||
);
|
||||
assertEq(
|
||||
erc20Mock.totalSupply(),
|
||||
AMOUNT
|
||||
);
|
||||
}
|
||||
|
||||
function test_divideSameNFTAddressWithDifferentTokenId() public {
|
||||
vm.startPrank(USER);
|
||||
|
||||
// approve the NFT to receive the NFT in USER
|
||||
erc721Mock.approve(address(tokenDivider), TOKEN_ID);
|
||||
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
TOKEN_ID,
|
||||
AMOUNT
|
||||
);
|
||||
vm.stopPrank();
|
||||
|
||||
ERC20Mock erc20Mock = ERC20Mock(
|
||||
tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address
|
||||
);
|
||||
|
||||
// assert if NFT already moved to tokenDivider
|
||||
assertEq(
|
||||
erc721Mock.ownerOf(TOKEN_ID),
|
||||
address(tokenDivider)
|
||||
);
|
||||
// assert if USER has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(USER, address(erc20Mock)),
|
||||
AMOUNT
|
||||
);
|
||||
|
||||
uint256 counterfeitTokenId = TOKEN_ID + 1;
|
||||
erc721Mock.mint(USER2);
|
||||
assertEq(
|
||||
erc721Mock.ownerOf(counterfeitTokenId),
|
||||
address(USER2)
|
||||
);
|
||||
|
||||
// USER2 divide the counterfeit
|
||||
vm.startPrank(USER2);
|
||||
|
||||
// approve the NFT to receive the NFT in USER2
|
||||
erc721Mock.approve(
|
||||
address(tokenDivider),
|
||||
counterfeitTokenId
|
||||
);
|
||||
|
||||
tokenDivider.divideNft(
|
||||
address(erc721Mock),
|
||||
counterfeitTokenId,
|
||||
AMOUNT
|
||||
);
|
||||
vm.stopPrank();
|
||||
|
||||
// now both of users (USER and USER2) has the same amount of registered ERC20 tokens despite it refer to different NFT Token Id
|
||||
|
||||
ERC20Mock erc20MockCounterfeit = ERC20Mock(
|
||||
tokenDivider.getErc20InfoFromNft(address(erc721Mock)).erc20Address
|
||||
);
|
||||
// assert if NFT already moved to tokenDivider
|
||||
|
||||
assertEq(
|
||||
erc721Mock.ownerOf(counterfeitTokenId),
|
||||
address(tokenDivider)
|
||||
);
|
||||
|
||||
// assert if previous NFT is still being hold by contract
|
||||
assertEq(
|
||||
erc721Mock.ownerOf(TOKEN_ID),
|
||||
address(tokenDivider)
|
||||
);
|
||||
|
||||
// assert if USER2 has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(
|
||||
USER2,
|
||||
address(erc20MockCounterfeit)
|
||||
),
|
||||
AMOUNT
|
||||
);
|
||||
// assert if USER has the ERC20 token
|
||||
assertEq(
|
||||
tokenDivider.getBalanceOf(
|
||||
USER,
|
||||
address(erc20MockCounterfeit)
|
||||
),
|
||||
AMOUNT
|
||||
);
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user