1 |
|
2 | import fetch from 'node-fetch'
|
3 | import ECBBackend from './ecb'
|
4 | import { fromPairs } from 'lodash'
|
5 |
|
6 | const COINMARKETCAP_API = 'https://api.coinmarketcap.com/v1/ticker/'
|
7 | const ROUNDING_FACTOR = 100000000
|
8 |
|
9 | export default class ECBAndCoinMarketCapBackend extends ECBBackend {
|
10 | async connect () {
|
11 | await super.connect()
|
12 | const ccRates = await this._getCCRates(this.rates.USD)
|
13 | Object.assign(this.rates, ccRates)
|
14 | this.currencies = this.currencies.concat(Object.keys(ccRates))
|
15 | this.currencies.sort()
|
16 | }
|
17 |
|
18 | private async _getCCRates (usdRate: number) {
|
19 | const rateRes = await fetch(COINMARKETCAP_API)
|
20 | if (rateRes.status !== 200) {
|
21 | throw new Error('Unexpected status from coinmarketcap.com: ' + rateRes.status)
|
22 | }
|
23 | const body = await rateRes.json()
|
24 | return fromPairs(body.map((rateInfo: any) => {
|
25 | return [rateInfo.symbol, Math.floor(ROUNDING_FACTOR / (rateInfo.price_usd * usdRate)) / ROUNDING_FACTOR]
|
26 | }))
|
27 | }
|
28 | }
|