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 }