From 0ad955ff314fc779cca824cb9896134f6a393382 Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:08:38 +0100 Subject: [PATCH 1/6] fix(web): isolate cache adapters and update JS interop --- lib/bloc/cex_market_data/cache_constants.dart | 11 ++++ .../mock_portfolio_growth_repository.dart | 4 +- .../models/adapters/graph_cache_adapter.dart | 3 +- .../models/adapters/point_adapter.dart | 3 +- .../portfolio_growth_repository.dart | 12 +++-- .../demo_profit_loss_repository.dart | 3 +- .../models/adapters/fiat_value_adapter.dart | 3 +- .../models/adapters/profit_loss_adapter.dart | 3 +- .../adapters/profit_loss_cache_adapter.dart | 3 +- .../profit_loss/profit_loss_repository.dart | 16 ++++-- lib/services/file_loader/file_loader_web.dart | 51 +++++++++++++------ .../platform_web_api_web.dart | 8 ++- pubspec.lock | 16 +++--- sdk | 2 +- web/kdf/res/kdf_wrapper.dart | 23 +++++---- 15 files changed, 109 insertions(+), 52 deletions(-) create mode 100644 lib/bloc/cex_market_data/cache_constants.dart diff --git a/lib/bloc/cex_market_data/cache_constants.dart b/lib/bloc/cex_market_data/cache_constants.dart new file mode 100644 index 0000000000..82d76ec6d5 --- /dev/null +++ b/lib/bloc/cex_market_data/cache_constants.dart @@ -0,0 +1,11 @@ +// Hive typeIds 500-504 are reserved for app-local market-data caches. +const int profitLossCacheAdapterTypeId = 500; +const int profitLossAdapterTypeId = 501; +const int fiatValueAdapterTypeId = 502; +const int graphCacheAdapterTypeId = 503; +const int pointAdapterTypeId = 504; + +const String profitLossCacheBoxName = 'profit_loss_v2'; +const String mockProfitLossCacheBoxName = 'mock_profit_loss_v2'; +const String balanceGrowthCacheBoxName = 'balance_growth_v2'; +const String mockBalanceGrowthCacheBoxName = 'mock_balance_growth_v2'; diff --git a/lib/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart b/lib/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart index 5bd32af820..f873c0e2a5 100644 --- a/lib/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart +++ b/lib/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart @@ -1,9 +1,9 @@ import 'package:komodo_persistence_layer/komodo_persistence_layer.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/mock_transaction_history_repository.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart'; import 'package:web_dex/bloc/cex_market_data/models/graph_cache.dart'; -import 'package:web_dex/bloc/cex_market_data/models/graph_type.dart'; import 'package:web_dex/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart'; class MockPortfolioGrowthRepository extends PortfolioGrowthRepository { @@ -25,7 +25,7 @@ class MockPortfolioGrowthRepository extends PortfolioGrowthRepository { demoDataGenerator: DemoDataCache.withDefaults(sdk), ), cacheProvider: HiveLazyBoxProvider( - name: GraphType.balanceGrowth.tableName, + name: mockBalanceGrowthCacheBoxName, ), ); diff --git a/lib/bloc/cex_market_data/models/adapters/graph_cache_adapter.dart b/lib/bloc/cex_market_data/models/adapters/graph_cache_adapter.dart index d2556cbfe9..e4fc2c89ee 100644 --- a/lib/bloc/cex_market_data/models/adapters/graph_cache_adapter.dart +++ b/lib/bloc/cex_market_data/models/adapters/graph_cache_adapter.dart @@ -1,12 +1,13 @@ import 'dart:math'; import 'package:hive_ce/hive.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/models/graph_cache.dart'; import 'package:web_dex/bloc/cex_market_data/models/graph_type.dart'; class GraphCacheAdapter extends TypeAdapter { @override - final int typeId = 17; + final int typeId = graphCacheAdapterTypeId; @override GraphCache read(BinaryReader reader) { diff --git a/lib/bloc/cex_market_data/models/adapters/point_adapter.dart b/lib/bloc/cex_market_data/models/adapters/point_adapter.dart index 4874f6403b..618ca3c43b 100644 --- a/lib/bloc/cex_market_data/models/adapters/point_adapter.dart +++ b/lib/bloc/cex_market_data/models/adapters/point_adapter.dart @@ -1,10 +1,11 @@ import 'dart:math'; import 'package:hive_ce/hive.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; class PointAdapter extends TypeAdapter> { @override - final int typeId = 18; + final int typeId = pointAdapterTypeId; @override Point read(BinaryReader reader) { diff --git a/lib/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart b/lib/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart index 72fccee5dd..8fb93d9f1c 100644 --- a/lib/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart +++ b/lib/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart @@ -13,6 +13,7 @@ import 'package:komodo_defi_sdk/komodo_defi_sdk.dart'; import 'package:komodo_defi_types/komodo_defi_types.dart'; import 'package:komodo_persistence_layer/komodo_persistence_layer.dart'; import 'package:logging/logging.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/charts.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/mock_portfolio_growth_repository.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart'; @@ -57,7 +58,7 @@ class PortfolioGrowthRepository { return PortfolioGrowthRepository( transactionHistoryRepo: transactionHistoryRepo, cacheProvider: HiveLazyBoxProvider( - name: GraphType.balanceGrowth.tableName, + name: balanceGrowthCacheBoxName, ), coinsRepository: coinsRepository, sdk: sdk, @@ -79,9 +80,12 @@ class PortfolioGrowthRepository { final _log = Logger('PortfolioGrowthRepository'); static Future ensureInitialized() async { - Hive - ..registerAdapter(GraphCacheAdapter()) - ..registerAdapter(PointAdapter()); + if (!Hive.isAdapterRegistered(graphCacheAdapterTypeId)) { + Hive.registerAdapter(GraphCacheAdapter()); + } + if (!Hive.isAdapterRegistered(pointAdapterTypeId)) { + Hive.registerAdapter(PointAdapter()); + } } /// Get the growth chart for a coin based on the transactions diff --git a/lib/bloc/cex_market_data/profit_loss/demo_profit_loss_repository.dart b/lib/bloc/cex_market_data/profit_loss/demo_profit_loss_repository.dart index 96eddc0706..c9b6d2a9c1 100644 --- a/lib/bloc/cex_market_data/profit_loss/demo_profit_loss_repository.dart +++ b/lib/bloc/cex_market_data/profit_loss/demo_profit_loss_repository.dart @@ -1,5 +1,6 @@ import 'package:komodo_defi_sdk/komodo_defi_sdk.dart'; import 'package:komodo_persistence_layer/komodo_persistence_layer.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/mock_transaction_history_repository.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart'; @@ -19,7 +20,7 @@ class MockProfitLossRepository extends ProfitLossRepository { factory MockProfitLossRepository.withDefaults({ required PerformanceMode performanceMode, required KomodoDefiSdk sdk, - String cacheTableName = 'mock_profit_loss', + String cacheTableName = mockProfitLossCacheBoxName, }) { return MockProfitLossRepository( profitLossCacheProvider: HiveLazyBoxProvider( diff --git a/lib/bloc/cex_market_data/profit_loss/models/adapters/fiat_value_adapter.dart b/lib/bloc/cex_market_data/profit_loss/models/adapters/fiat_value_adapter.dart index 9bdf003fdf..e97758380e 100644 --- a/lib/bloc/cex_market_data/profit_loss/models/adapters/fiat_value_adapter.dart +++ b/lib/bloc/cex_market_data/profit_loss/models/adapters/fiat_value_adapter.dart @@ -1,10 +1,11 @@ import 'package:hive_ce/hive.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import '../fiat_value.dart'; class FiatValueAdapter extends TypeAdapter { @override - final int typeId = 16; + final int typeId = fiatValueAdapterTypeId; @override FiatValue read(BinaryReader reader) { diff --git a/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_adapter.dart b/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_adapter.dart index 0ab56defd9..b5bdd4e919 100644 --- a/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_adapter.dart +++ b/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_adapter.dart @@ -1,10 +1,11 @@ import 'package:hive_ce/hive.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/profit_loss/models/fiat_value.dart'; import 'package:web_dex/bloc/cex_market_data/profit_loss/models/profit_loss.dart'; class ProfitLossAdapter extends TypeAdapter { @override - final int typeId = 15; + final int typeId = profitLossAdapterTypeId; @override ProfitLoss read(BinaryReader reader) { diff --git a/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_cache_adapter.dart b/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_cache_adapter.dart index e08811e351..2f065906d6 100644 --- a/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_cache_adapter.dart +++ b/lib/bloc/cex_market_data/profit_loss/models/adapters/profit_loss_cache_adapter.dart @@ -1,9 +1,10 @@ import 'package:hive_ce/hive.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/profit_loss/models/profit_loss_cache.dart'; class ProfitLossCacheAdapter extends TypeAdapter { @override - final int typeId = 14; + final int typeId = profitLossCacheAdapterTypeId; @override ProfitLossCache read(BinaryReader reader) { diff --git a/lib/bloc/cex_market_data/profit_loss/profit_loss_repository.dart b/lib/bloc/cex_market_data/profit_loss/profit_loss_repository.dart index fa19da3a0d..5444fe33eb 100644 --- a/lib/bloc/cex_market_data/profit_loss/profit_loss_repository.dart +++ b/lib/bloc/cex_market_data/profit_loss/profit_loss_repository.dart @@ -6,6 +6,7 @@ import 'package:komodo_defi_sdk/komodo_defi_sdk.dart'; import 'package:komodo_defi_types/komodo_defi_types.dart'; import 'package:komodo_persistence_layer/komodo_persistence_layer.dart'; import 'package:logging/logging.dart'; +import 'package:web_dex/bloc/cex_market_data/cache_constants.dart'; import 'package:web_dex/bloc/cex_market_data/charts.dart'; import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart'; import 'package:web_dex/bloc/cex_market_data/profit_loss/demo_profit_loss_repository.dart'; @@ -33,7 +34,7 @@ class ProfitLossRepository { factory ProfitLossRepository.withDefaults({ required TransactionHistoryRepo transactionHistoryRepo, required KomodoDefiSdk sdk, - String cacheTableName = 'profit_loss', + String cacheTableName = profitLossCacheBoxName, PerformanceMode? demoMode, }) { if (demoMode != null) { @@ -62,10 +63,15 @@ class ProfitLossRepository { final _log = Logger('profit-loss-repository'); static Future ensureInitialized() async { - Hive - ..registerAdapter(FiatValueAdapter()) - ..registerAdapter(ProfitLossAdapter()) - ..registerAdapter(ProfitLossCacheAdapter()); + if (!Hive.isAdapterRegistered(fiatValueAdapterTypeId)) { + Hive.registerAdapter(FiatValueAdapter()); + } + if (!Hive.isAdapterRegistered(profitLossAdapterTypeId)) { + Hive.registerAdapter(ProfitLossAdapter()); + } + if (!Hive.isAdapterRegistered(profitLossCacheAdapterTypeId)) { + Hive.registerAdapter(ProfitLossCacheAdapter()); + } } Future clearCache() async { diff --git a/lib/services/file_loader/file_loader_web.dart b/lib/services/file_loader/file_loader_web.dart index 361e215438..1318593e98 100644 --- a/lib/services/file_loader/file_loader_web.dart +++ b/lib/services/file_loader/file_loader_web.dart @@ -33,8 +33,10 @@ class FileLoaderWeb implements FileLoader { required String data, }) async { final dataArray = web.TextEncoder().encode(data); - final blob = - web.Blob([dataArray].toJS, web.BlobPropertyBag(type: 'text/plain')); + final blob = web.Blob( + [dataArray].toJS, + web.BlobPropertyBag(type: 'text/plain'), + ); final url = web.URL.createObjectURL(blob); @@ -99,13 +101,19 @@ class FileLoaderWeb implements FileLoader { final encoder = web.TextEncoder(); final dataArray = encoder.encode(data); - final blob = - web.Blob([dataArray].toJS, web.BlobPropertyBag(type: 'text/plain')); + final blob = web.Blob( + [dataArray].toJS, + web.BlobPropertyBag(type: 'text/plain'), + ); final response = web.Response(blob); + final compressionStream = web.CompressionStream('gzip'); final compressedResponse = web.Response( response.body!.pipeThrough( - web.CompressionStream('gzip') as web.ReadableWritablePair, + web.ReadableWritablePair( + readable: compressionStream.readable, + writable: compressionStream.writable, + ), ), ); @@ -148,23 +156,34 @@ class FileLoaderWeb implements FileLoader { } if (files.length == 1) { - final web.File? file = files.item(0); + final file = files.item(0); + if (file == null) { + onError('No file was selected.'); + return; + } final reader = web.FileReader(); - reader.onLoadEnd.listen((event) { + reader.onLoadEnd.listen((_) { final result = reader.result; - if (result case final String content) { - onUpload(file!.name, content); + if (result == null) { + onError('Failed to read ${file.name}.'); + return; + } + + final dartResult = result.dartify(); + if (dartResult case final String content) { + onUpload(file.name, content); + return; } + + onError('Unsupported file content returned for ${file.name}.'); }); - reader - ..onerror = (JSAny event) { - if (event is web.ErrorEvent) { - onError(event.message); - } - }.toJS - ..readAsText(file! as web.Blob); + reader.onerror = ((JSAny _) { + onError(reader.error?.message ?? 'Failed to read ${file.name}.'); + return null; + }).toJS; + reader.readAsText(file); } }); } diff --git a/lib/services/platform_web_api/platform_web_api_web.dart b/lib/services/platform_web_api/platform_web_api_web.dart index a6eaef9e1f..25e288c547 100644 --- a/lib/services/platform_web_api/platform_web_api_web.dart +++ b/lib/services/platform_web_api/platform_web_api_web.dart @@ -1,15 +1,21 @@ import 'dart:async'; +import 'dart:js_interop'; import 'package:web/web.dart' as web; import 'platform_web_api.dart'; +@JS() +extension type _StyledElement._(web.Element _) implements web.Element { + external web.CSSStyleDeclaration get style; +} + class PlatformWebApiWeb implements PlatformWebApi { @override void setElementDisplay(String elementId, String display) { final element = web.document.getElementById(elementId); if (element != null) { - (element as web.HTMLElement).style.display = display; + _StyledElement._(element).style.display = display; } } diff --git a/pubspec.lock b/pubspec.lock index f620954de5..46d83d1618 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -844,10 +844,10 @@ packages: dependency: transitive description: name: matcher - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6" + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.18" + version: "0.12.19" material_color_utilities: dependency: transitive description: @@ -1297,26 +1297,26 @@ packages: dependency: "direct dev" description: name: test - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a" + sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7" url: "https://pub.dev" source: hosted - version: "1.29.0" + version: "1.30.0" test_api: dependency: transitive description: name: test_api - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636" + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" url: "https://pub.dev" source: hosted - version: "0.7.9" + version: "0.7.10" test_core: dependency: transitive description: name: test_core - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943" + sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51" url: "https://pub.dev" source: hosted - version: "0.6.15" + version: "0.6.16" typed_data: dependency: transitive description: diff --git a/sdk b/sdk index 54e1420f8f..8b936b5353 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 54e1420f8f657414168555a849d9041ca3eea5b9 +Subproject commit 8b936b5353e813f4925aab4f2549f9e8775b111a diff --git a/web/kdf/res/kdf_wrapper.dart b/web/kdf/res/kdf_wrapper.dart index 46dc6b6612..c39c9fe472 100644 --- a/web/kdf/res/kdf_wrapper.dart +++ b/web/kdf/res/kdf_wrapper.dart @@ -8,12 +8,20 @@ import 'dart:async'; // This is a web-specific file, so it's safe to ignore this warning // ignore: avoid_web_libraries_in_flutter import 'dart:js_interop'; -import 'dart:js_interop_unsafe'; import 'package:flutter/services.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:web/web.dart'; +@JS('mm2_main') +external JSAny? _mm2MainJs(String conf, JSFunction logCallback); + +@JS('mm2_main_status') +external JSAny? _mm2MainStatusJs(); + +@JS('mm2_stop') +external JSAny? _mm2StopJs(); + class KdfPlugin { static void registerWith(Registrar registrar) { final plugin = KdfPlugin(); @@ -62,7 +70,7 @@ class KdfPlugin { final completer = Completer(); - final script = (document.createElement('script') as HTMLScriptElement) + final script = HTMLScriptElement() ..src = 'kdf/kdflib.js' ..onload = () { _libraryLoaded = true; @@ -82,15 +90,12 @@ class KdfPlugin { try { final jsCallback = logCallback.toJS; - final jsResponse = globalContext.callMethod( - 'mm2_main'.toJS, - [conf.toJS, jsCallback].toJS, - ); + final jsResponse = _mm2MainJs(conf, jsCallback); if (jsResponse == null) { throw Exception('mm2_main call returned null'); } - final dynamic dartResponse = (jsResponse as JSAny?).dartify(); + final dynamic dartResponse = jsResponse.dartify(); if (dartResponse == null) { throw Exception('Failed to convert mm2_main response to Dart'); } @@ -106,13 +111,13 @@ class KdfPlugin { throw StateError('KDF library not loaded. Call ensureLoaded() first.'); } - final jsResult = globalContext.callMethod('mm2_main_status'.toJS); + final jsResult = _mm2MainStatusJs(); return jsResult.dartify()! as int; } Future _mm2Stop() async { await _ensureLoaded(); - final jsResult = globalContext.callMethod('mm2_stop'.toJS); + final jsResult = _mm2StopJs(); return jsResult.dartify()! as int; } } From b2d8796c404086b544710654512df55ddbb69750 Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Mon, 16 Mar 2026 18:32:59 +0100 Subject: [PATCH 2/6] fix(app): backfill wallet metadata display --- lib/bloc/auth_bloc/auth_bloc.dart | 30 ++++++++++- lib/model/wallet.dart | 52 ++++++++++++++----- .../widgets/wallet_list_item.dart | 29 ++++++----- 3 files changed, 85 insertions(+), 26 deletions(-) diff --git a/lib/bloc/auth_bloc/auth_bloc.dart b/lib/bloc/auth_bloc/auth_bloc.dart index 29390bd91b..c87d68cae8 100644 --- a/lib/bloc/auth_bloc/auth_bloc.dart +++ b/lib/bloc/auth_bloc/auth_bloc.dart @@ -138,7 +138,13 @@ class AuthBloc extends Bloc with TrezorAuthMixin { allowWeakPassword: weakPasswordsAllowed, ), ); - final KdfUser? currentUser = await _kdfSdk.auth.currentUser; + KdfUser? currentUser = await _kdfSdk.auth.currentUser; + if (currentUser == null) { + return emit(AuthBlocState.error(AuthException.notSignedIn())); + } + + await _repairMissingWalletMetadata(currentUser); + currentUser = await _kdfSdk.auth.currentUser; if (currentUser == null) { return emit(AuthBlocState.error(AuthException.notSignedIn())); } @@ -499,4 +505,26 @@ class AuthBloc extends Bloc with TrezorAuthMixin { return supportedAssets.toList(); } + + Future _repairMissingWalletMetadata(KdfUser user) async { + if (_isMissingMetadataStringValue(user.metadata['type'])) { + final walletType = user.walletId.isHd + ? WalletType.hdwallet + : WalletType.iguana; + await _kdfSdk.setWalletType(walletType); + } + + if (_isMissingMetadataStringValue(user.metadata['wallet_provenance'])) { + final isImported = user.metadata['isImported']; + if (isImported is bool) { + await _kdfSdk.setWalletProvenance( + isImported ? WalletProvenance.imported : WalletProvenance.generated, + ); + } + } + } + + bool _isMissingMetadataStringValue(dynamic value) { + return value == null || value is String && value.trim().isEmpty; + } } diff --git a/lib/model/wallet.dart b/lib/model/wallet.dart index 3c5fc7c70d..051bfe494c 100644 --- a/lib/model/wallet.dart +++ b/lib/model/wallet.dart @@ -227,18 +227,9 @@ enum WalletProvenance { extension KdfUserWalletExtension on KdfUser { Wallet get wallet { - final walletType = WalletType.fromJson( - metadata['type'] as String? ?? 'iguana', - ); - final provenance = WalletProvenance.fromJson( - metadata['wallet_provenance'] as String?, - ); - final createdAtRaw = metadata['wallet_created_at']; - final createdAt = createdAtRaw is int - ? DateTime.fromMillisecondsSinceEpoch(createdAtRaw) - : createdAtRaw is String && int.tryParse(createdAtRaw) != null - ? DateTime.fromMillisecondsSinceEpoch(int.parse(createdAtRaw)) - : null; + final walletType = _walletTypeFromMetadataOrAuth(this); + final provenance = _walletProvenanceFromMetadata(this); + final createdAt = _walletCreatedAtFromMetadata(this); return Wallet( id: walletId.name, name: walletId.name, @@ -260,3 +251,40 @@ extension KdfSdkWalletExtension on KomodoDefiSdk { Future> get wallets async => (await auth.getUsers()).map((user) => user.wallet); } + +WalletType _walletTypeFromMetadataOrAuth(KdfUser user) { + final metadataType = user.metadata['type']; + if (metadataType is String && metadataType.isNotEmpty) { + return WalletType.fromJson(metadataType); + } + + return user.walletId.isHd ? WalletType.hdwallet : WalletType.iguana; +} + +WalletProvenance _walletProvenanceFromMetadata(KdfUser user) { + final metadataProvenance = user.metadata['wallet_provenance']; + if (metadataProvenance is String && metadataProvenance.isNotEmpty) { + return WalletProvenance.fromJson(metadataProvenance); + } + + final isImported = user.metadata['isImported']; + if (isImported is bool) { + return isImported ? WalletProvenance.imported : WalletProvenance.generated; + } + + return WalletProvenance.unknown; +} + +DateTime? _walletCreatedAtFromMetadata(KdfUser user) { + final createdAtRaw = user.metadata['wallet_created_at']; + if (createdAtRaw is int) { + return DateTime.fromMillisecondsSinceEpoch(createdAtRaw); + } + if (createdAtRaw is String) { + final createdAtMs = int.tryParse(createdAtRaw); + if (createdAtMs != null) { + return DateTime.fromMillisecondsSinceEpoch(createdAtMs); + } + } + return null; +} diff --git a/lib/views/wallets_manager/widgets/wallet_list_item.dart b/lib/views/wallets_manager/widgets/wallet_list_item.dart index 908727bdf0..649913c50f 100644 --- a/lib/views/wallets_manager/widgets/wallet_list_item.dart +++ b/lib/views/wallets_manager/widgets/wallet_list_item.dart @@ -1,14 +1,16 @@ -import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; -import 'package:intl/intl.dart'; +import 'package:flutter/material.dart'; import 'package:web_dex/model/wallet.dart'; import 'package:web_dex/model/wallets_manager_models.dart'; import 'package:komodo_ui_kit/komodo_ui_kit.dart'; import 'package:web_dex/generated/codegen_loader.g.dart'; class WalletListItem extends StatelessWidget { - const WalletListItem({Key? key, required this.wallet, required this.onClick}) - : super(key: key); + const WalletListItem({ + super.key, + required this.wallet, + required this.onClick, + }); final Wallet wallet; final void Function(Wallet, WalletsManagerExistWalletAction) onClick; @@ -60,12 +62,14 @@ class WalletListItem extends StatelessWidget { runSpacing: 4, children: [ _MetaTag(label: _walletTypeLabel(wallet.config.type)), - _MetaTag( - label: _walletProvenanceLabel(wallet.config.provenance), - ), - _MetaTag( - label: _walletCreatedLabel(wallet.config.createdAt), - ), + if (wallet.config.provenance != WalletProvenance.unknown) + _MetaTag( + label: _walletProvenanceLabel(wallet.config.provenance), + ), + if (wallet.config.createdAt != null) + _MetaTag( + label: _walletCreatedLabel(wallet.config.createdAt!), + ), ], ), ], @@ -97,12 +101,11 @@ class WalletListItem extends StatelessWidget { return switch (provenance) { WalletProvenance.generated => 'Generated', WalletProvenance.imported => 'Imported', - WalletProvenance.unknown => LocaleKeys.unknown.tr(), + WalletProvenance.unknown => '', }; } - String _walletCreatedLabel(DateTime? createdAt) { - if (createdAt == null) return LocaleKeys.unknown.tr(); + String _walletCreatedLabel(DateTime createdAt) { return DateFormat('yyyy-MM-dd').format(createdAt); } } From 16bafbab25040eed24e50c9fcc9af91706d49561 Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:21:26 +0100 Subject: [PATCH 3/6] chore: update CI Flutter version --- .docker/komodo-wallet-android.dockerfile | 2 +- .github/actions/flutter-deps/action.yml | 2 +- .github/workflows/roll-sdk-packages.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.docker/komodo-wallet-android.dockerfile b/.docker/komodo-wallet-android.dockerfile index d690c4cd91..96166fe437 100644 --- a/.docker/komodo-wallet-android.dockerfile +++ b/.docker/komodo-wallet-android.dockerfile @@ -1,6 +1,6 @@ FROM komodo/android-sdk:35 AS final -ENV FLUTTER_VERSION="3.35.3" +ENV FLUTTER_VERSION="3.41.3" ENV HOME="/home/komodo" ENV USER="komodo" ENV PATH=$PATH:$HOME/flutter/bin diff --git a/.github/actions/flutter-deps/action.yml b/.github/actions/flutter-deps/action.yml index 0aade2d1b2..d963b056c2 100644 --- a/.github/actions/flutter-deps/action.yml +++ b/.github/actions/flutter-deps/action.yml @@ -8,7 +8,7 @@ runs: uses: subosito/flutter-action@v2 with: # NB! Keep up-to-date with the flutter version used for development - flutter-version: "3.35.3" + flutter-version: "3.41.3" channel: "stable" - name: Prepare build directory diff --git a/.github/workflows/roll-sdk-packages.yml b/.github/workflows/roll-sdk-packages.yml index 32af130c89..bf7e4fa0c6 100644 --- a/.github/workflows/roll-sdk-packages.yml +++ b/.github/workflows/roll-sdk-packages.yml @@ -48,7 +48,7 @@ jobs: uses: subosito/flutter-action@v2 with: # NB! Keep up-to-date with the flutter version used for development - flutter-version: "3.35.3" + flutter-version: "3.41.3" channel: "stable" - name: Determine configuration From 7d1c270b5dbf855a408d69dd69402810767aad20 Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:27:42 +0100 Subject: [PATCH 4/6] chore: update Flutter packages --- macos/Flutter/GeneratedPluginRegistrant.swift | 2 - .../komodo_persistence_layer/pubspec.yaml | 4 +- pubspec.lock | 222 ++++++++++-------- pubspec.yaml | 30 +-- 4 files changed, 144 insertions(+), 114 deletions(-) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index acf5262322..d9c61ba08d 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -15,7 +15,6 @@ import flutter_window_close import local_auth_darwin import mobile_scanner import package_info_plus -import path_provider_foundation import share_plus import shared_preferences_foundation import url_launcher_macos @@ -33,7 +32,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { LocalAuthPlugin.register(with: registry.registrar(forPlugin: "LocalAuthPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) diff --git a/packages/komodo_persistence_layer/pubspec.yaml b/packages/komodo_persistence_layer/pubspec.yaml index 5e56cc4d86..f3ce226d91 100644 --- a/packages/komodo_persistence_layer/pubspec.yaml +++ b/packages/komodo_persistence_layer/pubspec.yaml @@ -11,8 +11,8 @@ environment: # Add regular dependencies here. dependencies: # Approved via https://github.com/GLEECBTC/gleec-wallet/pull/1106 - hive_ce: ^2.11.3 # Community-maintained Hive package with WASM support + hive_ce: ^2.19.3 # Community-maintained Hive package with WASM support dev_dependencies: lints: ^5.1.1 - test: ^1.24.0 + test: ^1.30.0 diff --git a/pubspec.lock b/pubspec.lock index 46d83d1618..d1acf3f80b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: bloc - sha256: "52c10575f4445c61dd9e0cafcc6356fdd827c4c64dd7945ef3c4105f6b6ac189" + sha256: a48653a82055a900b88cd35f92429f068c5a8057ae9b136d197b3d56c57efb81 url: "https://pub.dev" source: hosted - version: "9.0.0" + version: "9.2.0" bloc_concurrency: dependency: "direct main" description: @@ -121,6 +121,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.2" + code_assets: + dependency: transitive + description: + name: code_assets + sha256: "83ccdaa064c980b5596c35dd64a8d3ecc68620174ab9b90b6343b753aa721687" + url: "https://pub.dev" + source: hosted + version: "1.0.0" collection: dependency: transitive description: @@ -181,10 +189,10 @@ packages: dependency: transitive description: name: dbus - sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" + sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270 url: "https://pub.dev" source: hosted - version: "0.7.11" + version: "0.7.12" decimal: dependency: "direct main" description: @@ -197,10 +205,10 @@ packages: dependency: transitive description: name: device_info_plus - sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a" + sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c" url: "https://pub.dev" source: hosted - version: "11.5.0" + version: "12.3.0" device_info_plus_platform_interface: dependency: transitive description: @@ -275,10 +283,10 @@ packages: dependency: transitive description: name: ffi - sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.2.0" file: dependency: transitive description: @@ -291,10 +299,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: e7e16c9d15c36330b94ca0e2ad8cb61f93cd5282d0158c09805aed13b5452f22 + sha256: "57d9a1dd5063f85fa3107fb42d1faffda52fdc948cefd5fe5ea85267a5fc7343" url: "https://pub.dev" source: hosted - version: "10.3.2" + version: "10.3.10" firebase_analytics: dependency: "direct main" description: @@ -331,10 +339,10 @@ packages: dependency: transitive description: name: firebase_core_platform_interface - sha256: "5dbc900677dcbe5873d22ad7fbd64b047750124f1f9b7ebe2a33b9ddccc838eb" + sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.0.2" firebase_core_web: dependency: transitive description: @@ -389,10 +397,10 @@ packages: dependency: transitive description: name: flutter_inappwebview_internal_annotations - sha256: "787171d43f8af67864740b6f04166c13190aa74a1468a1f1f1e9ee5b90c359cd" + sha256: e30fba942e3debea7b7e6cdd4f0f59ce89dd403a9865193e3221293b6d1544c6 url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" flutter_inappwebview_ios: dependency: transitive description: @@ -458,34 +466,34 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 + sha256: ee8068e0e1cd16c4a82714119918efdeed33b3ba7772c54b5d094ab53f9b7fd1 url: "https://pub.dev" source: hosted - version: "2.0.30" + version: "2.0.33" flutter_secure_storage: dependency: transitive description: name: flutter_secure_storage - sha256: f7eceb0bc6f4fd0441e29d43cab9ac2a1c5ffd7ea7b64075136b718c46954874 + sha256: da922f2aab2d733db7e011a6bcc4a825b844892d4edd6df83ff156b09a9b2e40 url: "https://pub.dev" source: hosted - version: "10.0.0-beta.4" + version: "10.0.0" flutter_secure_storage_darwin: dependency: transitive description: name: flutter_secure_storage_darwin - sha256: f226f2a572bed96bc6542198ebaec227150786e34311d455a7e2d3d06d951845 + sha256: "8878c25136a79def1668c75985e8e193d9d7d095453ec28730da0315dc69aee3" url: "https://pub.dev" source: hosted - version: "0.1.0" + version: "0.2.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "9b4b73127e857cd3117d43a70fa3dddadb6e0b253be62e6a6ab85caa0742182c" + sha256: "2b5c76dce569ab752d55a1cee6a2242bcc11fdba927078fb88c503f150767cda" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: @@ -498,18 +506,18 @@ packages: dependency: transitive description: name: flutter_secure_storage_web - sha256: "4c3f233e739545c6cb09286eeec1cc4744138372b985113acc904f7263bef517" + sha256: "6a1137df62b84b54261dca582c1c09ea72f4f9a4b2fcee21b025964132d5d0c3" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.0" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: ff32af20f70a8d0e59b2938fc92de35b54a74671041c814275afd80e27df9f21 + sha256: "3b7c8e068875dfd46719ff57c90d8c459c87f2302ed6b00ff006b3c9fcad1613" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.1.0" flutter_slidable: dependency: "direct main" description: @@ -577,10 +585,10 @@ packages: dependency: "direct main" description: name: get_it - sha256: a4292e7cf67193f8e7c1258203104eb2a51ec8b3a04baa14695f4064c144297b + sha256: ae78de7c3f2304b8d81f2bb6e320833e5e81de942188542328f074978cc0efa9 url: "https://pub.dev" source: hosted - version: "8.2.0" + version: "8.3.0" glob: dependency: transitive description: @@ -593,18 +601,26 @@ packages: dependency: "direct main" description: name: hive_ce - sha256: "708bb39050998707c5d422752159f91944d3c81ab42d80e1bd0ee37d8e130658" + sha256: "8e9980e68643afb1e765d3af32b47996552a64e190d03faf622cea07c1294418" url: "https://pub.dev" source: hosted - version: "2.11.3" + version: "2.19.3" hive_ce_flutter: dependency: "direct main" description: name: hive_ce_flutter - sha256: f5bd57fda84402bca7557fedb8c629c96c8ea10fab4a542968d7b60864ca02cc + sha256: "2677e95a333ff15af43ccd06af7eb7abbf1a4f154ea071997f3de4346cae913a" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.4" + hooks: + dependency: transitive + description: + name: hooks + sha256: e79ed1e8e1929bc6ecb6ec85f0cb519c887aa5b423705ded0d0f2d9226def388 + url: "https://pub.dev" + source: hosted + version: "1.0.2" html: dependency: transitive description: @@ -662,10 +678,10 @@ packages: dependency: transitive description: name: isolate_channel - sha256: f3d36f783b301e6b312c3450eeb2656b0e7d1db81331af2a151d9083a3f6b18d + sha256: a9d3d620695bc984244dafae00b95e4319d6974b2d77f4b9e1eb4f2efe099094 url: "https://pub.dev" source: hosted - version: "0.2.2+1" + version: "0.6.1" js: dependency: transitive description: @@ -678,10 +694,10 @@ packages: dependency: transitive description: name: json_annotation - sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" + sha256: cb09e7dac6210041fad964ed7fbee004f14258b4eca4040f72d1234062ace4c8 url: "https://pub.dev" source: hosted - version: "4.9.0" + version: "4.11.0" komodo_cex_market_data: dependency: "direct main" description: @@ -756,10 +772,10 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "8dcda04c3fc16c14f48a7bb586d4be1f0d1572731b6d81d51772ef47c02081e0" + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.0.2" leak_tracker_flutter_testing: dependency: transitive description: @@ -796,26 +812,26 @@ packages: dependency: transitive description: name: local_auth_android - sha256: "48924f4a8b3cc45994ad5993e2e232d3b00788a305c1bf1c7db32cef281ce9a3" + sha256: a0bdfcc0607050a26ef5b31d6b4b254581c3d3ce3c1816ab4d4f4a9173e84467 url: "https://pub.dev" source: hosted - version: "1.0.52" + version: "1.0.56" local_auth_darwin: dependency: transitive description: name: local_auth_darwin - sha256: "0e9706a8543a4a2eee60346294d6a633dd7c3ee60fae6b752570457c4ff32055" + sha256: "699873970067a40ef2f2c09b4c72eb1cfef64224ef041b3df9fdc5c4c1f91f49" url: "https://pub.dev" source: hosted - version: "1.6.0" + version: "1.6.1" local_auth_platform_interface: dependency: transitive description: name: local_auth_platform_interface - sha256: "1b842ff177a7068442eae093b64abe3592f816afd2a533c0ebcdbe40f9d2075a" + sha256: f98b8e388588583d3f781f6806e4f4c9f9e189d898d27f0c249b93a1973dd122 url: "https://pub.dev" source: hosted - version: "1.0.10" + version: "1.1.0" local_auth_windows: dependency: transitive description: @@ -836,10 +852,10 @@ packages: dependency: transitive description: name: markdown - sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + sha256: ee85086ad7698b42522c6ad42fe195f1b9898e4d974a1af4576c1a3a176cada9 url: "https://pub.dev" source: hosted - version: "7.3.0" + version: "7.3.1" matcher: dependency: transitive description: @@ -860,10 +876,10 @@ packages: dependency: "direct main" description: name: matomo_tracker - sha256: e5f179b3660193d62b7494abd2179c8dfcab8e66ffa76eeefe3b6f88fb3d8291 + sha256: cdf3bd31f50c89a313181a8f671074870f8ecc129ab4590cf016a2cb0e3c511a url: "https://pub.dev" source: hosted - version: "6.0.0" + version: "6.1.0" meta: dependency: transitive description: @@ -884,10 +900,10 @@ packages: dependency: transitive description: name: mobile_scanner - sha256: "54005bdea7052d792d35b4fef0f84ec5ddc3a844b250ecd48dc192fb9b4ebc95" + sha256: c92c26bf2231695b6d3477c8dcf435f51e28f87b1745966b1fe4c47a286171ce url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.2.0" mutex: dependency: "direct main" description: @@ -896,6 +912,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" + native_toolchain_c: + dependency: transitive + description: + name: native_toolchain_c + sha256: "6ba77bb18063eebe9de401f5e6437e95e1438af0a87a3a39084fbd37c90df572" + url: "https://pub.dev" + source: hosted + version: "0.17.6" nested: dependency: transitive description: @@ -920,6 +944,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + objective_c: + dependency: transitive + description: + name: objective_c + sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52" + url: "https://pub.dev" + source: hosted + version: "9.3.0" package_config: dependency: transitive description: @@ -972,18 +1004,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + sha256: f2c65e21139ce2c3dad46922be8272bb5963516045659e71bb16e151c93b580e url: "https://pub.dev" source: hosted - version: "2.2.18" + version: "2.2.22" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + sha256: "2a376b7d6392d80cd3705782d2caa734ca4727776db0b6ec36ef3f1855197699" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.6.0" path_provider_linux: dependency: transitive description: @@ -1012,10 +1044,10 @@ packages: dependency: transitive description: name: petitparser - sha256: "1a97266a94f7350d30ae522c0af07890c70b8e62c71e8e3920d1db4d23c057d1" + sha256: "91bd59303e9f769f108f8df05e371341b15d59e995e6806aefab827b58336675" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.2" platform: dependency: transitive description: @@ -1044,10 +1076,10 @@ packages: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + sha256: "978783255c543aa3586a1b3c21f6e9d720eb315376a915872c61ef8b5c20177d" url: "https://pub.dev" source: hosted - version: "1.5.1" + version: "1.5.2" process: dependency: transitive description: @@ -1124,26 +1156,26 @@ packages: dependency: "direct main" description: name: shared_preferences - sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64" url: "https://pub.dev" source: hosted - version: "2.5.3" + version: "2.5.4" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: a2608114b1ffdcbc9c120eb71a0e207c71da56202852d4aab8a5e30a82269e74 + sha256: "8374d6200ab33ac99031a852eba4c8eb2170c4bf20778b3e2c9eccb45384fb41" url: "https://pub.dev" source: hosted - version: "2.4.12" + version: "2.4.21" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f" url: "https://pub.dev" source: hosted - version: "2.5.4" + version: "2.5.6" shared_preferences_linux: dependency: transitive description: @@ -1233,10 +1265,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.2" sprintf: dependency: transitive description: @@ -1337,34 +1369,34 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "69ee86740f2847b9a4ba6cffa74ed12ce500bbe2b07f3dc1e643439da60637b7" + sha256: "767344bf3063897b5cf0db830e94f904528e6dd50a6dfaf839f0abf509009611" url: "https://pub.dev" source: hosted - version: "6.3.18" + version: "6.3.28" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0" url: "https://pub.dev" source: hosted - version: "6.3.4" + version: "6.4.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + sha256: d5e14138b3bc193a0f63c10a53c94b91d399df0512b1f29b94a043db7482384a url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + sha256: "368adf46f71ad3c21b8f06614adb38346f193f3a59ba8fe9a2fd74133070ba18" url: "https://pub.dev" source: hosted - version: "3.2.3" + version: "3.2.5" url_launcher_platform_interface: dependency: transitive description: @@ -1377,18 +1409,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + sha256: d0412fcf4c6b31ecfdb7762359b7206ffba3bbffd396c6d9f9c4616ece476c1f url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + sha256: "712c70ab1b99744ff066053cbe3e80c73332b38d46e5e945c98689b2e66fc15f" url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "3.1.5" uuid: dependency: "direct main" description: @@ -1401,10 +1433,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: a4f059dc26fc8295b5921376600a194c4ec7d55e72f2fe4c7d2831e103d461e6 + sha256: "7076216a10d5c390315fbe536a30f1254c341e7543e6c4c8a815e591307772b1" url: "https://pub.dev" source: hosted - version: "1.1.19" + version: "1.1.20" vector_graphics_codec: dependency: transitive description: @@ -1417,10 +1449,10 @@ packages: dependency: transitive description: name: vector_graphics_compiler - sha256: d354a7ec6931e6047785f4db12a1f61ec3d43b207fc0790f863818543f8ff0dc + sha256: "5a88dd14c0954a5398af544651c7fb51b457a2a556949bfb25369b210ef73a74" url: "https://pub.dev" source: hosted - version: "1.1.19" + version: "1.2.0" vector_math: dependency: transitive description: @@ -1433,34 +1465,34 @@ packages: dependency: "direct main" description: name: video_player - sha256: "0d55b1f1a31e5ad4c4967bfaa8ade0240b07d20ee4af1dfef5f531056512961a" + sha256: "48a7bdaa38a3d50ec10c78627abdbfad863fdf6f0d6e08c7c3c040cfd80ae36f" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.1" video_player_android: dependency: transitive description: name: video_player_android - sha256: "59e5a457ddcc1688f39e9aef0efb62aa845cf0cbbac47e44ac9730dc079a2385" + sha256: "9862c67c4661c98f30fe707bc1a4f97d6a0faa76784f485d282668e4651a7ac3" url: "https://pub.dev" source: hosted - version: "2.8.13" + version: "2.9.4" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: f9a780aac57802b2892f93787e5ea53b5f43cc57dc107bee9436458365be71cd + sha256: af0e5b8a7a4876fb37e7cc8cb2a011e82bb3ecfa45844ef672e32cb14a1f259e url: "https://pub.dev" source: hosted - version: "2.8.4" + version: "2.9.4" video_player_platform_interface: dependency: transitive description: name: video_player_platform_interface - sha256: cf2a1d29a284db648fd66cbd18aacc157f9862d77d2cc790f6f9678a46c1db5a + sha256: "57c5d73173f76d801129d0531c2774052c5a7c11ccb962f1830630decd9f24ec" url: "https://pub.dev" source: hosted - version: "6.4.0" + version: "6.6.0" video_player_web: dependency: transitive description: @@ -1481,10 +1513,10 @@ packages: dependency: transitive description: name: watcher - sha256: "5bf046f41320ac97a469d506261797f35254fa61c641741ef32dacda98b7d39c" + sha256: "1398c9f081a753f9226febe8900fce8f7d0a67163334e1c94a2438339d79d635" url: "https://pub.dev" source: hosted - version: "1.1.3" + version: "1.2.1" web: dependency: "direct main" description: @@ -1529,10 +1561,10 @@ packages: dependency: transitive description: name: win32 - sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.dev" source: hosted - version: "5.14.0" + version: "5.15.0" win32_registry: dependency: transitive description: @@ -1575,5 +1607,5 @@ packages: source: hosted version: "3.1.3" sdks: - dart: ">=3.9.0-0 <4.0.0" + dart: ">=3.10.3 <4.0.0" flutter: ">=3.41.3" diff --git a/pubspec.yaml b/pubspec.yaml index 288d5ffee3..9ed27397dd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -66,14 +66,14 @@ dependencies: ## ---- Dart.dev, Flutter.dev args: ^2.7.0 # dart.dev - flutter_markdown: ^0.7.7 # flutter.dev + flutter_markdown: ^0.7.7+1 # flutter.dev http: 1.4.0 # dart.dev intl: 0.20.2 # dart.dev - web: ^1.1.0 # dart.dev + web: ^1.1.1 # dart.dev url_launcher: 6.3.1 # flutter.dev crypto: 3.0.6 # dart.dev cross_file: 0.3.4+2 # flutter.dev - video_player: ^2.9.5 # flutter.dev + video_player: ^2.11.1 # flutter.dev logging: 1.3.0 mutex: ^3.1.0 @@ -93,8 +93,8 @@ dependencies: # Upgraded Firebase, needs secure code review - firebase_analytics: ^11.4.5 - firebase_core: ^3.13.0 + firebase_analytics: ^11.6.0 + firebase_core: ^3.15.2 ## ---- Fluttercommunity.dev @@ -120,10 +120,10 @@ dependencies: easy_localization: 3.0.7+1 # last reviewed 3.0.2 via https://github.com/GLEECBTC/gleec-wallet/pull/1106 # Approved via https://github.com/GLEECBTC/gleec-wallet/pull/1106 (Outdated) - hive_ce: ^2.11.3 # Community-maintained Hive package with WASM support + hive_ce: ^2.19.3 # Community-maintained Hive package with WASM support # Approved via https://github.com/GLEECBTC/gleec-wallet/pull/1106 (Outdated) - hive_ce_flutter: ^2.3.1 # Flutter bindings for hive_ce + hive_ce_flutter: ^2.3.4 # Flutter bindings for hive_ce # Approved via https://github.com/GLEECBTC/gleec-wallet/pull/1106 (Outdated) badges: 3.1.2 @@ -148,16 +148,16 @@ dependencies: # ^0.1.1-dev.3 # Option 3: Pub.dev dependency bloc_concurrency: 0.3.0 - file_picker: ^10.3.2 + file_picker: ^10.3.10 # TODO: review required - SDK integration path_provider: 2.1.5 # flutter.dev - shared_preferences: ^2.5.3 # flutter.dev + shared_preferences: ^2.5.4 # flutter.dev decimal: 3.2.1 # transitive dependency that is required to fix breaking changes in rational package rational: 2.2.3 # sdk depends on decimal ^3.0.2, which depends on rational ^2.0.0 uuid: 4.5.1 # sdk depends on this version - flutter_bloc: ^9.1.0 # sdk depends on this version, and hosted instead of git reference - get_it: ^8.0.3 # sdk depends on this version, and hosted instead of git reference + flutter_bloc: ^9.1.1 # sdk depends on this version, and hosted instead of git reference + get_it: ^8.3.0 # sdk depends on this version, and hosted instead of git reference komodo_defi_sdk: path: sdk/packages/komodo_defi_sdk # Option 1: Local path via sdk submodule (pinned). See docs/SDK_SUBMODULE_MANAGEMENT.md @@ -183,13 +183,13 @@ dependencies: # ref: dev # ^0.3.0+3 # Option 3: Pub.dev dependency - feedback: ^3.1.0 + feedback: ^3.2.0 ntp: ^2.0.0 - matomo_tracker: ^6.0.0 - flutter_window_close: ^1.2.0 + matomo_tracker: ^6.1.0 + flutter_window_close: ^1.3.0 dev_dependencies: - test: ^1.24.1 # dart.dev + test: ^1.30.0 # dart.dev # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is From 8b421e9495f57c81e7260b72246b61c13e697d3a Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Wed, 18 Mar 2026 13:31:56 +0100 Subject: [PATCH 5/6] chore: roll Flutter constraints --- .github/actions/flutter-deps/action.yml | 2 +- .github/workflows/roll-sdk-packages.yml | 2 +- app_theme/pubspec.yaml | 2 +- docs/FLUTTER_VERSION.md | 4 ++-- docs/MULTIPLE_FLUTTER_VERSIONS.md | 16 ++++++++-------- packages/komodo_ui_kit/pubspec.yaml | 2 +- pubspec.lock | 2 +- pubspec.yaml | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/actions/flutter-deps/action.yml b/.github/actions/flutter-deps/action.yml index d963b056c2..f5ae3ded2a 100644 --- a/.github/actions/flutter-deps/action.yml +++ b/.github/actions/flutter-deps/action.yml @@ -8,7 +8,7 @@ runs: uses: subosito/flutter-action@v2 with: # NB! Keep up-to-date with the flutter version used for development - flutter-version: "3.41.3" + flutter-version: "3.41.4" channel: "stable" - name: Prepare build directory diff --git a/.github/workflows/roll-sdk-packages.yml b/.github/workflows/roll-sdk-packages.yml index bf7e4fa0c6..5a7a015083 100644 --- a/.github/workflows/roll-sdk-packages.yml +++ b/.github/workflows/roll-sdk-packages.yml @@ -48,7 +48,7 @@ jobs: uses: subosito/flutter-action@v2 with: # NB! Keep up-to-date with the flutter version used for development - flutter-version: "3.41.3" + flutter-version: "3.41.4" channel: "stable" - name: Determine configuration diff --git a/app_theme/pubspec.yaml b/app_theme/pubspec.yaml index a4ec910fb4..28495f489a 100644 --- a/app_theme/pubspec.yaml +++ b/app_theme/pubspec.yaml @@ -7,7 +7,7 @@ resolution: workspace environment: sdk: ">=3.8.1 <4.0.0" - flutter: ">=3.41.3 <4.0.0" + flutter: ">=3.41.4 <4.0.0" dependencies: flutter: diff --git a/docs/FLUTTER_VERSION.md b/docs/FLUTTER_VERSION.md index 36907c53b0..027a2e57fa 100644 --- a/docs/FLUTTER_VERSION.md +++ b/docs/FLUTTER_VERSION.md @@ -2,7 +2,7 @@ ## Supported Flutter Version -This project supports Flutter `3.41.3`. We aim to keep the project up-to-date with the most recent stable Flutter versions. +This project supports Flutter `3.41.4`. We aim to keep the project up-to-date with the most recent stable Flutter versions. ## Recommended Approach: Multiple Flutter Versions @@ -22,7 +22,7 @@ If you still choose to use this method, you can run: ```bash cd ~/flutter -git checkout 3.41.3 +git checkout 3.41.4 flutter doctor ``` diff --git a/docs/MULTIPLE_FLUTTER_VERSIONS.md b/docs/MULTIPLE_FLUTTER_VERSIONS.md index a7404e0ac0..1636c7181e 100644 --- a/docs/MULTIPLE_FLUTTER_VERSIONS.md +++ b/docs/MULTIPLE_FLUTTER_VERSIONS.md @@ -57,7 +57,7 @@ sudo pacman -R flutter # for Arch 2. Launch Flutter Sidekick -3. Click on "Versions" in the sidebar and download Flutter version `3.41.3` +3. Click on "Versions" in the sidebar and download Flutter version `3.41.4` 4. Set this version as the global default by clicking the "Set as Global" button @@ -92,11 +92,11 @@ sudo pacman -R flutter # for Arch curl -fsSL https://fvm.app/install.sh | bash ``` -2. Install and use Flutter 3.41.3: +2. Install and use Flutter 3.41.4: ```bash - fvm install 3.41.3 - fvm global 3.41.3 + fvm install 3.41.4 + fvm global 3.41.4 ``` 3. Add FVM's default Flutter version to your PATH by adding the following to your `~/.bashrc`, `~/.zshrc`, or equivalent: @@ -131,11 +131,11 @@ sudo pacman -R flutter # for Arch choco install fvm ``` -3. Install and use Flutter 3.41.3: +3. Install and use Flutter 3.41.4: ```powershell - fvm install 3.41.3 - fvm global 3.41.3 + fvm install 3.41.4 + fvm global 3.41.4 ``` 4. Add FVM's Flutter version to your PATH: @@ -158,7 +158,7 @@ To use a specific Flutter version for a project: 2. Run: ```bash - fvm use 3.41.3 + fvm use 3.41.4 ``` This will create a `.fvmrc` file in your project, which specifies the Flutter version to use for this project. diff --git a/packages/komodo_ui_kit/pubspec.yaml b/packages/komodo_ui_kit/pubspec.yaml index 86865547e2..be22b24534 100644 --- a/packages/komodo_ui_kit/pubspec.yaml +++ b/packages/komodo_ui_kit/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none environment: sdk: ">=3.8.1 <4.0.0" - flutter: ">=3.41.3 <4.0.0" + flutter: ">=3.41.4 <4.0.0" resolution: workspace diff --git a/pubspec.lock b/pubspec.lock index d1acf3f80b..4699ef2da8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1608,4 +1608,4 @@ packages: version: "3.1.3" sdks: dart: ">=3.10.3 <4.0.0" - flutter: ">=3.41.3" + flutter: ">=3.41.4" diff --git a/pubspec.yaml b/pubspec.yaml index 9ed27397dd..360028ebe8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ version: 0.9.4+0 environment: sdk: ">=3.8.1 <4.0.0" - flutter: ">=3.41.3 <4.0.0" + flutter: ">=3.41.4 <4.0.0" workspace: - packages/komodo_ui_kit From 87e57c01342c6a31c17d59aaf00cec38af24755e Mon Sep 17 00:00:00 2001 From: CharlVS <77973576+CharlVS@users.noreply.github.com> Date: Wed, 18 Mar 2026 13:33:15 +0100 Subject: [PATCH 6/6] chore: update Docker Flutter version --- .docker/komodo-wallet-android.dockerfile | 2 +- docs/FLUTTER_VERSION.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.docker/komodo-wallet-android.dockerfile b/.docker/komodo-wallet-android.dockerfile index 96166fe437..fb40209619 100644 --- a/.docker/komodo-wallet-android.dockerfile +++ b/.docker/komodo-wallet-android.dockerfile @@ -1,6 +1,6 @@ FROM komodo/android-sdk:35 AS final -ENV FLUTTER_VERSION="3.41.3" +ENV FLUTTER_VERSION="3.41.4" ENV HOME="/home/komodo" ENV USER="komodo" ENV PATH=$PATH:$HOME/flutter/bin diff --git a/docs/FLUTTER_VERSION.md b/docs/FLUTTER_VERSION.md index 027a2e57fa..4e3357f175 100644 --- a/docs/FLUTTER_VERSION.md +++ b/docs/FLUTTER_VERSION.md @@ -15,7 +15,7 @@ See our guide on [Multiple Flutter Versions](MULTIPLE_FLUTTER_VERSIONS.md) for d While it's possible to pin your global Flutter installation to a specific version, **this approach is not recommended** due to: - Lack of isolation between projects -- Known issues with `flutter pub get` when using Flutter 3.41.3 +- Known issues with `flutter pub get` when using Flutter 3.41.4 - Difficulty switching between versions for different projects If you still choose to use this method, you can run: