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 {