finish up test suite in claimNft
This commit is contained in:
parent
2443e5a16f
commit
67295b4682
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user