CW-580: BIP39 Wallets Shared Seed Implementation: "One Seed - Multiple Wallets" (#1307)

* feat: Implement creating new BIP39 wallet with same seed used for other owned BIP39 wallets

* feat: Use same seed for BIP39 Wallets

* Update pre_existing_seeds_page.dart

* Feat: BIP39 Same seed wallet creation using the Common Parent Wallet Strategy

* feat: Finalize implementing preexisting seeds

* feat: Implement shared bip39 wallet seed for Bitcoin wallet type

* feat: Implement shared bip39 wallet seed for Litecoin wallet type

* feat: Implement shared bip39 wallet seed for BitcoinCash wallet type

* feat: Implement shared bip39 wallet seed for Nano wallet type, although disabled entry for now

* fix: Remove non bip39 seed wallet type from listing

* feat: Implement grouped and single wallets lists in wallets listing page and implement editing and saving group names

* fix: Issue where the ontap always references the leadwallet, also make shared seed wallets section header only display when the multi wallet groups list is not empty

* fix: Add translation and adjust the way the groups display

* feat: Activate bip39 as an option for creating Nano wallet types

* fix: Handle edgecase with creating new wallet with group address, handle case where only bip39 derivation type is allowed with child wallets, activate nano wallet type for shared seed

* chore: Modify the UI to fit adjustment made on figma

* fix: Disposed box triggering error in hive and causing wallet list view to display error

* fix: Switch wallet groups title in wallets list page and also fix issue with renaming groups

* Update lib/reactions/bip39_wallet_utils.dart [skip ci]

Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

* Update lib/router.dart [skip ci]

Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>

* fix: Review fixes: Combine New Wallet Page Type arguments into a single model

* fix: Review fixes: Add failure guard when fetching mnemonic for selected wallet in pre-existing wallets page

* fix: Review fixes - Add loading indicator when mnemonic is being selected for wallet

* fix: Review fixes - Modify variable name to avoid clashes

* fix: Review fixes - Access WalletManager through dependency injection instead of service location

* fix: Review fixes - Add testnet to convertWalletInfoToWalletlistItem function, and adjust according where used

* fix: Review fixes - Add walletPassword to nano, tron and wownero wallets and confirm it is properly handled as it should be

* fix: Remove leadWallet, modify filtering flow to reflect this and not depend on leadWallet, and adjust privacy settings

* fix: Review Fixes - Modify restore flow to reflect current nature of bip39 as default for majority of wallet types

* fix: QA Fixes - Modify preexisting page to display wallet group names if set, and display them in incremental order if not set

* fix: Add wallet group description page and rename pre-existingseeds page to wallet group display page

* fix: Product Fix - Rename pre-existing seeds file name to wallet group display filename

* fix: Product fix - Separate multiwallets groups from single wallets and display separately

* fix - Product Fix - Add empty state for wallet group listing when creating a new wallet, adjust CTAs across buttons relating to the flow also

---------

Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
This commit is contained in:
David Adegoke 2024-09-20 19:25:08 +01:00 committed by GitHub
parent 3a391f10a3
commit 4e2e5e708c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
87 changed files with 2152 additions and 430 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

View file

@ -10,12 +10,17 @@ class BitcoinNewWalletCredentials extends WalletCredentials {
DerivationType? derivationType,
String? derivationPath,
String? passphrase,
this.mnemonic,
String? parentAddress,
}) : super(
name: name,
walletInfo: walletInfo,
password: password,
passphrase: passphrase,
parentAddress: parentAddress,
);
final String? mnemonic;
}
class BitcoinRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -41,7 +41,7 @@ class BitcoinWalletService extends WalletService<
case DerivationType.bip39:
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
mnemonic = await MnemonicBip39.generate(strength: strength);
mnemonic = credentials.mnemonic ?? await MnemonicBip39.generate(strength: strength);
break;
case DerivationType.electrum:
default:

View file

@ -36,7 +36,7 @@ class LitecoinWalletService extends WalletService<
case DerivationType.bip39:
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
mnemonic = await MnemonicBip39.generate(strength: strength);
mnemonic = credentials.mnemonic ?? await MnemonicBip39.generate(strength: strength);
break;
case DerivationType.electrum:
default:

View file

