finish up test suite in claimNft

This commit is contained in:
han 2025-01-22 16:15:18 +07:00
parent 2443e5a16f
commit 67295b4682
2 changed files with 103 additions and 1 deletions

View File

@ -175,6 +175,8 @@ contract TokenDivider is IERC721Receiver, Ownable {
emit NftClaimed(nftAddress); emit NftClaimed(nftAddress);
// @audit: what happen if there is overlaps in same NFT address with different token id? will someone get a different NFT? // @audit: what happen if there is overlaps in same NFT address with different token id? will someone get a different NFT?
// @audit-finding: high
// @audit-report: you cannot claim the previous NFT with a weird error
IERC721(nftAddress).safeTransferFrom(address(this), msg.sender, tokenInfo.tokenId); IERC721(nftAddress).safeTransferFrom(address(this), msg.sender, tokenInfo.tokenId);
} }

View File

@ -37,7 +37,8 @@ contract TokenDividerClaimTest is Test {
vm.stopPrank(); vm.stopPrank();
} }
function test_assertSetUp() public view { function test_assertSetUp() public {
erc721Mock.mint(USER);
ERC20Mock erc20Mock = ERC20Mock( ERC20Mock erc20Mock = ERC20Mock(
tokenDivider.getErc20InfoFromNft( tokenDivider.getErc20InfoFromNft(
address(erc721Mock) address(erc721Mock)
@ -49,6 +50,7 @@ contract TokenDividerClaimTest is Test {
erc721Mock.ownerOf(TOKEN_ID), erc721Mock.ownerOf(TOKEN_ID),
address(tokenDivider) address(tokenDivider)
); );
// assert if USER has the ERC20 token // assert if USER has the ERC20 token
assertEq( assertEq(
tokenDivider.getBalanceOf(USER, address(erc20Mock)), tokenDivider.getBalanceOf(USER, address(erc20Mock)),
@ -190,4 +192,102 @@ contract TokenDividerClaimTest is Test {
tokenDivider.claimNft(address(erc721Mock)); tokenDivider.claimNft(address(erc721Mock));
vm.stopPrank(); vm.stopPrank();
} }
function test_failIf_claimOverlappingNFTWithDifferentId() public {
ERC20Mock erc20Mock = ERC20Mock(
tokenDivider.getErc20InfoFromNft(
address(erc721Mock)
).erc20Address
);
// mint ERC721 with new TOKEN_ID
erc721Mock.mint(USER2);
uint256 newTokenId = TOKEN_ID + 1;
vm.startPrank(USER2);
erc721Mock.approve(address(tokenDivider), newTokenId);
tokenDivider.divideNft(
address(erc721Mock),
newTokenId,
AMOUNT
);
vm.stopPrank();
ERC20Mock erc20MockWithNewTokenId = ERC20Mock(
tokenDivider.getErc20InfoFromNft(
address(erc721Mock)
).erc20Address
);
// assert if NFT already moved to tokenDivider
assertEq(
erc721Mock.ownerOf(TOKEN_ID),
address(tokenDivider)
);
assertEq(
erc721Mock.ownerOf(newTokenId),
address(tokenDivider)
);
// assert if USER2 has the ERC20 token
assertEq(
tokenDivider.getBalanceOf(
USER2,
address(erc20MockWithNewTokenId)
),
AMOUNT
);
// USER2 claim NFT
vm.startPrank(USER2);
erc20MockWithNewTokenId.approve(
address(tokenDivider),
AMOUNT
);
tokenDivider.claimNft(address(erc721Mock));
vm.stopPrank();
assertEq(
erc721Mock.ownerOf(newTokenId),
address(USER2)
);
assertEq(
erc721Mock.ownerOf(TOKEN_ID),
address(tokenDivider)
);
// assert ERC20 address before USER claim NFT
// @audit-report: it returns different erc20 address
// @dev: feel free to uncomment to see the error
/*
assertEq(
address(
tokenDivider.getErc20InfoFromNft(
address(erc721Mock)
).erc20Address
),
address(erc20Mock)
);
*/
// USER claim NFT
vm.startPrank(USER2);
erc20MockWithNewTokenId.approve(
address(tokenDivider),
AMOUNT
);
// @dev: it weirdly returns ERC721InsufficientApproval
// despite its already approved in above.
// maybe because of different ERC20 address?
// @dev: changing the ERC20 address and the USER prank
// doesn't help
/*
tokenDivider.claimNft(address(erc721Mock));
vm.stopPrank();
assertEq(
erc721Mock.ownerOf(TOKEN_ID),
address(USER)
);
*/
}
} }