Merge branch 'main' into CAKE-320-add-Croatian-language

This commit is contained in:
M 2021-05-10 19:26:52 +03:00
commit c3859d3d47
42 changed files with 631 additions and 78 deletions

View file

@ -1,15 +1,49 @@
package com.cakewallet.cake_wallet; package com.cakewallet.cake_wallet;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterFragmentActivity; import io.flutter.embedding.android.FlutterFragmentActivity;
import io.flutter.embedding.engine.FlutterEngine; import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant; 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 { public class MainActivity extends FlutterFragmentActivity {
final String UTILS_CHANNEL = "com.cake_wallet/native_utils";
@Override @Override
public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) { public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
GeneratedPluginRegistrant.registerWith(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));
}
} }
} }

View file

@ -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);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@android:color/white" />
<foreground android:drawable="@drawable/ic_launcher" />
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -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
}

View file

@ -8,6 +8,7 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C44A7192518EF8000B570ED /* decrypt.swift */; }; 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 */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */; }; 20ED0868E1BD7E12278C0CB3 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B26E3F56D69167FBB1DC160A /* Pods_Runner.framework */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 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 = "<group>"; }; 0C400E0F25B21ABB0025E469 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = "<group>"; };
0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = "<group>"; }; 0C44A7192518EF8000B570ED /* decrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = decrypt.swift; sourceTree = "<group>"; };
0C9986A3251A932F00D566FD /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 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 = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
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 = "<group>"; }; 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 = "<group>"; };
@ -65,6 +67,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
0C44A7192518EF8000B570ED /* decrypt.swift */, 0C44A7192518EF8000B570ED /* decrypt.swift */,
0C9D68C8264854B60011B691 /* secRandom.swift */,
); );
path = CakeWallet; path = CakeWallet;
sourceTree = "<group>"; sourceTree = "<group>";
@ -274,6 +277,7 @@
files = ( files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
0C9D68C9264854B60011B691 /* secRandom.swift in Sources */,
0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */, 0C44A71A2518EF8000B570ED /* decrypt.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -358,7 +362,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 35; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -375,7 +379,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.1.6; MARKETING_VERSION = 4.1.7;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -501,7 +505,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 35; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -518,7 +522,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.1.6; MARKETING_VERSION = 4.1.7;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
@ -536,7 +540,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
CURRENT_PROJECT_VERSION = 35; CURRENT_PROJECT_VERSION = 37;
DEVELOPMENT_TEAM = 32J6BB6VUS; DEVELOPMENT_TEAM = 32J6BB6VUS;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = ( FRAMEWORK_SEARCH_PATHS = (
@ -553,7 +557,7 @@
"$(inherited)", "$(inherited)",
"$(PROJECT_DIR)/Flutter", "$(PROJECT_DIR)/Flutter",
); );
MARKETING_VERSION = 4.1.6; MARKETING_VERSION = 4.1.7;
PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet; PRODUCT_BUNDLE_IDENTIFIER = com.fotolockr.cakewallet;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";

View file

@ -8,9 +8,10 @@ import Flutter
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
let batteryChannel = FlutterMethodChannel(name: "com.cakewallet.cakewallet/legacy_wallet_migration", let legacyMigrationChannel = FlutterMethodChannel(
binaryMessenger: controller.binaryMessenger) name: "com.cakewallet.cakewallet/legacy_wallet_migration",
batteryChannel.setMethodCallHandler({ binaryMessenger: controller.binaryMessenger)
legacyMigrationChannel.setMethodCallHandler({
(call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
switch call.method { 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<String, Any>,
let count = args["count"] as? Int else {
result(nil)
return
}
result(secRandom(count: count))
default:
result(FlutterMethodNotImplemented)
}
})
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }

View file

@ -4,23 +4,11 @@ import 'dart:typed_data';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:unorm_dart/unorm_dart.dart' as unorm; import 'package:unorm_dart/unorm_dart.dart' as unorm;
import 'package:cryptography/cryptography.dart' as cryptography; import 'package:cryptography/cryptography.dart' as cryptography;
import 'package:cake_wallet/core/sec_random_native.dart';
const segwit = '100'; const segwit = '100';
final wordlist = englishWordlist; 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); double logBase(num x, num base) => log(x) / log(base);
String mnemonicEncode(int i) { String mnemonicEncode(int i) {
@ -102,14 +90,15 @@ List<bool> prefixMatches(String source, List<String> prefixes) {
return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList(); return prefixes.map((prefix) => hx.startsWith(prefix.toLowerCase())).toList();
} }
String generateMnemonic({int strength = 132, String prefix = segwit}) { Future<String> generateMnemonic(
{int strength = 264, String prefix = segwit}) async {
final wordBitlen = logBase(wordlist.length, 2).ceil(); final wordBitlen = logBase(wordlist.length, 2).ceil();
final wordCount = strength / wordBitlen; final wordCount = strength / wordBitlen;
final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil(); final byteCount = ((wordCount * wordBitlen).ceil() / 8).ceil();
var result = ''; var result = '';
do { do {
final bytes = randomBytes(byteCount); final bytes = await secRandom(byteCount);
maskBytes(bytes, strength); maskBytes(bytes, strength);
result = encode(bytes); result = encode(bytes);
} while (!prefixMatches(result, [prefix]).first); } while (!prefixMatches(result, [prefix]).first);
@ -134,7 +123,7 @@ bool matchesAnyPrefix(String mnemonic) =>
bool validateMnemonic(String mnemonic, {String prefix = segwit}) { bool validateMnemonic(String mnemonic, {String prefix = segwit}) {
try { try {
return matchesAnyPrefix(mnemonic); return matchesAnyPrefix(mnemonic);
} catch(e) { } catch (e) {
return false; return false;
} }
} }

View file

@ -1,5 +1,5 @@
class BitcoinMnemonicIsIncorrectException implements Exception { class BitcoinMnemonicIsIncorrectException implements Exception {
@override @override
String toString() => 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.';
} }

View file

@ -25,7 +25,7 @@ class BitcoinWalletService extends WalletService<
type: WalletType.bitcoin, name: credentials.name); type: WalletType.bitcoin, name: credentials.name);
final wallet = BitcoinWalletBase.build( final wallet = BitcoinWalletBase.build(
dirPath: dirPath, dirPath: dirPath,
mnemonic: generateMnemonic(), mnemonic: await generateMnemonic(),
password: credentials.password, password: credentials.password,
name: credentials.name, name: credentials.name,
walletInfo: credentials.walletInfo); walletInfo: credentials.walletInfo);
@ -47,7 +47,7 @@ class BitcoinWalletService extends WalletService<
final walletPath = '$walletDirPath/$name'; final walletPath = '$walletDirPath/$name';
final walletJSONRaw = await read(path: walletPath, password: password); final walletJSONRaw = await read(path: walletPath, password: password);
final walletInfo = walletInfoSource.values.firstWhere( final walletInfo = walletInfoSource.values.firstWhere(
(info) => info.id == WalletBase.idFor(name, WalletType.bitcoin), (info) => info.id == WalletBase.idFor(name, WalletType.bitcoin),
orElse: () => null); orElse: () => null);
final wallet = BitcoinWalletBase.fromJSON( final wallet = BitcoinWalletBase.fromJSON(
password: password, password: password,

View file

@ -0,0 +1,13 @@
import 'dart:typed_data';
import 'package:flutter/services.dart';
const utils = const MethodChannel('com.cake_wallet/native_utils');
Future<Uint8List> secRandom(int count) async {
try {
return await utils.invokeMethod<Uint8List>('sec_random', {'count': count});
} on PlatformException catch (_) {
return Uint8List.fromList([]);
}
}

View file

@ -19,7 +19,6 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> {
CryptoCurrency.eos, CryptoCurrency.eos,
CryptoCurrency.eth, CryptoCurrency.eth,
CryptoCurrency.ltc, CryptoCurrency.ltc,
CryptoCurrency.nano,
CryptoCurrency.trx, CryptoCurrency.trx,
CryptoCurrency.usdt, CryptoCurrency.usdt,
CryptoCurrency.usdterc20, CryptoCurrency.usdterc20,
@ -29,7 +28,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> {
static const xmr = CryptoCurrency(title: 'XMR', raw: 0); static const xmr = CryptoCurrency(title: 'XMR', raw: 0);
static const ada = CryptoCurrency(title: 'ADA', raw: 1); static const ada = CryptoCurrency(title: 'ADA', raw: 1);
static const bch = CryptoCurrency(title: 'BCH', raw: 2); 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 btc = CryptoCurrency(title: 'BTC', raw: 4);
static const dai = CryptoCurrency(title: 'DAI', raw: 5); static const dai = CryptoCurrency(title: 'DAI', raw: 5);
static const dash = CryptoCurrency(title: 'DASH', raw: 6); static const dash = CryptoCurrency(title: 'DASH', raw: 6);
@ -90,7 +89,7 @@ class CryptoCurrency extends EnumerableItem<int> with Serializable<int> {
return CryptoCurrency.ada; return CryptoCurrency.ada;
case 'bch': case 'bch':
return CryptoCurrency.bch; return CryptoCurrency.bch;
case 'bnb': case 'bnbmainnet':
return CryptoCurrency.bnb; return CryptoCurrency.bnb;
case 'btc': case 'btc':
return CryptoCurrency.btc; return CryptoCurrency.btc;

View file

@ -16,7 +16,8 @@ class LanguageService {
'ru': 'Русский (Russian)', 'ru': 'Русский (Russian)',
'uk': 'Українська (Ukrainian)', 'uk': 'Українська (Ukrainian)',
'zh': '中文 (Chinese)', 'zh': '中文 (Chinese)',
'hr': 'Hrvatski (Croatian)' 'hr': 'Hrvatski (Croatian)',
'it': 'Italiano (Italian)'
}; };
static final list = <String, String> {}; static final list = <String, String> {};

View file

@ -48,7 +48,9 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
@override @override
Future<Limits> fetchLimits({CryptoCurrency from, CryptoCurrency to, Future<Limits> fetchLimits({CryptoCurrency from, CryptoCurrency to,
bool isFixedRateMode}) async { bool isFixedRateMode}) async {
final symbol = from.toString() + '_' + to.toString(); final fromTitle = defineCurrencyTitle(from);
final toTitle = defineCurrencyTitle(to);
final symbol = fromTitle + '_' + toTitle;
final url = isFixedRateMode final url = isFixedRateMode
? apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey ? apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey
: apiUri + _minAmountUriSufix + symbol; : apiUri + _minAmountUriSufix + symbol;
@ -61,8 +63,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
final elemFrom = elem["from"] as String; final elemFrom = elem["from"] as String;
final elemTo = elem["to"] as String; final elemTo = elem["to"] as String;
if ((elemFrom == from.toString().toLowerCase()) && if ((elemFrom == fromTitle) && (elemTo == toTitle)) {
(elemTo == to.toString().toLowerCase())) {
final min = elem["min"] as double; final min = elem["min"] as double;
final max = elem["max"] as double; final max = elem["max"] as double;
@ -84,9 +85,11 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
? apiUri + _transactionsUriSufix + _fixedRateUriSufix + apiKey ? apiUri + _transactionsUriSufix + _fixedRateUriSufix + apiKey
: apiUri + _transactionsUriSufix + apiKey; : apiUri + _transactionsUriSufix + apiKey;
final _request = request as ChangeNowRequest; final _request = request as ChangeNowRequest;
final fromTitle = defineCurrencyTitle(_request.from);
final toTitle = defineCurrencyTitle(_request.to);
final body = { final body = {
'from': _request.from.toString(), 'from': fromTitle,
'to': _request.to.toString(), 'to': toTitle,
'address': _request.address, 'address': _request.address,
'amount': _request.amount, 'amount': _request.amount,
'refundAddress': _request.refundAddress 'refundAddress': _request.refundAddress
@ -182,6 +185,8 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
final url = apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey; final url = apiUri + _marketInfoUriSufix + _fixedRateUriSufix + apiKey;
final response = await get(url); final response = await get(url);
final responseJSON = json.decode(response.body) as List<dynamic>; final responseJSON = json.decode(response.body) as List<dynamic>;
final fromTitle = defineCurrencyTitle(from);
final toTitle = defineCurrencyTitle(to);
var rate = 0.0; var rate = 0.0;
var fee = 0.0; var fee = 0.0;
@ -189,8 +194,7 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
final elemFrom = elem["from"] as String; final elemFrom = elem["from"] as String;
final elemTo = elem["to"] as String; final elemTo = elem["to"] as String;
if ((elemFrom == to.toString().toLowerCase()) && if ((elemFrom == toTitle) && (elemTo == fromTitle)) {
(elemTo == from.toString().toLowerCase())) {
rate = elem["rate"] as double; rate = elem["rate"] as double;
fee = elem["minerFee"] as double; fee = elem["minerFee"] as double;
break; break;
@ -216,22 +220,32 @@ class ChangeNowExchangeProvider extends ExchangeProvider {
CryptoCurrency to, CryptoCurrency to,
double amount, double amount,
bool isFixedRateMode) { bool isFixedRateMode) {
final fromTitle = defineCurrencyTitle(from);
final toTitle = defineCurrencyTitle(to);
return isFixedRateMode return isFixedRateMode
? apiUri + ? apiUri +
_exchangeAmountUriSufix + _exchangeAmountUriSufix +
_fixedRateUriSufix + _fixedRateUriSufix +
amount.toString() + amount.toString() +
'/' + '/' +
from.toString() + fromTitle +
'_' + '_' +
to.toString() + toTitle +
'?api_key=' + apiKey '?api_key=' + apiKey
: apiUri + : apiUri +
_exchangeAmountUriSufix + _exchangeAmountUriSufix +
amount.toString() + 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;
} }
} }

View file

@ -228,7 +228,7 @@ class MoneroWalletService extends WalletService<
final name = f.path.split('/').last; final name = f.path.split('/').last;
final newPath = newWalletDirPath + '/$name'; final newPath = newWalletDirPath + '/$name';
final newFile = File(newPath); final newFile = File(newPath);
print(file.path);
if (!newFile.existsSync()) { if (!newFile.existsSync()) {
newFile.createSync(); newFile.createSync();
} }

View file

@ -237,9 +237,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.unlock: case Routes.unlock:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
fullscreenDialog: true, fullscreenDialog: true,
builder: (_) => getIt.get<AuthPage>( builder: (_) => WillPopScope(
param1: settings.arguments as OnAuthenticationFinished, child: getIt.get<AuthPage>(
param2: false)); param1: settings.arguments as OnAuthenticationFinished,
param2: false),
onWillPop: () async => false));
case Routes.nodeList: case Routes.nodeList:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(

View file

@ -13,7 +13,7 @@ class PreSeedPage extends BasePage {
imageDark = Image.asset('assets/images/pre_seed_dark.png'), imageDark = Image.asset('assets/images/pre_seed_dark.png'),
wordsCount = type == WalletType.monero wordsCount = type == WalletType.monero
? 25 ? 25
: 12; // FIXME: Stupid fast implementation : 24; // FIXME: Stupid fast implementation
final Image imageDark; final Image imageDark;
final Image imageLight; final Image imageLight;
@ -49,7 +49,9 @@ class PreSeedPage extends BasePage {
Padding( Padding(
padding: EdgeInsets.only(top: 70, left: 16, right: 16), padding: EdgeInsets.only(top: 70, left: 16, right: 16),
child: Text( child: Text(
S.of(context).pre_seed_description(wordsCount.toString()), S
.of(context)
.pre_seed_description(wordsCount.toString()),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: 14, fontSize: 14,

View file

@ -110,8 +110,6 @@ abstract class AuthViewModelBase with Store {
if (isAuthenticated) { if (isAuthenticated) {
state = ExecutedSuccessfullyState(); state = ExecutedSuccessfullyState();
} else {
state = FailureState('Failure biometric authentication');
} }
} }
} catch(e) { } catch(e) {

View file

@ -59,7 +59,8 @@ abstract class ExchangeViewModelBase with Store {
}); });
receiveCurrencies = CryptoCurrency.all.where((cryptoCurrency) => receiveCurrencies = CryptoCurrency.all.where((cryptoCurrency) =>
(cryptoCurrency != CryptoCurrency.xlm)&& (cryptoCurrency != CryptoCurrency.xlm)&&
(cryptoCurrency != CryptoCurrency.xrp)).toList(); (cryptoCurrency != CryptoCurrency.xrp)&&
(cryptoCurrency != CryptoCurrency.bnb)).toList();
_defineIsReceiveAmountEditable(); _defineIsReceiveAmountEditable();
isFixedRateMode = false; isFixedRateMode = false;
isReceiveAmountEntered = false; isReceiveAmountEntered = false;

View file

@ -11,7 +11,7 @@ description: Cake Wallet.
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at # Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 4.1.6+45 version: 4.1.7+46
environment: environment:
sdk: ">=2.7.0 <3.0.0" sdk: ">=2.7.0 <3.0.0"

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Beschreibung zur Wiederherstellung der Brieftasche", "restore_wallet_restore_description" : "Beschreibung zur Wiederherstellung der Brieftasche",
"restore_new_seed" : "Neuer Seed", "restore_new_seed" : "Neuer Seed",
"restore_active_seed" : "Aktives 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_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_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", "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",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Wallet restore description", "restore_wallet_restore_description" : "Wallet restore description",
"restore_new_seed" : "New seed", "restore_new_seed" : "New seed",
"restore_active_seed" : "Active 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_description_from_keys" : "Restore your wallet from generated WIF string from your private keys",
"restore_bitcoin_title_from_keys" : "Restore from WIF", "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", "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",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Restaurar billetera", "restore_wallet_restore_description" : "Restaurar billetera",
"restore_new_seed" : "Nueva semilla", "restore_new_seed" : "Nueva semilla",
"restore_active_seed" : "Semilla activa", "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_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_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", "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",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "बटुआ विवरण पुनर्स्थापित करें", "restore_wallet_restore_description" : "बटुआ विवरण पुनर्स्थापित करें",
"restore_new_seed" : "नया बीज", "restore_new_seed" : "नया बीज",
"restore_active_seed" : "सक्रिय बीज", "restore_active_seed" : "सक्रिय बीज",
"restore_bitcoin_description_from_seed" : "12 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें", "restore_bitcoin_description_from_seed" : "24 शब्द संयोजन कोड से अपने वॉलेट को पुनर्स्थापित करें",
"restore_bitcoin_description_from_keys" : "अपने निजी कुंजी से उत्पन्न WIF स्ट्रिंग से अपने वॉलेट को पुनर्स्थापित करें", "restore_bitcoin_description_from_keys" : "अपने निजी कुंजी से उत्पन्न WIF स्ट्रिंग से अपने वॉलेट को पुनर्स्थापित करें",
"restore_bitcoin_title_from_keys" : "WIF से पुनर्स्थापित करें", "restore_bitcoin_title_from_keys" : "WIF से पुनर्स्थापित करें",
"restore_from_date_or_blockheight" : "कृपया इस वॉलेट को बनाने से कुछ दिन पहले एक तारीख दर्ज करें। या यदि आप ब्लॉकचेट जानते हैं, तो कृपया इसके बजाय इसे दर्ज करें", "restore_from_date_or_blockheight" : "कृपया इस वॉलेट को बनाने से कुछ दिन पहले एक तारीख दर्ज करें। या यदि आप ब्लॉकचेट जानते हैं, तो कृपया इसके बजाय इसे दर्ज करें",

473
res/values/strings_it.arb Normal file
View file

@ -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"
}

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "ウォレットの復元", "restore_wallet_restore_description" : "ウォレットの復元",
"restore_new_seed" : "新しい種", "restore_new_seed" : "新しい種",
"restore_active_seed" : "アクティブシード", "restore_active_seed" : "アクティブシード",
"restore_bitcoin_description_from_seed" : "12ワードの組み合わせコードからウォレットを復元する", "restore_bitcoin_description_from_seed" : "24ワードの組み合わせコードからウォレットを復元する",
"restore_bitcoin_description_from_keys" : "秘密鍵から生成されたWIF文字列からウォレットを復元します", "restore_bitcoin_description_from_keys" : "秘密鍵から生成されたWIF文字列からウォレットを復元します",
"restore_bitcoin_title_from_keys" : "WIFから復元", "restore_bitcoin_title_from_keys" : "WIFから復元",
"restore_from_date_or_blockheight" : "このウォレットを作成する数日前に日付を入力してください。 または、ブロックの高さがわかっている場合は、代わりに入力してください", "restore_from_date_or_blockheight" : "このウォレットを作成する数日前に日付を入力してください。 または、ブロックの高さがわかっている場合は、代わりに入力してください",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "월렛 복원 설명", "restore_wallet_restore_description" : "월렛 복원 설명",
"restore_new_seed" : "새로운 씨앗", "restore_new_seed" : "새로운 씨앗",
"restore_active_seed" : "활성 종자", "restore_active_seed" : "활성 종자",
"restore_bitcoin_description_from_seed" : "12 단어 조합 코드에서 지갑 복원", "restore_bitcoin_description_from_seed" : "24 단어 조합 코드에서 지갑 복원",
"restore_bitcoin_description_from_keys" : "개인 키에서 생성 된 WIF 문자열에서 지갑 복원", "restore_bitcoin_description_from_keys" : "개인 키에서 생성 된 WIF 문자열에서 지갑 복원",
"restore_bitcoin_title_from_keys" : "WIF에서 복원", "restore_bitcoin_title_from_keys" : "WIF에서 복원",
"restore_from_date_or_blockheight" : "이 지갑을 생성하기 며칠 전에 날짜를 입력하십시오. 또는 블록 높이를 알고있는 경우 대신 입력하십시오.", "restore_from_date_or_blockheight" : "이 지갑을 생성하기 며칠 전에 날짜를 입력하십시오. 또는 블록 높이를 알고있는 경우 대신 입력하십시오.",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Portemonnee-herstelbeschrijving", "restore_wallet_restore_description" : "Portemonnee-herstelbeschrijving",
"restore_new_seed" : "Nieuw zaad", "restore_new_seed" : "Nieuw zaad",
"restore_active_seed" : "Actief 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_description_from_keys" : "Herstel uw portemonnee van de gegenereerde WIF-string van uw privésleutels",
"restore_bitcoin_title_from_keys" : "Herstel van WIF", "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", "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",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Opis przywracania portfela", "restore_wallet_restore_description" : "Opis przywracania portfela",
"restore_new_seed" : "Nowe nasienie", "restore_new_seed" : "Nowe nasienie",
"restore_active_seed" : "Aktywne nasiona", "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_description_from_keys" : "Przywróć swój portfel z wygenerowanego ciągu WIF z kluczy prywatnych",
"restore_bitcoin_title_from_keys" : "Przywróć z WIF", "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", "restore_from_date_or_blockheight" : "Wprowadź datę na kilka dni przed utworzeniem tego portfela. Lub jeśli znasz wysokość bloku, wprowadź go zamiast tego",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Restauração da carteira", "restore_wallet_restore_description" : "Restauração da carteira",
"restore_new_seed" : "Nova semente", "restore_new_seed" : "Nova semente",
"restore_active_seed" : "Semente ativa", "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_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_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", "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",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Описание восстановления кошелька", "restore_wallet_restore_description" : "Описание восстановления кошелька",
"restore_new_seed" : "Новая мнемоническая фраза", "restore_new_seed" : "Новая мнемоническая фраза",
"restore_active_seed" : "Активная мнемоническая фраза", "restore_active_seed" : "Активная мнемоническая фраза",
"restore_bitcoin_description_from_seed" : "Вы можете восстановить кошелёк используя 12-ти значную мнемоническую фразу", "restore_bitcoin_description_from_seed" : "Вы можете восстановить кошелёк используя 24-ти значную мнемоническую фразу",
"restore_bitcoin_description_from_keys" : "Вы можете восстановить кошелёк с помощью WIF", "restore_bitcoin_description_from_keys" : "Вы можете восстановить кошелёк с помощью WIF",
"restore_bitcoin_title_from_keys" : "Восстановить с помощью WIF", "restore_bitcoin_title_from_keys" : "Восстановить с помощью WIF",
"restore_from_date_or_blockheight" : "Пожалуйста, введите дату за несколько дней до создания этого кошелька. Или, если вы знаете высоту блока, введите ее значение", "restore_from_date_or_blockheight" : "Пожалуйста, введите дату за несколько дней до создания этого кошелька. Или, если вы знаете высоту блока, введите ее значение",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "Опис відновлюваного гаманця", "restore_wallet_restore_description" : "Опис відновлюваного гаманця",
"restore_new_seed" : "Нова мнемонічна фраза", "restore_new_seed" : "Нова мнемонічна фраза",
"restore_active_seed" : "Активна мнемонічна фраза", "restore_active_seed" : "Активна мнемонічна фраза",
"restore_bitcoin_description_from_seed" : "Ви можете відновити гаманець використовуючи 12-ти слівну мнемонічну фразу", "restore_bitcoin_description_from_seed" : "Ви можете відновити гаманець використовуючи 24-ти слівну мнемонічну фразу",
"restore_bitcoin_description_from_keys" : "Ви можете відновити гаманець за допомогою WIF", "restore_bitcoin_description_from_keys" : "Ви можете відновити гаманець за допомогою WIF",
"restore_bitcoin_title_from_keys" : "Відновити за допомогою WIF", "restore_bitcoin_title_from_keys" : "Відновити за допомогою WIF",
"restore_from_date_or_blockheight" : "Будь ласка, введіть дату за кілька днів до створення цього гаманця. Або, якщо ви знаєте висоту блоку, введіть її значення", "restore_from_date_or_blockheight" : "Будь ласка, введіть дату за кілька днів до створення цього гаманця. Або, якщо ви знаєте висоту блоку, введіть її значення",

View file

@ -170,7 +170,7 @@
"restore_wallet_restore_description" : "钱包还原说明", "restore_wallet_restore_description" : "钱包还原说明",
"restore_new_seed" : "新種子", "restore_new_seed" : "新種子",
"restore_active_seed" : "活性種子", "restore_active_seed" : "活性種子",
"restore_bitcoin_description_from_seed" : "從12個單詞的組合碼恢復您的錢包", "restore_bitcoin_description_from_seed" : "從24個單詞的組合碼恢復您的錢包",
"restore_bitcoin_description_from_keys" : "從私鑰中生成的WIF字符串還原您的錢包", "restore_bitcoin_description_from_keys" : "從私鑰中生成的WIF字符串還原您的錢包",
"restore_bitcoin_title_from_keys" : "從WIF還原", "restore_bitcoin_title_from_keys" : "從WIF還原",
"restore_from_date_or_blockheight" : "請在創建此錢包之前幾天輸入一個日期。 或者,如果您知道塊高,請改為輸入", "restore_from_date_or_blockheight" : "請在創建此錢包之前幾天輸入一個日期。 或者,如果您知道塊高,請改為輸入",