Ошибка Truffle-Contract с Metamask

Кажется, что на моем компьютере/веб-браузере Google Chrome медленно вводит метамаску. Поэтому я должен написать что-то вроде этого, чтобы мое приложение фактически получило экземпляр web3 вместо сбоя:

setTimeout(function(){
    if (typeof web3 !== 'undefined'){
        console.log('getting web3');
        App.web3Provider = web3.currentProvider;
    }
    else {
        console.log('No Web3 instance given!');
        // flash modal saying "please download Metamask"
    }
    web3 = new Web3(App.web3Provider);

    return App.initContract(web3);

}, 500);

Однако это не очень хорошо работает с библиотекой Truffle-Contract js, которой сразу нужен экземпляр web3. У кого-нибудь есть обходной путь или исправление для этого? Спасибо.

Ответы (1)

Библиотеке truffle-contractне нужен экземпляр web3 сразу. Он должен быть там только тогда, когда вы начинаете пытаться его использовать.

var contract = require("truffle-contract");
var my_contract_json = require('../../../truffle/build/contracts/MyContract.json');
var MyContract;

var my_contract_deployed;

window.onload = function() {
    if (typeof web3 !== 'undefined') { 
        window.web3 = new Web3(web3.currentProvider);

        MyContract = contract(my_contract_json);
        MyContract.setProvider(web3.currentProvider);
        MyContract.deployed().then(function(instance) {
            my_contract_deployed = instance;
            // doWhateverUIStuff();
        });
    }
}

См. рабочий пример здесь: https://github.com/realitykeys/realitycheck/blob/8674f7b07cef2c4c96762c30befd549138bdb8e4/assets/js/scripts/main.js#L3398 .

Спасибо вам за помощь! Я думаю, что использовал библиотеку трюфельных контрактов до того, как был получен экземпляр web3, как вы сказали.