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" : "請在創建此錢包之前幾天輸入一個日期。 或者,如果您知道塊高,請改為輸入",