Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions lib/core/new_wallet_arguments.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,28 @@ class NewWalletArguments {
this.isChildWallet = false,
});
}

class WalletGroupArguments {
WalletGroupArguments({
required this.types,
this.currentType,
this.mnemonic,
});

final List<WalletType> types;
final WalletType? currentType;
final String? mnemonic;
}

class WalletGroupParams {
final List<WalletType> restTypes;
final String sharedMnemonic;
final bool isChildWallet;
final String groupKey;
const WalletGroupParams({
required this.restTypes,
required this.sharedMnemonic,
required this.isChildWallet,
required this.groupKey,
});
}
10 changes: 10 additions & 0 deletions lib/core/new_wallet_type_arguments.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,21 @@ import 'package:flutter/material.dart';
class NewWalletTypeArguments {
final void Function(BuildContext, WalletType)? onTypeSelected;
final bool isCreate;
final bool allowMultiSelect;
final bool constrainBip39Only;
final Set<WalletType> preselectedTypes;
final Object? credentials;
final HardwareWalletType? hardwareWalletType;
final String? walletGroupKey;

NewWalletTypeArguments({
required this.onTypeSelected,
required this.isCreate,
this.allowMultiSelect = false,
this.constrainBip39Only = false,
this.preselectedTypes = const {},
this.credentials,
this.hardwareWalletType,
this.walletGroupKey,
});
}
44 changes: 43 additions & 1 deletion lib/core/wallet_creation_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ class WalletCreationService {
required this.settingsStore,
required this.walletInfoSource})
: type = initialType {
changeWalletType(type: type);
if (initialType != WalletType.none) {
changeWalletType(type: initialType);
} else {
// Wait until type is provided
_service = null;
}
}

