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

LAM-961 [8.6] feat: add ticker fallback
This commit is contained in:
Rafael Taranto 2023-12-28 22:56:43 +00:00 committed by GitHub
commit 49d6760ae7
3 changed files with 39 additions and 28 deletions

View file

@ -57,8 +57,8 @@ function postProcess (txVector, justAuthorized, pi) {
if ((newTx.dispense && !oldTx.dispense) || (newTx.redeem && !oldTx.redeem)) { if ((newTx.dispense && !oldTx.dispense) || (newTx.redeem && !oldTx.redeem)) {
return pi.buildAvailableUnits(newTx.id) return pi.buildAvailableUnits(newTx.id)
.then(_units => { .then(units => {
const units = _.concat(_units.cassettes, _units.recyclers) units = _.concat(units.cassettes, units.recyclers)
logger.silly('Computing bills to dispense:', { logger.silly('Computing bills to dispense:', {
txId: newTx.id, txId: newTx.id,
units: units, units: units,

View file

@ -274,12 +274,16 @@ function plugins (settings, deviceId) {
} }
} }
function getTickerRates (fiatCode, cryptoCode) {
return ticker.getRates(settings, fiatCode, cryptoCode)
}
function pollQueries () { function pollQueries () {
const localeConfig = configManager.getLocale(deviceId, settings.config) const localeConfig = configManager.getLocale(deviceId, settings.config)
const fiatCode = localeConfig.fiatCurrency const fiatCode = localeConfig.fiatCurrency
const cryptoCodes = localeConfig.cryptoCurrencies 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 balancePromises = cryptoCodes.map(c => fiatBalance(fiatCode, c))
const networkPromises = cryptoCodes.map(c => wallet.cryptoNetwork(settings, c)) const networkPromises = cryptoCodes.map(c => wallet.cryptoNetwork(settings, c))
const supportsBatchingPromise = cryptoCodes.map(c => wallet.supportsBatching(settings, c)) const supportsBatchingPromise = cryptoCodes.map(c => wallet.supportsBatching(settings, c))
@ -394,7 +398,7 @@ function plugins (settings, deviceId) {
function fiatBalance (fiatCode, cryptoCode) { function fiatBalance (fiatCode, cryptoCode) {
const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config) const commissions = configManager.getCommissions(cryptoCode, deviceId, settings.config)
return Promise.all([ return Promise.all([
ticker.getRates(settings, fiatCode, cryptoCode), getTickerRates(fiatCode, cryptoCode),
wallet.balance(settings, cryptoCode) wallet.balance(settings, cryptoCode)
]) ])
.then(([rates, balanceRec]) => { .then(([rates, balanceRec]) => {
@ -965,7 +969,7 @@ function plugins (settings, deviceId) {
const fiatCode = localeConfig.fiatCurrency const fiatCode = localeConfig.fiatCurrency
const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config) 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) return Promise.all(tickerPromises)
} }

View file

@ -14,33 +14,40 @@ const FETCH_INTERVAL = 58000
const PEGGED_FIAT_CURRENCIES = { NAD: 'ZAR' } const PEGGED_FIAT_CURRENCIES = { NAD: 'ZAR' }
function _getRates (settings, fiatCode, cryptoCode) { const getFallbackTicker = ticker =>
return Promise.resolve() _.difference(['bitpay', 'kraken', 'bitstamp'], [ticker])[0]
.then(() => {
const config = settings.config
const tickerName = configManager.getWalletSettings(cryptoCode, config).ticker
const market = [cryptoCode, fiatCode].join('-')
return buildTicker(fiatCode, cryptoCode, tickerName) const hasRatesOrReject = emsg => r => _.get(['rates'], r) ?
.then(r => ({ r :
rates: r.rates, Promise.reject(new Error(emsg))
timestamp: Date.now()
})) const get1 = (market, fiatCode, cryptoCode, ticker, emsg) =>
.then(r => { buildTicker(fiatCode, cryptoCode, ticker)
lastRate[market] = r .then(hasRatesOrReject(emsg))
return r .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 => { .catch(err => {
logger.error(err) logger.error(err)
return lastRate[market] 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) { function buildTicker (fiatCode, cryptoCode, tickerName) {
fiatCode = _.includes(fiatCode, _.keys(PEGGED_FIAT_CURRENCIES)) fiatCode = _.defaultTo(fiatCode, _.get([fiatCode], PEGGED_FIAT_CURRENCIES))
? PEGGED_FIAT_CURRENCIES[fiatCode]
: fiatCode
cryptoCode = coinUtils.getEquivalentCode(cryptoCode) cryptoCode = coinUtils.getEquivalentCode(cryptoCode)
if (tickerName === 'bitpay') return bitpay.ticker(fiatCode, cryptoCode) if (tickerName === 'bitpay') return bitpay.ticker(fiatCode, cryptoCode)