Skip to content

Commit 8dc624b

Browse files
committed
FiatApi: support undefined bridged rates on unavailable dates
1 parent fcd5002 commit 8dc624b

File tree

1 file changed

+18
-17
lines changed

1 file changed

+18
-17
lines changed

src/fiat-api/FiatApi.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ export async function getExchangeRates(
113113
cryptoCurrencies = cryptoCurrencies.map((currency) => currency.toLowerCase() as FiatApiSupportedCryptoCurrency);
114114

115115
// Check for bridged currencies and fetch their USD exchange rates
116-
const bridgedExchangeRatesPromises: Array<Promise<[FiatApiBridgedFiatCurrency, number]>> = [];
116+
const bridgedExchangeRatesPromises: Array<Promise<[FiatApiBridgedFiatCurrency, number | undefined]>> = [];
117117
for (const vsCurrency of vsCurrencies) {
118118
if (!_isBridgedFiatCurrency(vsCurrency)) continue;
119119
bridgedExchangeRatesPromises.push(_getBridgedFiatCurrencyExchangeRate(vsCurrency)
@@ -167,7 +167,7 @@ export async function getHistoricExchangeRatesByRange(
167167
to: number, // in milliseconds
168168
): Promise<Array<[number, number]>> {
169169
let bridgedCurrency: FiatApiHistorySupportedBridgedFiatCurrency | undefined;
170-
let bridgedExchangeRatePromise: Promise<Record<string, number>> | undefined;
170+
let bridgedExchangeRatePromise: Promise<Record<string, number | undefined>> | undefined;
171171
if (_isBridgedFiatCurrency(vsCurrency)) {
172172
bridgedCurrency = vsCurrency;
173173
bridgedExchangeRatePromise = _getHistoricBridgedFiatCurrencyExchangeRatesByRange(bridgedCurrency, from, to);
@@ -180,26 +180,25 @@ export async function getHistoricExchangeRatesByRange(
180180
from = Math.floor(from / 1000);
181181
to = Math.ceil(to / 1000);
182182
const [
183-
{ prices: result },
184-
bridgedExchangeRates,
183+
{ prices: coingeckoHistoricRates },
184+
bridgedHistoricRates,
185185
] = await Promise.all([
186186
_fetch<{ prices: Array<[number, number]> }>(
187187
`${API_URL}/coins/${coinId}/market_chart/range?vs_currency=${vsCurrency}&from=${from}&to=${to}`,
188188
),
189189
bridgedExchangeRatePromise,
190190
]);
191191

192-
if (bridgedCurrency && bridgedExchangeRates) {
193-
return result.map(([timestamp, coinUsdPrice]) => [
194-
timestamp,
195-
coinUsdPrice * bridgedExchangeRates[_getDateString(
196-
timestamp,
197-
HISTORY_SUPPORTED_BRIDGED_CURRENCY_TIMEZONES[bridgedCurrency!],
198-
)],
199-
]);
192+
if (bridgedCurrency && bridgedHistoricRates) {
193+
// Convert exchange rates to bridged currency and omit entries for which no bridged exchange rate is available.
194+
return coingeckoHistoricRates.map(([timestamp, coinUsdPrice]) => {
195+
const date = _getDateString(timestamp, HISTORY_SUPPORTED_BRIDGED_CURRENCY_TIMEZONES[bridgedCurrency!]);
196+
const bridgedHistoricRate = bridgedHistoricRates[date];
197+
return bridgedHistoricRate ? [timestamp, coinUsdPrice * bridgedHistoricRate] : null;
198+
}).filter((entry): entry is [number, number] => entry !== null);
200199
}
201200

202-
return result;
201+
return coingeckoHistoricRates;
203202
}
204203

205204
/**
@@ -365,16 +364,17 @@ function _isBridgedFiatCurrency(currency: unknown): currency is FiatApiBridgedFi
365364
}
366365

367366
/**
368-
* Get today's exchange rate to USD.
367+
* Get today's exchange rate to USD. Can be undefined if the user's clock is in the future.
369368
*/
370-
async function _getBridgedFiatCurrencyExchangeRate(bridgedFiatCurrency: FiatApiBridgedFiatCurrency): Promise<number> {
369+
async function _getBridgedFiatCurrencyExchangeRate(bridgedFiatCurrency: FiatApiBridgedFiatCurrency)
370+
: Promise<number | undefined> {
371371
switch (bridgedFiatCurrency) {
372372
case FiatApiBridgedFiatCurrency.CRC: {
373373
const crcExchangeRates = await _getHistoricBridgedFiatCurrencyExchangeRatesByRange(
374374
FiatApiBridgedFiatCurrency.CRC,
375375
Date.now(),
376376
);
377-
// There is only a single exchange rate entry which is for the current date
377+
// There is only a single exchange rate entry, if any, which is for the current date.
378378
return Object.values(crcExchangeRates)[0];
379379
}
380380
case FiatApiBridgedFiatCurrency.GMD:
@@ -397,14 +397,15 @@ async function _getHistoricBridgedFiatCurrencyExchangeRatesByRange(
397397
bridgedFiatCurrency: FiatApiHistorySupportedBridgedFiatCurrency,
398398
from: number, // in milliseconds, inclusive
399399
to: number = from, // in milliseconds, inclusive
400-
): Promise<Record<string, number>> {
400+
): Promise<Record<string, number | undefined>> {
401401
if (bridgedFiatCurrency !== FiatApiBridgedFiatCurrency.CRC) {
402402
// Currently only suported for CRC. Check for users that don't use typescript.
403403
throw new Error(`Unsupported bridged currency for historic rates: ${bridgedFiatCurrency}`);
404404
}
405405
const timezone = HISTORY_SUPPORTED_BRIDGED_CURRENCY_TIMEZONES[bridgedFiatCurrency];
406406
const fromDate = _getDateString(from, timezone);
407407
const toDate = to === from ? fromDate : _getDateString(to, timezone);
408+
// Note: entries for future dates are omitted and thus basically undefined which is reflected in the return type.
408409
return _fetch<Record<string, number>>(`https://usd-crc-historic-rate.deno.dev/api/rates/${fromDate}/${toDate}`);
409410
}
410411

0 commit comments

Comments
 (0)