feat(auth): implement one-click remember me sign-in functionality#3041
feat(auth): implement one-click remember me sign-in functionality#3041
Conversation
- Add automatic sign-in dialog for last logged-in wallet on app start - Store and retrieve wallet information in local storage when remember me is enabled - Implement remember me checkbox across all wallet flows (login, creation, import) - Add session-based dialog prevention to avoid multiple prompts - Support backward compatibility for existing stored wallet data Technical changes: - Introduce AppDialog as replacement for deprecated PopupDispatcher - Add WalletId JSON storage with pubkey hash for precise wallet matching - Update wallet manager widgets to support remember me state - Add translations for new UI elements - Implement proper storage cleanup when remember me is disabled This enhancement streamlines the user experience by allowing quick access to previously used wallets while maintaining security through password requirements.
|
Note Other AI code review bot(s) detectedCodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review. Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the WalkthroughThis update introduces a "remember me" or "one-click login" feature for wallets, allowing users to persist their last logged-in wallet and streamline future logins. It adds new UI components, translation strings, and persistent storage logic. The update also deprecates the old popup dialog system in favor of a new Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant MainLayout
participant Storage
participant WalletsManagerWrapper
participant AppDialog
User->>MainLayout: App start
MainLayout->>Storage: Read last_logged_in_wallet
alt Wallet data exists
MainLayout->>WalletsManagerWrapper: Parse and match wallet
alt Wallet found
MainLayout->>AppDialog: Show remembered wallet dialog
AppDialog->>User: Display wallet options
else Wallet not found
MainLayout->>Storage: Delete invalid wallet data
end
end
sequenceDiagram
participant User
participant WalletCreation/Import/Login
participant QuickLoginSwitch
participant IguanaWalletsManager
participant Storage
User->>WalletCreation/Import/Login: Initiate wallet creation/import/login
WalletCreation/Import/Login->>QuickLoginSwitch: Toggle quick login
WalletCreation/Import/Login->>IguanaWalletsManager: Pass rememberMe flag
IguanaWalletsManager->>Storage: Store or remove last_logged_in_wallet based on rememberMe
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Suggested labels
Suggested reviewers
Poem
✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
|
@coderabbitai review |
✅ Actions performedReview triggered.
|
|
Visit the preview URL for this PR (updated for commit 5eb3f99): https://walletrc--pull-3041-merge-ri6n088r.web.app (expires Mon, 08 Sep 2025 11:08:08 GMT) 🔥 via Firebase Hosting GitHub Action 🌎 Sign: f66a4ff03faa546f12f0ae5a841bd9eff2714dcc |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
lib/shared/widgets/app_dialog.dart (1)
134-162: Consider improving the callback design in showWithCallback.The
showWithCallbackmethod always passesnullto theonSuccesscallback (line 158), which may not provide useful information to the caller about the dialog result.Consider allowing the child to provide a result value:
- child: childBuilder(() { - Navigator.of(context).pop(); - if (onSuccess != null) { - onSuccess(null); // Pass null since we don't have a specific result - } - }), + child: childBuilder((T? result) { + Navigator.of(context).pop(result); + if (onSuccess != null) { + onSuccess(result); + } + }),And update the callback type:
- required Widget Function(VoidCallback onSuccess) childBuilder, + required Widget Function(void Function(T?) onSuccess) childBuilder,lib/views/main_layout/main_layout.dart (1)
141-149: Wallet matching logic with TODO.The wallet matching logic currently only matches by name, with a TODO comment indicating future enhancement for pubkey hash verification. This is a reasonable approach for initial implementation.
Consider implementing the pubkey hash verification mentioned in the TODO comment for more precise wallet matching:
// If we have a pubkey hash in the stored WalletId, ensure it matches if (walletId.hasFullIdentity && w.config.pubKey != null) { // Convert pubKey to hash and compare with walletId.pubkeyHash final pubKeyHash = /* implement hash calculation */; return pubKeyHash == walletId.pubkeyHash; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (2)
lib/generated/codegen_loader.g.dartis excluded by!**/generated/**pubspec.lockis excluded by!**/*.lock
📒 Files selected for processing (17)
analysis_options.yaml(1 hunks)assets/translations/en.json(3 hunks)lib/dispatchers/popup_dispatcher.dart(4 hunks)lib/shared/constants.dart(2 hunks)lib/shared/widgets/app_dialog.dart(1 hunks)lib/shared/widgets/quick_login_switch.dart(1 hunks)lib/views/main_layout/main_layout.dart(9 hunks)lib/views/wallets_manager/wallets_manager_wrapper.dart(3 hunks)lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart(1 hunks)lib/views/wallets_manager/widgets/iguana_wallets_manager.dart(13 hunks)lib/views/wallets_manager/widgets/wallet_creation.dart(5 hunks)lib/views/wallets_manager/widgets/wallet_import_by_file.dart(6 hunks)lib/views/wallets_manager/widgets/wallet_import_wrapper.dart(2 hunks)lib/views/wallets_manager/widgets/wallet_login.dart(6 hunks)lib/views/wallets_manager/widgets/wallet_simple_import.dart(7 hunks)lib/views/wallets_manager/widgets/wallets_manager.dart(2 hunks)pubspec.yaml(1 hunks)
🧰 Additional context used
🧠 Learnings (6)
📚 Learning: in the komodo wallet project, part files share imports with their parent files. the import for `app_...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2566
File: lib/bloc/coins_bloc/coins_bloc.dart:10-10
Timestamp: 2025-04-01T15:51:37.060Z
Learning: In the Komodo Wallet project, part files share imports with their parent files. The import for `app_config.dart` in `coins_bloc.dart` is necessary because the part file `coins_state.dart` uses `excludedAssetList` from that package.
Applied to files:
lib/views/wallets_manager/widgets/hdwallet_mode_switch.dartpubspec.yamllib/views/wallets_manager/widgets/wallet_import_wrapper.dartanalysis_options.yamllib/views/wallets_manager/wallets_manager_wrapper.dartlib/views/wallets_manager/widgets/wallet_creation.dartlib/views/wallets_manager/widgets/wallet_import_by_file.dartlib/views/wallets_manager/widgets/wallet_login.dartlib/views/wallets_manager/widgets/wallet_simple_import.dartlib/views/wallets_manager/widgets/iguana_wallets_manager.dartlib/views/main_layout/main_layout.dart
📚 Learning: the `excludedassetlist` from `app_config.dart` is used in the `_filterexcludedassets` method in `coi...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2566
File: lib/bloc/coins_bloc/coins_bloc.dart:10-10
Timestamp: 2025-04-01T15:51:37.060Z
Learning: The `excludedAssetList` from `app_config.dart` is used in the `_filterExcludedAssets` method in `coins_state.dart`. Since `coins_state.dart` is a part file of `coins_bloc.dart`, the import needs to be in the parent file even though it's not directly used there. In Dart, part files share the namespace and imports of their parent files.
Applied to files:
pubspec.yamllib/views/wallets_manager/widgets/wallet_import_wrapper.dartanalysis_options.yamllib/views/wallets_manager/widgets/wallet_creation.dartlib/views/wallets_manager/widgets/wallet_import_by_file.dartlib/views/wallets_manager/widgets/wallet_login.dartlib/views/wallets_manager/widgets/wallet_simple_import.dartlib/views/wallets_manager/widgets/iguana_wallets_manager.dartlib/views/main_layout/main_layout.dart
📚 Learning: it's acceptable to use unconditional `dart:io` imports in the komodo wallet codebase when the usage ...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2608
File: lib/bloc/fiat/fiat_onramp_form/fiat_form_bloc.dart:2-3
Timestamp: 2025-05-01T21:00:36.970Z
Learning: It's acceptable to use unconditional `dart:io` imports in the Komodo wallet codebase when the usage is guarded by `!kIsWeb` conditional checks that prevent the platform-specific code from being executed in web environments.
Applied to files:
lib/views/wallets_manager/widgets/wallet_import_wrapper.dartlib/views/wallets_manager/widgets/wallet_creation.dartlib/views/wallets_manager/widgets/wallet_import_by_file.dartlib/views/wallets_manager/widgets/wallet_login.dartlib/views/wallets_manager/widgets/wallet_simple_import.dartlib/views/wallets_manager/widgets/iguana_wallets_manager.dartlib/views/main_layout/main_layout.dart
📚 Learning: in the komodo wallet project, test functions are defined in individual files under `test_units/tests...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2611
File: test_units/tests/system_health/http_head_time_provider_test.dart:8-24
Timestamp: 2025-05-08T19:05:13.083Z
Learning: In the Komodo Wallet project, test functions are defined in individual files under `test_units/tests/` but are executed through the central entry point in `test_units/main.dart`, so individual test files don't need their own `main()` function.
Applied to files:
lib/views/wallets_manager/widgets/wallet_creation.dartlib/views/wallets_manager/widgets/wallet_login.dartlib/views/wallets_manager/widgets/iguana_wallets_manager.dartlib/views/main_layout/main_layout.dart
📚 Learning: in the komodo wallet project, test files are structured to define test functions that are called fro...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2611
File: test_units/tests/system_health/system_clock_repository_test.dart:7-8
Timestamp: 2025-05-08T19:07:13.442Z
Learning: In the Komodo Wallet project, test files are structured to define test functions that are called from a central test runner in test_units/main.dart, rather than each test file having its own main() function.
Applied to files:
lib/views/wallets_manager/widgets/wallet_creation.dartlib/views/wallets_manager/widgets/wallet_login.dartlib/views/wallets_manager/widgets/iguana_wallets_manager.dartlib/views/main_layout/main_layout.dart
📚 Learning: in the coinsmanagerbloc, `state.selectedcoins` is used separately from `state.coins` to indicate whe...
Learnt from: takenagain
PR: KomodoPlatform/komodo-wallet#2976
File: lib/bloc/coins_manager/coins_manager_bloc.dart:82-83
Timestamp: 2025-07-23T09:31:17.738Z
Learning: In the CoinsManagerBloc, `state.selectedCoins` is used separately from `state.coins` to indicate whether a coin is enabled or not in the UI. The order of Set deduplication when merging coin lists doesn't affect UI behavior because selection state is tracked independently from the coin list used for filtering and sorting.
Applied to files:
lib/views/main_layout/main_layout.dart
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (17)
- GitHub Check: Test web-app-linux-profile
- GitHub Check: Test web-app-macos
- GitHub Check: validate_code_guidelines
- GitHub Check: Cursor Bugbot
- GitHub Check: unit_tests
- GitHub Check: build_and_preview
- GitHub Check: Build Mobile (Android)
- GitHub Check: Build Mobile (iOS)
- GitHub Check: Build Desktop (macos)
- GitHub Check: Build Desktop (windows)
- GitHub Check: Build Desktop (linux)
- GitHub Check: build-android-docker
- GitHub Check: build-android-docker
- GitHub Check: Build Desktop (linux)
- GitHub Check: Build Desktop (windows)
- GitHub Check: Build Mobile (iOS)
- GitHub Check: Build Mobile (Android)
🔇 Additional comments (57)
pubspec.yaml (1)
175-175: LGTM! Good addition for code quality.Adding
bloc_lintas a dev dependency will help enforce Bloc-specific coding standards and best practices throughout the codebase, which is valuable given the existing use offlutter_bloc.lib/shared/constants.dart (2)
11-11: LGTM! Well-defined constant for wallet persistence.The new
lastLoggedInWalletKeyconstant provides a clean approach for storing/retrieving the last logged-in wallet, supporting the "remember me" functionality.
42-44: LGTM! Improved code formatting.The multi-line formatting with trailing commas improves readability while maintaining the same functionality.
assets/translations/en.json (2)
134-136: LGTM! Clear and informative translations for the one-click login feature.The new translation keys provide clear, user-friendly descriptions of the one-click login functionality with helpful tooltips and guidance about biometrics.
447-447: LGTM! Improved warning clarity for HD wallet mode.The updated subtitle text provides a stronger warning about the implications of switching to HD mode, making it clearer to users that addresses and balances will be different (while reassuring that coins aren't lost).
lib/views/wallets_manager/widgets/hdwallet_mode_switch.dart (2)
24-24: Const removal noted.The
constmodifier was removed from the Icon widget. This may be necessary for dynamic behavior, though it results in a minor performance cost as the widget can no longer be cached at compile time.
30-30: LGTM! Improved theming approach.Replacing the hardcoded
TextStyle(fontSize: 14)withTheme.of(context).textTheme.bodySmallprovides better consistency with the app's design system and allows the text to adapt to theme changes.analysis_options.yaml (1)
10-12: LGTM! Enhanced linting with Bloc-specific rules.Adding
bloc_lint/recommended.yamlalongside the existing Flutter lints will help enforce Bloc best practices and catch potential issues in state management code. The list structure is the correct YAML syntax for multiple includes.lib/views/wallets_manager/wallets_manager_wrapper.dart (2)
15-16: LGTM! Clean integration of remember me functionality.The
rememberMeparameter is properly added with a sensible default value and correctly propagated through the widget hierarchy toWalletsManager.Also applies to: 23-23, 66-66
45-47: Minor formatting improvements.The formatting changes to the
Textwidget style andWalletsTypeListinstantiation improve code readability without affecting functionality.Also applies to: 51-51
lib/views/wallets_manager/widgets/wallets_manager.dart (2)
16-17: LGTM! Appropriate selective implementation of remember me.The
rememberMeparameter is correctly added and passed only toIguanaWalletsManagerfor iguana/hdwallet types, which makes sense as hardware wallets likely have different authentication flows.Also applies to: 24-24, 37-37
41-41: Minor formatting improvement.The formatting change to
HardwareWalletsManagerimproves code consistency.lib/views/wallets_manager/widgets/wallet_import_wrapper.dart (2)
17-19: LGTM! Correct interface update for remember me functionality.The
onImportcallback signature is properly updated to include the requiredrememberMeparameter, ensuring consistent handling across the wallet import flow.
78-78: Minor formatting improvement.The enum declaration formatting change improves code conciseness.
lib/dispatchers/popup_dispatcher.dart (2)
11-36: Excellent deprecation documentation and approach.The comprehensive deprecation notice with migration examples and proper
@Deprecatedannotation follows best practices. This will help developers transition smoothly to the newAppDialogwhile maintaining backward compatibility.
81-82: Minor formatting improvements.The formatting changes to padding parameters improve code readability without affecting functionality.
Also applies to: 93-94, 104-104
lib/views/wallets_manager/widgets/wallet_creation.dart (2)
13-13: LGTM! Complete integration of remember me functionality.The implementation correctly:
- Imports and uses the
QuickLoginSwitchwidget- Updates the
onCreatecallback signature to includerememberMe- Manages local state for the remember me option
- Integrates the UI component appropriately in the form
- Passes the remember me state through the callback
The widget key for testing is also properly provided.
Also applies to: 30-32, 48-48, 172-179, 211-211
217-219: Minor formatting improvement.The formatting change to the
validateWalletNamecall improves code readability.lib/shared/widgets/quick_login_switch.dart (1)
5-36: Well-designed reusable widget for quick login toggle.The implementation follows Flutter best practices with a clean, focused responsibility. The inclusion of a tooltip with info icon enhances user experience by providing additional context about the feature.
lib/views/wallets_manager/widgets/wallet_import_by_file.dart (5)
15-15: LGTM: Clean import addition.The import of the new
QuickLoginSwitchwidget is properly added.
34-40: LGTM: Callback signature extension for remember me feature.The
onImportcallback signature is properly extended to include therememberMeparameter, maintaining consistency with the feature implementation across the codebase.
55-55: LGTM: Appropriate state initialization.The
_rememberMestate variable is properly initialized tofalse, providing a sensible default.
189-194: LGTM: Clean UI integration.The
QuickLoginSwitchis properly integrated into the UI with appropriate state management and callback handling.
285-285: LGTM: Consistent parameter passing.The
rememberMeparameter is correctly passed to theonImportcallback, completing the feature integration.lib/views/wallets_manager/widgets/wallet_simple_import.dart (5)
18-18: LGTM: Consistent import pattern.The
QuickLoginSwitchimport follows the same pattern as other widget imports in the project.
31-37: LGTM: Consistent callback signature extension.The
onImportcallback signature extension matches the pattern established in other import widgets, maintaining consistency across the codebase.
63-63: LGTM: Proper state initialization.The
_rememberMeboolean state is appropriately initialized tofalse.
201-207: LGTM: Well-placed UI integration.The
QuickLoginSwitchis logically placed in the password step, allowing users to set their preference during the import process.
353-353: LGTM: Complete feature integration.The
rememberMeparameter is correctly passed to complete the feature implementation flow.lib/views/wallets_manager/widgets/wallet_login.dart (6)
15-15: LGTM: Consistent import addition.The
QuickLoginSwitchimport is properly added following project conventions.
24-24: LGTM: Well-designed constructor parameter.The
initialQuickLoginparameter allows parent components to control the initial state of the quick login toggle, providing good flexibility for the feature.Also applies to: 32-32
29-29: LGTM: Callback signature extension for login flow.The
onLogincallback is properly extended to include the boolean parameter for quick login state, maintaining consistency with the feature implementation.
42-42: LGTM: Proper state management.The
_isQuickLoginEnabledstate is correctly initialized from the constructor parameter, allowing external control while maintaining internal state management.Also applies to: 49-49
129-134: LGTM: Strategic UI placement.The
QuickLoginSwitchis well-positioned between the password field and HD wallet mode switch, providing a logical flow for user interaction.
89-89: LGTM: Complete callback integration.The
_isQuickLoginEnabledstate is correctly passed to theonLogincallback, completing the feature integration in the login flow.lib/shared/widgets/app_dialog.dart (2)
5-62: Excellent documentation and migration guidance.The comprehensive documentation with clear migration examples will help developers transition from the deprecated
PopupDispatcher. This is a great example of how to document breaking changes.
76-128: Well-implemented dialog with responsive design.The
showmethod properly leverages Flutter's nativeshowDialogwith appropriate styling and responsive considerations. The parameter defaults and theming integration look solid.lib/views/wallets_manager/widgets/iguana_wallets_manager.dart (10)
1-1: New import for async operations.The
dart:asyncimport is correctly added to support the new asynchronous_updateRememberedWalletmethod and theunawaitedfunction call.
11-11: New imports for storage functionality.The imports for
WalletsRepository,GetStorage, andConstantsare properly added to support the remember me feature's storage requirements.Also applies to: 17-18
34-34: Constructor parameter for remember me functionality.The
rememberMeparameter is correctly added with a default value offalse, maintaining backward compatibility.Also applies to: 43-43
56-56: State initialization for remember me.The
_rememberMestate variable is properly initialized from the widget parameter ininitState.Also applies to: 65-65
177-177: Integration with WalletLogIn widget.The
initialQuickLoginparameter is correctly passed to theWalletLogInwidget, enabling the UI to reflect the current remember me state.
251-256: Remember me parameter in wallet creation.The
rememberMeparameter is properly added to the_createWalletmethod and the state is correctly updated. This ensures the remember me preference is captured during wallet creation.
271-276: Remember me parameter in wallet import.The
rememberMeparameter is properly added to the_importWalletmethod with correct state management. This maintains consistency across all wallet operations.
291-298: Method signature update for login.The
_logInToWalletmethod signature is correctly updated to accept therememberMeparameter and properly updates the state. The async nature is appropriate for the storage operations that follow.
343-343: Async storage update call.Using
unawaitedfor the_updateRememberedWalletcall is appropriate here since this is a fire-and-forget storage operation that shouldn't block the UI flow. The operation happens after successful authentication.
353-368: Storage key definition verifiedI’ve confirmed that
lastLoggedInWalletKeyis defined inlib/shared/constants.dart, so the storage reads and writes here are using a valid key. No further changes needed.lib/views/main_layout/main_layout.dart (10)
20-21: New imports for remember me functionality.The imports are correctly added to support:
- Storage operations (
GetStorage)- Constants for storage keys
- Wallet repository and types
- Dialog presentation (
AppDialog)All imports appear necessary for the implemented functionality.
Also applies to: 27-31
41-41: Dialog prevention mechanism.The
_hasShownRememberMeDialogflag is a good approach to prevent multiple dialog presentations within a session. This ensures a clean user experience.
54-54: Integration with initialization flow.The
_maybeShowRememberedWalletcall is properly placed in the post-frame callback, ensuring the widget tree is fully built before attempting to show dialogs.
68-71: Dispose method implementation.The dispose method is added but only calls
super.dispose(). This is acceptable as the current implementation doesn't require additional cleanup.
75-82: Dialog reset on logout.The
BlocConsumercorrectly resets the_hasShownRememberMeDialogflag when the user logs out, allowing the dialog to be shown again on subsequent sessions. This is essential for proper functionality.
110-119: Remember me dialog conditions.The method correctly checks:
- User is logged out (
AuthorizeMode.noLogin)- Dialog hasn't been shown yet
- Storage data exists
These conditions ensure the dialog only appears when appropriate.
121-134: Backward compatibility handling.The implementation correctly handles both new JSON format (
WalletId) and legacy string format (wallet name). This maintains compatibility with existing stored data while supporting the enhanced storage format.
159-168: Dialog presentation using AppDialog.The implementation correctly uses the new
AppDialogclass to replace the deprecatedPopupDispatcher. The dialog configuration looks appropriate with proper width constraint and callback handling.
169-173: Error handling for invalid data.The try-catch block appropriately handles parsing errors by clearing invalid stored data. This prevents the app from getting stuck with corrupted storage data.
212-216: MainLayoutFab constructor cleanup.The constructor parameters are properly organized with explicit parameter names and types. This improves code readability and maintainability.
Co-authored-by: charl <charl@vanstaden.info>
3cdd8a9 to
7f1a0a6
Compare
TODO(@takenagain): Refactor remember-me feature to bloc
a6fb374 to
49b0919
Compare
1235ebf to
28351f6
Compare
|
@smk762, please give it a whiz now. If this doesn't resolve the issue, please attach a video. The problem stems from my attempt to refactor the current flawed navigation/dialog system. We're missing out on cool goodies like page transitions, and it unnecessarily complicates things when it can easily be handled using the built-in navigation system. |
Co-authored-by: charl <charl@vanstaden.info>
Current build no longer autoselects any wallet on launch. |
…dd rememberMe param and updated mnemonic validation errors
…ogin to restore password manager saving\n\n- Remove premature TextInput.finishAutofillContext(shouldSave: true) on submit\n- Call finishAutofillContext(shouldSave: true) in onLogIn() after AuthBloc signals logged-in\n\nThis resolves the regression introduced with one-click login that prevented credential managers from saving/recalling credentials.
|
functioning as expected on web ✔️ |
|
Android also confirmed functioning as expected, with a caveat. In first tests today, I did encounter the At this point I was unsure if prior build/install had been completely removed from device, so to avoid a false positive, I made sure to uninstall, rebuild and retry. This third attempt was successful but I did briefly (approx 0.217 seconds) see the |
…prevent Android grey screen - Make AppDialog close idempotent and use navigator.maybePop() to avoid 'Bad state: No element' during 1-click login transitions - Wrap KDF signOut in try/catch so UI resets even if KDF stop times out - Align deprecated PopupDispatcher.close() to use maybePop()
smk762
left a comment
There was a problem hiding this comment.
Seems to be functioning as expected, thanks!

Technical changes:
This enhancement streamlines the user experience by allowing quick access to
previously used wallets while maintaining security through password requirements.
Summary by CodeRabbit
New Features
Improvements
Deprecations
Localization
Developer Experience