def test_get_current_xratescom_exchange_rates(): rates_map = get_current_xratescom_exchange_rates(A_USD) for asset, price in rates_map.items(): assert asset.is_fiat() assert price is not None and price > ZERO rates_map = get_current_xratescom_exchange_rates(A_CNY) for asset, price in rates_map.items(): assert asset.is_fiat() assert price is not None and price > ZERO
def _query_fiat_pair(base: Asset, quote: Asset) -> Price: """Queries the current price between two fiat assets If a current price is not found but a cached price within 30 days is found then that one is used. May raise RemoteError if a price can not be found """ if base == quote: return Price(FVal('1')) now = ts_now() # Check cache for a price within the last 24 hrs price_cache_entry = GlobalDBHandler().get_historical_price( from_asset=base, to_asset=quote, timestamp=now, max_seconds_distance=DAY_IN_SECONDS, ) if price_cache_entry: return price_cache_entry.price # Use the xratescom query and save all prices in the cache price = None try: price_map = get_current_xratescom_exchange_rates(base) for quote_asset, quote_price in price_map.items(): if quote_asset == quote: # if the quote asset price is found return it price = quote_price GlobalDBHandler().add_historical_prices(entries=[ HistoricalPrice( from_asset=base, to_asset=quote_asset, source=HistoricalPriceOracle.XRATESCOM, timestamp=timestamp_to_daystart_timestamp(now), price=quote_price, ) ]) if price: # the quote asset may not be found return price except RemoteError: pass # price remains None # query backup api price = _query_currency_converterapi(base, quote) if price is not None: return price # Check cache price_cache_entry = GlobalDBHandler().get_historical_price( from_asset=base, to_asset=quote, timestamp=now, max_seconds_distance=MONTH_IN_SECONDS, ) if price_cache_entry: log.debug( f'Could not query online apis for a fiat price. ' f'Used cached value from ' f'{(now - price_cache_entry.timestamp) / DAY_IN_SECONDS} days ago.', base_currency=base.identifier, quote_currency=quote.identifier, price=price_cache_entry.price, ) return price_cache_entry.price # else raise RemoteError( f'Could not find a current {base.identifier} price for {quote.identifier}', )