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}}}
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);
}