使用MetAmask时,可以更好地检测Web3默认帐户



上下文:我想使用块来渲染页面上的个别他的钱包。

问题:Web应用程序似乎未检测到页面的加载事件上的Web3对象,WCHIH是检测到它的推荐地方。

代码:以下是从:

的建议中启发的

https://github.com/metamask/metamask-plugin/issues/1158

https://github.com/metamask/faq/blob/master/master/developers.md#partly_sunny-web3---------------------------- ethereum-browser-browser-environment-check

我一直拥有间歇性行为,有时Web3在那里,有时不是,我能想到的唯一解决方案是有一个计时器,但在我看来,这有点太简单了,我更喜欢更优雅的东西。

问题:是否有更好的解决方案来检测页面加载时从Web3中检测到的defaultAccount?

 function startApp() { 
        GenerateIdenticon();  
}  

window.addEventListener('load', function () { 
// Checking if Web3 has been injected by the browser (Mist/MetaMask)
if (typeof web3 !== 'undefined') {
    // Use Mist/MetaMask's provider
    window.web3 = new Web3(web3.currentProvider); 
    if (web3.currentProvider.isMetaMask === true) {
        if (typeof web3.eth.defaultAccount === 'undefined') {
            document.body.innerHTML = '<body><h1>Oops! Your browser does not support Ethereum Ðapps.</h1></body>';   
        }
        else {
            startApp();
        }
    }
    else {
         alert('No web3? Please use google chrome and metamask plugin to enter this Dapp!', null, null);
        // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
       window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));
}
function _Connect(callback){
    if(typeof web3 !== 'undefined') {
          web3 = new Web3(window.web3.currentProvider);
          web3.version.getNetwork((err, netId) => {
              switch (netId) {
                case "1":
                    callback('Switch Network', null);   
                  break
                case "2":
                  console.log('This is the deprecated Morden test network.');
                  callback('Switch Network', null);
                  break
                case "3":
                    console.log('Connected to the ropsten test network.');
                    web3.eth.defaultAccount = web3.eth.accounts[0];
                    if(!web3.eth.defaultAccount){
                        console.log('Log into metamask');
                        _Connect(callback);
                    }else{ 
                                                    // Success
                        console.log(`Web3 ETH Account: ${web3.eth.defaultAccount}`);
                        callback(false, web3.eth.defaultAccount);
                    }   
                  break
                default:
                  console.log('This is an unknown network.');
                  callback('Switch Network', null);
              }
            });
        } else {
          console.log(`Failed: Web3 instance required, try using MetaMask.`);
          callback('Install Metamask', null);
        }   
}

当Chrome插入MetAmask Web3库时,有一个延迟,因此需要超时(1秒的超时应该足够(。

超时后,您检查Web3全局对象是否存在,然后读取默认帐户。

如果不存在,请插入您自己的Web3对象。

相关内容

  • 没有找到相关文章

最新更新