@ -2,9 +2,21 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart';
class BitcoinCashNewWalletCredentials extends WalletCredentials {
BitcoinCashNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password, String? passphrase})
: super(name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
BitcoinCashNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
String? passphrase,
this.mnemonic,
String? parentAddress,
}) : super(
name: name,
walletInfo: walletInfo,
password: password,
passphrase: passphrase,
parentAddress: parentAddress
);
final String? mnemonic;
}
class BitcoinCashRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -36,7 +36,7 @@ class BitcoinCashWalletService extends WalletService<
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final wallet = await BitcoinCashWalletBase.create(
mnemonic: await MnemonicBip39.generate(strength: strength),
mnemonic: credentials.mnemonic ?? await MnemonicBip39.generate(strength: strength),
password: credentials.password!,
walletInfo: credentials.walletInfo!,
unspentCoinsInfo: unspentCoinsInfoSource,

View file

@ -10,6 +10,7 @@ abstract class WalletCredentials {
this.passphrase,
this.derivationInfo,
this.hardwareWalletType,
this.parentAddress,
}) {
if (this.walletInfo != null && derivationInfo != null) {
this.walletInfo!.derivationInfo = derivationInfo;
@ -18,6 +19,7 @@ abstract class WalletCredentials {
final String name;
final int? height;
String? parentAddress;
int? seedPhraseLength;
String? password;
String? passphrase;

View file

@ -80,6 +80,7 @@ class WalletInfo extends HiveObject {
this.showIntroCakePayCard,
this.derivationInfo,
this.hardwareWalletType,
this.parentAddress,
) : _yatLastUsedAddressController = StreamController<String>.broadcast();
factory WalletInfo.external({
@ -97,6 +98,7 @@ class WalletInfo extends HiveObject {
String yatLastUsedAddressRaw = '',
DerivationInfo? derivationInfo,
HardwareWalletType? hardwareWalletType,
String? parentAddress,
}) {
return WalletInfo(
id,
@ -113,6 +115,7 @@ class WalletInfo extends HiveObject {
showIntroCakePayCard,
derivationInfo,
hardwareWalletType,
parentAddress,
);
}
@ -184,6 +187,9 @@ class WalletInfo extends HiveObject {
@HiveField(21)
HardwareWalletType? hardwareWalletType;
@HiveField(22)
String? parentAddress;
String get yatLastUsedAddress => yatLastUsedAddressRaw ?? '';
set yatLastUsedAddress(String address) {

View file

@ -21,7 +21,7 @@ class EthereumWalletService extends EVMChainWalletService<EthereumWallet> {
Future<EthereumWallet> create(EVMChainNewWalletCredentials credentials, {bool? isTestnet}) async {
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final mnemonic = bip39.generateMnemonic(strength: strength);
final mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
final wallet = EthereumWallet(
walletInfo: credentials.walletInfo!,

View file

@ -3,8 +3,20 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart';
class EVMChainNewWalletCredentials extends WalletCredentials {
EVMChainNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password})
: super(name: name, walletInfo: walletInfo, password: password);
EVMChainNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
String? parentAddress,
this.mnemonic,
}) : super(
name: name,
walletInfo: walletInfo,
password: password,
parentAddress: parentAddress,
);
final String? mnemonic;
}
class EVMChainRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -4,13 +4,19 @@ import 'package:cw_core/wallet_info.dart';
class NanoNewWalletCredentials extends WalletCredentials {
NanoNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
DerivationType? derivationType,
this.mnemonic,
String? parentAddress,
}) : super(
name: name,
password: password,
derivationInfo: DerivationInfo(derivationType: derivationType),
walletInfo: walletInfo,
parentAddress: parentAddress,
);
final String? mnemonic;
}
class NanoRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -32,15 +32,17 @@ class NanoWalletService extends WalletService<
@override
Future<WalletBase> create(NanoNewWalletCredentials credentials, {bool? isTestnet}) async {
// nano standard:
final String mnemonic;
switch (credentials.walletInfo?.derivationInfo?.derivationType) {
case DerivationType.nano:
String seedKey = NanoSeeds.generateSeed();
String mnemonic = NanoDerivations.standardSeedToMnemonic(seedKey);
// should never happen but just in case:
if (credentials.walletInfo!.derivationInfo == null) {
credentials.walletInfo!.derivationInfo = DerivationInfo(derivationType: DerivationType.nano);
} else if (credentials.walletInfo!.derivationInfo!.derivationType == null) {
credentials.walletInfo!.derivationInfo!.derivationType = DerivationType.nano;
mnemonic = credentials.mnemonic ?? NanoDerivations.standardSeedToMnemonic(seedKey);
break;
case DerivationType.bip39:
default:
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
break;
}
final wallet = NanoWallet(

View file

@ -24,7 +24,7 @@ class PolygonWalletService extends EVMChainWalletService<PolygonWallet> {
Future<PolygonWallet> create(EVMChainNewWalletCredentials credentials, {bool? isTestnet}) async {
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final mnemonic = bip39.generateMnemonic(strength: strength);
final mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
final wallet = PolygonWallet(
walletInfo: credentials.walletInfo!,

View file

@ -2,8 +2,19 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart';
class SolanaNewWalletCredentials extends WalletCredentials {
SolanaNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password})
: super(name: name, walletInfo: walletInfo, password: password);
SolanaNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
String? parentAddress,
this.mnemonic,
}) : super(
name: name,
walletInfo: walletInfo,
password: password,
parentAddress: parentAddress,
);
final String? mnemonic;
}
class SolanaRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -27,7 +27,7 @@ class SolanaWalletService extends WalletService<SolanaNewWalletCredentials,
Future<SolanaWallet> create(SolanaNewWalletCredentials credentials, {bool? isTestnet}) async {
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final mnemonic = bip39.generateMnemonic(strength: strength);
final mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
final wallet = SolanaWallet(
walletInfo: credentials.walletInfo!,

View file

@ -2,8 +2,20 @@ import 'package:cw_core/wallet_credentials.dart';
import 'package:cw_core/wallet_info.dart';
class TronNewWalletCredentials extends WalletCredentials {
TronNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password})
: super(name: name, walletInfo: walletInfo, password: password);
TronNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
this.mnemonic,
String? parentAddress,
}) : super(
name: name,
walletInfo: walletInfo,
password: password,
parentAddress: parentAddress,
);
final String? mnemonic;
}
class TronRestoreWalletFromSeedCredentials extends WalletCredentials {

View file

@ -39,7 +39,7 @@ class TronWalletService extends WalletService<
}) async {
final strength = credentials.seedPhraseLength == 24 ? 256 : 128;
final mnemonic = bip39.generateMnemonic(strength: strength);
final mnemonic = credentials.mnemonic ?? bip39.generateMnemonic(strength: strength);
final wallet = TronWallet(
walletInfo: credentials.walletInfo!,

View file

@ -3,41 +3,10 @@ PODS:
- Flutter
- MTBBarcodeScanner
- SwiftProtobuf
- BigInt (5.2.0)
- connectivity_plus (0.0.1):
- Flutter
- ReachabilitySwift
- CryptoSwift (1.8.2)
- cw_haven (0.0.1):
- cw_haven/Boost (= 0.0.1)
- cw_haven/Haven (= 0.0.1)
- cw_haven/OpenSSL (= 0.0.1)
- cw_haven/Sodium (= 0.0.1)
- cw_shared_external
- Flutter
- cw_haven/Boost (0.0.1):
- cw_shared_external
- Flutter
- cw_haven/Haven (0.0.1):
- cw_shared_external
- Flutter
- cw_haven/OpenSSL (0.0.1):
- cw_shared_external
- Flutter
- cw_haven/Sodium (0.0.1):
- cw_shared_external
- Flutter
- cw_shared_external (0.0.1):
- cw_shared_external/Boost (= 0.0.1)
- cw_shared_external/OpenSSL (= 0.0.1)
- cw_shared_external/Sodium (= 0.0.1)
- Flutter
- cw_shared_external/Boost (0.0.1):
- Flutter
- cw_shared_external/OpenSSL (0.0.1):
- Flutter
- cw_shared_external/Sodium (0.0.1):
- Flutter
- device_display_brightness (0.0.1):
- Flutter
- device_info_plus (0.0.1):
@ -99,8 +68,6 @@ PODS:
- Flutter
- MTBBarcodeScanner (5.0.11)
- OrderedSet (5.0.0)
- package_info (0.0.1):
- Flutter
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
@ -131,9 +98,6 @@ PODS:
- Toast (4.1.1)
- uni_links (0.0.1):
- Flutter
- UnstoppableDomainsResolution (4.0.0):
- BigInt
- CryptoSwift
- url_launcher_ios (0.0.1):
- Flutter
- wakelock_plus (0.0.1):
@ -145,8 +109,6 @@ DEPENDENCIES:
- barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`)
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- CryptoSwift
- cw_haven (from `.symlinks/plugins/cw_haven/ios`)
- cw_shared_external (from `.symlinks/plugins/cw_shared_external/ios`)
- device_display_brightness (from `.symlinks/plugins/device_display_brightness/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- devicelocale (from `.symlinks/plugins/devicelocale/ios`)
@ -158,7 +120,6 @@ DEPENDENCIES:
- flutter_secure_storage (from `.symlinks/plugins/flutter_secure_storage/ios`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
- package_info (from `.symlinks/plugins/package_info/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
@ -168,14 +129,12 @@ DEPENDENCIES:
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- sp_scanner (from `.symlinks/plugins/sp_scanner/ios`)
- uni_links (from `.symlinks/plugins/uni_links/ios`)
- UnstoppableDomainsResolution (~> 4.0.0)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`)
- workmanager (from `.symlinks/plugins/workmanager/ios`)
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
- BigInt
- CryptoSwift
- DKImagePickerController
- DKPhotoGallery
@ -187,17 +146,12 @@ SPEC REPOS:
- SwiftProtobuf
- SwiftyGif
- Toast
- UnstoppableDomainsResolution
EXTERNAL SOURCES:
barcode_scan2:
:path: ".symlinks/plugins/barcode_scan2/ios"
connectivity_plus:
:path: ".symlinks/plugins/connectivity_plus/ios"
cw_haven:
:path: ".symlinks/plugins/cw_haven/ios"
cw_shared_external:
:path: ".symlinks/plugins/cw_shared_external/ios"
device_display_brightness:
:path: ".symlinks/plugins/device_display_brightness/ios"
device_info_plus:
@ -220,8 +174,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/fluttertoast/ios"
in_app_review:
:path: ".symlinks/plugins/in_app_review/ios"
package_info:
:path: ".symlinks/plugins/package_info/ios"
package_info_plus:
:path: ".symlinks/plugins/package_info_plus/ios"
path_provider_foundation:
@ -249,11 +201,8 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0
BigInt: f668a80089607f521586bbe29513d708491ef2f7
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
CryptoSwift: c63a805d8bb5e5538e88af4e44bb537776af11ea
cw_haven: b3e54e1fbe7b8e6fda57a93206bc38f8e89b898a
cw_shared_external: 2972d872b8917603478117c9957dfca611845a92
device_display_brightness: 1510e72c567a1f6ce6ffe393dcd9afd1426034f7
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
devicelocale: b22617f40038496deffba44747101255cee005b0
@ -269,7 +218,6 @@ SPEC CHECKSUMS:
in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c
package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62
package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c
path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
@ -285,11 +233,10 @@ SPEC CHECKSUMS:
SwiftyGif: 706c60cf65fa2bc5ee0313beece843c8eb8194d4
Toast: 1f5ea13423a1e6674c4abdac5be53587ae481c4e
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
UnstoppableDomainsResolution: c3c67f4d0a5e2437cb00d4bd50c2e00d6e743841
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1
workmanager: 0afdcf5628bbde6924c21af7836fed07b42e30e6
PODFILE CHECKSUM: a2fe518be61cdbdc5b0e2da085ab543d556af2d3
PODFILE CHECKSUM: e448f662d4c41f0c0b1ccbb78afd57dbf895a597
COCOAPODS: 1.15.2

View file

@ -28,10 +28,22 @@ class CWBitcoin extends Bitcoin {
name: name, password: password, wif: wif, walletInfo: walletInfo);
@override
WalletCredentials createBitcoinNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password, String? passphrase}) =>
WalletCredentials createBitcoinNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
String? passphrase,
String? mnemonic,
String? parentAddress,
}) =>
BitcoinNewWalletCredentials(
name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
name: name,
walletInfo: walletInfo,
password: password,
passphrase: passphrase,
mnemonic: mnemonic,
parentAddress: parentAddress,
);
@override
WalletCredentials createBitcoinHardwareWalletCredentials(

View file

@ -16,9 +16,17 @@ class CWBitcoinCash extends BitcoinCash {
WalletInfo? walletInfo,
String? password,
String? passphrase,
String? mnemonic,
String? parentAddress,
}) =>
BitcoinCashNewWalletCredentials(
name: name, walletInfo: walletInfo, password: password, passphrase: passphrase);
name: name,
walletInfo: walletInfo,
password: password,
passphrase: passphrase,
parentAddress: parentAddress,
mnemonic: mnemonic,
);
@override
WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials(

View file

@ -0,0 +1,15 @@
import 'package:cw_core/wallet_type.dart';
class NewWalletArguments {
final WalletType type;
final String? mnemonic;
final String? parentAddress;
final bool isChildWallet;
NewWalletArguments({
required this.type,
this.parentAddress,
this.mnemonic,
this.isChildWallet = false,
});
}

View file

@ -0,0 +1,14 @@
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart';
class NewWalletTypeArguments {
final void Function(BuildContext, WalletType)? onTypeSelected;
final bool isCreate;
final bool isHardwareWallet;
NewWalletTypeArguments({
required this.onTypeSelected,
required this.isCreate,
required this.isHardwareWallet,
});
}

View file

@ -12,10 +12,12 @@ import 'package:cake_wallet/buy/moonpay/moonpay_provider.dart';
import 'package:cake_wallet/buy/onramper/onramper_buy_provider.dart';
import 'package:cake_wallet/buy/order.dart';
import 'package:cake_wallet/buy/payfura/payfura_buy_provider.dart';
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/buy/robinhood/robinhood_buy_provider.dart';
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/core/backup_service.dart';
import 'package:cake_wallet/core/key_service.dart';
import 'package:cake_wallet/core/new_wallet_type_arguments.dart';
import 'package:cake_wallet/core/secure_storage.dart';
import 'package:cake_wallet/core/totp_request_details.dart';
import 'package:cake_wallet/core/wallet_connect/wallet_connect_key_service.dart';
@ -30,6 +32,8 @@ import 'package:cake_wallet/entities/contact.dart';
import 'package:cake_wallet/entities/contact_record.dart';
import 'package:cake_wallet/entities/exchange_api_mode.dart';
import 'package:cake_wallet/entities/parse_address_from_domain.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
import 'package:cake_wallet/entities/wallet_manager.dart';
import 'package:cake_wallet/src/screens/receive/address_list_page.dart';
import 'package:cake_wallet/view_model/link_view_model.dart';
import 'package:cake_wallet/tron/tron.dart';
@ -145,7 +149,9 @@ import 'package:cake_wallet/view_model/cake_pay/cake_pay_cards_list_view_model.d
import 'package:cake_wallet/view_model/cake_pay/cake_pay_purchase_view_model.dart';
import 'package:cake_wallet/view_model/nano_account_list/nano_account_edit_or_create_view_model.dart';
import 'package:cake_wallet/view_model/nano_account_list/nano_account_list_view_model.dart';
import 'package:cake_wallet/view_model/new_wallet_type_view_model.dart';
import 'package:cake_wallet/view_model/node_list/pow_node_list_view_model.dart';
import 'package:cake_wallet/view_model/wallet_groups_display_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/set_up_2fa_viewmodel.dart';
import 'package:cake_wallet/view_model/restore/restore_from_qr_vm.dart';
@ -157,7 +163,6 @@ import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart
import 'package:cake_wallet/view_model/settings/trocador_providers_view_model.dart';
import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_item.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_edit_view_model.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
import 'package:cake_wallet/view_model/wallet_restore_choose_derivation_view_model.dart';
import 'package:cw_core/nano_account.dart';
import 'package:cw_core/unspent_coins_info.dart';
@ -358,13 +363,31 @@ Future<void> setup({
getIt.get<KeyService>(),
(WalletType type) => getIt.get<WalletService>(param1: type)));
getIt.registerFactoryParam<WalletNewVM, WalletType, void>((type, _) => WalletNewVM(
getIt.registerFactoryParam<WalletNewVM, NewWalletArguments, void>(
(newWalletArgs, _) => WalletNewVM(
getIt.get<AppStore>(),
getIt.get<WalletCreationService>(param1: type),
getIt.get<WalletCreationService>(param1:newWalletArgs.type),
_walletInfoSource,
getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
getIt.get<AdvancedPrivacySettingsViewModel>(param1: newWalletArgs.type),
getIt.get<SeedSettingsViewModel>(),
type: type));
newWalletArguments: newWalletArgs,));
getIt.registerFactory<NewWalletTypeViewModel>(() => NewWalletTypeViewModel(_walletInfoSource));
getIt.registerFactory<WalletManager>(
() => WalletManager(_walletInfoSource, getIt.get<SharedPreferences>()),
);
getIt.registerFactoryParam<WalletGroupsDisplayViewModel, WalletType, void>(
(type, _) => WalletGroupsDisplayViewModel(
getIt.get<AppStore>(),
getIt.get<WalletLoadingService>(),
getIt.get<WalletManager>(),
getIt.get<WalletListViewModel>(),
type: type,
),
);
getIt.registerFactoryParam<WalletUnlockPage, WalletUnlockArguments, bool>((args, closable) {
return WalletUnlockPage(
@ -723,6 +746,7 @@ Future<void> setup({
_walletInfoSource,
getIt.get<AppStore>(),
getIt.get<WalletLoadingService>(),
getIt.get<WalletManager>(),
),
);
} else {
@ -733,6 +757,7 @@ Future<void> setup({
_walletInfoSource,
getIt.get<AppStore>(),
getIt.get<WalletLoadingService>(),
getIt.get<WalletManager>(),
),
);
}
@ -743,17 +768,28 @@ Future<void> setup({
));
getIt.registerFactoryParam<WalletEditViewModel, WalletListViewModel, void>(
(WalletListViewModel walletListViewModel, _) =>
WalletEditViewModel(walletListViewModel, getIt.get<WalletLoadingService>()));
(WalletListViewModel walletListViewModel, _) => WalletEditViewModel(
walletListViewModel,
getIt.get<WalletLoadingService>(),
getIt.get<WalletManager>(),
),
);
getIt.registerFactoryParam<WalletEditPage, WalletEditPageArguments, void>((arguments, _) {
getIt.registerFactoryParam<WalletEditPage, List<dynamic>, void>((args, _) {
final walletListViewModel = args.first as WalletListViewModel;
final editingWallet = args.last as WalletListItem;
return WalletEditPage(
walletEditViewModel: getIt.get<WalletEditViewModel>(param1: walletListViewModel),
pageArguments: WalletEditPageArguments(
walletEditViewModel: getIt.get<WalletEditViewModel>(param1: arguments.walletListViewModel),
authService: getIt.get<AuthService>(),
walletNewVM: getIt.get<WalletNewVM>(param1: editingWallet.type),
editingWallet: editingWallet);
walletNewVM: getIt.get<WalletNewVM>(
param1: NewWalletArguments(type: arguments.editingWallet.type),
),
editingWallet: arguments.editingWallet,
isWalletGroup: arguments.isWalletGroup,
groupName: arguments.groupName,
parentAddress: arguments.parentAddress,
),
);
});
getIt.registerFactory<NanoAccountListViewModel>(() {
@ -1060,15 +1096,11 @@ Future<void> setup({
transactionDetailsViewModel:
getIt.get<TransactionDetailsViewModel>(param1: transactionInfo)));
getIt.registerFactoryParam<NewWalletTypePage, void Function(BuildContext, WalletType),
List<bool>?>((param1, additionalParams) {
final isCreate = additionalParams?[0] ?? true;
final isHardwareWallet = additionalParams?[1] ?? false;
getIt.registerFactoryParam<NewWalletTypePage, NewWalletTypeArguments, void>(
(newWalletTypeArguments, _) {
return NewWalletTypePage(
onTypeSelected: param1,
isCreate: isCreate,
isHardwareWallet: isHardwareWallet,
newWalletTypeArguments: newWalletTypeArguments,
newWalletTypeViewModel: getIt.get<NewWalletTypeViewModel>(),
);
});

View file

@ -79,6 +79,7 @@ class PreferencesKey {
static const autoGenerateSubaddressStatusKey = 'auto_generate_subaddress_status';
static const moneroSeedType = 'monero_seed_type';
static const bitcoinSeedType = 'bitcoin_seed_type';
static const nanoSeedType = 'nano_seed_type';
static const clearnetDonationLink = 'clearnet_donation_link';
static const onionDonationLink = 'onion_donation_link';
static const donationLinkWalletName = 'donation_link_wallet_name';

View file

@ -65,3 +65,28 @@ class BitcoinSeedType extends EnumerableItem<int> with Serializable<int> {
}
}
}
class NanoSeedType extends EnumerableItem<int> with Serializable<int> {
const NanoSeedType(this.type, {required String title, required int raw})
: super(title: title, raw: raw);
final DerivationType type;
static const all = [NanoSeedType.nanoStandard, NanoSeedType.bip39];
static const defaultDerivationType = bip39;
static const nanoStandard = NanoSeedType(DerivationType.nano, raw: 0, title: 'Nano');
static const bip39 = NanoSeedType(DerivationType.bip39, raw: 1, title: 'BIP39');
static NanoSeedType deserialize({required int raw}) {
switch (raw) {
case 0:
return nanoStandard;
case 1:
return bip39;
default:
throw Exception('Unexpected token: $raw for SeedType deserialize');
}
}
}

View file

@ -0,0 +1,28 @@
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_edit_view_model.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart';
class WalletEditPageArguments {
WalletEditPageArguments({
required this.editingWallet,
this.isWalletGroup = false,
this.walletListViewModel,
this.groupName = '',
this.parentAddress = '',
this.walletEditViewModel,
this.walletNewVM,
this.authService,
});
final WalletListItem editingWallet;
final bool isWalletGroup;
final String groupName;
final String parentAddress;
final WalletListViewModel? walletListViewModel;
final WalletEditViewModel? walletEditViewModel;
final WalletNewVM? walletNewVM;
final AuthService? authService;
}

View file

@ -0,0 +1,21 @@
import 'package:cw_core/wallet_info.dart';
class WalletGroup {
WalletGroup(this.parentAddress) : wallets = [];
/// Main identifier for each group, compulsory.
final String parentAddress;
/// Child wallets that share the same parent address within this group
List<WalletInfo> wallets;
/// Custom name for the group, editable for multi-child wallet groups
String? groupName;
/// Allows editing of the group name (only for multi-child groups).
void setCustomName(String name) {
if (wallets.length > 1) {
groupName = name;
}
}
}

View file

@ -0,0 +1,110 @@
import 'package:cake_wallet/entities/wallet_group.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:hive/hive.dart';
import 'package:shared_preferences/shared_preferences.dart';
class WalletManager {
WalletManager(
this._walletInfoSource,
this._sharedPreferences,
);
final Box<WalletInfo> _walletInfoSource;
final SharedPreferences _sharedPreferences;
final List<WalletGroup> walletGroups = [];
/// Categorize wallets into groups based on their parentAddress.
///
/// Update the lead wallet for each group and clean up empty groups
/// i.e remove group if there's no lead wallet (i.e, no wallets left)
void updateWalletGroups() {
walletGroups.clear();
for (var walletInfo in _walletInfoSource.values) {
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
group.wallets.add(walletInfo);
}
walletGroups.removeWhere((group) => group.wallets.isEmpty);
_loadCustomGroupNames();
}
/// Function to determine the correct parentAddress for a wallet.
///
/// If it's a parent wallet (parentAddress is null),
/// use its own address as parentAddress.
String _resolveParentAddress(WalletInfo walletInfo) {
return walletInfo.parentAddress ?? walletInfo.address;
}
/// Check if a group with the parentAddress already exists,
/// If no group exists, create a new one.
///
WalletGroup _getOrCreateGroup(String parentAddress) {
return walletGroups.firstWhere(
(group) => group.parentAddress == parentAddress,
orElse: () {
final newGroup = WalletGroup(parentAddress);
walletGroups.add(newGroup);
return newGroup;
},
);
}
/// Add a new wallet and update lead wallet after adding.
void addWallet(WalletInfo walletInfo) {
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
group.wallets.add(walletInfo);
}
/// Removes a wallet from a group i.e when it's deleted.
///
/// Update lead wallet after removing,
/// Remove the group if it's empty (i.e., no lead wallet).
void removeWallet(WalletInfo walletInfo) {
final group = _getOrCreateGroup(_resolveParentAddress(walletInfo));
group.wallets.remove(walletInfo);
if (group.wallets.isEmpty) {
walletGroups.remove(group);
}
}
/// Returns all the child wallets within a group.
///
/// If the group is not found, returns an empty group with no wallets.
List<WalletInfo> getWalletsInGroup(String parentAddress) {
return walletGroups
.firstWhere(
(group) => group.parentAddress == parentAddress,
orElse: () => WalletGroup(parentAddress),
)
.wallets;
}
/// Iterate through all groups and load their custom names from storage
void _loadCustomGroupNames() {
for (var group in walletGroups) {
final groupName = _sharedPreferences.getString('wallet_group_name_${group.parentAddress}');
if (groupName != null && group.wallets.length > 1) {
group.groupName = groupName; // Restore custom name
}
}
}
/// Save custom name for a group
void _saveCustomGroupName(String parentAddress, String name) {
_sharedPreferences.setString('wallet_group_name_$parentAddress', name);
}
// Set custom group name and persist it
void setGroupName(String parentAddress, String name) {
if (parentAddress.isEmpty || name.isEmpty) return;
final group = walletGroups.firstWhere((group) => group.parentAddress == parentAddress);
group.setCustomName(name);
_saveCustomGroupName(parentAddress, name); // Persist the custom name
}
}

View file

@ -10,10 +10,18 @@ class CWEthereum extends Ethereum {
@override
WalletCredentials createEthereumNewWalletCredentials({
required String name,
String? mnemonic,
String? parentAddress,
WalletInfo? walletInfo,
String? password,
}) =>
EVMChainNewWalletCredentials(name: name, walletInfo: walletInfo, password: password);
EVMChainNewWalletCredentials(
name: name,
walletInfo: walletInfo,
password: password,
parentAddress: parentAddress,
mnemonic: mnemonic,
);
@override
WalletCredentials createEthereumRestoreWalletFromSeedCredentials({

View file

@ -91,12 +91,17 @@ class CWNano extends Nano {
@override
WalletCredentials createNanoNewWalletCredentials({
required String name,
WalletInfo? walletInfo,
String? password,
String? mnemonic,
String? parentAddress,
}) =>
NanoNewWalletCredentials(
name: name,
password: password,
derivationType: DerivationType.nano,
mnemonic: mnemonic,
parentAddress: parentAddress,
walletInfo: walletInfo,
);
@override

View file

@ -8,12 +8,19 @@ class CWPolygon extends Polygon {
PolygonWalletService(walletInfoSource, isDirect, client: PolygonClient());
@override
WalletCredentials createPolygonNewWalletCredentials({
required String name,
WalletCredentials createPolygonNewWalletCredentials(
{required String name,
String? mnemonic,
String? parentAddress,
WalletInfo? walletInfo,
String? password
}) =>
EVMChainNewWalletCredentials(name: name, walletInfo: walletInfo, password: password);
String? password}) =>
EVMChainNewWalletCredentials(
name: name,
walletInfo: walletInfo,
password: password,
mnemonic: mnemonic,
parentAddress: parentAddress,
);
@override
WalletCredentials createPolygonRestoreWalletFromSeedCredentials({

View file

@ -0,0 +1,21 @@
import 'package:cw_core/wallet_type.dart';
bool isBIP39Wallet(WalletType walletType) {
switch (walletType) {
case WalletType.ethereum:
case WalletType.polygon:
case WalletType.solana:
case WalletType.tron:
case WalletType.bitcoin:
case WalletType.litecoin:
case WalletType.bitcoinCash:
case WalletType.nano:
case WalletType.banano:
return true;
case WalletType.monero:
case WalletType.wownero:
case WalletType.haven:
case WalletType.none:
return false;
}
}

View file

@ -1,11 +1,14 @@
import 'package:cake_wallet/anonpay/anonpay_info_base.dart';
import 'package:cake_wallet/anonpay/anonpay_invoice_info.dart';
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/buy/order.dart';
import 'package:cake_wallet/core/new_wallet_type_arguments.dart';
import 'package:cake_wallet/core/totp_request_details.dart';
import 'package:cake_wallet/core/wallet_connect/web3wallet_service.dart';
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/contact_record.dart';
import 'package:cake_wallet/entities/qr_view_data.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
import 'package:cake_wallet/entities/wallet_nft_response.dart';
import 'package:cake_wallet/exchange/trade.dart';
import 'package:cake_wallet/generated/i18n.dart';
@ -40,9 +43,11 @@ import 'package:cake_wallet/src/screens/faq/faq_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/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';
import 'package:cake_wallet/src/screens/new_wallet/new_wallet_type_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/wallet_group_description_page.dart';
import 'package:cake_wallet/src/screens/nodes/node_create_or_edit_page.dart';
import 'package:cake_wallet/src/screens/nodes/pow_node_create_or_edit_page.dart';
import 'package:cake_wallet/src/screens/order_details/order_details_page.dart';
@ -104,6 +109,7 @@ import 'package:cake_wallet/view_model/dashboard/sign_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/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/wallet_groups_display_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
import 'package:cake_wallet/view_model/wallet_hardware_restore_view_model.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart';
@ -134,7 +140,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
if (SettingsStoreBase.walletPasswordDirectInput) {
if (availableWalletTypes.length == 1) {
return createRoute(
RouteSettings(name: Routes.newWallet, arguments: availableWalletTypes.first));
RouteSettings(
name: Routes.newWallet,
arguments: NewWalletArguments(type: availableWalletTypes.first),
),
);
} else {
return createRoute(RouteSettings(name: Routes.newWalletType));
}
@ -144,8 +154,10 @@ Route<dynamic> createRoute(RouteSettings settings) {
builder: (_) =>
getIt.get<SetupPinCodePage>(param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
if (availableWalletTypes.length == 1) {
Navigator.of(context.context)
.pushNamed(Routes.newWallet, arguments: availableWalletTypes.first);
Navigator.of(context.context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: availableWalletTypes.first),
);
} else {
Navigator.of(context.context).pushNamed(Routes.newWalletType);
}
@ -155,16 +167,37 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.newWalletType:
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(Routes.newWallet, arguments: type)));
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
),
isCreate: true,
isHardwareWallet: false,
),
),
);
case Routes.walletGroupsDisplayPage:
final type = settings.arguments as WalletType;
final walletGroupsDisplayVM = getIt.get<WalletGroupsDisplayViewModel>(param1: type);
return CupertinoPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM));
case Routes.newWallet:
final type = settings.arguments as WalletType;
final walletNewVM = getIt.get<WalletNewVM>(param1: type);
final args = settings.arguments as NewWalletArguments;
final walletNewVM = getIt.get<WalletNewVM>(param1: args);
final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>();
return CupertinoPageRoute<void>(
builder: (_) => NewWalletPage(walletNewVM, seedSettingsViewModel));
builder: (_) => NewWalletPage(
walletNewVM,
seedSettingsViewModel,
isChildWallet: args.isChildWallet,
),
);
case Routes.chooseHardwareWalletAccount:
final arguments = settings.arguments as List<dynamic>;
@ -186,9 +219,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.restoreWalletType:
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: (BuildContext context, WalletType type) =>
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: type),
param2: [false, false]));
isCreate: false,
isHardwareWallet: false,
),
),
);
case Routes.restoreOptions:
if (SettingsStoreBase.walletPasswordDirectInput) {
@ -221,9 +259,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
} else {
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: (BuildContext context, WalletType type) =>
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: type),
param2: [false, false]));
isCreate: false,
isHardwareWallet: false,
),
),
);
}
case Routes.restoreWalletFromHardwareWallet:
@ -253,7 +296,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
} else {
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: (BuildContext context, WalletType type) {
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {
final arguments = ConnectDevicePageParams(
walletType: type,
onConnectDevice: (BuildContext context, _) => Navigator.of(context)
@ -262,13 +306,24 @@ Route<dynamic> createRoute(RouteSettings settings) {
Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments);
},
param2: [false, true]));
isCreate: false,
isHardwareWallet: true,
),
),
);
}
case Routes.restoreWalletTypeFromQR:
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: (BuildContext context, WalletType type) => Navigator.of(context).pop(type)));
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pop(type),
isCreate: false,
isHardwareWallet: false,
),
),
);
case Routes.seed:
return MaterialPageRoute<void>(
@ -342,7 +397,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.walletEdit:
return MaterialPageRoute<void>(
fullscreenDialog: true,
builder: (_) => getIt.get<WalletEditPage>(param1: settings.arguments as List<dynamic>));
builder: (_) =>
getIt.get<WalletEditPage>(param1: settings.arguments as WalletEditPageArguments),
);
case Routes.auth:
return MaterialPageRoute<void>(
@ -592,12 +649,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
final args = settings.arguments as Map<String, dynamic>;
final type = args['type'] as WalletType;
final isFromRestore = args['isFromRestore'] as bool? ?? false;
final isChildWallet = args['isChildWallet'] as bool? ?? false;
final useTestnet = args['useTestnet'] as bool;
final toggleTestnet = args['toggleTestnet'] as Function(bool? val);
return CupertinoPageRoute<void>(
builder: (_) => AdvancedPrivacySettingsPage(
isFromRestore: isFromRestore,
isChildWallet: isChildWallet,
useTestnet: useTestnet,
toggleUseTestnet: toggleTestnet,
advancedPrivacySettingsViewModel:
@ -712,6 +771,15 @@ Route<dynamic> createRoute(RouteSettings settings) {
return MaterialPageRoute<void>(
builder: (_) => ConnectDevicePage(params, getIt.get<LedgerViewModel>()));
case Routes.walletGroupDescription:
final walletType = settings.arguments as WalletType;
return MaterialPageRoute<void>(
builder: (_) => WalletGroupDescriptionPage(
selectedWalletType: walletType,
),
);
default:
return MaterialPageRoute<void>(
builder: (_) => Scaffold(

View file

@ -8,8 +8,7 @@ class Routes {
static const restoreWalletFromSeedKeys = '/restore_wallet_from_seeds_keys';
static const restoreWalletFromHardwareWallet = '/restore/hardware_wallet';
static const restoreWalletTypeFromQR = '/restore_wallet_from_qr_code';
static const restoreWalletChooseDerivation =
'/restore_wallet_choose_derivation';
static const restoreWalletChooseDerivation = '/restore_wallet_choose_derivation';
static const chooseHardwareWalletAccount = '/restore/hardware_wallet/accounts';
static const dashboard = '/dashboard';
static const send = '/send';
@ -99,11 +98,13 @@ class Routes {
static const editToken = '/edit_token';
static const manageNodes = '/manage_nodes';
static const managePowNodes = '/manage_pow_nodes';
static const walletConnectConnectionsListing =
'/wallet-connect-connections-listing';
static const walletConnectConnectionsListing = '/wallet-connect-connections-listing';
static const nftDetailsPage = '/nft_details_page';
static const importNFTPage = '/import_nft_page';
static const torPage = '/tor_page';
static const signPage = '/sign_page';
static const connectDevices = '/device/connect';
static const walletGroupsDisplayPage = '/wallet_groups_display_page';
static const walletGroupDescription = '/wallet_group_description';
}

View file

@ -10,10 +10,18 @@ class CWSolana extends Solana {
@override
WalletCredentials createSolanaNewWalletCredentials({
required String name,
String? mnemonic,
String? parentAddress,
WalletInfo? walletInfo,
String? password,
}) =>
SolanaNewWalletCredentials(name: name, walletInfo: walletInfo, password: password);
SolanaNewWalletCredentials(
name: name,
walletInfo: walletInfo,
password: password,
mnemonic: mnemonic,
parentAddress: parentAddress,
);
@override
WalletCredentials createSolanaRestoreWalletFromSeedCredentials({

View file

@ -1,4 +1,6 @@
import 'package:another_flushbar/flushbar.dart';
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/entities/desktop_dropdown_item.dart';
import 'package:cake_wallet/generated/i18n.dart';
@ -219,7 +221,7 @@ class _DesktopWalletSelectionDropDownState extends State<DesktopWalletSelectionD
widget._authService.authenticateAction(
context,
route: Routes.newWallet,
arguments: widget.walletListViewModel.currentWalletType,
arguments: NewWalletArguments(type: widget.walletListViewModel.currentWalletType),
conditionToDetermineIfToUse2FA:
widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
);

View file

@ -9,10 +9,12 @@ import 'package:cake_wallet/src/screens/nodes/widgets/node_form.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_picker_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_switcher_cell.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
import 'package:cake_wallet/themes/extensions/new_wallet_theme.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/advanced_privacy_settings_view_model.dart';
import 'package:cake_wallet/view_model/node_list/node_create_or_edit_view_model.dart';
import 'package:cake_wallet/view_model/seed_settings_view_model.dart';
@ -24,6 +26,7 @@ import 'package:flutter_mobx/flutter_mobx.dart';
class AdvancedPrivacySettingsPage extends BasePage {
AdvancedPrivacySettingsPage({
required this.isFromRestore,
required this.isChildWallet,
required this.useTestnet,
required this.toggleUseTestnet,
required this.advancedPrivacySettingsViewModel,
@ -39,25 +42,40 @@ class AdvancedPrivacySettingsPage extends BasePage {
String get title => S.current.privacy_settings;
final bool isFromRestore;
final bool isChildWallet;
final bool useTestnet;
final Function(bool? val) toggleUseTestnet;
@override
Widget body(BuildContext context) => _AdvancedPrivacySettingsBody(isFromRestore, useTestnet,
toggleUseTestnet, advancedPrivacySettingsViewModel, nodeViewModel, seedSettingsViewModel);
Widget body(BuildContext context) => _AdvancedPrivacySettingsBody(
isFromRestore,
isChildWallet,
useTestnet,
toggleUseTestnet,
advancedPrivacySettingsViewModel,
nodeViewModel,
seedSettingsViewModel,
);
}
class _AdvancedPrivacySettingsBody extends StatefulWidget {
const _AdvancedPrivacySettingsBody(this.isFromRestore, this.useTestnet, this.toggleUseTestnet,
this.privacySettingsViewModel, this.nodeViewModel, this.seedTypeViewModel,
{Key? key})
: super(key: key);
const _AdvancedPrivacySettingsBody(
this.isFromRestore,
this.isChildWallet,
this.useTestnet,
this.toggleUseTestnet,
this.privacySettingsViewModel,
this.nodeViewModel,
this.seedTypeViewModel, {
Key? key,
}) : super(key: key);
final AdvancedPrivacySettingsViewModel privacySettingsViewModel;
final NodeCreateOrEditViewModel nodeViewModel;
final SeedSettingsViewModel seedTypeViewModel;
final bool isFromRestore;
final bool isChildWallet;
final bool useTestnet;
final Function(bool? val) toggleUseTestnet;
@ -78,6 +96,16 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
passphraseController
.addListener(() => widget.seedTypeViewModel.setPassphrase(passphraseController.text));
if (widget.isChildWallet) {
if (widget.privacySettingsViewModel.type == WalletType.bitcoin) {
widget.seedTypeViewModel.setBitcoinSeedType(BitcoinSeedType.bip39);
}
if (widget.privacySettingsViewModel.type == WalletType.nano) {
widget.seedTypeViewModel.setNanoSeedType(NanoSeedType.bip39);
}
}
super.initState();
}
@ -116,7 +144,7 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
),
);
}),
if (widget.privacySettingsViewModel.hasSeedTypeOption)
if (widget.privacySettingsViewModel.isMoneroSeedTypeOptionsEnabled)
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<MoneroSeedType>(
@ -127,15 +155,37 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
),
);
}),
if ([WalletType.bitcoin, WalletType.litecoin]
.contains(widget.privacySettingsViewModel.type))
if (widget.privacySettingsViewModel.isBitcoinSeedTypeOptionsEnabled)
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<BitcoinSeedType>(
title: S.current.seedtype,
items: BitcoinSeedType.all,
selectedItem: widget.seedTypeViewModel.bitcoinSeedType,
onItemSelected: widget.seedTypeViewModel.setBitcoinSeedType,
onItemSelected: (type) {
if (widget.isChildWallet && type != BitcoinSeedType.bip39) {
showAlertForSelectingNonBIP39DerivationTypeForChildWallets();
} else {
widget.seedTypeViewModel.setBitcoinSeedType(type);
}
},
),
);
}),
if (widget.privacySettingsViewModel.isNanoSeedTypeOptionsEnabled)
Observer(builder: (_) {
return SettingsChoicesCell(
ChoicesListItem<NanoSeedType>(
title: S.current.seedtype,
items: NanoSeedType.all,
selectedItem: widget.seedTypeViewModel.nanoSeedType,
onItemSelected: (type) {
if (widget.isChildWallet && type != NanoSeedType.bip39) {
showAlertForSelectingNonBIP39DerivationTypeForChildWallets();
} else {
widget.seedTypeViewModel.setNanoSeedType(type);
}
},
),
);
}),
@ -256,6 +306,19 @@ class _AdvancedPrivacySettingsBodyState extends State<_AdvancedPrivacySettingsBo
);
}
void showAlertForSelectingNonBIP39DerivationTypeForChildWallets() {
showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithOneAction(
alertTitle: S.current.seedtype_alert_title,
alertContent: S.current.seedtype_alert_content,
buttonText: S.of(context).ok,
buttonAction: () => Navigator.of(context).pop(),
);
});
}
@override
void dispose() {
passphraseController

View file

@ -26,10 +26,15 @@ import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:mobx/mobx.dart';
class NewWalletPage extends BasePage {
NewWalletPage(this._walletNewVM, this._seedSettingsViewModel);
NewWalletPage(
this._walletNewVM,
this._seedSettingsViewModel, {
this.isChildWallet = false,
});
final WalletNewVM _walletNewVM;
final SeedSettingsViewModel _seedSettingsViewModel;
final bool isChildWallet;
final walletNameImage = Image.asset('assets/images/wallet_name.png');
@ -50,13 +55,21 @@ class NewWalletPage extends BasePage {
Widget body(BuildContext context) => WalletNameForm(
_walletNewVM,
currentTheme.type == ThemeType.dark ? walletNameImage : walletNameLightImage,
_seedSettingsViewModel);
_seedSettingsViewModel,
isChildWallet,
);
}
class WalletNameForm extends StatefulWidget {
WalletNameForm(this._walletNewVM, this.walletImage, this._seedSettingsViewModel);
WalletNameForm(
this._walletNewVM,
this.walletImage,
this._seedSettingsViewModel,
this.isChildWallet,
);
final WalletNewVM _walletNewVM;
final bool isChildWallet;
final Image walletImage;
final SeedSettingsViewModel _seedSettingsViewModel;
@ -338,7 +351,8 @@ class _WalletNameFormState extends State<WalletNameForm> {
Navigator.of(context).pushNamed(Routes.advancedPrivacySettings, arguments: {
"type": _walletNewVM.type,
"useTestnet": _walletNewVM.useTestnet,
"toggleTestnet": _walletNewVM.toggleUseTestnet
"toggleTestnet": _walletNewVM.toggleUseTestnet,
"isChildWallet": widget.isChildWallet,
});
},
child: Text(S.of(context).advanced_settings),

View file

@ -1,6 +1,10 @@
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/core/new_wallet_type_arguments.dart';
import 'dart:io';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/reactions/bip39_wallet_utils.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/widgets/select_button.dart';
import 'package:cake_wallet/src/screens/setup_2fa/widgets/popup_cancellable_alert.dart';
@ -11,6 +15,7 @@ import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/themes/theme_base.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/new_wallet_type_view_model.dart';
import 'package:cake_wallet/wallet_types.g.dart';
import 'package:cw_core/hardware/device_connection_type.dart';
import 'package:cw_core/wallet_type.dart';
@ -18,21 +23,20 @@ import 'package:flutter/material.dart';
class NewWalletTypePage extends BasePage {
NewWalletTypePage({
required this.onTypeSelected,
required this.isCreate,
required this.isHardwareWallet,
required this.newWalletTypeViewModel,
required this.newWalletTypeArguments,
});
final void Function(BuildContext, WalletType) onTypeSelected;
final bool isCreate;
final bool isHardwareWallet;
final NewWalletTypeViewModel newWalletTypeViewModel;
final NewWalletTypeArguments newWalletTypeArguments;
final walletTypeImage = Image.asset('assets/images/wallet_type.png');
final walletTypeLightImage = Image.asset('assets/images/wallet_type_light.png');
@override
String get title =>
isCreate ? S.current.wallet_list_create_new_wallet : S.current.wallet_list_restore_wallet;
String get title => newWalletTypeArguments.isCreate
? S.current.wallet_list_create_new_wallet
: S.current.wallet_list_restore_wallet;
@override
Function(BuildContext)? get pushToNextWidget => (context) {
@ -44,24 +48,27 @@ class NewWalletTypePage extends BasePage {
@override
Widget body(BuildContext context) => WalletTypeForm(
onTypeSelected: onTypeSelected,
walletImage: currentTheme.type == ThemeType.dark ? walletTypeImage : walletTypeLightImage,
isCreate: isCreate,
isHardwareWallet: isHardwareWallet,
isCreate: newWalletTypeArguments.isCreate,
newWalletTypeViewModel: newWalletTypeViewModel,
onTypeSelected: newWalletTypeArguments.onTypeSelected,
isHardwareWallet: newWalletTypeArguments.isHardwareWallet,
);
}
class WalletTypeForm extends StatefulWidget {
WalletTypeForm({
required this.onTypeSelected,
required this.walletImage,
required this.isCreate,
required this.newWalletTypeViewModel,
this.onTypeSelected,
required this.isHardwareWallet,
});
final void Function(BuildContext, WalletType) onTypeSelected;
final Image walletImage;
final bool isCreate;
final Image walletImage;
final NewWalletTypeViewModel newWalletTypeViewModel;
final void Function(BuildContext, WalletType)? onTypeSelected;
final bool isHardwareWallet;
@override
@ -179,6 +186,18 @@ class WalletTypeFormState extends State<WalletTypeForm> {
);
}
widget.onTypeSelected(context, selected!);
// If it's a restore flow, trigger the external callback
// If it's not a BIP39 Wallet or if there are no other wallets, route to the newWallet page
// Any other scenario, route to pre-existing seed page
if (!widget.isCreate) {
widget.onTypeSelected!(context, selected!);
} else if (!isBIP39Wallet(selected!) || !widget.newWalletTypeViewModel.hasExisitingWallet) {
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: selected!),
);
} else {
Navigator.of(context).pushNamed(Routes.walletGroupDescription, arguments: selected!);
}
}
}

View file

