I’m having trouble with my ERC721 token contract. I built it using OpenZeppelin and everything works fine for minting and transfers, but there’s a weird issue with OpenSea display.
Here’s my contract code:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "@openzeppelin/contracts@4.6.0/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts@4.6.0/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts@4.6.0/utils/Counters.sol";
contract ARTCOLLECTION is ERC721, ERC721Enumerable, ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _currentTokenId;
uint256 TOTAL_SUPPLY = 3000;
constructor() ERC721("ARTCOLLECTION", "ART") {}
function createToken(address recipient, string memory metadataURI) public {
uint256 newTokenId = _currentTokenId.current();
require(newTokenId <= TOTAL_SUPPLY, "Maximum supply reached!");
_currentTokenId.increment();
_safeMint(recipient, newTokenId);
_setTokenURI(newTokenId, metadataURI);
}
function _beforeTokenTransfer(address sender, address receiver, uint256 tokenNumber)
internal
override(ERC721, ERC721Enumerable)
{
super._beforeTokenTransfer(sender, receiver, tokenNumber);
}
function _burn(uint256 tokenNumber) internal override(ERC721, ERC721URIStorage) {
super._burn(tokenNumber);
}
function tokenURI(uint256 tokenNumber)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenNumber);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
}
The problem is this: I minted 2 tokens and connected my MetaMask to OpenSea testnet. Both showed up fine in my collected items. Then I transferred one token to a different wallet address using safeTransferFrom. The blockchain shows the transfer worked correctly and the new address owns the token. But when I check OpenSea, that transferred token doesn’t show up in the new owner’s collected section anymore. The contract says the right person owns it, but OpenSea won’t display it. Has anyone seen this before?