Лучший шаблон для определения учетной записи web3 по умолчанию при использовании метамаски

Контекст: я хочу использовать блоки для визуализации идентификатора на странице, я получаю учетную запись defaultAccount из web3, для этого пользователь должен войти в метамаску с выбранным адресом из своего кошелька.

Проблема: кажется, что веб-приложение не обнаруживает объект web3 по событию загрузки страницы, и это рекомендуемое место для его обнаружения.

Код: ниже вдохновлен рекомендациями по адресу:

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

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

У меня постоянное поведение, иногда есть web3, а иногда нет. Единственное решение, которое я могу придумать, - это иметь таймер, но это кажется мне слишком упрощенным, я бы предпочел что-то более элегантное.

Вопрос: есть ли лучшее решение для определения учетной записи default3 из web3 при загрузке страницы?

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

2 ответа

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.

Другие вопросы по тегам