Merge pull request #1618 from siiky/feat/lam-961/fallback-ticker
LAM-961 [8.6] feat: add ticker fallback
This commit is contained in:
commit
49d6760ae7
3 changed files with 39 additions and 28 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue