Error: TxGasUtil on part 7 Morarable

Hey guys
I’m having this error message come up every time I create and mint a NFT with Metamask.

index.js:49 Uncaught (in promise) Error: TxGasUtil - Trying to call a function on a non-contract address
{
  "originalError": {
    "errorKey": "transactionErrorNoContract",
    "getCodeResponse": "0x"
  }
}
    at Object._fireError (index.js:49:17)
    at o (index.js:548:30)
    at a (util.js:689:22)
    at M (util.js:666:10)
    at b.run (browser.js:153:14)
    at p (browser.js:123:42)

Has anyone done this part of Morarable or knows how to fix this issue?

Javascript

const serverUrl = "https://hbrhmupyiqgd.usemoralis.com:2053/server";

const appId = "jSR4OAe7qfcWQYDcYVH0nWdvwOxnhUO1tyxrKGWZ";

const TOKEN_CONTRACT_ADDRESS = "0xF276579917F17F5a157251C02d46993c1c7E2e42"

Moralis.start({ serverUrl, appId });

init = async () => {

    hideElement(userInfo);

    hideElement(createItemForm);

    await Moralis.enableWeb3();

    web3 = new Web3(web3.currentProvider);

    window.tokenContract = new web3.eth.Contract(tokenContractAbi, TOKEN_CONTRACT_ADDRESS)

        initUser();

}

initUser = async () => {

    if (await Moralis.User.current()){

        hideElement(userConnectButton);

        showElement(userProfileButton);

        showElement(openCreateItemButton);

    }else{

        showElement(userConnectButton);

        hideElement(userProfileButton);

        hideElement(openCreateItemButton);

        hideElement(createItemForm);

    }

}

login = async () => {

    try {

        await Moralis.authenticate();

        initUser();

    } catch (error) {

        alert(error)

    }

}

logout = async () => {

    await Moralis.User.logOut();

    hideElement(userInfo);

    initUser();

}

openUserInfo = async () => {

    user = await Moralis.User.current();

    if (user){    

        const email = user.get('email');

        if(email){

            userEmailField.value = email;

        }else{

            userEmailField.value = "";

        }

        userNameField.value = user.get('username');

        const userAvatar = user.get('avatar');

        if(userAvatar){

            userAvatarImg.src = userAvatar.url();

            showElement(userAvatarImg);

        }else{

            hideElement(userAvatarImg);

        }

        showElement(userInfo);

    }else{

        login();

    }

}

saveUserInfo = async () => {

    user.set('email', userEmailField.value);

    user.set('username', userNameField.value);

    if (userAvatarFile.files.length > 0) {

        const avatar = new Moralis.File("avatar1.jpg", userAvatarFile.files[0]);

        user.set('avatar', avatar);

    }

    await user.save();

    alert("User info saved successfully!");

    openUserInfo();

}

createItem = async () => {

    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.webp", createItemFile.files[0]);

await nftFile.saveIPFS();

const nftFilePath = nftFile.ipfs();

const nftFileHash= nftFile.hash();

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 nftFileMetadataFileHash = nftFileMetadataFile.hash();

const nftId = await mintNft(nftFileMetadataFilepath);

const Item = Moralis.Object.extend("Item");

const item = new Item();

item.set('name', createItemNameField.value);

item.set('description', createItemDescriptionField.value);

item.set('nftFilePath', nftFilePath);

item.set('nftFileHash', nftFileHash);

item.set('metadataFilePath', nftFileMetadataFilepath);

item.set('metadataFileHash', nftFileMetadataFileHash);

item.set('nftId', nftId)

item.set('nftContractAddres', TOKEN_CONTRACT_ADDRESS);

await item.save();

console.log(item);

}

mintNft = async (metadataUrl) => {

    const receipt = await tokenContract.methods.createItem(metadataUrl).send({from: ethereum.selectedAddress});

    console.log(receipt);

    return receipt.events.Transfer.returnValues.tokenId;

}

hideElement = (element) => element.style.display = "none";

showElement = (element) => element.style.display = "block";

//Navbar

const userConnectButton = document.getElementById("btnConnect");

userConnectButton.onclick = login;

const userProfileButton = document.getElementById("btnUserInfo");

userProfileButton.onclick = openUserInfo;

//Userinfo

const userInfo = document.getElementById("userInfo");

const userNameField = document.getElementById("txtUsername");

const userEmailField = document.getElementById("txtEmail");

const userAvatarImg = document.getElementById("imgAvatar");

const userAvatarFile = document.getElementById("fileAvatar");

document.getElementById("btnCloseUserInfo").onclick = () => hideElement(userInfo)

document.getElementById("btnLogOut").onclick = logout;

document.getElementById("btnSaveUserInfo").onclick = saveUserInfo;

//Item Creation

const createItemForm = document.getElementById("createItem");

const createItemNameField = document.getElementById("txtCreateItemName");

const createItemDescriptionField = document.getElementById("txtCreateItemDescription");

const createItemPriceField = document.getElementById("numCreateItemPrice");

const createItemStatusField = document.getElementById("selectCreateItemStatus");

const createItemFile = document.getElementById("fileCreateItemFile");

const openCreateItemButton = document.getElementById("btnOpenCreateItem");

openCreateItemButton.onclick = () => showElement(createItemForm);

document.getElementById("btnCloseCreateItem").onclick = () => hideElement(createItemForm);

document.getElementById("btnCreateItem").onclick = createItem;

init();

Token migration

const MorarableToken = artifacts.require("MorarableToken");

module.exports = function (deployer) {

  deployer.deploy(MorarableToken);

 

};

TOKEN_CONTRACT_ADDRESS needs to be a contract address. 0xF276579917F17F5a157251C02d46993c1c7E2e42 is not a contract.

Hi Glad.
I’ve just changed it to a contract address which is 0x9a5B99bAb34FE642Bf4946F7fBA349519E0a7b31 but I’m still getting the same error message as before. Is there anything else it could be?
Cheers :slight_smile:

0x9a5B99bAb34FE642Bf4946F7fBA349519E0a7b31 is not a contract either. The error you’re getting is very specific, you can’t call a function on a non-contract address.

Make sure you follow the tutorial(s) step by step.

Hi Glad
okay thank you for your help Ill go look through the tutorial again. I’ve attached a screenshot of the token migration. I thought the contract address from the terminal was the correct address needed.

Yes that should be the address that you use. Apologies, I see now you’re actually using a local blockchain. Have you selected localhost (and correct chainId) as your chain in your wallet?

Hi Glad
Yes no problem, I just got it to work :slight_smile: .
appreciate your help.
Cheers

1 Like