WalletType type;
Expand All @@ -30,17 +35,43 @@ class WalletCreationService {
WalletService? _service;

static const _isNewMoneroWalletPasswordUpdated = true;
static const _groupNameKeyPrefix = 'wallet_group_name_';

void changeWalletType({required WalletType type}) {
this.type = type;
if (type == WalletType.none) {
_service = null;
return;
}
_service = getIt.get<WalletService>(param1: type);
}

List<String> getAllCustomGroupNames() {
final result = <String>[];
for (final key in sharedPreferences.getKeys()) {
if (!key.startsWith(_groupNameKeyPrefix)) continue;
final value = sharedPreferences.getString(key);
if (value != null && value.trim().isNotEmpty) {
result.add(value.trim());
}
}
return result;
}

Future<void> setGroupNameForKey(String groupKey, String name) async {
await sharedPreferences.setString('$_groupNameKeyPrefix$groupKey', name);
}

bool exists(String name) {
final walletName = name.toLowerCase();
return walletInfoSource.values.any((walletInfo) => walletInfo.name.toLowerCase() == walletName);
}

bool groupNameExists(String name) {
final groupName = name.toLowerCase();
return getAllCustomGroupNames().any((name) => name.toLowerCase() == groupName);
}

bool typeExists(WalletType type) {
return walletInfoSource.values.any((walletInfo) => walletInfo.type == type);
}
Expand All @@ -52,6 +83,8 @@ class WalletCreationService {
}

Future<WalletBase> create(WalletCredentials credentials, {bool? isTestnet}) async {
_ensureServiceAvailable();

checkIfExists(credentials.name);

if (credentials.password == null) {
Expand Down Expand Up @@ -98,6 +131,8 @@ class WalletCreationService {
}

Future<WalletBase> restoreFromKeys(WalletCredentials credentials, {bool? isTestnet}) async {
_ensureServiceAvailable();

checkIfExists(credentials.name);

if (credentials.password == null) {
Expand All @@ -117,6 +152,7 @@ class WalletCreationService {
}

Future<WalletBase> restoreFromSeed(WalletCredentials credentials, {bool? isTestnet}) async {
_ensureServiceAvailable();
checkIfExists(credentials.name);

if (credentials.password == null) {
Expand All @@ -136,6 +172,8 @@ class WalletCreationService {
}

Future<WalletBase> restoreFromHardwareWallet(WalletCredentials credentials) async {
_ensureServiceAvailable();

checkIfExists(credentials.name);
final password = generateWalletPassword();
credentials.password = password;
Expand All @@ -149,4 +187,8 @@ class WalletCreationService {

return wallet;
}

void _ensureServiceAvailable() {
if (_service == null || type == WalletType.none) throw Exception('Wallet type is not set for WalletCreationService');
}
}
8 changes: 8 additions & 0 deletions lib/di.dart
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ import 'package:cake_wallet/view_model/integrations/deuro_view_model.dart';
import 'package:cake_wallet/view_model/link_view_model.dart';
import 'package:cake_wallet/tron/tron.dart';
import 'package:cake_wallet/src/screens/transaction_details/rbf_details_page.dart';
import 'package:cake_wallet/view_model/new_wallet_group_view_model.dart';
import 'package:cake_wallet/view_model/start_tor_view_model.dart';
import 'package:cw_core/receive_page_option.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
Expand Down Expand Up @@ -452,6 +453,12 @@ Future<void> setup({
newWalletArguments: newWalletArgs,));


getIt.registerFactoryParam<WalletGroupNewVM, WalletGroupArguments, void>(
(args, _) => WalletGroupNewVM(getIt.get<AppStore>(),
getIt.get<WalletCreationService>(param1: WalletType.none),
args: args,
walletNewVMBuilder: (args) => getIt<WalletNewVM>(param1: args)));

getIt.registerFactory<NewWalletTypeViewModel>(() => NewWalletTypeViewModel(_walletInfoSource));

getIt.registerFactory<WalletManager>(
Expand Down Expand Up @@ -1335,6 +1342,7 @@ Future<void> setup({
return NewWalletTypePage(
newWalletTypeArguments: newWalletTypeArguments,
newWalletTypeViewModel: getIt.get<NewWalletTypeViewModel>(),
seedSettingsViewModel: getIt.get<SeedSettingsViewModel>()
);
});

Expand Down
7 changes: 7 additions & 0 deletions lib/reactions/wallet_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@ bool isBIP39Wallet(WalletType walletType) {
}
}

bool onlyBIP39Selected(List<WalletType> types) {
for (var type in types) {
if (!isBIP39Wallet(type)) return false;
}
return true;
}

bool isElectrumWallet(WalletType walletType) {
switch (walletType) {
case WalletType.bitcoin:
Expand Down
32 changes: 24 additions & 8 deletions lib/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import 'package:cake_wallet/src/screens/integrations/deuro/savings_page.dart';
import 'package:cake_wallet/src/screens/monero_accounts/monero_account_edit_or_create_page.dart';
import 'package:cake_wallet/src/screens/nano/nano_change_rep_page.dart';
import 'package:cake_wallet/src/screens/nano_accounts/nano_account_edit_or_create_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/new_wallet_group_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/wallet_group_display_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/advanced_privacy_settings_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/new_wallet_page.dart';
Expand Down Expand Up @@ -135,6 +136,7 @@ import 'package:cake_wallet/view_model/dashboard/sign_view_model.dart';
import 'package:cake_wallet/view_model/hardware_wallet/hardware_wallet_view_model.dart';
import 'package:cake_wallet/view_model/hardware_wallet/ledger_view_model.dart';
import 'package:cake_wallet/view_model/monero_account_list/account_list_item.dart';
import 'package:cake_wallet/view_model/new_wallet_group_view_model.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/restore/restore_wallet.dart';
import 'package:cake_wallet/view_model/wallet_groups_display_view_model.dart';
Expand Down Expand Up @@ -207,16 +209,24 @@ Route<dynamic> createRoute(RouteSettings settings) {
return createRoute(RouteSettings(name: Routes.newWalletType));

case Routes.newWalletType:
final args = settings.arguments;

final NewWalletTypeArguments param = (args is NewWalletTypeArguments)
? args
: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {

Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
);
},
isCreate: true,
);

return handleRouteWithPlatformAwareness(
(_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
),
isCreate: true,
),
param1: param
),
);

Expand Down Expand Up @@ -244,6 +254,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
),
);

case Routes.newWalletGroup:
final args = settings.arguments as WalletGroupArguments;
final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>();
return handleRouteWithPlatformAwareness(
(_) => NewWalletGroupPage(getIt.get<WalletGroupNewVM>(param1: args),seedSettingsViewModel));

case Routes.chooseHardwareWalletAccount:
final arguments = settings.arguments as List<dynamic>;
final type = arguments[0] as WalletType;
Expand Down
1 change: 1 addition & 0 deletions lib/routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ class Routes {
static const welcomeWallet = '/welcome_create_restore_wallet';
static const welcomePage = '/welcome_page';
static const newWallet = '/new_wallet';
static const newWalletGroup = '/new_wallet_group';
static const setupPin = '/setup_pin_code';
static const newWalletFromWelcome = '/new_wallet_from_welcome';
static const seed = '/seed';
Expand Down
Loading
Loading