@ -0,0 +1,90 @@
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
class WalletGroupDescriptionPage extends BasePage {
WalletGroupDescriptionPage({required this.selectedWalletType});
final WalletType selectedWalletType;
@override
String get title => S.current.wallet_group;
@override
Widget body(BuildContext context) {
return Container(
alignment: Alignment.center,
padding: EdgeInsets.all(24),
child: Column(
children: [
Image.asset(
'assets/images/wallet_group.png',
scale: 0.8,
),
SizedBox(height: 32),
Expanded(
child: Text.rich(
TextSpan(
children: [
TextSpan(text: '${S.of(context).wallet_group_description_one} '),
TextSpan(
text: '${S.of(context).wallet_group.toLowerCase()} ',
style: TextStyle(fontWeight: FontWeight.w700),
),
TextSpan(
text: '${S.of(context).wallet_group_description_two} ',
),
TextSpan(
text: '${S.of(context).choose_wallet_group} ',
style: TextStyle(fontWeight: FontWeight.w700),
),
TextSpan(
text: '${S.of(context).wallet_group_description_three} ',
),
TextSpan(
text: '${S.of(context).create_new_seed} ',
style: TextStyle(fontWeight: FontWeight.w700),
),
TextSpan(text: S.of(context).wallet_group_description_four),
],
),
textAlign: TextAlign.center,
style: TextStyle(
height: 1.5,
fontSize: 16,
fontWeight: FontWeight.w400,
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
),
),
),
PrimaryButton(
onPressed: () => Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: selectedWalletType),
),
text: S.of(context).create_new_seed,
color: Theme.of(context).cardColor,
textColor: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
),
SizedBox(height: 12),
PrimaryButton(
onPressed: () => Navigator.of(context).pushNamed(
Routes.walletGroupsDisplayPage,
arguments: selectedWalletType,
),
text: S.of(context).choose_wallet_group,
color: Theme.of(context).primaryColor,
textColor: Colors.white,
),
SizedBox(height: 32),
],
),
);
}
}

View file

@ -0,0 +1,192 @@
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/screens/new_wallet/widgets/grouped_wallet_expansion_tile.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/view_model/wallet_groups_display_view_model.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import '../../../themes/extensions/cake_text_theme.dart';
class WalletGroupsDisplayPage extends BasePage {
WalletGroupsDisplayPage(this.walletGroupsDisplayViewModel);
final WalletGroupsDisplayViewModel walletGroupsDisplayViewModel;
final walletTypeImage = Image.asset('assets/images/wallet_type.png');
final walletTypeLightImage = Image.asset('assets/images/wallet_type_light.png');
@override
String get title => S.current.wallet_group;
@override
Widget body(BuildContext context) => WalletGroupsDisplayBody(
walletGroupsDisplayViewModel: walletGroupsDisplayViewModel,
);
}
class WalletGroupsDisplayBody extends StatelessWidget {
WalletGroupsDisplayBody({required this.walletGroupsDisplayViewModel});
final WalletGroupsDisplayViewModel walletGroupsDisplayViewModel;
@override
Widget build(BuildContext context) {
return Center(
child: Padding(
padding: EdgeInsets.all(24),
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
child: Observer(
builder: (context) {
return Column(
children: [
if (walletGroupsDisplayViewModel.hasNoFilteredWallet) ...{
WalletGroupEmptyStateWidget(),
},
...walletGroupsDisplayViewModel.multiWalletGroups.map(
(walletGroup) {
return Observer(builder: (context) {
final index = walletGroupsDisplayViewModel.multiWalletGroups
.indexOf(walletGroup);
final group = walletGroupsDisplayViewModel.multiWalletGroups[index];
final groupName =
group.groupName ?? '${S.of(context).wallet_group} ${index + 1}';
return GroupedWalletExpansionTile(
leadingWidget:
Icon(Icons.account_balance_wallet_outlined, size: 28),
borderRadius: BorderRadius.all(Radius.circular(16)),
title: groupName,
childWallets: group.wallets.map((walletInfo) {
return walletGroupsDisplayViewModel
.convertWalletInfoToWalletListItem(walletInfo);
}).toList(),
isSelected:
walletGroupsDisplayViewModel.selectedWalletGroup == group,
onTitleTapped: () =>
walletGroupsDisplayViewModel.selectWalletGroup(group),
onChildItemTapped: (_) =>
walletGroupsDisplayViewModel.selectWalletGroup(group),
);
});
},
).toList(),
...walletGroupsDisplayViewModel.singleWalletsList.map((singleWallet) {
return Observer(
builder: (context) {
final index = walletGroupsDisplayViewModel.singleWalletsList
.indexOf(singleWallet);
final wallet = walletGroupsDisplayViewModel.singleWalletsList[index];
return GroupedWalletExpansionTile(
borderRadius: BorderRadius.all(Radius.circular(16)),
title: wallet.name,
isSelected:
walletGroupsDisplayViewModel.selectedSingleWallet == wallet,
leadingWidget: Image.asset(
walletTypeToCryptoCurrency(wallet.type).iconPath!,
width: 32,
height: 32,
),
onTitleTapped: () =>
walletGroupsDisplayViewModel.selectSingleWallet(wallet),
);
},
);
}).toList(),
],
);
},
),
),
),
Observer(
builder: (context) {
return LoadingPrimaryButton(
isLoading: walletGroupsDisplayViewModel.isFetchingMnemonic,
onPressed: () {
if (walletGroupsDisplayViewModel.hasNoFilteredWallet) {
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: walletGroupsDisplayViewModel.type),
);
} else {
onTypeSelected(context);
}
},
text: walletGroupsDisplayViewModel.hasNoFilteredWallet
? S.of(context).create_new_seed
: S.of(context).seed_language_next,
color: Theme.of(context).primaryColor,
textColor: Colors.white,
isDisabled: !walletGroupsDisplayViewModel.hasNoFilteredWallet
? (walletGroupsDisplayViewModel.selectedWalletGroup == null &&
walletGroupsDisplayViewModel.selectedSingleWallet == null)
: false,
);
},
),
SizedBox(height: 32),
],
),
),
);
}
Future<void> onTypeSelected(BuildContext context) async {
final mnemonic = await walletGroupsDisplayViewModel.getSelectedWalletMnemonic();
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(
type: walletGroupsDisplayViewModel.type,
mnemonic: mnemonic,
parentAddress: walletGroupsDisplayViewModel.parentAddress,
isChildWallet: true,
),
);
}
}
class WalletGroupEmptyStateWidget extends StatelessWidget {
const WalletGroupEmptyStateWidget({
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
children: [
Image.asset(
'assets/images/wallet_group.png',
scale: 0.8,
),
SizedBox(height: 32),
Text.rich(
TextSpan(
children: [
TextSpan(
text: '${S.of(context).wallet_group_empty_state_text_one} ',
),
TextSpan(
text: '${S.of(context).create_new_seed} ',
style: TextStyle(fontWeight: FontWeight.w700),
),
TextSpan(text: S.of(context).wallet_group_empty_state_text_two),
],
),
textAlign: TextAlign.center,
style: TextStyle(
height: 1.5,
fontSize: 16,
fontWeight: FontWeight.w400,
color: Theme.of(context).extension<CakeTextTheme>()!.secondaryTextColor,
),
),
],
);
}
}

View file

@ -0,0 +1,119 @@
import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/themes/extensions/filter_theme.dart';
import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:flutter/material.dart';
class GroupedWalletExpansionTile extends StatelessWidget {
GroupedWalletExpansionTile({
required this.title,
required this.isSelected,
this.childWallets = const [],
this.onTitleTapped,
this.onChildItemTapped = _defaultVoidCallback,
this.leadingWidget,
this.trailingWidget,
this.childTrailingWidget,
this.decoration,
this.color,
this.textColor,
this.arrowColor,
this.borderRadius,
this.margin,
this.tileKey,
}) : super(key: tileKey);
final Key? tileKey;
final bool isSelected;
final VoidCallback? onTitleTapped;
final void Function(WalletListItem item) onChildItemTapped;
final String title;
final Widget? leadingWidget;
final Widget? trailingWidget;
final Widget Function(WalletListItem)? childTrailingWidget;
final List<WalletListItem> childWallets;
final Color? color;
final Color? textColor;
final Color? arrowColor;
final EdgeInsets? margin;
final Decoration? decoration;
final BorderRadius? borderRadius;
static void _defaultVoidCallback(WalletListItem ITEM) {}
@override
Widget build(BuildContext context) {
final backgroundColor = color ?? (isSelected ? Colors.green : Theme.of(context).cardColor);
final effectiveTextColor = textColor ??
(isSelected
? Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor
: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor);
final effectiveArrowColor = arrowColor ??
(isSelected
? Theme.of(context).extension<WalletListTheme>()!.restoreWalletButtonTextColor
: Theme.of(context).extension<FilterTheme>()!.titlesColor);
return Container(
decoration: BoxDecoration(
borderRadius: borderRadius ?? BorderRadius.all(Radius.circular(30)),
color: backgroundColor,
),
margin: margin ?? const EdgeInsets.only(bottom: 12.0),
child: Theme(
data: Theme.of(context).copyWith(
dividerColor: Colors.transparent,
splashFactory: NoSplash.splashFactory,
),
child: ExpansionTile(
key: tileKey,
tilePadding: EdgeInsets.symmetric(vertical: 1, horizontal: 16),
iconColor: effectiveArrowColor,
collapsedIconColor: effectiveArrowColor,
leading: leadingWidget,
trailing: trailingWidget ?? (childWallets.isEmpty ? SizedBox.shrink() : null),
title: GestureDetector(
onTap: onTitleTapped,
child: Text(
title,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
color: effectiveTextColor,
),
textAlign: TextAlign.left,
),
),
children: childWallets.map(
(item) {
final walletTypeToCrypto = walletTypeToCryptoCurrency(item.type);
return ListTile(
key: ValueKey(item.name),
trailing: childTrailingWidget?.call(item),
onTap: () => onChildItemTapped(item),
leading: Image.asset(
walletTypeToCrypto.iconPath!,
width: 32,
height: 32,
),
title: Text(
item.name,
maxLines: 1,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
color: effectiveTextColor,
),
),
);
},
).toList(),
),
),
);
}
}

View file

