From 7e8e5029f8069adea6dabde666d9002804f5c82c Mon Sep 17 00:00:00 2001 From: "Charl (Nitride)" <77973576+CharlVS@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:23:47 +0200 Subject: [PATCH 1/4] feat(trading): use geo blocker api service --- .../trading_status_repository.dart | 37 +++++++++++++++---- lib/shared/constants.dart | 7 ++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/lib/bloc/trading_status/trading_status_repository.dart b/lib/bloc/trading_status/trading_status_repository.dart index c3eafa5871..96f4a201ce 100644 --- a/lib/bloc/trading_status/trading_status_repository.dart +++ b/lib/bloc/trading_status/trading_status_repository.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:http/http.dart' as http; +import 'package:komodo_defi_types/komodo_defi_type_utils.dart'; +import 'package:web_dex/shared/constants.dart'; class TradingStatusRepository { TradingStatusRepository({http.Client? httpClient, Duration? timeout}) @@ -12,13 +14,34 @@ class TradingStatusRepository { Future isTradingEnabled({bool? forceFail}) async { try { - final uri = Uri.parse( - (forceFail ?? false) - ? 'https://defi-stats.komodo.earth/api/v3/utils/blacklist' - : 'https://defi-stats.komodo.earth/api/v3/utils/bouncer', - ); - final res = await _httpClient.get(uri).timeout(_timeout); - return res.statusCode == 200; + final apiKey = const String.fromEnvironment('FEEDBACK_API_KEY'); + final bool shouldFail = forceFail ?? false; + + late final Uri uri; + final headers = {}; + + if (shouldFail) { + uri = Uri.parse(tradingBlacklistUrl); + } else if (apiKey.isNotEmpty) { + uri = Uri.parse(geoBlockerApiUrl); + headers['X-KW-KEY'] = apiKey; + } else { + debugPrint( + 'Warning: FEEDBACK_API_KEY not found. Using legacy geo-blocker.', + ); + uri = Uri.parse(legacyGeoBlockerUrl); + } + + final res = + await _httpClient.get(uri, headers: headers).timeout(_timeout); + + if (apiKey.isNotEmpty && !shouldFail) { + if (res.statusCode != 200) return false; + final JsonMap data = jsonFromString(res.body); + return !(data.valueOrNull('blocked') ?? true); + } else { + return res.statusCode == 200; + } } catch (_) { debugPrint('Network error: Trading status check failed'); // Block trading features on network failure diff --git a/lib/shared/constants.dart b/lib/shared/constants.dart index 6ac40f8e40..db2535110c 100644 --- a/lib/shared/constants.dart +++ b/lib/shared/constants.dart @@ -44,3 +44,10 @@ const bool isTestMode = bool.fromEnvironment('testing_mode', defaultValue: false); const String moralisProxyUrl = 'https://moralis-proxy.komodo.earth'; const String nftAntiSpamUrl = 'https://nft.antispam.dragonhound.info'; + +const String geoBlockerApiUrl = + 'https://komodo-wallet-bouncer.komodoplatform.com'; +const String legacyGeoBlockerUrl = + 'https://defi-stats.komodo.earth/api/v3/utils/bouncer'; +const String tradingBlacklistUrl = + 'https://defi-stats.komodo.earth/api/v3/utils/blacklist'; From 3573d6a43fac439e855dbbb6fc4514971ce1a42d Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Wed, 9 Jul 2025 21:19:32 +0200 Subject: [PATCH 2/4] fix: change trading status to post request --- lib/bloc/trading_status/trading_status_repository.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/bloc/trading_status/trading_status_repository.dart b/lib/bloc/trading_status/trading_status_repository.dart index 96f4a201ce..63c9a68074 100644 --- a/lib/bloc/trading_status/trading_status_repository.dart +++ b/lib/bloc/trading_status/trading_status_repository.dart @@ -33,7 +33,7 @@ class TradingStatusRepository { } final res = - await _httpClient.get(uri, headers: headers).timeout(_timeout); + await _httpClient.post(uri, headers: headers).timeout(_timeout); if (apiKey.isNotEmpty && !shouldFail) { if (res.statusCode != 200) return false; From 83967c05893a8704b74efbc4e305a79cc1dd2934 Mon Sep 17 00:00:00 2001 From: "Charl (Nitride)" <77973576+CharlVS@users.noreply.github.com> Date: Thu, 10 Jul 2025 12:20:04 +0200 Subject: [PATCH 3/4] fix(trading): remove legacy fallback (#2897) --- assets/translations/en.json | 2 +- .../trading_status_repository.dart | 22 +++++++++---------- lib/shared/constants.dart | 2 -- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index e0e4282b05..adb1e622cc 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -682,5 +682,5 @@ "searchAddresses": "Search addresses", "trend7d": "7d trend", "tradingDisabledTooltip": "Trading features are currently disabled", - "tradingDisabled": "Trading is currently unavailable" + "tradingDisabled": "Trading unavailable in your location" } \ No newline at end of file diff --git a/lib/bloc/trading_status/trading_status_repository.dart b/lib/bloc/trading_status/trading_status_repository.dart index 63c9a68074..918d7cf2bb 100644 --- a/lib/bloc/trading_status/trading_status_repository.dart +++ b/lib/bloc/trading_status/trading_status_repository.dart @@ -17,31 +17,31 @@ class TradingStatusRepository { final apiKey = const String.fromEnvironment('FEEDBACK_API_KEY'); final bool shouldFail = forceFail ?? false; + if (apiKey.isEmpty && !shouldFail) { + debugPrint('FEEDBACK_API_KEY not found. Trading disabled.'); + return false; + } + late final Uri uri; final headers = {}; if (shouldFail) { uri = Uri.parse(tradingBlacklistUrl); - } else if (apiKey.isNotEmpty) { + } else { uri = Uri.parse(geoBlockerApiUrl); headers['X-KW-KEY'] = apiKey; - } else { - debugPrint( - 'Warning: FEEDBACK_API_KEY not found. Using legacy geo-blocker.', - ); - uri = Uri.parse(legacyGeoBlockerUrl); } final res = await _httpClient.post(uri, headers: headers).timeout(_timeout); - if (apiKey.isNotEmpty && !shouldFail) { - if (res.statusCode != 200) return false; - final JsonMap data = jsonFromString(res.body); - return !(data.valueOrNull('blocked') ?? true); - } else { + if (shouldFail) { return res.statusCode == 200; } + + if (res.statusCode != 200) return false; + final JsonMap data = jsonFromString(res.body); + return !(data.valueOrNull('blocked') ?? true); } catch (_) { debugPrint('Network error: Trading status check failed'); // Block trading features on network failure diff --git a/lib/shared/constants.dart b/lib/shared/constants.dart index db2535110c..358f794272 100644 --- a/lib/shared/constants.dart +++ b/lib/shared/constants.dart @@ -47,7 +47,5 @@ const String nftAntiSpamUrl = 'https://nft.antispam.dragonhound.info'; const String geoBlockerApiUrl = 'https://komodo-wallet-bouncer.komodoplatform.com'; -const String legacyGeoBlockerUrl = - 'https://defi-stats.komodo.earth/api/v3/utils/bouncer'; const String tradingBlacklistUrl = 'https://defi-stats.komodo.earth/api/v3/utils/blacklist'; From a52823e2783abc5ea030459f8f2a280661e17ae2 Mon Sep 17 00:00:00 2001 From: "Charl (Nitride)" <77973576+CharlVS@users.noreply.github.com> Date: Fri, 11 Jul 2025 16:14:13 +0200 Subject: [PATCH 4/4] fix: reference correct trading disabled locale (#2904) --- lib/views/bridge/bridge_confirmation.dart | 4 ++-- lib/views/bridge/bridge_exchange_form.dart | 2 +- lib/views/dex/simple/confirm/maker_order_confirmation.dart | 2 +- lib/views/dex/simple/confirm/taker_order_confirmation.dart | 2 +- lib/views/dex/simple/form/maker/maker_form_trade_button.dart | 2 +- lib/views/dex/simple/form/taker/taker_form_content.dart | 2 +- .../market_maker_bot/add_market_maker_bot_trade_button.dart | 2 +- .../market_maker_bot/market_maker_bot_confirmation_form.dart | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/views/bridge/bridge_confirmation.dart b/lib/views/bridge/bridge_confirmation.dart index 9fda0a8d8f..e34d4a9e01 100644 --- a/lib/views/bridge/bridge_confirmation.dart +++ b/lib/views/bridge/bridge_confirmation.dart @@ -411,7 +411,7 @@ class _ConfirmButton extends StatelessWidget { Widget build(BuildContext context) { final tradingStatusState = context.watch().state; final tradingEnabled = tradingStatusState.isEnabled; - + return Flexible( child: BlocSelector( selector: (state) => state.inProgress, @@ -424,7 +424,7 @@ class _ConfirmButton extends StatelessWidget { prefix: inProgress ? const _ProgressIndicator() : null, text: tradingEnabled ? LocaleKeys.confirm.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), onPressed: inProgress || !tradingEnabled ? null : onPressed, ), ); diff --git a/lib/views/bridge/bridge_exchange_form.dart b/lib/views/bridge/bridge_exchange_form.dart index b2548b5d07..91505e6dda 100644 --- a/lib/views/bridge/bridge_exchange_form.dart +++ b/lib/views/bridge/bridge_exchange_form.dart @@ -142,7 +142,7 @@ class _ExchangeButton extends StatelessWidget { prefix: inProgress ? const _Spinner() : null, text: tradingEnabled ? LocaleKeys.exchange.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), onPressed: isDisabled || !tradingEnabled ? null : () => _onPressed(context), diff --git a/lib/views/dex/simple/confirm/maker_order_confirmation.dart b/lib/views/dex/simple/confirm/maker_order_confirmation.dart index 7c84b08b7e..58b6f787bb 100644 --- a/lib/views/dex/simple/confirm/maker_order_confirmation.dart +++ b/lib/views/dex/simple/confirm/maker_order_confirmation.dart @@ -148,7 +148,7 @@ class _MakerOrderConfirmationState extends State { onPressed: _inProgress || !tradingEnabled ? null : _startSwap, text: tradingEnabled ? LocaleKeys.confirm.tr() - : LocaleKeys.tradingDisabledTooltip.tr()), + : LocaleKeys.tradingDisabled.tr()), ); } diff --git a/lib/views/dex/simple/confirm/taker_order_confirmation.dart b/lib/views/dex/simple/confirm/taker_order_confirmation.dart index 14b9bd7092..16d9a373f8 100644 --- a/lib/views/dex/simple/confirm/taker_order_confirmation.dart +++ b/lib/views/dex/simple/confirm/taker_order_confirmation.dart @@ -157,7 +157,7 @@ class _TakerOrderConfirmationState extends State { : () => _startSwap(context), text: tradingEnabled ? LocaleKeys.confirm.tr() - : LocaleKeys.tradingDisabledTooltip.tr()), + : LocaleKeys.tradingDisabled.tr()), ); }, ); diff --git a/lib/views/dex/simple/form/maker/maker_form_trade_button.dart b/lib/views/dex/simple/form/maker/maker_form_trade_button.dart index 1bda25ae86..44d1704bb2 100644 --- a/lib/views/dex/simple/form/maker/maker_form_trade_button.dart +++ b/lib/views/dex/simple/form/maker/maker_form_trade_button.dart @@ -40,7 +40,7 @@ class MakerFormTradeButton extends StatelessWidget { key: const Key('make-order-button'), text: isTradingEnabled ? LocaleKeys.makeOrder.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), prefix: inProgress ? Padding( padding: const EdgeInsets.only(right: 4), diff --git a/lib/views/dex/simple/form/taker/taker_form_content.dart b/lib/views/dex/simple/form/taker/taker_form_content.dart index d010a12341..ff6d4f1de3 100644 --- a/lib/views/dex/simple/form/taker/taker_form_content.dart +++ b/lib/views/dex/simple/form/taker/taker_form_content.dart @@ -141,7 +141,7 @@ class TradeButton extends StatelessWidget { key: const Key('take-order-button'), text: isTradingEnabled ? LocaleKeys.swapNow.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), prefix: inProgress ? const TradeButtonSpinner() : null, onPressed: disabled || !isTradingEnabled ? null diff --git a/lib/views/market_maker_bot/add_market_maker_bot_trade_button.dart b/lib/views/market_maker_bot/add_market_maker_bot_trade_button.dart index 0fe8a660c1..ddf22b7c39 100644 --- a/lib/views/market_maker_bot/add_market_maker_bot_trade_button.dart +++ b/lib/views/market_maker_bot/add_market_maker_bot_trade_button.dart @@ -30,7 +30,7 @@ class AddMarketMakerBotTradeButton extends StatelessWidget { key: const Key('make-order-button'), text: tradingEnabled ? LocaleKeys.makeOrder.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), onPressed: !enabled || !tradingEnabled ? null : () => onPressed(), height: 40, ), diff --git a/lib/views/market_maker_bot/market_maker_bot_confirmation_form.dart b/lib/views/market_maker_bot/market_maker_bot_confirmation_form.dart index a499afb3fd..67588caf10 100644 --- a/lib/views/market_maker_bot/market_maker_bot_confirmation_form.dart +++ b/lib/views/market_maker_bot/market_maker_bot_confirmation_form.dart @@ -164,7 +164,7 @@ class SwapActionButtons extends StatelessWidget { onPressed: !tradingEnabled ? null : onCreateOrder, text: tradingEnabled ? LocaleKeys.confirm.tr() - : LocaleKeys.tradingDisabledTooltip.tr(), + : LocaleKeys.tradingDisabled.tr(), ), ), ],