我使用 Web3.js 和 MetaMask 与区块链交互。但无法在
MetaMask mobile app
上调用合约函数...
不知道这里出了什么问题......
这是我的代码:
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);
}
产生的错误:
{"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}}}
好像 web3.js 有问题..
我最终使用了 ether.js(版本 6.7.1),移动设备和桌面设备都工作得很好......
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);
}