Можно ли с инфурой подключиться без веб3 провайдера?

Я пытаюсь реализовать резервную функциональность для своего DApp, что означает, что когда не найден провайдер web3 (например, metamask/trustwallet и т. д.), я все еще могу совершать звонки в сеть ethereum, но, похоже, у меня всегда возникает одна и та же проблема.

Это моя резервная логика:

 let bootStrappedWeb3;

  // Checking if Web3 has been injected by the browser (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    bootStrappedWeb3 = new Web3(web3.currentProvider);
  } else {
    console.log('No Web3 Detected... falling back to using default mainnet HTTP Provider');
    bootStrappedWeb3 = new Web3(new Web3.providers.HttpProvider("https://mainnet.infura.io/<MY_API_KEY>"));
  }
  window.web3 = bootStrappedWeb3;

  // Listen for when web3 is connected and then bootstrap the app
  window.web3.eth.net.isListening()
    .then(() => {
      console.log('is connected');

      // Bootstrap the full app
      this.$store.dispatch(actions.INIT_APP, bootStrappedWeb3);
    })
    .catch(e => console.log('Something went wrong', e));

Я вижу , is connectedа потом INIT_APPназывается.

INIT_APPзатем устанавливает провайдера в моем трюфельном контракте следующим образом:

MyContract.setProvider(web3.currentProvider);

Я могу правильно прочитать текущую сеть, которая сообщает об Mainnetидентификаторе 1, но затем всякий раз, когда я пытаюсь использовать трюфель, он падает.

Призыв к трюфелю выглядит так:

 MyContract.deployed()
    .then((contract) => {
      // Do stuff 
    }).catch((error) => console.log("Something went bang!", error));

Исключением является бросок, и я получаю следующую ошибку:

Something went bang! TypeError: Cannot read property 'apply' of undefined
at Provider.sendAsync (contract.js?6b6f:24)
at RequestManager.sendAsync (requestmanager.js?e4d9:80)
at Object.get [as getNetwork] (property.js?7a8c:116)
at eval (contract.js?6b6f:512)
at new Promise (<anonymous>)
at Function.detectNetwork (contract.js?6b6f:503)
at Function.deployed (contract.js?6b6f:451)
at Store.eval (index.js?e3b1:444)
at Array.wrappedActionHandler (vuex.esm.js?edaa:704)
at Store.dispatch (vuex.esm.js?edaa:426)
at boundDispatch (vuex.esm.js?edaa:332)
at eval (index.js?e3b1:273)
at tryCatcher (bluebird.js?e531:5063)
at Promise._settlePromiseFromHandler (bluebird.js?e531:3095)
at Promise._settlePromise (bluebird.js?e531:3153)
at Promise._settlePromise0 (bluebird.js?e531:3198)
at Promise._settlePromises (bluebird.js?e531:3281)
at eval (bluebird.js?e531:162)
at MutationObserver.eval (bluebird.js?e531:4330)

У кого-нибудь есть идеи? Из документации и примеров, которые я прочитал, я считаю, что это должно работать, и вся помощь приветствуется!

Спасибо.

Я нашел это, похожее на github.com/trufflesuite/truffle-contract/pull/50
После того, как я попробовал предложенное исправление/хак для вышеуказанной проблемы с трюфелем, он действительно решает мою проблему, а не идеально, например, измените contract.js Provider.prototype.sendAsync = function() { if (this.provider.sendAsync != null) { return this .provider.sendAsync.apply(этот.провайдер, аргументы); } вернуть this.provider.send.apply(this.provider, arguments); };
обходной путь исправляет это на данный момент github.com/trufflesuite/truffle-contract/issues/57

Ответы (1)

Я обнаружил, что использование описанного обходного пути для этого билета решило проблему для меня: https://github.com/trufflesuite/truffle-contract/issues/57 .

например

MyContract.setProvider(web3.currentProvider);
if (typeof MyContract.currentProvider.sendAsync !== "function") {
     MyContract.currentProvider.sendAsync = function() {
        return MyContract.currentProvider.send.apply(
            MyContract.currentProvider, arguments
        );
    };
}