Merge pull request #1629 from siiky/feat/lam-961/fallback-ticker-8.1

LAM-961 [8.1] feat: add ticker fallback
This commit is contained in:
Rafael Taranto 2023-12-19 01:29:57 +00:00 committed by GitHub
commit 29e8d9a37a
2 changed files with 37 additions and 26 deletions

View file

@ -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)
}

View file

@ -14,33 +14,40 @@ 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 getFallbackTicker = ticker =>
_.difference(['bitpay', 'kraken', 'bitstamp'], [ticker])[0]
return buildTicker(fiatCode, cryptoCode, tickerName)
.then(r => ({
rates: r.rates,
timestamp: Date.now()
}))
.then(r => {
lastRate[market] = r
return r
})
.catch(err => {
logger.error(err)
return lastRate[market]
})
const hasRatesOrReject = emsg => r => _.get(['rates'], r) ?
r :
Promise.reject(new Error(emsg))
const get1 = (market, fiatCode, cryptoCode, ticker, emsg) =>
buildTicker(fiatCode, cryptoCode, ticker)
.then(hasRatesOrReject(emsg))
.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('-')
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 fallbackTicker ?
get1(market, fiatCode, cryptoCode, fallbackTicker, "Failed to get rates with fallback ticker") :
lastRate[market]
})
.then(hasRatesOrReject("Failed to get ticker rates"))
})
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)