mirror of
https://github.com/lens-protocol/core.git
synced 2026-04-22 03:02:03 -04:00
tests: Unit tests for FollowNFT added - some cases still missing
This commit is contained in:
@@ -55,7 +55,11 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
return targetFollowNFT;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - General - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotCallFollowIfNotTheHub(address sender) public {
|
||||
vm.assume(sender != address(hub));
|
||||
@@ -86,77 +90,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
});
|
||||
}
|
||||
|
||||
// Follow - General - Scenarios
|
||||
|
||||
function testUnwrappedTokenStillTiedToFollowerProfileAfterAFollowerProfileTransfer(
|
||||
address newFollowerProfileOwner
|
||||
) public {
|
||||
vm.assume(newFollowerProfileOwner != followerProfileOwner);
|
||||
vm.assume(newFollowerProfileOwner != address(0));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
uint256 assignedTokenId = followNFT.follow({
|
||||
followerProfileId: followerProfileId,
|
||||
executor: followerProfileOwner,
|
||||
followerProfileOwner: followerProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
followTokenId: MINT_NEW_TOKEN
|
||||
});
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
|
||||
assertEq(followerProfileIdSet, followerProfileId);
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
|
||||
|
||||
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
|
||||
|
||||
vm.prank(newFollowerProfileOwner);
|
||||
followNFT.untieAndWrap(assignedTokenId);
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), newFollowerProfileOwner);
|
||||
}
|
||||
|
||||
function testWrappedTokenStillHeldByPreviousFollowerOwnerAfterAFollowerProfileTransfer(
|
||||
address newFollowerProfileOwner
|
||||
) public {
|
||||
vm.assume(newFollowerProfileOwner != followerProfileOwner);
|
||||
vm.assume(newFollowerProfileOwner != address(0));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
uint256 assignedTokenId = followNFT.follow({
|
||||
followerProfileId: followerProfileId,
|
||||
executor: followerProfileOwner,
|
||||
followerProfileOwner: followerProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
followTokenId: MINT_NEW_TOKEN
|
||||
});
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
followNFT.untieAndWrap(assignedTokenId);
|
||||
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
|
||||
assertEq(followerProfileIdSet, followerProfileId);
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
|
||||
|
||||
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - Minting new token - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotFollowMintingNewTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
|
||||
address executor
|
||||
@@ -178,7 +114,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - Minting new token - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testNewMintedTokenIdIsLastAssignedPlusOne() public {
|
||||
vm.prank(address(hub));
|
||||
@@ -267,7 +205,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
followNFT.ownerOf(assignedTokenId);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - With unwrapped token - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotFollowWithUnwrappedTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
|
||||
address executor
|
||||
@@ -293,7 +233,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - With unwrapped token - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testFollowWithUnwrappedTokenWhenExecutorOwnsCurrentAndNewFollowerProfile() public {
|
||||
vm.prank(followerProfileOwner);
|
||||
@@ -448,7 +390,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
assertEq(followNFT.getFollowApproved(followTokenId), 0);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - With wrapped token - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotFollowWithWrappedTokenIfExecutorIsNotTheProfileOwnerOrHisApprovedExecutor(
|
||||
address executor
|
||||
@@ -475,7 +419,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - With wrapped token - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testFollowWithWrappedTokenWhenFollowerOwnerOwnsFollowTokenAndIsActingAsExecutor()
|
||||
public
|
||||
@@ -686,7 +632,9 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
assertEq(followNFT.getFollowApproved(followTokenId), 0);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Follow - Recovering token - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testFollowRecoveringToken() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
@@ -718,4 +666,419 @@ contract FollowNFTTest is BaseTest, ERC721Test {
|
||||
assertEq(followNFT.getFollowTokenId(alreadyFollowingProfileId), followTokenId);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Unfollow - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotCallUnfollowIfNotTheHub(address sender) public {
|
||||
vm.assume(sender != address(hub));
|
||||
vm.assume(sender != address(0));
|
||||
|
||||
vm.prank(sender);
|
||||
|
||||
vm.expectRevert(Errors.NotHub.selector);
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: alreadyFollowingProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
}
|
||||
|
||||
function testCannotUnfollowIfNotAlreadyFollowing() public {
|
||||
assertFalse(followNFT.isFollowing(followerProfileId));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
vm.expectRevert(IFollowNFT.NotFollowing.selector);
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: followerProfileId,
|
||||
executor: followerProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: followerProfileOwner
|
||||
});
|
||||
}
|
||||
|
||||
function testCannotUnfollowIfTokenIsWrappedAndExecutorIsNotApprovedOrUnfollowerOwnerOrTokenOwnerOrApprovedForAll(
|
||||
address executor
|
||||
) public {
|
||||
vm.assume(executor != alreadyFollowingProfileOwner);
|
||||
vm.assume(!hub.isDelegatedExecutorApproved(alreadyFollowingProfileOwner, executor));
|
||||
vm.assume(!followNFT.isApprovedForAll(alreadyFollowingProfileOwner, executor));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: executor,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
}
|
||||
|
||||
function testCannotUnfollowIfTokenIsUnwrappedAndExecutorIsNotApprovedOrUnfollowerOwner(
|
||||
address executor
|
||||
) public {
|
||||
vm.assume(executor != alreadyFollowingProfileOwner);
|
||||
vm.assume(!hub.isDelegatedExecutorApproved(alreadyFollowingProfileOwner, executor));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: executor,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Unfollow - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testUnfollowAsFollowerProfileOwnerWhenTokenIsWrapped() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: alreadyFollowingProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
|
||||
}
|
||||
|
||||
function testUnfollowAsApprovedDelegatedExecutorOfFollowerOwnerWhenTokenIsWrapped(
|
||||
address executorAsApprovedDelegatee
|
||||
) public {
|
||||
vm.assume(executorAsApprovedDelegatee != alreadyFollowingProfileOwner);
|
||||
vm.assume(executorAsApprovedDelegatee != address(0));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: executorAsApprovedDelegatee,
|
||||
isExecutorApproved: true,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
|
||||
}
|
||||
|
||||
function testUnfollowAsFollowTokenOwnerWhenTokenIsWrapped(address followTokenOwner) public {
|
||||
vm.assume(followTokenOwner != alreadyFollowingProfileOwner);
|
||||
vm.assume(followTokenOwner != address(0));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.transferFrom(alreadyFollowingProfileOwner, followTokenOwner, followTokenId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: followTokenOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
|
||||
}
|
||||
|
||||
function testUnfollowAsApprovedForAllByTokenOwnerWhenTokenIsWrapped(address approvedForAll)
|
||||
public
|
||||
{
|
||||
vm.assume(approvedForAll != alreadyFollowingProfileOwner);
|
||||
vm.assume(approvedForAll != address(0));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.setApprovalForAll(approvedForAll, true);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: approvedForAll,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), 0);
|
||||
}
|
||||
|
||||
function testUnfollowAsFollowerProfileOwnerWhenTokenIsUnwrapped() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: alreadyFollowingProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), alreadyFollowingProfileId);
|
||||
}
|
||||
|
||||
function testUnfollowAsApprovedDelegatedExecutorOfFollowerOwnerWhenTokenIsUnwrapped(
|
||||
address executorAsApprovedDelegatee
|
||||
) public {
|
||||
vm.assume(executorAsApprovedDelegatee != alreadyFollowingProfileOwner);
|
||||
vm.assume(executorAsApprovedDelegatee != address(0));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: executorAsApprovedDelegatee,
|
||||
isExecutorApproved: true,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
assertFalse(followNFT.isFollowing(alreadyFollowingProfileId));
|
||||
assertEq(followNFT.getFollowerProfileId(alreadyFollowingProfileId), 0);
|
||||
assertEq(followNFT.getProfileIdAllowedToRecover(followTokenId), alreadyFollowingProfileId);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Untie & Wrap - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotUntieAndWrapIfAlreadyWrapped() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
|
||||
vm.expectRevert(IFollowNFT.AlreadyUntiedAndWrapped.selector);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
}
|
||||
|
||||
function testCannotUntieAndWrapIfTokenDoesNotExist(uint256 unexistentTokenId) public {
|
||||
vm.assume(followNFT.getFollowerProfileId(unexistentTokenId) == 0);
|
||||
vm.assume(!followNFT.exists(unexistentTokenId));
|
||||
|
||||
vm.expectRevert(IFollowNFT.FollowTokenDoesNotExist.selector);
|
||||
followNFT.untieAndWrap(unexistentTokenId);
|
||||
}
|
||||
|
||||
function testCannotUntieAndWrapIfSenderIsNotFollowerOwner(address notFollowerOwner) public {
|
||||
vm.assume(notFollowerOwner != alreadyFollowingProfileOwner);
|
||||
vm.assume(notFollowerOwner != address(0));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(notFollowerOwner);
|
||||
|
||||
vm.expectRevert(IFollowNFT.DoesNotHavePermissions.selector);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Untie & Wrap - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testWrappedTokenOwnerIsFollowerProfileOwnerAfterUntyingAndWrapping() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
assertEq(followNFT.ownerOf(followTokenId), alreadyFollowingProfileOwner);
|
||||
}
|
||||
|
||||
function testWrappedTokenStillHeldByPreviousFollowerOwnerAfterAFollowerProfileTransfer(
|
||||
address newFollowerProfileOwner
|
||||
) public {
|
||||
vm.assume(newFollowerProfileOwner != followerProfileOwner);
|
||||
vm.assume(newFollowerProfileOwner != address(0));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
uint256 assignedTokenId = followNFT.follow({
|
||||
followerProfileId: followerProfileId,
|
||||
executor: followerProfileOwner,
|
||||
followerProfileOwner: followerProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
followTokenId: MINT_NEW_TOKEN
|
||||
});
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
followNFT.untieAndWrap(assignedTokenId);
|
||||
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
|
||||
assertEq(followerProfileIdSet, followerProfileId);
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
|
||||
|
||||
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), followerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Unwrap & Tie - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
function testCannotUnwrapAndTieIfTokenDoesNotHaveAFollowerSet() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.prank(address(hub));
|
||||
followNFT.unfollow({
|
||||
unfollowerProfileId: alreadyFollowingProfileId,
|
||||
executor: alreadyFollowingProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
unfollowerProfileOwner: alreadyFollowingProfileOwner
|
||||
});
|
||||
|
||||
vm.expectRevert(IFollowNFT.NotFollowing.selector);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.unwrapAndTie(alreadyFollowingProfileId);
|
||||
}
|
||||
|
||||
function testCannotUnwrapAndTieIfTokenIsAlreadyUnwrappedAndTied() public {
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.expectRevert(Errors.ERC721Time_OperatorQueryForNonexistantToken.selector);
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.unwrapAndTie(alreadyFollowingProfileId);
|
||||
}
|
||||
|
||||
function testCannotUnwrapAndTieIfSenderIsNotTokenOwnerOrApprovedOrApprovedForAll(address sender)
|
||||
public
|
||||
{
|
||||
// You can't approve a token that is not wrapped, so no need to check for `followNFT.getApproved(followTokenId)`
|
||||
vm.assume(sender != alreadyFollowingProfileOwner);
|
||||
vm.assume(sender != address(0));
|
||||
vm.assume(!followNFT.isApprovedForAll(alreadyFollowingProfileOwner, sender));
|
||||
|
||||
uint256 followTokenId = followNFT.getFollowTokenId(alreadyFollowingProfileId);
|
||||
|
||||
vm.prank(alreadyFollowingProfileOwner);
|
||||
followNFT.untieAndWrap(followTokenId);
|
||||
|
||||
vm.expectRevert(Errors.NotOwnerOrApproved.selector);
|
||||
vm.prank(sender);
|
||||
followNFT.unwrapAndTie(alreadyFollowingProfileId);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Unwrap & Tie - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
/****************[ Token owner can unwrap ]*/
|
||||
|
||||
/****************[ Approved for all can unwrap ]*/
|
||||
|
||||
/****************[ Approved (by approve()) can unwrap ]*/
|
||||
|
||||
/****************[ Unwrap and tie back from wrapped ]*/
|
||||
|
||||
/****************[ Owner reverts, balance is 0 ]*/
|
||||
|
||||
function testUnwrappedTokenStillTiedToFollowerProfileAfterAFollowerProfileTransfer(
|
||||
address newFollowerProfileOwner
|
||||
) public {
|
||||
vm.assume(newFollowerProfileOwner != followerProfileOwner);
|
||||
vm.assume(newFollowerProfileOwner != address(0));
|
||||
|
||||
vm.prank(address(hub));
|
||||
|
||||
uint256 assignedTokenId = followNFT.follow({
|
||||
followerProfileId: followerProfileId,
|
||||
executor: followerProfileOwner,
|
||||
followerProfileOwner: followerProfileOwner,
|
||||
isExecutorApproved: false,
|
||||
followTokenId: MINT_NEW_TOKEN
|
||||
});
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
uint256 followerProfileIdSet = followNFT.getFollowerProfileId(assignedTokenId);
|
||||
assertEq(followerProfileIdSet, followerProfileId);
|
||||
|
||||
vm.prank(followerProfileOwner);
|
||||
hub.transferFrom(followerProfileOwner, newFollowerProfileOwner, followerProfileId);
|
||||
|
||||
assertEq(hub.ownerOf(followerProfileId), newFollowerProfileOwner);
|
||||
|
||||
assertTrue(followNFT.isFollowing(followerProfileId));
|
||||
assertEq(followerProfileIdSet, followNFT.getFollowerProfileId(assignedTokenId));
|
||||
|
||||
vm.prank(newFollowerProfileOwner);
|
||||
followNFT.untieAndWrap(assignedTokenId);
|
||||
assertEq(followNFT.ownerOf(assignedTokenId), newFollowerProfileOwner);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Block - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Block - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Approve follow - Negatives
|
||||
//////////////////////////////////////////////////////////
|
||||
|
||||
//////////////////////////////////////////////////////////
|
||||
// Approve follow - Scenarios
|
||||
//////////////////////////////////////////////////////////
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user