From e90292fb2fe83a2a363f4154bb987e39cc3a0410 Mon Sep 17 00:00:00 2001 From: gerlofvanek Date: Mon, 18 Mar 2024 00:10:30 +0100 Subject: [PATCH] ui: Added wownero (chart/price/images), WIP on coingecko fallback system for chart/coin prices. - Added wownero .png coin logos. - (WIP) Added coingecko api / key as fallback system for the chart/coin prices. - Change the api / keys for coingecko at settings. - Added special function for getting wownero chart/coin data/price from CoinGecko and not CryptocCmpare. --- basicswap/basicswap.py | 19 ++ basicswap/static/images/coins/Wownero-20.png | Bin 0 -> 1963 bytes basicswap/static/images/coins/Wownero.png | Bin 0 -> 8589 bytes basicswap/templates/offers.html | 189 +++++++++++++++---- basicswap/templates/settings.html | 11 +- basicswap/ui/page_offers.py | 13 ++ basicswap/ui/page_settings.py | 8 + 7 files changed, 203 insertions(+), 37 deletions(-) create mode 100644 basicswap/static/images/coins/Wownero-20.png create mode 100644 basicswap/static/images/coins/Wownero.png diff --git a/basicswap/basicswap.py b/basicswap/basicswap.py index b9a0f54..c48508a 100644 --- a/basicswap/basicswap.py +++ b/basicswap/basicswap.py @@ -6447,6 +6447,25 @@ class BasicSwap(BaseApp): settings_copy.pop('chart_api_key') settings_changed = True + if 'coingecko_api_key' in data: + new_value = data['coingecko_api_key'] + ensure(isinstance(new_value, str), 'New coingecko_api_key value not a string') + ensure(len(new_value) <= 128, 'New coingecko_api_keyvalue too long') + if all(c in string.hexdigits for c in new_value): + if settings_copy.get('coingecko_api_key', '') != new_value: + settings_copy['coingecko_api_key'] = new_value + if 'coingecko_api_key_enc' in settings_copy: + settings_copy.pop('coingecko_api_key_enc') + settings_changed = True + else: + # Encode value as hex to avoid escaping + new_value = new_value.encode('utf-8').hex() + if settings_copy.get('coingecko_api_key_enc', '') != new_value: + settings_copy['coingecko_api_key_enc'] = new_value + if 'coingecko_api_key' in settings_copy: + settings_copy.pop('coingecko_api_key') + settings_changed = True + if settings_changed: settings_path = os.path.join(self.data_dir, cfg.CONFIG_FILENAME) settings_path_new = settings_path + '.new' diff --git a/basicswap/static/images/coins/Wownero-20.png b/basicswap/static/images/coins/Wownero-20.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d243cbbe48f9507dd4db5fd8a19561ea698021 GIT binary patch literal 1963 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 HGy3#j?Z_<_ literal 0 HcmV?d00001 diff --git a/basicswap/templates/offers.html b/basicswap/templates/offers.html index 3958683..6eb7a08 100644 --- a/basicswap/templates/offers.html +++ b/basicswap/templates/offers.html @@ -55,7 +55,7 @@ @@ -359,16 +359,77 @@ +
+
+
+ WOWNERO +

+ Wownero (WOW) +

+
+
+

+ + + +

