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?