diff --git a/test/NftReward.t.sol b/test/NftReward.t.sol index 262a3ae..3913a4a 100644 --- a/test/NftReward.t.sol +++ b/test/NftReward.t.sol @@ -655,4 +655,96 @@ contract NftRewardTest is Test { assertEq(nftReward.tokenIdCounter(), 1); assertEq(nftReward.tokenData(0, keccak256("GITHUB_ORGANIZATION_NAME")), "ubiquity"); } + + function testInvalidateNonce_ShouldInvalidateNonce() public { + // prepare arbitrary data keys + bytes32[] memory keys = new bytes32[](1); + keys[0] = keccak256("GITHUB_ORGANIZATION_NAME"); + // prepare arbitrary data values + string[] memory values = new string[](1); + values[0] = "ubiquity"; + // prepare mint request + NftReward.MintRequest memory mintRequest = NftReward.MintRequest({ + beneficiary: user1, + deadline: block.timestamp + 1, + keys: keys, + nonce: 1, + values: values + }); + // get mint request digest which should be signed + bytes32 digest = nftReward.getMintRequestDigest(mintRequest); + // minter signs mint request digest + (uint8 v, bytes32 r, bytes32 s) = vm.sign(minterPrivateKey, digest); + // get minter's signature + bytes memory signature = abi.encodePacked(r, s, v); + + uint tokenId = 0; + + // before + vm.expectRevert(); + nftReward.ownerOf(tokenId); + assertEq(nftReward.nonceRedeemed(1), false); + assertEq(nftReward.tokenDataKeyExists(keccak256("GITHUB_ORGANIZATION_NAME")), false); + + // owner invalidates + vm.prank(owner); + nftReward.invalidateNonce(1); + + // user try to mint + vm.prank(user1); + vm.expectRevert("Already minted"); + nftReward.safeMint(mintRequest, signature); + + // after + assertEq(nftReward.nonceRedeemed(1), true); + assertEq(nftReward.tokenIdCounter(), 0); + } + + function testRequireInvalidateNonce_ShouldRevert_IfNonceIsRedeemed() public { + // prepare arbitrary data keys + bytes32[] memory keys = new bytes32[](1); + keys[0] = keccak256("GITHUB_ORGANIZATION_NAME"); + // prepare arbitrary data values + string[] memory values = new string[](1); + values[0] = "ubiquity"; + // prepare mint request + NftReward.MintRequest memory mintRequest = NftReward.MintRequest({ + beneficiary: user1, + deadline: block.timestamp + 1, + keys: keys, + nonce: 1, + values: values + }); + // get mint request digest which should be signed + bytes32 digest = nftReward.getMintRequestDigest(mintRequest); + // minter signs mint request digest + (uint8 v, bytes32 r, bytes32 s) = vm.sign(minterPrivateKey, digest); + // get minter's signature + bytes memory signature = abi.encodePacked(r, s, v); + + uint tokenId = 0; + + // before + vm.expectRevert(); + nftReward.ownerOf(tokenId); + assertEq(nftReward.nonceRedeemed(1), false); + assertEq(nftReward.tokenDataKeyExists(keccak256("GITHUB_ORGANIZATION_NAME")), false); + + // user1 mints + vm.prank(user1); + nftReward.safeMint(mintRequest, signature); + + // owner try to invalidate + vm.prank(owner); + vm.expectRevert("Already minted"); + nftReward.invalidateNonce(1); + + // after + assertEq(nftReward.nonceRedeemed(1), true); + assertEq(nftReward.tokenDataKeys(0), keccak256("GITHUB_ORGANIZATION_NAME")); + assertEq(nftReward.tokenDataKeyExists(keccak256("GITHUB_ORGANIZATION_NAME")), true); + assertEq(nftReward.ownerOf(tokenId), user1); + assertEq(nftReward.tokenIdCounter(), 1); + assertEq(nftReward.tokenData(0, keccak256("GITHUB_ORGANIZATION_NAME")), "ubiquity"); + } }