diff --git a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java index cf650375f..26cc56187 100644 --- a/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java +++ b/android/app/src/main/java/com/cakewallet/cake_wallet/MainActivity.java @@ -1,15 +1,49 @@ package com.cakewallet.cake_wallet; import androidx.annotation.NonNull; + import io.flutter.embedding.android.FlutterFragmentActivity; import io.flutter.embedding.engine.FlutterEngine; import io.flutter.plugins.GeneratedPluginRegistrant; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; + +import android.os.AsyncTask; +import android.os.Handler; +import android.os.Looper; + +import java.security.SecureRandom; public class MainActivity extends FlutterFragmentActivity { + final String UTILS_CHANNEL = "com.cake_wallet/native_utils"; @Override public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { GeneratedPluginRegistrant.registerWith(flutterEngine); + + MethodChannel utilsChannel = + new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), + UTILS_CHANNEL); + + utilsChannel.setMethodCallHandler(this::handle); + } + + private void handle(@NonNull MethodCall call, @NonNull MethodChannel.Result result) { + Handler handler = new Handler(Looper.getMainLooper()); + + try { + if (call.method.equals("sec_random")) { + int count = call.argument("count"); + SecureRandom random = new SecureRandom(); + byte bytes[] = new byte[count]; + random.nextBytes(bytes); + handler.post(() -> result.success(bytes)); + } else { + handler.post(() -> result.notImplemented()); + } + } catch (Exception e) { + handler.post(() -> result.error("UNCAUGHT_ERROR", e.getMessage(), null)); + } } } diff --git a/android/app/src/main/kotlin/com/cakewallet/cake_wallet/MainActivity.kt b/android/app/src/main/kotlin/com/cakewallet/cake_wallet/MainActivity.kt deleted file mode 100644 index b5c933268..000000000 --- a/android/app/src/main/kotlin/com/cakewallet/cake_wallet/MainActivity.kt +++ /dev/null @@ -1,13 +0,0 @@ -package com.cakewallet.cake_wallet - -import androidx.annotation.NonNull; -import io.flutter.embedding.android.FlutterActivity -import io.flutter.embedding.android.FlutterFragmentActivity -import io.flutter.embedding.engine.FlutterEngine -import io.flutter.plugins.GeneratedPluginRegistrant - -class MainActivity: FlutterActivity() { - override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine){ - GeneratedPluginRegistrant.registerWith(flutterEngine); - } -} diff --git a/android/app/src/main/res/drawable/ic_launcher.png b/android/app/src/main/res/drawable/ic_launcher.png new file mode 100755 index 000000000..a96724f1c Binary files /dev/null and b/android/app/src/main/res/drawable/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..b2c4ad887 --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index 5d9200d0a..b11806d56 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 83a98b56d..b76508e83 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index c8cbe84dd..1d32c2836 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index c4352f579..d5b7374a7 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 73fe04234..af40ea947 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/assets/images/2.0x/cake_logo.png b/assets/images/2.0x/cake_logo.png index c464cdcd4..277816813 100644 Binary files a/assets/images/2.0x/cake_logo.png and b/assets/images/2.0x/cake_logo.png differ diff --git a/assets/images/3.0x/cake_logo.png b/assets/images/3.0x/cake_logo.png index 5da47a539..87dd05ce2 100644 Binary files a/assets/images/3.0x/cake_logo.png and b/assets/images/3.0x/cake_logo.png differ diff --git a/assets/images/app_logo.png b/assets/images/app_logo.png index 4540659cf..bf6896ad2 100644 Binary files a/assets/images/app_logo.png and b/assets/images/app_logo.png differ diff --git a/assets/images/cake_logo.png b/assets/images/cake_logo.png index fb5267a79..8a85bf225 100644 Binary files a/assets/images/cake_logo.png and b/assets/images/cake_logo.png differ diff --git a/ios/CakeWallet/secRandom.swift b/ios/CakeWallet/secRandom.swift new file mode 100644 index 000000000..c9b2e3593 --- /dev/null +++ b/ios/CakeWallet/secRandom.swift @@ -0,0 +1,12 @@ +import Foundation + +func secRandom(count: Int) -> Data? { + var bytes = [Int8](repeating: 0, count: count) + let status = SecRandomCopyBytes(kSecRandomDefault, bytes.count, &bytes) + + if status == errSecSuccess { + return Data(bytes: bytes, count: bytes.count) + } + + return nil +} diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index a60dfb75f..7b8e304db 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C44A7192518EF8000B570ED /* decrypt.swift */; }; + 0C9D68C9264854B60011B691 /* secRandom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9D68C8264854B60011B691 /* secRandom.swift */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; @@ -21,6 +22,7 @@ 0C400E0F25B21ABB0025E469 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; 0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = ""; }; 0C9986A3251A932F00D566FD /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0C9D68C8264854B60011B691 /* secRandom.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = secRandom.swift; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 20F67A1B2C2FCB2A3BB048C1 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; @@ -65,6 +67,7 @@ isa = PBXGroup; children = ( 0C44A7192518EF8000B570ED /* decrypt.swift */, + 0C9D68C8264854B60011B691 /* secRandom.swift */, ); path = CakeWallet; sourceTree = ""; @@ -274,6 +277,7 @@ files = ( 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + 0C9D68C9264854B60011B691 /* secRandom.swift in Sources */, 0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -358,7 +362,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 35; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -375,7 +379,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.1.6; + MARKETING_VERSION = 4.1.7; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -501,7 +505,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 35; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -518,7 +522,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.1.6; + MARKETING_VERSION = 4.1.7; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; @@ -536,7 +540,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - CURRENT_PROJECT_VERSION = 35; + CURRENT_PROJECT_VERSION = 37; DEVELOPMENT_TEAM = 32J6BB6VUS; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -553,7 +557,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - MARKETING_VERSION = 4.1.6; + MARKETING_VERSION = 4.1.7; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 01aa14195..e7c300079 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -8,9 +8,10 @@ import Flutter didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { let controller : FlutterViewController = window?.rootViewController as! FlutterViewController - let batteryChannel = FlutterMethodChannel(name: "com.cakewallet.cakewallet/legacy_wallet_migration", - binaryMessenger: controller.binaryMessenger) - batteryChannel.setMethodCallHandler({ + let legacyMigrationChannel = FlutterMethodChannel( + name: "com.cakewallet.cakewallet/legacy_wallet_migration", + binaryMessenger: controller.binaryMessenger) + legacyMigrationChannel.setMethodCallHandler({ (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in switch call.method { @@ -52,6 +53,24 @@ import Flutter } }) + let utilsChannel = FlutterMethodChannel( + name: "com.cake_wallet/native_utils", + binaryMessenger: controller.binaryMessenger) + utilsChannel.setMethodCallHandler({ (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in + switch call.method { + case "sec_random": + guard let args = call.arguments as? Dictionary, + let count = args["count"] as? Int else { + result(nil) + return + } + + result(secRandom(count: count)) + default: + result(FlutterMethodNotImplemented) + } + }) + GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/lib/bitcoin/bitcoin_mnemonic.dart b/lib/bitcoin/bitcoin_mnemonic.dart index 7f4bcd13c..4f56161e0 100644 --- a/lib/bitcoin/bitcoin_mnemonic.dart +++ b/lib/bitcoin/bitcoin_mnemonic.dart @@ -4,23 +4,11 @@ import 'dart:typed_data'; import 'package:crypto/crypto.dart'; import 'package:unorm_dart/unorm_dart.dart' as unorm; import 'package:cryptography/cryptography.dart' as cryptography; +import 'package:cake_wallet/core/sec_random_native.dart'; const segwit = '100'; final wordlist = englishWordlist; -Uint8List randomBytes(int length, {bool secure = false}) { - assert(length > 0); - - final random = secure ? Random.secure() : Random(); - final ret = Uint8List(length); - - for (var i = 0; i < length; i++) { - ret[i] = random.nextInt(256); - } - - return ret; -} - double logBase(num x, num base) => log(x) / log(base); String mnemonicEncode(int i) { @@ -102,14 +90,15 @@ List prefixMatches(String source, List prefixes) { return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList(); } -String generateMnemonic({int strength = 132, String prefix = segwit}) { +Future generateMnemonic( + {int strength = 264, String prefix = segwit}) async { final wordBitlen = logBase(wordlist.length, 2).ceil(); final wordCount = strength / wordBitlen; final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil(); var result = ''; do { - final bytes = randomBytes(byteCount); + final bytes = await secRandom(byteCount); maskBytes(bytes, strength); result = encode(bytes); } while (!prefixMatches(result, [prefix]).first); @@ -134,7 +123,7 @@ bool matchesAnyPrefix(String mnemonic) => bool validateMnemonic(String mnemonic, {String prefix = segwit}) { try { return matchesAnyPrefix(mnemonic); - } catch(e) { + } catch (e) { return false; } } diff --git a/lib/bitcoin/bitcoin_mnemonic_is_incorrect_exception.dart b/lib/bitcoin/bitcoin_mnemonic_is_incorrect_exception.dart index 761b02601..5171a4f05 100644 --- a/lib/bitcoin/bitcoin_mnemonic_is_incorrect_exception.dart +++ b/lib/bitcoin/bitcoin_mnemonic_is_incorrect_exception.dart @@ -1,5 +1,5 @@ class BitcoinMnemonicIsIncorrectException implements Exception { @override String toString() => - 'Bitcoin mnemonic has incorrect format. Mnemonic should contain 12 words separated by space.'; + 'Bitcoin mnemonic has incorrect format. Mnemonic should contain 24 words separated by space.'; } diff --git a/lib/bitcoin/bitcoin_wallet_service.dart b/lib/bitcoin/bitcoin_wallet_service.dart index 8e3035a2c..e7f7862a0 100644 --- a/lib/bitcoin/bitcoin_wallet_service.dart +++ b/lib/bitcoin/bitcoin_wallet_service.dart @@ -25,7 +25,7 @@ class BitcoinWalletService extends WalletService< type: WalletType.bitcoin, name: credentials.name); final wallet = BitcoinWalletBase.build( dirPath: dirPath, - mnemonic: generateMnemonic(), + mnemonic: await generateMnemonic(), password: credentials.password, name: credentials.name, walletInfo: credentials.walletInfo); @@ -47,7 +47,7 @@ class BitcoinWalletService extends WalletService< final walletPath = '$walletDirPath/$name'; final walletJSONRaw = await read(path: walletPath, password: password); final walletInfo = walletInfoSource.values.firstWhere( - (info) => info.id == WalletBase.idFor(name, WalletType.bitcoin), + (info) => info.id == WalletBase.idFor(name, WalletType.bitcoin), orElse: () => null); final wallet = BitcoinWalletBase.fromJSON( password: password, diff --git a/lib/core/sec_random_native.dart b/lib/core/sec_random_native.dart new file mode 100644 index 000000000..b9800fd71 --- /dev/null +++ b/lib/core/sec_random_native.dart @@ -0,0 +1,13 @@ +import 'dart:typed_data'; + +import 'package:flutter/services.dart'; + +const utils = const MethodChannel('com.cake_wallet/native_utils'); + +Future secRandom(int count) async { + try { + return await utils.invokeMethod('sec_random', {'count': count}); + } on PlatformException catch (_) { + return Uint8List.fromList([]); + } +} diff --git a/lib/entities/crypto_currency.dart b/lib/entities/crypto_currency.dart index d5f23a0fa..7f27da7d6 100644 --- a/lib/entities/crypto_currency.dart +++ b/lib/entities/crypto_currency.dart @@ -19,7 +19,6 @@ class CryptoCurrency extends EnumerableItem with Serializable { CryptoCurrency.eos, CryptoCurrency.eth, CryptoCurrency.ltc, - CryptoCurrency.nano, CryptoCurrency.trx, CryptoCurrency.usdt, CryptoCurrency.usdterc20, @@ -29,7 +28,7 @@ class CryptoCurrency extends EnumerableItem with Serializable { static const xmr = CryptoCurrency(title: 'XMR', raw: 0); static const ada = CryptoCurrency(title: 'ADA', raw: 1); static const bch = CryptoCurrency(title: 'BCH', raw: 2); - static const bnb = CryptoCurrency(title: 'BNB', raw: 3); + static const bnb = CryptoCurrency(title: 'BNB BEP2', raw: 3); static const btc = CryptoCurrency(title: 'BTC', raw: 4); static const dai = CryptoCurrency(title: 'DAI', raw: 5); static const dash = CryptoCurrency(title: 'DASH', raw: 6); @@ -90,7 +89,7 @@ class CryptoCurrency extends EnumerableItem with Serializable { return CryptoCurrency.ada; case 'bch': return CryptoCurrency.bch; - case 'bnb': + case 'bnbmainnet': return CryptoCurrency.bnb; case 'btc': return CryptoCurrency.btc; diff --git a/lib/entities/language_service.dart b/lib/entities/language_service.dart index 53f915e87..33e5ca5be 100644 --- a/lib/entities/language_service.dart +++ b/lib/entities/language_service.dart @@ -16,7 +16,8 @@ class LanguageService { 'ru': 'Русский (Russian)', 'uk': 'Українська (Ukrainian)', 'zh': '中文 (Chinese)', - 'hr': 'Hrvatski (Croatian)' + 'hr': 'Hrvatski (Croatian)', + 'it': 'Italiano (Italian)' }; static final list = {}; diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index 69674131d..0adaf6c83 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -48,7 +48,9 @@ class ChangeNowExchangeProvider extends ExchangeProvider { @override Future fetchLimits({CryptoCurrency from, CryptoCurrency to, bool isFixedRateMode}) async { - final symbol = from.toString() + '_' + to.toString(); + final fromTitle = defineCurrencyTitle(from); + final toTitle = defineCurrencyTitle(to); + final symbol = fromTitle + '_' + toTitle; final url = isFixedRateMode ? apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey : apiUri + _minAmountUriSufix + symbol; @@ -61,8 +63,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final elemFrom = elem["from"] as String; final elemTo = elem["to"] as String; - if ((elemFrom == from.toString().toLowerCase()) && - (elemTo == to.toString().toLowerCase())) { + if ((elemFrom == fromTitle) && (elemTo == toTitle)) { final min = elem["min"] as double; final max = elem["max"] as double; @@ -84,9 +85,11 @@ class ChangeNowExchangeProvider extends ExchangeProvider { ? apiUri + _transactionsUriSufix + _fixedRateUriSufix + apiKey : apiUri + _transactionsUriSufix + apiKey; final _request = request as ChangeNowRequest; + final fromTitle = defineCurrencyTitle(_request.from); + final toTitle = defineCurrencyTitle(_request.to); final body = { - 'from': _request.from.toString(), - 'to': _request.to.toString(), + 'from': fromTitle, + 'to': toTitle, 'address': _request.address, 'amount': _request.amount, 'refundAddress': _request.refundAddress @@ -182,6 +185,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final url = apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey; final response = await get(url); final responseJSON = json.decode(response.body) as List; + final fromTitle = defineCurrencyTitle(from); + final toTitle = defineCurrencyTitle(to); var rate = 0.0; var fee = 0.0; @@ -189,8 +194,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider { final elemFrom = elem["from"] as String; final elemTo = elem["to"] as String; - if ((elemFrom == to.toString().toLowerCase()) && - (elemTo == from.toString().toLowerCase())) { + if ((elemFrom == toTitle) && (elemTo == fromTitle)) { rate = elem["rate"] as double; fee = elem["minerFee"] as double; break; @@ -216,22 +220,32 @@ class ChangeNowExchangeProvider extends ExchangeProvider { CryptoCurrency to, double amount, bool isFixedRateMode) { + final fromTitle = defineCurrencyTitle(from); + final toTitle = defineCurrencyTitle(to); + return isFixedRateMode ? apiUri + _exchangeAmountUriSufix + _fixedRateUriSufix + amount.toString() + '/' + - from.toString() + + fromTitle + '_' + - to.toString() + + toTitle + '?api_key=' + apiKey : apiUri + _exchangeAmountUriSufix + amount.toString() + '/' + - from.toString() + + fromTitle + '_' + - to.toString(); + toTitle; + } + + static String defineCurrencyTitle(CryptoCurrency currency) { + const bnbTitle = 'bnbmainnet'; + final currencyTitle = currency == CryptoCurrency.bnb + ? bnbTitle : currency.title.toLowerCase(); + return currencyTitle; } } diff --git a/lib/monero/monero_wallet_service.dart b/lib/monero/monero_wallet_service.dart index d964f0232..79882c0d3 100644 --- a/lib/monero/monero_wallet_service.dart +++ b/lib/monero/monero_wallet_service.dart @@ -228,7 +228,7 @@ class MoneroWalletService extends WalletService< final name = f.path.split('/').last; final newPath = newWalletDirPath + '/$name'; final newFile = File(newPath); - print(file.path); + if (!newFile.existsSync()) { newFile.createSync(); } diff --git a/lib/router.dart b/lib/router.dart index 0474758e3..19a6b760f 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -237,9 +237,11 @@ Route createRoute(RouteSettings settings) { case Routes.unlock: return MaterialPageRoute( fullscreenDialog: true, - builder: (_) => getIt.get( - param1: settings.arguments as OnAuthenticationFinished, - param2: false)); + builder: (_) => WillPopScope( + child: getIt.get( + param1: settings.arguments as OnAuthenticationFinished, + param2: false), + onWillPop: () async => false)); case Routes.nodeList: return CupertinoPageRoute( diff --git a/lib/src/screens/seed/pre_seed_page.dart b/lib/src/screens/seed/pre_seed_page.dart index 03fc17425..0a12b752a 100644 --- a/lib/src/screens/seed/pre_seed_page.dart +++ b/lib/src/screens/seed/pre_seed_page.dart @@ -13,7 +13,7 @@ class PreSeedPage extends BasePage { imageDark = Image.asset('assets/images/pre_seed_dark.png'), wordsCount = type == WalletType.monero ? 25 - : 12; // FIXME: Stupid fast implementation + : 24; // FIXME: Stupid fast implementation final Image imageDark; final Image imageLight; @@ -49,7 +49,9 @@ class PreSeedPage extends BasePage { Padding( padding: EdgeInsets.only(top: 70, left: 16, right: 16), child: Text( - S.of(context).pre_seed_description(wordsCount.toString()), + S + .of(context) + .pre_seed_description(wordsCount.toString()), textAlign: TextAlign.center, style: TextStyle( fontSize: 14, diff --git a/lib/view_model/auth_view_model.dart b/lib/view_model/auth_view_model.dart index 5bf5c25a1..76df95283 100644 --- a/lib/view_model/auth_view_model.dart +++ b/lib/view_model/auth_view_model.dart @@ -110,8 +110,6 @@ abstract class AuthViewModelBase with Store { if (isAuthenticated) { state = ExecutedSuccessfullyState(); - } else { - state = FailureState('Failure biometric authentication'); } } } catch(e) { diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index fc860e011..d93213c45 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -59,7 +59,8 @@ abstract class ExchangeViewModelBase with Store { }); receiveCurrencies = CryptoCurrency.all.where((cryptoCurrency) => (cryptoCurrency != CryptoCurrency.xlm)&& - (cryptoCurrency != CryptoCurrency.xrp)).toList(); + (cryptoCurrency != CryptoCurrency.xrp)&& + (cryptoCurrency != CryptoCurrency.bnb)).toList(); _defineIsReceiveAmountEditable(); isFixedRateMode = false; isReceiveAmountEntered = false; diff --git a/pubspec.yaml b/pubspec.yaml index 15ccf8cec..194a1915e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -11,7 +11,7 @@ description: Cake Wallet. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 4.1.6+45 +version: 4.1.7+46 environment: sdk: ">=2.7.0 <3.0.0" diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 6d1d66b84..3059a1f81 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Beschreibung zur Wiederherstellung der Brieftasche", "restore_new_seed" : "Neuer Seed", "restore_active_seed" : "Aktives Seed", - "restore_bitcoin_description_from_seed" : "Stellen Sie Ihre Brieftasche aus dem 12-Wort-Kombinationscode wieder her", + "restore_bitcoin_description_from_seed" : "Stellen Sie Ihre Brieftasche aus dem 24-Wort-Kombinationscode wieder her", "restore_bitcoin_description_from_keys" : "Stellen Sie Ihre Brieftasche aus der generierten WIF-Zeichenfolge aus Ihren privaten Schlüsseln wieder her", "restore_bitcoin_title_from_keys" : "Aus WIF wiederherstellen", "restore_from_date_or_blockheight" : "Bitte geben Sie einige Tage vor dem Erstellen dieser Brieftasche ein Datum ein. Oder wenn Sie die Blockhöhe kennen, geben Sie sie stattdessen ein", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index b0d98b7c9..181af4809 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Wallet restore description", "restore_new_seed" : "New seed", "restore_active_seed" : "Active seed", - "restore_bitcoin_description_from_seed" : "Restore your wallet from 12 word combination code", + "restore_bitcoin_description_from_seed" : "Restore your wallet from 24 word combination code", "restore_bitcoin_description_from_keys" : "Restore your wallet from generated WIF string from your private keys", "restore_bitcoin_title_from_keys" : "Restore from WIF", "restore_from_date_or_blockheight" : "Please enter a date a few days before you created this wallet. Or if you know the blockheight, please enter it instead", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 190ad4304..80247191a 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Restaurar billetera", "restore_new_seed" : "Nueva semilla", "restore_active_seed" : "Semilla activa", - "restore_bitcoin_description_from_seed" : "Restaure su billetera a partir del código de combinación de 12 palabras", + "restore_bitcoin_description_from_seed" : "Restaure su billetera a partir del código de combinación de 24 palabras", "restore_bitcoin_description_from_keys" : "Restaure su billetera a partir de una cadena WIF generada a partir de sus claves privadas", "restore_bitcoin_title_from_keys" : "Restaurar desde WIF", "restore_from_date_or_blockheight" : "Ingrese una fecha unos días antes de crear esta billetera. O si conoce la altura del bloque, ingréselo en su lugar", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 6eac14e99..09188bd8d 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "बटुआ विवरण पुनर्स्थापित करें", "restore_new_seed" : "नया बीज", "restore_active_seed" : "सक्रिय बीज", - "restore_bitcoin_description_from_seed" : "12 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें", + "restore_bitcoin_description_from_seed" : "24 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें", "restore_bitcoin_description_from_keys" : "अपने निजी कुंजी से उत्पन्न WIF स्ट्रिंग से अपने वॉलेट को पुनर्स्थापित करें", "restore_bitcoin_title_from_keys" : "WIF से पुनर्स्थापित करें", "restore_from_date_or_blockheight" : "कृपया इस वॉलेट को बनाने से कुछ दिन पहले एक तारीख दर्ज करें। या यदि आप ब्लॉकचेट जानते हैं, तो कृपया इसके बजाय इसे दर्ज करें", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb new file mode 100644 index 000000000..21f61ec6f --- /dev/null +++ b/res/values/strings_it.arb @@ -0,0 +1,473 @@ +{ + "welcome" : "Benvenuto", + "cake_wallet" : "Cake Wallet", + "first_wallet_text" : "Fantastico portafoglio per Monero e Bitcoin", + "please_make_selection" : "Gentilmente seleziona se vuoi generare o recuperare il tuo portafoglio.", + "create_new" : "Genera nuovo Portafoglio", + "restore_wallet" : "Recupera Portafoglio", + + + "accounts" : "Accounts", + "edit" : "Modifica", + "account" : "Account", + "add" : "Aggiungi", + + + "address_book" : "Rubrica indirizzi", + "contact" : "Contatta", + "please_select" : "Gentilmente seleziona:", + "cancel" : "Cancella", + "ok" : "OK", + "contact_name" : "Nome Contatto", + "reset" : "Resetta", + "save" : "Salva", + "address_remove_contact" : "Rimuovi contatto", + "address_remove_content" : "Sei sicuro di voler eliminare il contatto selezionato?", + + + "authenticated" : "Autenticato", + "authentication" : "Autenticazione", + "failed_authentication" : "Autenticazione fallita. ${state_error}", + + + "wallet_menu" : "Menu", + "Blocks_remaining" : "${status} Blocchi Rimanenti", + "please_try_to_connect_to_another_node" : "Gentilmente prova a connetterti ad un altro nodo", + "xmr_hidden" : "Nascosto", + "xmr_available_balance" : "Saldo Disponibile", + "xmr_full_balance" : "Saldo Completo", + "send" : "Invia", + "receive" : "Ricevi", + "transactions" : "Transazioni", + "incoming" : "In arrivo", + "outgoing" : "In uscita", + "transactions_by_date" : "Transazioni per data", + "trades" : "Scambi", + "filters" : "Filtri", + "today" : "Oggi", + "yesterday" : "Ieri", + "received" : "Ricevuto", + "sent" : "Inviato", + "pending" : " (pendente)", + "rescan" : "Scansiona di nuovo", + "reconnect" : "Riconnetti", + "wallets" : "Portafogli", + "show_seed" : "Mostra seme", + "show_keys" : "Mostra seme/chiavi", + "address_book_menu" : "Rubrica indirizzi", + "reconnection" : "Riconnessione", + "reconnect_alert_text" : "Sei sicuro di volerti riconnettere?", + + + "exchange" : "Scambia", + "clear" : "Pulisci", + "refund_address" : "Indirizzo di rimborso", + "change_exchange_provider" : "Cambia Exchange", + "you_will_send" : "Conveti da", + "you_will_get" : "Converti a", + "amount_is_guaranteed" : "L'ammonare da ricevere è fissato", + "amount_is_estimate" : "L'ammontare da ricevere è una stima", + "powered_by" : "Sviluppato da ${title}", + "error" : "Errore", + "estimated" : "Stimato", + "min_value" : "Min: ${value} ${currency}", + "max_value" : "Max: ${value} ${currency}", + "change_currency" : "Cambia Moneta", + + + "copy_id" : "Copia ID", + "exchange_result_write_down_trade_id" : "Gentilmente fai una copia o trascrivi l'ID dello scambio per continuare.", + "trade_id" : "ID Scambio:", + "copied_to_clipboard" : "Copiato negli Appunti", + "saved_the_trade_id" : "Ho salvato l'ID dello scambio", + "fetching" : "Recupero", + "id" : "ID: ", + "amount" : "Ammontare: ", + "payment_id" : "ID Pagamento: ", + "status" : "Stato: ", + "offer_expires_in" : "Offerta termina tra: ", + "trade_is_powered_by" : "Questo scambio è fornito da ${provider}", + "copy_address" : "Copia Indirizzo", + "exchange_result_confirm" : "Cliccando su Conferma, invierai ${fetchingLabel} ${from} dal tuo portafoglio chiamato ${walletName} all'indirizzo mostrato qui in basso. O puoi inviare dal tuo portafoglio esterno all'indirizzo/codice QR mostrato in basso.\n\nGentilmente clicca su Conferma per continuare o torna indietro per cambiare l'ammontare.", + "exchange_result_description" : "Devi inviare un minimo di ${fetchingLabel} ${from} all'indirizzo mostrato nella pagina seguente. Se invii un ammontare inferiore a ${fetchingLabel} ${from} la conversione potrebbe non andare a buon fine e l'indirizzo potrebbe non essere rimborsato.", + "exchange_result_write_down_ID" : "*Gentilmente fai una copia o trascrivi il tuo ID mostrato in alto.", + "confirm" : "Conferma", + "confirm_sending" : "Conferma l'invio", + "commit_transaction_amount_fee" : "Invia transazione\nAmmontare: ${amount}\nCommissione: ${fee}", + "sending" : "Invio", + "transaction_sent" : "Transazione inviata!", + "expired" : "Scaduta", + "time" : "${minutes}m ${seconds}s", + "send_xmr" : "Invia XMR", + "exchange_new_template" : "Nuovo modello", + + "faq" : "Domande Frequenti", + + + "enter_your_pin" : "Inserisci il tuo PIN", + "loading_your_wallet" : "Caricamento portafoglio", + + + "new_wallet" : "Nuovo Portafoglio", + "wallet_name" : "Nome del Portafoglio", + "continue_text" : "Continua", + "choose_wallet_currency" : "Gentilmente scegli la moneta del portafoglio:", + + + "node_new" : "Nuovo Nodo", + "node_address" : "Indirizzo Nodo", + "node_port" : "Porta Nodo", + "login" : "Accedi", + "password" : "Password", + "nodes" : "Nodi", + "node_reset_settings_title" : "Ripristina impostazioni", + "nodes_list_reset_to_default_message" : "Sei sicuro di voler ripristinare le impostazioni predefinite?", + "change_current_node" : "Sei sicuro di voler cambiare il nodo corrente con ${node}?", + "change" : "Cambia", + "remove_node" : "Rimuovi nodo", + "remove_node_message" : "Sei sicuro di voler rimuovere il nodo selezionato?", + "remove" : "Remuovi", + "delete" : "Elimina", + "add_new_node" : "Aggiungi nuovo nodo", + "change_current_node_title" : "Cambia nodo corrente", + "node_test" : "Test", + "node_connection_successful" : "Connessione avvenuta con successo", + "node_connection_failed" : "Connessione fallita", + "new_node_testing" : "Test novo nodo", + + + "use" : "Passa a ", + "digit_pin" : "-cifre PIN", + + + "share_address" : "Condividi indirizzo", + "receive_amount" : "Ammontare", + "subaddresses" : "Sottoindirizzi", + "addresses" : "Indirizzi", + "scan_qr_code" : "Scansiona il codice QR per ottenere l'indirizzo", + "rename" : "Rinomina", + "choose_account" : "Scegli account", + "create_new_account" : "Crea nuovo account", + "accounts_subaddresses" : "Accounts e sottoindirizzi", + + + "restore_restore_wallet" : "Recupera Portafoglio", + "restore_title_from_seed_keys" : "Recupera dal seme/chiavi", + "restore_description_from_seed_keys" : "Recupera il tuo portafoglio dal seme/chiavi che hai salvato in un posto sicuro", + "restore_next" : "Prossimo", + "restore_title_from_backup" : "Recupera da backup", + "restore_description_from_backup" : "Puoi recuperare l'app Cake Wallet per intero dal tuo file di backup", + "restore_seed_keys_restore" : "Recupera Seme/Chiavi", + "restore_title_from_seed" : "Recupera dal seme", + "restore_description_from_seed" : "Recupera il tuo portafoglio da una combinazione di 25 o 13 parole", + "restore_title_from_keys" : "Recupera dalle chiavi", + "restore_description_from_keys" : "Recupera il tuo portafoglio da una sequenza di caratteri generati dalle tue chiavi private", + "restore_wallet_name" : "Nome Portafoglio", + "restore_address" : "Indirizzo", + "restore_view_key_private" : "Chiave di Visualizzazione (privata)", + "restore_spend_key_private" : "Chiave di Spesa (privata)", + "restore_recover" : "Recupera", + "restore_wallet_restore_description" : "Descrizione recupero Portafoglio", + "restore_new_seed" : "Nuovo seme", + "restore_active_seed" : "Seme attivo", + "restore_bitcoin_description_from_seed" : "Recupera il tuo portafoglio da una combinazione di 12 parole", + "restore_bitcoin_description_from_keys" : "Recupera il tuo portafoglio da una stringa WIF generata dalle tue chiavi private", + "restore_bitcoin_title_from_keys" : "Recupera da WIF", + "restore_from_date_or_blockheight" : "Gentilmente inserisci la data di un paio di giorni prima che hai creato questo portafoglio. Oppure inserisci l'altezza del blocco se la conosci", + + + "seed_reminder" : "Gentilmente trascrivi le parole. Ti tornerà utie in caso perdessi o ripristinassi il tuo telefono", + "seed_title" : "Seme", + "seed_share" : "Condividi seme", + "copy" : "Copia", + + + "seed_language_choose" : "Gentilmente scegli la lingua del seme:", + "seed_choose" : "Scegli la lingua del seme", + "seed_language_next" : "Prossimo", + "seed_language_english" : "Inglese", + "seed_language_chinese" : "Cinese", + "seed_language_dutch" : "Olandese", + "seed_language_german" : "Tedesco", + "seed_language_japanese" : "Giapponese", + "seed_language_portuguese" : "Portoghese", + "seed_language_russian" : "Russo", + "seed_language_spanish" : "Spagnolo", + + + "send_title" : "Invia", + "send_your_wallet" : "Il tuo portafoglio", + "send_address" : "${cryptoCurrency} indirizzo", + "send_payment_id" : "ID Pagamento (opzionale)", + "all" : "TUTTO", + "send_error_minimum_value" : "L'ammontare minimo è 0.01", + "send_error_currency" : "L'ammontare può contenere solo numeri", + "send_estimated_fee" : "Commissione stimata:", + "send_priority" : "Attualmente la commissione è impostata a priorità ${transactionPriority} .\nLa priorità della transazione può essere modificata nelle impostazioni", + "send_creating_transaction" : "Creazione della transazione", + "send_templates" : "Modelli", + "send_new" : "Nuovo", + "send_amount" : "Ammontare:", + "send_fee" : "Commissione:", + "send_name" : "Nome", + "send_got_it" : "Ho capito", + "send_sending" : "Invio...", + "send_success" : " ${crypto} inviati con successo", + + + "settings_title" : "Impostazioni", + "settings_nodes" : "Nodi", + "settings_current_node" : "Nodo attuale", + "settings_wallets" : "Portafogli", + "settings_display_balance_as" : "Mostra saldo come", + "settings_currency" : "Moneta", + "settings_fee_priority" : "Priorità commissione", + "settings_save_recipient_address" : "Salva indirizzo di destinazione", + "settings_personal" : "Personali", + "settings_change_pin" : "Cambia PIN", + "settings_change_language" : "Cambia lingua", + "settings_allow_biometrical_authentication" : "Consenti autenticazione biometrica", + "settings_dark_mode" : "Tema scuro", + "settings_transactions" : "Transazioni", + "settings_trades" : "Scambi", + "settings_display_on_dashboard_list" : "Mostra nella lista della pagina principale", + "settings_all" : "TUTTO", + "settings_only_trades" : "Solo scambi", + "settings_only_transactions" : "Solo transazioni", + "settings_none" : "Nessuno", + "settings_support" : "Supporto", + "settings_terms_and_conditions" : "Termini e condizioni", + "pin_is_incorrect" : "Il PIN non è corretto", + + + "setup_pin" : "Imposta PIN", + "enter_your_pin_again" : "Inserisci il tuo pin di nuovo", + "setup_successful" : "Il tuo PIN è stato impostato con successo!", + + + "wallet_keys" : "Seme Portafoglio /chiavi", + "wallet_seed" : "Seme Portafoglio", + "private_key" : "Chiave privata", + "public_key" : "Chiave pubblica", + "view_key_private" : "Chiave di visualizzazione (privata)", + "view_key_public" : "Chiave di visualizzazione (pubblica)", + "spend_key_private" : "Chiave di spesa (privata)", + "spend_key_public" : "Chiave di spesa (pubblica)", + "copied_key_to_clipboard" : " ${key} copiata negli Appunti", + + + "new_subaddress_title" : "Nuovo indirizzo", + "new_subaddress_label_name" : "Nome etichetta", + "new_subaddress_create" : "Crea", + + + "subaddress_title" : "Lista sottoindirizzi", + + + "trade_details_title" : "Dettagli Scambio", + "trade_details_id" : "ID", + "trade_details_state" : "Stato", + "trade_details_fetching" : "Recupero", + "trade_details_provider" : "Fornitore", + "trade_details_created_at" : "Creato alle", + "trade_details_pair" : "Coppia", + "trade_details_copied" : "${title} copiati negli Appunti", + + + "trade_history_title" : "Storico scambi", + + + "transaction_details_title" : "Dettagli Transazione", + "transaction_details_transaction_id" : "ID Transazione", + "transaction_details_date" : "Data", + "transaction_details_height" : "Altezza", + "transaction_details_amount" : "Ammontare", + "transaction_details_fee" : "Commissione", + "transaction_details_copied" : "${title} copiati negli Appunti", + "transaction_details_recipient_address" : "Indirizzo destinatario", + + + "wallet_list_title" : "Portafoglio Monero", + "wallet_list_create_new_wallet" : "Crea Nuovo Portafoglio", + "wallet_list_restore_wallet" : "Recupera Portafoglio", + "wallet_list_load_wallet" : "Caricamento Portafoglio", + "wallet_list_loading_wallet" : "Caricamento portafoglio ${wallet_name}", + "wallet_list_failed_to_load" : "Caricamento portafoglio ${wallet_name} fallito. ${error}", + "wallet_list_removing_wallet" : "Rimozione portafoglio ${wallet_name}", + "wallet_list_failed_to_remove" : "Rimozione portafoglio ${wallet_name} fallita. ${error}", + + + "widgets_address" : "Indirizzo", + "widgets_restore_from_blockheight" : "Recupera da altezza blocco", + "widgets_restore_from_date" : "Recupera da data", + "widgets_or" : "o", + "widgets_seed" : "Seme", + + + "router_no_route" : "Nessun percorso definito per ${name}", + + + "error_text_account_name" : "Il nome dell'Account può contenere solo lettere, numeri\ne deve avere una lunghezza compresa tra 1 e 15 caratteri", + "error_text_contact_name" : "Il nome del Contatto non può contenere i simboli ` , ' \" \ne deve avere una lunghezza compresa tra 1 e 32 caratteri", + "error_text_address" : "L'indirizzo del Portafoglio deve corrispondere alla tipologia\ndi criptovaluta", + "error_text_node_address" : "Gentilmente inserisci un indirizzo iPv4", + "error_text_node_port" : "La porta del nodo può contenere solo numeri compresi tra 0 e 65535", + "error_text_payment_id" : "l'ID del pagamento può contenere solo da 16 a 64 caratteri in hex", + "error_text_xmr" : "Il valore XMR non può eccedere il saldo disponibile.\nIl numero delle cifre decimali deve essere inferiore o uguale a 12", + "error_text_fiat" : "L'ammontare non può eccedere il saldo dispoinibile.\nIl numero di cifre decimali deve essere inferiore o uguale a 2", + "error_text_subaddress_name" : "Il nome del sottoindirizzo non può contenere i simboli ` , ' \" \ne deve avere una lunghezza compresa tra 1 e 20 caratteri", + "error_text_amount" : "L'ammontare può contenere solo numeri", + "error_text_wallet_name" : "Il nome del portafoglio può contenere solo lettere, numeri\ne deve avere una lunghezza compresa tra 1 e 15 caratteri", + "error_text_keys" : "Le chiavi del portafoglio possono contenere solo 64 caratteri in hex", + "error_text_crypto_currency" : "Il numero delle cifre decimali\ndeve essere inferiore o uguale a 12", + "error_text_minimal_limit" : "Lo scambio per ${provider} non è stato creato. L'ammontare è inferiore al minimo: ${min} ${currency}", + "error_text_maximum_limit" : "Lo scambio per ${provider} non è stato creato. L'ammontare è superiore al massimo: ${max} ${currency}", + "error_text_limits_loading_failed" : "Lo scambio per ${provider} non è stato creato. Caricamento dei limiti fallito", + "error_text_template" : "Il nome del modello e l'indirizzo non possono contenere i simboli ` , ' \" \ne devono avere una lunghezza compresa tra 1 e 106 caratteri", + + + "auth_store_ban_timeout" : "ban_timeout", + "auth_store_banned_for" : "Bannato per ", + "auth_store_banned_minutes" : " minuti", + "auth_store_incorrect_password" : "PIN non corretto", + "wallet_store_monero_wallet" : "Portafoglio Monero", + "wallet_restoration_store_incorrect_seed_length" : "Lunghezza seme non corretta", + + + "full_balance" : "Saldo Completo", + "available_balance" : "Saldo Disponibile", + "hidden_balance" : "Saldo Nascosto", + + + "sync_status_syncronizing" : "SINCRONIZZAZIONE", + "sync_status_syncronized" : "SINCRONIZZATO", + "sync_status_not_connected" : "NON CONNESSO", + "sync_status_starting_sync" : "INIZIO SINC", + "sync_status_failed_connect" : "DISCONNESSO", + "sync_status_connecting" : "CONNESSIONE", + "sync_status_connected" : "CONNESSO", + + + "transaction_priority_slow" : "Bassa", + "transaction_priority_regular" : "Regolare", + "transaction_priority_medium" : "Media", + "transaction_priority_fast" : "Alta", + "transaction_priority_fastest" : "Massima", + + + "trade_for_not_created" : "Lo scambio per ${title} non è stato creato.", + "trade_not_created" : "Scambio non creato.", + "trade_id_not_found" : "Scambio ${tradeId} di ${title} not trovato.", + "trade_not_found" : "Scambio non trovato.", + + + "trade_state_pending" : "In corso", + "trade_state_confirming" : "Conferma", + "trade_state_trading" : "Scambio", + "trade_state_traded" : "Scambiato", + "trade_state_complete" : "Completato", + "trade_state_to_be_created" : "Da creare", + "trade_state_unpaid" : "Non pagato", + "trade_state_underpaid" : "Sottopagato", + "trade_state_paid_unconfirmed" : "Pagato non confermato", + "trade_state_paid" : "Pagato", + "trade_state_btc_sent" : "Btc inviati", + "trade_state_timeout" : "Timeout", + "trade_state_created" : "Creato", + "trade_state_finished" : "Finito", + + "change_language" : "Cambia lingua", + "change_language_to" : "Cambia lingua in ${language}?", + + "paste" : "Incolla", + "restore_from_seed_placeholder" : "Gentilmente inserisci o incolla il tuo seme qui", + "add_new_word" : "Aggiungi nuova parola", + "incorrect_seed" : "Il testo inserito non è valido.", + + "biometric_auth_reason" : "Scansiona la tua impronta per autenticarti", + "version" : "Versione ${currentVersion}", + + "openalias_alert_title" : "XMR Destinatario Rilevato", + "openalias_alert_content" : "Invierai i tuoi fondi a\n${recipient_name}", + + "card_address" : "Indirizzo:", + "buy" : "Compra", + + "placeholder_transactions" : "Le tue transazioni saranno mostrate qui", + "placeholder_contacts" : "I tuoi contatti saranno mostrati qui", + + "template" : "Modello", + "confirm_delete_template" : "Questa azione cancellerà questo modello. Desideri continuare?", + "confirm_delete_wallet" : "Questa azione cancellerà questo portafoglio. Desideri continuare?", + + "picker_description" : "Per scegliere ChangeNOW o MorphToken, gentilmente cambia prima la tua coppia di valute", + + "change_wallet_alert_title" : "Cambia portafoglio attuale", + "change_wallet_alert_content" : "Sei sicuro di voler cambiare il portafoglio attuale con ${wallet_name}?", + + "creating_new_wallet" : "Creazione nuovo portafoglio", + "creating_new_wallet_error" : "Errore: ${description}", + + "seed_alert_title" : "Attenzione", + "seed_alert_content" : "Il seme è l'unico modo per recuperare il tuo portafoglio. L'hai trascritto?", + "seed_alert_back" : "Torna indietro", + "seed_alert_yes" : "Sì, l'ho fatto", + + "exchange_sync_alert_content" : "Gentilmente aspetta che il tuo portafoglio sia sincronizzato", + + "pre_seed_title" : "IMPORTANTE", + "pre_seed_description" : "Nella pagina seguente ti sarà mostrata una serie di parole ${words}. Questo è il tuo seme unico e privato ed è l'UNICO modo per recuperare il tuo portafoglio in caso di perdita o malfunzionamento. E' TUA responsabilità trascriverlo e conservarlo in un posto sicuro fuori dall'app Cake Wallet.", + "pre_seed_button_text" : "Ho capito. Mostrami il seme", + + "xmr_to_error" : "XMR.TO errore", + "xmr_to_error_description" : "Ammontare invalido. Il limite massimo è 8 cifre dopo il punto decimale", + + "provider_error" : "${provider} errore", + + "use_ssl" : "Usa SSL", + + "color_theme" : "Colore tema", + "light_theme" : "Bianco", + "bright_theme" : "Colorato", + "dark_theme" : "Scuro", + "enter_your_note" : "Inserisci la tua nota…", + "note_optional" : "Nota (opzionale)", + "note_tap_to_change" : "Nota (clicca per cambiare)", + "transaction_key" : "Chiave Transazione", + "confirmations" : "Conferme", + "recipient_address" : "Indirizzo di destinazione", + + "extra_id" : "Extra ID:", + "destination_tag" : "Tag destinazione:", + "memo" : "Memo:", + + "backup" : "Backup", + "change_password" : "Cambia password", + "backup_password" : "Backup password", + "write_down_backup_password" : "Gentilmente trascrivi la password del backup, che è usata per importare i tuoi file di backup.", + "export_backup" : "Esporta backup", + "save_backup_password" : "Gentilmente assicurati di aver salvato la password del tuo backup. Senza questa non sarai in grado di importare i tuoi file di backup.", + "backup_file" : "Backup file", + + "edit_backup_password" : "Modifica Password Backup", + "save_backup_password_alert" : "Salva password Backup", + "change_backup_password_alert" : "I precedenti file di backup non potranno essere importati con la nuova password di backup. La nuova password di backup verrà usata soltanto per i nuovi file di backup. Sei sicuro di voler cambiare la tua password di backup?", + + "enter_backup_password" : "Inserisci la password di backup qui", + "select_backup_file" : "Seleziona file di backup", + "import" : "Importa", + "please_select_backup_file" : "Gentilmente seleziona il file di backup e inserisci la password di backup.", + + "fixed_rate" : "Tasso fisso", + "fixed_rate_alert" : "Potrai inserire l'ammontare da ricevere quando il tasso è fisso. Vuoi cambiare alla modalità tasso fisso?", + + "xlm_extra_info" : "Gentilmente ricorda di indicare il Memo ID quando invii la transazione XLM per lo scambio", + "xrp_extra_info" : "Gentilmente ricorda di indicare il Tag di Destinazione quando invii una transazione XRP per lo scambio", + + "exchange_incorrect_current_wallet_for_xmr" : "Se vuoi scambiare XMR dal tuo saldo Cake Wallet Monero, gentilmente passa al tuo portafoglio Monero.", + "confirmed" : "Confermato", + "unconfirmed" : "Non confermato", + "displayable" : "Visualizzabile", + + "submit_request" : "invia una richiesta" +} \ No newline at end of file diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index 291d5afd3..0ac0d33cc 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "ウォレットの復元", "restore_new_seed" : "新しい種", "restore_active_seed" : "アクティブシード", - "restore_bitcoin_description_from_seed" : "12ワードの組み合わせコードからウォレットを復元する", + "restore_bitcoin_description_from_seed" : "24ワードの組み合わせコードからウォレットを復元する", "restore_bitcoin_description_from_keys" : "秘密鍵から生成されたWIF文字列からウォレットを復元します", "restore_bitcoin_title_from_keys" : "WIFから復元", "restore_from_date_or_blockheight" : "このウォレットを作成する数日前に日付を入力してください。 または、ブロックの高さがわかっている場合は、代わりに入力してください", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 781df8d8a..64dcdee49 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "월렛 복원 설명", "restore_new_seed" : "새로운 씨앗", "restore_active_seed" : "활성 종자", - "restore_bitcoin_description_from_seed" : "12 단어 조합 코드에서 지갑 복원", + "restore_bitcoin_description_from_seed" : "24 단어 조합 코드에서 지갑 복원", "restore_bitcoin_description_from_keys" : "개인 키에서 생성 된 WIF 문자열에서 지갑 복원", "restore_bitcoin_title_from_keys" : "WIF에서 복원", "restore_from_date_or_blockheight" : "이 지갑을 생성하기 며칠 전에 날짜를 입력하십시오. 또는 블록 높이를 알고있는 경우 대신 입력하십시오.", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 9a6183efb..abcef001a 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Portemonnee-herstelbeschrijving", "restore_new_seed" : "Nieuw zaad", "restore_active_seed" : "Actief zaad", - "restore_bitcoin_description_from_seed" : "Herstel uw portemonnee met een combinatiecode van 12 woorden", + "restore_bitcoin_description_from_seed" : "Herstel uw portemonnee met een combinatiecode van 24 woorden", "restore_bitcoin_description_from_keys" : "Herstel uw portemonnee van de gegenereerde WIF-string van uw privésleutels", "restore_bitcoin_title_from_keys" : "Herstel van WIF", "restore_from_date_or_blockheight" : "Voer een datum in een paar dagen voordat u deze portemonnee heeft gemaakt. Of als u de blokhoogte kent, voert u deze in", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index 6db66958e..ab83b9760 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Opis przywracania portfela", "restore_new_seed" : "Nowe nasienie", "restore_active_seed" : "Aktywne nasiona", - "restore_bitcoin_description_from_seed" : "Przywróć swój portfel z kodu złożonego z 12 słów", + "restore_bitcoin_description_from_seed" : "Przywróć swój portfel z kodu złożonego z 24 słów", "restore_bitcoin_description_from_keys" : "Przywróć swój portfel z wygenerowanego ciągu WIF z kluczy prywatnych", "restore_bitcoin_title_from_keys" : "Przywróć z WIF", "restore_from_date_or_blockheight" : "Wprowadź datę na kilka dni przed utworzeniem tego portfela. Lub jeśli znasz wysokość bloku, wprowadź go zamiast tego", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index 631be8f42..baaf4642c 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Restauração da carteira", "restore_new_seed" : "Nova semente", "restore_active_seed" : "Semente ativa", - "restore_bitcoin_description_from_seed" : "Restaure sua carteira a partir de um código de combinação de 12 palavras", + "restore_bitcoin_description_from_seed" : "Restaure sua carteira a partir de um código de combinação de 24 palavras", "restore_bitcoin_description_from_keys" : "Restaure sua carteira a partir da string WIF gerada de suas chaves privadas", "restore_bitcoin_title_from_keys" : "Restaurar de WIF", "restore_from_date_or_blockheight" : "Insira uma data alguns dias antes de criar esta carteira. Ou se você souber a altura do bloco, insira-o", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 333a823d8..f23c8010a 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Описание восстановления кошелька", "restore_new_seed" : "Новая мнемоническая фраза", "restore_active_seed" : "Активная мнемоническая фраза", - "restore_bitcoin_description_from_seed" : "Вы можете восстановить кошелёк используя 12-ти значную мнемоническую фразу", + "restore_bitcoin_description_from_seed" : "Вы можете восстановить кошелёк используя 24-ти значную мнемоническую фразу", "restore_bitcoin_description_from_keys" : "Вы можете восстановить кошелёк с помощью WIF", "restore_bitcoin_title_from_keys" : "Восстановить с помощью WIF", "restore_from_date_or_blockheight" : "Пожалуйста, введите дату за несколько дней до создания этого кошелька. Или, если вы знаете высоту блока, введите ее значение", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index cc10a2d89..c699574d1 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "Опис відновлюваного гаманця", "restore_new_seed" : "Нова мнемонічна фраза", "restore_active_seed" : "Активна мнемонічна фраза", - "restore_bitcoin_description_from_seed" : "Ви можете відновити гаманець використовуючи 12-ти слівну мнемонічну фразу", + "restore_bitcoin_description_from_seed" : "Ви можете відновити гаманець використовуючи 24-ти слівну мнемонічну фразу", "restore_bitcoin_description_from_keys" : "Ви можете відновити гаманець за допомогою WIF", "restore_bitcoin_title_from_keys" : "Відновити за допомогою WIF", "restore_from_date_or_blockheight" : "Будь ласка, введіть дату за кілька днів до створення цього гаманця. Або, якщо ви знаєте висоту блоку, введіть її значення", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 639babcbc..81e177464 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -170,7 +170,7 @@ "restore_wallet_restore_description" : "钱包还原说明", "restore_new_seed" : "新種子", "restore_active_seed" : "活性種子", - "restore_bitcoin_description_from_seed" : "從12個單詞的組合碼恢復您的錢包", + "restore_bitcoin_description_from_seed" : "從24個單詞的組合碼恢復您的錢包", "restore_bitcoin_description_from_keys" : "從私鑰中生成的WIF字符串還原您的錢包", "restore_bitcoin_title_from_keys" : "從WIF還原", "restore_from_date_or_blockheight" : "請在創建此錢包之前幾天輸入一個日期。 或者,如果您知道塊高,請改為輸入",