Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion assets/translations/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
37 changes: 30 additions & 7 deletions lib/bloc/trading_status/trading_status_repository.dart
Original file line number Diff line number Diff line change
@@ -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})
Expand All @@ -12,13 +14,34 @@ class TradingStatusRepository {

Future<bool> 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;

if (apiKey.isEmpty && !shouldFail) {
debugPrint('FEEDBACK_API_KEY not found. Trading disabled.');
return false;
}

late final Uri uri;
final headers = <String, String>{};

if (shouldFail) {
uri = Uri.parse(tradingBlacklistUrl);
} else {
uri = Uri.parse(geoBlockerApiUrl);
headers['X-KW-KEY'] = apiKey;
}

final res =
await _httpClient.post(uri, headers: headers).timeout(_timeout);

if (shouldFail) {
return res.statusCode == 200;
}

if (res.statusCode != 200) return false;
final JsonMap data = jsonFromString(res.body);
return !(data.valueOrNull<bool>('blocked') ?? true);
} catch (_) {
debugPrint('Network error: Trading status check failed');
// Block trading features on network failure
Expand Down
5 changes: 5 additions & 0 deletions lib/shared/constants.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,8 @@ 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 tradingBlacklistUrl =
'https://defi-stats.komodo.earth/api/v3/utils/blacklist';
4 changes: 2 additions & 2 deletions lib/views/bridge/bridge_confirmation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ class _ConfirmButton extends StatelessWidget {
Widget build(BuildContext context) {
final tradingStatusState = context.watch<TradingStatusBloc>().state;
final tradingEnabled = tradingStatusState.isEnabled;

return Flexible(
child: BlocSelector<BridgeBloc, BridgeState, bool>(
selector: (state) => state.inProgress,
Expand All @@ -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,
),
);
Expand Down
2 changes: 1 addition & 1 deletion lib/views/bridge/bridge_exchange_form.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion lib/views/dex/simple/confirm/maker_order_confirmation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class _MakerOrderConfirmationState extends State<MakerOrderConfirmation> {
onPressed: _inProgress || !tradingEnabled ? null : _startSwap,
text: tradingEnabled
? LocaleKeys.confirm.tr()
: LocaleKeys.tradingDisabledTooltip.tr()),
: LocaleKeys.tradingDisabled.tr()),
);
}

Expand Down
2 changes: 1 addition & 1 deletion lib/views/dex/simple/confirm/taker_order_confirmation.dart
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class _TakerOrderConfirmationState extends State<TakerOrderConfirmation> {
: () => _startSwap(context),
text: tradingEnabled
? LocaleKeys.confirm.tr()
: LocaleKeys.tradingDisabledTooltip.tr()),
: LocaleKeys.tradingDisabled.tr()),
);
},
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
2 changes: 1 addition & 1 deletion lib/views/dex/simple/form/taker/taker_form_content.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class SwapActionButtons extends StatelessWidget {
onPressed: !tradingEnabled ? null : onCreateOrder,
text: tradingEnabled
? LocaleKeys.confirm.tr()
: LocaleKeys.tradingDisabledTooltip.tr(),
: LocaleKeys.tradingDisabled.tr(),
),
),
],
Expand Down
Loading