+
+
+
+
+
+
+ VOL: +
+
+
+ +
+
+
+ - + {% endif %}
diff --git a/basicswap/templates/settings.html b/basicswap/templates/settings.html index 3f5440e..2868f6d 100644 --- a/basicswap/templates/settings.html +++ b/basicswap/templates/settings.html @@ -416,7 +416,7 @@ - Chart API Key + Chart API Key (CryptoCompare)
diff --git a/basicswap/ui/page_offers.py b/basicswap/ui/page_offers.py index 4e0dcaf..1d38bd4 100644 --- a/basicswap/ui/page_offers.py +++ b/basicswap/ui/page_offers.py @@ -41,6 +41,7 @@ from basicswap.chainparams import ( ) default_chart_api_key = '95dd900af910656e0e17c41f2ddc5dba77d01bf8b0e7d2787634a16bd976c553' +default_coingecko_api_key = 'CG-8hm3r9iLfpEXv4ied8oLbeUj' def value_or_none(v): @@ -451,6 +452,11 @@ def page_newoffer(self, url_split, post_string): chart_api_key_enc = swap_client.settings.get('chart_api_key_enc', '') chart_api_key = default_chart_api_key if chart_api_key_enc == '' else bytes.fromhex(chart_api_key_enc).decode('utf-8') + coingecko_api_key = swap_client.settings.get('coingecko_api_key', '') + if coingecko_api_key == '': + coingecko_api_key_enc = swap_client.settings.get('coingecko_api_key_enc', '') + coingecko_api_key = default_coingecko_api_key if coingecko_api_key_enc == '' else bytes.fromhex(coingecko_api_key_enc).decode('utf-8') + return self.render_template(template, { 'messages': messages, 'err_messages': err_messages, @@ -464,6 +470,7 @@ def page_newoffer(self, url_split, post_string): 'swap_types': [(strSwapType(x), strSwapDesc(x)) for x in SwapTypes if strSwapType(x)], 'show_chart': swap_client.settings.get('show_chart', True), 'chart_api_key': chart_api_key, + 'coingecko_api_key': coingecko_api_key, }) @@ -796,6 +803,11 @@ def page_offers(self, url_split, post_string, sent=False): chart_api_key_enc = swap_client.settings.get('chart_api_key_enc', '') chart_api_key = default_chart_api_key if chart_api_key_enc == '' else bytes.fromhex(chart_api_key_enc).decode('utf-8') + coingecko_api_key = swap_client.settings.get('coingecko_api_key', '') + if coingecko_api_key == '': + coingecko_api_key_enc = swap_client.settings.get('coingecko_api_key_enc', '') + coingecko_api_key = default_coingecko_api_key if coingecko_api_key_enc == '' else bytes.fromhex(coingecko_api_key_enc).decode('utf-8') + offers_count = len(formatted_offers) template = server.env.get_template('offers.html') @@ -806,6 +818,7 @@ def page_offers(self, url_split, post_string, sent=False): 'messages': messages, 'show_chart': False if sent else swap_client.settings.get('show_chart', True), 'chart_api_key': chart_api_key, + 'coingecko_api_key': coingecko_api_key, 'coins_from': coins_from, 'coins': coins_to, 'messages': messages, diff --git a/basicswap/ui/page_settings.py b/basicswap/ui/page_settings.py index 072dcbc..3306478 100644 --- a/basicswap/ui/page_settings.py +++ b/basicswap/ui/page_settings.py @@ -45,6 +45,7 @@ def page_settings(self, url_split, post_string): data = { 'show_chart': toBool(get_data_entry(form_data, 'showchart')), 'chart_api_key': html.unescape(get_data_entry_or(form_data, 'chartapikey', '')), + 'coingecko_api_key': html.unescape(get_data_entry_or(form_data, 'coingeckoapikey', '')), } swap_client.editGeneralSettings(data) elif have_data_entry(form_data, 'apply_tor'): @@ -130,9 +131,16 @@ def page_settings(self, url_split, post_string): chart_api_key = html.escape(bytes.fromhex(swap_client.settings.get('chart_api_key_enc', '')).decode('utf-8')) else: chart_api_key = swap_client.settings.get('chart_api_key', '') + + if 'coingecko_api_key_enc' in swap_client.settings: + coingecko_api_key = html.escape(bytes.fromhex(swap_client.settings.get('coingecko_api_key_enc', '')).decode('utf-8')) + else: + coingecko_api_key = swap_client.settings.get('coingecko_api_key', '') + chart_settings = { 'show_chart': swap_client.settings.get('show_chart', True), 'chart_api_key': chart_api_key, + 'coingecko_api_key': coingecko_api_key, } tor_control_password = '' if swap_client.tor_control_password is None else swap_client.tor_control_password