88 lines
3 KiB
JavaScript
88 lines
3 KiB
JavaScript
const _ = require('lodash/fp')
|
|
const BN = require('../../bn')
|
|
const settingsLoader = require('../../new-settings-loader')
|
|
const configManager = require('../../new-config-manager')
|
|
const wallet = require('../../wallet')
|
|
const ticker = require('../../ticker')
|
|
const txBatching = require('../../tx-batching')
|
|
const { utils: coinUtils } = require('@lamassu/coins')
|
|
|
|
function computeCrypto(cryptoCode, _balance) {
|
|
const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode)
|
|
const unitScale = cryptoRec.unitScale
|
|
|
|
return new BN(_balance).shiftedBy(-unitScale).decimalPlaces(5)
|
|
}
|
|
|
|
function computeFiat(rate, cryptoCode, _balance) {
|
|
const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode)
|
|
const unitScale = cryptoRec.unitScale
|
|
|
|
return new BN(_balance).shiftedBy(-unitScale).times(rate).decimalPlaces(5)
|
|
}
|
|
|
|
function getSingleCoinFunding(settings, fiatCode, cryptoCode) {
|
|
const promises = [
|
|
wallet.newFunding(settings, cryptoCode),
|
|
ticker.getRates(settings, fiatCode, cryptoCode),
|
|
txBatching.getOpenBatchCryptoValue(cryptoCode),
|
|
]
|
|
|
|
return Promise.all(promises).then(([fundingRec, ratesRec, batchRec]) => {
|
|
const rates = ratesRec.rates
|
|
const rate = rates.ask.plus(rates.bid).div(2)
|
|
const fundingConfirmedBalance = fundingRec.fundingConfirmedBalance
|
|
const fiatConfirmedBalance = computeFiat(
|
|
rate,
|
|
cryptoCode,
|
|
fundingConfirmedBalance,
|
|
)
|
|
const pending = fundingRec.fundingPendingBalance.minus(batchRec)
|
|
const fiatPending = computeFiat(rate, cryptoCode, pending)
|
|
const fundingAddress = fundingRec.fundingAddress
|
|
const fundingAddressUrl = coinUtils.buildUrl(cryptoCode, fundingAddress)
|
|
|
|
return {
|
|
cryptoCode,
|
|
fundingAddress,
|
|
fundingAddressUrl,
|
|
confirmedBalance: computeCrypto(
|
|
cryptoCode,
|
|
fundingConfirmedBalance,
|
|
).toFormat(5),
|
|
pending: computeCrypto(cryptoCode, pending).toFormat(5),
|
|
fiatConfirmedBalance: fiatConfirmedBalance,
|
|
fiatPending: fiatPending,
|
|
fiatCode,
|
|
}
|
|
})
|
|
}
|
|
|
|
// Promise.allSettled not running on current version of node
|
|
const reflect = p =>
|
|
p.then(
|
|
value => ({ value, status: 'fulfilled' }),
|
|
error => ({ error: error.toString(), status: 'rejected' }),
|
|
)
|
|
|
|
function getFunding() {
|
|
return settingsLoader.loadLatest().then(settings => {
|
|
const cryptoCodes = configManager.getAllCryptoCurrencies(settings.config)
|
|
const fiatCode = configManager.getGlobalLocale(settings.config).fiatCurrency
|
|
const pareCoins = c => _.includes(c.cryptoCode, cryptoCodes)
|
|
const cryptoCurrencies = coinUtils.cryptoCurrencies()
|
|
const cryptoDisplays = _.filter(pareCoins, cryptoCurrencies)
|
|
|
|
const promises = cryptoDisplays.map(it =>
|
|
getSingleCoinFunding(settings, fiatCode, it.cryptoCode),
|
|
)
|
|
return Promise.all(promises.map(reflect)).then(response => {
|
|
const mapped = response.map(it =>
|
|
_.merge({ errorMsg: it.error }, it.value),
|
|
)
|
|
return _.toArray(_.merge(mapped, cryptoDisplays))
|
|
})
|
|
})
|
|
}
|
|
|
|
module.exports = { getFunding }
|