fix: improve error handling and messaging in DFX Buy and OpenCryptoPay services (#2509)

* fix: improve error handling and messaging in DFX Buy and OpenCryptoPay services * fix: adjust error handling in DFX Buy provider by updating `_getErrorMessage` function parameters and removing unused imports

Konstantin Ullrich committed Sep 8, 2025 at 17:22 UTC bac14e2d251844bc1f1dc505fba74bf5bbbbd244
3 files changed +16 -8
lib/buy/dfx/dfx_buy_provider.dart
+13 -2
@@ -10,11 +10,11 @@ import 'package:cake_wallet/generated/i18n.dart';
10 import 'package:cake_wallet/routes.dart';
11 import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart';
12 import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
13 -import 'package:cw_core/utils/proxy_wrapper.dart';
13 import 'package:cake_wallet/utils/show_pop_up.dart';
14 import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
15 import 'package:cw_core/crypto_currency.dart';
16 import 'package:cw_core/utils/print_verbose.dart';
17 +import 'package:cw_core/utils/proxy_wrapper.dart';
18 import 'package:cw_core/wallet_base.dart';
19 import 'package:cw_core/wallet_type.dart';
20 import 'package:flutter/material.dart';
@@ -115,7 +115,7 @@ class DFXBuyProvider extends BuyProvider {
115 final message = responseBody['message'] ?? 'Service unavailable in your country';
116 throw Exception(message);
117 } else {
118 - throw Exception('Failed to sign up. Status: ${response.statusCode} ${response.body}');
118 + throw Exception('Failed to sign up. ${_getErrorMessage(response.statusCode, response.body)}');
119 }
120 }
121
@@ -401,4 +401,15 @@ class DFXBuyProvider extends BuyProvider {
401 }
402 return null;
403 }
404 +
405 + String _getErrorMessage(int statusCode, String body) {
406 + final responseBody = jsonDecode(body) as Map<String, dynamic>;
407 + final message = responseBody['message']?.toString() ?? '';
408 +
409 + if (message.contains("address must match")) {
410 + return "The wallet type must match the selected currency";
411 + }
412 +
413 + return message.isNotEmpty ? message : "Unknown error: ${statusCode}";
414 + }
415 }
lib/core/open_crypto_pay/exceptions.dart
+1 -2
@@ -4,8 +4,7 @@ class OpenCryptoPayException implements Exception {
4 OpenCryptoPayException([this.message = '']);
5
6 @override
7 - String toString() =>
8 - 'OpenCryptoPayException${message.isNotEmpty ? ': $message' : ''}';
7 + String toString() => message.isNotEmpty ? message : 'OpenCryptoPayException';
8 }
9
10 class OpenCryptoPayNotSupportedException extends OpenCryptoPayException {
lib/core/open_crypto_pay/open_cryptopay_service.dart
+2 -4
@@ -35,14 +35,12 @@ class OpenCryptoPayService {
35 final response =
36 await ProxyWrapper().get(clearnetUri: Uri.https(uri.authority, uri.path, queryParams));
37
38 + final body = jsonDecode(response.body) as Map;
39 if (response.statusCode == 200) {
39 - final body = jsonDecode(response.body) as Map;
40 -
40 if (body.keys.contains("txId")) return body["txId"] as String;
41 throw OpenCryptoPayException(body.toString());
42 }
44 - throw OpenCryptoPayException(
45 - "Unexpected status code ${response.statusCode} ${response.body}");
43 + throw OpenCryptoPayException("${response.statusCode}: ${body["message"]}");
44 }
45
46 Future<void> cancelOpenCryptoPayRequest(OpenCryptoPayRequest request) async {