diff --git a/lib/currencies.json b/lib/currencies.json index 81680d10..7d241d84 100644 --- a/lib/currencies.json +++ b/lib/currencies.json @@ -1,635 +1,7 @@ { - "BTCChina": [ - "CNY" - ], - "BitPay": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTC", - "BTN", - "BWP", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNY", - "COP", - "CRC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ETB", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "INR", - "IQD", - "IRR", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "STD", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XOF", - "XPF", - "YER", - "ZAR", - "ZMW", - "ZWL" - ], - "BitStamp": [ - "USD" - ], - "BitcoinAverage": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNH", - "CNY", - "COP", - "CRC", - "CUC", - "CUP", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EGP", - "ERN", - "ETB", - "ETH", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GGP", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "IMP", - "INR", - "IQD", - "IRR", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KPW", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LTC", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SDG", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SVC", - "SYP", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XDR", - "XOF", - "XPD", - "XPF", - "XPT", - "XRP", - "YER", - "ZAR", - "ZEC", - "ZMW", - "ZWL" - ], - "Bitmarket": [ - "PLN" - ], - "Bitso": [ - "MXN" - ], - "Bitvalor": [ - "BRL" - ], - "BlockchainInfo": [ - "AUD", - "BRL", - "CAD", - "CHF", - "CLP", - "CNY", - "DKK", - "EUR", - "GBP", - "HKD", - "INR", - "ISK", - "JPY", - "KRW", - "NZD", - "PLN", - "RUB", - "SEK", - "SGD", - "THB", - "TWD", - "USD" - ], - "Coinbase": [ - "AED", - "AFN", - "ALL", - "AMD", - "ANG", - "AOA", - "ARS", - "AUD", - "AWG", - "AZN", - "BAM", - "BBD", - "BDT", - "BGN", - "BHD", - "BIF", - "BMD", - "BND", - "BOB", - "BRL", - "BSD", - "BTN", - "BWP", - "BYN", - "BYR", - "BZD", - "CAD", - "CDF", - "CHF", - "CLF", - "CLP", - "CNY", - "COP", - "CRC", - "CUC", - "CVE", - "CZK", - "DJF", - "DKK", - "DOP", - "DZD", - "EEK", - "EGP", - "ERN", - "ETB", - "ETH", - "EUR", - "FJD", - "FKP", - "GBP", - "GEL", - "GGP", - "GHS", - "GIP", - "GMD", - "GNF", - "GTQ", - "GYD", - "HKD", - "HNL", - "HRK", - "HTG", - "HUF", - "IDR", - "ILS", - "IMP", - "INR", - "IQD", - "ISK", - "JEP", - "JMD", - "JOD", - "JPY", - "KES", - "KGS", - "KHR", - "KMF", - "KRW", - "KWD", - "KYD", - "KZT", - "LAK", - "LBP", - "LKR", - "LRD", - "LSL", - "LTC", - "LTL", - "LVL", - "LYD", - "MAD", - "MDL", - "MGA", - "MKD", - "MMK", - "MNT", - "MOP", - "MRO", - "MTL", - "MUR", - "MVR", - "MWK", - "MXN", - "MYR", - "MZN", - "NAD", - "NGN", - "NIO", - "NOK", - "NPR", - "NZD", - "OMR", - "PAB", - "PEN", - "PGK", - "PHP", - "PKR", - "PLN", - "PYG", - "QAR", - "RON", - "RSD", - "RUB", - "RWF", - "SAR", - "SBD", - "SCR", - "SEK", - "SGD", - "SHP", - "SLL", - "SOS", - "SRD", - "SSP", - "STD", - "SVC", - "SZL", - "THB", - "TJS", - "TMT", - "TND", - "TOP", - "TRY", - "TTD", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "UYU", - "UZS", - "VEF", - "VND", - "VUV", - "WST", - "XAF", - "XAG", - "XAU", - "XCD", - "XDR", - "XOF", - "XPD", - "XPF", - "XPT", - "YER", - "ZAR", - "ZMK", - "ZMW", - "ZWL" - ], - "Coinsecure": [ - "INR" - ], - "Foxbit": [ - "BRL" - ], - "Kraken": [ - "CAD", - "EUR", - "GBP", - "JPY", - "USD" - ], - "LocalBitcoins": [ - "AED", - "ARS", - "AUD", - "BDT", - "BRL", - "BYN", - "CAD", - "CHF", - "CLP", - "CNY", - "COP", - "CRC", - "CZK", - "DKK", - "DOP", - "EGP", - "EUR", - "GBP", - "GHS", - "HKD", - "HRK", - "HUF", - "IDR", - "INR", - "IRR", - "ISK", - "JPY", - "KES", - "KZT", - "MAD", - "MMK", - "MXN", - "MYR", - "NGN", - "NOK", - "NZD", - "OMR", - "PAB", - "PEN", - "PHP", - "PKR", - "PLN", - "QAR", - "RON", - "RSD", - "RUB", - "SAR", - "SEK", - "SGD", - "THB", - "TRY", - "TWD", - "TZS", - "UAH", - "UGX", - "USD", - "VEF", - "VND", - "XAF", - "ZAR" - ], - "MercadoBitcoin": [ - "BRL" - ], - "NegocieCoins": [ - "BRL" - ], - "Winkdex": [ - "USD" - ], - "WEX": [ + "CryptoCompare": [ + "USD", "EUR", - "RUB", - "USD" - ], - "itBit": [] -} \ No newline at end of file + "CNY" + ] +} diff --git a/lib/exchange_rate.py b/lib/exchange_rate.py index ff739e92..cda60480 100644 --- a/lib/exchange_rate.py +++ b/lib/exchange_rate.py @@ -83,241 +83,15 @@ class ExchangeBase(PrintError): def get_currencies(self): rates = self.get_rates('') - return sorted([str(a) for (a, b) in rates.items() if b is not None and len(a)==3]) + return sorted([str(a) for (a, b) in rates.items() if b is not None and len(a) in [3,4]]) -class BitcoinAverage(ExchangeBase): - +class CryptoCompare(ExchangeBase): def get_rates(self, ccy): - json = self.get_json('apiv2.bitcoinaverage.com', '/indices/global/ticker/short') - return dict([(r.replace("BTC", ""), Decimal(json[r]['last'])) - for r in json if r != 'timestamp']) + json = self.get_json('min-api.cryptocompare.com', + "/data/pricehistorical?fsym=ZCL&tsyms=USD") + return {'USD': Decimal(json['ZCL']['USD'])} - def history_ccys(self): - return ['AUD', 'BRL', 'CAD', 'CHF', 'CNY', 'EUR', 'GBP', 'IDR', 'ILS', - 'MXN', 'NOK', 'NZD', 'PLN', 'RON', 'RUB', 'SEK', 'SGD', 'USD', - 'ZAR'] - - def historical_rates(self, ccy): - history = self.get_csv('apiv2.bitcoinaverage.com', - "/indices/global/history/BTC%s?period=alltime&format=csv" % ccy) - return dict([(h['DateTime'][:10], h['Average']) - for h in history]) - - -class Bitcointoyou(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('bitcointoyou.com', "/API/ticker.aspx") - return {'BRL': Decimal(json['ticker']['last'])} - - def history_ccys(self): - return ['BRL'] - - -class BitcoinVenezuela(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('api.bitcoinvenezuela.com', '/') - rates = [(r, json['BTC'][r]) for r in json['BTC'] - if json['BTC'][r] is not None] # Giving NULL for LTC - return dict(rates) - - def history_ccys(self): - return ['ARS', 'EUR', 'USD', 'VEF'] - - def historical_rates(self, ccy): - return self.get_json('api.bitcoinvenezuela.com', - "/historical/index.php?coin=BTC")[ccy +'_BTC'] - - -class Bitmarket(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('www.bitmarket.pl', '/json/BTCPLN/ticker.json') - return {'PLN': Decimal(json['last'])} - - -class BitPay(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('bitpay.com', '/api/rates') - return dict([(r['code'], Decimal(r['rate'])) for r in json]) - - -class Bitso(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('api.bitso.com', '/v2/ticker') - return {'MXN': Decimal(json['last'])} - - -class BitStamp(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('www.bitstamp.net', '/api/ticker/') - return {'USD': Decimal(json['last'])} - - -class Bitvalor(ExchangeBase): - - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') - return {'BRL': Decimal(json['ticker_1h']['total']['last'])} - - -class BlockchainInfo(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('blockchain.info', '/ticker') - return dict([(r, Decimal(json[r]['15m'])) for r in json]) - - -class BTCChina(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('data.btcchina.com', '/data/ticker') - return {'CNY': Decimal(json['ticker']['last'])} - - -class BTCParalelo(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('btcparalelo.com', '/api/price') - return {'VEF': Decimal(json['price'])} - - -class Coinbase(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('coinbase.com', - '/api/v1/currencies/exchange_rates') - return dict([(r[7:].upper(), Decimal(json[r])) - for r in json if r.startswith('btc_to_')]) - - -class CoinDesk(ExchangeBase): - - def get_rates(self, ccy): - dicts = self.get_json('api.coindesk.com', - '/v1/bpi/supported-currencies.json') - json = self.get_json('api.coindesk.com', - '/v1/bpi/currentprice/%s.json' % ccy) - ccys = [d['currency'] for d in dicts] - result = dict.fromkeys(ccys) - result[ccy] = Decimal(json['bpi'][ccy]['rate_float']) - return result - - def history_starts(self): - return { 'USD': '2012-11-30' } - - def history_ccys(self): - return self.history_starts().keys() - - def historical_rates(self, ccy): - start = self.history_starts()[ccy] - end = datetime.today().strftime('%Y-%m-%d') - # Note ?currency and ?index don't work as documented. Sigh. - query = ('/v1/bpi/historical/close.json?start=%s&end=%s' - % (start, end)) - json = self.get_json('api.coindesk.com', query) - return json['bpi'] - - -class Coinsecure(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('api.coinsecure.in', '/v0/noauth/newticker') - return {'INR': Decimal(json['lastprice'] / 100.0 )} - - -class Foxbit(ExchangeBase): - - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') - return {'BRL': Decimal(json['ticker_1h']['exchanges']['FOX']['last'])} - - -class itBit(ExchangeBase): - - def get_rates(self, ccy): - ccys = ['USD', 'EUR', 'SGD'] - json = self.get_json('api.itbit.com', '/v1/markets/XBT%s/ticker' % ccy) - result = dict.fromkeys(ccys) - if ccy in ccys: - result[ccy] = Decimal(json['lastPrice']) - return result - - -class Kraken(ExchangeBase): - - def get_rates(self, ccy): - ccys = ['EUR', 'USD', 'CAD', 'GBP', 'JPY'] - pairs = ['XBT%s' % c for c in ccys] - json = self.get_json('api.kraken.com', - '/0/public/Ticker?pair=%s' % ','.join(pairs)) - return dict((k[-3:], Decimal(float(v['c'][0]))) - for k, v in json['result'].items()) - - -class LocalBitcoins(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('localbitcoins.com', - '/bitcoinaverage/ticker-all-currencies/') - return dict([(r, Decimal(json[r]['rates']['last'])) for r in json]) - - -class MercadoBitcoin(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') - return {'BRL': Decimal(json['ticker_1h']['exchanges']['MBT']['last'])} - - -class NegocieCoins(ExchangeBase): - - def get_rates(self,ccy): - json = self.get_json('api.bitvalor.com', '/v1/ticker.json') - return {'BRL': Decimal(json['ticker_1h']['exchanges']['NEG']['last'])} - - def history_ccys(self): - return ['BRL'] - - -class Unocoin(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('www.unocoin.com', 'trade?buy') - return {'INR': Decimal(json)} - - -class WEX(ExchangeBase): - - def get_rates(self, ccy): - json_eur = self.get_json('wex.nz', '/api/3/ticker/btc_eur') - json_rub = self.get_json('wex.nz', '/api/3/ticker/btc_rur') - json_usd = self.get_json('wex.nz', '/api/3/ticker/btc_usd') - return {'EUR': Decimal(json_eur['btc_eur']['last']), - 'RUB': Decimal(json_rub['btc_rur']['last']), - 'USD': Decimal(json_usd['btc_usd']['last'])} - - -class Winkdex(ExchangeBase): - - def get_rates(self, ccy): - json = self.get_json('winkdex.com', '/api/v0/price') - return {'USD': Decimal(json['price'] / 100.0)} - - def history_ccys(self): - return ['USD'] - - def historical_rates(self, ccy): - json = self.get_json('winkdex.com', - "/api/v0/series?start_time=1342915200") - history = json['series'][0]['results'] - return dict([(h['timestamp'][:10], h['price'] / 100.0) - for h in history]) def dictinvert(d): @@ -419,11 +193,11 @@ class FxThread(ThreadJob): self.config.set_key('fiat_address', bool(b)) def get_currency(self): - '''Use when dynamic fetching is needed''' - return self.config.get("currency", "EUR") + # Use when dynamic fetching is needed + return self.config.get('currency', 'USD') def config_exchange(self): - return self.config.get('use_exchange', 'BitcoinAverage') + return self.config.get('use_exchange', 'CryptoCompare') def show_history(self): return self.is_enabled() and self.get_history_config() and self.ccy in self.exchange.history_ccys() @@ -435,7 +209,7 @@ class FxThread(ThreadJob): self.on_quotes() def set_exchange(self, name): - class_ = globals().get(name, BitcoinAverage) + class_ = globals().get(name, CryptoCompare) self.print_error("using exchange", name) if self.config_exchange() != name: self.config.set_key('use_exchange', name, True) @@ -462,7 +236,7 @@ class FxThread(ThreadJob): def get_fiat_status_text(self, btc_balance, base_unit, decimal_point): rate = self.exchange_rate() - return _(" (No FX rate available)") if rate is None else " 1 %s~%s %s" % (base_unit, + return _(" (No exchange rate available)") if rate is None else " 1 %s=%s %s" % (base_unit, self.value_str(COIN / (10**(8 - decimal_point)), rate), self.ccy) def value_str(self, satoshis, rate):