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

Posted

技术标签:

【中文标题】未捕获的错误:无效地址 web3.currentProvider MetaMask【英文标题】:Uncaught Error: Invalid Address web3.currentProvider MetaMask 【发布时间】:2019-06-09 14:35:46 【问题描述】:

我已将我的 ERC721 合约部署到 Rinkeby 测试网。合约已成功部署。我无法使用 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
                    

未捕获的错误:地址无效 在你(web3.min.js:1) 在 inputTransactionFormatter (web3.min.js:1) 在 web3.min.js:1 在 Array.map() 在 i.formatInput (web3.min.js:1) 在 i.toPayload (web3.min.js:1) 在 _.e [作为 sendTransaction] (web3.min.js:1) 在 c.sendTransaction (web3.min.js:1) 在 index.html:589 在 web3.min.js:1

【问题讨论】:

你确定是https://rinkeby.infura.io/v3/api-key 这是infura链接 试试这个链接:https://rinkeby.infura.io/&lt;your-key-here&gt; 是的,我也这样做了。我刚刚删除了此处发布的 api-key。 【参考方案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;
  

【讨论】:

以上是针对 MetaMask 特定页面的。我还没有更便携的答案,它也在 Opera 和其他内置 Web3 的浏览器上。这里有一个问题和现金赏金github.com/su-squares/tenthousandsu.com/issues/3【参考方案2】:

我在使用 Rinkeby 测试网和 Metamask 开发 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() 并保存您的代码。

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

【讨论】:

【参考方案3】:

web3.js 文件

import Web3 from 'web3';

let provider;
// if on server or browser
if (typeof window !== 'undefined' && typeof window.web3 !== 'undefined') 
    // we are in browser and metamask present
    provider = window.web3.currentProvider;

else 
    // we are on server OR metamask not present
    provider = new Web3.providers.HttpProvider(
        'https://rinkeby.infura.io/v3/API_KEY'
    );


const web3 = new Web3(provider);

export default web3;

不要将 new Web3() 放入 if 块本身。托管(本地或服务器上)后,打开元掩码设置 -> 连接并添加您的站点以授予对元掩码的访问权限。 在元掩码和 web3 错误之后花了几天时间对我来说工作得很好!

【讨论】:

以上是关于未捕获的错误:无效地址 web3.currentProvider MetaMask的主要内容,如果未能解决你的问题,请参考以下文章

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

未捕获的错误:返回的值无效,是不是耗尽了 Gas?

未捕获的错误:元素类型无效

反应错误 - 未捕获的不变违规:元素类型无效

未捕获的错误:不变违规:元素类型无效:对象

document.getElementById 错误:未捕获的 ReferenceError:分配中的左侧无效