NFT Not Appearing in OpenSea Collection After Transfer

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?

That’s weird… I’ve hit similar issues before, usually from metadata problems or OpenSea’s indexing being wonky. Quick question - did you check the transaction hash on Etherscan to confirm the transfer actually went through? And are both wallets connected to the same OpenSea account or different ones?

What’s your metadata setup like? Is your metadataURI pointing to IPFS or something else? OpenSea gets confused when metadata isn’t accessible or there’s caching issues.

Try going to the NFT’s page on OpenSea and hit the refresh metadata button. Clearing your browser cache sometimes fixes these display glitches too.

Also - did you wait long enough? Testnet can be painfully slow, sometimes 12+ hours to update. Mainnet’s faster but testnets are notorious for laggy indexing.

Any errors showing up in your browser console when you check the new owner’s collection page?

Had the same issue two months ago with my ERC721 deployment. Contract looks fine - OpenSea’s indexing just gets stuck after transfers, especially on testnets. Here’s what fixed it for me: manually import the contract address in the new wallet’s OpenSea profile (“Import an existing smart contract” option). OpenSea often doesn’t auto-recognize that transferred tokens belong to the new owner, even though the blockchain shows it correctly. Also check if the receiving address has OpenSea activity before - brand new addresses sync slower. The metadata refresh button helps, but importing the contract directly forces OpenSea to reindex the whole collection ownership.

opensea can be really slow with updates on testnet. try refreshing the metadata on the nft’s page or just give it some time. I’ve had tokens disappear for over 6 hours before they showed up again. also make sure ur new wallet’s connected to opensea.