Error de contrato de trufa con Metamask

Parece que en mi computadora/navegador web Google Chrome es lento para inyectar meta-máscara. Por lo tanto, tengo que escribir algo como esto para que mi aplicación obtenga la instancia web3 en lugar de fallar:

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

Sin embargo, esto no funciona bien con la biblioteca Truffle-Contract js, que necesita la instancia web3 de inmediato. ¿Alguien tiene una solución o una solución para esto? Gracias.

Respuestas (1)

La truffle-contractbiblioteca no necesita la instancia web3 de inmediato. Solo necesita que esté allí cuando comience a intentar usarlo.

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

Vea un ejemplo práctico aquí: https://github.com/realitykeys/realitycheck/blob/8674f7b07cef2c4c96762c30befd549138bdb8e4/assets/js/scripts/main.js#L3398

¡Gracias por la ayuda! Creo que estaba usando la biblioteca de contratos de trufa antes de que se recibiera la instancia web3, como dijiste.