Ich versuche, Fallback-Funktionalität für meine DApp zu implementieren, was bedeutet, dass ich, wenn kein Web3-Anbieter (z. B. Metamask/Trustwallet usw.) gefunden wird, immer noch Anrufe in das Ethereum-Netzwerk tätigen kann, aber ich scheine immer das gleiche Problem zu bekommen.
Dies ist meine Fallback-Logik:
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));
Ich sehe is connected
und dann INIT_APP
wird gerufen.
INIT_APP
Dann setzt der Anbieter meinen Trüffelvertrag so um:
MyContract.setProvider(web3.currentProvider);
Ich kann das aktuelle Netzwerk korrekt lesen, das sich wie auf Mainnet
, ID 1 meldet, aber wenn ich dann versuche, Trüffel zu verwenden, fällt dies um.
Der Call to Trüffel sieht so aus:
MyContract.deployed()
.then((contract) => {
// Do stuff
}).catch((error) => console.log("Something went bang!", error));
Eine Ausnahme ist throw und ich gebe den Fehler aus, der wie folgt lautet:
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)
Hat jemand irgendwelche Ideen? Aus der Dokumentation und den Beispielen, die ich gelesen habe, glaube ich, dass dies funktionieren sollte, und alle Hilfe wird geschätzt!
Vielen Dank.
Ich habe festgestellt, dass die Verwendung der beschriebenen Problemumgehung für dieses Ticket das Problem für mich gelöst hat: https://github.com/trufflesuite/truffle-contract/issues/57
z.B
MyContract.setProvider(web3.currentProvider);
if (typeof MyContract.currentProvider.sendAsync !== "function") {
MyContract.currentProvider.sendAsync = function() {
return MyContract.currentProvider.send.apply(
MyContract.currentProvider, arguments
);
};
}
Jimbo1987
Jimbo1987
Jimbo1987