ERC721 Metadata didn't show up on OpenSea (Rinkeby Test Net)

I made NFT's, following a tutorial. I created 10 jpeg images and 10 corresponding JSON files to match for the metadata. I uploaded the 10 images to pinata and then took that CID and put it in the metadata for the JSON files. I then uploaded the JSON files, and took that CID and set it in my smart contract. An example of my JSON file is Pinata Example

I deployed the smart contract via Remix to my Metamask on the Rinkeby Testnet. OpenSea detected the assets in my wallet after they were minted, but the pictures and metadata in the json files was not there. Here is my smart contract:

When deploying, I set the URI to ipfs://QmSaNriq9r766ULfbTzveo9VSFxZAasVnscDbKKRpDWbDy/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "@openzeppelin/contracts/access/Ownable.sol";
import "erc721a/contracts/ERC721A.sol";

contract RomoVerse is ERC721A, Ownable {
  bool public IsSaleActive = false;
  bool public isAllowListActive = false;
  uint256 public constant MAX_SUPPLY = 10000;
  uint256 public constant MAX_PUBLIC_MINT_PER_ADDR = 5;
  uint256 public constant PRICE = 0.08 * 10**18; // 0.08 ETH
  mapping(address => uint8) private _allowList;

  string public baseURI;
  event AllowListMinted(address addr, uint256 amount);
  event Minted(address minter, uint256 amount);
  event BaseURIChanged(string newBaseURI);

  constructor(string memory initBaseURI) ERC721A("RomoVerse", "ROMO") {
    baseURI = initBaseURI;

  function _baseURI() internal view override returns (string memory) {
    return baseURI;

  function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
    isAllowListActive = _isAllowListActive;
  function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner { 
    for (uint256 i = 0; i < addresses.length; i++) {
        _allowList[addresses[i]] = numAllowedToMint;

  function numAvailableToMint(address addr) external view returns (uint8) {
    return _allowList[addr];
  function mintAllowList(uint8 numberOfTokens) external payable {
    require(isAllowListActive, "Allow list is not active");
    require(numberOfTokens <= _allowList[msg.sender], "Exceeded max available to purchase");
    require(totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
    _allowList[msg.sender] -= numberOfTokens;
    _safeMint(msg.sender, numberOfTokens);

    emit AllowListMinted(msg.sender, numberOfTokens);

  function mint(uint256 numberOfTokens) external payable {
    require(IsSaleActive, "Sale must be active to mint tokens");
    require(numberOfTokens <= MAX_PUBLIC_MINT_PER_ADDR, "Exceeded max token purchase");
    require(totalSupply() + numberOfTokens <= MAX_SUPPLY, "Purchase would exceed max tokens");
    require(PRICE * numberOfTokens <= msg.value, "Ether value sent is not correct");

    _safeMint(msg.sender, numberOfTokens);

    emit Minted(msg.sender, numberOfTokens);

  function numberMinted(address addr) external view returns (uint256) {
    return _numberMinted(addr);

  function setSaleState(bool _isSaleActive) external onlyOwner {
    IsSaleActive = _isSaleActive;

  function setBaseURI(string calldata newBaseURI) external onlyOwner {
    baseURI = newBaseURI;
    emit BaseURIChanged(newBaseURI);

  function reserve(uint256 quantity) external onlyOwner {
    _safeMint(msg.sender, quantity);

  function withdraw() external onlyOwner {
    uint balance = address(this).balance;