@ -18,9 +18,11 @@ class SelectButton extends StatelessWidget {
this.arrowColor,
this.borderColor,
this.deviceConnectionTypes,
this.borderRadius,
this.padding,
});
final Image? image;
final Widget? image;
final String text;
final double textSize;
final bool isSelected;
@ -32,6 +34,8 @@ class SelectButton extends StatelessWidget {
final Color? textColor;
final Color? arrowColor;
final Color? borderColor;
final BorderRadius? borderRadius;
final EdgeInsets? padding;
@override
Widget build(BuildContext context) {
@ -62,10 +66,10 @@ class SelectButton extends StatelessWidget {
child: Container(
width: double.infinity,
height: height,
padding: EdgeInsets.only(left: 30, right: 30),
padding: padding ?? EdgeInsets.only(left: 30, right: 30),
alignment: Alignment.center,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(30)),
borderRadius: borderRadius ?? BorderRadius.all(Radius.circular(30)),
color: backgroundColor,
border: borderColor != null ? Border.all(color: borderColor!) : null,
),

View file

@ -281,16 +281,9 @@ class WalletRestorePage extends BasePage {
return false;
}
if ((walletRestoreViewModel.type == WalletType.litecoin) &&
(seedWords.length != WalletRestoreViewModelBase.electrumSeedMnemonicLength &&
seedWords.length != WalletRestoreViewModelBase.electrumShortSeedMnemonicLength)) {
return false;
}
// bip39:
const validSeedLengths = [12, 18, 24];
if (walletRestoreViewModel.type == WalletType.bitcoin &&
!(validSeedLengths.contains(seedWords.length))) {
if (!(validSeedLengths.contains(seedWords.length))) {
return false;
}

View file

@ -1,20 +1,16 @@
import 'package:another_flushbar/flushbar.dart';
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/core/wallet_name_validator.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
import 'package:cake_wallet/palette.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_edit_view_model.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
import 'package:cake_wallet/view_model/wallet_new_vm.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
@ -22,29 +18,29 @@ import 'package:cake_wallet/src/widgets/base_text_form_field.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
class WalletEditPage extends BasePage {
WalletEditPage(
{required this.walletEditViewModel,
required this.editingWallet,
required this.walletNewVM,
required this.authService})
: _formKey = GlobalKey<FormState>(),
WalletEditPage({
required this.pageArguments,
}) : _formKey = GlobalKey<FormState>(),
_labelController = TextEditingController(),
walletEditViewModel = pageArguments.walletEditViewModel!,
super() {
_labelController.text = editingWallet.name;
_labelController.text =
pageArguments.isWalletGroup ? pageArguments.groupName : pageArguments.editingWallet.name;
_labelController.addListener(() => walletEditViewModel.newName = _labelController.text);
}
final GlobalKey<FormState> _formKey;
final TextEditingController _labelController;
final WalletEditPageArguments pageArguments;
final WalletEditViewModel walletEditViewModel;
final WalletNewVM walletNewVM;
final WalletListItem editingWallet;
final AuthService authService;
@override
String get title => S.current.wallet_list_edit_wallet;
String get title => pageArguments.isWalletGroup
? S.current.wallet_list_edit_group_name
: S.current.wallet_list_edit_wallet;
Flushbar<void>? _progressBar;
@ -61,7 +57,10 @@ class WalletEditPage extends BasePage {
child: BaseTextFormField(
controller: _labelController,
hintText: S.of(context).wallet_list_wallet_name,
validator: WalletNameValidator()))),
validator: WalletNameValidator(),
),
),
),
Observer(
builder: (_) {
final isLoading = walletEditViewModel.state is WalletEditRenamePending ||
@ -69,6 +68,7 @@ class WalletEditPage extends BasePage {
return Row(
children: <Widget>[
if (!pageArguments.isWalletGroup)
Flexible(
child: Container(
padding: EdgeInsets.only(right: 8.0),
@ -86,7 +86,8 @@ class WalletEditPage extends BasePage {
child: LoadingPrimaryButton(
onPressed: () async {
if (_formKey.currentState?.validate() ?? false) {
if (walletNewVM.nameExists(walletEditViewModel.newName)) {
if (pageArguments.walletNewVM!
.nameExists(walletEditViewModel.newName)) {
showPopUp<void>(
context: context,
builder: (_) {
@ -102,29 +103,33 @@ class WalletEditPage extends BasePage {
try {
bool confirmed = false;
if (SettingsStoreBase
.walletPasswordDirectInput) {
if (SettingsStoreBase.walletPasswordDirectInput) {
await Navigator.of(context).pushNamed(
Routes.walletUnlockLoadable,
arguments: WalletUnlockArguments(
authPasswordHandler:
(String password) async {
await walletEditViewModel
.changeName(editingWallet,
password: password);
authPasswordHandler: (String password) async {
await walletEditViewModel.changeName(
pageArguments.editingWallet,
password: password,
isWalletGroup: pageArguments.isWalletGroup,
groupParentAddress: pageArguments.parentAddress,
);
},
callback: (bool
isAuthenticatedSuccessfully,
callback: (bool isAuthenticatedSuccessfully,
AuthPageState auth) async {
if (isAuthenticatedSuccessfully) {
auth.close();
confirmed = true;
}
},
walletName: editingWallet.name,
walletType: editingWallet.type));
walletName: pageArguments.editingWallet.name,
walletType: pageArguments.editingWallet.type));
} else {
await walletEditViewModel.changeName(editingWallet);
await walletEditViewModel.changeName(
pageArguments.editingWallet,
isWalletGroup: pageArguments.isWalletGroup,
groupParentAddress: pageArguments.parentAddress,
);
confirmed = true;
}
@ -154,7 +159,9 @@ class WalletEditPage extends BasePage {
}
Future<void> _removeWallet(BuildContext context) async {
authService.authenticateAction(context, onAuthSuccess: (isAuthenticatedSuccessfully) async {
pageArguments.authService!.authenticateAction(
context,
onAuthSuccess: (isAuthenticatedSuccessfully) async {
if (!isAuthenticatedSuccessfully) {
return;
}
@ -173,7 +180,8 @@ class WalletEditPage extends BasePage {
builder: (BuildContext dialogContext) {
return AlertWithTwoActions(
alertTitle: S.of(context).delete_wallet,
alertContent: S.of(context).delete_wallet_confirm_message(editingWallet.name),
alertContent:
S.of(context).delete_wallet_confirm_message(pageArguments.editingWallet.name),
leftButtonText: S.of(context).cancel,
rightButtonText: S.of(context).delete,
actionLeftButton: () => Navigator.of(dialogContext).pop(),
@ -187,13 +195,16 @@ class WalletEditPage extends BasePage {
Navigator.of(context).pop();
try {
changeProcessText(context, S.of(context).wallet_list_removing_wallet(editingWallet.name));
await walletEditViewModel.remove(editingWallet);
changeProcessText(
context, S.of(context).wallet_list_removing_wallet(pageArguments.editingWallet.name));
await walletEditViewModel.remove(pageArguments.editingWallet);
hideProgressText();
} catch (e) {
changeProcessText(
context,
S.of(context).wallet_list_failed_to_remove(editingWallet.name, e.toString()),
S
.of(context)
.wallet_list_failed_to_remove(pageArguments.editingWallet.name, e.toString()),
);
}
}

View file

@ -0,0 +1,54 @@
import 'package:cake_wallet/themes/extensions/filter_theme.dart';
import 'package:cake_wallet/themes/extensions/receive_page_theme.dart';
import 'package:flutter/material.dart';
class EditWalletButtonWidget extends StatelessWidget {
const EditWalletButtonWidget({
required this.width,
required this.onTap,
this.isGroup = false,
super.key,
});
final bool isGroup;
final double width;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return Container(
width: width,
child: Row(
children: [
GestureDetector(
onTap: onTap,
child: Center(
child: Container(
height: 40,
width: 44,
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context).extension<ReceivePageTheme>()!.iconsBackgroundColor,
),
child: Icon(
Icons.edit,
size: 14,
color: Theme.of(context).extension<ReceivePageTheme>()!.iconsColor,
),
),
),
),
if (isGroup) ...{
SizedBox(width: 6),
Icon(
Icons.keyboard_arrow_down,
size: 24,
color: Theme.of(context).extension<FilterTheme>()!.titlesColor,
),
},
],
),
);
}
}

View file

@ -7,11 +7,13 @@ class FilteredList extends StatefulWidget {
required this.list,
required this.itemBuilder,
required this.updateFunction,
this.shrinkWrap = false,
});
final ObservableList<dynamic> list;
final Widget Function(BuildContext, int) itemBuilder;
final Function updateFunction;
final bool shrinkWrap;
@override
FilteredListState createState() => FilteredListState();
@ -22,6 +24,7 @@ class FilteredListState extends State<FilteredList> {
Widget build(BuildContext context) {
return Observer(
builder: (_) => ReorderableListView.builder(
shrinkWrap: widget.shrinkWrap,
physics: const BouncingScrollPhysics(),
itemBuilder: widget.itemBuilder,
itemCount: widget.list.length,

View file

@ -1,5 +1,9 @@
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/entities/wallet_edit_page_arguments.dart';
import 'package:cake_wallet/entities/wallet_list_order_types.dart';
import 'package:cake_wallet/src/screens/dashboard/widgets/filter_list_widget.dart';
import 'package:cake_wallet/src/screens/new_wallet/widgets/grouped_wallet_expansion_tile.dart';
import 'package:cake_wallet/src/screens/wallet_list/edit_wallet_button_widget.dart';
import 'package:cake_wallet/src/screens/wallet_list/filtered_list.dart';
import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart';
import 'package:cake_wallet/store/settings_store.dart';
@ -7,8 +11,6 @@ import 'package:cake_wallet/themes/extensions/cake_text_theme.dart';
import 'package:cake_wallet/src/screens/auth/auth_page.dart';
import 'package:cake_wallet/core/auth_service.dart';
import 'package:cake_wallet/themes/extensions/filter_theme.dart';
import 'package:cake_wallet/themes/extensions/receive_page_theme.dart';
import 'package:cake_wallet/utils/device_info.dart';
import 'package:cake_wallet/utils/responsive_layout_util.dart';
import 'package:cake_wallet/utils/show_bar.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
@ -23,7 +25,6 @@ import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/wallet_type_utils.dart';
import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
class WalletListPage extends BasePage {
WalletListPage({required this.walletListViewModel, required this.authService});
@ -128,112 +129,143 @@ class WalletListBodyState extends State<WalletListBody> {
child: Column(
children: [
Expanded(
child: Container(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (widget.walletListViewModel.multiWalletGroups.isNotEmpty) ...{
Padding(
padding: const EdgeInsets.only(left: 24),
child: Text(
S.current.shared_seed_wallet_groups,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
),
),
),
SizedBox(height: 16),
Container(
child: Observer(
builder: (_) => FilteredList(
list: widget.walletListViewModel.wallets,
shrinkWrap: true,
list: widget.walletListViewModel.multiWalletGroups,
updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
itemBuilder: (__, index) {
final wallet = widget.walletListViewModel.wallets[index];
final currentColor = wallet.isCurrent
? Theme.of(context)
.extension<WalletListTheme>()!
.createNewWalletButtonBackgroundColor
: Theme.of(context).colorScheme.background;
final row = GestureDetector(
key: ValueKey(wallet.name),
onTap: () => wallet.isCurrent ? null : _loadWallet(wallet),
child: Container(
height: tileHeight,
width: double.infinity,
child: Row(
children: <Widget>[
Container(
height: tileHeight,
width: 4,
decoration: BoxDecoration(
borderRadius: BorderRadius.only(
topRight: Radius.circular(4),
bottomRight: Radius.circular(4)),
color: currentColor),
itemBuilder: (context, index) {
final group = widget.walletListViewModel.multiWalletGroups[index];
final groupName = group.groupName ??
'${S.current.wallet_group} ${index + 1}';
return GroupedWalletExpansionTile(
borderRadius: BorderRadius.all(Radius.circular(16)),
margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
title: groupName,
tileKey: ValueKey('group_wallets_expansion_tile_widget_$index'),
leadingWidget: Icon(
Icons.account_balance_wallet_outlined,
size: 28,
),
Expanded(
child: Container(
height: tileHeight,
padding: EdgeInsets.only(left: 20, right: 20),
color: Theme.of(context).colorScheme.background,
alignment: Alignment.centerLeft,
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
wallet.isEnabled
? _imageFor(
type: wallet.type,
isTestnet: wallet.isTestnet,
)
: nonWalletTypeIcon,
SizedBox(width: 10),
Flexible(
child: Text(
wallet.name,
maxLines: null,
softWrap: true,
style: TextStyle(
fontSize: DeviceInfo.instance.isDesktop ? 18 : 20,
fontWeight: FontWeight.w500,
color: Theme.of(context)
.extension<CakeTextTheme>()!
.titleColor,
trailingWidget: EditWalletButtonWidget(
width: 74,
isGroup: true,
onTap: () {
final wallet = widget.walletListViewModel
.convertWalletInfoToWalletListItem(group.wallets.first);
Navigator.of(context).pushNamed(
Routes.walletEdit,
arguments: WalletEditPageArguments(
walletListViewModel: widget.walletListViewModel,
editingWallet: wallet,
isWalletGroup: true,
groupName: groupName,
parentAddress: group.parentAddress,
),
),
),
],
),
),
),
],
),
),
);
return wallet.isCurrent
? row
: Row(
key: ValueKey(wallet.name),
children: [
Expanded(child: row),
GestureDetector(
onTap: () => Navigator.of(context).pushNamed(Routes.walletEdit,
arguments: [widget.walletListViewModel, wallet]),
child: Container(
padding: EdgeInsets.only(
right: DeviceInfo.instance.isMobile ? 20 : 40),
child: Center(
child: Container(
height: 40,
width: 44,
padding: EdgeInsets.all(10),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Theme.of(context)
.extension<ReceivePageTheme>()!
.iconsBackgroundColor,
),
child: Icon(
Icons.edit,
size: 14,
color: Theme.of(context)
.extension<ReceivePageTheme>()!
.iconsColor,
),
),
),
),
),
],
);
},
),
childWallets: group.wallets.map((walletInfo) {
return widget.walletListViewModel
.convertWalletInfoToWalletListItem(walletInfo);
}).toList(),
isSelected: false,
onChildItemTapped: (wallet) =>
wallet.isCurrent ? null : _loadWallet(wallet),
childTrailingWidget: (item) {
return item.isCurrent
? SizedBox.shrink()
: EditWalletButtonWidget(
width: 44,
onTap: () => Navigator.of(context).pushNamed(
Routes.walletEdit,
arguments: WalletEditPageArguments(
walletListViewModel: widget.walletListViewModel,
editingWallet: item,
),
),
);
},
);
},
),
),
),
SizedBox(height: 24),
},
if (widget.walletListViewModel.singleWalletsList.isNotEmpty) ...{
Padding(
padding: const EdgeInsets.only(left: 24),
child: Text(
S.current.single_seed_wallets_group,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
),
),
),
SizedBox(height: 16),
Container(
child: Observer(
builder: (_) => FilteredList(
shrinkWrap: true,
list: widget.walletListViewModel.singleWalletsList,
updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
itemBuilder: (context, index) {
final wallet = widget.walletListViewModel.singleWalletsList[index];
return GroupedWalletExpansionTile(
tileKey: ValueKey('single_wallets_expansion_tile_widget_$index'),
leadingWidget: Image.asset(
walletTypeToCryptoCurrency(wallet.type).iconPath!,
width: 32,
height: 32,
),
title: wallet.name,
isSelected: false,
borderRadius: BorderRadius.all(Radius.circular(16)),
margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
onTitleTapped: () => wallet.isCurrent ? null : _loadWallet(wallet),
trailingWidget: wallet.isCurrent
? null
: EditWalletButtonWidget(
width: 44,
onTap: () {
Navigator.of(context).pushNamed(
Routes.walletEdit,
arguments: WalletEditPageArguments(
walletListViewModel: widget.walletListViewModel,
editingWallet: wallet,
),
);
},
),
);
},
),
),
),
},
],
),
),
),
@ -249,14 +281,18 @@ class WalletListBodyState extends State<WalletListBody> {
widget.authService.authenticateAction(
context,
route: Routes.newWallet,
arguments: widget.walletListViewModel.currentWalletType,
arguments: NewWalletArguments(
type: widget.walletListViewModel.currentWalletType,
),
conditionToDetermineIfToUse2FA:
widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
);
} else {
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: widget.walletListViewModel.currentWalletType,
arguments: NewWalletArguments(
type: widget.walletListViewModel.currentWalletType,
),
);
}
} else {
@ -340,15 +376,15 @@ class WalletListBodyState extends State<WalletListBody> {
Future<void> _loadWallet(WalletListItem wallet) async {
if (SettingsStoreBase.walletPasswordDirectInput) {
Navigator.of(context).pushNamed(
Routes.walletUnlockLoadable,
Navigator.of(context).pushNamed(Routes.walletUnlockLoadable,
arguments: WalletUnlockArguments(
callback: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
if (isAuthenticatedSuccessfully) {
auth.close();
setState(() {});
}
}, walletName: wallet.name,
},
walletName: wallet.name,
walletType: wallet.type));
return;
}

View file

@ -58,6 +58,7 @@ abstract class SettingsStoreBase with Store {
required AutoGenerateSubaddressStatus initialAutoGenerateSubaddressStatus,
required MoneroSeedType initialMoneroSeedType,
required BitcoinSeedType initialBitcoinSeedType,
required NanoSeedType initialNanoSeedType,
required bool initialAppSecure,
required bool initialDisableBuy,
required bool initialDisableSell,
@ -132,6 +133,7 @@ abstract class SettingsStoreBase with Store {
autoGenerateSubaddressStatus = initialAutoGenerateSubaddressStatus,
moneroSeedType = initialMoneroSeedType,
bitcoinSeedType = initialBitcoinSeedType,
nanoSeedType = initialNanoSeedType,
fiatApiMode = initialFiatMode,
allowBiometricalAuthentication = initialAllowBiometricalAuthentication,
selectedCake2FAPreset = initialCake2FAPresetOptions,
@ -341,6 +343,11 @@ abstract class SettingsStoreBase with Store {
(BitcoinSeedType bitcoinSeedType) => sharedPreferences.setInt(
PreferencesKey.bitcoinSeedType, bitcoinSeedType.raw));
reaction(
(_) => nanoSeedType,
(NanoSeedType nanoSeedType) =>
sharedPreferences.setInt(PreferencesKey.nanoSeedType, nanoSeedType.raw));
reaction(
(_) => fiatApiMode,
(FiatApiMode mode) =>
@ -569,6 +576,7 @@ abstract class SettingsStoreBase with Store {
static const defaultSeedPhraseLength = SeedPhraseLength.twelveWords;
static const defaultMoneroSeedType = MoneroSeedType.defaultSeedType;
static const defaultBitcoinSeedType = BitcoinSeedType.defaultDerivationType;
static const defaultNanoSeedType = NanoSeedType.defaultDerivationType;
@observable
FiatCurrency fiatCurrency;
@ -603,6 +611,9 @@ abstract class SettingsStoreBase with Store {
@observable
BitcoinSeedType bitcoinSeedType;
@observable
NanoSeedType nanoSeedType;
@observable
bool isAppSecure;
@ -974,6 +985,11 @@ abstract class SettingsStoreBase with Store {
? BitcoinSeedType.deserialize(raw: _bitcoinSeedType)
: defaultBitcoinSeedType;
final _nanoSeedType = sharedPreferences.getInt(PreferencesKey.nanoSeedType);
final nanoSeedType =
_nanoSeedType != null ? NanoSeedType.deserialize(raw: _nanoSeedType) : defaultNanoSeedType;
final nodes = <WalletType, Node>{};
final powNodes = <WalletType, Node>{};
@ -1138,6 +1154,7 @@ abstract class SettingsStoreBase with Store {
initialAutoGenerateSubaddressStatus: autoGenerateSubaddressStatus,
initialMoneroSeedType: moneroSeedType,
initialBitcoinSeedType: bitcoinSeedType,
initialNanoSeedType: nanoSeedType,
initialAppSecure: isAppSecure,
initialDisableBuy: disableBuy,
initialDisableSell: disableSell,
@ -1270,6 +1287,11 @@ abstract class SettingsStoreBase with Store {
? BitcoinSeedType.deserialize(raw: _bitcoinSeedType)
: defaultBitcoinSeedType;
final _nanoSeedType = sharedPreferences.getInt(PreferencesKey.nanoSeedType);
nanoSeedType =
_nanoSeedType != null ? NanoSeedType.deserialize(raw: _nanoSeedType) : defaultNanoSeedType;
balanceDisplayMode = BalanceDisplayMode.deserialize(
raw: sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey)!);
shouldSaveRecipientAddress =

View file

@ -13,8 +13,15 @@ class CWTron extends Tron {
required String name,
WalletInfo? walletInfo,
String? password,
String? mnemonic,
String? parentAddress,
}) =>
TronNewWalletCredentials(name: name, walletInfo: walletInfo, password: password);
TronNewWalletCredentials(
name: name,
walletInfo: walletInfo,
password: password,
mnemonic: mnemonic,
parentAddress: parentAddress);
@override
WalletCredentials createTronRestoreWalletFromSeedCredentials({

View file

@ -46,17 +46,30 @@ abstract class AdvancedPrivacySettingsViewModelBase with Store {
case WalletType.litecoin:
return _settingsStore.bitcoinSeedType == BitcoinSeedType.bip39;
case WalletType.nano:
case WalletType.banano:
return _settingsStore.nanoSeedType == NanoSeedType.bip39;
case WalletType.monero:
case WalletType.wownero:
case WalletType.none:
case WalletType.haven:
case WalletType.nano:
case WalletType.banano:
return false;
}
}
bool get hasSeedTypeOption => [WalletType.monero, WalletType.wownero].contains(type);
bool get isMoneroSeedTypeOptionsEnabled => [
WalletType.monero,
WalletType.wownero,
].contains(type);
bool get isBitcoinSeedTypeOptionsEnabled => [
WalletType.bitcoin,
WalletType.litecoin,
].contains(type);
bool get isNanoSeedTypeOptionsEnabled => [WalletType.nano].contains(type);
bool get hasPassphraseOption => [
WalletType.bitcoin,

View file

@ -0,0 +1,16 @@
import 'package:cw_core/wallet_info.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
part 'new_wallet_type_view_model.g.dart';
class NewWalletTypeViewModel = NewWalletTypeViewModelBase with _$NewWalletTypeViewModel;
abstract class NewWalletTypeViewModelBase with Store {
NewWalletTypeViewModelBase(this._walletInfoSource);
@computed
bool get hasExisitingWallet => _walletInfoSource.isNotEmpty;
final Box<WalletInfo> _walletInfoSource;
}

View file

@ -23,6 +23,13 @@ abstract class SeedSettingsViewModelBase with Store {
void setBitcoinSeedType(BitcoinSeedType derivationType) =>
_appStore.settingsStore.bitcoinSeedType = derivationType;
@computed
NanoSeedType get nanoSeedType => _appStore.settingsStore.nanoSeedType;
@action
void setNanoSeedType(NanoSeedType derivationType) =>
_appStore.settingsStore.nanoSeedType = derivationType;
@computed
String? get passphrase => this._seedSettingsStore.passphrase;

View file

@ -99,6 +99,7 @@ abstract class WalletCreationVMBase with Store {
showIntroCakePayCard: (!walletCreationService.typeExists(type)) && type != WalletType.haven,
derivationInfo: credentials.derivationInfo ?? getDefaultCreateDerivation(),
hardwareWalletType: credentials.hardwareWalletType,
parentAddress: credentials.parentAddress,
);
credentials.walletInfo = walletInfo;
@ -117,12 +118,16 @@ abstract class WalletCreationVMBase with Store {
}
DerivationInfo? getDefaultCreateDerivation() {
final useBip39 = seedSettingsViewModel.bitcoinSeedType.type == DerivationType.bip39;
final useBip39ForBitcoin = seedSettingsViewModel.bitcoinSeedType.type == DerivationType.bip39;
final useBip39ForNano = seedSettingsViewModel.nanoSeedType.type == DerivationType.bip39;
switch (type) {
case WalletType.nano:
if (useBip39ForNano) {
return DerivationInfo(derivationType: DerivationType.bip39);
}
return DerivationInfo(derivationType: DerivationType.nano);
case WalletType.bitcoin:
if (useBip39) {
if (useBip39ForBitcoin) {
return DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/0'/0'",
@ -132,7 +137,7 @@ abstract class WalletCreationVMBase with Store {
}
return bitcoin!.getElectrumDerivations()[DerivationType.electrum]!.first;
case WalletType.litecoin:
if (useBip39) {
if (useBip39ForBitcoin) {
return DerivationInfo(
derivationType: DerivationType.bip39,
derivationPath: "m/84'/2'/0'",
@ -148,9 +153,13 @@ abstract class WalletCreationVMBase with Store {
DerivationInfo? getCommonRestoreDerivation() {
final useElectrum = seedSettingsViewModel.bitcoinSeedType.type == DerivationType.electrum;
final useNanoStandard = seedSettingsViewModel.nanoSeedType.type == DerivationType.nano;
switch (this.type) {
case WalletType.nano:
if (useNanoStandard) {
return DerivationInfo(derivationType: DerivationType.nano);
}
return DerivationInfo(derivationType: DerivationType.bip39);
case WalletType.bitcoin:
if (useElectrum) {
return bitcoin!.getElectrumDerivations()[DerivationType.electrum]!.first;

View file

@ -0,0 +1,165 @@
import 'package:cake_wallet/core/wallet_loading_service.dart';
import 'package:cake_wallet/entities/wallet_group.dart';
import 'package:cake_wallet/entities/wallet_manager.dart';
import 'package:cake_wallet/reactions/bip39_wallet_utils.dart';
import 'package:cake_wallet/store/app_store.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_item.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
import 'package:cake_wallet/wallet_types.g.dart';
import 'package:cw_core/wallet_info.dart';
import 'package:cw_core/wallet_type.dart';
import 'package:mobx/mobx.dart';
part 'wallet_groups_display_view_model.g.dart';
class WalletGroupsDisplayViewModel = WalletGroupsDisplayViewModelBase
with _$WalletGroupsDisplayViewModel;
abstract class WalletGroupsDisplayViewModelBase with Store {
WalletGroupsDisplayViewModelBase(
this._appStore,
this._walletLoadingService,
this._walletManager,
this.walletListViewModel, {
required this.type,
}) : isFetchingMnemonic = false,
multiWalletGroups = ObservableList<WalletGroup>(),
singleWalletsList = ObservableList<WalletInfo>() {
reaction((_) => _appStore.wallet, (_) => updateWalletInfoSourceList());
updateWalletInfoSourceList();
}
final WalletType type;
final AppStore _appStore;
final WalletManager _walletManager;
final WalletLoadingService _walletLoadingService;
final WalletListViewModel walletListViewModel;
@observable
ObservableList<WalletGroup> multiWalletGroups;
@observable
ObservableList<WalletInfo> singleWalletsList;
@observable
WalletGroup? selectedWalletGroup;
@observable
WalletInfo? selectedSingleWallet;
@observable
String? parentAddress;
@observable
bool isFetchingMnemonic;
@computed
bool get hasNoFilteredWallet {
return singleWalletsList.isEmpty && multiWalletGroups.isEmpty;
}
@action
Future<String?> getSelectedWalletMnemonic() async {
WalletListItem walletToUse;
bool isGroupSelected = selectedWalletGroup != null;
if (isGroupSelected) {
walletToUse = convertWalletInfoToWalletListItem(selectedWalletGroup!.wallets.first);
} else {
walletToUse = convertWalletInfoToWalletListItem(selectedSingleWallet!);
}
try {
isFetchingMnemonic = true;
final wallet = await _walletLoadingService.load(
walletToUse.type,
walletToUse.name,
);
parentAddress =
isGroupSelected ? selectedWalletGroup!.parentAddress : selectedSingleWallet!.address;
return wallet.seed;
} catch (e) {
return null;
} finally {
isFetchingMnemonic = false;
}
}
@action
void selectWalletGroup(WalletGroup walletGroup) {
selectedWalletGroup = walletGroup;
selectedSingleWallet = null;
}
@action
void selectSingleWallet(WalletInfo singleWallet) {
selectedSingleWallet = singleWallet;
selectedWalletGroup = null;
}
@action
void updateWalletInfoSourceList() {
List<WalletGroup> wallets = [];
multiWalletGroups.clear();
singleWalletsList.clear();
_walletManager.updateWalletGroups();
final walletGroups = _walletManager.walletGroups;
// Iterate through the wallet groups to filter and categorize wallets
for (var group in walletGroups) {
// Handle group wallet filtering
bool shouldExcludeGroup = group.wallets.any((wallet) {
// Check for non-BIP39 wallet types
bool isNonBIP39Wallet = !isBIP39Wallet(wallet.type);
// Check for nano derivation type
bool isNanoDerivationType = wallet.type == WalletType.nano &&
wallet.derivationInfo?.derivationType == DerivationType.nano;
// Check for electrum derivation type
bool isElectrumDerivationType =
(wallet.type == WalletType.bitcoin || wallet.type == WalletType.litecoin) &&
wallet.derivationInfo?.derivationType == DerivationType.electrum;
// Check that selected wallet type is not present already in group
bool isSameTypeAsSelectedWallet = wallet.type == type;
// Exclude if any of these conditions are true
return isNonBIP39Wallet ||
isNanoDerivationType ||
isElectrumDerivationType ||
isSameTypeAsSelectedWallet;
});
if (shouldExcludeGroup) continue;
// If the group passes the filters, add it to the wallets list
wallets.add(group);
}
for (var group in wallets) {
if (group.wallets.length == 1) {
singleWalletsList.add(group.wallets.first);
} else {
multiWalletGroups.add(group);
}
}
}
WalletListItem convertWalletInfoToWalletListItem(WalletInfo info) {
return WalletListItem(
name: info.name,
type: info.type,
key: info.key,
isCurrent: info.name == _appStore.wallet?.name && info.type == _appStore.wallet?.type,
isEnabled: availableWalletTypes.contains(info.type),
isTestnet: info.network?.toLowerCase().contains('testnet') ?? false,
);
}
}

View file

@ -1,4 +1,5 @@
import 'package:cake_wallet/core/wallet_loading_service.dart';
import 'package:cake_wallet/entities/wallet_manager.dart';
import 'package:cake_wallet/view_model/wallet_list/wallet_list_view_model.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/di.dart';
@ -18,8 +19,11 @@ class WalletEditRenamePending extends WalletEditViewModelState {}
class WalletEditDeletePending extends WalletEditViewModelState {}
abstract class WalletEditViewModelBase with Store {
WalletEditViewModelBase(this._walletListViewModel, this._walletLoadingService)
: state = WalletEditViewModelInitialState(),
WalletEditViewModelBase(
this._walletListViewModel,
this._walletLoadingService,
this._walletManager,
) : state = WalletEditViewModelInitialState(),
newName = '';
@observable
@ -30,13 +34,30 @@ abstract class WalletEditViewModelBase with Store {
final WalletListViewModel _walletListViewModel;
final WalletLoadingService _walletLoadingService;
final WalletManager _walletManager;
@action
Future<void> changeName(WalletListItem walletItem, {String? password}) async {
Future<void> changeName(
WalletListItem walletItem, {
String? password,
String? groupParentAddress,
bool isWalletGroup = false,
}) async {
state = WalletEditRenamePending();
if (isWalletGroup) {
_walletManager.updateWalletGroups();
_walletManager.setGroupName(groupParentAddress!, newName);
} else {
await _walletLoadingService.renameWallet(
walletItem.type, walletItem.name, newName,
password: password);
walletItem.type,
walletItem.name,
newName,
password: password,
);
}
_walletListViewModel.updateList();
}

View file

@ -1,5 +1,7 @@
import 'package:cake_wallet/core/wallet_loading_service.dart';
import 'package:cake_wallet/entities/wallet_group.dart';
import 'package:cake_wallet/entities/wallet_list_order_types.dart';
import 'package:cake_wallet/entities/wallet_manager.dart';
import 'package:hive/hive.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/store/app_store.dart';
@ -17,7 +19,10 @@ abstract class WalletListViewModelBase with Store {
this._walletInfoSource,
this._appStore,
this._walletLoadingService,
) : wallets = ObservableList<WalletListItem>() {
this._walletManager,
) : wallets = ObservableList<WalletListItem>(),
multiWalletGroups = ObservableList<WalletGroup>(),
singleWalletsList = ObservableList<WalletListItem>() {
setOrderType(_appStore.settingsStore.walletListOrder);
reaction((_) => _appStore.wallet, (_) => updateList());
updateList();
@ -26,6 +31,15 @@ abstract class WalletListViewModelBase with Store {
@observable
ObservableList<WalletListItem> wallets;
// @observable
// ObservableList<WalletGroup> walletGroups;
@observable
ObservableList<WalletGroup> multiWalletGroups;
@observable
ObservableList<WalletListItem> singleWalletsList;
@computed
bool get shouldRequireTOTP2FAForAccessingWallet =>
_appStore.settingsStore.shouldRequireTOTP2FAForAccessingWallet;
@ -35,6 +49,7 @@ abstract class WalletListViewModelBase with Store {
_appStore.settingsStore.shouldRequireTOTP2FAForCreatingNewWallets;
final AppStore _appStore;
final WalletManager _walletManager;
final Box<WalletInfo> _walletInfoSource;
final WalletLoadingService _walletLoadingService;
@ -53,18 +68,23 @@ abstract class WalletListViewModelBase with Store {
@action
void updateList() {
wallets.clear();
multiWalletGroups.clear();
singleWalletsList.clear();
wallets.addAll(
_walletInfoSource.values.map(
(info) => WalletListItem(
name: info.name,
type: info.type,
key: info.key,
isCurrent: info.name == _appStore.wallet?.name && info.type == _appStore.wallet?.type,
isEnabled: availableWalletTypes.contains(info.type),
isTestnet: info.network?.toLowerCase().contains('testnet') ?? false,
),
),
_walletInfoSource.values.map((info) => convertWalletInfoToWalletListItem(info)),
);
//========== Split into shared seed groups and single wallets list
_walletManager.updateWalletGroups();
for (var group in _walletManager.walletGroups) {
if (group.wallets.length == 1) {
singleWalletsList.add(convertWalletInfoToWalletListItem(group.wallets.first));
} else {
multiWalletGroups.add(group);
}
}
}
Future<void> reorderAccordingToWalletList() async {
@ -158,4 +178,15 @@ abstract class WalletListViewModelBase with Store {
break;
}
}
WalletListItem convertWalletInfoToWalletListItem(WalletInfo info) {
return WalletListItem(
name: info.name,
type: info.type,
key: info.key,
isCurrent: info.name == _appStore.wallet?.name && info.type == _appStore.wallet?.type,
isEnabled: availableWalletTypes.contains(info.type),
isTestnet: info.network?.toLowerCase().contains('testnet') ?? false,
);
}
}

View file

@ -1,8 +1,9 @@
import 'package:cake_wallet/core/new_wallet_arguments.dart';
import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cake_wallet/bitcoin/bitcoin.dart';
import 'package:cake_wallet/bitcoin_cash/bitcoin_cash.dart';
import 'package:cake_wallet/core/wallet_creation_service.dart';
import 'package:cake_wallet/entities/seed_type.dart';
import 'package:cake_wallet/ethereum/ethereum.dart';
import 'package:cake_wallet/haven/haven.dart';
import 'package:cake_wallet/monero/monero.dart';
import 'package:cake_wallet/nano/nano.dart';
@ -32,12 +33,13 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
WalletCreationService walletCreationService,
Box<WalletInfo> walletInfoSource,
this.advancedPrivacySettingsViewModel,
SeedSettingsViewModel seedSettingsViewModel,
{required WalletType type})
: selectedMnemonicLanguage = '',
SeedSettingsViewModel seedSettingsViewModel, {
required this.newWalletArguments,
}) : selectedMnemonicLanguage = '',
super(appStore, walletInfoSource, walletCreationService, seedSettingsViewModel,
type: type, isRecovery: false);
type: newWalletArguments!.type, isRecovery: false);
final NewWalletArguments? newWalletArguments;
final AdvancedPrivacySettingsViewModel advancedPrivacySettingsViewModel;
@observable
@ -62,6 +64,10 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
return seedSettingsViewModel.bitcoinSeedType == BitcoinSeedType.bip39
? advancedPrivacySettingsViewModel.seedPhraseLength.value
: 24;
case WalletType.nano:
return seedSettingsViewModel.nanoSeedType == NanoSeedType.bip39
? advancedPrivacySettingsViewModel.seedPhraseLength.value
: 24;
default:
return 24;
}
@ -83,31 +89,68 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
password: walletPassword,
isPolyseed: options.last as bool);
case WalletType.bitcoin:
return bitcoin!.createBitcoinNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
case WalletType.litecoin:
return bitcoin!.createBitcoinNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
name: name,
password: walletPassword,
passphrase: passphrase,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.haven:
return haven!.createHavenNewWalletCredentials(
name: name, language: options!.first as String, password: walletPassword);
case WalletType.ethereum:
return ethereum!.createEthereumNewWalletCredentials(name: name, password: walletPassword);
return ethereum!.createEthereumNewWalletCredentials(
name: name,
password: walletPassword,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.bitcoinCash:
return bitcoinCash!.createBitcoinCashNewWalletCredentials(
name: name, password: walletPassword, passphrase: passphrase);
name: name,
password: walletPassword,
passphrase: passphrase,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.nano:
case WalletType.banano:
return nano!.createNanoNewWalletCredentials(name: name);
return nano!.createNanoNewWalletCredentials(
name: name,
password: walletPassword,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.polygon:
return polygon!.createPolygonNewWalletCredentials(name: name, password: walletPassword);
return polygon!.createPolygonNewWalletCredentials(
name: name,
password: walletPassword,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.solana:
return solana!.createSolanaNewWalletCredentials(name: name, password: walletPassword);
return solana!.createSolanaNewWalletCredentials(
name: name,
password: walletPassword,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.tron:
return tron!.createTronNewWalletCredentials(name: name);
return tron!.createTronNewWalletCredentials(
name: name,
password: walletPassword,
mnemonic: newWalletArguments!.mnemonic,
parentAddress: newWalletArguments!.parentAddress,
);
case WalletType.wownero:
return wownero!.createWowneroNewWalletCredentials(
name: name, language: options!.first as String, isPolyseed: options.last as bool);
name: name,
password: walletPassword,
language: options!.first as String,
isPolyseed: options.last as bool,
);
case WalletType.none:
throw Exception('Unexpected type: ${type.toString()}');
}

View file

@ -129,7 +129,7 @@
"choose_from_available_options": "اختر من بين الخيارات المتاحة:",
"choose_one": "اختر واحدة",
"choose_relay": "ﻡﺍﺪﺨﺘﺳﻼﻟ ﻊﺑﺎﺘﺘﻟﺍ ﺭﺎﻴﺘﺧﺍ ءﺎﺟﺮﻟﺍ",
"choose_wallet_currency": "الرجاء اختيار عملة المحفظة:",
"choose_wallet_group": "اختر مجموعة المحفظة",
"clear": "مسح",
"clearnet_link": "رابط Clearnet",
"close": "يغلق",
@ -176,6 +176,7 @@
"create_invoice": "إنشاء فاتورة",
"create_new": "إنشاء محفظة جديدة",
"create_new_account": "انشاء حساب جديد",
"create_new_seed": "إنشاء بذرة جديدة",
"creating_new_wallet": "يتم إنشاء محفظة جديدة",
"creating_new_wallet_error": "خطأ: ${description}",
"creation_date": "تاريخ الإنشاء",
@ -600,6 +601,8 @@
"seed_share": "شارك السييد",
"seed_title": "سييد",
"seedtype": "البذور",
"seedtype_alert_content": "مشاركة البذور مع محافظ أخرى ممكن فقط مع BIP39 Seedtype.",
"seedtype_alert_title": "تنبيه البذور",
"seedtype_legacy": "إرث (25 كلمة)",
"seedtype_polyseed": "بوليسيد (16 كلمة)",
"select_backup_file": "حدد ملف النسخ الاحتياطي",
@ -666,6 +669,7 @@
"setup_your_debit_card": "قم بإعداد بطاقة ائتمان الخاصة بك",
"share": "يشارك",
"share_address": "شارك العنوان",
"shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة",
"show_details": "اظهر التفاصيل",
"show_keys": "اظهار السييد / المفاتيح",
"show_market_place": "إظهار السوق",
@ -690,6 +694,7 @@
"silent_payments_scanned_tip": "ممسوح ليفحص! (${tip})",
"silent_payments_scanning": "المدفوعات الصامتة المسح الضوئي",
"silent_payments_settings": "إعدادات المدفوعات الصامتة",
"single_seed_wallets_group": "محافظ بذرة واحدة",
"slidable": "قابل للانزلاق",
"sort_by": "ترتيب حسب",
"spend_key_private": "مفتاح الإنفاق (خاص)",
@ -849,8 +854,16 @@
"view_transaction_on": "عرض العملية على",
"voting_weight": "وزن التصويت",
"waitFewSecondForTxUpdate": "ﺕﻼﻣﺎﻌﻤﻟﺍ ﻞﺠﺳ ﻲﻓ ﺔﻠﻣﺎﻌﻤﻟﺍ ﺲﻜﻌﻨﺗ ﻰﺘﺣ ﻥﺍﻮﺛ ﻊﻀﺒﻟ ﺭﺎﻈﺘﻧﻻﺍ ﻰﺟﺮﻳ",
"wallet_group": "مجموعة محفظة",
"wallet_group_description_four": "لإنشاء محفظة مع بذرة جديدة تماما.",
"wallet_group_description_one": "في محفظة الكيك ، يمكنك إنشاء ملف",
"wallet_group_description_three": "لرؤية المحافظ المتاحة و/أو شاشة مجموعات المحفظة. أو اختر",
"wallet_group_description_two": "عن طريق اختيار محفظة موجودة لتبادل البذور مع. يمكن أن تحتوي كل مجموعة محفظة على محفظة واحدة من كل نوع من العملة. \n\n يمكنك تحديدها",
"wallet_group_empty_state_text_one": "يبدو أنه ليس لديك أي مجموعات محفظة متوافقة !\n\n انقر",
"wallet_group_empty_state_text_two": "أدناه لجعل واحدة جديدة.",
"wallet_keys": "سييد المحفظة / المفاتيح",
"wallet_list_create_new_wallet": "إنشاء محفظة جديدة",
"wallet_list_edit_group_name": "تحرير اسم المجموعة",
"wallet_list_edit_wallet": "تحرير المحفظة",
"wallet_list_failed_to_load": "فشل تحميل محفظة ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "فشلت إزالة محفظة ${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Изберете едно",
"choose_relay": "Моля, изберете реле, което да използвате",
"choose_wallet_currency": "Изберете валута за портфейла:",
"choose_wallet_group": "Изберете Group Wallet",
"clear": "Изчисти",
"clearnet_link": "Clearnet връзка",
"close": "затвори",
@ -176,6 +177,7 @@
"create_invoice": "Създайте фактура",
"create_new": "Създаване на нов портфейл",
"create_new_account": "Създаване на нов профил",
"create_new_seed": "Създайте нови семена",
"creating_new_wallet": "Създаване на нов портфейл",
"creating_new_wallet_error": "Грешка: ${description}",
"creation_date": "Дата на създаване",
@ -600,6 +602,8 @@
"seed_share": "Споделяне на seed",
"seed_title": "Seed",
"seedtype": "Семенна тип",
"seedtype_alert_content": "Споделянето на семена с други портфейли е възможно само с BIP39 Seedtype.",
"seedtype_alert_title": "Сигнал за семена",
"seedtype_legacy": "Наследство (25 думи)",
"seedtype_polyseed": "Поли семе (16 думи)",
"select_backup_file": "Избор на резервно копие",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Настройте своята дебитна карта",
"share": "Дял",
"share_address": "Сподели адрес",
"shared_seed_wallet_groups": "Споделени групи за портфейли за семена",
"show_details": "Показване на подробностите",
"show_keys": "Покажи seed/keys",
"show_market_place": "Покажи пазар",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Сканиран за съвет! (${tip})",
"silent_payments_scanning": "Безшумни плащания за сканиране",
"silent_payments_settings": "Настройки за безшумни плащания",
"single_seed_wallets_group": "Портфейли с единични семена",
"slidable": "Плъзгащ се",
"sort_by": "Сортирай по",
"spend_key_private": "Spend key (таен)",
@ -849,8 +855,16 @@
"view_transaction_on": "Вижте транзакция на ",
"voting_weight": "Тегло на гласуване",
"waitFewSecondForTxUpdate": "Моля, изчакайте няколко секунди, докато транзакцията се отрази в историята на транзакциите",
"wallet_group": "Група на портфейла",
"wallet_group_description_four": "За да създадете портфейл с изцяло ново семе.",
"wallet_group_description_one": "В портфейла за торта можете да създадете a",
"wallet_group_description_three": "За да видите наличния екран за портфейли и/или групи за портфейли. Или изберете",
"wallet_group_description_two": "Чрез избора на съществуващ портфейл, с който да споделите семе. Всяка група за портфейл може да съдържа по един портфейл от всеки тип валута. \n\n Можете да изберете",
"wallet_group_empty_state_text_one": "Изглежда, че нямате съвместими групи портфейли !\n\n tap",
"wallet_group_empty_state_text_two": "по -долу, за да се направи нов.",
"wallet_keys": "Seed/keys на портфейла",
"wallet_list_create_new_wallet": "Създаване на нов портфейл",
"wallet_list_edit_group_name": "Редактиране на име на групата",
"wallet_list_edit_wallet": "Редактиране на портфейла",
"wallet_list_failed_to_load": "Грешка при зареждането на портфейл ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "Грешка при премахването на портфейл${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Zvolte si",
"choose_relay": "Vyberte relé, které chcete použít",
"choose_wallet_currency": "Prosím zvolte si měnu pro peněženku:",
"choose_wallet_group": "Vyberte skupinu peněženky",
"clear": "Smazat",
"clearnet_link": "Odkaz na Clearnet",
"close": "zavřít",
@ -176,6 +177,7 @@
"create_invoice": "Vytvořit fakturu",
"create_new": "Vytvořit novou peněženku",
"create_new_account": "Vytvořit nový účet",
"create_new_seed": "Vytvořte nové semeno",
"creating_new_wallet": "Vytvářím novou peněženku",
"creating_new_wallet_error": "Chyba: ${description}",
"creation_date": "Datum vzniku",
@ -600,6 +602,8 @@
"seed_share": "Sdílet seed",
"seed_title": "Seed",
"seedtype": "SeedType",
"seedtype_alert_content": "Sdílení semen s jinými peněženkami je možné pouze u BIP39 SeedType.",
"seedtype_alert_title": "Upozornění seedtype",
"seedtype_legacy": "Legacy (25 slov)",
"seedtype_polyseed": "Polyseed (16 slov)",
"select_backup_file": "Vybrat soubor se zálohou",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Nastavit debetní kartu",
"share": "Podíl",
"share_address": "Sdílet adresu",
"shared_seed_wallet_groups": "Skupiny sdílených semen",
"show_details": "Zobrazit detaily",
"show_keys": "Zobrazit seed/klíče",
"show_market_place": "Zobrazit trh",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Naskenované na tip! (${tip})",
"silent_payments_scanning": "Skenování tichých plateb",
"silent_payments_settings": "Nastavení tichých plateb",
"single_seed_wallets_group": "Jednorázové peněženky",
"slidable": "Posuvné",
"sort_by": "Seřazeno podle",
"spend_key_private": "Klíč pro platby (soukromý)",
@ -849,8 +855,16 @@
"view_transaction_on": "Zobrazit transakci na ",
"voting_weight": "Hlasová váha",
"waitFewSecondForTxUpdate": "Počkejte několik sekund, než se transakce projeví v historii transakcí",
"wallet_group": "Skupina peněženky",
"wallet_group_description_four": "Vytvoření peněženky s zcela novým semenem.",
"wallet_group_description_one": "V peněžence dortu můžete vytvořit a",
"wallet_group_description_three": "Chcete -li zobrazit dostupnou obrazovku Skupina skupin peněženek a/nebo skupin peněženek. Nebo zvolit",
"wallet_group_description_two": "Výběrem existující peněženky pro sdílení semeno. Každá skupina peněženek může obsahovat jednu peněženku každého typu měny. \n\n Můžete si vybrat",
"wallet_group_empty_state_text_one": "Vypadá to, že nemáte žádné kompatibilní skupiny peněženky !\n\n",
"wallet_group_empty_state_text_two": "Níže vytvořit nový.",
"wallet_keys": "Seed/klíče peněženky",
"wallet_list_create_new_wallet": "Vytvořit novou peněženku",
"wallet_list_edit_group_name": "Upravit název skupiny",
"wallet_list_edit_wallet": "Upravit peněženku",
"wallet_list_failed_to_load": "Chyba při načítání ${wallet_name} peněženky. ${error}",
"wallet_list_failed_to_remove": "Chyba při odstraňování ${wallet_name} peněženky. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Wähle ein",
"choose_relay": "Bitte wählen Sie ein zu verwendendes Relais aus",
"choose_wallet_currency": "Bitte wählen Sie die Währung der Wallet:",
"choose_wallet_group": "Wählen Sie Brieftaschengruppe",
"clear": "Zurücksetzen",
"clearnet_link": "Clearnet-Link",
"close": "Schließen",
@ -176,6 +177,7 @@
"create_invoice": "Rechnung erstellen",
"create_new": "Neue Wallet erstellen",
"create_new_account": "Neues Konto erstellen",
"create_new_seed": "Neue Samen erstellen",
"creating_new_wallet": "Neue Wallet erstellen",
"creating_new_wallet_error": "Fehler: ${description}",
"creation_date": "Erstellungsdatum",
@ -601,6 +603,8 @@
"seed_share": "Seed teilen",
"seed_title": "Seed",
"seedtype": "Seedtyp",
"seedtype_alert_content": "Das Teilen von Samen mit anderen Brieftaschen ist nur mit bip39 Seedype möglich.",
"seedtype_alert_title": "Seedype -Alarm",
"seedtype_legacy": "Veraltet (25 Wörter)",
"seedtype_polyseed": "Polyseed (16 Wörter)",
"select_backup_file": "Sicherungsdatei auswählen",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Richten Sie Ihre Debitkarte ein",
"share": "Teilen",
"share_address": "Adresse teilen ",
"shared_seed_wallet_groups": "Gemeinsame Samenbrieftaschengruppen",
"show_details": "Details anzeigen",
"show_keys": "Seed/Schlüssel anzeigen",
"show_market_place": "Marktplatz anzeigen",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "Gescannt zum Trinkgeld! (${tip})",
"silent_payments_scanning": "Stille Zahlungen scannen",
"silent_payments_settings": "Einstellungen für stille Zahlungen",
"single_seed_wallets_group": "Einzelne Samenbriefen",
"slidable": "Verschiebbar",
"sort_by": "Sortiere nach",
"spend_key_private": "Spend Key (geheim)",
@ -852,8 +858,16 @@
"voting_weight": "Stimmgewicht",
"waitFewSecondForTxUpdate": "Bitte warten Sie einige Sekunden, bis die Transaktion im Transaktionsverlauf angezeigt wird",
"waiting_payment_confirmation": "Warte auf Zahlungsbestätigung",
"wallet_group": "Brieftaschengruppe",
"wallet_group_description_four": "eine Brieftasche mit einem völlig neuen Samen schaffen.",
"wallet_group_description_one": "In Kuchenbrieftasche können Sie eine erstellen",
"wallet_group_description_three": "Sehen Sie den Bildschirm zur verfügbaren Brieftaschen und/oder Brieftaschengruppen. Oder wählen",
"wallet_group_description_two": "Durch die Auswahl einer vorhandenen Brieftasche, mit der ein Samen geteilt werden kann. Jede Brieftaschengruppe kann eine einzelne Brieftasche jedes Währungstyps enthalten. \n\n Sie können auswählen",
"wallet_group_empty_state_text_one": "Sieht so aus, als hätten Sie keine kompatiblen Brieftaschengruppen !\n\n TAP",
"wallet_group_empty_state_text_two": "unten, um einen neuen zu machen.",
"wallet_keys": "Wallet-Seed/-Schlüssel",
"wallet_list_create_new_wallet": "Neue Wallet erstellen",
"wallet_list_edit_group_name": "Gruppenname bearbeiten",
"wallet_list_edit_wallet": "Wallet bearbeiten",
"wallet_list_failed_to_load": "Laden der Wallet ${wallet_name} fehlgeschlagen. ${error}",
"wallet_list_failed_to_remove": "Fehler beim Entfernen der Wallet ${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Choose one",
"choose_relay": "Please choose a relay to use",
"choose_wallet_currency": "Please choose wallet currency:",
"choose_wallet_group": "Choose Wallet Group",
"clear": "Clear",
"clearnet_link": "Clearnet link",
"close": "Close",
@ -176,6 +177,7 @@
"create_invoice": "Create invoice",
"create_new": "Create New Wallet",
"create_new_account": "Create new account",
"create_new_seed": "Create New Seed",
"creating_new_wallet": "Creating new wallet",
"creating_new_wallet_error": "Error: ${description}",
"creation_date": "Creation Date",
@ -600,6 +602,8 @@
"seed_share": "Share seed",
"seed_title": "Seed",
"seedtype": "Seedtype",
"seedtype_alert_content": "Sharing seeds with other wallets is only possible with BIP39 SeedType.",
"seedtype_alert_title": "SeedType Alert",
"seedtype_legacy": "Legacy (25 words)",
"seedtype_polyseed": "Polyseed (16 words)",
"seedtype_wownero": "Wownero (14 words)",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Set up your debit card",
"share": "Share",
"share_address": "Share address",
"shared_seed_wallet_groups": "Shared Seed Wallet Groups",
"show_details": "Show Details",
"show_keys": "Show seed/keys",
"show_market_place": "Show Marketplace",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "SCANNED TO TIP! (${tip})",
"silent_payments_scanning": "Silent Payments Scanning",
"silent_payments_settings": "Silent Payments settings",
"single_seed_wallets_group": "Single Seed Wallets",
"slidable": "Slidable",
"sort_by": "Sort by",
"spend_key_private": "Spend key (private)",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "Voting Weight",
"waitFewSecondForTxUpdate": "Kindly wait for a few seconds for transaction to reflect in transactions history",
"wallet_group": "Wallet Group",
"wallet_group_description_four": "to create a wallet with an entirely new seed.",
"wallet_group_description_one": "In Cake Wallet, you can create a",
"wallet_group_description_three": "to see the available wallets and/or wallet groups screen. Or choose",
"wallet_group_description_two": "by selecting an existing wallet to share a seed with. Each wallet group can contain a single wallet of each currency type.\n\nYou can select",
"wallet_group_empty_state_text_one": "Looks like you don't have any compatible wallet groups!\n\nTap",
"wallet_group_empty_state_text_two": "below to make a new one.",
"wallet_keys": "Wallet seed/keys",
"wallet_list_create_new_wallet": "Create New Wallet",
"wallet_list_edit_group_name": "Edit Group Name",
"wallet_list_edit_wallet": "Edit wallet",
"wallet_list_failed_to_load": "Failed to load ${wallet_name} wallet. ${error}",
"wallet_list_failed_to_remove": "Failed to remove ${wallet_name} wallet. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Elige uno",
"choose_relay": "Por favor elija un relé para usar",
"choose_wallet_currency": "Por favor, elija la moneda de la billetera:",
"choose_wallet_group": "Elija el grupo de billetera",
"clear": "Claro",
"clearnet_link": "enlace Clearnet",
"close": "Cerca",
@ -176,6 +177,7 @@
"create_invoice": "Crear factura",
"create_new": "Crear nueva billetera",
"create_new_account": "Crear una nueva cuenta",
"create_new_seed": "Crear nueva semilla",
"creating_new_wallet": "Creando nueva billetera",
"creating_new_wallet_error": "Error: ${description}",
"creation_date": "Fecha de creación",
@ -601,6 +603,8 @@
"seed_share": "Compartir semillas",
"seed_title": "Semilla",
"seedtype": "Type de semillas",
"seedtype_alert_content": "Compartir semillas con otras billeteras solo es posible con Bip39 Seed Type.",
"seedtype_alert_title": "Alerta de type de semillas",
"seedtype_legacy": "Legado (25 palabras)",
"seedtype_polyseed": "Polieta (16 palabras)",
"select_backup_file": "Seleccionar archivo de respaldo",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Configura tu tarjeta de débito",
"share": "Compartir",
"share_address": "Compartir dirección",
"shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas",
"show_details": "Mostrar detalles",
"show_keys": "Mostrar semilla/claves",
"show_market_place": "Mostrar mercado",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "Escaneado hasta la punta! (${tip})",
"silent_payments_scanning": "Escaneo de pagos silenciosos",
"silent_payments_settings": "Configuración de pagos silenciosos",
"single_seed_wallets_group": "Billeteras de semillas individuales",
"slidable": "deslizable",
"sort_by": "Ordenar por",
"spend_key_private": "Spend clave (privado)",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "Peso de votación",
"waitFewSecondForTxUpdate": "Espere unos segundos para que la transacción se refleje en el historial de transacciones.",
"wallet_group": "Grupo de billetera",
"wallet_group_description_four": "para crear una billetera con una semilla completamente nueva.",
"wallet_group_description_one": "En la billetera de pastel, puedes crear un",
"wallet_group_description_three": "Para ver las billeteras disponibles y/o la pantalla de grupos de billeteras. O elegir",
"wallet_group_description_two": "seleccionando una billetera existente para compartir una semilla con. Cada grupo de billetera puede contener una sola billetera de cada tipo de moneda. \n\n puede seleccionar",
"wallet_group_empty_state_text_one": "Parece que no tienes ningún grupo de billetera compatible !\n\n toque",
"wallet_group_empty_state_text_two": "a continuación para hacer uno nuevo.",
"wallet_keys": "Billetera semilla/claves",
"wallet_list_create_new_wallet": "Crear nueva billetera",
"wallet_list_edit_group_name": "Editar nombre de grupo",
"wallet_list_edit_wallet": "Editar billetera",
"wallet_list_failed_to_load": "No se pudo cargar ${wallet_name} la billetera. ${error}",
"wallet_list_failed_to_remove": "Error al elimina ${wallet_name} billetera. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Choisissez-en un",
"choose_relay": "Veuillez choisir un relais à utiliser",
"choose_wallet_currency": "Merci de choisir la devise du portefeuille (wallet) :",
"choose_wallet_group": "Choisissez un groupe de portefeuille",
"clear": "Effacer",
"clearnet_link": "Lien Clearnet",
"close": "Fermer",
@ -176,6 +177,7 @@
"create_invoice": "Créer une facture",
"create_new": "Créer un Nouveau Portefeuille (Wallet)",
"create_new_account": "Créer un nouveau compte",
"create_new_seed": "Créer de nouvelles graines",
"creating_new_wallet": "Création d'un nouveau portefeuille (wallet)",
"creating_new_wallet_error": "Erreur : ${description}",
"creation_date": "Date de création",
@ -600,6 +602,8 @@
"seed_share": "Partager la phrase secrète (seed)",
"seed_title": "Phrase secrète (seed)",
"seedtype": "Type de type graine",
"seedtype_alert_content": "Le partage de graines avec d'autres portefeuilles n'est possible qu'avec Bip39 SeedType.",
"seedtype_alert_title": "Alerte de type SeedType",
"seedtype_legacy": "Héritage (25 mots)",
"seedtype_polyseed": "Polyseed (16 mots)",
"select_backup_file": "Sélectionnez le fichier de sauvegarde",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Configurer votre carte de débit",
"share": "Partager",
"share_address": "Partager l'adresse",
"shared_seed_wallet_groups": "Groupes de portefeuilles partagés",
"show_details": "Afficher les détails",
"show_keys": "Visualiser la phrase secrète (seed) et les clefs",
"show_market_place": "Afficher la place de marché",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Scanné à la pointe! (${tip})",
"silent_payments_scanning": "Payments silencieux SCANNING",
"silent_payments_settings": "Paramètres de paiement silencieux",
"single_seed_wallets_group": "Portefeuilles de semences simples",
"slidable": "Glissable",
"sort_by": "Trier par",
"spend_key_private": "Clef de dépense (spend key) (privée)",
@ -849,8 +855,16 @@
"view_transaction_on": "Voir la Transaction sur ",
"voting_weight": "Poids de vote",
"waitFewSecondForTxUpdate": "Veuillez attendre quelques secondes pour que la transaction soit reflétée dans l'historique des transactions.",
"wallet_group": "Groupe de portefeuille",
"wallet_group_description_four": "Pour créer un portefeuille avec une graine entièrement nouvelle.",
"wallet_group_description_one": "Dans Cake Wallet, vous pouvez créer un",
"wallet_group_description_three": "Pour voir les portefeuilles et / ou les groupes de portefeuilles disponibles. Ou choisir",
"wallet_group_description_two": "En sélectionnant un portefeuille existant pour partager une graine avec. Chaque groupe de portefeuille peut contenir un seul portefeuille de chaque type de devise. \n\n Vous pouvez sélectionner",
"wallet_group_empty_state_text_one": "On dirait que vous n'avez pas de groupes de portefeuilles compatibles !\n\n Tap",
"wallet_group_empty_state_text_two": "Ci-dessous pour en faire un nouveau.",
"wallet_keys": "Phrase secrète (seed)/Clefs du portefeuille (wallet)",
"wallet_list_create_new_wallet": "Créer un Nouveau Portefeuille (Wallet)",
"wallet_list_edit_group_name": "Modifier le nom du groupe",
"wallet_list_edit_wallet": "Modifier le portefeuille",
"wallet_list_failed_to_load": "Échec de chargement du portefeuille (wallet) ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "Échec de la suppression du portefeuille (wallet) ${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Zaɓi ɗaya",
"choose_relay": "Da fatan za a zaɓi gudun ba da sanda don amfani",
"choose_wallet_currency": "Da fatan za a zaɓi kuɗin walat:",
"choose_wallet_group": "Zabi kungiyar walat",
"clear": "Share",
"clearnet_link": "Lambar makomar kwayoyi",
"close": "Rufa",
@ -176,6 +177,7 @@
"create_invoice": "Sanya bayanin wadannan",
"create_new": "Ƙirƙira Sabon Kwalinku",
"create_new_account": "Ƙirƙiri sabon asusu",
"create_new_seed": "Irƙiri sabon iri",
"creating_new_wallet": "Haliccin walat sabuwa",
"creating_new_wallet_error": "Kuskure: ${description}",
"creation_date": "Ranar halitta",
@ -602,6 +604,8 @@
"seed_share": "Raba iri",
"seed_title": "iri",
"seedtype": "Seedtype",
"seedtype_alert_content": "Raba tsaba tare da sauran wallets yana yiwuwa ne kawai tare da Bip39 seedtype.",
"seedtype_alert_title": "Seedtype farke",
"seedtype_legacy": "Legacy (25 kalmomi)",
"seedtype_polyseed": "Polyseed (16 kalmomi)",
"select_backup_file": "Zaɓi fayil ɗin madadin",
@ -668,6 +672,7 @@
"setup_your_debit_card": "Saita katin zare kudi",
"share": "Raba",
"share_address": "Raba adireshin",
"shared_seed_wallet_groups": "Raba ƙungiya walat",
"show_details": "Nuna Cikakkun bayanai",
"show_keys": "Nuna iri/maɓallai",
"show_market_place": "Nuna dan kasuwa",
@ -692,6 +697,7 @@
"silent_payments_scanned_tip": "Bincika don tip! (${tip})",
"silent_payments_scanning": "Silent biya scanning",
"silent_payments_settings": "Saitunan Silent",
"single_seed_wallets_group": "Guaro",
"slidable": "Mai iya zamewa",
"sort_by": "Kasa",
"spend_key_private": "makullin biya (maɓallin kalmar sirri)",
@ -851,8 +857,16 @@
"view_transaction_on": "Dubo aikace-aikacen akan",
"voting_weight": "Nauyi mai nauyi",
"waitFewSecondForTxUpdate": "Da fatan za a jira ƴan daƙiƙa don ciniki don yin tunani a tarihin ma'amala",
"wallet_group": "Wallet kungiyar",
"wallet_group_description_four": "Don ƙirƙirar walat tare da sabon iri.",
"wallet_group_description_one": "A cikin walat walat, zaka iya ƙirƙirar",
"wallet_group_description_three": "Don ganin wallets da / ko allon walat din. Ko zabi",
"wallet_group_description_two": "ta hanyar zabar walat mai gudana don raba iri tare da. Kowane rukunin walat na iya ƙunsar watsarin kowane nau'in kuɗi. \n\n Zaka iya zaɓar",
"wallet_group_empty_state_text_one": "Kamar dai ba ku da wata ƙungiya matattara !\n\n Taɓa",
"wallet_group_empty_state_text_two": "da ke ƙasa don yin sabo.",
"wallet_keys": "Iri/maɓalli na walat",
"wallet_list_create_new_wallet": "Ƙirƙiri Sabon Wallet",
"wallet_list_edit_group_name": "Shirya sunan rukuni",
"wallet_list_edit_wallet": "Gyara walat",
"wallet_list_failed_to_load": "An kasa loda ${wallet_name} walat. ${error}",
"wallet_list_failed_to_remove": "Ba a iya cirewa ${wallet_name} walat. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "एक का चयन",
"choose_relay": "कृपया उपयोग करने के लिए एक रिले चुनें",
"choose_wallet_currency": "कृपया बटुआ मुद्रा चुनें:",
"choose_wallet_group": "वॉलेट ग्रुप चुनें",
"clear": "स्पष्ट",
"clearnet_link": "क्लियरनेट लिंक",
"close": "बंद करना",
@ -176,6 +177,7 @@
"create_invoice": "इनवॉयस बनाएँ",
"create_new": "नया बटुआ बनाएँ",
"create_new_account": "नया खाता बनाएँ",
"create_new_seed": "नया बीज बनाएं",
"creating_new_wallet": "नया बटुआ बनाना",
"creating_new_wallet_error": "त्रुटि: ${description}",
"creation_date": "निर्माण तिथि",
@ -602,6 +604,8 @@
"seed_share": "बीज साझा करें",
"seed_title": "बीज",
"seedtype": "बीज",
"seedtype_alert_content": "अन्य बटुए के साथ बीज साझा करना केवल BIP39 SEEDTYPE के साथ संभव है।",
"seedtype_alert_title": "बीजगणित अलर्ट",
"seedtype_legacy": "विरासत (25 शब्द)",
"seedtype_polyseed": "पॉलीसीड (16 शब्द)",
"select_backup_file": "बैकअप फ़ाइल का चयन करें",
@ -668,6 +672,7 @@
"setup_your_debit_card": "अपना डेबिट कार्ड सेट करें",
"share": "शेयर करना",
"share_address": "पता साझा करें",
"shared_seed_wallet_groups": "साझा बीज बटुए समूह",
"show_details": "विवरण दिखाएं",
"show_keys": "बीज / कुंजियाँ दिखाएँ",
"show_market_place": "बाज़ार दिखाएँ",
@ -692,6 +697,7 @@
"silent_payments_scanned_tip": "टिप करने के लिए स्कैन किया! (${tip})",
"silent_payments_scanning": "मूक भुगतान स्कैनिंग",
"silent_payments_settings": "मूक भुगतान सेटिंग्स",
"single_seed_wallets_group": "एकल बीज बटुए",
"slidable": "फिसलने लायक",
"sort_by": "इसके अनुसार क्रमबद्ध करें",
"spend_key_private": "खर्च करना (निजी)",
@ -851,8 +857,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "वोटिंग वेट",
"waitFewSecondForTxUpdate": "लेन-देन इतिहास में लेन-देन प्रतिबिंबित होने के लिए कृपया कुछ सेकंड प्रतीक्षा करें",
"wallet_group": "बटुए समूह",
"wallet_group_description_four": "एक पूरी तरह से नए बीज के साथ एक बटुआ बनाने के लिए।",
"wallet_group_description_one": "केक बटुए में, आप एक बना सकते हैं",
"wallet_group_description_three": "उपलब्ध वॉलेट और/या वॉलेट समूह स्क्रीन देखने के लिए। या चुनें",
"wallet_group_description_two": "एक बीज साझा करने के लिए एक मौजूदा बटुए का चयन करके। प्रत्येक वॉलेट समूह में प्रत्येक मुद्रा प्रकार का एक एकल वॉलेट हो सकता है। \n\n आप चयन कर सकते हैं",
"wallet_group_empty_state_text_one": "लगता है कि आपके पास कोई संगत बटुआ समूह नहीं है !\n\n टैप करें",
"wallet_group_empty_state_text_two": "नीचे एक नया बनाने के लिए।",
"wallet_keys": "बटुआ बीज / चाबियाँ",
"wallet_list_create_new_wallet": "नया बटुआ बनाएँ",
"wallet_list_edit_group_name": "समूह का नाम संपादित करें",
"wallet_list_edit_wallet": "बटुआ संपादित करें",
"wallet_list_failed_to_load": "लोड करने में विफल ${wallet_name} बटुआ. ${error}",
"wallet_list_failed_to_remove": "निकालने में विफल ${wallet_name} बटुआ. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Izaberi jedan",
"choose_relay": "Odaberite relej za korištenje",
"choose_wallet_currency": "Molimo odaberite valutu novčanika:",
"choose_wallet_group": "Odaberite grupu novčanika",
"clear": "Izbriši",
"clearnet_link": "Clearnet veza",
"close": "Zatvoriti",
@ -176,6 +177,7 @@
"create_invoice": "Izradite fakturu",
"create_new": "Izradi novi novčanik",
"create_new_account": "Izradi novi račun",
"create_new_seed": "Stvorite novo sjeme",
"creating_new_wallet": "Stvaranje novog novčanika",
"creating_new_wallet_error": "Greška: ${description}",
"creation_date": "Datum stvaranja",
@ -600,6 +602,8 @@
"seed_share": "Podijeli pristupni izraz",
"seed_title": "Prisupni izraz",
"seedtype": "Sjemenska vrsta",
"seedtype_alert_content": "Dijeljenje sjemena s drugim novčanicima moguće je samo s BIP39 sjemenom.",
"seedtype_alert_title": "Upozorenje o sjemenu",
"seedtype_legacy": "Nasljeđe (25 riječi)",
"seedtype_polyseed": "Poliseed (16 riječi)",
"select_backup_file": "Odaberite datoteku sigurnosne kopije",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Postavite svoju debitnu karticu",
"share": "Udio",
"share_address": "Podijeli adresu",
"shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika",
"show_details": "Prikaži pojedinosti",
"show_keys": "Prikaži pristupni izraz/ključ",
"show_market_place": "Prikaži tržište",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Skenirano na savjet! (${tip})",
"silent_payments_scanning": "Skeniranje tihih plaćanja",
"silent_payments_settings": "Postavke tihih plaćanja",
"single_seed_wallets_group": "Jednostruki novčanici",
"slidable": "Klizna",
"sort_by": "Poredaj po",
"spend_key_private": "Spend key (privatni)",
@ -849,8 +855,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "Težina glasanja",
"waitFewSecondForTxUpdate": "Pričekajte nekoliko sekundi da se transakcija prikaže u povijesti transakcija",
"wallet_group": "Skupina novčanika",
"wallet_group_description_four": "Da biste stvorili novčanik s potpuno novim sjemenom.",
"wallet_group_description_one": "U novčaniku kolača možete stvoriti a",
"wallet_group_description_three": "Da biste vidjeli zaslon dostupnih novčanika i/ili grupa novčanika. Ili odaberite",
"wallet_group_description_two": "Odabirom postojećeg novčanika s kojim ćete dijeliti sjeme. Svaka grupa novčanika može sadržavati jedan novčanik svake vrste valute. \n\n",
"wallet_group_empty_state_text_one": "Izgleda da nemate nikakve kompatibilne grupe novčanika !\n\n",
"wallet_group_empty_state_text_two": "Ispod da napravite novi.",
"wallet_keys": "Pristupni izraz/ključ novčanika",
"wallet_list_create_new_wallet": "Izradi novi novčanik",
"wallet_list_edit_group_name": "Uredi naziv grupe",
"wallet_list_edit_wallet": "Uredi novčanik",
"wallet_list_failed_to_load": "Neuspješno učitavanje novčanika ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "Neuspješno uklanjanje novčanika ${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Ընտրեք մեկը",
"choose_relay": "Խնդրում ենք ընտրեք փոխանցման կետ",
"choose_wallet_currency": "Խնդրում ենք ընտրեք դրամապանակի արժույթը",
"choose_wallet_group": "Ընտրեք դրամապանակների խումբ",
"clear": "Մաքրել",
"clearnet_link": "Բաց ցանցի հղում",
"close": "Փակել",
@ -176,6 +177,7 @@
"create_invoice": "Ստեղծել հաշիվ-ապրանքագիր",
"create_new": "Ստեղծել նոր դրամապանակ",
"create_new_account": "Ստեղծել նոր հաշիվ",
"create_new_seed": "Ստեղծեք նոր սերունդ",
"creating_new_wallet": "Նոր դրամապանակ ստեղծվում է",
"creating_new_wallet_error": "Սխալ: ${description}",
"creation_date": "Ստեղծման ամսաթիվ",
@ -599,6 +601,8 @@
"seed_share": "Կիսվել սերմով",
"seed_title": "Սերմ",
"seedtype": "Սերմի տեսակ",
"seedtype_alert_content": "Այլ դրամապանակներով սերմերի փոխանակումը հնարավոր է միայն BIP39 SEEDTYPE- ով:",
"seedtype_alert_title": "SEEDTYPE ALERT",
"seedtype_legacy": "Legacy (25 բառ)",
"seedtype_polyseed": "Polyseed (16 բառ)",
"seedtype_wownero": "Wownero (14 բառ)",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Հավատարմագրել ձեր դեբետային քարտ",
"share": "Կիսվել",
"share_address": "Կիսվել հասցեով",
"shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր",
"show_details": "Ցուցադրել մանրամասներ",
"show_keys": "Ցուցադրել բանալիներ",
"show_market_place": "Ցուցադրել շուկան",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "ՍԿԱՆԱՎՈՐՎԵՑ ԹԵՅԱՎՃԱՐ! (${tip})",
"silent_payments_scanning": "Լուռ Վճարումներ Սկանավորում",
"silent_payments_settings": "Լուռ Վճարումներ Կարգավորումներ",
"single_seed_wallets_group": "Մեկ սերմերի դրամապանակներ",
"slidable": "Սահելի",
"sort_by": "Դասավորել ըստ",
"spend_key_private": "Վճարման բանալի (գախտնի)",
@ -849,8 +855,16 @@
"view_transaction_on": "Դիտել Գործարքը ",
"voting_weight": "Քվեարկության Քաշ",
"waitFewSecondForTxUpdate": "Խնդրում ենք սպասել մի քանի վայրկյան, որպեսզի գործարքը արտացոլվի գործարքների պատմության մեջ",
"wallet_group": "Դրամապանակների խումբ",
"wallet_group_description_four": "Ամբողջովին նոր սերմով դրամապանակ ստեղծելու համար:",
"wallet_group_description_one": "Տորթի դրամապանակում կարող եք ստեղծել ա",
"wallet_group_description_three": "Տեսնել առկա դրամապանակներն ու (կամ) դրամապանակների խմբերի էկրանը: Կամ ընտրել",
"wallet_group_description_two": "ընտրելով գոյություն ունեցող դրամապանակ `սերմը կիսելու համար: Դրամապանակների յուրաքանչյուր խումբ կարող է պարունակել յուրաքանչյուր արժույթի տիպի մեկ դրամապանակ: \n\n Կարող եք ընտրել",
"wallet_group_empty_state_text_one": "Կարծես թե դուք չունեք որեւէ համատեղելի դրամապանակների խմբեր !\n\n թակել",
"wallet_group_empty_state_text_two": "ներքեւում `նորը կազմելու համար:",
"wallet_keys": "Դրամապանակի սերմ/բանալիներ",
"wallet_list_create_new_wallet": "Ստեղծել Նոր Դրամապանակ",
"wallet_list_edit_group_name": "Խմբագրել խմբի անվանումը",
"wallet_list_edit_wallet": "Խմբագրել դրամապանակը",
"wallet_list_failed_to_load": "Չհաջողվեց բեռնել ${wallet_name} դրամապանակը։ ${error}",
"wallet_list_failed_to_remove": "Չհաջողվեց հեռացնել ${wallet_name} դրամապանակը։ ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Pilih satu",
"choose_relay": "Silakan pilih relai yang akan digunakan",
"choose_wallet_currency": "Silahkan pilih mata uang dompet:",
"choose_wallet_group": "Pilih Grup Dompet",
"clear": "Hapus",
"clearnet_link": "Tautan clearnet",
"close": "Menutup",
@ -176,6 +177,7 @@
"create_invoice": "Buat faktur",
"create_new": "Buat Dompet Baru",
"create_new_account": "Buat akun baru",
"create_new_seed": "Buat benih baru",
"creating_new_wallet": "Membuat dompet baru",
"creating_new_wallet_error": "Error: ${description}",
"creation_date": "Tanggal Pembuatan",
@ -603,6 +605,8 @@
"seed_share": "Bagikan bibit",
"seed_title": "Bibit",
"seedtype": "Seedtype",
"seedtype_alert_content": "Berbagi biji dengan dompet lain hanya dimungkinkan dengan BIP39 seedtype.",
"seedtype_alert_title": "Peringatan seedtype",
"seedtype_legacy": "Legacy (25 kata)",
"seedtype_polyseed": "Polyseed (16 kata)",
"select_backup_file": "Pilih file cadangan",
@ -669,6 +673,7 @@
"setup_your_debit_card": "Pasang kartu debit Anda",
"share": "Membagikan",
"share_address": "Bagikan alamat",
"shared_seed_wallet_groups": "Kelompok dompet benih bersama",
"show_details": "Tampilkan Rincian",
"show_keys": "Tampilkan seed/kunci",
"show_market_place": "Tampilkan Pasar",
@ -693,6 +698,7 @@
"silent_payments_scanned_tip": "Pindai untuk memberi tip! (${tip})",
"silent_payments_scanning": "Pemindaian pembayaran diam",
"silent_payments_settings": "Pengaturan pembayaran diam",
"single_seed_wallets_group": "Dompet biji tunggal",
"slidable": "Dapat digeser",
"sort_by": "Sortir dengan",
"spend_key_private": "Kunci pengeluaran (privat)",
@ -852,8 +858,16 @@
"view_transaction_on": "Lihat Transaksi di ",
"voting_weight": "Berat voting",
"waitFewSecondForTxUpdate": "Mohon tunggu beberapa detik hingga transaksi terlihat di riwayat transaksi",
"wallet_group": "Kelompok dompet",
"wallet_group_description_four": "Untuk membuat dompet dengan benih yang sama sekali baru.",
"wallet_group_description_one": "Di dompet kue, Anda dapat membuat file",
"wallet_group_description_three": "Untuk melihat layar dompet dan/atau grup dompet yang tersedia. Atau pilih",
"wallet_group_description_two": "dengan memilih dompet yang ada untuk berbagi benih dengan. Setiap grup dompet dapat berisi satu dompet dari setiap jenis mata uang. \n\n Anda dapat memilih",
"wallet_group_empty_state_text_one": "Sepertinya Anda tidak memiliki grup dompet yang kompatibel !\n\n tap",
"wallet_group_empty_state_text_two": "di bawah ini untuk membuat yang baru.",
"wallet_keys": "Seed/kunci dompet",
"wallet_list_create_new_wallet": "Buat Dompet Baru",
"wallet_list_edit_group_name": "Edit Nama Grup",
"wallet_list_edit_wallet": "Edit dompet",
"wallet_list_failed_to_load": "Gagal memuat ${wallet_name} dompet. ${error}",
"wallet_list_failed_to_remove": "Gagal menghapus ${wallet_name} dompet. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Scegline uno",
"choose_relay": "Scegli un relè da utilizzare",
"choose_wallet_currency": "Gentilmente scegli la moneta del portafoglio:",
"choose_wallet_group": "Scegli il gruppo del portafoglio",
"clear": "Pulisci",
"clearnet_link": "Collegamento Clearnet",
"close": "Chiudere",
@ -177,6 +178,7 @@
"create_invoice": "Crea fattura",
"create_new": "Genera nuovo Portafoglio",
"create_new_account": "Crea nuovo account",
"create_new_seed": "Crea nuovo seme",
"creating_new_wallet": "Creazione nuovo portafoglio",
"creating_new_wallet_error": "Errore: ${description}",
"creation_date": "Data di creazione",
@ -602,6 +604,8 @@
"seed_share": "Condividi seme",
"seed_title": "Seme",
"seedtype": "Seedtype",
"seedtype_alert_content": "La condivisione di semi con altri portafogli è possibile solo con Bip39 SeedType.",
"seedtype_alert_title": "Avviso seedType",
"seedtype_legacy": "Legacy (25 parole)",
"seedtype_polyseed": "Polyseed (16 parole)",
"select_backup_file": "Seleziona file di backup",
@ -668,6 +672,7 @@
"setup_your_debit_card": "Configura la tua carta di debito",
"share": "Condividere",
"share_address": "Condividi indirizzo",
"shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi",
"show_details": "Mostra dettagli",
"show_keys": "Mostra seme/chiavi",
"show_market_place": "Mostra mercato",
@ -692,6 +697,7 @@
"silent_payments_scanned_tip": "Scansionato per dare la mancia! (${tip})",
"silent_payments_scanning": "Scansione di pagamenti silenziosi",
"silent_payments_settings": "Impostazioni di pagamenti silenziosi",
"single_seed_wallets_group": "Portafogli singoli",
"slidable": "Scorrevole",
"sort_by": "Ordina per",
"spend_key_private": "Chiave di spesa (privata)",
@ -852,8 +858,16 @@
"voting_weight": "Peso di voto",
"waitFewSecondForTxUpdate": "Attendi qualche secondo affinché la transazione venga riflessa nella cronologia delle transazioni",
"waiting_payment_confirmation": "In attesa di conferma del pagamento",
"wallet_group": "Gruppo di portafoglio",
"wallet_group_description_four": "Per creare un portafoglio con un seme completamente nuovo.",
"wallet_group_description_one": "Nel portafoglio di torte, puoi creare un",
"wallet_group_description_three": "Per vedere la schermata di portafogli e/o gruppi di portafogli disponibili. O scegli",
"wallet_group_description_two": "Selezionando un portafoglio esistente con cui condividere un seme. Ogni gruppo di portafoglio può contenere un singolo portafoglio di ciascun tipo di valuta. \n\n È possibile selezionare",
"wallet_group_empty_state_text_one": "Sembra che tu non abbia alcun gruppo di portafoglio compatibile !\n\n TAP",
"wallet_group_empty_state_text_two": "Di seguito per crearne uno nuovo.",
"wallet_keys": "Seme Portafoglio /chiavi",
"wallet_list_create_new_wallet": "Crea Nuovo Portafoglio",
"wallet_list_edit_group_name": "Modifica nome del gruppo",
"wallet_list_edit_wallet": "Modifica portafoglio",
"wallet_list_failed_to_load": "Caricamento portafoglio ${wallet_name} fallito. ${error}",
"wallet_list_failed_to_remove": "Rimozione portafoglio ${wallet_name} fallita. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "1 つ選択してください",
"choose_relay": "使用するリレーを選択してください",
"choose_wallet_currency": "ウォレット通貨を選択してください:",
"choose_wallet_group": "ウォレットグループを選択してください",
"clear": "クリア",
"clearnet_link": "クリアネット リンク",
"close": "近い",
@ -176,6 +177,7 @@
"create_invoice": "請求書の作成",
"create_new": "新しいウォレットを作成",
"create_new_account": "新しいアカウントを作成する",
"create_new_seed": "新しい種を作成します",
"creating_new_wallet": "新しいウォレットの作成",
"creating_new_wallet_error": "エラー: ${description}",
"creation_date": "作成日",
@ -601,6 +603,8 @@
"seed_share": "シードを共有する",
"seed_title": "シード",
"seedtype": "SeedType",
"seedtype_alert_content": "他の財布と種子を共有することは、BIP39 SeedTypeでのみ可能です。",
"seedtype_alert_title": "SeedTypeアラート",
"seedtype_legacy": "レガシー25語",
"seedtype_polyseed": "ポリシード16語",
"select_backup_file": "バックアップファイルを選択",
@ -667,6 +671,7 @@
"setup_your_debit_card": "デビットカードを設定してください",
"share": "共有",
"share_address": "住所を共有する",
"shared_seed_wallet_groups": "共有シードウォレットグループ",
"show_details": "詳細を表示",
"show_keys": "シード/キーを表示する",
"show_market_place": "マーケットプレイスを表示",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "チップをスキャンしました! (${tip})",
"silent_payments_scanning": "サイレントペイメントスキャン",
"silent_payments_settings": "サイレントペイメント設定",
"single_seed_wallets_group": "シングルシードウォレット",
"slidable": "スライド可能",
"sort_by": "並び替え",
"spend_key_private": "キーを使う (プライベート)",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "投票重み",
"waitFewSecondForTxUpdate": "取引履歴に取引が反映されるまで数秒お待ちください。",
"wallet_group": "ウォレットグループ",
"wallet_group_description_four": "まったく新しい種子の財布を作成します。",
"wallet_group_description_one": "ケーキウォレットでは、aを作成できます",
"wallet_group_description_three": "利用可能なウォレットおよび/またはウォレットグループの画面を表示します。または選択します",
"wallet_group_description_two": "既存のウォレットを選択して種子を共有します。各ウォレットグループには、各通貨タイプの単一のウォレットを含めることができます。\n\n選択できます",
"wallet_group_empty_state_text_one": "互換性のあるウォレットグループがないようです!\n\nタップ",
"wallet_group_empty_state_text_two": "以下に新しいものを作るために。",
"wallet_keys": "ウォレットシード/キー",
"wallet_list_create_new_wallet": "新しいウォレットを作成",
"wallet_list_edit_group_name": "グループ名を編集します",
"wallet_list_edit_wallet": "ウォレットを編集する",
"wallet_list_failed_to_load": "読み込みに失敗しました ${wallet_name} 財布. ${error}",
"wallet_list_failed_to_remove": "削除できませんでした ${wallet_name} 財布. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "하나 선택",
"choose_relay": "사용할 릴레이를 선택해주세요",
"choose_wallet_currency": "지갑 통화를 선택하십시오:",
"choose_wallet_group": "지갑 그룹을 선택하십시오",
"clear": "명확한",
"clearnet_link": "클리어넷 링크",
"close": "닫다",
@ -176,6 +177,7 @@
"create_invoice": "인보이스 생성",
"create_new": "새 월렛 만들기",
"create_new_account": "새 계정을 만들",
"create_new_seed": "새 씨앗을 만듭니다",
"creating_new_wallet": "새 지갑 생성",
"creating_new_wallet_error": "오류: ${description}",
"creation_date": "생산 일",
@ -601,6 +603,8 @@
"seed_share": "시드 공유",
"seed_title": "씨",
"seedtype": "시드 타입",
"seedtype_alert_content": "다른 지갑과 씨앗을 공유하는 것은 BIP39 SeedType에서만 가능합니다.",
"seedtype_alert_title": "종자 경보",
"seedtype_legacy": "레거시 (25 단어)",
"seedtype_polyseed": "다문 (16 단어)",
"select_backup_file": "백업 파일 선택",
@ -667,6 +671,7 @@
"setup_your_debit_card": "직불카드 설정",
"share": "공유하다",
"share_address": "주소 공유",
"shared_seed_wallet_groups": "공유 종자 지갑 그룹",
"show_details": "세부정보 표시",
"show_keys": "시드 / 키 표시",
"show_market_place": "마켓플레이스 표시",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "팁을 스캔했습니다! (${tip})",
"silent_payments_scanning": "조용한 지불 스캔",
"silent_payments_settings": "조용한 지불 설정",
"single_seed_wallets_group": "단일 씨앗 지갑",
"slidable": "슬라이딩 가능",
"sort_by": "정렬 기준",
"spend_key_private": "지출 키 (은밀한)",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "투표 중량",
"waitFewSecondForTxUpdate": "거래 내역에 거래가 반영될 때까지 몇 초 정도 기다려 주세요.",
"wallet_group": "지갑 그룹",
"wallet_group_description_four": "완전히 새로운 씨앗으로 지갑을 만듭니다.",
"wallet_group_description_one": "케이크 지갑에서는 a를 만들 수 있습니다",
"wallet_group_description_three": "사용 가능한 지갑 및/또는 지갑 그룹 스크린을 볼 수 있습니다. 또는 선택하십시오",
"wallet_group_description_two": "씨앗을 공유 할 기존 지갑을 선택함으로써. 각 지갑 그룹은 각 통화 유형의 단일 지갑을 포함 할 수 있습니다. \n\n",
"wallet_group_empty_state_text_one": "호환 지갑 그룹이없는 것 같습니다 !\n\n TAP",
"wallet_group_empty_state_text_two": "아래에서 새로운 것을 만들기 위해.",
"wallet_keys": "지갑 시드 / 키",
"wallet_list_create_new_wallet": "새 월렛 만들기",
"wallet_list_edit_group_name": "그룹 이름 편집",
"wallet_list_edit_wallet": "지갑 수정",
"wallet_list_failed_to_load": "불러 오지 못했습니다 ${wallet_name} 지갑. ${error}",
"wallet_list_failed_to_remove": "제거하지 못했습니다 ${wallet_name} 지갑. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "တစ်ခုရွေးပါ။",
"choose_relay": "အသုံးပြုရန် relay ကိုရွေးချယ်ပါ။",
"choose_wallet_currency": "ပိုက်ဆံအိတ်ငွေကြေးကို ရွေးပါ-",
"choose_wallet_group": "ပိုက်ဆံအိတ်အုပ်စုရွေးပါ",
"clear": "ရှင်းလင်းသော",
"clearnet_link": "Clearnet လင့်ခ်",
"close": "အနီးကပ်",
@ -176,6 +177,7 @@
"create_invoice": "ပြေစာဖန်တီးပါ။",
"create_new": "Wallet အသစ်ဖန်တီးပါ။",
"create_new_account": "အကောင့်အသစ်ဖန်တီးပါ။",
"create_new_seed": "မျိုးစေ့အသစ်ကိုဖန်တီးပါ",
"creating_new_wallet": "ပိုက်ဆံအိတ်အသစ်ဖန်တီးခြင်း။",
"creating_new_wallet_error": "အမှား- ${description}",
"creation_date": "ဖန်တီးမှုနေ့စွဲ",
@ -600,6 +602,8 @@
"seed_share": "မျိုးစေ့မျှဝေပါ။",
"seed_title": "မျိုးစေ့",
"seedtype": "မျိုးပွားခြင်း",
"seedtype_alert_content": "အခြားပိုက်ဆံအိတ်များနှင့်မျိုးစေ့များကိုမျှဝေခြင်းသည် BIP39 sebyspe ဖြင့်သာဖြစ်သည်။",
"seedtype_alert_title": "ပျိုးပင်သတိပေးချက်",
"seedtype_legacy": "အမွေအနှစ် (စကားလုံး 25 လုံး)",
"seedtype_polyseed": "polyseed (စကားလုံး 16 လုံး)",
"select_backup_file": "အရန်ဖိုင်ကို ရွေးပါ။",
@ -666,6 +670,7 @@
"setup_your_debit_card": "သင့်ဒက်ဘစ်ကတ်ကို စနစ်ထည့်သွင်းပါ။",
"share": "မျှဝေပါ။",
"share_address": "လိပ်စာမျှဝေပါ။",
"shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ",
"show_details": "အသေးစိတ်ပြ",
"show_keys": "မျိုးစေ့ /သော့များကို ပြပါ။",
"show_market_place": "စျေးကွက်ကိုပြသပါ။",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "အစွန်အဖျားမှ scan ဖတ်! (${tip})",
"silent_payments_scanning": "အသံတိတ်ငွေပေးချေမှု scanning",
"silent_payments_settings": "အသံတိတ်ငွေပေးချေမှုဆက်တင်များ",
"single_seed_wallets_group": "တစ်ခုတည်းမျိုးစေ့ပိုက်ဆံအိတ်",
"slidable": "လျှောချနိုင်သည်။",
"sort_by": "အလိုက်စဥ်သည်",
"spend_key_private": "သော့သုံးရန် (သီးသန့်)",
@ -849,8 +855,16 @@
"view_transaction_on": "ငွေလွှဲခြင်းကို ဖွင့်ကြည့်ပါ။",
"voting_weight": "မဲပေးအလေးချိန်",
"waitFewSecondForTxUpdate": "ငွေပေးငွေယူ မှတ်တမ်းတွင် ရောင်ပြန်ဟပ်ရန် စက္ကန့်အနည်းငယ်စောင့်ပါ။",
"wallet_group": "ပိုက်ဆံအိတ်အုပ်စု",
"wallet_group_description_four": "လုံးဝအသစ်သောမျိုးစေ့နှင့်အတူပိုက်ဆံအိတ်ဖန်တီးရန်။",
"wallet_group_description_one": "ကိတ်မုန့်၌, သင်တစ် ဦး ဖန်တီးနိုင်ပါတယ်",
"wallet_group_description_three": "ရရှိနိုင်သည့်ပိုက်ဆံအိတ်နှင့် / သို့မဟုတ်ပိုက်ဆံအိတ်အုပ်စုများမြင်ကွင်းကိုကြည့်ရှုရန်။ သို့မဟုတ်ရွေးချယ်ပါ",
"wallet_group_description_two": "နှင့်အတူမျိုးစေ့ဝေမျှဖို့ရှိပြီးသားပိုက်ဆံအိတ်တစ်ခုရွေးချယ်ခြင်းအားဖြင့်။ ပိုက်ဆံအိတ်အုပ်စုတစ်ခုစီတွင်ငွေကြေးအမျိုးအစားတစ်ခုစီ၏တစ်ခုတည်းသောပိုက်ဆံအိတ်တစ်ခုပါ 0 င်နိုင်သည်။ \n\n သင်ရွေးချယ်နိုင်သည်",
"wallet_group_empty_state_text_one": "သင့်တွင်သဟဇာတဖြစ်သောပိုက်ဆံအိတ်အုပ်စုများမရှိပါ။ !\n\n ကိုအသာပုတ်ပါ",
"wallet_group_empty_state_text_two": "အသစ်တစ်ခုကိုတစ်ခုလုပ်ဖို့အောက်တွင်ဖော်ပြထားသော။",
"wallet_keys": "ပိုက်ဆံအိတ် အစေ့/သော့များ",
"wallet_list_create_new_wallet": "Wallet အသစ်ဖန်တီးပါ။",
"wallet_list_edit_group_name": "အုပ်စုအမည်ကိုတည်းဖြတ်ပါ",
"wallet_list_edit_wallet": "ပိုက်ဆံအိတ်ကို တည်းဖြတ်ပါ။",
"wallet_list_failed_to_load": "${wallet_name} ပိုက်ဆံအိတ်ကို ဖွင့်၍မရပါ။ ${error}",
"wallet_list_failed_to_remove": "${wallet_name} ပိုက်ဆံအိတ်ကို ဖယ်ရှား၍မရပါ။ ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Kies er een",
"choose_relay": "Kies een relais dat u wilt gebruiken",
"choose_wallet_currency": "Kies een portemonnee-valuta:",
"choose_wallet_group": "Kies portemonnee groep",
"clear": "Duidelijk",
"clearnet_link": "Clearnet-link",
"close": "Dichtbij",
@ -176,6 +177,7 @@
"create_invoice": "Factuur maken",
"create_new": "Maak een nieuwe portemonnee",
"create_new_account": "Creëer een nieuw account",
"create_new_seed": "Maak nieuw zaadje",
"creating_new_wallet": "Nieuwe portemonnee aanmaken",
"creating_new_wallet_error": "Fout: ${description}",
"creation_date": "Aanmaakdatum",
@ -600,6 +602,8 @@
"seed_share": "Deel zaad",
"seed_title": "Zaad",
"seedtype": "Zaadtype",
"seedtype_alert_content": "Het delen van zaden met andere portefeuilles is alleen mogelijk met BIP39 SeedType.",
"seedtype_alert_title": "Zaadtype alert",
"seedtype_legacy": "Legacy (25 woorden)",
"seedtype_polyseed": "Polyseed (16 woorden)",
"select_backup_file": "Selecteer een back-upbestand",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Stel uw debetkaart in",
"share": "Deel",
"share_address": "Deel adres",
"shared_seed_wallet_groups": "Gedeelde zaadportelgroepen",
"show_details": "Toon details",
"show_keys": "Toon zaad/sleutels",
"show_market_place": "Toon Marktplaats",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Gescand om te fooien! (${tip})",
"silent_payments_scanning": "Stille betalingen scannen",
"silent_payments_settings": "Stille betalingsinstellingen",
"single_seed_wallets_group": "Enkele zaadportefeuilles",
"slidable": "Verschuifbaar",
"sort_by": "Sorteer op",
"spend_key_private": "Sleutel uitgeven (privaat)",
@ -850,8 +856,16 @@
"voting_weight": "Stemgewicht",
"waitFewSecondForTxUpdate": "Wacht een paar seconden totdat de transactie wordt weergegeven in de transactiegeschiedenis",
"waiting_payment_confirmation": "In afwachting van betalingsbevestiging",
"wallet_group": "Portemonnee",
"wallet_group_description_four": "om een portemonnee te maken met een geheel nieuw zaadje.",
"wallet_group_description_one": "In cakeballet kun je een",
"wallet_group_description_three": "Om de beschikbare portefeuilles en/of portefeuillegroepen te zien. Of kies",
"wallet_group_description_two": "Door een bestaande portemonnee te selecteren om een zaadje mee te delen. Elke portemonnee -groep kan een enkele portemonnee van elk valutietype bevatten. \n\n U kunt selecteren",
"wallet_group_empty_state_text_one": "Het lijkt erop dat je geen compatibele portemonnee -groepen hebt !\n\n TAP",
"wallet_group_empty_state_text_two": "hieronder om een nieuwe te maken.",
"wallet_keys": "Portemonnee zaad/sleutels",
"wallet_list_create_new_wallet": "Maak een nieuwe portemonnee",
"wallet_list_edit_group_name": "Groepsnaam bewerken",
"wallet_list_edit_wallet": "Portemonnee bewerken",
"wallet_list_failed_to_load": "Laden mislukt ${wallet_name} portemonnee. ${error}",
"wallet_list_failed_to_remove": "Verwijderen mislukt ${wallet_name} portemonnee. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Wybierz jeden",
"choose_relay": "Wybierz przekaźnik, którego chcesz użyć",
"choose_wallet_currency": "Wybierz walutę portfela:",
"choose_wallet_group": "Wybierz grupę portfela",
"clear": "Wyczyść",
"clearnet_link": "łącze Clearnet",
"close": "Zamknąć",
@ -176,6 +177,7 @@
"create_invoice": "Wystaw fakturę",
"create_new": "Utwórz nowy portfel",
"create_new_account": "Stwórz nowe konto",
"create_new_seed": "Utwórz nowe ziarno",
"creating_new_wallet": "Tworzenie nowego portfela",
"creating_new_wallet_error": "Błąd: ${description}",
"creation_date": "Data utworzenia",
@ -600,6 +602,8 @@
"seed_share": "Udostępnij seed",
"seed_title": "Seed",
"seedtype": "Sedtype",
"seedtype_alert_content": "Dzielenie się nasionami z innymi portfelami jest możliwe tylko z BIP39 sededType.",
"seedtype_alert_title": "Ustanowienie typu sedype",
"seedtype_legacy": "Dziedzictwo (25 słów)",
"seedtype_polyseed": "Poliqueed (16 słów)",
"select_backup_file": "Wybierz plik kopii zapasowej",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Skonfiguruj swoją kartę debetową",
"share": "Udział",
"share_address": "Udostępnij adres",
"shared_seed_wallet_groups": "Wspólne grupy portfeli nasion",
"show_details": "Pokaż szczegóły",
"show_keys": "Pokaż seed/klucze",
"show_market_place": "Pokaż rynek",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Zeskanowany do napiwku! (${tip})",
"silent_payments_scanning": "Skanowanie cichych płatności",
"silent_payments_settings": "Ustawienia o cichej płatności",
"single_seed_wallets_group": "Pojedyncze portfele nasion",
"slidable": "Przesuwne",
"sort_by": "Sortuj według",
"spend_key_private": "Klucz prywatny",
@ -849,8 +855,16 @@
"view_transaction_on": "Zobacz transakcje na ",
"voting_weight": "Waga głosu",
"waitFewSecondForTxUpdate": "Poczekaj kilka sekund, aż transakcja zostanie odzwierciedlona w historii transakcji",
"wallet_group": "Grupa portfela",
"wallet_group_description_four": "Aby stworzyć portfel z zupełnie nowym ziarnem.",
"wallet_group_description_one": "W portfelu ciasta możesz stworzyć",
"wallet_group_description_three": "Aby zobaczyć dostępny ekran portfeli i/lub grup portfeli. Lub wybierz",
"wallet_group_description_two": "Wybierając istniejący portfel do podzielenia nasion. Każda grupa portfela może zawierać pojedynczy portfel każdego typu waluty. \n\n możesz wybrać",
"wallet_group_empty_state_text_one": "Wygląda na to, że nie masz żadnych kompatybilnych grup portfeli !\n\n Tap",
"wallet_group_empty_state_text_two": "poniżej, aby zrobić nowy.",
"wallet_keys": "Klucze portfela",
"wallet_list_create_new_wallet": "Utwórz nowy portfel",
"wallet_list_edit_group_name": "Edytuj nazwę grupy",
"wallet_list_edit_wallet": "Edytuj portfel",
"wallet_list_failed_to_load": "Nie udało się załadować ${wallet_name} portfel. ${error}",
"wallet_list_failed_to_remove": "Nie udało się usunąć ${wallet_name} portfel. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Escolha um",
"choose_relay": "Escolha um relé para usar",
"choose_wallet_currency": "Escolha a moeda da carteira:",
"choose_wallet_group": "Escolha o Grupo de Wallet",
"clear": "Limpar",
"clearnet_link": "link clear net",
"close": "Fechar",
@ -176,6 +177,7 @@
"create_invoice": "Criar recibo",
"create_new": "Criar nova carteira",
"create_new_account": "Criar nova conta",
"create_new_seed": "Crie nova semente",
"creating_new_wallet": "Criando nova carteira",
"creating_new_wallet_error": "Erro: ${description}",
"creation_date": "Data de criação",
@ -602,6 +604,8 @@
"seed_share": "Compartilhar semente",
"seed_title": "Semente",
"seedtype": "SeedType",
"seedtype_alert_content": "Compartilhar sementes com outras carteiras só é possível com o BIP39 SeedType.",
"seedtype_alert_title": "Alerta de SeedType",
"seedtype_legacy": "Legado (25 palavras)",
"seedtype_polyseed": "Polyseed (16 palavras)",
"select_backup_file": "Selecione o arquivo de backup",
@ -668,6 +672,7 @@
"setup_your_debit_card": "Configure seu cartão de débito",
"share": "Compartilhar",
"share_address": "Compartilhar endereço",
"shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados",
"show_details": "Mostrar detalhes",
"show_keys": "Mostrar semente/chaves",
"show_market_place": "Mostrar mercado",
@ -692,6 +697,7 @@
"silent_payments_scanned_tip": "Escaneado até o fim! (${tip})",
"silent_payments_scanning": "Escanear Pagamentos Silenciosos",
"silent_payments_settings": "Configurações de pagamentos silenciosos",
"single_seed_wallets_group": "Carteiras de sementes únicas",
"slidable": "Deslizável",
"sort_by": "Ordenar por",
"spend_key_private": "Chave de gastos (privada)",
@ -852,8 +858,16 @@
"voting_weight": "Peso de votação",
"waitFewSecondForTxUpdate": "Aguarde alguns segundos para que a transação seja refletida no histórico de transações",
"waiting_payment_confirmation": "Aguardando confirmação de pagamento",
"wallet_group": "Grupo de carteira",
"wallet_group_description_four": "Para criar uma carteira com uma semente totalmente nova.",
"wallet_group_description_one": "Na carteira de bolo, você pode criar um",
"wallet_group_description_three": "Para ver as carteiras disponíveis e/ou os grupos de carteiras. Ou escolha",
"wallet_group_description_two": "Selecionando uma carteira existente para compartilhar uma semente. Cada grupo de carteira pode conter uma única carteira de cada tipo de moeda. \n\n você pode selecionar",
"wallet_group_empty_state_text_one": "Parece que você não tem nenhum grupo de carteira compatível !\n\n Toque",
"wallet_group_empty_state_text_two": "abaixo para fazer um novo.",
"wallet_keys": "Semente/chaves da carteira",
"wallet_list_create_new_wallet": "Criar nova carteira",
"wallet_list_edit_group_name": "Editar o nome do grupo",
"wallet_list_edit_wallet": "Editar carteira",
"wallet_list_failed_to_load": "Falha ao abrir a carteira ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "Falha ao remover a carteira ${wallet_name}. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Выбери один",
"choose_relay": "Пожалуйста, выберите реле для использования",
"choose_wallet_currency": "Пожалуйста, выберите валюту кошелька:",
"choose_wallet_group": "Выберите группу кошелька",
"clear": "Очистить",
"clearnet_link": "Клирнет ссылка",
"close": "Закрывать",
@ -176,6 +177,7 @@
"create_invoice": "Создать счет",
"create_new": "Создать новый кошелёк",
"create_new_account": "Создать новый аккаунт",
"create_new_seed": "Создать новое семя",
"creating_new_wallet": "Создание нового кошелька",
"creating_new_wallet_error": "Ошибка: ${description}",
"creation_date": "Дата создания",
@ -601,6 +603,8 @@
"seed_share": "Поделиться мнемонической фразой",
"seed_title": "Мнемоническая фраза",
"seedtype": "SEEDTYPE",
"seedtype_alert_content": "Обмен семенами с другими кошельками возможно только с BIP39 SeedType.",
"seedtype_alert_title": "SEEDTYPE ALERT",
"seedtype_legacy": "Наследие (25 слов)",
"seedtype_polyseed": "Полиса (16 слов)",
"select_backup_file": "Выберите файл резервной копии",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Настройте свою дебетовую карту",
"share": "Делиться",
"share_address": "Поделиться адресом",
"shared_seed_wallet_groups": "Общие группы кошелька семян",
"show_details": "Показать детали",
"show_keys": "Показать мнемоническую фразу/ключи",
"show_market_place": "Показать торговую площадку",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "Оканируется, чтобы чаевые! (${tip})",
"silent_payments_scanning": "Сканирование безмолвных платежей",
"silent_payments_settings": "Silent Payments Settings",
"single_seed_wallets_group": "Одиночные кошельки",
"slidable": "Скользящий",
"sort_by": "Сортировать по",
"spend_key_private": "Приватный ключ траты",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "Вес голоса",
"waitFewSecondForTxUpdate": "Пожалуйста, подождите несколько секунд, чтобы транзакция отразилась в истории транзакций.",
"wallet_group": "Группа кошелька",
"wallet_group_description_four": "создать кошелек с совершенно новым семенем.",
"wallet_group_description_one": "В кошельке для торта вы можете создать",
"wallet_group_description_three": "Чтобы увидеть доступные кошельки и/или экраны групп кошельков. Или выберите",
"wallet_group_description_two": "выбирая существующий кошелек, чтобы поделиться семенами. Каждая группа кошелька может содержать один кошелек каждого типа валюты. \n\n Вы можете выбрать",
"wallet_group_empty_state_text_one": "Похоже, у вас нет никаких совместимых групп кошелька !\n\n tap",
"wallet_group_empty_state_text_two": "ниже, чтобы сделать новый.",
"wallet_keys": "Мнемоническая фраза/ключи кошелька",
"wallet_list_create_new_wallet": "Создать новый кошелёк",
"wallet_list_edit_group_name": "Редактировать название группы",
"wallet_list_edit_wallet": "Изменить кошелек",
"wallet_list_failed_to_load": "Ошибка при загрузке ${wallet_name} кошелька. ${error}",
"wallet_list_failed_to_remove": "Ошибка при удалении ${wallet_name} кошелька. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "เลือกหนึ่งรายการ",
"choose_relay": "กรุณาเลือกรีเลย์ที่จะใช้",
"choose_wallet_currency": "โปรดเลือกสกุลเงินของกระเป๋า:",
"choose_wallet_group": "เลือกกลุ่มกระเป๋าเงิน",
"clear": "ล้าง",
"clearnet_link": "ลิงค์เคลียร์เน็ต",
"close": "ปิด",
@ -176,6 +177,7 @@
"create_invoice": "สร้างใบแจ้งหนี้",
"create_new": "สร้างกระเป๋าใหม่",
"create_new_account": "สร้างบัญชีใหม่",
"create_new_seed": "สร้างเมล็ดพันธุ์ใหม่",
"creating_new_wallet": "กำลังสร้างกระเป๋าใหม่",
"creating_new_wallet_error": "ข้อผิดพลาด: ${description}",
"creation_date": "วันที่สร้าง",
@ -600,6 +602,8 @@
"seed_share": "แบ่งปัน seed",
"seed_title": "Seed",
"seedtype": "เมล็ดพันธุ์",
"seedtype_alert_content": "การแบ่งปันเมล็ดกับกระเป๋าเงินอื่น ๆ เป็นไปได้เฉพาะกับ bip39 seedtype",
"seedtype_alert_title": "การแจ้งเตือน seedtype",
"seedtype_legacy": "มรดก (25 คำ)",
"seedtype_polyseed": "โพลีส (16 คำ)",
"select_backup_file": "เลือกไฟล์สำรอง",
@ -666,6 +670,7 @@
"setup_your_debit_card": "ตั้งค่าบัตรเดบิตของคุณ",
"share": "แบ่งปัน",
"share_address": "แชร์ที่อยู่",
"shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน",
"show_details": "แสดงรายละเอียด",
"show_keys": "แสดงซีด/คีย์",
"show_market_place": "แสดงตลาดกลาง",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "สแกนไปที่ปลาย! (${tip})",
"silent_payments_scanning": "การสแกนการชำระเงินแบบเงียบ",
"silent_payments_settings": "การตั้งค่าการชำระเงินแบบเงียบ",
"single_seed_wallets_group": "กระเป๋าเงินเดียว",
"slidable": "เลื่อนได้",
"sort_by": "เรียงตาม",
"spend_key_private": "คีย์จ่าย (ส่วนตัว)",
@ -849,8 +855,16 @@
"view_transaction_on": "ดูการทำธุรกรรมบน ",
"voting_weight": "น้ำหนักโหวต",
"waitFewSecondForTxUpdate": "กรุณารอสักครู่เพื่อให้ธุรกรรมปรากฏในประวัติการทำธุรกรรม",
"wallet_group": "กลุ่มกระเป๋าเงิน",
"wallet_group_description_four": "เพื่อสร้างกระเป๋าเงินที่มีเมล็ดพันธุ์ใหม่ทั้งหมด",
"wallet_group_description_one": "ในกระเป๋าเงินเค้กคุณสามารถสร้างไฟล์",
"wallet_group_description_three": "หากต้องการดูกระเป๋าเงินและ/หรือกลุ่มกระเป๋าเงินที่มีอยู่ หรือเลือก",
"wallet_group_description_two": "โดยการเลือกกระเป๋าเงินที่มีอยู่เพื่อแบ่งปันเมล็ดด้วย แต่ละกลุ่มกระเป๋าเงินสามารถมีกระเป๋าเงินเดียวของแต่ละประเภทสกุลเงิน \n\n คุณสามารถเลือกได้",
"wallet_group_empty_state_text_one": "ดูเหมือนว่าคุณจะไม่มีกลุ่มกระเป๋าเงินที่เข้ากันได้ !\n\n แตะ",
"wallet_group_empty_state_text_two": "ด้านล่างเพื่อสร้างใหม่",
"wallet_keys": "ซีดของกระเป๋า/คีย์",
"wallet_list_create_new_wallet": "สร้างกระเป๋าใหม่",
"wallet_list_edit_group_name": "แก้ไขชื่อกลุ่ม",
"wallet_list_edit_wallet": "แก้ไขกระเป๋าสตางค์",
"wallet_list_failed_to_load": "ไม่สามารถโหลดกระเป๋า ${wallet_name} ได้ ${error}",
"wallet_list_failed_to_remove": "ไม่สามารถลบกระเป๋า ${wallet_name} ได้ ${error}",

View file

@ -129,8 +129,9 @@
"choose_from_available_options": "Pumili mula sa magagamit na mga pagpipilian:",
"choose_one": "Pumili ng isa",
"choose_relay": "Mangyaring pumili ng relay na gagamitin",
"choose_wallet_currency": "Mangyaring piliin ang pera ng wallet:",
"clear": "Burahin",
"choose_wallet_currency": "Mangyaring piliin ang Pera ng Wallet:",
"choose_wallet_group": "Piliin ang pangkat ng Wallet",
"clear": "Malinaw",
"clearnet_link": "Link ng Clearnet",
"close": "Isara",
"coin_control": "Coin control (opsyonal)",
@ -176,6 +177,7 @@
"create_invoice": "Lumikha ng invoice",
"create_new": "Lumikha ng Bagong Wallet",
"create_new_account": "Lumikha ng bagong account",
"create_new_seed": "Lumikha ng bagong binhi",
"creating_new_wallet": "Lumikha ng bagong wallet",
"creating_new_wallet_error": "Error: ${description}",
"creation_date": "Petsa ng paglikha",
@ -469,13 +471,13 @@
"please_try_to_connect_to_another_node": "Pakisubukang kumonekta sa iba pang node",
"please_wait": "Mangyaring maghintay",
"polygonscan_history": "Kasaysayan ng PolygonScan",
"powered_by": "Pinapatakbo ng${title}",
"pre_seed_button_text": "Naiitindihan ko. Ipakita ang aking seed",
"pre_seed_description": "Sa susunod na pahina ay makikita mo ang isang serye ng ${words} na salita. Ito ang iyong natatangi at pribadong seed at ito ang tanging paraan upang mabawi ang iyong wallet kung sakaling mawala o hindi gumana. Responsibilidad mong isulat ito sa isang ligtas na lugar sa labas ng Cake Wallet app.",
"pre_seed_title": "MAHALAGA",
"powered_by": "Pinapagana ng ${title}",
"pre_seed_button_text": "Naiintindihan ko. Ipakita sa akin ang aking binhi",
"pre_seed_description": "Sa susunod na pahina makikita mo ang isang serye ng mga ${words} na mga salita. Ito ang iyong natatangi at pribadong binhi at ito ang tanging paraan upang mabawi ang iyong pitaka kung sakaling mawala o madepektong paggawa. Responsibilidad mong isulat ito at itago ito sa isang ligtas na lugar sa labas ng cake wallet app.",
"pre_seed_title": "Mahalaga",
"prepaid_cards": "Mga Prepaid Card",
"prevent_screenshots": "Maiwasan ang mga screenshot at pag -record ng screen",
"privacy": "Pagkapribado",
"privacy": "Privacy",
"privacy_policy": "Patakaran sa Pagkapribado",
"privacy_settings": "Settings para sa pagsasa-pribado",
"private_key": "Private key",
@ -600,6 +602,8 @@
"seed_share": "Ibahagi ang seed",
"seed_title": "Seed",
"seedtype": "Seed type",
"seedtype_alert_content": "Ang pagbabahagi ng mga buto sa iba pang mga pitaka ay posible lamang sa bip39 seedtype.",
"seedtype_alert_title": "Alerto ng Seedtype",
"seedtype_legacy": "Legacy (25 na salita)",
"seedtype_polyseed": "Polyseed (16 na salita)",
"select_backup_file": "Piliin ang backup na file",
@ -666,6 +670,7 @@
"setup_your_debit_card": "I-set up ang iyong debit card",
"share": "Ibahagi",
"share_address": "Ibahagi ang address",
"shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi",
"show_details": "Ipakita ang mga detalye",
"show_keys": "Ipakita ang mga seed/key",
"show_market_place": "Ipakita ang Marketplace",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Na-scan sa tip! (${tip})",
"silent_payments_scanning": "Pag-scan ng tahimik na pagbabayad",
"silent_payments_settings": "Mga setting ng tahimik na pagbabayad",
"single_seed_wallets_group": "Solong mga pitaka ng binhi",
"slidable": "Slidable",
"sort_by": "Pag-uri-uriin sa pamamagitan ng",
"spend_key_private": "Spend key (private)",
@ -849,8 +855,16 @@
"view_transaction_on": "Tingnan ang transaksyon sa ",
"voting_weight": "Bigat ng pagboto",
"waitFewSecondForTxUpdate": "Mangyaring maghintay ng ilang segundo para makita ang transaksyon sa history ng mga transaksyon",
"wallet_group": "Group ng Wallet",
"wallet_group_description_four": "Upang lumikha ng isang pitaka na may ganap na bagong binhi.",
"wallet_group_description_one": "Sa cake wallet, maaari kang lumikha ng isang",
"wallet_group_description_three": "Upang makita ang magagamit na mga wallets at/o screen ng mga pangkat ng pitaka. O pumili",
"wallet_group_description_two": "Sa pamamagitan ng pagpili ng isang umiiral na pitaka upang magbahagi ng isang binhi. Ang bawat pangkat ng pitaka ay maaaring maglaman ng isang solong pitaka ng bawat uri ng pera.\n\nMaaari kang pumili",
"wallet_group_empty_state_text_one": "Mukhang wala kang anumang mga katugmang pangkat ng pitaka!\n\ntap",
"wallet_group_empty_state_text_two": "sa ibaba upang gumawa ng bago.",
"wallet_keys": "Wallet seed/keys",
"wallet_list_create_new_wallet": "Lumikha ng bagong wallet",
"wallet_list_edit_group_name": "I -edit ang Pangalan ng Grupo",
"wallet_list_edit_wallet": "I-edit ang wallet",
"wallet_list_failed_to_load": "Nabigong na-load ang ${wallet_name} na wallet. ${error}",
"wallet_list_failed_to_remove": "Nabigong alisin ang ${wallet_name} wallet. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Birini seç",
"choose_relay": "Lütfen kullanmak için bir röle seçin",
"choose_wallet_currency": "Lütfen cüzdanın para birimini seç:",
"choose_wallet_group": "Cüzdan Grubu Seçin",
"clear": "Temizle",
"clearnet_link": "Net bağlantı",
"close": "Kapalı",
@ -176,6 +177,7 @@
"create_invoice": "Fatura oluşturmak",
"create_new": "Yeni Cüzdan Oluştur",
"create_new_account": "Yeni hesap oluştur",
"create_new_seed": "Yeni Tohum Oluştur",
"creating_new_wallet": "Cüzdan oluşturuluyor",
"creating_new_wallet_error": "Hata: ${description}",
"creation_date": "Oluşturulma tarihi",
@ -600,6 +602,8 @@
"seed_share": "Tohumu paylaş",
"seed_title": "Tohum",
"seedtype": "Tohum",
"seedtype_alert_content": "Tohumları diğer cüzdanlarla paylaşmak sadece BIP39 tohumu ile mümkündür.",
"seedtype_alert_title": "SeedType uyarısı",
"seedtype_legacy": "Miras (25 kelime)",
"seedtype_polyseed": "Polyseed (16 kelime)",
"select_backup_file": "Yedek dosyası seç",
@ -666,6 +670,7 @@
"setup_your_debit_card": "Banka kartını ayarla",
"share": "Paylaşmak",
"share_address": "Adresi paylaş",
"shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları",
"show_details": "Detayları Göster",
"show_keys": "Tohumları/anahtarları göster",
"show_market_place": "Pazar Yerini Göster",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "Bahşiş için tarandı! (${tip})",
"silent_payments_scanning": "Sessiz Ödemeler Taraması",
"silent_payments_settings": "Sessiz Ödeme Ayarları",
"single_seed_wallets_group": "Tek tohum cüzdanları",
"slidable": "kaydırılabilir",
"sort_by": "Göre sırala",
"spend_key_private": "Harcama anahtarı (özel)",
@ -849,8 +855,16 @@
"view_transaction_on": "İşlemi şurada görüntüle ",
"voting_weight": "Oy kullanma",
"waitFewSecondForTxUpdate": "İşlemin işlem geçmişine yansıması için lütfen birkaç saniye bekleyin",
"wallet_group": "Cüzdan grubu",
"wallet_group_description_four": "Tamamen yeni bir tohumla bir cüzdan oluşturmak için.",
"wallet_group_description_one": "Kek cüzdanında bir",
"wallet_group_description_three": "Mevcut cüzdan ve/veya cüzdan grupları ekranını görmek için. Veya seç",
"wallet_group_description_two": "Bir tohumu paylaşmak için mevcut bir cüzdan seçerek. Her cüzdan grubu, her para türünün tek bir cüzdanı içerebilir. \n\n Seçebilirsiniz",
"wallet_group_empty_state_text_one": "Herhangi bir uyumlu cüzdan grubunuz yok gibi görünüyor !\n\n TAP",
"wallet_group_empty_state_text_two": "Yeni bir tane yapmak için aşağıda.",
"wallet_keys": "Cüzdan tohumu/anahtarları",
"wallet_list_create_new_wallet": "Yeni Cüzdan Oluştur",
"wallet_list_edit_group_name": "Grup Adını Düzenle",
"wallet_list_edit_wallet": "Cüzdanı düzenle",
"wallet_list_failed_to_load": "Failed to load ${wallet_name} wallet. ${error}",
"wallet_list_failed_to_remove": "${wallet_name} cüzdanı yüklenirken hata oluştu. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Вибери один",
"choose_relay": "Будь ласка, виберіть реле для використання",
"choose_wallet_currency": "Будь ласка, виберіть валюту гаманця:",
"choose_wallet_group": "Виберіть групу гаманця",
"clear": "Очистити",
"clearnet_link": "Посилання Clearnet",
"close": "Закрити",
@ -176,6 +177,7 @@
"create_invoice": "Створити рахунок-фактуру",
"create_new": "Створити новий гаманець",
"create_new_account": "Створити новий акаунт",
"create_new_seed": "Створіть нове насіння",
"creating_new_wallet": "Створення нового гаманця",
"creating_new_wallet_error": "Помилка: ${description}",
"creation_date": "Дата створення",
@ -601,6 +603,8 @@
"seed_share": "Поділитися мнемонічною фразою",
"seed_title": "Мнемонічна фраза",
"seedtype": "Насіннєвий тип",
"seedtype_alert_content": "Спільний доступ до інших гаманців можливе лише за допомогою BIP39 Seedtype.",
"seedtype_alert_title": "Попередження насінника",
"seedtype_legacy": "Спадщина (25 слів)",
"seedtype_polyseed": "Полісей (16 слів)",
"select_backup_file": "Виберіть файл резервної копії",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Налаштуйте свою дебетову картку",
"share": "Поділіться",
"share_address": "Поділитися адресою",
"shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців",
"show_details": "Показати деталі",
"show_keys": "Показати мнемонічну фразу/ключі",
"show_market_place": "Відображати маркетплейс",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "Сканований на підказку! (${tip})",
"silent_payments_scanning": "Мовчазні платежі сканування",
"silent_payments_settings": "Налаштування мовчазних платежів",
"single_seed_wallets_group": "Поодинокі насінні гаманці",
"slidable": "Розсувний",
"sort_by": "Сортувати за",
"spend_key_private": "Приватний ключ витрати",
@ -850,8 +856,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "Вага голосування",
"waitFewSecondForTxUpdate": "Будь ласка, зачекайте кілька секунд, поки транзакція відобразиться в історії транзакцій",
"wallet_group": "Група гаманців",
"wallet_group_description_four": "створити гаманець з абсолютно новим насінням.",
"wallet_group_description_one": "У гаманці тортів ви можете створити a",
"wallet_group_description_three": "Щоб побачити наявні гаманці та/або екран групи гаманців. Або вибрати",
"wallet_group_description_two": "Вибираючи існуючий гаманець, щоб поділитися насінням. Кожна група гаманця може містити один гаманець кожного типу валюти. \n\n Ви можете вибрати",
"wallet_group_empty_state_text_one": "Схоже, у вас немає сумісних груп гаманця !\n\n Торкніться",
"wallet_group_empty_state_text_two": "нижче, щоб зробити новий.",
"wallet_keys": "Мнемонічна фраза/ключі гаманця",
"wallet_list_create_new_wallet": "Створити новий гаманець",
"wallet_list_edit_group_name": "Назва групи редагування",
"wallet_list_edit_wallet": "Редагувати гаманець",
"wallet_list_failed_to_load": "Помилка при завантаженні ${wallet_name} гаманця. ${error}",
"wallet_list_failed_to_remove": "Помилка при видаленні ${wallet_name} гаманця. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "ایک کا انتخاب کریں",
"choose_relay": "۔ﮟﯾﺮﮐ ﺏﺎﺨﺘﻧﺍ ﺎﮐ ﮯﻠﯾﺭ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﻝﺎﻤﻌﺘﺳﺍ ﻡﺮﮐ ﮦﺍﺮﺑ",
"choose_wallet_currency": "براہ کرم والیٹ کرنسی کا انتخاب کریں:",
"choose_wallet_group": "پرس گروپ کا انتخاب کریں",
"clear": "صاف",
"clearnet_link": "کلیرنیٹ لنک",
"close": "بند کریں",
@ -176,6 +177,7 @@
"create_invoice": "انوائس بنائیں",
"create_new": "نیا والیٹ بنائیں",
"create_new_account": "نیا اکاؤنٹ بنانے",
"create_new_seed": "نیا بیج بنائیں",
"creating_new_wallet": "نیا پرس بنانا",
"creating_new_wallet_error": "خرابی: ${description}",
"creation_date": "بنانے کی تاریخ",
@ -602,6 +604,8 @@
"seed_share": "بیج بانٹیں۔",
"seed_title": "بیج",
"seedtype": "سیڈ ٹائپ",
"seedtype_alert_content": "دوسرے بٹوے کے ساتھ بیجوں کا اشتراک صرف BIP39 بیج ٹائپ کے ساتھ ہی ممکن ہے۔",
"seedtype_alert_title": "سیڈ ٹائپ الرٹ",
"seedtype_legacy": "میراث (25 الفاظ)",
"seedtype_polyseed": "پالیسیڈ (16 الفاظ)",
"select_backup_file": "بیک اپ فائل کو منتخب کریں۔",
@ -668,6 +672,7 @@
"setup_your_debit_card": "اپنا ڈیبٹ کارڈ ترتیب دیں۔",
"share": "بانٹیں",
"share_address": "پتہ شیئر کریں۔",
"shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ",
"show_details": "تفصیلات دکھائیں",
"show_keys": "بیج / چابیاں دکھائیں۔",
"show_market_place": "بازار دکھائیں۔",
@ -692,6 +697,7 @@
"silent_payments_scanned_tip": "نوکنے کے لئے اسکین! (${tip})",
"silent_payments_scanning": "خاموش ادائیگی اسکیننگ",
"silent_payments_settings": "خاموش ادائیگی کی ترتیبات",
"single_seed_wallets_group": "سنگل بیج کے بٹوے",
"slidable": "سلائیڈ ایبل",
"sort_by": "ترتیب دیں",
"spend_key_private": "خرچ کی کلید (نجی)",
@ -851,8 +857,16 @@
"view_transaction_on": "لین دین دیکھیں آن",
"voting_weight": "ووٹ کا وزن",
"waitFewSecondForTxUpdate": "۔ﮟﯾﺮﮐ ﺭﺎﻈﺘﻧﺍ ﺎﮐ ﮉﻨﮑﯿﺳ ﺪﻨﭼ ﻡﺮﮐ ﮦﺍﺮﺑ ﮯﯿﻟ ﮯﮐ ﮯﻧﺮﮐ ﯽﺳﺎﮑﻋ ﯽﮐ ﻦﯾﺩ ﻦﯿﻟ ﮟﯿﻣ ﺦﯾﺭﺎﺗ ﯽﮐ ﻦ",
"wallet_group": "پرس گروپ",
"wallet_group_description_four": "مکمل طور پر نئے بیج کے ساتھ پرس بنانے کے ل.",
"wallet_group_description_one": "کیک پرس میں ، آپ بنا سکتے ہیں",
"wallet_group_description_three": "دستیاب بٹوے اور/یا پرس گروپوں کی اسکرین کو دیکھنے کے لئے۔ یا منتخب کریں",
"wallet_group_description_two": "بیج کے ساتھ بانٹنے کے لئے موجودہ پرس کا انتخاب کرکے۔ ہر بٹوے گروپ میں ہر کرنسی کی قسم کا ایک بٹوے شامل ہوسکتا ہے۔ \n\n آپ منتخب کرسکتے ہیں",
"wallet_group_empty_state_text_one": "ایسا لگتا ہے کہ آپ کے پاس کوئی مطابقت پذیر والیٹ گروپس نہیں ہیں !\n\n نل",
"wallet_group_empty_state_text_two": "ایک نیا بنانے کے لئے ذیل میں.",
"wallet_keys": "بٹوے کے بیج / چابیاں",
"wallet_list_create_new_wallet": "نیا والیٹ بنائیں",
"wallet_list_edit_group_name": "گروپ کے نام میں ترمیم کریں",
"wallet_list_edit_wallet": "بٹوے میں ترمیم کریں۔",
"wallet_list_failed_to_load": "${wallet_name} والیٹ لوڈ کرنے میں ناکام۔ ${error}",
"wallet_list_failed_to_remove": "${wallet_name} والیٹ کو ہٹانے میں ناکام۔ ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "Chọn một",
"choose_relay": "Vui lòng chọn một relay để sử dụng",
"choose_wallet_currency": "Vui lòng chọn tiền tệ của ví:",
"choose_wallet_group": "Chọn nhóm ví",
"clear": "Xóa",
"clearnet_link": "Liên kết Clearnet",
"close": "Đóng",
@ -175,6 +176,7 @@
"create_invoice": "Tạo hóa đơn",
"create_new": "Tạo Ví Mới",
"create_new_account": "Tạo tài khoản mới",
"create_new_seed": "Tạo hạt giống mới",
"creating_new_wallet": "Đang tạo ví mới",
"creating_new_wallet_error": "Lỗi: ${description}",
"creation_date": "Ngày Tạo",
@ -844,6 +846,12 @@
"view_transaction_on": "Xem giao dịch trên",
"voting_weight": "Trọng số bỏ phiếu",
"waitFewSecondForTxUpdate": "Vui lòng đợi vài giây để giao dịch được phản ánh trong lịch sử giao dịch",
"wallet_group_description_four": "Để tạo ra một ví với một hạt giống hoàn toàn mới.",
"wallet_group_description_one": "Trong ví bánh, bạn có thể tạo",
"wallet_group_description_three": "Để xem ví trên ví và/hoặc màn hình nhóm ví. Hoặc chọn",
"wallet_group_description_two": "Bằng cách chọn một ví hiện có để chia sẻ một hạt giống với. Mỗi nhóm ví có thể chứa một ví của mỗi loại tiền tệ. \n\n Bạn có thể chọn",
"wallet_group_empty_state_text_one": "Có vẻ như bạn không có bất kỳ nhóm ví tương thích nào !\n\n Tap",
"wallet_group_empty_state_text_two": "Dưới đây để làm một cái mới.",
"wallet_keys": "Hạt giống/khóa ví",
"wallet_list_create_new_wallet": "Tạo ví mới",
"wallet_list_edit_wallet": "Chỉnh sửa ví",

View file

@ -130,6 +130,7 @@
"choose_one": "Ẹ yàn kan",
"choose_relay": "Jọwọ yan yii lati lo",
"choose_wallet_currency": "Ẹ jọ̀wọ́, yàn irú owó ti àpamọ́wọ́ yín:",
"choose_wallet_group": "Yan ẹgbẹ ogiri",
"clear": "Pa gbogbo nǹkan",
"clearnet_link": "Kọja ilọ oke",
"close": "sunmo",
@ -176,6 +177,7 @@
"create_invoice": "Ṣe iwe iwe",
"create_new": "Dá àpamọ́wọ́ tuntun",
"create_new_account": "Dá àkáǹtì títun",
"create_new_seed": "Ṣẹda irugbin tuntun",
"creating_new_wallet": "Ń dá àpamọ́wọ́ títun",
"creating_new_wallet_error": "Àṣìṣe: ${description}",
"creation_date": "Ọjọ ẹda",
@ -601,6 +603,8 @@
"seed_share": "Pín hóró",
"seed_title": "Hóró",
"seedtype": "Irugbin-seetypu",
"seedtype_alert_content": "Pinpin awọn irugbin pẹlu awọn gedo miiran ṣee ṣe pẹlu Bip39 irugbin.",
"seedtype_alert_title": "Ṣajọpọ Seeytype",
"seedtype_legacy": "Legacy (awọn ọrọ 25)",
"seedtype_polyseed": "Polyseed (awọn ọrọ 16)",
"select_backup_file": "Select backup file",
@ -667,6 +671,7 @@
"setup_your_debit_card": "Dá àwọn káàdì ìrajà yín",
"share": "Pinpin",
"share_address": "Pín àdírẹ́sì",
"shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin",
"show_details": "Fi ìsọfúnni kékeré hàn",
"show_keys": "Wo hóró / àwọn kọ́kọ́rọ́",
"show_market_place": "Wa Sopọ Pataki",
@ -691,6 +696,7 @@
"silent_payments_scanned_tip": "Ṣayẹwo si sample! (${tip})",
"silent_payments_scanning": "Awọn sisanwo ipalọlọ",
"silent_payments_settings": "Awọn eto isanwo ti o dakẹ",
"single_seed_wallets_group": "Awọn Wowei Awọn gige",
"slidable": "Slidable",
"sort_by": "Sa pelu",
"spend_key_private": "Kọ́kọ́rọ́ sísan (àdáni)",
@ -850,8 +856,16 @@
"view_transaction_on": "Wo pàṣípààrọ̀ lórí ",
"voting_weight": "Idibo iwuwo",
"waitFewSecondForTxUpdate": "Fi inurere duro fun awọn iṣeju diẹ fun idunadura lati ṣe afihan ninu itan-akọọlẹ iṣowo",
"wallet_group": "Ẹgbẹ apamọwọ",
"wallet_group_description_four": "Lati ṣẹda apamọwọ kan pẹlu irugbin tuntun tuntun.",
"wallet_group_description_one": "Ni apamọwọ akara oyinbo, o le ṣẹda a",
"wallet_group_description_three": "Lati wo awọn Woleti ti o wa ati / tabi Iboju Wallt. Tabi yan",
"wallet_group_description_two": "nipa yiyan apamọwọ ti o wa tẹlẹ lati pin irugbin kan pẹlu. Ẹgbẹ apamọwọ kọọkan le ni apamọwọ kan ti iru owo kọọkan. \n\n O le yan",
"wallet_group_empty_state_text_one": "O dabi pe o ko ni eyikeyi awọn ẹgbẹ ti o ni ibamu!\n\ntẹ ni kia kia",
"wallet_group_empty_state_text_two": "ni isalẹ lati ṣe ọkan titun.",
"wallet_keys": "Hóró/kọ́kọ́rọ́ àpamọ́wọ́",
"wallet_list_create_new_wallet": "Ṣe àpamọ́wọ́ títun",
"wallet_list_edit_group_name": "Ṣatunṣe Orukọ Ẹgbẹ",
"wallet_list_edit_wallet": "Ṣatunkọ apamọwọ",
"wallet_list_failed_to_load": "Ti kùnà ṣí́ àpamọ́wọ́ ${wallet_name}. ${error}",
"wallet_list_failed_to_remove": "Ti kùnà yọ ${wallet_name} àpamọ́wọ́ kúrò. ${error}",

View file

@ -130,6 +130,7 @@
"choose_one": "选一个",
"choose_relay": "请选择要使用的继电器",
"choose_wallet_currency": "请选择钱包货币:",
"choose_wallet_group": "选择钱包组",
"clear": "清空",
"clearnet_link": "明网链接",
"close": "关闭",
@ -176,6 +177,7 @@
"create_invoice": "创建发票",
"create_new": "创建新钱包",
"create_new_account": "建立新账户",
"create_new_seed": "创建新种子",
"creating_new_wallet": "创建新钱包",
"creating_new_wallet_error": "错误: ${description}",
"creation_date": "创建日期",
@ -600,6 +602,8 @@
"seed_share": "分享种子",
"seed_title": "种子",
"seedtype": "籽粒",
"seedtype_alert_content": "只有BIP39籽粒可以与其他钱包共享种子。",
"seedtype_alert_title": "籽粒警报",
"seedtype_legacy": "遗产25个单词",
"seedtype_polyseed": "多种物品16个单词",
"select_backup_file": "选择备份文件",
@ -666,6 +670,7 @@
"setup_your_debit_card": "设置你的借记卡",
"share": "分享",
"share_address": "分享地址",
"shared_seed_wallet_groups": "共享种子钱包组",
"show_details": "显示详细信息",
"show_keys": "显示种子/密钥",
"show_market_place": "显示市场",
@ -690,6 +695,7 @@
"silent_payments_scanned_tip": "扫描到小费! (${tip})",
"silent_payments_scanning": "无声付款扫描",
"silent_payments_settings": "无声付款设置",
"single_seed_wallets_group": "单个种子钱包",
"slidable": "可滑动",
"sort_by": "排序方式",
"spend_key_private": "Spend 密钥 (私钥)",
@ -849,8 +855,16 @@
"view_transaction_on": "View Transaction on ",
"voting_weight": "投票权重",
"waitFewSecondForTxUpdate": "请等待几秒钟,交易才会反映在交易历史记录中",
"wallet_group": "钱包组",
"wallet_group_description_four": "创建一个带有全新种子的钱包。",
"wallet_group_description_one": "在蛋糕钱包中,您可以创建一个",
"wallet_group_description_three": "查看可用的钱包和/或钱包组屏幕。或选择",
"wallet_group_description_two": "通过选择现有的钱包与种子共享。每个钱包组都可以包含每种货币类型的单个钱包。\n\n您可以选择",
"wallet_group_empty_state_text_one": "看起来您没有任何兼容的钱包组!\n\n tap",
"wallet_group_empty_state_text_two": "下面是一个新的。",
"wallet_keys": "钱包种子/密钥",
"wallet_list_create_new_wallet": "创建新钱包",
"wallet_list_edit_group_name": "编辑组名称",
"wallet_list_edit_wallet": "编辑钱包",
"wallet_list_failed_to_load": "加载失败 ${wallet_name} 钱包. ${error}",
"wallet_list_failed_to_remove": "删除失败 ${wallet_name} 钱包. ${error}",

View file

@ -151,7 +151,7 @@ abstract class Bitcoin {
String? passphrase,
});
WalletCredentials createBitcoinRestoreWalletFromWIFCredentials({required String name, required String password, required String wif, WalletInfo? walletInfo});
WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? passphrase});
WalletCredentials createBitcoinNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? passphrase, String? mnemonic, String? parentAddress});
WalletCredentials createBitcoinHardwareWalletCredentials({required String name, required HardwareAccountData accountData, WalletInfo? walletInfo});
List<String> getWordList();
Map<String, String> getWalletKeys(Object wallet);
@ -558,7 +558,7 @@ abstract class Wownero {
required String language,
required int height});
WalletCredentials createWowneroRestoreWalletFromSeedCredentials({required String name, required String password, required int height, required String mnemonic});
WalletCredentials createWowneroNewWalletCredentials({required String name, required String language, required bool isPolyseed, String password});
WalletCredentials createWowneroNewWalletCredentials({required String name, required String language, required bool isPolyseed, String? password});
Map<String, String> getKeys(Object wallet);
Object createWowneroTransactionCreationCredentials({required List<Output> outputs, required TransactionPriority priority});
Object createWowneroTransactionCreationCredentialsRaw({required List<OutputInfo> outputs, required TransactionPriority priority});
@ -833,7 +833,7 @@ import 'package:eth_sig_util/util/utils.dart';
abstract class Ethereum {
List<String> getEthereumWordList(String language);
WalletService createEthereumWalletService(Box<WalletInfo> walletInfoSource, bool isDirect);
WalletCredentials createEthereumNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password});
WalletCredentials createEthereumNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? mnemonic, String? parentAddress});
WalletCredentials createEthereumRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
WalletCredentials createEthereumRestoreWalletFromPrivateKey({required String name, required String privateKey, required String password});
WalletCredentials createEthereumHardwareWalletCredentials({required String name, required HardwareAccountData hwAccountData, WalletInfo? walletInfo});
@ -937,7 +937,7 @@ import 'package:eth_sig_util/util/utils.dart';
abstract class Polygon {
List<String> getPolygonWordList(String language);
WalletService createPolygonWalletService(Box<WalletInfo> walletInfoSource, bool isDirect);
WalletCredentials createPolygonNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password});
WalletCredentials createPolygonNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? mnemonic, String? parentAddress});
WalletCredentials createPolygonRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
WalletCredentials createPolygonRestoreWalletFromPrivateKey({required String name, required String privateKey, required String password});
WalletCredentials createPolygonHardwareWalletCredentials({required String name, required HardwareAccountData hwAccountData, WalletInfo? walletInfo});
@ -1024,7 +1024,7 @@ abstract class BitcoinCash {
Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource, bool isDirect);
WalletCredentials createBitcoinCashNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password, String? passphrase});
{required String name, WalletInfo? walletInfo, String? password, String? passphrase, String? mnemonic, String? parentAddress});
WalletCredentials createBitcoinCashRestoreWalletFromSeedCredentials(
{required String name, required String mnemonic, required String password, String? passphrase});
@ -1106,6 +1106,9 @@ abstract class Nano {
WalletCredentials createNanoNewWalletCredentials({
required String name,
String? password,
String? mnemonic,
String? parentAddress,
WalletInfo? walletInfo,
});
WalletCredentials createNanoRestoreWalletFromSeedCredentials({
@ -1221,7 +1224,7 @@ abstract class Solana {
List<String> getSolanaWordList(String language);
WalletService createSolanaWalletService(Box<WalletInfo> walletInfoSource, bool isDirect);
WalletCredentials createSolanaNewWalletCredentials(
{required String name, WalletInfo? walletInfo, String? password});
{required String name, WalletInfo? walletInfo, String? password, String? mnemonic, String? parentAddress,});
WalletCredentials createSolanaRestoreWalletFromSeedCredentials(
{required String name, required String mnemonic, required String password});
WalletCredentials createSolanaRestoreWalletFromPrivateKey(
@ -1307,7 +1310,8 @@ import 'package:cw_tron/tron_wallet_service.dart';
abstract class Tron {
List<String> getTronWordList(String language);
WalletService createTronWalletService(Box<WalletInfo> walletInfoSource, bool isDirect);
WalletCredentials createTronNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password});
WalletCredentials createTronNewWalletCredentials({required String name, WalletInfo? walletInfo, String? password, String? mnemonic,
String? parentAddress});
WalletCredentials createTronRestoreWalletFromSeedCredentials({required String name, required String mnemonic, required String password});
WalletCredentials createTronRestoreWalletFromPrivateKey({required String name, required String privateKey, required String password});
String getAddress(WalletBase wallet);