From ec3ef5ad93a8e8b7403b678b51e1151f57226734 Mon Sep 17 00:00:00 2001 From: bumi Date: Mon, 16 Apr 2018 22:40:15 +0200 Subject: [PATCH] Fix for missing web3/missing metamask when no web3 is available we do not have a signer --- app/lib/kredits/kredits.js | 3 ++- app/services/kredits.js | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/lib/kredits/kredits.js b/app/lib/kredits/kredits.js index 46a893f..1463621 100644 --- a/app/lib/kredits/kredits.js +++ b/app/lib/kredits/kredits.js @@ -94,7 +94,8 @@ export default class Kredits { if (!address || !abis[contractName]) { throw new Error(`Address or ABI not found for ${contractName}`); } - let contract = new ethers.Contract(address, abis[contractName], this.signer); + let signerOrProvider = this.signer || this.provider; + let contract = new ethers.Contract(address, abis[contractName], signerOrProvider); this.contracts[name] = new contracts[contractName](contract); return this.contracts[name]; diff --git a/app/services/kredits.js b/app/services/kredits.js index 91cfa3f..d8f891d 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -35,36 +35,39 @@ export default Service.extend({ initEthProvider: function() { return new RSVP.Promise((resolve) => { let ethProvider; + let ethSigner; let networkId; if (typeof window.web3 !== 'undefined') { debug('[kredits] Using user-provided instance, e.g. from Mist browser or Metamask'); networkId = parseInt(window.web3.version.network); ethProvider = new ethers.providers.Web3Provider(window.web3.currentProvider, {chainId: networkId}); + ethSigner = ethProvider.getSigner(); ethProvider.listAccounts().then((accounts) => { this.set('currentUserAccounts', accounts); this.set('ethProvider', ethProvider); - resolve(ethProvider); + this.set('ethSigner', ethSigner); + resolve(ethProvider, ethSigner); }); } else { debug('[kredits] Creating new instance from npm module class'); let providerUrl = localStorage.getItem('config:web3ProviderUrl') || config.web3ProviderUrl; networkId = parseInt(config.contractMetadata.networkId); ethProvider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId}); + ethSigner = null; // no signer as no local web3 object is available this.set('ethProvider', ethProvider); - resolve(ethProvider); + this.set('ethSigner', ethSigner); + resolve(ethProvider, ethSigner); } window.ethProvider = ethProvider; }); }, setup() { - return this.initEthProvider().then((ethProvider) => { - let signer = ethProvider.getSigner(); - return Kredits.setup(ethProvider, signer, config.ipfs).then((kredits) => { + return this.initEthProvider().then((ethProvider, ethSigner) => { + return Kredits.setup(ethProvider, ethSigner, config.ipfs).then((kredits) => { this.set('kredits', kredits); - - // TODO: Cleanup - if (this.get('currentUserAccounts').length > 0) { + // TODO: Cleanup (!!!) + if (this.get('currentUserAccounts') && this.get('currentUserAccounts').length > 0) { this.get('getCurrentUser').then((contributorData) => { this.set('currentUser', contributorData); });