diff --git a/packages/nfts/contracts/snaefell/SnaefellToken.sol b/packages/nfts/contracts/snaefell/SnaefellToken.sol index 616aa1050e9..89557f0ee1d 100644 --- a/packages/nfts/contracts/snaefell/SnaefellToken.sol +++ b/packages/nfts/contracts/snaefell/SnaefellToken.sol @@ -3,7 +3,6 @@ pragma solidity 0.8.24; import { ERC721EnumerableUpgradeable } from "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721EnumerableUpgradeable.sol"; - import { MerkleWhitelist } from "./MerkleWhitelist.sol"; /// @title TaikoonToken @@ -21,6 +20,7 @@ contract SnaefellToken is ERC721EnumerableUpgradeable, MerkleWhitelist { error MAX_SUPPLY_REACHED(); error MINTER_NOT_WHITELISTED(); error TOKEN_NOT_MINTED(); + error TOKEN_CANNOT_BE_TRANSFERRED(); /// @notice Contract initializer /// @param _rootURI Base URI for the token metadata @@ -100,4 +100,24 @@ contract SnaefellToken is ERC721EnumerableUpgradeable, MerkleWhitelist { _mint(_to, tokenIds[i]); } } + + /// @notice Allow minting, and block all other token transfers + /// @param to The address to transfer to + /// @param tokenId The token id to transfer + /// @param auth The authorizer of the transfer + function _update( + address to, + uint256 tokenId, + address auth + ) + internal + virtual + override + returns (address) + { + if (_ownerOf(tokenId) != address(0)) { + revert TOKEN_CANNOT_BE_TRANSFERRED(); + } + return super._update(to, tokenId, auth); + } } diff --git a/packages/nfts/test/snaefell/SnaefellToken.t.sol b/packages/nfts/test/snaefell/SnaefellToken.t.sol index b2154c2a728..495681db5b2 100644 --- a/packages/nfts/test/snaefell/SnaefellToken.t.sol +++ b/packages/nfts/test/snaefell/SnaefellToken.t.sol @@ -96,4 +96,13 @@ contract SnaefellTokenTest is Test { assertEq(token.balanceOf(owner), 5); assertEq(tokenIds.length, 5); } + + function test_revert_tokenCannotBeTransferred() public { + vm.startBroadcast(owner); + uint256[] memory tokenIds = token.mint(owner, 5); + + vm.expectRevert(); + token.transferFrom(owner, minters[0], tokenIds[0]); + vm.stopBroadcast(); + } }