From 2c1bca1ab0a6284b89338d5fd36552583c960f36 Mon Sep 17 00:00:00 2001 From: kumavis Date: Fri, 2 Nov 2018 22:14:40 -0400 Subject: token-rates - protect against bad token data --- app/scripts/controllers/token-rates.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'app/scripts/controllers/token-rates.js') diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js index 87d716aa6..b6f084841 100644 --- a/app/scripts/controllers/token-rates.js +++ b/app/scripts/controllers/token-rates.js @@ -1,5 +1,5 @@ const ObservableStore = require('obs-store') -const { warn } = require('loglevel') +const log = require('loglevel') // By default, poll every 3 minutes const DEFAULT_INTERVAL = 180 * 1000 @@ -26,8 +26,11 @@ class TokenRatesController { async updateExchangeRates () { if (!this.isActive) { return } const contractExchangeRates = {} - for (const i in this._tokens) { - const address = this._tokens[i].address + // copy array to ensure its not modified during iteration + const tokens = this._tokens.slice() + for (const token of tokens) { + if (!token) return log.error(`TokenRatesController - invalid tokens state:\n${JSON.stringify(tokens, null, 2)}`) + const address = token.address contractExchangeRates[address] = await this.fetchExchangeRate(address) } this.store.putState({ contractExchangeRates }) @@ -44,7 +47,7 @@ class TokenRatesController { const json = await response.json() return json && json.length ? json[0].averagePrice : 0 } catch (error) { - warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error) + log.warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error) return 0 } } -- cgit v1.2.3 From 0549782595335e8257d1b4abf7d6220020e2c8db Mon Sep 17 00:00:00 2001 From: Paul Bouchon Date: Tue, 13 Nov 2018 14:57:43 -0500 Subject: Update Balanc3 API (#5744) * Update balanc3 API used in TokenRatesController * Remove demo URL and use nativeCurrency when fetching token rates --- app/scripts/controllers/token-rates.js | 38 ++++++++++++++-------------------- 1 file changed, 15 insertions(+), 23 deletions(-) (limited to 'app/scripts/controllers/token-rates.js') diff --git a/app/scripts/controllers/token-rates.js b/app/scripts/controllers/token-rates.js index b6f084841..a8936f13b 100644 --- a/app/scripts/controllers/token-rates.js +++ b/app/scripts/controllers/token-rates.js @@ -14,8 +14,9 @@ class TokenRatesController { * * @param {Object} [config] - Options to configure controller */ - constructor ({ interval = DEFAULT_INTERVAL, preferences } = {}) { + constructor ({ interval = DEFAULT_INTERVAL, currency, preferences } = {}) { this.store = new ObservableStore() + this.currency = currency this.preferences = preferences this.interval = interval } @@ -26,32 +27,23 @@ class TokenRatesController { async updateExchangeRates () { if (!this.isActive) { return } const contractExchangeRates = {} - // copy array to ensure its not modified during iteration - const tokens = this._tokens.slice() - for (const token of tokens) { - if (!token) return log.error(`TokenRatesController - invalid tokens state:\n${JSON.stringify(tokens, null, 2)}`) - const address = token.address - contractExchangeRates[address] = await this.fetchExchangeRate(address) + const nativeCurrency = this.currency ? this.currency.getState().nativeCurrency.toUpperCase() : 'ETH' + const pairs = this._tokens.map(token => `pairs[]=${token.address}/${nativeCurrency}`) + const query = pairs.join('&') + if (this._tokens.length > 0) { + try { + const response = await fetch(`https://exchanges.balanc3.net/pie?${query}&autoConversion=true`) + const { prices = [] } = await response.json() + prices.forEach(({ pair, price }) => { + contractExchangeRates[pair.split('/')[0]] = typeof price === 'number' ? price : 0 + }) + } catch (error) { + log.warn(`MetaMask - TokenRatesController exchange rate fetch failed.`, error) + } } this.store.putState({ contractExchangeRates }) } - /** - * Fetches a token exchange rate by address - * - * @param {String} address - Token contract address - */ - async fetchExchangeRate (address) { - try { - const response = await fetch(`https://metamask.balanc3.net/prices?from=${address}&to=ETH&autoConversion=false&summaryOnly=true`) - const json = await response.json() - return json && json.length ? json[0].averagePrice : 0 - } catch (error) { - log.warn(`MetaMask - TokenRatesController exchange rate fetch failed for ${address}.`, error) - return 0 - } - } - /** * @type {Number} */ -- cgit v1.2.3