From 804060ad34435c1e4d3af436b7273e353f71bf86 Mon Sep 17 00:00:00 2001 From: bumi Date: Thu, 14 Jun 2018 15:00:43 +0200 Subject: [PATCH] Pass ETH signer only if it can actually sign We have seen an "no accounts" invalid operation getAddress when trying to call a contract function in the init calls. It seems ethers has a problem with a signer that does not have any accounts - even though we don't try to sign an actual transaction and only read data from the contract. This change only passes the signer if we have an unlocked web3 provider (metamask). --- app/services/kredits.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index c581665..15ed22a 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -38,36 +38,38 @@ export default Service.extend({ ); ethProvider.listAccounts().then((accounts) => { this.set('currentUserAccounts', accounts); - resolve(ethProvider); + const ethSigner = accounts.length === 0 ? null : ethProvider.getSigner(); + resolve({ + ethProvider, + ethSigner + }); }); } else { console.debug('[kredits] Creating new instance from npm module class'); networkId = parseInt(config.contractMetadata.networkId); + console.debug(`[kredits] networkId=${networkId} providerURL: ${config.web3ProviderUrl}`); ethProvider = new ethers.providers.JsonRpcProvider( config.web3ProviderUrl, { chainId: networkId } ); - resolve(ethProvider); + resolve({ + ethProvider: ethProvider, + ethSigner: null + }); } }); }, setup() { - return this.getEthProvider().then((ethProvider) => { - let ethSigner; + return this.getEthProvider().then((providerAndSigner) => { - if (ethProvider.getSigner) { - ethSigner = ethProvider.getSigner(); - } - - let kredits = new Kredits(ethProvider, ethSigner, { + let kredits = new Kredits(providerAndSigner.ethProvider, providerAndSigner.ethSigner, { ipfsConfig: config.ipfs }); return kredits .init() .then((kredits) => { this.set('kredits', kredits); - if (this.currentUserAccounts && this.currentUserAccounts.length > 0) { this.getCurrentUser.then((contributorData) => { this.set('currentUser', contributorData);