Problem with "Rarible Clone" after migrating to ether.js

There are some problems after migrating my “Rarible clone” project from web3.js to ether.js.
It works fine on Polygon Testnet, but very strange on Mainnet.
Metamask returns errors after first confirmation in Metamask:

{
    "code": -32603,
    "message": "Internal JSON-RPC error.",
    "data": {
        "code": 3,
        "message": "execution reverted: ERC721: approved query for nonexistent token",
        "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002c4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000000000000000000000000000000000"
    }
}

{
    "code": -32603,
    "message": "Internal JSON-RPC error.",
    "data": {
        "code": 3,
        "message": "execution reverted: ERC721: approved query for nonexistent token",
        "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002c4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000000000000000000000000000000000"
    },
    "stack": "{\n  \"code\": -32603,\n  \"message\": \"Internal JSON-RPC error.\",\n  \"data\": {\n    \"code\": 3,\n    \"message\": \"execution reverted: ERC721: approved query for nonexistent token\",\n    \"data\": \"0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002c4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e0000000000000000000000000000000000000000\"\n  },\n  \"stack\": \"Error: Internal JSON-RPC error.\\n    at new i (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:123658)\\n    at s (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:121201)\\n    at Object.internal (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:121811)\\n    at u (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:80899)\\n    at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:81931\\n    at async chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:5803\"\n}\n  at new i (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:123658)\n  at s (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:121201)\n  at Object.internal (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/common-0.js:1:121811)\n  at u (chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:80899)\n  at chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:81931\n  at async chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/background-1.js:1:5803"
}

Part of my code:

const serverUrl = 'https://tzpof9jw8ja1.usemoralis.com:2053/server';
const appId = "aBFWQKmuSnyIyjRajCTr9sIYCzgjvh5tXDROnzKJ";

Moralis.initialize(appId);
Moralis.serverURL = serverUrl;
const TOKEN_CONTRACT_ADDRESS = "0x1954205A8513c2163429083D471f32f8723FFC49";
const MARKETPLACE_CONTRACT_ADDRESS = "0xd3f76c76707838A94E82E67685B4b68a6bf32e5c";
const CHAIN = "MATIC";

Moralis.start({serverUrl, appId});
var loginModal = new bootstrap.Modal(document.getElementById('Modal-Login'));

createItem = async () => {
  user = await Moralis.User.current();
  const userAddress = user.get('ethAddress');
  const provider = new ethers.providers.Web3Provider(Moralis.provider);
  const tokenContract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, provider);
  const marketplaceContract = new ethers.Contract(MARKETPLACE_CONTRACT_ADDRESS, marketplaceContractAbi, provider);

  const signer = provider.getSigner(userAddress);

  const tokenContractToInteract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, signer);
  const marketplaceContractToInteract = new ethers.Contract(MARKETPLACE_CONTRACT_ADDRESS, marketplaceContractAbi, signer);

if (createItemFile.files.length == 0){
  alert("Please select a file!");
  return;
} else if (createItemNameField.value.length == 0){
  alert("Please give the item a name!");
  return;
}

const nftFile = new Moralis.File("nftFile.jpg",createItemFile.files[0]);
await nftFile.saveIPFS();

const nftFilePath = nftFile.ipfs();

const metadata = {
  name: createItemNameField.value,
  description: createItemDescriptionField.value,
  image: nftFilePath,
};

const nftFileMetadataFile = new Moralis.File("metadata.json", {base64 : btoa(JSON.stringify(metadata))});
await nftFileMetadataFile.saveIPFS();

const nftFileMetadataFilePath = nftFileMetadataFile.ipfs();


const nftId = await mintNft(nftFileMetadataFilePath);

switch(createItemStatusField.value){
  case "0":
      return;
  case "1":
      await ensureMarketplaceIsApproved(nftId, TOKEN_CONTRACT_ADDRESS);
      const maticInWei = Moralis.Units.ETH(createItemPriceField.value); 
      const tx = await marketplaceContractToInteract.addItemToMarket(nftId, TOKEN_CONTRACT_ADDRESS, maticInWei);
      const receipt = await tx.wait();
      break;
  case "2":
      alert("Not yet supported!");
      return;
}
}

mintNft = async (metadataUrl) => {
  user = await Moralis.User.current();
  const userAddress = user.get('ethAddress');
  const provider = new ethers.providers.Web3Provider(Moralis.provider);
  const tokenContract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, provider);
  const marketplaceContract = new ethers.Contract(MARKETPLACE_CONTRACT_ADDRESS, marketplaceContractAbi, provider);

  const signer = provider.getSigner(userAddress);

  const tokenContractToInteract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, signer);
  const marketplaceContractToInteract = new ethers.Contract(MARKETPLACE_CONTRACT_ADDRESS, marketplaceContractAbi, signer);
  

  const tx = await tokenContractToInteract.createItem(metadataUrl);
  const receipt = await tx.wait();
  const tokenID = receipt.events[0].args.tokenId.toNumber();

  return tokenID;
}


ensureMarketplaceIsApproved = async (tokenId, tokenAddress) => {
  user = await Moralis.User.current();
  const userAddress = user.get('ethAddress');
  const provider = new ethers.providers.Web3Provider(Moralis.provider);
  const tokenContract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, provider);
  const marketplaceContract = new ethers.Contract(MARKETPLACE_CONTRACT_ADDRESS, marketplaceContractAbi, provider);

  const signer = provider.getSigner(userAddress);

  const tokenContractToInteract = new ethers.Contract(TOKEN_CONTRACT_ADDRESS, tokenContractAbi, signer);
 
  const approvedAddress = await tokenContract.getApproved(tokenId);

  if (approvedAddress != MARKETPLACE_CONTRACT_ADDRESS){
    const tx1 = await tokenContractToInteract.approve(MARKETPLACE_CONTRACT_ADDRESS,tokenId);
    await tx1.wait();
  }
}

But sometimes I can add NFT without any errors. Where can be a problem?

from this message it looks like the token_id was not the right one

I understand. Now i did second attempt to add item and it was done with 3 confiramation. Item was added to ItemsForSale table.

function ensureMarketplaceIsApproved has tokenId = 33;

const approvedAddress = await tokenContract.getApproved(tokenId); - returns
0x0000000000000000000000000000000000000000

But NFT is on the site now, with no errors and changing code.

Next attempt was OK (with approvedAddress = 0x0000000000000000000000000000000000000000), then next was failes with the same Metamask error, but there was no returned approvedAddress. This is a difference.

No suggestions what can I do?

This a problem when I work with Metamask. Safepal wallet (android app) works correct.

Hello!
The problem is still actual.

you get this error when it doesn’t work? or it is a different error?

it is not clear for me what is the problem that you face here.