mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 03:59:23 +00:00
Merge branch '4.1.0' into CAKE-198-notes-for-transactions
This commit is contained in:
commit
c0835d46ef
42 changed files with 686 additions and 349 deletions
|
@ -1,2 +1,2 @@
|
|||
-
|
||||
uri: electrumx.cakewallet.com:50002
|
||||
uri: electrum.cakewallet.com:50002
|
|
@ -294,14 +294,26 @@ extern "C"
|
|||
return true;
|
||||
}
|
||||
|
||||
void load_wallet(char *path, char *password, int32_t nettype)
|
||||
bool load_wallet(char *path, char *password, int32_t nettype)
|
||||
{
|
||||
nice(19);
|
||||
Monero::NetworkType networkType = static_cast<Monero::NetworkType>(nettype);
|
||||
Monero::Wallet *wallet = Monero::WalletManagerFactory::getWalletManager()->openWallet(std::string(path), std::string(password), networkType);
|
||||
Monero::WalletManager *walletManager = Monero::WalletManagerFactory::getWalletManager();
|
||||
Monero::Wallet *wallet = walletManager->openWallet(std::string(path), std::string(password), networkType);
|
||||
int status;
|
||||
std::string errorString;
|
||||
|
||||
wallet->statusWithErrorString(status, errorString);
|
||||
change_current_wallet(wallet);
|
||||
|
||||
return !(status != Monero::Wallet::Status_Ok || !errorString.empty());
|
||||
}
|
||||
|
||||
char *error_string() {
|
||||
return strdup(get_current_wallet()->errorString().c_str());
|
||||
}
|
||||
|
||||
|
||||
bool is_wallet_exist(char *path)
|
||||
{
|
||||
return Monero::WalletManagerFactory::getWalletManager()->walletExists(std::string(path));
|
||||
|
|
8
cw_monero/lib/exceptions/wallet_opening_exception.dart
Normal file
8
cw_monero/lib/exceptions/wallet_opening_exception.dart
Normal file
|
@ -0,0 +1,8 @@
|
|||
class WalletOpeningException implements Exception {
|
||||
WalletOpeningException({this.message});
|
||||
|
||||
final String message;
|
||||
|
||||
@override
|
||||
String toString() => message;
|
||||
}
|
|
@ -14,7 +14,9 @@ typedef restore_wallet_from_keys = Int8 Function(Pointer<Utf8>, Pointer<Utf8>,
|
|||
|
||||
typedef is_wallet_exist = Int8 Function(Pointer<Utf8>);
|
||||
|
||||
typedef load_wallet = Void Function(Pointer<Utf8>, Pointer<Utf8>, Int8);
|
||||
typedef load_wallet = Int8 Function(Pointer<Utf8>, Pointer<Utf8>, Int8);
|
||||
|
||||
typedef error_string = Pointer<Utf8> Function();
|
||||
|
||||
typedef get_filename = Pointer<Utf8> Function();
|
||||
|
||||
|
|
|
@ -14,7 +14,9 @@ typedef RestoreWalletFromKeys = int Function(Pointer<Utf8>, Pointer<Utf8>,
|
|||
|
||||
typedef IsWalletExist = int Function(Pointer<Utf8>);
|
||||
|
||||
typedef LoadWallet = void Function(Pointer<Utf8>, Pointer<Utf8>, int);
|
||||
typedef LoadWallet = int Function(Pointer<Utf8>, Pointer<Utf8>, int);
|
||||
|
||||
typedef ErrorString = Pointer<Utf8> Function();
|
||||
|
||||
typedef GetFilename = Pointer<Utf8> Function();
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'dart:ffi';
|
||||
import 'package:cw_monero/exceptions/wallet_opening_exception.dart';
|
||||
import 'package:cw_monero/wallet.dart';
|
||||
import 'package:ffi/ffi.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
@ -32,6 +33,10 @@ final loadWalletNative = moneroApi
|
|||
.lookup<NativeFunction<load_wallet>>('load_wallet')
|
||||
.asFunction<LoadWallet>();
|
||||
|
||||
final errorStringNative = moneroApi
|
||||
.lookup<NativeFunction<error_string>>('error_string')
|
||||
.asFunction<ErrorString>();
|
||||
|
||||
void createWalletSync(
|
||||
{String path, String password, String language, int nettype = 0}) {
|
||||
final pathPointer = Utf8.toUtf8(path);
|
||||
|
@ -136,10 +141,14 @@ void restoreWalletFromKeysSync(
|
|||
void loadWallet({String path, String password, int nettype = 0}) {
|
||||
final pathPointer = Utf8.toUtf8(path);
|
||||
final passwordPointer = Utf8.toUtf8(password);
|
||||
|
||||
loadWalletNative(pathPointer, passwordPointer, nettype);
|
||||
final loaded = loadWalletNative(pathPointer, passwordPointer, nettype) != 0;
|
||||
free(pathPointer);
|
||||
free(passwordPointer);
|
||||
|
||||
if (!loaded) {
|
||||
throw WalletOpeningException(
|
||||
message: convertUTF8ToString(pointer: errorStringNative()));
|
||||
}
|
||||
}
|
||||
|
||||
void _createWallet(Map<String, dynamic> args) {
|
||||
|
|
|
@ -354,7 +354,7 @@
|
|||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 7;
|
||||
CURRENT_PROJECT_VERSION = 10;
|
||||
DEVELOPMENT_TEAM = 32J6BB6VUS;
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
|
@ -494,7 +494,7 @@
|
|||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 7;
|
||||
CURRENT_PROJECT_VERSION = 10;
|
||||
DEVELOPMENT_TEAM = 32J6BB6VUS;
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
|
@ -528,7 +528,7 @@
|
|||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CURRENT_PROJECT_VERSION = 7;
|
||||
CURRENT_PROJECT_VERSION = 10;
|
||||
DEVELOPMENT_TEAM = 32J6BB6VUS;
|
||||
ENABLE_BITCODE = NO;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:cake_wallet/entities/crypto_amount_format.dart';
|
||||
|
||||
|
@ -7,10 +9,32 @@ final bitcoinAmountFormat = NumberFormat()
|
|||
..maximumFractionDigits = bitcoinAmountLength
|
||||
..minimumFractionDigits = 1;
|
||||
|
||||
String bitcoinAmountToString({int amount}) =>
|
||||
bitcoinAmountFormat.format(cryptoAmountToDouble(amount: amount, divider: bitcoinAmountDivider));
|
||||
String bitcoinAmountToString({int amount}) => bitcoinAmountFormat.format(
|
||||
cryptoAmountToDouble(amount: amount, divider: bitcoinAmountDivider));
|
||||
|
||||
double bitcoinAmountToDouble({int amount}) => cryptoAmountToDouble(amount: amount, divider: bitcoinAmountDivider);
|
||||
double bitcoinAmountToDouble({int amount}) =>
|
||||
cryptoAmountToDouble(amount: amount, divider: bitcoinAmountDivider);
|
||||
|
||||
int doubleToBitcoinAmount(double amount) =>
|
||||
(amount * bitcoinAmountDivider).toInt();
|
||||
int stringDoubleToBitcoinAmount(String amount) {
|
||||
final splitted = amount.split('');
|
||||
final dotIndex = amount.indexOf('.');
|
||||
int result = 0;
|
||||
|
||||
|
||||
for (var i = 0; i < splitted.length; i++) {
|
||||
try {
|
||||
if (dotIndex == i) {
|
||||
continue;
|
||||
}
|
||||
|
||||
final char = splitted[i];
|
||||
final multiplier = dotIndex < i
|
||||
? bitcoinAmountDivider ~/ pow(10, (i - dotIndex))
|
||||
: (bitcoinAmountDivider * pow(10, (dotIndex - i -1))).toInt();
|
||||
final num = int.parse(char) * multiplier;
|
||||
result += num;
|
||||
} catch (_) {}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -27,7 +27,8 @@ class BitcoinBalance extends Balance {
|
|||
final int confirmed;
|
||||
final int unconfirmed;
|
||||
|
||||
int get total => confirmed + unconfirmed;
|
||||
int get total =>
|
||||
confirmed + (unconfirmed < 0 ? unconfirmed * -1 : unconfirmed);
|
||||
|
||||
int get availableBalance => confirmed + (unconfirmed < 0 ? unconfirmed : 0);
|
||||
|
||||
|
|
|
@ -4,6 +4,6 @@ class BitcoinTransactionCredentials {
|
|||
BitcoinTransactionCredentials(this.address, this.amount, this.priority);
|
||||
|
||||
final String address;
|
||||
final double amount;
|
||||
final String amount;
|
||||
TransactionPriority priority;
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ class BitcoinTransactionInfo extends TransactionInfo {
|
|||
final out = vin['tx']['vout'][vout] as Map;
|
||||
final outAddresses =
|
||||
(out['scriptPubKey']['addresses'] as List<Object>)?.toSet();
|
||||
inputsAmount += doubleToBitcoinAmount(out['value'] as double ?? 0);
|
||||
inputsAmount += stringDoubleToBitcoinAmount((out['value'] as double ?? 0).toString());
|
||||
|
||||
if (outAddresses?.intersection(addressesSet)?.isNotEmpty ?? false) {
|
||||
direction = TransactionDirection.outgoing;
|
||||
|
@ -58,7 +58,7 @@ class BitcoinTransactionInfo extends TransactionInfo {
|
|||
final outAddresses =
|
||||
out['scriptPubKey']['addresses'] as List<Object> ?? [];
|
||||
final ntrs = outAddresses.toSet().intersection(addressesSet);
|
||||
final value = doubleToBitcoinAmount(out['value'] as double ?? 0.0);
|
||||
final value = stringDoubleToBitcoinAmount((out['value'] as double ?? 0.0).toString());
|
||||
totalOutAmount += value;
|
||||
|
||||
if ((direction == TransactionDirection.incoming && ntrs.isNotEmpty) ||
|
||||
|
|
|
@ -116,6 +116,19 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
|
|||
walletInfo: walletInfo);
|
||||
}
|
||||
|
||||
static int feeAmountForPriority(TransactionPriority priority) {
|
||||
switch (priority) {
|
||||
case TransactionPriority.slow:
|
||||
return 6000;
|
||||
case TransactionPriority.regular:
|
||||
return 22080;
|
||||
case TransactionPriority.fast:
|
||||
return 24000;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
final BitcoinTransactionHistory transactionHistory;
|
||||
final String path;
|
||||
|
@ -243,16 +256,20 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
|
|||
Object credentials) async {
|
||||
final transactionCredentials = credentials as BitcoinTransactionCredentials;
|
||||
final inputs = <BitcoinUnspent>[];
|
||||
final fee = _feeMultiplier(transactionCredentials.priority);
|
||||
final fee = feeAmountForPriority(transactionCredentials.priority);
|
||||
final amount = transactionCredentials.amount != null
|
||||
? doubleToBitcoinAmount(transactionCredentials.amount)
|
||||
: balance.total - fee;
|
||||
? stringDoubleToBitcoinAmount(transactionCredentials.amount)
|
||||
: balance.availableBalance - fee;
|
||||
final totalAmount = amount + fee;
|
||||
final txb = bitcoin.TransactionBuilder(network: bitcoin.bitcoin);
|
||||
var leftAmount = totalAmount;
|
||||
final changeAddress = address;
|
||||
var leftAmount = totalAmount;
|
||||
var totalInputAmount = 0;
|
||||
|
||||
if (totalAmount > balance.availableBalance) {
|
||||
throw BitcoinTransactionWrongBalanceException();
|
||||
}
|
||||
|
||||
final unspent = addresses.map((address) => eclient
|
||||
.getListUnspentWithAddress(address.address)
|
||||
.then((unspent) => unspent
|
||||
|
@ -319,7 +336,10 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
|
|||
|
||||
return PendingBitcoinTransaction(txb.build(),
|
||||
eclient: eclient, amount: amount, fee: fee)
|
||||
..addListener((transaction) => transactionHistory.addOne(transaction));
|
||||
..addListener((transaction) async {
|
||||
transactionHistory.addOne(transaction);
|
||||
await _updateBalance();
|
||||
});
|
||||
}
|
||||
|
||||
String toJSON() => json.encode({
|
||||
|
@ -331,7 +351,7 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
|
|||
|
||||
@override
|
||||
double calculateEstimatedFee(TransactionPriority priority) =>
|
||||
bitcoinAmountToDouble(amount: _feeMultiplier(priority));
|
||||
bitcoinAmountToDouble(amount: feeAmountForPriority(priority));
|
||||
|
||||
@override
|
||||
Future<void> save() async {
|
||||
|
@ -383,17 +403,4 @@ abstract class BitcoinWalletBase extends WalletBase<BitcoinBalance> with Store {
|
|||
|
||||
String _getAddress({@required int index}) =>
|
||||
generateAddress(hd: hd, index: index);
|
||||
|
||||
int _feeMultiplier(TransactionPriority priority) {
|
||||
switch (priority) {
|
||||
case TransactionPriority.slow:
|
||||
return 6000;
|
||||
case TransactionPriority.regular:
|
||||
return 22080;
|
||||
case TransactionPriority.fast:
|
||||
return 24000;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -356,7 +356,8 @@ Future setup(
|
|||
getIt.get<AppStore>().wallet,
|
||||
tradesSource,
|
||||
getIt.get<ExchangeTemplateStore>(),
|
||||
getIt.get<TradesStore>()));
|
||||
getIt.get<TradesStore>(),
|
||||
getIt.get<AppStore>().settingsStore));
|
||||
|
||||
getIt.registerFactory(() => ExchangeTradeViewModel(
|
||||
wallet: getIt.get<AppStore>().wallet,
|
||||
|
@ -433,5 +434,6 @@ Future setup(
|
|||
(para1, param2) => NewWalletTypePage(getIt.get<WalletNewVM>(),
|
||||
onTypeSelected: para1, isNewWallet: param2));
|
||||
|
||||
getIt.registerFactory(() => PreSeedPage());
|
||||
getIt.registerFactoryParam<PreSeedPage, WalletType, void>(
|
||||
(WalletType type, _) => PreSeedPage(type));
|
||||
}
|
||||
|
|
|
@ -120,7 +120,7 @@ Future<void> changeMoneroCurrentNodeToDefault(
|
|||
}
|
||||
|
||||
Node getBitcoinDefaultElectrumServer({@required Box<Node> nodes}) {
|
||||
final uri = 'electrumx.cakewallet.com:50002';
|
||||
final uri = 'electrum.cakewallet.com:50002';
|
||||
|
||||
return nodes.values
|
||||
.firstWhere((Node node) => node.uri == uri, orElse: () => null) ??
|
||||
|
|
|
@ -147,13 +147,13 @@ class S implements WidgetsLocalizations {
|
|||
String get please_select => "Please select:";
|
||||
String get please_try_to_connect_to_another_node => "Please try to connect to another node";
|
||||
String get pre_seed_button_text => "I understand. Show me my seed";
|
||||
String get pre_seed_description => "On the next page you will see a series of 25 words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.";
|
||||
String get pre_seed_title => "IMPORTANT";
|
||||
String get private_key => "Private key";
|
||||
String get public_key => "Public key";
|
||||
String get receive => "Receive";
|
||||
String get receive_amount => "Amount";
|
||||
String get received => "Received";
|
||||
String get recipient_address => "Recipient address";
|
||||
String get reconnect => "Reconnect";
|
||||
String get reconnect_alert_text => "Are you sure you want to reconnect?";
|
||||
String get reconnection => "Reconnection";
|
||||
|
@ -357,6 +357,7 @@ class S implements WidgetsLocalizations {
|
|||
String min_value(String value, String currency) => "Min: ${value} ${currency}";
|
||||
String openalias_alert_content(String recipient_name) => "You will be sending funds to\n${recipient_name}";
|
||||
String powered_by(String title) => "Powered by ${title}";
|
||||
String pre_seed_description(String words) => "On the next page you will see a series of ${words} words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.";
|
||||
String provider_error(String provider) => "${provider} error";
|
||||
String router_no_route(String name) => "No route defined for ${name}";
|
||||
String send_address(String cryptoCurrency) => "${cryptoCurrency} address";
|
||||
|
@ -524,8 +525,6 @@ class $de extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Bitte wählen Sie die Brieftaschenwährung:";
|
||||
@override
|
||||
String get pre_seed_description => "Auf der nächsten Seite sehen Sie eine Reihe von 25 Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren.";
|
||||
@override
|
||||
String get node_connection_successful => "Die Verbindung war erfolgreich";
|
||||
@override
|
||||
String get confirmations => "Bestätigungen";
|
||||
|
@ -992,6 +991,8 @@ class $de extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "geschickt";
|
||||
@override
|
||||
String get recipient_address => "Empfängeradresse";
|
||||
@override
|
||||
String get address_book => "Adressbuch";
|
||||
@override
|
||||
String get enter_your_pin => "PIN eingeben";
|
||||
|
@ -1032,6 +1033,8 @@ class $de extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "Handel für ${provider} wird nicht erstellt. Menge ist weniger als minimal: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "Auf der nächsten Seite sehen Sie eine Reihe von ${words} Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Handel ${tradeId} von ${title} nicht gefunden.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} in die Zwischenablage kopiert";
|
||||
|
@ -1236,8 +1239,6 @@ class $hi extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "कृपया बटुआ मुद्रा चुनें:";
|
||||
@override
|
||||
String get pre_seed_description => "अगले पेज पर आपको 25 शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।";
|
||||
@override
|
||||
String get node_connection_successful => "कनेक्शन सफल रहा";
|
||||
@override
|
||||
String get confirmations => "पुष्टिकरण";
|
||||
|
@ -1704,6 +1705,8 @@ class $hi extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "भेज दिया";
|
||||
@override
|
||||
String get recipient_address => "प्राप्तकर्ता का पता";
|
||||
@override
|
||||
String get address_book => "पता पुस्तिका";
|
||||
@override
|
||||
String get enter_your_pin => "अपना पिन दर्ज करो";
|
||||
|
@ -1744,6 +1747,8 @@ class $hi extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "व्यापार ${provider} के लिए नहीं बनाया गया है। राशि कम है तो न्यूनतम: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "अगले पेज पर आपको ${words} शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "व्यापार ${tradeId} of ${title} नहीं मिला.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} क्लिपबोर्ड पर नकल";
|
||||
|
@ -1948,8 +1953,6 @@ class $ru extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Пожалуйста, выберите валюту кошелька:";
|
||||
@override
|
||||
String get pre_seed_description => "На следующей странице вы увидите серию из 25 слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.";
|
||||
@override
|
||||
String get node_connection_successful => "Подключение прошло успешно";
|
||||
@override
|
||||
String get confirmations => "Подтверждения";
|
||||
|
@ -2416,6 +2419,8 @@ class $ru extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "BTC отправлены";
|
||||
@override
|
||||
String get recipient_address => "Адрес получателя";
|
||||
@override
|
||||
String get address_book => "Адресная книга";
|
||||
@override
|
||||
String get enter_your_pin => "Введите ваш PIN";
|
||||
|
@ -2456,6 +2461,8 @@ class $ru extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "Сделка для ${provider} не создана. Сумма меньше минимальной: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "На следующей странице вы увидите серию из ${words} слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Сделка ${tradeId} ${title} не найдена.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} скопировано в буфер обмена";
|
||||
|
@ -2660,8 +2667,6 @@ class $ko extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "지갑 통화를 선택하십시오:";
|
||||
@override
|
||||
String get pre_seed_description => "다음 페이지에서 25 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.";
|
||||
@override
|
||||
String get node_connection_successful => "성공적으로 연결되었습니다.";
|
||||
@override
|
||||
String get confirmations => "확인";
|
||||
|
@ -3128,6 +3133,8 @@ class $ko extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "보냄";
|
||||
@override
|
||||
String get recipient_address => "받는 사람 주소";
|
||||
@override
|
||||
String get address_book => "주소록";
|
||||
@override
|
||||
String get enter_your_pin => "PIN을 입력하십시오";
|
||||
|
@ -3168,6 +3175,8 @@ class $ko extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "거래 ${provider} 가 생성되지 않습니다. 금액이 최소보다 적습니다. ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "다음 페이지에서 ${words} 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "무역 ${tradeId} 의 ${title} 찾을 수 없습니다.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} 클립 보드에 복사";
|
||||
|
@ -3372,8 +3381,6 @@ class $pt extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Escolha a moeda da carteira:";
|
||||
@override
|
||||
String get pre_seed_description => "Na próxima página, você verá uma série de 25 palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.";
|
||||
@override
|
||||
String get node_connection_successful => "A conexão foi bem sucedida";
|
||||
@override
|
||||
String get confirmations => "Confirmações";
|
||||
|
@ -3840,6 +3847,8 @@ class $pt extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "BTC enviado";
|
||||
@override
|
||||
String get recipient_address => "Endereço do destinatário";
|
||||
@override
|
||||
String get address_book => "Livro de endereços";
|
||||
@override
|
||||
String get enter_your_pin => "Insira seu PIN";
|
||||
|
@ -3880,6 +3889,8 @@ class $pt extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "A troca por ${provider} não é criada. O valor é menor que o mínimo: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "Na próxima página, você verá uma série de ${words} palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "A troca ${tradeId} de ${title} não foi encontrada.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} copiados para a área de transferência";
|
||||
|
@ -4084,8 +4095,6 @@ class $uk extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Будь ласка, виберіть валюту гаманця:";
|
||||
@override
|
||||
String get pre_seed_description => "На наступній сторінці ви побачите серію з 25 слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.";
|
||||
@override
|
||||
String get node_connection_successful => "З'єднання було успішним";
|
||||
@override
|
||||
String get confirmations => "Підтвердження";
|
||||
|
@ -4552,6 +4561,8 @@ class $uk extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "BTC надіслано";
|
||||
@override
|
||||
String get recipient_address => "Адреса одержувача";
|
||||
@override
|
||||
String get address_book => "Адресна книга";
|
||||
@override
|
||||
String get enter_your_pin => "Введіть ваш PIN";
|
||||
|
@ -4592,6 +4603,8 @@ class $uk extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "Операція для ${provider} не створена. Сума менша мінімальної: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "На наступній сторінці ви побачите серію з ${words} слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Операція ${tradeId} ${title} не знайдена.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} скопійовано в буфер обміну";
|
||||
|
@ -4796,8 +4809,6 @@ class $ja extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "ウォレット通貨を選択してください:";
|
||||
@override
|
||||
String get pre_seed_description => "次のページでは、一連の25語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。";
|
||||
@override
|
||||
String get node_connection_successful => "接続に成功しました";
|
||||
@override
|
||||
String get confirmations => "確認";
|
||||
|
@ -5264,6 +5275,8 @@ class $ja extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "送った";
|
||||
@override
|
||||
String get recipient_address => "受信者のアドレス";
|
||||
@override
|
||||
String get address_book => "住所録";
|
||||
@override
|
||||
String get enter_your_pin => "PINを入力してください";
|
||||
|
@ -5304,6 +5317,8 @@ class $ja extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "${provider} の取引は作成されません。 金額は最小額より少ない: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "次のページでは、一連の${words}語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "トレード ${tradeId} of ${title} 見つかりません";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} クリップボードにコピーしました";
|
||||
|
@ -5512,8 +5527,6 @@ class $pl extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Wybierz walutę portfela:";
|
||||
@override
|
||||
String get pre_seed_description => "Na następnej stronie zobaczysz serię 25 słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.";
|
||||
@override
|
||||
String get node_connection_successful => "Połączenie powiodło się";
|
||||
@override
|
||||
String get confirmations => "Potwierdzenia";
|
||||
|
@ -5980,6 +5993,8 @@ class $pl extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "Wysłane";
|
||||
@override
|
||||
String get recipient_address => "Adres odbiorcy";
|
||||
@override
|
||||
String get address_book => "Książka adresowa";
|
||||
@override
|
||||
String get enter_your_pin => "Wpisz Twój kod PIN";
|
||||
|
@ -6020,6 +6035,8 @@ class $pl extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "Wymiana dla ${provider} nie została utworzona. Kwota jest mniejsza niż minimalna: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "Na następnej stronie zobaczysz serię ${words} słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Handel ${tradeId} of ${title} nie znaleziono.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} skopiowane do schowka";
|
||||
|
@ -6224,8 +6241,6 @@ class $es extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Por favor, elija la moneda de la billetera:";
|
||||
@override
|
||||
String get pre_seed_description => "En la página siguiente verá una serie de 25 palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet.";
|
||||
@override
|
||||
String get node_connection_successful => "La conexión fue exitosa";
|
||||
@override
|
||||
String get confirmations => "Confirmaciones";
|
||||
|
@ -6692,6 +6707,8 @@ class $es extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "Btc expedido";
|
||||
@override
|
||||
String get recipient_address => "Dirección del receptor";
|
||||
@override
|
||||
String get address_book => "Libreta de direcciones";
|
||||
@override
|
||||
String get enter_your_pin => "Introduce tu PIN";
|
||||
|
@ -6732,6 +6749,8 @@ class $es extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "El comercio por ${provider} no se crea. La cantidad es menos que mínima: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "En la página siguiente verá una serie de ${words} palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Comercio ${tradeId} de ${title} no encontrado.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} Copiado al portapapeles";
|
||||
|
@ -6936,8 +6955,6 @@ class $nl extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "Kies een portemonnee-valuta:";
|
||||
@override
|
||||
String get pre_seed_description => "Op de volgende pagina ziet u een reeks van 25 woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.";
|
||||
@override
|
||||
String get node_connection_successful => "Verbinding is gelukt";
|
||||
@override
|
||||
String get confirmations => "Bevestigingen";
|
||||
|
@ -7404,6 +7421,8 @@ class $nl extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "Verzonden";
|
||||
@override
|
||||
String get recipient_address => "Adres ontvanger";
|
||||
@override
|
||||
String get address_book => "Adresboek";
|
||||
@override
|
||||
String get enter_your_pin => "Voer uw pincode in";
|
||||
|
@ -7444,6 +7463,8 @@ class $nl extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "Ruil voor ${provider} is niet gemaakt. Bedrag is minder dan minimaal: ${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "Op de volgende pagina ziet u een reeks van ${words} woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "Handel ${tradeId} van ${title} niet gevonden.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} gekopieerd naar het klembord";
|
||||
|
@ -7648,8 +7669,6 @@ class $zh extends S {
|
|||
@override
|
||||
String get choose_wallet_currency => "請選擇錢包貨幣:";
|
||||
@override
|
||||
String get pre_seed_description => "在下一頁上,您將看到一系列25個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。";
|
||||
@override
|
||||
String get node_connection_successful => "連接成功";
|
||||
@override
|
||||
String get confirmations => "確認書";
|
||||
|
@ -8116,6 +8135,8 @@ class $zh extends S {
|
|||
@override
|
||||
String get trade_state_btc_sent => "已发送";
|
||||
@override
|
||||
String get recipient_address => "收件人地址";
|
||||
@override
|
||||
String get address_book => "地址簿";
|
||||
@override
|
||||
String get enter_your_pin => "输入密码";
|
||||
|
@ -8156,6 +8177,8 @@ class $zh extends S {
|
|||
@override
|
||||
String error_text_minimal_limit(String provider, String min, String currency) => "未創建 ${provider} 交易。 金額少於最小值:${min} ${currency}";
|
||||
@override
|
||||
String pre_seed_description(String words) => "在下一頁上,您將看到一系列${words}個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。";
|
||||
@override
|
||||
String trade_id_not_found(String tradeId, String title) => "贸易方式 ${tradeId} 的 ${title} 未找到.";
|
||||
@override
|
||||
String transaction_details_copied(String title) => "${title} 复制到剪贴板";
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart';
|
||||
import 'package:cake_wallet/themes/theme_base.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'package:cake_wallet/core/wallet_base.dart';
|
|||
import 'package:hive/hive.dart';
|
||||
import 'package:cw_monero/wallet_manager.dart' as monero_wallet_manager;
|
||||
import 'package:cw_monero/wallet.dart' as monero_wallet;
|
||||
import 'package:cw_monero/exceptions/wallet_opening_exception.dart';
|
||||
import 'package:cake_wallet/monero/monero_wallet.dart';
|
||||
import 'package:cake_wallet/core/wallet_credentials.dart';
|
||||
import 'package:cake_wallet/core/wallet_service.dart';
|
||||
|
@ -55,6 +56,18 @@ class MoneroWalletService extends WalletService<
|
|||
|
||||
final Box<WalletInfo> walletInfoSource;
|
||||
|
||||
static Future<void> _removeCache(String name) async {
|
||||
final path = await pathForWallet(name: name, type: WalletType.monero);
|
||||
final cacheFile = File(path);
|
||||
|
||||
if (cacheFile.existsSync()) {
|
||||
cacheFile.deleteSync();
|
||||
}
|
||||
}
|
||||
|
||||
static bool walletFilesExist(String path) =>
|
||||
!File(path).existsSync() && !File('$path.keys').existsSync();
|
||||
|
||||
@override
|
||||
Future<MoneroWallet> create(MoneroNewWalletCredentials credentials) async {
|
||||
try {
|
||||
|
@ -94,7 +107,7 @@ class MoneroWalletService extends WalletService<
|
|||
try {
|
||||
final path = await pathForWallet(name: name, type: WalletType.monero);
|
||||
|
||||
if (!File(path).existsSync()) {
|
||||
if (walletFilesExist(path)) {
|
||||
await repairOldAndroidWallet(name);
|
||||
}
|
||||
|
||||
|
@ -108,17 +121,9 @@ class MoneroWalletService extends WalletService<
|
|||
final isValid = wallet.validate();
|
||||
|
||||
if (!isValid) {
|
||||
// if (wallet.seed?.isNotEmpty ?? false) {
|
||||
// let restore from seed in this case;
|
||||
// final seed = wallet.seed;
|
||||
// final credentials = MoneroRestoreWalletFromSeedCredentials(
|
||||
// name: name, password: password, mnemonic: seed, height: 2000000)
|
||||
// ..walletInfo = walletInfo;
|
||||
// await remove(name);
|
||||
// return restoreFromSeed(credentials);
|
||||
// }
|
||||
|
||||
throw MoneroWalletLoadingException();
|
||||
await _removeCache(name);
|
||||
wallet.close();
|
||||
return openWallet(name, password);
|
||||
}
|
||||
|
||||
await wallet.init();
|
||||
|
@ -126,7 +131,15 @@ class MoneroWalletService extends WalletService<
|
|||
return wallet;
|
||||
} catch (e) {
|
||||
// TODO: Implement Exception for wallet list service.
|
||||
print('MoneroWalletsManager Error: $e');
|
||||
|
||||
if (e.toString().contains('bad_alloc') ||
|
||||
(e is WalletOpeningException &&
|
||||
(e.message == 'std::bad_alloc' ||
|
||||
e.message.contains('bad_alloc')))) {
|
||||
await _removeCache(name);
|
||||
return openWallet(name, password);
|
||||
}
|
||||
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
@ -204,7 +217,7 @@ class MoneroWalletService extends WalletService<
|
|||
final dir = Directory(oldAndroidWalletDirPath);
|
||||
|
||||
if (!dir.existsSync()) {
|
||||
throw MoneroWalletLoadingException();
|
||||
return;
|
||||
}
|
||||
|
||||
final newWalletDirPath =
|
||||
|
@ -223,7 +236,6 @@ class MoneroWalletService extends WalletService<
|
|||
});
|
||||
} catch (e) {
|
||||
print(e.toString());
|
||||
throw MoneroWalletLoadingException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,8 +71,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
case Routes.newWalletType:
|
||||
return CupertinoPageRoute<void>(
|
||||
builder: (_) => getIt.get<NewWalletTypePage>(
|
||||
param1: (BuildContext context, WalletType _) =>
|
||||
Navigator.of(context).pushNamed(Routes.preSeed, arguments: true),
|
||||
param1: (BuildContext context, WalletType type) =>
|
||||
Navigator.of(context)
|
||||
.pushNamed(Routes.preSeed, arguments: type),
|
||||
param2: true));
|
||||
|
||||
case Routes.newWallet:
|
||||
|
@ -137,7 +138,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
return CupertinoPageRoute<void>(
|
||||
builder: (_) => getIt.get<SetupPinCodePage>(
|
||||
param1: (PinCodeState<PinCodeWidget> context, dynamic _) =>
|
||||
Navigator.pushNamed(context.context, Routes.restoreWalletType)),
|
||||
Navigator.pushNamed(
|
||||
context.context, Routes.restoreWalletType)),
|
||||
fullscreenDialog: true);
|
||||
|
||||
case Routes.seed:
|
||||
|
@ -147,8 +149,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
|
||||
case Routes.restoreWallet:
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) =>
|
||||
getIt.get<WalletRestorePage>(param1: settings.arguments as WalletType));
|
||||
builder: (_) => getIt.get<WalletRestorePage>(
|
||||
param1: settings.arguments as WalletType));
|
||||
|
||||
case Routes.restoreWalletFromSeed:
|
||||
final type = settings.arguments as WalletType;
|
||||
|
@ -248,7 +250,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
case Routes.accountCreation:
|
||||
return CupertinoPageRoute<String>(
|
||||
builder: (_) => getIt.get<MoneroAccountEditOrCreatePage>(
|
||||
param1: settings.arguments as AccountListItem));
|
||||
param1: settings.arguments as AccountListItem));
|
||||
|
||||
case Routes.addressBook:
|
||||
return MaterialPageRoute<void>(
|
||||
|
@ -311,7 +313,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
|||
|
||||
case Routes.preSeed:
|
||||
return MaterialPageRoute<void>(
|
||||
builder: (_) => getIt.get<PreSeedPage>());
|
||||
builder: (_) =>
|
||||
getIt.get<PreSeedPage>(param1: settings.arguments as WalletType));
|
||||
|
||||
default:
|
||||
return MaterialPageRoute<void>(
|
||||
|
|
|
@ -59,14 +59,15 @@ class BalancePage extends StatelessWidget {
|
|||
return AutoSizeText(
|
||||
dashboardViewModel.balanceViewModel.cryptoBalance,
|
||||
style: TextStyle(
|
||||
fontSize: 40,
|
||||
fontSize: 54,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.display3
|
||||
.backgroundColor,
|
||||
height: 1),
|
||||
);
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.center);
|
||||
}),
|
||||
SizedBox(height: 10),
|
||||
Observer(builder: (_) {
|
||||
|
|
|
@ -62,10 +62,11 @@ class ExchangePage extends BasePage {
|
|||
|
||||
@override
|
||||
Widget trailing(BuildContext context) => TrailButton(
|
||||
caption: S.of(context).reset, onPressed: () {
|
||||
caption: S.of(context).reset,
|
||||
onPressed: () {
|
||||
_formKey.currentState.reset();
|
||||
exchangeViewModel.reset();
|
||||
});
|
||||
});
|
||||
|
||||
@override
|
||||
Widget body(BuildContext context) {
|
||||
|
@ -95,8 +96,8 @@ class ExchangePage extends BasePage {
|
|||
return KeyboardActions(
|
||||
config: KeyboardActionsConfig(
|
||||
keyboardActionsPlatform: KeyboardActionsPlatform.IOS,
|
||||
keyboardBarColor: Theme.of(context).accentTextTheme.body2
|
||||
.backgroundColor,
|
||||
keyboardBarColor:
|
||||
Theme.of(context).accentTextTheme.body2.backgroundColor,
|
||||
nextFocus: false,
|
||||
actions: [
|
||||
KeyboardActionsItem(
|
||||
|
@ -160,6 +161,11 @@ class ExchangePage extends BasePage {
|
|||
padding: EdgeInsets.fromLTRB(24, 100, 24, 32),
|
||||
child: Observer(
|
||||
builder: (_) => ExchangeCard(
|
||||
hasAllAmount: exchangeViewModel.hasAllAmount,
|
||||
allAmount: exchangeViewModel.hasAllAmount
|
||||
? () => exchangeViewModel
|
||||
.calculateDepositAllAmount()
|
||||
: null,
|
||||
amountFocusNode: _depositAmountFocus,
|
||||
key: depositKey,
|
||||
title: S.of(context).you_will_send,
|
||||
|
@ -394,30 +400,35 @@ class ExchangePage extends BasePage {
|
|||
}),
|
||||
),
|
||||
Observer(
|
||||
builder: (_) => LoadingPrimaryButton(
|
||||
text: S.of(context).exchange,
|
||||
onPressed: () {
|
||||
if (_formKey.currentState.validate()) {
|
||||
if ((exchangeViewModel.depositCurrency == CryptoCurrency.xmr)
|
||||
&&(!(exchangeViewModel.status is SyncedSyncStatus))) {
|
||||
showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).exchange,
|
||||
alertContent: S.of(context).exchange_sync_alert_content,
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () => Navigator.of(context).pop());
|
||||
});
|
||||
} else {
|
||||
exchangeViewModel.createTrade();
|
||||
}
|
||||
}
|
||||
},
|
||||
color: Theme.of(context).accentTextTheme.body2.color,
|
||||
textColor: Colors.white,
|
||||
isLoading: exchangeViewModel.tradeState
|
||||
is TradeIsCreating)),
|
||||
builder: (_) => LoadingPrimaryButton(
|
||||
text: S.of(context).exchange,
|
||||
onPressed: () {
|
||||
if (_formKey.currentState.validate()) {
|
||||
if ((exchangeViewModel.depositCurrency ==
|
||||
CryptoCurrency.xmr) &&
|
||||
(!(exchangeViewModel.status
|
||||
is SyncedSyncStatus))) {
|
||||
showPopUp<void>(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertWithOneAction(
|
||||
alertTitle: S.of(context).exchange,
|
||||
alertContent: S
|
||||
.of(context)
|
||||
.exchange_sync_alert_content,
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () =>
|
||||
Navigator.of(context).pop());
|
||||
});
|
||||
} else {
|
||||
exchangeViewModel.createTrade();
|
||||
}
|
||||
}
|
||||
},
|
||||
color: Theme.of(context).accentTextTheme.body2.color,
|
||||
textColor: Colors.white,
|
||||
isLoading:
|
||||
exchangeViewModel.tradeState is TradeIsCreating)),
|
||||
]),
|
||||
)),
|
||||
));
|
||||
|
|
|
@ -27,7 +27,9 @@ class ExchangeCard extends StatefulWidget {
|
|||
this.borderColor = Colors.transparent,
|
||||
this.currencyValueValidator,
|
||||
this.addressTextFieldValidator,
|
||||
this.amountFocusNode})
|
||||
this.amountFocusNode,
|
||||
this.hasAllAmount = false,
|
||||
this.allAmount})
|
||||
: super(key: key);
|
||||
|
||||
final List<CryptoCurrency> currencies;
|
||||
|
@ -47,6 +49,8 @@ class ExchangeCard extends StatefulWidget {
|
|||
final FormFieldValidator<String> currencyValueValidator;
|
||||
final FormFieldValidator<String> addressTextFieldValidator;
|
||||
final FocusNode amountFocusNode;
|
||||
final bool hasAllAmount;
|
||||
Function allAmount;
|
||||
|
||||
@override
|
||||
ExchangeCardState createState() => ExchangeCardState();
|
||||
|
@ -197,7 +201,36 @@ class ExchangeCardState extends State<ExchangeCard> {
|
|||
]),
|
||||
),
|
||||
),
|
||||
)
|
||||
),
|
||||
if (widget.hasAllAmount)
|
||||
Positioned(
|
||||
top: 5,
|
||||
right: 55,
|
||||
child: Container(
|
||||
height: 32,
|
||||
width: 32,
|
||||
margin: EdgeInsets.only(left: 14, top: 4, bottom: 10),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.display1
|
||||
.color,
|
||||
borderRadius: BorderRadius.all(Radius.circular(6))),
|
||||
child: InkWell(
|
||||
onTap: () => widget.allAmount?.call(),
|
||||
child: Center(
|
||||
child: Text(S.of(context).all,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.display1
|
||||
.decorationColor)),
|
||||
),
|
||||
),
|
||||
))
|
||||
],
|
||||
)),
|
||||
Padding(
|
||||
|
@ -232,18 +265,17 @@ class ExchangeCardState extends State<ExchangeCard> {
|
|||
),
|
||||
!_isAddressEditable && widget.hasRefundAddress
|
||||
? Padding(
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: Text(
|
||||
S.of(context).refund_address,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w500,
|
||||
color:
|
||||
Theme.of(context)
|
||||
.accentTextTheme
|
||||
.display4
|
||||
.decorationColor),
|
||||
))
|
||||
padding: EdgeInsets.only(top: 20),
|
||||
child: Text(
|
||||
S.of(context).refund_address,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.display4
|
||||
.decorationColor),
|
||||
))
|
||||
: Offstage(),
|
||||
_isAddressEditable
|
||||
? Padding(
|
||||
|
@ -251,7 +283,8 @@ class ExchangeCardState extends State<ExchangeCard> {
|
|||
child: AddressTextField(
|
||||
controller: addressController,
|
||||
placeholder: widget.hasRefundAddress
|
||||
? S.of(context).refund_address : null,
|
||||
? S.of(context).refund_address
|
||||
: null,
|
||||
options: [
|
||||
AddressTextFieldOption.paste,
|
||||
AddressTextFieldOption.qrCode,
|
||||
|
@ -265,8 +298,7 @@ class ExchangeCardState extends State<ExchangeCard> {
|
|||
hintStyle: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color:
|
||||
Theme.of(context)
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.display4
|
||||
.decorationColor),
|
||||
|
@ -281,8 +313,8 @@ class ExchangeCardState extends State<ExchangeCard> {
|
|||
onTap: () {
|
||||
Clipboard.setData(
|
||||
ClipboardData(text: addressController.text));
|
||||
showBar<void>(context,
|
||||
S.of(context).copied_to_clipboard);
|
||||
showBar<void>(
|
||||
context, S.of(context).copied_to_clipboard);
|
||||
},
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/entities/wallet_type.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/themes/theme_base.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
@ -7,8 +8,17 @@ import 'package:cake_wallet/src/widgets/primary_button.dart';
|
|||
import 'package:cake_wallet/src/screens/base_page.dart';
|
||||
|
||||
class PreSeedPage extends BasePage {
|
||||
final imageLight = Image.asset('assets/images/pre_seed_light.png');
|
||||
final imageDark = Image.asset('assets/images/pre_seed_dark.png');
|
||||
PreSeedPage(this.type)
|
||||
: imageLight = Image.asset('assets/images/pre_seed_light.png'),
|
||||
imageDark = Image.asset('assets/images/pre_seed_dark.png'),
|
||||
wordsCount = type == WalletType.monero
|
||||
? 25
|
||||
: 12; // FIXME: Stupid fast implementation
|
||||
|
||||
final Image imageDark;
|
||||
final Image imageLight;
|
||||
final WalletType type;
|
||||
final int wordsCount;
|
||||
|
||||
@override
|
||||
Widget leading(BuildContext context) => null;
|
||||
|
@ -39,7 +49,7 @@ class PreSeedPage extends BasePage {
|
|||
Padding(
|
||||
padding: EdgeInsets.only(top: 70, left: 16, right: 16),
|
||||
child: Text(
|
||||
S.of(context).pre_seed_description,
|
||||
S.of(context).pre_seed_description(wordsCount.toString()),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 14,
|
||||
|
|
|
@ -339,6 +339,7 @@ class SendPage extends BasePage {
|
|||
child: Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
S
|
||||
|
@ -352,23 +353,50 @@ class SendPage extends BasePage {
|
|||
color: Colors.white)),
|
||||
Container(
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
sendViewModel
|
||||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
sendViewModel
|
||||
.estimatedFee
|
||||
.toString() +
|
||||
' ' +
|
||||
sendViewModel
|
||||
' ' +
|
||||
sendViewModel
|
||||
.currency.title,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight:
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight:
|
||||
FontWeight.w600,
|
||||
//color: Theme.of(context).primaryTextTheme.display2.color,
|
||||
color:
|
||||
//color: Theme.of(context).primaryTextTheme.display2.color,
|
||||
color:
|
||||
Colors.white)),
|
||||
Padding(
|
||||
padding:
|
||||
EdgeInsets.only(top: 5),
|
||||
child: Text(
|
||||
sendViewModel
|
||||
.estimatedFeeFiatAmount
|
||||
+ ' ' +
|
||||
sendViewModel
|
||||
.fiat.title,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight:
|
||||
FontWeight.w600,
|
||||
color: Theme
|
||||
.of(context)
|
||||
.primaryTextTheme
|
||||
.headline
|
||||
.decorationColor))
|
||||
),
|
||||
],
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: 2,
|
||||
left: 5),
|
||||
child: Icon(
|
||||
Icons.arrow_forward_ios,
|
||||
|
@ -636,8 +664,14 @@ class SendPage extends BasePage {
|
|||
amount: S.of(context).send_amount,
|
||||
amountValue:
|
||||
sendViewModel.pendingTransaction.amountFormatted,
|
||||
fiatAmountValue: sendViewModel.pendingTransactionFiatAmount
|
||||
+ ' ' + sendViewModel.fiat.title,
|
||||
fee: S.of(context).send_fee,
|
||||
feeValue: sendViewModel.pendingTransaction.feeFormatted,
|
||||
feeFiatAmount: sendViewModel.pendingTransactionFeeFiatAmount
|
||||
+ ' ' + sendViewModel.fiat.title,
|
||||
recipientTitle: S.of(context).recipient_address,
|
||||
recipientAddress: sendViewModel.address,
|
||||
rightButtonText: S.of(context).ok,
|
||||
leftButtonText: S.of(context).cancel,
|
||||
actionRightButton: () {
|
||||
|
@ -654,96 +688,17 @@ class SendPage extends BasePage {
|
|||
}
|
||||
|
||||
if (state is TransactionCommitted) {
|
||||
return Stack(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
color: Theme.of(context).backgroundColor,
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
'assets/images/birthday_cake.png'),
|
||||
),
|
||||
),
|
||||
Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(
|
||||
top: 220, left: 24, right: 24),
|
||||
child: Text(
|
||||
S.of(context).send_success(
|
||||
sendViewModel.currency
|
||||
.toString()),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.title
|
||||
.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
left: 24,
|
||||
right: 24,
|
||||
bottom: 24,
|
||||
child: PrimaryButton(
|
||||
onPressed: () =>
|
||||
Navigator.of(context).pop(),
|
||||
text: S.of(context).send_got_it,
|
||||
color: Theme.of(context)
|
||||
.accentTextTheme
|
||||
.body2
|
||||
.color,
|
||||
textColor: Colors.white))
|
||||
],
|
||||
);
|
||||
return AlertWithOneAction(
|
||||
alertTitle: '',
|
||||
alertContent: S.of(context).send_success(
|
||||
sendViewModel.currency
|
||||
.toString()),
|
||||
buttonText: S.of(context).ok,
|
||||
buttonAction: () =>
|
||||
Navigator.of(context).pop());
|
||||
}
|
||||
|
||||
if (state is TransactionCommitting) {
|
||||
return Stack(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
color: Theme.of(context).backgroundColor,
|
||||
child: Center(
|
||||
child: Image.asset(
|
||||
'assets/images/birthday_cake.png'),
|
||||
),
|
||||
),
|
||||
BackdropFilter(
|
||||
filter: ImageFilter.blur(
|
||||
sigmaX: 3.0, sigmaY: 3.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.backgroundColor
|
||||
.withOpacity(0.25)),
|
||||
child: Center(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 220),
|
||||
child: Text(
|
||||
S.of(context).send_sending,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: Theme.of(context)
|
||||
.primaryTextTheme
|
||||
.title
|
||||
.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
return Container();
|
||||
return Offstage();
|
||||
});
|
||||
});
|
||||
},
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import 'package:cake_wallet/palette.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:cake_wallet/src/widgets/base_alert_dialog.dart';
|
||||
|
||||
|
@ -6,8 +7,12 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
@required this.alertTitle,
|
||||
@required this.amount,
|
||||
@required this.amountValue,
|
||||
@required this.fiatAmountValue,
|
||||
@required this.fee,
|
||||
@required this.feeValue,
|
||||
@required this.feeFiatAmount,
|
||||
@required this.recipientTitle,
|
||||
@required this.recipientAddress,
|
||||
@required this.leftButtonText,
|
||||
@required this.rightButtonText,
|
||||
@required this.actionLeftButton,
|
||||
|
@ -18,8 +23,12 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
final String alertTitle;
|
||||
final String amount;
|
||||
final String amountValue;
|
||||
final String fiatAmountValue;
|
||||
final String fee;
|
||||
final String feeValue;
|
||||
final String feeFiatAmount;
|
||||
final String recipientTitle;
|
||||
final String recipientAddress;
|
||||
final String leftButtonText;
|
||||
final String rightButtonText;
|
||||
final VoidCallback actionLeftButton;
|
||||
|
@ -29,74 +38,145 @@ class ConfirmSendingAlert extends BaseAlertDialog {
|
|||
@override
|
||||
String get titleText => alertTitle;
|
||||
|
||||
@override
|
||||
bool get isDividerExists => true;
|
||||
|
||||
@override
|
||||
String get leftActionButtonText => leftButtonText;
|
||||
|
||||
@override
|
||||
String get rightActionButtonText => rightButtonText;
|
||||
|
||||
@override
|
||||
VoidCallback get actionLeft => actionLeftButton;
|
||||
|
||||
@override
|
||||
VoidCallback get actionRight => actionRightButton;
|
||||
|
||||
@override
|
||||
bool get barrierDismissible => alertBarrierDismissible;
|
||||
|
||||
@override
|
||||
Widget content(BuildContext context) {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
amount,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
amountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
amountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
fiatAmountValue,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
),
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
fee,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Text(
|
||||
fee,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
),
|
||||
Text(
|
||||
feeValue,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
feeValue,
|
||||
style: TextStyle(
|
||||
fontSize: 18,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
feeFiatAmount,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
),
|
||||
Padding(
|
||||
padding: EdgeInsets.fromLTRB(8, 16, 8, 0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
recipientTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.normal,
|
||||
fontFamily: 'Lato',
|
||||
color: Theme.of(context).primaryTextTheme.title.color,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: Text(
|
||||
recipientAddress,
|
||||
style: TextStyle(
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontFamily: 'Lato',
|
||||
color: PaletteDark.pigeonBlue,
|
||||
decoration: TextDecoration.none,
|
||||
),
|
||||
)
|
||||
)
|
||||
],
|
||||
),
|
||||
)
|
||||
],
|
||||
);
|
||||
|
|
|
@ -7,6 +7,7 @@ class BaseAlertDialog extends StatelessWidget {
|
|||
String get contentText => '';
|
||||
String get leftActionButtonText => '';
|
||||
String get rightActionButtonText => '';
|
||||
bool get isDividerExists => false;
|
||||
VoidCallback get actionLeft => () {};
|
||||
VoidCallback get actionRight => () {};
|
||||
bool get barrierDismissible => true;
|
||||
|
@ -127,18 +128,27 @@ class BaseAlertDialog extends StatelessWidget {
|
|||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(24, 32, 24, 32),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
title(context),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(top: 8),
|
||||
child: content(context),
|
||||
)
|
||||
],
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: EdgeInsets.fromLTRB(24, 32, 24, 0),
|
||||
child: title(context),
|
||||
),
|
||||
isDividerExists
|
||||
? Padding(
|
||||
padding: EdgeInsets.only(top: 16, bottom: 8),
|
||||
child: Container(
|
||||
height: 1,
|
||||
color: Theme.of(context).dividerColor,
|
||||
),
|
||||
)
|
||||
: Offstage(),
|
||||
Padding(
|
||||
padding: EdgeInsets.fromLTRB(24, 8, 24, 32),
|
||||
child: content(context),
|
||||
)
|
||||
],
|
||||
),
|
||||
Container(
|
||||
height: 1,
|
||||
|
|
|
@ -85,6 +85,11 @@ abstract class SettingsStoreBase with Store {
|
|||
(String languageCode) => sharedPreferences.setString(
|
||||
PreferencesKey.currentLanguageCode, languageCode));
|
||||
|
||||
reaction((_) => balanceDisplayMode,
|
||||
(BalanceDisplayMode mode) => sharedPreferences.setInt(
|
||||
PreferencesKey.currentBalanceDisplayModeKey,
|
||||
mode.serialize()));
|
||||
|
||||
this
|
||||
.nodes
|
||||
.observe((change) => _saveCurrentNode(change.newValue, change.key));
|
||||
|
@ -153,7 +158,7 @@ abstract class SettingsStoreBase with Store {
|
|||
.getBool(PreferencesKey.allowBiometricalAuthenticationKey) ??
|
||||
false;
|
||||
final legacyTheme =
|
||||
sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy)
|
||||
(sharedPreferences.getBool(PreferencesKey.isDarkThemeLegacy) ?? false)
|
||||
? ThemeType.dark.index
|
||||
: ThemeType.bright.index;
|
||||
final savedTheme = ThemeList.deserialize(
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin_balance.dart';
|
||||
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
|
||||
import 'package:cake_wallet/core/wallet_base.dart';
|
||||
import 'package:cake_wallet/entities/balance.dart';
|
||||
import 'package:cake_wallet/entities/crypto_currency.dart';
|
||||
import 'package:cake_wallet/monero/monero_balance.dart';
|
||||
import 'package:cake_wallet/monero/monero_wallet.dart';
|
||||
import 'package:cake_wallet/entities/balance_display_mode.dart';
|
||||
import 'package:cake_wallet/entities/calculate_fiat_amount.dart';
|
||||
|
@ -18,8 +22,30 @@ abstract class BalanceViewModelBase with Store {
|
|||
BalanceViewModelBase(
|
||||
{@required this.appStore,
|
||||
@required this.settingsStore,
|
||||
@required this.fiatConvertationStore})
|
||||
: isReversing = false;
|
||||
@required this.fiatConvertationStore
|
||||
}){
|
||||
isReversing = false;
|
||||
|
||||
wallet ??= appStore.wallet;
|
||||
|
||||
_reaction = reaction((_) => appStore.wallet, _onWalletChange);
|
||||
|
||||
final _wallet = wallet;
|
||||
|
||||
if (_wallet is MoneroWallet) {
|
||||
balance = _wallet.balance;
|
||||
|
||||
_onMoneroBalanceChangeReaction = reaction((_) => _wallet.balance,
|
||||
(MoneroBalance moneroBalance) => balance = moneroBalance);
|
||||
}
|
||||
|
||||
if (_wallet is BitcoinWallet) {
|
||||
balance = _wallet.balance;
|
||||
|
||||
_onBitcoinBalanceChangeReaction = reaction((_) => _wallet.balance,
|
||||
(BitcoinBalance bitcoinBalance) => balance = bitcoinBalance);
|
||||
}
|
||||
}
|
||||
|
||||
final AppStore appStore;
|
||||
final SettingsStore settingsStore;
|
||||
|
@ -31,6 +57,12 @@ abstract class BalanceViewModelBase with Store {
|
|||
@observable
|
||||
bool isReversing;
|
||||
|
||||
@observable
|
||||
Balance balance;
|
||||
|
||||
@observable
|
||||
WalletBase wallet;
|
||||
|
||||
@computed
|
||||
double get price => fiatConvertationStore.prices[appStore.wallet.currency];
|
||||
|
||||
|
@ -47,24 +79,24 @@ abstract class BalanceViewModelBase with Store {
|
|||
@computed
|
||||
String get cryptoBalance {
|
||||
final walletBalance = _walletBalance;
|
||||
var balance = '---';
|
||||
var _balance = '---';
|
||||
|
||||
if (displayMode == BalanceDisplayMode.availableBalance) {
|
||||
balance = walletBalance.unlockedBalance ?? '0.0';
|
||||
_balance = walletBalance.unlockedBalance ?? '0.0';
|
||||
}
|
||||
|
||||
if (displayMode == BalanceDisplayMode.fullBalance) {
|
||||
balance = walletBalance.totalBalance ?? '0.0';
|
||||
_balance = walletBalance.totalBalance ?? '0.0';
|
||||
}
|
||||
|
||||
return balance;
|
||||
return _balance;
|
||||
}
|
||||
|
||||
@computed
|
||||
String get fiatBalance {
|
||||
final walletBalance = _walletBalance;
|
||||
final fiatCurrency = settingsStore.fiatCurrency;
|
||||
var balance = '---';
|
||||
var _balance = '---';
|
||||
|
||||
final totalBalance =
|
||||
_getFiatBalance(price: price, cryptoAmount: walletBalance.totalBalance);
|
||||
|
@ -73,30 +105,30 @@ abstract class BalanceViewModelBase with Store {
|
|||
price: price, cryptoAmount: walletBalance.unlockedBalance);
|
||||
|
||||
if (displayMode == BalanceDisplayMode.availableBalance) {
|
||||
balance = fiatCurrency.toString() + ' ' + unlockedBalance ?? '0.00';
|
||||
_balance = fiatCurrency.toString() + ' ' + unlockedBalance ?? '0.00';
|
||||
}
|
||||
|
||||
if (displayMode == BalanceDisplayMode.fullBalance) {
|
||||
balance = fiatCurrency.toString() + ' ' + totalBalance ?? '0.00';
|
||||
_balance = fiatCurrency.toString() + ' ' + totalBalance ?? '0.00';
|
||||
}
|
||||
|
||||
return balance;
|
||||
return _balance;
|
||||
}
|
||||
|
||||
@computed
|
||||
WalletBalance get _walletBalance {
|
||||
final _wallet = appStore.wallet;
|
||||
final _balance = balance;
|
||||
|
||||
if (_wallet is MoneroWallet) {
|
||||
return WalletBalance(
|
||||
unlockedBalance: _wallet.balance.formattedUnlockedBalance,
|
||||
totalBalance: _wallet.balance.formattedFullBalance);
|
||||
if (_balance is MoneroBalance) {
|
||||
return WalletBalance(
|
||||
unlockedBalance: _balance.formattedUnlockedBalance,
|
||||
totalBalance: _balance.formattedFullBalance);
|
||||
}
|
||||
|
||||
if (_wallet is BitcoinWallet) {
|
||||
if (_balance is BitcoinBalance) {
|
||||
return WalletBalance(
|
||||
unlockedBalance: _wallet.balance.availableBalanceFormatted,
|
||||
totalBalance: _wallet.balance.totalFormatted);
|
||||
unlockedBalance: _balance.availableBalanceFormatted,
|
||||
totalBalance: _balance.totalFormatted);
|
||||
}
|
||||
|
||||
return null;
|
||||
|
@ -105,6 +137,33 @@ abstract class BalanceViewModelBase with Store {
|
|||
@computed
|
||||
CryptoCurrency get currency => appStore.wallet.currency;
|
||||
|
||||
@action
|
||||
void _onWalletChange(WalletBase wallet) {
|
||||
this.wallet = wallet;
|
||||
|
||||
if (wallet is MoneroWallet) {
|
||||
balance = wallet.balance;
|
||||
|
||||
_onMoneroBalanceChangeReaction?.reaction?.dispose();
|
||||
|
||||
_onMoneroBalanceChangeReaction = reaction((_) => wallet.balance,
|
||||
(MoneroBalance moneroBalance) => balance = moneroBalance);
|
||||
}
|
||||
|
||||
if (wallet is BitcoinWallet) {
|
||||
balance = wallet.balance;
|
||||
|
||||
_onBitcoinBalanceChangeReaction?.reaction?.dispose();
|
||||
|
||||
_onBitcoinBalanceChangeReaction = reaction((_) => wallet.balance,
|
||||
(BitcoinBalance bitcoinBalance) => balance = bitcoinBalance);
|
||||
}
|
||||
}
|
||||
|
||||
ReactionDisposer _onMoneroBalanceChangeReaction;
|
||||
ReactionDisposer _onBitcoinBalanceChangeReaction;
|
||||
ReactionDisposer _reaction;
|
||||
|
||||
String _getFiatBalance({double price, String cryptoAmount}) {
|
||||
if (cryptoAmount == null) {
|
||||
return '0.00';
|
||||
|
@ -112,4 +171,4 @@ abstract class BalanceViewModelBase with Store {
|
|||
|
||||
return calculateFiatAmount(price: price, cryptoAmount: cryptoAmount);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart';
|
||||
import 'package:cake_wallet/bitcoin/bitcoin_wallet.dart';
|
||||
import 'package:cake_wallet/core/wallet_base.dart';
|
||||
import 'package:cake_wallet/entities/crypto_currency.dart';
|
||||
import 'package:cake_wallet/entities/sync_status.dart';
|
||||
|
@ -7,6 +9,7 @@ import 'package:cake_wallet/exchange/limits.dart';
|
|||
import 'package:cake_wallet/exchange/trade.dart';
|
||||
import 'package:cake_wallet/exchange/limits_state.dart';
|
||||
import 'package:cake_wallet/store/dashboard/trades_store.dart';
|
||||
import 'package:cake_wallet/store/settings_store.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:mobx/mobx.dart';
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
|
@ -27,8 +30,8 @@ part 'exchange_view_model.g.dart';
|
|||
class ExchangeViewModel = ExchangeViewModelBase with _$ExchangeViewModel;
|
||||
|
||||
abstract class ExchangeViewModelBase with Store {
|
||||
ExchangeViewModelBase(
|
||||
this.wallet, this.trades, this._exchangeTemplateStore, this.tradesStore) {
|
||||
ExchangeViewModelBase(this.wallet, this.trades, this._exchangeTemplateStore,
|
||||
this.tradesStore, this._settingsStore) {
|
||||
providerList = [
|
||||
XMRTOExchangeProvider(),
|
||||
ChangeNowExchangeProvider(),
|
||||
|
@ -104,10 +107,6 @@ abstract class ExchangeViewModelBase with Store {
|
|||
@observable
|
||||
bool isReceiveAmountEntered;
|
||||
|
||||
Limits limits;
|
||||
|
||||
NumberFormat _cryptoNumberFormat;
|
||||
|
||||
@computed
|
||||
SyncStatus get status => wallet.syncStatus;
|
||||
|
||||
|
@ -115,6 +114,15 @@ abstract class ExchangeViewModelBase with Store {
|
|||
ObservableList<ExchangeTemplate> get templates =>
|
||||
_exchangeTemplateStore.templates;
|
||||
|
||||
bool get hasAllAmount =>
|
||||
wallet.type == WalletType.bitcoin && depositCurrency == wallet.currency;
|
||||
|
||||
Limits limits;
|
||||
|
||||
NumberFormat _cryptoNumberFormat;
|
||||
|
||||
SettingsStore _settingsStore;
|
||||
|
||||
@action
|
||||
void changeProvider({ExchangeProvider provider}) {
|
||||
this.provider = provider;
|
||||
|
@ -264,9 +272,8 @@ abstract class ExchangeViewModelBase with Store {
|
|||
await trades.add(trade);
|
||||
tradeState = TradeIsCreatedSuccessfully(trade: trade);
|
||||
} catch (e) {
|
||||
tradeState = TradeIsCreatedFailure(
|
||||
title: provider.title,
|
||||
error: e.toString());
|
||||
tradeState =
|
||||
TradeIsCreatedFailure(title: provider.title, error: e.toString());
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -291,6 +298,22 @@ abstract class ExchangeViewModelBase with Store {
|
|||
_onPairChange();
|
||||
}
|
||||
|
||||
@action
|
||||
void calculateDepositAllAmount() {
|
||||
if (wallet is BitcoinWallet) {
|
||||
final availableBalance = wallet.balance.availableBalance as int;
|
||||
final fee = BitcoinWalletBase.feeAmountForPriority(
|
||||
_settingsStore.transactionPriority);
|
||||
|
||||
if (availableBalance < fee || availableBalance == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
final amount = availableBalance - fee;
|
||||
depositAmount = bitcoinAmountToString(amount: amount);
|
||||
}
|
||||
}
|
||||
|
||||
void updateTemplate() => _exchangeTemplateStore.update();
|
||||
|
||||
void addTemplate(
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:cake_wallet/entities/balance_display_mode.dart';
|
||||
import 'package:cake_wallet/entities/calculate_fiat_amount_raw.dart';
|
||||
import 'package:cake_wallet/entities/transaction_description.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
@ -64,6 +65,50 @@ abstract class SendViewModelBase with Store {
|
|||
double get estimatedFee =>
|
||||
_wallet.calculateEstimatedFee(_settingsStore.transactionPriority);
|
||||
|
||||
@computed
|
||||
String get estimatedFeeFiatAmount {
|
||||
try {
|
||||
final fiat = calculateFiatAmountRaw(
|
||||
price: _fiatConversationStore.prices[_wallet.currency],
|
||||
cryptoAmount: estimatedFee);
|
||||
return fiat;
|
||||
} catch (_) {
|
||||
return '0.00';
|
||||
}
|
||||
}
|
||||
|
||||
@computed
|
||||
String get pendingTransactionFiatAmount {
|
||||
try {
|
||||
if (pendingTransaction != null) {
|
||||
final fiat = calculateFiatAmount(
|
||||
price: _fiatConversationStore.prices[_wallet.currency],
|
||||
cryptoAmount: pendingTransaction.amountFormatted);
|
||||
return fiat;
|
||||
} else {
|
||||
return '0.00';
|
||||
}
|
||||
} catch (_) {
|
||||
return '0.00';
|
||||
}
|
||||
}
|
||||
|
||||
@computed
|
||||
String get pendingTransactionFeeFiatAmount {
|
||||
try {
|
||||
if (pendingTransaction != null) {
|
||||
final fiat = calculateFiatAmount(
|
||||
price: _fiatConversationStore.prices[_wallet.currency],
|
||||
cryptoAmount: pendingTransaction.feeFormatted);
|
||||
return fiat;
|
||||
} else {
|
||||
return '0.00';
|
||||
}
|
||||
} catch (_) {
|
||||
return '0.00';
|
||||
}
|
||||
}
|
||||
|
||||
FiatCurrency get fiat => _settingsStore.fiatCurrency;
|
||||
|
||||
TransactionPriority get transactionPriority =>
|
||||
|
@ -205,7 +250,7 @@ abstract class SendViewModelBase with Store {
|
|||
|
||||
switch (_wallet.type) {
|
||||
case WalletType.bitcoin:
|
||||
final amount = !sendAll ? double.parse(_amount) : null;
|
||||
final amount = !sendAll ? _amount : null;
|
||||
|
||||
return BitcoinTransactionCredentials(
|
||||
address, amount, _settingsStore.transactionPriority);
|
||||
|
|
|
@ -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.0.91+22
|
||||
version: 4.1.0+26
|
||||
|
||||
environment:
|
||||
sdk: ">=2.7.0 <3.0.0"
|
||||
|
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Bitte warten Sie, bis Ihre Brieftasche synchronisiert ist",
|
||||
|
||||
"pre_seed_title" : "WICHTIG",
|
||||
"pre_seed_description" : "Auf der nächsten Seite sehen Sie eine Reihe von 25 Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren.",
|
||||
"pre_seed_description" : "Auf der nächsten Seite sehen Sie eine Reihe von ${words} Wörtern. Dies ist Ihr einzigartiger und privater Samen und der EINZIGE Weg, um Ihren Geldbeutel im Falle eines Verlusts oder einer Fehlfunktion wiederherzustellen. Es liegt in IHRER Verantwortung, es aufzuschreiben und an einem sicheren Ort außerhalb der Cake Wallet App aufzubewahren.",
|
||||
"pre_seed_button_text" : "Ich verstehe. Zeig mir meinen Samen",
|
||||
|
||||
"xmr_to_error" : "XMR.TO-Fehler",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Licht",
|
||||
"bright_theme" : "Hell",
|
||||
"dark_theme" : "Dunkel",
|
||||
|
||||
"enter_your_note" : "Geben Sie Ihre Notiz ein…",
|
||||
"note_optional" : "Hinweis (optional)",
|
||||
"note_tap_to_change" : "Hinweis (zum Ändern tippen)",
|
||||
"transaction_key" : "Transaktionsschlüssel",
|
||||
"confirmations" : "Bestätigungen"
|
||||
"confirmations" : "Bestätigungen",
|
||||
"recipient_address" : "Empfängeradresse"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Please wait until your wallet is synchronized",
|
||||
|
||||
"pre_seed_title" : "IMPORTANT",
|
||||
"pre_seed_description" : "On the next page you will see a series of 25 words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.",
|
||||
"pre_seed_description" : "On the next page you will see a series of ${words} words. This is your unique and private seed and it is the ONLY way to recover your wallet in case of loss or malfunction. It is YOUR responsibility to write it down and store it in a safe place outside of the Cake Wallet app.",
|
||||
"pre_seed_button_text" : "I understand. Show me my seed",
|
||||
|
||||
"xmr_to_error" : "XMR.TO error",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Light",
|
||||
"bright_theme" : "Bright",
|
||||
"dark_theme" : "Dark",
|
||||
|
||||
"enter_your_note" : "Enter your note…",
|
||||
"note_optional" : "Note (optional)",
|
||||
"note_tap_to_change" : "Note (tap to change)",
|
||||
"transaction_key" : "Transaction Key",
|
||||
"confirmations" : "Confirmations"
|
||||
"confirmations" : "Confirmations",
|
||||
"recipient_address" : "Recipient address"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Espere hasta que su billetera esté sincronizada",
|
||||
|
||||
"pre_seed_title" : "IMPORTANTE",
|
||||
"pre_seed_description" : "En la página siguiente verá una serie de 25 palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet.",
|
||||
"pre_seed_description" : "En la página siguiente verá una serie de ${words} palabras. Esta es su semilla única y privada y es la ÚNICA forma de recuperar su billetera en caso de pérdida o mal funcionamiento. Es SU responsabilidad escribirlo y guardarlo en un lugar seguro fuera de la aplicación Cake Wallet.",
|
||||
"pre_seed_button_text" : "Entiendo. Muéstrame mi semilla",
|
||||
|
||||
"xmr_to_error" : "Error de XMR.TO",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Ligera",
|
||||
"bright_theme" : "Brillante",
|
||||
"dark_theme" : "Oscura",
|
||||
|
||||
"enter_your_note" : "Ingresa tu nota…",
|
||||
"note_optional" : "Nota (opcional)",
|
||||
"note_tap_to_change" : "Nota (toque para cambiar)",
|
||||
"transaction_key" : "Clave de transacción",
|
||||
"confirmations" : "Confirmaciones"
|
||||
"confirmations" : "Confirmaciones",
|
||||
"recipient_address" : "Dirección del receptor"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "कृपया प्रतीक्षा करें जब तक आपका बटुआ सिंक्रनाइज़ नहीं किया जाता है",
|
||||
|
||||
"pre_seed_title" : "महत्वपूर्ण",
|
||||
"pre_seed_description" : "अगले पेज पर आपको 25 शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।",
|
||||
"pre_seed_description" : "अगले पेज पर आपको ${words} शब्दों की एक श्रृंखला दिखाई देगी। यह आपका अद्वितीय और निजी बीज है और नुकसान या खराबी के मामले में अपने बटुए को पुनर्प्राप्त करने का एकमात्र तरीका है। यह आपकी जिम्मेदारी है कि इसे नीचे लिखें और इसे Cake Wallet ऐप के बाहर सुरक्षित स्थान पर संग्रहीत करें।",
|
||||
"pre_seed_button_text" : "मै समझता हुँ। मुझे अपना बीज दिखाओ",
|
||||
|
||||
"xmr_to_error" : "XMR.TO त्रुटि",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "रोशनी",
|
||||
"bright_theme" : "उज्ज्वल",
|
||||
"dark_theme" : "अंधेरा",
|
||||
|
||||
"enter_your_note" : "अपना नोट दर्ज करें ...",
|
||||
"note_optional" : "नोट (वैकल्पिक)",
|
||||
"note_tap_to_change" : "नोट (टैप टू चेंज)",
|
||||
"transaction_key" : "लेन-देन की",
|
||||
"confirmations" : "पुष्टिकरण"
|
||||
"confirmations" : "पुष्टिकरण",
|
||||
"recipient_address" : "प्राप्तकर्ता का पता"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "ウォレットが同期されるまでお待ちください",
|
||||
|
||||
"pre_seed_title" : "重要",
|
||||
"pre_seed_description" : "次のページでは、一連の25語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。",
|
||||
"pre_seed_description" : "次のページでは、一連の${words}語が表示されます。 これはあなたのユニークでプライベートなシードであり、紛失や誤動作が発生した場合にウォレットを回復する唯一の方法です。 それを書き留めて、Cake Wallet アプリの外の安全な場所に保管するのはあなたの責任です。",
|
||||
"pre_seed_button_text" : "わかります。 種を見せて",
|
||||
|
||||
"xmr_to_error" : "XMR.TOエラー",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "光",
|
||||
"bright_theme" : "明るい",
|
||||
"dark_theme" : "闇",
|
||||
|
||||
"enter_your_note" : "メモを入力してください…",
|
||||
"note_optional" : "注(オプション)",
|
||||
"note_tap_to_change" : "注(タップして変更)",
|
||||
"transaction_key" : "トランザクションキー",
|
||||
"confirmations" : "確認"
|
||||
"confirmations" : "確認",
|
||||
"recipient_address" : "受信者のアドレス"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "지갑이 동기화 될 때까지 기다리십시오",
|
||||
|
||||
"pre_seed_title" : "중대한",
|
||||
"pre_seed_description" : "다음 페이지에서 25 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.",
|
||||
"pre_seed_description" : "다음 페이지에서 ${words} 개의 단어를 볼 수 있습니다. 이것은 귀하의 고유하고 개인적인 시드이며 분실 또는 오작동시 지갑을 복구하는 유일한 방법입니다. 기록해두고 Cake Wallet 앱 외부의 안전한 장소에 보관하는 것은 귀하의 책임입니다.",
|
||||
"pre_seed_button_text" : "이해 했어요. 내 씨앗을 보여줘",
|
||||
|
||||
"xmr_to_error" : "XMR.TO 오류",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "빛",
|
||||
"bright_theme" : "선명한",
|
||||
"dark_theme" : "어두운",
|
||||
|
||||
"enter_your_note" : "메모를 입력하세요…",
|
||||
"note_optional" : "참고 (선택 사항)",
|
||||
"note_tap_to_change" : "메모 (변경하려면 탭하세요)",
|
||||
"transaction_key" : "거래 키",
|
||||
"confirmations" : "확인"
|
||||
"confirmations" : "확인",
|
||||
"recipient_address" : "받는 사람 주소"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Wacht tot uw portemonnee is gesynchroniseerd",
|
||||
|
||||
"pre_seed_title" : "BELANGRIJK",
|
||||
"pre_seed_description" : "Op de volgende pagina ziet u een reeks van 25 woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.",
|
||||
"pre_seed_description" : "Op de volgende pagina ziet u een reeks van ${words} woorden. Dit is uw unieke en persoonlijke zaadje en het is de ENIGE manier om uw portemonnee te herstellen in geval van verlies of storing. Het is JOUW verantwoordelijkheid om het op te schrijven en op een veilige plaats op te slaan buiten de Cake Wallet app.",
|
||||
"pre_seed_button_text" : "Ik begrijp het. Laat me mijn zaad zien",
|
||||
|
||||
"xmr_to_error" : "XMR.TO-fout",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Licht",
|
||||
"bright_theme" : "Helder",
|
||||
"dark_theme" : "Donker",
|
||||
|
||||
"enter_your_note" : "Voer uw notitie in ...",
|
||||
"note_optional" : "Opmerking (optioneel)",
|
||||
"note_tap_to_change" : "Opmerking (tik om te wijzigen)",
|
||||
"transaction_key" : "Transactiesleutel",
|
||||
"confirmations" : "Bevestigingen"
|
||||
"confirmations" : "Bevestigingen",
|
||||
"recipient_address" : "Adres ontvanger"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Poczekaj, aż portfel zostanie zsynchronizowany",
|
||||
|
||||
"pre_seed_title" : "WAŻNY",
|
||||
"pre_seed_description" : "Na następnej stronie zobaczysz serię 25 słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.",
|
||||
"pre_seed_description" : "Na następnej stronie zobaczysz serię ${words} słów. To jest Twoje unikalne i prywatne ziarno i jest to JEDYNY sposób na odzyskanie portfela w przypadku utraty lub awarii. Twoim obowiązkiem jest zapisanie go i przechowywanie w bezpiecznym miejscu poza aplikacją Cake Wallet.",
|
||||
"pre_seed_button_text" : "Rozumiem. Pokaż mi moje nasienie",
|
||||
|
||||
"xmr_to_error" : "Pomyłka XMR.TO",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Lekki",
|
||||
"bright_theme" : "Jasny",
|
||||
"dark_theme" : "Ciemny",
|
||||
|
||||
"enter_your_note" : "Wpisz notatkę…",
|
||||
"note_optional" : "Notatka (opcjonalnie)",
|
||||
"note_tap_to_change" : "Notatka (dotknij, aby zmienić)",
|
||||
"transaction_key" : "Klucz transakcji",
|
||||
"confirmations" : "Potwierdzenia"
|
||||
"confirmations" : "Potwierdzenia",
|
||||
"recipient_address" : "Adres odbiorcy"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Por favor, espere até que sua carteira seja sincronizada",
|
||||
|
||||
"pre_seed_title" : "IMPORTANTE",
|
||||
"pre_seed_description" : "Na próxima página, você verá uma série de 25 palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.",
|
||||
"pre_seed_description" : "Na próxima página, você verá uma série de ${words} palavras. Esta é a sua semente única e privada e é a ÚNICA maneira de recuperar sua carteira em caso de perda ou mau funcionamento. É SUA responsabilidade anotá-lo e armazená-lo em um local seguro fora do aplicativo Cake Wallet.",
|
||||
"pre_seed_button_text" : "Compreendo. Me mostre minha semente",
|
||||
|
||||
"xmr_to_error" : "Erro XMR.TO",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Luz",
|
||||
"bright_theme" : "Brilhante",
|
||||
"dark_theme" : "Sombria",
|
||||
|
||||
"enter_your_note" : "Insira sua nota ...",
|
||||
"note_optional" : "Nota (opcional)",
|
||||
"note_tap_to_change" : "Nota (toque para alterar)",
|
||||
"transaction_key" : "Chave de transação",
|
||||
"confirmations" : "Confirmações"
|
||||
"confirmations" : "Confirmações",
|
||||
"recipient_address" : "Endereço do destinatário"
|
||||
}
|
||||
|
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Подождите, пока ваш кошелек синхронизируется",
|
||||
|
||||
"pre_seed_title" : "ВАЖНО",
|
||||
"pre_seed_description" : "На следующей странице вы увидите серию из 25 слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.",
|
||||
"pre_seed_description" : "На следующей странице вы увидите серию из ${words} слов. Это ваша уникальная и личная мнемоническая фраза, и это ЕДИНСТВЕННЫЙ способ восстановить свой кошелек в случае потери или неисправности. ВАМ необходимо записать ее и хранить в надежном месте вне приложения Cake Wallet.",
|
||||
"pre_seed_button_text" : "Понятно. Покажите мнемоническую фразу",
|
||||
|
||||
"xmr_to_error" : "Ошибка XMR.TO",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Светлая",
|
||||
"bright_theme" : "Яркая",
|
||||
"dark_theme" : "Темная",
|
||||
|
||||
"enter_your_note" : "Введите примечание…",
|
||||
"note_optional" : "Примечание (необязательно)",
|
||||
"note_tap_to_change" : "Примечание (нажмите для изменения)",
|
||||
"transaction_key" : "Ключ транзакции",
|
||||
"confirmations" : "Подтверждения"
|
||||
"confirmations" : "Подтверждения",
|
||||
"recipient_address" : "Адрес получателя"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "Зачекайте, поки ваш гаманець не синхронізується",
|
||||
|
||||
"pre_seed_title" : "ВАЖЛИВО",
|
||||
"pre_seed_description" : "На наступній сторінці ви побачите серію з 25 слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.",
|
||||
"pre_seed_description" : "На наступній сторінці ви побачите серію з ${words} слів. Це ваша унікальна та приватна мнемонічна фраза, і це ЄДИНИЙ спосіб відновити ваш гаманець на випадок втрати або несправності. ВАМ необхідно записати її та зберігати в безпечному місці поза програмою Cake Wallet.",
|
||||
"pre_seed_button_text" : "Зрозуміло. Покажіть мнемонічну фразу",
|
||||
|
||||
"xmr_to_error" : "Помилка XMR.TO",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "Світла",
|
||||
"bright_theme" : "Яскрава",
|
||||
"dark_theme" : "Темна",
|
||||
|
||||
"enter_your_note" : "Введіть примітку…",
|
||||
"note_optional" : "Примітка (необов’язково)",
|
||||
"note_tap_to_change" : "Примітка (натисніть для зміни)",
|
||||
"transaction_key" : "Ключ транзакції",
|
||||
"confirmations" : "Підтвердження"
|
||||
"confirmations" : "Підтвердження",
|
||||
"recipient_address" : "Адреса одержувача"
|
||||
}
|
|
@ -416,7 +416,7 @@
|
|||
"exchange_sync_alert_content" : "請等待,直到您的錢包同步",
|
||||
|
||||
"pre_seed_title" : "重要",
|
||||
"pre_seed_description" : "在下一頁上,您將看到一系列25個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。",
|
||||
"pre_seed_description" : "在下一頁上,您將看到一系列${words}個單詞。 這是您獨特的私人種子,是丟失或出現故障時恢復錢包的唯一方法。 您有責任將其寫下並存儲在Cake Wallet應用程序外部的安全地方。",
|
||||
"pre_seed_button_text" : "我明白。 給我看我的種子",
|
||||
|
||||
"xmr_to_error" : "XMR.TO錯誤",
|
||||
|
@ -430,10 +430,10 @@
|
|||
"light_theme" : "光",
|
||||
"bright_theme" : "亮",
|
||||
"dark_theme" : "黑暗",
|
||||
|
||||
"enter_your_note" : "輸入您的筆記...",
|
||||
"note_optional" : "注意(可選)",
|
||||
"note_tap_to_change" : "注意(輕按即可更改)",
|
||||
"transaction_key" : "交易密碼",
|
||||
"confirmations" : "確認書"
|
||||
"confirmations" : "確認書",
|
||||
"recipient_address" : "收件人地址"
|
||||
}
|
Loading…
Reference in a new issue