From 9db6e233c713cecf570dafff648ccf8f3dd02a31 Mon Sep 17 00:00:00 2001 From: M Date: Mon, 11 Jan 2021 19:15:27 +0200 Subject: [PATCH] Another beautiful day changes --- lib/bitcoin/bitcoin_address_record.dart | 8 + lib/bitcoin/bitcoin_balance.dart | 33 +--- lib/bitcoin/bitcoin_wallet.dart | 6 +- lib/core/wallet_base.dart | 3 +- lib/entities/balance.dart | 12 +- lib/entities/balance_display_mode.dart | 11 +- lib/entities/default_settings_migration.dart | 12 ++ lib/generated/i18n.dart | 92 +++++++++++ lib/main.dart | 41 ++--- lib/monero/monero_balance.dart | 25 +-- lib/reactions/on_current_wallet_change.dart | 5 +- .../on_wallet_sync_status_change.dart | 3 +- .../dashboard/widgets/address_page.dart | 3 + .../dashboard/widgets/balance_page.dart | 155 ++++++++++-------- lib/src/screens/exchange/exchange_page.dart | 28 +++- .../exchange/widgets/exchange_card.dart | 61 ++++--- .../screens/receive/widgets/qr_widget.dart | 2 +- lib/store/app_store.dart | 3 +- .../dashboard/balance_view_model.dart | 123 +++++++------- .../dashboard/dashboard_view_model.dart | 5 +- .../exchange/exchange_view_model.dart | 2 +- lib/view_model/send/send_view_model.dart | 15 +- .../settings/settings_view_model.dart | 18 +- .../wallet_address_list_view_model.dart | 5 +- 24 files changed, 406 insertions(+), 265 deletions(-) diff --git a/lib/bitcoin/bitcoin_address_record.dart b/lib/bitcoin/bitcoin_address_record.dart index 80ab750cf..af492de2d 100644 --- a/lib/bitcoin/bitcoin_address_record.dart +++ b/lib/bitcoin/bitcoin_address_record.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'package:quiver/core.dart'; class BitcoinAddressRecord { BitcoinAddressRecord(this.address, {this.index}); @@ -10,8 +11,15 @@ class BitcoinAddressRecord { index: decoded['index'] as int); } + @override + bool operator ==(Object o) => + o is BitcoinAddressRecord && address == o.address; + final String address; int index; + @override + int get hashCode => address.hashCode; + String toJSON() => json.encode({'address': address, 'index': index}); } diff --git a/lib/bitcoin/bitcoin_balance.dart b/lib/bitcoin/bitcoin_balance.dart index 5081616ea..7d8441250 100644 --- a/lib/bitcoin/bitcoin_balance.dart +++ b/lib/bitcoin/bitcoin_balance.dart @@ -1,16 +1,12 @@ import 'dart:convert'; -import 'package:cake_wallet/entities/balance_display_mode.dart'; import 'package:flutter/foundation.dart'; import 'package:cake_wallet/bitcoin/bitcoin_amount_format.dart'; import 'package:cake_wallet/entities/balance.dart'; class BitcoinBalance extends Balance { const BitcoinBalance({@required this.confirmed, @required this.unconfirmed}) - : super(const [ - BalanceDisplayMode.availableBalance, - BalanceDisplayMode.fullBalance - ]); + : super(confirmed, unconfirmed); factory BitcoinBalance.fromJSON(String jsonSource) { if (jsonSource == null) { @@ -27,31 +23,12 @@ class BitcoinBalance extends Balance { final int confirmed; final int unconfirmed; - int get total => confirmed + unconfirmed; - - int get availableBalance => - (confirmed ?? 0) + (unconfirmed < 0 ? unconfirmed : 0); - - String get confirmedFormatted => bitcoinAmountToString(amount: confirmed); - - String get unconfirmedFormatted => bitcoinAmountToString(amount: unconfirmed); - - String get totalFormatted => bitcoinAmountToString(amount: total); - - String get availableBalanceFormatted => - bitcoinAmountToString(amount: availableBalance); + @override + String get formattedAvailableBalance => bitcoinAmountToString(amount: confirmed); @override - String formattedBalance(BalanceDisplayMode mode) { - switch (mode) { - case BalanceDisplayMode.fullBalance: - return totalFormatted; - case BalanceDisplayMode.availableBalance: - return availableBalanceFormatted; - default: - return null; - } - } + String get formattedAdditionalBalance => + bitcoinAmountToString(amount: unconfirmed); String toJSON() => json.encode({'confirmed': confirmed, 'unconfirmed': unconfirmed}); diff --git a/lib/bitcoin/bitcoin_wallet.dart b/lib/bitcoin/bitcoin_wallet.dart index 223fb697b..8ee012e75 100644 --- a/lib/bitcoin/bitcoin_wallet.dart +++ b/lib/bitcoin/bitcoin_wallet.dart @@ -47,7 +47,7 @@ abstract class BitcoinWalletBase extends WalletBase with Store { network: bitcoin.bitcoin) .derivePath("m/0'/0"), addresses = initialAddresses != null - ? ObservableList.of(initialAddresses) + ? ObservableList.of(initialAddresses.toSet()) : ObservableList(), syncStatus = NotConnectedSyncStatus(), _password = password, @@ -267,14 +267,14 @@ abstract class BitcoinWalletBase extends WalletBase with Store { final fee = feeAmountForPriority(transactionCredentials.priority); final amount = transactionCredentials.amount != null ? stringDoubleToBitcoinAmount(transactionCredentials.amount) - : balance.availableBalance - fee; + : balance.confirmed - fee; final totalAmount = amount + fee; final txb = bitcoin.TransactionBuilder(network: bitcoin.bitcoin); final changeAddress = address; var leftAmount = totalAmount; var totalInputAmount = 0; - if (totalAmount > balance.availableBalance) { + if (totalAmount > balance.confirmed) { throw BitcoinTransactionWrongBalanceException(); } diff --git a/lib/core/wallet_base.dart b/lib/core/wallet_base.dart index d08eff0ef..fe187b4c7 100644 --- a/lib/core/wallet_base.dart +++ b/lib/core/wallet_base.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/entities/balance.dart'; import 'package:flutter/foundation.dart'; import 'package:cake_wallet/entities/wallet_info.dart'; import 'package:cake_wallet/core/pending_transaction.dart'; @@ -9,7 +10,7 @@ import 'package:cake_wallet/entities/sync_status.dart'; import 'package:cake_wallet/entities/node.dart'; import 'package:cake_wallet/entities/wallet_type.dart'; -abstract class WalletBase { +abstract class WalletBase { WalletBase(this.walletInfo); static String idFor(String name, WalletType type) => diff --git a/lib/entities/balance.dart b/lib/entities/balance.dart index 89f3cd725..cf98f9e0f 100644 --- a/lib/entities/balance.dart +++ b/lib/entities/balance.dart @@ -1,9 +1,11 @@ -import 'package:cake_wallet/entities/balance_display_mode.dart'; - abstract class Balance { - const Balance(this.availableModes); + const Balance(this.available, this.additional); - final List availableModes; + final int available; - String formattedBalance(BalanceDisplayMode mode); + final int additional; + + String get formattedAvailableBalance; + + String get formattedAdditionalBalance; } diff --git a/lib/entities/balance_display_mode.dart b/lib/entities/balance_display_mode.dart index 57197e57b..8b11bf385 100644 --- a/lib/entities/balance_display_mode.dart +++ b/lib/entities/balance_display_mode.dart @@ -7,15 +7,16 @@ class BalanceDisplayMode extends EnumerableItem with Serializable { : super(title: title, raw: raw); static const all = [ - BalanceDisplayMode.fullBalance, - BalanceDisplayMode.availableBalance, - BalanceDisplayMode.hiddenBalance + BalanceDisplayMode.hiddenBalance, + BalanceDisplayMode.displayableBalance, ]; static const fullBalance = BalanceDisplayMode(raw: 0, title: 'Full Balance'); static const availableBalance = BalanceDisplayMode(raw: 1, title: 'Available Balance'); static const hiddenBalance = BalanceDisplayMode(raw: 2, title: 'Hidden Balance'); + static const displayableBalance = + BalanceDisplayMode(raw: 3, title: 'Displayable Balance'); static BalanceDisplayMode deserialize({int raw}) { switch (raw) { @@ -25,6 +26,8 @@ class BalanceDisplayMode extends EnumerableItem with Serializable { return availableBalance; case 2: return hiddenBalance; + case 3: + return displayableBalance; default: return null; } @@ -39,6 +42,8 @@ class BalanceDisplayMode extends EnumerableItem with Serializable { return S.current.xmr_available_balance; case BalanceDisplayMode.hiddenBalance: return S.current.xmr_hidden; + case BalanceDisplayMode.displayableBalance: + return S.current.displayable; default: return ''; } diff --git a/lib/entities/default_settings_migration.dart b/lib/entities/default_settings_migration.dart index 7a2eb210f..4859ffd05 100644 --- a/lib/entities/default_settings_migration.dart +++ b/lib/entities/default_settings_migration.dart @@ -80,6 +80,11 @@ Future defaultSettingsMigration( case 5: await addAddressesForMoneroWallets(walletInfoSource); break; + + case 6: + await updateDisplayModes(sharedPreferences); + break; + default: break; } @@ -220,3 +225,10 @@ Future addAddressesForMoneroWallets( } }); } + +Future updateDisplayModes(SharedPreferences sharedPreferences) async { + final currentBalanceDisplayMode = + sharedPreferences.getInt(PreferencesKey.currentBalanceDisplayModeKey); + final balanceDisplayMode = currentBalanceDisplayMode < 2 ? 3 : 2; + await sharedPreferences.setInt(PreferencesKey.currentBalanceDisplayModeKey, balanceDisplayMode); +} diff --git a/lib/generated/i18n.dart b/lib/generated/i18n.dart index 1b19e3e7d..2d312f92a 100644 --- a/lib/generated/i18n.dart +++ b/lib/generated/i18n.dart @@ -374,6 +374,10 @@ class S implements WidgetsLocalizations { String wallet_list_failed_to_remove(String wallet_name, String error) => "Failed to remove ${wallet_name} wallet. ${error}"; String wallet_list_loading_wallet(String wallet_name) => "Loading ${wallet_name} wallet"; String wallet_list_removing_wallet(String wallet_name) => "Removing ${wallet_name} wallet"; + String get exchange_incorrect_current_wallet_for_xmr => "If you want to exchange XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first."; + String get confirmed => 'Confirmed'; + String get unconfirmed => 'Unconfirmed'; + String get displayable => 'Displayable'; } class $de extends S { @@ -1088,6 +1092,14 @@ class $de extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Laden fehlgeschlagen ${wallet_name} Wallet. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Entfernen ${wallet_name} Wallet"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Wenn Sie XMR von Ihrem Cake Wallet Monero-Guthaben austauschen möchten, wechseln Sie bitte zuerst zu Ihrem Monero Wallet."; + @override + String get confirmed => 'Bestätigt'; + @override + String get unconfirmed => 'Unbestätigt'; + @override + String get displayable => 'Anzeigebar'; } class $hi extends S { @@ -1802,6 +1814,14 @@ class $hi extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "लोड करने में विफल ${wallet_name} बटुआ. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "निकाला जा रहा है ${wallet_name} बटुआ"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से एक्सएमआर का आदान-प्रदान करना चाहते हैं, तो कृपया अपने मोनेरो वॉलेट में जाएं।"; + @override + String get confirmed => 'की पुष्टि की'; + @override + String get unconfirmed => 'अपुष्ट'; + @override + String get displayable => 'प्रदर्शन योग्य'; } class $ru extends S { @@ -2516,6 +2536,14 @@ class $ru extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Ошибка при загрузке ${wallet_name} кошелька. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Удаление ${wallet_name} кошелька"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Если вы хотите обменять XMR со своего баланса Monero в Cake Wallet, сначала переключитесь на свой кошелек Monero."; + @override + String get confirmed => 'Подтверждено'; + @override + String get unconfirmed => 'Неподтвержденный'; + @override + String get displayable => 'Отображаемый'; } class $ko extends S { @@ -3230,6 +3258,14 @@ class $ko extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "불러 오지 못했습니다 ${wallet_name} 지갑. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "풀이 ${wallet_name} 지갑"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Cake Wallet Monero 잔액에서 XMR을 교환하려면 먼저 Monero 지갑으로 전환하십시오."; + @override + String get confirmed => '확인'; + @override + String get unconfirmed => '미확인'; + @override + String get displayable => '표시 가능'; } class $pt extends S { @@ -3944,6 +3980,14 @@ class $pt extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Falha ao abrir a carteira ${wallet_name}. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Removendo a carteira ${wallet_name}"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Se você deseja trocar o XMR de seu saldo da Carteira Monero Cake, troque primeiro para sua carteira Monero."; + @override + String get confirmed => 'Confirmada'; + @override + String get unconfirmed => 'Não confirmado'; + @override + String get displayable => 'Exibível'; } class $uk extends S { @@ -4658,6 +4702,14 @@ class $uk extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Помилка при завантаженні ${wallet_name} гаманця. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Видалення ${wallet_name} гаманця"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Якщо ви хочете обміняти XMR із вашого балансу Cake Wallet Monero, спочатку перейдіть на свій гаманець Monero."; + @override + String get confirmed => 'Підтверджено'; + @override + String get unconfirmed => 'Непідтверджений'; + @override + String get displayable => 'Відображуваний'; } class $ja extends S { @@ -5372,6 +5424,14 @@ class $ja extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "読み込みに失敗しました ${wallet_name} 財布. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "取りはずし ${wallet_name} 財布"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Cake Wallet Moneroの残高からXMRを交換する場合は、最初にMoneroウォレットに切り替えてください。"; + @override + String get confirmed => '確認済み'; + @override + String get unconfirmed => '未確認'; + @override + String get displayable => '表示可能'; } class $en extends S { @@ -6090,6 +6150,14 @@ class $pl extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Nie udało się załadować ${wallet_name} portfel. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Usuwanie ${wallet_name} portfel"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Jeśli chcesz wymienić XMR z salda Cake Wallet Monero, najpierw przełącz się na portfel Monero."; + @override + String get confirmed => 'Potwierdzony'; + @override + String get unconfirmed => 'niepotwierdzony'; + @override + String get displayable => 'Wyświetlane'; } class $es extends S { @@ -6804,6 +6872,14 @@ class $es extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "No se pudo cargar ${wallet_name} la billetera. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Retirar ${wallet_name} billetera"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Si desea intercambiar XMR de su saldo de Cake Wallet Monero, primero cambie a su billetera Monero."; + @override + String get confirmed => 'Confirmada'; + @override + String get unconfirmed => 'inconfirmado'; + @override + String get displayable => 'Visualizable'; } class $nl extends S { @@ -7518,6 +7594,14 @@ class $nl extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "Laden mislukt ${wallet_name} portemonnee. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "Verwijderen ${wallet_name} portemonnee"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "Als u XMR wilt omwisselen van uw Cake Wallet Monero-saldo, moet u eerst overschakelen naar uw Monero-portemonnee."; + @override + String get confirmed => 'bevestigd'; + @override + String get unconfirmed => 'niet bevestigd'; + @override + String get displayable => 'Weer te geven'; } class $zh extends S { @@ -8232,6 +8316,14 @@ class $zh extends S { String wallet_list_failed_to_load(String wallet_name, String error) => "加载失败 ${wallet_name} 钱包. ${error}"; @override String wallet_list_removing_wallet(String wallet_name) => "拆下 ${wallet_name} 钱包"; + @override + String get exchange_incorrect_current_wallet_for_xmr => "如果要从Cake Wallet Monero余额中兑换XMR,请先切换到Monero钱包。"; + @override + String get confirmed => '已确认'; + @override + String get unconfirmed => '未经证实'; + @override + String get displayable => '可显示'; } class GeneratedLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/main.dart b/lib/main.dart index 9885c45f8..d16e67faa 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/bitcoin/bitcoin_address_record.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; @@ -54,11 +55,11 @@ void main() async { TransactionDescription.boxName, encryptionKey: transactionDescriptionsBoxKey); final trades = - await Hive.openBox(Trade.boxName, encryptionKey: tradesBoxKey); + await Hive.openBox(Trade.boxName, encryptionKey: tradesBoxKey); final walletInfoSource = await Hive.openBox(WalletInfo.boxName); final templates = await Hive.openBox