From 75650c19ab3dc780c28154b979082a092dd9d005 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Sat, 21 Apr 2018 11:05:02 +0200 Subject: [PATCH 1/5] Cleanup kredits service --- app/components/add-contributor/component.js | 6 +- app/components/add-proposal/component.js | 4 +- app/services/kredits.js | 69 +++++++++------------ app/utils/cps/bignumber.js | 7 ++- config/environment.js | 19 ++---- 5 files changed, 46 insertions(+), 59 deletions(-) diff --git a/app/components/add-contributor/component.js b/app/components/add-contributor/component.js index 1bbda96..76d253b 100644 --- a/app/components/add-contributor/component.js +++ b/app/components/add-contributor/component.js @@ -24,10 +24,8 @@ export default Component.extend({ this.reset(); }, - isValidAccount: computed('kredits.ethProvider', 'account', function() { - // TODO: add proper address validation - return this.account !== ''; - }), + // TODO: add proper address validation + isValidAccount: notEmpty('account'), isValidName: notEmpty('name'), isValidURL: notEmpty('url'), isValidGithubUID: notEmpty('github_uid'), diff --git a/app/components/add-proposal/component.js b/app/components/add-proposal/component.js index 567107a..3c2ccb7 100644 --- a/app/components/add-proposal/component.js +++ b/app/components/add-proposal/component.js @@ -19,13 +19,13 @@ export default Component.extend({ contributors: [], - isValidRecipient: notEmpty('contributorId'), + isValidContributor: notEmpty('contributorId'), isValidAmount: computed('amount', function() { return parseInt(this.amount, 10) > 0; }), isValidDescription: notEmpty('description'), isValidUrl: notEmpty('url'), - isValid: and('isValidRecipient', + isValid: and('isValidContributor', 'isValidAmount', 'isValidDescription'), diff --git a/app/services/kredits.js b/app/services/kredits.js index 9642fc8..149fa9f 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -1,32 +1,29 @@ +import ethers from 'npm:ethers'; +import Kredits from 'npm:kredits-contracts'; +import RSVP from 'rsvp'; + import Service from '@ember/service'; import { computed } from '@ember/object'; -import { alias } from '@ember/object/computed'; -import { isEmpty, isPresent } from '@ember/utils'; -import RSVP from 'rsvp'; -import Kredits from 'npm:kredits-contracts'; -import Contributor from 'kredits-web/models/contributor' -import Proposal from 'kredits-web/models/proposal' -import ethers from 'npm:ethers'; +import { alias, notEmpty } from '@ember/object/computed'; +import { isEmpty } from '@ember/utils'; import config from 'kredits-web/config/environment'; +import Contributor from 'kredits-web/models/contributor' +import Proposal from 'kredits-web/models/proposal' + export default Service.extend({ - ethProvider: null, currentUserAccounts: null, // default to not having an account. this is the wen web3 is loaded. currentUser: null, - currentUserIsContributor: computed('currentUser', function() { - return isPresent(this.currentUser); - }), + currentUserIsContributor: notEmpty('currentUser'), currentUserIsCore: alias('currentUser.isCore'), - hasAccounts: computed('currentUserAccounts', function() { - return !isEmpty(this.currentUserAccounts); - }), + hasAccounts: notEmpty('currentUserAccounts'), accountNeedsUnlock: computed('currentUserAccounts', function() { return this.currentUserAccounts && isEmpty(this.currentUserAccounts); }), - // this is called called in the routes beforeModel(). So it is initialized before everything else + // this is called in the routes beforeModel(). So it is initialized before everything else // and we can rely on the ethProvider and the potential currentUserAccounts to be available initEthProvider: function() { return new RSVP.Promise((resolve) => { @@ -35,32 +32,38 @@ export default Service.extend({ if (typeof window.web3 !== 'undefined') { console.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 = new ethers.providers.Web3Provider( + window.web3.currentProvider, + { chainId: networkId } + ); ethProvider.listAccounts().then((accounts) => { this.set('currentUserAccounts', accounts); - this.set('ethProvider', ethProvider); resolve(ethProvider); }); } else { console.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); + ethProvider = new ethers.providers.JsonRpcProvider( + config.web3ProviderUrl, + { chainId: networkId } + ); resolve(ethProvider); } - window.ethProvider = ethProvider; }); }, setup() { return this.initEthProvider().then((ethProvider) => { - let signer = ethProvider.getSigner(); - return Kredits.setup(ethProvider, signer, config.ipfs).then((kredits) => { + let ethSigner; + + if (ethProvider.getSigner) { + ethSigner = ethProvider.getSigner(); + } + + return Kredits.setup(ethProvider, ethSigner, config.ipfs).then((kredits) => { this.set('kredits', kredits); - // TODO: Cleanup - if (this.currentUserAccounts.length > 0) { + if (this.currentUserAccounts && this.currentUserAccounts.length > 0) { this.getCurrentUser.then((contributorData) => { this.set('currentUser', contributorData); }); @@ -84,15 +87,6 @@ export default Service.extend({ .then(proposals => this.proposals.pushObjects(proposals)) }, - // TODO: Only assign valid attributes - // buildModel(name, attributes) { - // console.debug('[kredits] build', name, attributes); - // let model = getOwner(this).lookup(`model:${name}`); - // - // model.setProperties(attributes); - // return model; - // }, - addContributor(attributes) { console.debug('[kredits] add contributor', attributes); @@ -143,8 +137,7 @@ export default Service.extend({ }); }, - // TODO: Cleanup - getCurrentUser: computed('ethProvider', function() { + getCurrentUser: computed('kredits.provider', function() { if (isEmpty(this.currentUserAccounts)) { return RSVP.resolve(); } @@ -188,8 +181,8 @@ export default Service.extend({ this.kredits.Operator.getById(proposalId) .then((proposal) => { - proposal = this.buildModel('proposal', proposal); - this.proposals.pushObject(proposal); + proposal.contributor = this.contributors.findBy('id', proposal.contributorId.toString()); + this.proposals.pushObject(Proposal.create(proposal)); }); }, diff --git a/app/utils/cps/bignumber.js b/app/utils/cps/bignumber.js index 2bf5bf7..d194685 100644 --- a/app/utils/cps/bignumber.js +++ b/app/utils/cps/bignumber.js @@ -4,7 +4,12 @@ import ethers from 'npm:ethers'; export default function(dependentKey, converterMethod) { return computed(dependentKey, { get () { - return this.get(dependentKey)[converterMethod](); + let value = this.get(dependentKey); + if (value && ethers.utils.isBigNumber(value)) { + return value[converterMethod](); + } else { + return value; + } }, set (key, value) { value = ethers.utils.bigNumberify(value); diff --git a/config/environment.js b/config/environment.js index d9d9dd0..7ac939e 100644 --- a/config/environment.js +++ b/config/environment.js @@ -35,7 +35,7 @@ module.exports = function(environment) { ] }, - contractMetadata: {}, + contractMetadata: { networkId: '42' }, web3ProviderUrl: 'https://parity.kosmos.org:8545', @@ -46,19 +46,8 @@ module.exports = function(environment) { } }; - ENV.contractMetadata['networkId'] = "42"; - - if (process.env.OPERATOR_CONTRACT_ADDR) { - ENV.contractMetadata['Operator'] = { - address: process.env.OPERATOR_CONTRACT_ADDR, - networkId: ENV.contractMetadata['networkId'] - }; - } - if (process.env.TOKEN_CONTRACT_ADDR) { - ENV.contractMetadata['Token'] = { - address: process.env.TOKEN_CONTRACT_ADDR, - networkId: ENV.contractMetadata['networkId'] - }; + if (process.env.NETWORK_ID) { + ENV.contractMetadata['networkId'] = process.env.NETWORK_ID; } if (process.env.WEB3_PROVIDER_URL) { ENV.web3ProviderUrl = process.env.WEB3_PROVIDER_URL; @@ -70,6 +59,8 @@ module.exports = function(environment) { // ENV.APP.LOG_TRANSITIONS = true; // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; // ENV.APP.LOG_VIEW_LOOKUPS = true; + ENV.contractMetadata['networkId'] = '100'; + ENV.ipfs = { host: 'localhost', port: '5001', From 8fed06b49421cf9e2b9ca4ca2125066e025167b2 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Sat, 21 Apr 2018 11:15:13 +0200 Subject: [PATCH 2/5] Rename initEthProvider to getEthProvider --- app/services/kredits.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index 149fa9f..b4158df 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -25,7 +25,7 @@ export default Service.extend({ // this is called in the routes beforeModel(). So it is initialized before everything else // and we can rely on the ethProvider and the potential currentUserAccounts to be available - initEthProvider: function() { + getEthProvider: function() { return new RSVP.Promise((resolve) => { let ethProvider; let networkId; @@ -53,7 +53,7 @@ export default Service.extend({ }, setup() { - return this.initEthProvider().then((ethProvider) => { + return this.getEthProvider().then((ethProvider) => { let ethSigner; if (ethProvider.getSigner) { From 7083d2369d0f61a4aaadb4e928ad6d5eea00396c Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Sat, 21 Apr 2018 11:20:47 +0200 Subject: [PATCH 3/5] Fix eslint --- app/components/add-contributor/component.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/add-contributor/component.js b/app/components/add-contributor/component.js index 76d253b..646b4f3 100644 --- a/app/components/add-contributor/component.js +++ b/app/components/add-contributor/component.js @@ -1,5 +1,4 @@ import Component from '@ember/component'; -import { computed } from '@ember/object'; import { and, notEmpty } from '@ember/object/computed'; import { inject as injectService } from '@ember/service'; From 1b2b1bd4479b42ce0996f990e90f0d6d0e509a9e Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Sat, 21 Apr 2018 11:34:41 +0200 Subject: [PATCH 4/5] Fix contributor deserialize test --- .../lib/kredits/serializers/contributor-test.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/unit/lib/kredits/serializers/contributor-test.js b/tests/unit/lib/kredits/serializers/contributor-test.js index 21a4d74..f7d1d94 100644 --- a/tests/unit/lib/kredits/serializers/contributor-test.js +++ b/tests/unit/lib/kredits/serializers/contributor-test.js @@ -42,6 +42,19 @@ module('Serializers contributor', function() { let expected = { name: 'Satoshi Nakamoto', kind: 'person', + accounts: [ + { + "site": "github.com", + "uid": 123, + "url": "https://github.com/therealsatoshi", + "username": "therealsatoshi" + }, + { + "site": "wiki.kosmos.org", + "url": "https://wiki.kosmos.org/User:Satoshi", + "username": "Satoshi" + } + ], github_uid: 123, github_username: 'therealsatoshi', wiki_username: 'Satoshi', From acd1ce28f4e02568cba9b949abf25ab860a4e5d4 Mon Sep 17 00:00:00 2001 From: Manuel Wiedenmann Date: Sat, 21 Apr 2018 11:58:17 +0200 Subject: [PATCH 5/5] Use .init() instead of static .setup() --- app/services/kredits.js | 5 ++++- config/environment.js | 15 ++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/app/services/kredits.js b/app/services/kredits.js index b4158df..ca1e74a 100644 --- a/app/services/kredits.js +++ b/app/services/kredits.js @@ -60,7 +60,10 @@ export default Service.extend({ ethSigner = ethProvider.getSigner(); } - return Kredits.setup(ethProvider, ethSigner, config.ipfs).then((kredits) => { + let kredits = new Kredits(ethProvider, ethSigner); + return kredits + .init() + .then((kredits) => { this.set('kredits', kredits); if (this.currentUserAccounts && this.currentUserAccounts.length > 0) { diff --git a/config/environment.js b/config/environment.js index 7ac939e..1ecf71b 100644 --- a/config/environment.js +++ b/config/environment.js @@ -46,13 +46,6 @@ module.exports = function(environment) { } }; - if (process.env.NETWORK_ID) { - ENV.contractMetadata['networkId'] = process.env.NETWORK_ID; - } - if (process.env.WEB3_PROVIDER_URL) { - ENV.web3ProviderUrl = process.env.WEB3_PROVIDER_URL; - } - if (environment === 'development') { // ENV.APP.LOG_RESOLVER = true; // ENV.APP.LOG_ACTIVE_GENERATION = true; @@ -60,6 +53,7 @@ module.exports = function(environment) { // ENV.APP.LOG_TRANSITIONS_INTERNAL = true; // ENV.APP.LOG_VIEW_LOOKUPS = true; ENV.contractMetadata['networkId'] = '100'; + ENV.web3ProviderUrl = 'http://localhost:7545'; ENV.ipfs = { host: 'localhost', @@ -84,5 +78,12 @@ module.exports = function(environment) { // here you can enable a production-specific feature } + if (process.env.NETWORK_ID) { + ENV.contractMetadata['networkId'] = process.env.NETWORK_ID; + } + if (process.env.WEB3_PROVIDER_URL) { + ENV.web3ProviderUrl = process.env.WEB3_PROVIDER_URL; + } + return ENV; };