javascriptweb3jsmetamask

Web3.js & Metamask Mobile - Failed to call contract function (but working fine on desktop) [code: -32603]


I use Web3.js and MetaMask to interact with blockchain. But failed to call contract functions on MetaMask mobile app...

Not sure what is wrong here...

This is my code below:

import Web3 from 'web3';
import detectEthereumProvider from '@metamask/detect-provider';

const provider = await detectEthereumProvider();
const web3 = new Web3(provider);

const accounts = await provider.request({
    method: 'eth_requestAccounts',
});

const query = (new web3.eth.Contract(ContractAbi, ContractAddress)).methods.tokenWeight(10);
 
try {
     let result = await query.call();
     console.log(result);
} catch (e) {
     console.log(e);
}

the error produced:

{"name":"Qe","code": 100,"message":"Returned error:

Internal JSON-RPC error.","innerError": {"code":-32603,"message":"Internal

JSON-RPC error.","data": {"code":-32000,"message":"execution

reverted"}},"data":

{"code":-32000,"message":"execution

reverted"}}
{"code":-32603,"data":{"request": {"method":"eth_call","params": [{"to":"0x47061C8a71274Ea7245B84f EA63cBac957d8a1cF","input":"0x70a0 823100000000000000000000000036 4d8ea5e7a4ce97e89f7b2cb7198d6d5 dfe0ace"},"latest"],"jsonrpc":"2.0","id": 9330414}}}

Solution

  • seems like web3.js have problem..

    I ended up using ether.js (version 6.7.1) and both mobile and desktop working perfectly...

    import { 
         BrowserProvider, 
         Contract
    } from "ethers";
    import detectEthereumProvider from '@metamask/detect-provider';
    
    const browserProvider = await detectEthereumProvider();
    const provider = new BrowserProvider(browserProvider);
    
    const accounts = await browserProvider.request({
        method: 'eth_requestAccounts',
    });
     
    try {
         let result = await (new Contract(contractAddress, ABI, provider)).tokenWeight(10);
         console.log(result);
    } catch (e) {
         console.log(e);
    }