diff --git a/lib/main.dart b/lib/main.dart index 5879c1e..5a57f50 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:provider/provider.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' hide WalletProvider; +import 'src/rust/frb_generated.dart'; import 'package:elcaju/l10n/app_localizations.dart'; import 'core/theme/app_theme.dart'; import 'providers/wallet_provider.dart'; @@ -15,8 +15,8 @@ import 'screens/1_splash/splash_screen.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); - // Inicializar CDK Flutter (Cashu SDK) - await CdkFlutter.init(); + // Inicializar bridge Rust interno (Cashu SDK) + await RustLib.init(); // Configurar orientación y estilo de barra de estado SystemChrome.setPreferredOrientations([ diff --git a/lib/providers/p2pk_provider.dart b/lib/providers/p2pk_provider.dart index 9598657..5fd2e06 100644 --- a/lib/providers/p2pk_provider.dart +++ b/lib/providers/p2pk_provider.dart @@ -11,7 +11,7 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:bip32/bip32.dart' as bip32; -import 'package:cdk_flutter/cdk_flutter.dart' as cdk; +import '../src/rust/api/keys.dart' as cdk; import 'package:uuid/uuid.dart'; import '../models/p2pk_key.dart'; diff --git a/lib/providers/wallet_provider.dart b/lib/providers/wallet_provider.dart index c7b5712..5cde5e5 100644 --- a/lib/providers/wallet_provider.dart +++ b/lib/providers/wallet_provider.dart @@ -3,8 +3,10 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:cbor/cbor.dart'; -import 'package:cdk_flutter/cdk_flutter.dart'; -import 'package:http/http.dart' as http; +import '../src/rust/api/wallet.dart'; +import '../src/rust/api/token.dart'; +import '../src/rust/api/mint_info.dart'; +import '../src/rust/api/keys.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:uuid/uuid.dart'; @@ -177,15 +179,11 @@ class WalletProvider extends ChangeNotifier { // ============================================================ /// Verifica si podemos alcanzar un mint específico. - /// Hace ping HTTP GET a {mintUrl}/v1/info con timeout de 3 segundos. + /// Usa función Rust que hace GET a {mintUrl}/v1/info. /// Retorna true si responde 200, false en cualquier otro caso. Future canReachMint(String mintUrl) async { try { - final uri = Uri.parse('$mintUrl/v1/info'); - final response = await http.get(uri).timeout( - const Duration(seconds: 3), - ); - return response.statusCode == 200; + return await pingMint(mintUrl: mintUrl); } catch (e) { debugPrint('Ping to mint failed: $e'); return false; @@ -409,7 +407,7 @@ class WalletProvider extends ChangeNotifier { /// Usa mintInfo.nuts.nut04 (MintMethodSettings) para obtener las unidades. Future> _detectAndAddMint(String mintUrl) async { try { - // Obtener info del mint (función global de cdk_flutter) + // Obtener info del mint (función del bridge Rust) final mintInfo = await getMintInfo(mintUrl: mintUrl); // Extraer unidades de nut04 (mint methods) @@ -446,31 +444,14 @@ class WalletProvider extends ChangeNotifier { } /// Obtiene los keysets de un mint y los agrega al caché _keysetUnits. - /// Llama a GET {mintUrl}/v1/keysets para obtener el mapping keyset_id → unit. + /// Usa función Rust que llama a GET {mintUrl}/v1/keysets. Future _fetchKeysets(String mintUrl) async { try { - final response = await http.get( - Uri.parse('$mintUrl/v1/keysets'), - headers: {'Content-Type': 'application/json'}, - ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body) as Map; - final keysets = data['keysets'] as List?; - - if (keysets != null) { - for (final ks in keysets) { - final id = ks['id'] as String?; - final unit = ks['unit'] as String?; - if (id != null && unit != null) { - _keysetUnits[id] = unit; - } - } - debugPrint('Keysets cargados para $mintUrl: ${keysets.length}'); - } - } else { - debugPrint('Error HTTP ${response.statusCode} al obtener keysets de $mintUrl'); + final keysets = await fetchKeysets(mintUrl: mintUrl); + for (final ks in keysets) { + _keysetUnits[ks.id] = ks.unit; } + debugPrint('Keysets cargados para $mintUrl: ${keysets.length}'); } catch (e) { debugPrint('Error obteniendo keysets de $mintUrl: $e'); // No lanzamos excepción, el caché simplemente no tendrá estos keysets diff --git a/lib/screens/2_onboarding/restore_wallet_screen.dart b/lib/screens/2_onboarding/restore_wallet_screen.dart index 4cd946a..8b1bd95 100644 --- a/lib/screens/2_onboarding/restore_wallet_screen.dart +++ b/lib/screens/2_onboarding/restore_wallet_screen.dart @@ -64,7 +64,7 @@ class _RestoreWalletScreenState extends State { final p2pkProvider = context.read(); // Inicializar wallet primero (valida el mnemonic internamente). - // Si es inválido, cdk_flutter lanzará una excepción antes de persistir. + // Si es inválido, el bridge Rust lanzará una excepción antes de persistir. await walletProvider.initialize(mnemonic); // Solo guardar mnemonic si initialize() pasó sin error diff --git a/lib/screens/5_send/share_token_screen.dart b/lib/screens/5_send/share_token_screen.dart index b708d21..0557888 100644 --- a/lib/screens/5_send/share_token_screen.dart +++ b/lib/screens/5_send/share_token_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter/services.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:share_plus/share_plus.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' as cdk; +import '../../src/rust/api/token.dart' as cdk; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; diff --git a/lib/screens/6_mint/invoice_screen.dart b/lib/screens/6_mint/invoice_screen.dart index b30eaef..92e48b5 100644 --- a/lib/screens/6_mint/invoice_screen.dart +++ b/lib/screens/6_mint/invoice_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:lucide_icons/lucide_icons.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' hide WalletProvider; +import '../../src/rust/api/wallet.dart'; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; diff --git a/lib/screens/7_melt/melt_screen.dart b/lib/screens/7_melt/melt_screen.dart index 60348d4..f0db69c 100644 --- a/lib/screens/7_melt/melt_screen.dart +++ b/lib/screens/7_melt/melt_screen.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:lucide_icons/lucide_icons.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' hide WalletProvider; +import '../../src/rust/api/wallet.dart'; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; diff --git a/lib/screens/8_settings/mint_detail_screen.dart b/lib/screens/8_settings/mint_detail_screen.dart index 306da92..6c1c9d0 100644 --- a/lib/screens/8_settings/mint_detail_screen.dart +++ b/lib/screens/8_settings/mint_detail_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:lucide_icons/lucide_icons.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' show MintInfo, ContactInfo; +import '../../src/rust/api/mint_info.dart' show MintInfo, ContactInfo; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/utils/formatters.dart'; diff --git a/lib/screens/8_settings/mints_screen.dart b/lib/screens/8_settings/mints_screen.dart index 1d80b38..0bf7957 100644 --- a/lib/screens/8_settings/mints_screen.dart +++ b/lib/screens/8_settings/mints_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:provider/provider.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' show MintInfo; +import '../../src/rust/api/mint_info.dart' show MintInfo; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; @@ -623,7 +623,7 @@ class _AddMintDialogState extends State<_AddMintDialog> { }); try { - // Intentar agregar el mint (cdk_flutter validará la conexión) + // Intentar agregar el mint (el bridge Rust validará la conexión) await widget.walletProvider.addMint(url); if (mounted) { diff --git a/lib/screens/9_history/history_screen.dart b/lib/screens/9_history/history_screen.dart index c96f111..ca4083f 100644 --- a/lib/screens/9_history/history_screen.dart +++ b/lib/screens/9_history/history_screen.dart @@ -5,8 +5,8 @@ import 'package:provider/provider.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:intl/intl.dart'; -import 'package:cdk_flutter/cdk_flutter.dart' as cdk; -import 'package:cdk_flutter/cdk_flutter.dart' show Transaction, TransactionDirection, TransactionStatus; +import '../../src/rust/api/token.dart' as cdk; +import '../../src/rust/api/wallet.dart' show Transaction, TransactionDirection, TransactionStatus; import 'package:elcaju/l10n/app_localizations.dart'; import '../../core/constants/colors.dart'; import '../../core/constants/dimensions.dart'; diff --git a/lib/widgets/scanner/qr_scanner_widget.dart b/lib/widgets/scanner/qr_scanner_widget.dart index 2244fa3..f1a957c 100644 --- a/lib/widgets/scanner/qr_scanner_widget.dart +++ b/lib/widgets/scanner/qr_scanner_widget.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:mobile_scanner/mobile_scanner.dart'; import 'package:lucide_icons/lucide_icons.dart'; import 'package:elcaju/l10n/app_localizations.dart'; -import 'package:cdk_flutter/cdk_flutter.dart'; +import '../../src/rust/api/token.dart'; import '../../core/constants/colors.dart'; import '../../core/utils/incoming_data_parser.dart'; diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 7cf3de9..c00e913 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -8,7 +8,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST - cdk_flutter + rust_builder ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/pubspec.lock b/pubspec.lock index 311564b..7ec3d3b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -161,15 +161,6 @@ packages: url: "https://pub.dev" source: hosted version: "6.3.5" - cdk_flutter: - dependency: "direct main" - description: - path: "." - ref: HEAD - resolved-ref: "7fb8580530d963c9ff09f23e55a1e56bccd8676b" - url: "https://github.com/cashubtc/cdk_flutter.git" - source: git - version: "0.1.0" characters: dependency: transitive description: @@ -814,6 +805,13 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.0" + rust_builder: + dependency: "direct main" + description: + path: rust_builder + relative: true + source: path + version: "0.1.0" share_plus: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index f1627df..3becc87 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,10 +15,9 @@ dependencies: cupertino_icons: ^1.0.8 - # CDK Flutter (Cashu backend) - cdk_flutter: - git: - url: https://github.com/cashubtc/cdk_flutter.git + # Internal Rust bridge (Cashu backend via cdk) + rust_builder: + path: rust_builder # State Management provider: ^6.1.2 diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index a4b8c07..545da3e 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -9,7 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST - cdk_flutter + rust_builder ) set(PLUGIN_BUNDLED_LIBRARIES)