From 8eb1c3006f76a0fb9b9a3495ebc99a47c862a58f Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 22 Nov 2023 17:55:51 +0000 Subject: [PATCH 1/6] refactor: abstract away getting ticker rates --- lib/plugins.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/plugins.js b/lib/plugins.js index a119e7dd..ef001f7d 100644 --- a/lib/plugins.js +++ b/lib/plugins.js @@ -225,12 +225,16 @@ function plugins (settings, deviceId) { } } + function getTickerRates (fiatCode, cryptoCode) { + return ticker.getRates(settings, fiatCode, cryptoCode) + } + function pollQueries () { const localeConfig = configManager.getLocale(deviceId, settings.config) const fiatCode = localeConfig.fiatCurrency const cryptoCodes = localeConfig.cryptoCurrencies - const tickerPromises = cryptoCodes.map(c => ticker.getRates(settings, fiatCode, c)) + const tickerPromises = cryptoCodes.map(c => getTickerRates(fiatCode, c)) const balancePromises = cryptoCodes.map(c => fiatBalance(fiatCode, c)) const networkPromises = cryptoCodes.map(c => wallet.cryptoNetwork(settings, c)) const supportsBatchingPromise = cryptoCodes.map(c => wallet.supportsBatching(settings, c)) @@ -342,7 +346,7 @@ function plugins (settings, deviceId) { function fiatBalance (fiatCode, cryptoCode) { const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config) return Promise.all([ - ticker.getRates(settings, fiatCode, cryptoCode), + getTickerRates(fiatCode, cryptoCode), wallet.balance(settings, cryptoCode) ]) .then(([rates, balanceRec]) => { @@ -832,7 +836,7 @@ function plugins (settings, deviceId) { const fiatCode = localeConfig.fiatCurrency const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config) - const tickerPromises = cryptoCodes.map(c => ticker.getRates(settings, fiatCode, c)) + const tickerPromises = cryptoCodes.map(c => getTickerRates(fiatCode, c)) return Promise.all(tickerPromises) } From 63f40da6328f93aa0a7b7866a14786d0fe688510 Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 22 Nov 2023 18:06:02 +0000 Subject: [PATCH 2/6] refactor: simplify getting pegged fiat currencies --- lib/ticker.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/ticker.js b/lib/ticker.js index afef8a72..7cf32cf8 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -38,9 +38,7 @@ function _getRates (settings, fiatCode, cryptoCode) { } function buildTicker (fiatCode, cryptoCode, tickerName) { - fiatCode = _.includes(fiatCode, _.keys(PEGGED_FIAT_CURRENCIES)) - ? PEGGED_FIAT_CURRENCIES[fiatCode] - : fiatCode + fiatCode = _.defaultTo(fiatCode, _.get([fiatCode], PEGGED_FIAT_CURRENCIES)) cryptoCode = coinUtils.getEquivalentCode(cryptoCode) if (tickerName === 'bitpay') return bitpay.ticker(fiatCode, cryptoCode) From bb57a599e081703d63af6c18eca5a5b2e223655e Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 22 Nov 2023 18:09:50 +0000 Subject: [PATCH 3/6] refactor: inline assignment with return --- lib/ticker.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/ticker.js b/lib/ticker.js index 7cf32cf8..86d77e6d 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -22,13 +22,11 @@ function _getRates (settings, fiatCode, cryptoCode) { const market = [cryptoCode, fiatCode].join('-') return buildTicker(fiatCode, cryptoCode, tickerName) - .then(r => ({ - rates: r.rates, - timestamp: Date.now() - })) .then(r => { - lastRate[market] = r - return r + return lastRate[market] = { + rates: r.rates, + timestamp: Date.now() + } }) .catch(err => { logger.error(err) From 0168fe4994f74eff954e9055fd2c5d55feab2177 Mon Sep 17 00:00:00 2001 From: siiky Date: Fri, 24 Nov 2023 18:26:46 +0000 Subject: [PATCH 4/6] feat: fallback to BitPay ticker --- lib/ticker.js | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/lib/ticker.js b/lib/ticker.js index 86d77e6d..3fe9a7ad 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -14,26 +14,32 @@ const FETCH_INTERVAL = 58000 const PEGGED_FIAT_CURRENCIES = { NAD: 'ZAR' } -function _getRates (settings, fiatCode, cryptoCode) { - return Promise.resolve() - .then(() => { - const config = settings.config - const tickerName = configManager.getWalletSettings(cryptoCode, config).ticker - const market = [cryptoCode, fiatCode].join('-') +const FALLBACK_TICKER = 'bitpay' - return buildTicker(fiatCode, cryptoCode, tickerName) - .then(r => { - return lastRate[market] = { - rates: r.rates, - timestamp: Date.now() - } - }) - .catch(err => { - logger.error(err) - return lastRate[market] - }) +const hasRatesOrReject = r => _.get(['rates'], r) ? + r : + Promise.reject(new Error("Failed to get ticker rates")) + +const get1 = (market, fiatCode, cryptoCode, ticker) => + buildTicker(fiatCode, cryptoCode, ticker) + .then(hasRatesOrReject) + .then(({ rates }) => { + return lastRate[market] = { rates, timestamp: Date.now() } }) -} + +const _getRates = (settings, fiatCode, cryptoCode) => Promise.resolve() + .then(() => { + const ticker = configManager.getWalletSettings(cryptoCode, settings.config).ticker + const market = [cryptoCode, fiatCode].join('-') + return get1(market, fiatCode, cryptoCode, ticker) + .catch(err => { + logger.error(err) + return ticker === FALLBACK_TICKER ? + lastRate[market] : + get1(market, fiatCode, cryptoCode, FALLBACK_TICKER) + }) + .then(hasRatesOrReject) + }) function buildTicker (fiatCode, cryptoCode, tickerName) { fiatCode = _.defaultTo(fiatCode, _.get([fiatCode], PEGGED_FIAT_CURRENCIES)) From 30dffce655984d8ba58141517cc4cef24d3009e7 Mon Sep 17 00:00:00 2001 From: siiky Date: Mon, 27 Nov 2023 12:33:26 +0000 Subject: [PATCH 5/6] refactor: improve ticker error messages --- lib/ticker.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/ticker.js b/lib/ticker.js index 3fe9a7ad..c25e7478 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -16,13 +16,13 @@ const PEGGED_FIAT_CURRENCIES = { NAD: 'ZAR' } const FALLBACK_TICKER = 'bitpay' -const hasRatesOrReject = r => _.get(['rates'], r) ? +const hasRatesOrReject = emsg => r => _.get(['rates'], r) ? r : - Promise.reject(new Error("Failed to get ticker rates")) + Promise.reject(new Error(emsg)) -const get1 = (market, fiatCode, cryptoCode, ticker) => +const get1 = (market, fiatCode, cryptoCode, ticker, emsg) => buildTicker(fiatCode, cryptoCode, ticker) - .then(hasRatesOrReject) + .then(hasRatesOrReject(emsg)) .then(({ rates }) => { return lastRate[market] = { rates, timestamp: Date.now() } }) @@ -31,14 +31,18 @@ const _getRates = (settings, fiatCode, cryptoCode) => Promise.resolve() .then(() => { const ticker = configManager.getWalletSettings(cryptoCode, settings.config).ticker const market = [cryptoCode, fiatCode].join('-') - return get1(market, fiatCode, cryptoCode, ticker) + const isMainFallback = ticker === FALLBACK_TICKER + const emsg = isMainFallback ? + "Failed to get ticker rates" : + "Failed to get rates with configured ticker, trying fallback" + return get1(market, fiatCode, cryptoCode, ticker, emsg) .catch(err => { logger.error(err) - return ticker === FALLBACK_TICKER ? + return isMainFallback ? lastRate[market] : - get1(market, fiatCode, cryptoCode, FALLBACK_TICKER) + get1(market, fiatCode, cryptoCode, FALLBACK_TICKER, "Failed to get rates with fallback ticker") }) - .then(hasRatesOrReject) + .then(hasRatesOrReject("Failed to get ticker rates")) }) function buildTicker (fiatCode, cryptoCode, tickerName) { From 4318fa5a86ce9383ccccccaaf03dd4ba7cf722de Mon Sep 17 00:00:00 2001 From: siiky Date: Wed, 6 Dec 2023 16:34:44 +0000 Subject: [PATCH 6/6] feat: add more fallback tickers --- lib/ticker.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/ticker.js b/lib/ticker.js index c25e7478..221235e3 100644 --- a/lib/ticker.js +++ b/lib/ticker.js @@ -14,7 +14,8 @@ const FETCH_INTERVAL = 58000 const PEGGED_FIAT_CURRENCIES = { NAD: 'ZAR' } -const FALLBACK_TICKER = 'bitpay' +const getFallbackTicker = ticker => + _.difference(['bitpay', 'kraken', 'bitstamp'], [ticker])[0] const hasRatesOrReject = emsg => r => _.get(['rates'], r) ? r : @@ -31,16 +32,16 @@ const _getRates = (settings, fiatCode, cryptoCode) => Promise.resolve() .then(() => { const ticker = configManager.getWalletSettings(cryptoCode, settings.config).ticker const market = [cryptoCode, fiatCode].join('-') - const isMainFallback = ticker === FALLBACK_TICKER - const emsg = isMainFallback ? - "Failed to get ticker rates" : - "Failed to get rates with configured ticker, trying fallback" + const fallbackTicker = getFallbackTicker(ticker) + const emsg = fallbackTicker ? + "Failed to get rates with configured ticker, trying fallback" : + "Failed to get ticker rates" return get1(market, fiatCode, cryptoCode, ticker, emsg) .catch(err => { logger.error(err) - return isMainFallback ? - lastRate[market] : - get1(market, fiatCode, cryptoCode, FALLBACK_TICKER, "Failed to get rates with fallback ticker") + return fallbackTicker ? + get1(market, fiatCode, cryptoCode, fallbackTicker, "Failed to get rates with fallback ticker") : + lastRate[market] }) .then(hasRatesOrReject("Failed to get ticker rates")) })