title: ERC721 Minted NFT not showing on Opensea.io testnet
body: <p>I run my code on rinkeby etherscan network and it works perfectly. But the image and descriptions are not showing on opensea testnet. I run the /validate/ url it shows <code>Valid: &quot;false&quot;</code>.</p>
  <p>Here is what I found when I force update on opensea, <a href="https://testnets-api.opensea.io/api/v1/asset/0x668D179B933af761e4732B084290D32B3235C22b/0/?force_update=true" rel="nofollow noreferrer">https://testnets-api.opensea.io/api/v1/asset/0x668D179B933af761e4732B084290D32B3235C22b/0/?force_update=true</a></p>
  <p>Here is my code:</p>
  <pre><code>    // SPDX-License-Identifier: MIT
  pragma solidity ^0.8.2;
  
  
  import &quot;@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol&quot;;
  import &quot;@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol&quot;;
  import &quot;@openzeppelin/contracts/access/Ownable.sol&quot;;
  import &quot;@openzeppelin/contracts/utils/Counters.sol&quot;;
  import &quot;./ERC2981ContractWideRoyalties.sol&quot;;
  import &quot;hardhat/console.sol&quot;;
  
  contract SmoothApe is ERC721URIStorage, Ownable, ERC2981ContractWideRoyalties {
      using Counters for Counters.Counter;
      using Strings for uint256;
  
      Counters.Counter private _tokenIdCounter;
  
      event EmitNFT(address sender, uint256 tokenId);
  
      uint256 public preSaleTokenPrice = 0.01 ether;
      uint256 public costPrice = 0.02 ether;
      uint256 public maxSupply = 10000;
      uint256 public maxMintNft = 10;
  
      string public baseURI;
      string public baseExtension = &quot;.json&quot;;
      string public notRevealedUri;
  
      bool public paused = false;
      bool public revealed = true;
      bool public presale = false;
  
      // set 0x7350243981aB92E2A3646e377EBbFC28e9DE96C1 as payable admn wallet
      address payable public adminWallet = payable(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2);
      address payable public communityWallet = payable(0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db);
      address payable public t1Wallet = payable(0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB);
      address payable public t2Wallet = payable(0x617F2E2fD72FD9D5503197092aC168c91465E7f2);
      address payable public t3Wallet = payable(0x17F6AD8Ef982297579C203069C1DbfFE4348c372);
  
      // Mapping from token ID to owner address
      mapping(uint256 =&gt; address) private _owners;
  
  
  
      constructor(string memory _name, string memory _symbol,string memory _initBaseURI, string memory _initNotRevealedUri) ERC721(_name, _symbol) {
          setBaseURI(_initBaseURI);
          setNotRevealedUri(_initNotRevealedUri);
      }
  
      // inherit and override erc165
      function supportsInterface(bytes4 interfaceId) public view virtual override (ERC721, ERC2981Base) returns (bool) {
          return super.supportsInterface(interfaceId);
      }
  
      // set Royalty value (between 0 and 10000)
      function setRoyalties(address recipient, uint256 value) public onlyOwner {
          _setRoyalties(recipient, value);
      }
  
      function _baseURI() internal view override returns (string memory) {
          return baseURI;
      }
  
      function mintApe() public payable {
          uint256 tokenId = _tokenIdCounter.current();
          require(!paused, &quot;Minting is paused&quot;);
          require(msg.sender != owner(), &quot;You can't mint ape to admin&quot;);
          // require(_mintAmount &gt; 0, &quot;Mint amount must be greater than 0&quot;);
          // require(_mintAmount &lt;= maxSupply, &quot;Mint amount must be less than or equal to max supply&quot;);
          if(presale == true) {
              preSaleTokenPrice = costPrice;
  
          }
          require(msg.value &gt;= costPrice, string(abi.encodePacked(&quot;Must send at least &quot;, costPrice.toString(), &quot; ether to purchase&quot;)));
          require(balanceOf(msg.sender) &lt; maxMintNft, &quot;You can only own 11 ape at a time&quot;);
          // require(_mintAmount + balanceOf(msg.sender) &lt;= maxMintNft, &quot;You can only own 10 ape at a time&quot;);
          // adminWallet.transfer(msg.value);
          payable(owner()).transfer(msg.value);
          emit EmitNFT(msg.sender, tokenId);
          // for(uint256 i = 1; i &lt;= _mintAmount; i++){
          _safeMint(msg.sender, tokenId);
          // _setTokenURI(tokenId, _baseURI());
          _tokenIdCounter.increment();
          // }
      }
  
      // admin mint ape to wallet
      function mintApeTo(address _to, uint256 _mintAmount) public onlyOwner {
          require(!paused, &quot;Minting is paused&quot;);
          require(_mintAmount &gt; 0, &quot;Mint amount must be greater than 0&quot;);
          require(_mintAmount &lt;= maxSupply, &quot;Mint amount must be less than or equal to max supply&quot;);
          for(uint256 i = 1; i &lt;= _mintAmount; i++){
              uint256 tokenId = _tokenIdCounter.current();
              _safeMint(_to, tokenId);
              // _setTokenURI(tokenId, _baseURI());
              _tokenIdCounter.increment();
          }
      }
  
      function getCostPrice() public view virtual returns (uint256) {
          return costPrice;
      }
      //  function to set cost of ape
      function setCost(uint256 _preSaleTokenPrice, uint256 _publicTokenPrice) public onlyOwner {
          preSaleTokenPrice = _preSaleTokenPrice;
          costPrice = _publicTokenPrice;
      }
      // set presale to true
      function setPresale(bool _presale) public onlyOwner {
          presale = _presale;
      }
      function reveal(bool _reveal) public onlyOwner {
          revealed = _reveal;
      }
      // pause function
      function pause() public onlyOwner {
          paused = true;
      }
      // set function for setBaseURI and setNotRevealed function
      function setBaseURI(string memory _newBaseURI) public onlyOwner {
          baseURI = _newBaseURI;
      }
  
      function setTokenURI(uint256 _tokenId, string memory _tokenURI) public onlyOwner {
          _setTokenURI(_tokenId, _tokenURI);
      }
  
      
      // override tokenURI function
      function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
          require(_exists(tokenId), &quot;ERC721Metadata: URI query for nonexistent token&quot;);
          require(tokenId &lt; _tokenIdCounter.current(), &quot;Token ID must be less than the total supply&quot;);
          if(!revealed) {
              return notRevealedUri;
          }
          string memory currentBaseURI = _baseURI();
          return bytes(currentBaseURI).length &gt; 0 
              ? string(
                  abi.encodePacked(
                      currentBaseURI, 
                      tokenId.toString(), 
                      baseExtension))
                      : &quot;&quot;;
      }
  }
  </code></pre>
  <p>Here is a sample of NFT i mint:
  <a href="https://testnets.opensea.io/assets/0x668D179B933af761e4732B084290D32B3235C22b/0" rel="nofollow noreferrer">https://testnets.opensea.io/assets/0x668D179B933af761e4732B084290D32B3235C22b/0</a></p>
  <p>my ipfs CID:
  ipfs://QmaoMZ19zhpC6T4id6jdBP1Qz5dQSmRZMkQZU7Zt8hyFNQ/</p>