diff --git a/app/components/add-contributor/component.js b/app/components/add-contributor/component.js index b1a6d50..77483fa 100644 --- a/app/components/add-contributor/component.js +++ b/app/components/add-contributor/component.js @@ -20,7 +20,7 @@ export default Component.extend({ isValidAddress: function() { // TODO: add proper address validation return this.get('newContributor.address') !== ''; - }.property('kredits.web3', 'newContributor.address'), + }.property('kredits.ethProvider', 'newContributor.address'), isValidName: function() { return isPresent(this.get('newContributor.name')); diff --git a/app/controllers/index.js b/app/controllers/index.js index 67adbf3..1f2ecda 100644 --- a/app/controllers/index.js +++ b/app/controllers/index.js @@ -12,7 +12,7 @@ export default Ember.Controller.extend({ kredits: service(), - contractInteractionEnabled: computed.alias('kredits.web3Provided'), + contractInteractionEnabled: computed.alias('kredits.hasAccounts'), proposalsOpen: function() { let proposals = this.get('model.proposals') @@ -96,7 +96,7 @@ export default Ember.Controller.extend({ this.get('model.contributors') .findBy('id', recipientId) - .incrementProperty('kredits', amount.toNumber()); + .incrementProperty('balance', amount.toNumber()); }, _handleProposalVoted(proposalId, voter, totalVotes) { diff --git a/app/routes/index.js b/app/routes/index.js index 0d67ee6..929c567 100644 --- a/app/routes/index.js +++ b/app/routes/index.js @@ -6,16 +6,13 @@ export default Ember.Route.extend({ beforeModel(transition) { const kredits = this.get('kredits'); - - if (kredits.get('web3') && kredits.get('web3Provided')) { - kredits.get('listAccounts').then((accounts) => { - if (accounts.length === 0) { - if (confirm('It looks like you have an Ethereum wallet available. Please unlock your account.')) { - transition.retry(); - } + return kredits.initEthProvider().then((ethProvider) => { + if (kredits.get('accountNeedsUnlock')) { + if (confirm('It looks like you have an Ethereum wallet available. Please unlock your account.')) { + transition.retry(); } - }); - } + } + }); }, model() { diff --git a/app/services/kredits.js b/app/services/kredits.js index 9334dde..b1edc3c 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -28,57 +28,57 @@ export default Service.extend({ ipfs: injectService(), - web3Instance: null, - web3Provided: false, // Web3 provided (using Mist Browser, Metamask et al.) + ethProvider: null, + currentUserAccounts: null, // default to not having an account. this is the wen web3 is loaded. - web3: function() { - if (this.get('web3Provider')) { - return this.get('web3Provider'); - } + initEthProvider: function() { + return new Ember.RSVP.Promise((resolve, reject) => { + let ethProvider; + 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}); + ethProvider.listAccounts().then((accounts) => { + this.set('currentUserAccounts', accounts); + this.set('ethProvider', ethProvider) + resolve(ethProvider); + }); + } 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}); + this.set('ethProvider', ethProvider); + resolve(ethProvider); + } + window.ethProvider = ethProvider; + }); + }, - let web3Provider; - if (typeof window.web3 !== 'undefined') { - debug('[kredits] Using user-provided instance, e.g. from Mist browser or Metamask'); - let networkId = parseInt(window.web3.version.network); - web3Provider = new ethers.providers.Web3Provider(window.web3.currentProvider, {chainId: networkId}); - this.set('web3Provided', true); - } else { - debug('[kredits] Creating new instance from npm module class'); - let providerUrl = localStorage.getItem('config:web3ProviderUrl') || config.web3ProviderUrl; - let networkId = parseInt(config.contractMetadata.networkId); - web3Provider = new ethers.providers.JsonRpcProvider(providerUrl, {chainId: networkId}); - } + accountNeedsUnlock: computed('currentUserAccounts', function() { + return this.get('currentUserAccounts') && Ember.isEmpty(this.get('currentUserAccounts')); + }), - this.set('web3Provider', web3Provider); - return web3Provider; - }.property('web3Provider'), + hasAccounts: computed('currentUserAccounts', function() { + return !Ember.isEmpty(this.get('currentUserAccounts')); + }), - listAccounts: function() { - return this.get('web3').listAccounts(); - }.property('web3'), - - currentUserAccounts: function() { - // TODO: listAccounts returns now a promise - return []; - //return ethers.listAccounts(); - // return (this.get('web3Provided') && this.get('web3').eth.accounts) || []; - }.property('web3Provided', 'web3'), - - registryContract: computed('web3', function() { - let networkId = this.get('web3').chainId; - let registry = new ethers.Contract(addresses['Registry'][networkId], abis['Registry'], this.get('web3')); + registryContract: computed('ethProvider', function() { + let networkId = this.get('ethProvider').chainId; + let registry = new ethers.Contract(addresses['Registry'][networkId], abis['Registry'], this.get('ethProvider')); return registry; }), - contributorsContract: computed('web3', function() { + contributorsContract: computed('ethProvider', function() { return this.contractFor('Contributors'); }), - kreditsContract: computed('web3', function() { + kreditsContract: computed('ethProvider', function() { return this.contractFor('Operator'); }), - tokenContract: computed('web3', function() { + tokenContract: computed('ethProvider', function() { return this.contractFor('Token'); }), @@ -86,7 +86,7 @@ export default Service.extend({ return this.get('registryContract').functions.getProxyFor(name) .then((address) => { debug('[kredits] get contract', name, address); - return new ethers.Contract(address, abis[name], this.get('web3').getSigner()); + return new ethers.Contract(address, abis[name], this.get('ethProvider').getSigner()); }); }, @@ -229,7 +229,7 @@ export default Service.extend({ .then(profileHash => { contributor.setProperties({ profileHash: profileHash, - kredits: 0, + balance: 0, isCurrentUser: this.get('currentUserAccounts').includes(contributor.address) });