Interact with Smart Contracts through your website (JS) error

i was following this tutorial on you tube, Interact with Smart Contracts through your website (JS and REACT tutorial).

i have develop my own smartcontract : address-0x17162F8b6508aaFA79b9533e9683edDBA05726b6
its on bsc testnet. its a simple contract with increase counter. while i finish my code i am facing these errors

moralis.js:7565 Uncaught (in promise) Error: Missing web3 instance, make sure to call Moralis.enableWeb3() or Moralis.authenticate()
    at Function.value (moralis.js:7565:48)
    at Function.<anonymous> (moralis.js:7375:46)
    at tryCatch (moralis.js:74788:40)
    at Generator.invoke [as _invoke] (moralis.js:75019:22)
    at Generator.next (moralis.js:74844:21)
    at asyncGeneratorStep (moralis.js:30969:24)
    at _next (moralis.js:30991:9)
    at moralis.js:30998:7
    at new Promise (<anonymous>)
    at new Wrapper (moralis.js:57965:24)

my js file

const serverUrl = "https://42o5wyensnv6.usemoralis.com:2053/server"

  const appId = "9fjqg7uSqJQKwl8J7SgpMpWQWy4alUJfE4Au7LsR"

   Moralis.start({serverUrl, appId})

  async function login(){

    let user= Moralis.User.current();

    if(!user){

        try{

            user= await Moralis.authenticate({signMessage:" done"});

            await Moralis.enableWeb3();

             console.log(user)

            console.log(user.get('ethAddress'));

        }catch(error){

            console.log(error)

        }

    }
 }

async function btn(){

    let op={

        contractAddress:"0x17162F8b6508aaFA79b9533e9683edDBA05726b6",

        functionName:"setCount",

        Abi:[{"inputs":[],"name":"count","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"setCount","outputs":[],"stateMutability":"nonpayable","type":"function"}],

    }

    await Moralis.executeFunction(op);

document.getElementById('logn').onclick= login;

document.getElementById('count').onclick= btn;

html

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>web3</title>

    <!-- INSTALL THE SDK and WEB3 -->

 <script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>  

 <script src="https://unpkg.com/moralis/dist/moralis.js"></script>

 <!-- / -->

</head>

<body>

    <button id="logn">login</button>

  <button id="count">counter</button>

    <div id="fcount" >0</div>

    <script src="main.js"></script>

</body>

</html>

what i am doing wrong, any suggestions?

Did you copy in your files correctly? E.g. your onclick code should be outside of the btn() function.

You donโ€™t need enableWeb3() if you use Moralis.authenticate(). But if you reload the page and you donโ€™t re-authenticate (but there is still a current user), then you will need enableWeb3.

async function login() {
  let user = Moralis.User.current();

  if (!user) {
    try {
      user = await Moralis.authenticate({ signingMessage: ' done' });

      console.log(user);

      console.log(user.get('ethAddress'));
    } catch (error) {
      console.log(error);
    }
  }
}

async function btn() {
  await Moralis.enableWeb3();

  let op = {
    contractAddress: '0x17162F8b6508aaFA79b9533e9683edDBA05726b6',

    functionName: 'setCount',

    abi: [
      {
        inputs: [],
        name: 'count',
        outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
        stateMutability: 'view',
        type: 'function',
      },
      {
        inputs: [],
        name: 'setCount',
        outputs: [],
        stateMutability: 'nonpayable',
        type: 'function',
      },
    ],
  };

  await Moralis.executeFunction(op);
}

Also it is signingMessage not signMessage, and Abi should be abi.

well the transaction went trough successfully & the counter has increased on the contract( bsc scan testnet) but its not updating on webpage!! its showing still zero on webpage has not increased.

Itโ€™s still showing zero because there is no code that updates it.

You can get this counter from your contract with a read call function using executeFunction and then update the fcount element.

You could call this read function after waiting for the setCount transaction to be confirmed.

E.g.

const transaction = await Moralis.executeFunction(op);
const result = await transaction.wait();

// call read function on your contract which then updates the counter

can u plz show me how to call that,

// call read function on your contract which then updates the counter...

Once the transaction is successful after transaction.wait(), you can

const options = {
  chain: "0x61",
  address: "0x17162F8b6508aaFA79b9533e9683edDBA05726b6",
  function_name: "count",
  abi: [
    {
        inputs: [],
        name: 'count',
        outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
        stateMutability: 'view',
        type: 'function',
      }
  ]
};
const count = await Moralis.Web3API.native.runContractFunction(options);
document.getElementById("fcount").innerText = count;

thank you. ```

chain: โ€œ0x61โ€, it is referring?

Binance Smart Chain Testnet: https://docs.moralis.io/moralis-dapp/web3-api/supported-chains

thank you. i will read the docs.