未捕获错误:无效地址web3.currentProvider MetaMask

问题描述 投票:2回答:2

我已将我的ERC721合同部署到Rinkeby TestNet。合同已成功部署。我无法使用MetaMask调用事务。花了一整天的时间来解决这个问题。找到一些答案,说明localhosted文件的问题或web3.js不能与MetaMask一起使用。

<script>
            if (typeof web3 != 'undefined') { 
                web3 = new Web3(web3.currentProvider) // what Metamask injected 
                console.log("existing web3: provider " + typeof web3);
            } else {
                // Instantiate and set Ganache as your provider
                web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/api-key"));
                console.log("new provider " + web3);
                web3.eth.defaultAccount = web3.eth.accounts[0]
            }
            // The interface definition for your smart contract (the ABI) 
            var StarNotary = web3.eth.contract(
                [contract-abi]
            )

            const starNotary = StarNotary.at('0x7cfAD6E80D992599d989166aABf536b21215544C')

            function claimStar() { 
                web3.eth.getAccounts(function(error, accounts) { 
                    if (error) { 
                        hotsnackbar(false, error);
                        return
                    }

未捕获的错误:在u(web3.min.js:1)处的inputTransactionFormatter(web3.min.js:1)处的web3.min.js:1处的无效地址位于i.formatInput(web3.min处)的Array.map()处。 js:1)在i.toPayload(web3.min.js:1)at _.e [as sendTransaction](web3.min.js:1)at c.sendTransaction(web3.min.js:1)at index。 html:589 at web3.min.js:1

ethereum web3js truffle
2个回答
1
投票

这是一个完整的演示,其中包括授权MetaMask合同等介绍性步骤。

https://fulldecent.github.io/spend-ERC20-create-ERC721/

以下是我认为您会感兴趣的特定代码:

https://github.com/fulldecent/spend-ERC20-create-ERC721/blob/master/docs/index.html#L102-L114

  if (window.ethereum) {
    window.web3 = new Web3(ethereum);
    $('#need-metamask').hide();
  } else {
    console.log('Non-Ethereum browser detected. Install MetaMask.');
    return;
  }
  window.web3.version.getNetwork((err, netId) => {
    if (netId == "3") {
      $('#need-ropsten').hide();
    }
  });

https://github.com/fulldecent/spend-ERC20-create-ERC721/blob/master/docs/index.html#L121-L127

  try {
    await ethereum.enable();
    $('#need-enable').hide();
  } catch (error) {
    console.log("ERROR: Enable account access and reload.");
    return;
  }

1
投票

在使用Metamask的Rinkeby testnet处理DApp时,我也遇到了同样的问题。

当我有我的web3.js文件如下

import Web3 from 'web3';

let web3;

if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
  // We are in the browser and metamask is running.
  web3 = new Web3(window.web3.currentProvider);
} else {
  // We are on the server *OR* the user is not running metamask
  const provider = new Web3.providers.HttpProvider(
    'Infura API key'
  );
  web3 = new Web3(provider);
  //window.web3.currentProvider.enable();


}

export default web3;

当我运行npm startnpm run dev(取决于你的开始脚本)

浏览器抛出错误说“未指定的错误:没有'来自'指定的地址'

当我打开浏览器控制台并做web.currentProvider时,它抛出了同样的错误。所以有一件事清楚,Metamask没有与浏览器联系。

我做的是

我使用Metamask登录浏览器。并将web3.js更改为在命令提示符下运行的服务器并保存文件。

import Web3 from 'web3';

let web3;

if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') {
  // We are in the browser and metamask is running.
//Note: change to window.web3.currentProvider.enable()
  web3 = new Web3(window.web3.currentProvider.enable());
} else {
  // We are on the server *OR* the user is not running metamask
  const provider = new Web3.providers.HttpProvider(
    'Infura API'
  );
  web3 = new Web3(provider);
  //window.web3.currentProvider.enable();


}

export default web3;

保存文件后,Metamask会立即提示您要从您的帐户建立连接。

单击是。

并从上面的代码中删除.enable()并保存您的代码。

这可以是一个临时解决方案,但是它确实有效!

© www.soinside.com 2019 - 2024. All rights reserved.