From bac14e2d251844bc1f1dc505fba74bf5bbbbd244 Mon Sep 17 00:00:00 2001 From: Konstantin Ullrich Date: Mon, 8 Sep 2025 17:22:34 +0200 Subject: [PATCH] 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 --- lib/buy/dfx/dfx_buy_provider.dart | 15 +++++++++++++-- lib/core/open_crypto_pay/exceptions.dart | 3 +-- .../open_crypto_pay/open_cryptopay_service.dart | 6 ++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/buy/dfx/dfx_buy_provider.dart b/lib/buy/dfx/dfx_buy_provider.dart index 4dd6f1c68..670dca513 100644 --- a/lib/buy/dfx/dfx_buy_provider.dart +++ b/lib/buy/dfx/dfx_buy_provider.dart @@ -10,11 +10,11 @@ import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/connect_device/connect_device_page.dart'; import 'package:cake_wallet/src/widgets/alert_with_one_action.dart'; -import 'package:cw_core/utils/proxy_wrapper.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart'; import 'package:cw_core/crypto_currency.dart'; import 'package:cw_core/utils/print_verbose.dart'; +import 'package:cw_core/utils/proxy_wrapper.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; @@ -115,7 +115,7 @@ class DFXBuyProvider extends BuyProvider { final message = responseBody['message'] ?? 'Service unavailable in your country'; throw Exception(message); } else { - throw Exception('Failed to sign up. Status: ${response.statusCode} ${response.body}'); + throw Exception('Failed to sign up. ${_getErrorMessage(response.statusCode, response.body)}'); } } @@ -401,4 +401,15 @@ class DFXBuyProvider extends BuyProvider { } return null; } + + String _getErrorMessage(int statusCode, String body) { + final responseBody = jsonDecode(body) as Map; + final message = responseBody['message']?.toString() ?? ''; + + if (message.contains("address must match")) { + return "The wallet type must match the selected currency"; + } + + return message.isNotEmpty ? message : "Unknown error: ${statusCode}"; + } } diff --git a/lib/core/open_crypto_pay/exceptions.dart b/lib/core/open_crypto_pay/exceptions.dart index 71010482f..af133d6e5 100644 --- a/lib/core/open_crypto_pay/exceptions.dart +++ b/lib/core/open_crypto_pay/exceptions.dart @@ -4,8 +4,7 @@ class OpenCryptoPayException implements Exception { OpenCryptoPayException([this.message = '']); @override - String toString() => - 'OpenCryptoPayException${message.isNotEmpty ? ': $message' : ''}'; + String toString() => message.isNotEmpty ? message : 'OpenCryptoPayException'; } class OpenCryptoPayNotSupportedException extends OpenCryptoPayException { diff --git a/lib/core/open_crypto_pay/open_cryptopay_service.dart b/lib/core/open_crypto_pay/open_cryptopay_service.dart index f6c11bbbf..d913a619c 100644 --- a/lib/core/open_crypto_pay/open_cryptopay_service.dart +++ b/lib/core/open_crypto_pay/open_cryptopay_service.dart @@ -35,14 +35,12 @@ class OpenCryptoPayService { final response = await ProxyWrapper().get(clearnetUri: Uri.https(uri.authority, uri.path, queryParams)); + final body = jsonDecode(response.body) as Map; if (response.statusCode == 200) { - final body = jsonDecode(response.body) as Map; - if (body.keys.contains("txId")) return body["txId"] as String; throw OpenCryptoPayException(body.toString()); } - throw OpenCryptoPayException( - "Unexpected status code ${response.statusCode} ${response.body}"); + throw OpenCryptoPayException("${response.statusCode}: ${body["message"]}"); } Future cancelOpenCryptoPayRequest(OpenCryptoPayRequest request) async {