mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2024-11-20 10:39:59 +01:00
4e6c30a909
Run via `make test`
81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
import httpx
|
|
import json
|
|
import os
|
|
|
|
fiat_currencies = json.load(
|
|
open(
|
|
os.path.join(
|
|
os.path.dirname(os.path.realpath(__file__)), "fiat_currencies.json"
|
|
),
|
|
"r",
|
|
)
|
|
)
|
|
|
|
exchange_rate_providers = {
|
|
"bitfinex": {
|
|
"name": "Bitfinex",
|
|
"domain": "bitfinex.com",
|
|
"api_url": "https://api.bitfinex.com/v1/pubticker/{from}{to}",
|
|
"getter": lambda data, replacements: data["last_price"],
|
|
},
|
|
"bitstamp": {
|
|
"name": "Bitstamp",
|
|
"domain": "bitstamp.net",
|
|
"api_url": "https://www.bitstamp.net/api/v2/ticker/{from}{to}/",
|
|
"getter": lambda data, replacements: data["last"],
|
|
},
|
|
"coinbase": {
|
|
"name": "Coinbase",
|
|
"domain": "coinbase.com",
|
|
"api_url": "https://api.coinbase.com/v2/exchange-rates?currency={FROM}",
|
|
"getter": lambda data, replacements: data["data"]["rates"][replacements["TO"]],
|
|
},
|
|
"coinmate": {
|
|
"name": "CoinMate",
|
|
"domain": "coinmate.io",
|
|
"api_url": "https://coinmate.io/api/ticker?currencyPair={FROM}_{TO}",
|
|
"getter": lambda data, replacements: data["data"]["last"],
|
|
},
|
|
"kraken": {
|
|
"name": "Kraken",
|
|
"domain": "kraken.com",
|
|
"api_url": "https://api.kraken.com/0/public/Ticker?pair=XBT{TO}",
|
|
"getter": lambda data, replacements: data["result"][
|
|
"XXBTZ" + replacements["TO"]
|
|
]["c"][0],
|
|
},
|
|
}
|
|
|
|
exchange_rate_providers_serializable = {}
|
|
for ref, exchange_rate_provider in exchange_rate_providers.items():
|
|
exchange_rate_provider_serializable = {}
|
|
for key, value in exchange_rate_provider.items():
|
|
if not callable(value):
|
|
exchange_rate_provider_serializable[key] = value
|
|
exchange_rate_providers_serializable[ref] = exchange_rate_provider_serializable
|
|
|
|
|
|
async def fetch_fiat_exchange_rate(currency: str, provider: str):
|
|
|
|
replacements = {
|
|
"FROM": "BTC",
|
|
"from": "btc",
|
|
"TO": currency.upper(),
|
|
"to": currency.lower(),
|
|
}
|
|
|
|
url = exchange_rate_providers[provider]["api_url"]
|
|
if url:
|
|
for key in replacements.keys():
|
|
url = url.replace("{" + key + "}", replacements[key])
|
|
async with httpx.AsyncClient() as client:
|
|
r = await client.get(url)
|
|
r.raise_for_status()
|
|
data = r.json()
|
|
else:
|
|
data = {}
|
|
|
|
getter = exchange_rate_providers[provider]["getter"]
|
|
rate = float(getter(data, replacements))
|
|
return rate
|