Cw 498 improve wallet accounts (#1152)

* CW-498 Call updateTransactions on account change * CW-498 Code Cleanup * CW-498 Add Wallet Address to trade to match transactions to trades * CW-498 Fix containsAddress to include only addresses of account * Handle nullability for fromWalletAddress --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>

Konstantin Ullrich committed Nov 2, 2023 at 16:52 UTC e5d99313eb72405bc90903f47288983eb75bc120
13 files changed +206 -230
cw_core/lib/wallet_addresses.dart
+3 -1
@@ -36,4 +36,6 @@ abstract class WalletAddresses {
36 print(e.toString());
37 }
38 }
39 -}
\ No newline at end of file
39 +
40 + bool containsAddress(String address) => addressesMap.containsKey(address);
41 +}
cw_haven/lib/haven_wallet_addresses.dart
+7 -3
@@ -63,14 +63,14 @@ abstract class HavenWalletAddressesBase extends WalletAddressesWithAccount<Accou
63
64 bool validate() {
65 accountList.update();
66 - final accountListLength = accountList.accounts.length ?? 0;
66 + final accountListLength = accountList.accounts.length;
67
68 if (accountListLength <= 0) {
69 return false;
70 }
71
72 subaddressList.update(accountIndex: accountList.accounts.first.id);
73 - final subaddressListLength = subaddressList.subaddresses.length ?? 0;
73 + final subaddressListLength = subaddressList.subaddresses.length;
74
75 if (subaddressListLength <= 0) {
76 return false;
@@ -84,4 +84,8 @@ abstract class HavenWalletAddressesBase extends WalletAddressesWithAccount<Accou
84 subaddress = subaddressList.subaddresses.first;
85 address = subaddress!.address;
86 }
87 -}
\ No newline at end of file
87 +
88 + @override
89 + bool containsAddress(String address) =>
90 + addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false;
91 +}
cw_monero/lib/monero_wallet.dart
+5 -9
@@ -57,9 +57,7 @@ abstract class MoneroWalletBase
57 walletAddresses = MoneroWalletAddresses(walletInfo, transactionHistory);
58
59 _onAccountChangeReaction = reaction((_) => walletAddresses.account, (Account? account) {
60 - if (account == null) {
61 - return;
62 - }
60 + if (account == null) return;
61
62 balance = ObservableMap<CryptoCurrency, MoneroBalance>.of(<CryptoCurrency, MoneroBalance>{
63 currency: MoneroBalance(
@@ -67,6 +65,7 @@ abstract class MoneroWalletBase
65 unlockedBalance: monero_wallet.getUnlockedBalance(accountIndex: account.id))
66 });
67 _updateSubAddress(isEnabledAutoGenerateSubaddress, account: account);
68 + _askForUpdateTransactionHistory();
69 });
70
71 reaction((_) => isEnabledAutoGenerateSubaddress, (bool enabled) {
@@ -362,9 +361,7 @@ abstract class MoneroWalletBase
361 }
362
363 @override
365 - Future<void> changePassword(String password) async {
366 - monero_wallet.setPasswordSync(password);
367 - }
364 + Future<void> changePassword(String password) async => monero_wallet.setPasswordSync(password);
365
366 Future<int> getNodeHeight() async => monero_wallet.getNodeHeight();
367
@@ -499,9 +496,8 @@ abstract class MoneroWalletBase
496 }
497 }
498
502 - String getSubaddressLabel(int accountIndex, int addressIndex) {
503 - return monero_wallet.getSubaddressLabel(accountIndex, addressIndex);
504 - }
499 + String getSubaddressLabel(int accountIndex, int addressIndex) =>
500 + monero_wallet.getSubaddressLabel(accountIndex, addressIndex);
501
502 List<MoneroTransactionInfo> _getAllTransactionsOfAccount(int? accountIndex) => transaction_history
503 .getAllTransactions()
cw_monero/lib/monero_wallet_addresses.dart
+6 -2
@@ -1,11 +1,11 @@
1 +import 'package:cw_core/account.dart';
2 import 'package:cw_core/address_info.dart';
3 +import 'package:cw_core/subaddress.dart';
4 import 'package:cw_core/wallet_addresses.dart';
5 import 'package:cw_core/wallet_info.dart';
4 -import 'package:cw_core/account.dart';
6 import 'package:cw_monero/api/wallet.dart';
7 import 'package:cw_monero/monero_account_list.dart';
8 import 'package:cw_monero/monero_subaddress_list.dart';
8 -import 'package:cw_core/subaddress.dart';
9 import 'package:cw_monero/monero_transaction_history.dart';
10 import 'package:mobx/mobx.dart';
11
@@ -112,4 +112,8 @@ abstract class MoneroWalletAddressesBase extends WalletAddresses with Store {
112 subaddress = subaddressList.subaddresses.last;
113 address = subaddress!.address;
114 }
115 +
116 + @override
117 + bool containsAddress(String address) =>
118 + addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false;
119 }
lib/exchange/trade.dart
+9 -2
@@ -27,6 +27,7 @@ class Trade extends HiveObject {
27 this.password,
28 this.providerId,
29 this.providerName,
30 + this.fromWalletAddress
31 }) {
32 if (provider != null) providerRaw = provider.raw;
33
@@ -101,6 +102,9 @@ class Trade extends HiveObject {
102 @HiveField(16)
103 String? providerName;
104
105 + @HiveField(17)
106 + String? fromWalletAddress;
107 +
108 static Trade fromMap(Map<String, Object?> map) {
109 return Trade(
110 id: map['id'] as String,
@@ -110,7 +114,9 @@ class Trade extends HiveObject {
114 createdAt:
115 map['date'] != null ? DateTime.fromMillisecondsSinceEpoch(map['date'] as int) : null,
116 amount: map['amount'] as String,
113 - walletId: map['wallet_id'] as String);
117 + walletId: map['wallet_id'] as String,
118 + fromWalletAddress: map['from_wallet_address'] as String?
119 + );
120 }
121
122 Map<String, dynamic> toMap() {
@@ -121,7 +127,8 @@ class Trade extends HiveObject {
127 'output': to.serialize(),
128 'date': createdAt != null ? createdAt!.millisecondsSinceEpoch : null,
129 'amount': amount,
124 - 'wallet_id': walletId
130 + 'wallet_id': walletId,
131 + 'from_wallet_address': fromWalletAddress
132 };
133 }
134
lib/monero/cw_monero.dart
+56 -84
@@ -120,8 +120,6 @@ class CWMoneroWalletDetails extends MoneroWalletDetails {
120 @computed
121 @override
122 MoneroBalance get balance {
123 - final moneroWallet = _wallet as MoneroWallet;
124 - final balance = moneroWallet.balance;
123 throw Exception('Unimplemented');
124 // return MoneroBalance();
125 //return MoneroBalance(
@@ -132,14 +130,10 @@ class CWMoneroWalletDetails extends MoneroWalletDetails {
130
131 class CWMonero extends Monero {
132 @override
135 - MoneroAccountList getAccountList(Object wallet) {
136 - return CWMoneroAccountList(wallet);
137 - }
133 + MoneroAccountList getAccountList(Object wallet) => CWMoneroAccountList(wallet);
134
135 @override
140 - MoneroSubaddressList getSubaddressList(Object wallet) {
141 - return CWMoneroSubaddressList(wallet);
142 - }
136 + MoneroSubaddressList getSubaddressList(Object wallet) => CWMoneroSubaddressList(wallet);
137
138 @override
139 TransactionHistoryBase getTransactionHistory(Object wallet) {
@@ -148,19 +142,13 @@ class CWMonero extends Monero {
142 }
143
144 @override
151 - MoneroWalletDetails getMoneroWalletDetails(Object wallet) {
152 - return CWMoneroWalletDetails(wallet);
153 - }
145 + MoneroWalletDetails getMoneroWalletDetails(Object wallet) => CWMoneroWalletDetails(wallet);
146
147 @override
156 - int getHeigthByDate({required DateTime date}) {
157 - return getMoneroHeigthByDate(date: date);
158 - }
148 + int getHeightByDate({required DateTime date}) => getMoneroHeigthByDate(date: date);
149
150 @override
161 - TransactionPriority getDefaultTransactionPriority() {
162 - return MoneroTransactionPriority.automatic;
163 - }
151 + TransactionPriority getDefaultTransactionPriority() => MoneroTransactionPriority.automatic;
152
153 @override
154 TransactionPriority getMoneroTransactionPrioritySlow() => MoneroTransactionPriority.slow;
@@ -170,14 +158,11 @@ class CWMonero extends Monero {
158 MoneroTransactionPriority.automatic;
159
160 @override
173 - TransactionPriority deserializeMoneroTransactionPriority({required int raw}) {
174 - return MoneroTransactionPriority.deserialize(raw: raw);
175 - }
161 + TransactionPriority deserializeMoneroTransactionPriority({required int raw}) =>
162 + MoneroTransactionPriority.deserialize(raw: raw);
163
164 @override
178 - List<TransactionPriority> getTransactionPriorities() {
179 - return MoneroTransactionPriority.all;
180 - }
165 + List<TransactionPriority> getTransactionPriorities() => MoneroTransactionPriority.all;
166
167 @override
168 List<String> getMoneroWordList(String language) {
@@ -209,41 +194,37 @@ class CWMonero extends Monero {
194
195 @override
196 WalletCredentials createMoneroRestoreWalletFromKeysCredentials(
212 - {required String name,
213 - required String spendKey,
214 - required String viewKey,
215 - required String address,
216 - required String password,
217 - required String language,
218 - required int height}) {
219 - return MoneroRestoreWalletFromKeysCredentials(
220 - name: name,
221 - spendKey: spendKey,
222 - viewKey: viewKey,
223 - address: address,
224 - password: password,
225 - language: language,
226 - height: height);
227 - }
197 + {required String name,
198 + required String spendKey,
199 + required String viewKey,
200 + required String address,
201 + required String password,
202 + required String language,
203 + required int height}) =>
204 + MoneroRestoreWalletFromKeysCredentials(
205 + name: name,
206 + spendKey: spendKey,
207 + viewKey: viewKey,
208 + address: address,
209 + password: password,
210 + language: language,
211 + height: height);
212
213 @override
214 WalletCredentials createMoneroRestoreWalletFromSeedCredentials(
231 - {required String name,
232 - required String password,
233 - required int height,
234 - required String mnemonic}) {
235 - return MoneroRestoreWalletFromSeedCredentials(
236 - name: name, password: password, height: height, mnemonic: mnemonic);
237 - }
215 + {required String name,
216 + required String password,
217 + required int height,
218 + required String mnemonic}) =>
219 + MoneroRestoreWalletFromSeedCredentials(
220 + name: name, password: password, height: height, mnemonic: mnemonic);
221
222 @override
223 WalletCredentials createMoneroNewWalletCredentials({
224 required String name,
225 required String language,
243 - String? password,
244 - }) {
245 - return MoneroNewWalletCredentials(name: name, password: password, language: language);
246 - }
226 + String? password}) =>
227 + MoneroNewWalletCredentials(name: name, password: password, language: language);
228
229 @override
230 Map<String, String> getKeys(Object wallet) {
@@ -259,43 +240,37 @@ class CWMonero extends Monero {
240
241 @override
242 Object createMoneroTransactionCreationCredentials(
262 - {required List<Output> outputs, required TransactionPriority priority}) {
263 - return MoneroTransactionCreationCredentials(
264 - outputs: outputs
265 - .map((out) => OutputInfo(
266 - fiatAmount: out.fiatAmount,
267 - cryptoAmount: out.cryptoAmount,
268 - address: out.address,
269 - note: out.note,
270 - sendAll: out.sendAll,
271 - extractedAddress: out.extractedAddress,
272 - isParsedAddress: out.isParsedAddress,
273 - formattedCryptoAmount: out.formattedCryptoAmount))
274 - .toList(),
275 - priority: priority as MoneroTransactionPriority);
276 - }
243 + {required List<Output> outputs, required TransactionPriority priority}) =>
244 + MoneroTransactionCreationCredentials(
245 + outputs: outputs
246 + .map((out) => OutputInfo(
247 + fiatAmount: out.fiatAmount,
248 + cryptoAmount: out.cryptoAmount,
249 + address: out.address,
250 + note: out.note,
251 + sendAll: out.sendAll,
252 + extractedAddress: out.extractedAddress,
253 + isParsedAddress: out.isParsedAddress,
254 + formattedCryptoAmount: out.formattedCryptoAmount))
255 + .toList(),
256 + priority: priority as MoneroTransactionPriority);
257
258 @override
259 Object createMoneroTransactionCreationCredentialsRaw(
280 - {required List<OutputInfo> outputs, required TransactionPriority priority}) {
281 - return MoneroTransactionCreationCredentials(
282 - outputs: outputs, priority: priority as MoneroTransactionPriority);
283 - }
260 + {required List<OutputInfo> outputs, required TransactionPriority priority}) =>
261 + MoneroTransactionCreationCredentials(
262 + outputs: outputs, priority: priority as MoneroTransactionPriority);
263
264 @override
286 - String formatterMoneroAmountToString({required int amount}) {
287 - return moneroAmountToString(amount: amount);
288 - }
265 + String formatterMoneroAmountToString({required int amount}) =>
266 + moneroAmountToString(amount: amount);
267
268 @override
291 - double formatterMoneroAmountToDouble({required int amount}) {
292 - return moneroAmountToDouble(amount: amount);
293 - }
269 + double formatterMoneroAmountToDouble({required int amount}) =>
270 + moneroAmountToDouble(amount: amount);
271
272 @override
296 - int formatterMoneroParseAmount({required String amount}) {
297 - return moneroParseAmount(amount: amount);
298 - }
273 + int formatterMoneroParseAmount({required String amount}) => moneroParseAmount(amount: amount);
274
275 @override
276 Account getCurrentAccount(Object wallet) {
@@ -312,9 +287,7 @@ class CWMonero extends Monero {
287 }
288
289 @override
315 - void onStartup() {
316 - monero_wallet_api.onStartup();
317 - }
290 + void onStartup() => monero_wallet_api.onStartup();
291
292 @override
293 int getTransactionInfoAccountId(TransactionInfo tx) {
@@ -324,9 +297,8 @@ class CWMonero extends Monero {
297
298 @override
299 WalletService createMoneroWalletService(
327 - Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource) {
328 - return MoneroWalletService(walletInfoSource, unspentCoinSource);
329 - }
300 + Box<WalletInfo> walletInfoSource, Box<UnspentCoinsInfo> unspentCoinSource) =>
301 + MoneroWalletService(walletInfoSource, unspentCoinSource);
302
303 @override
304 String getTransactionAddress(Object wallet, int accountIndex, int addressIndex) {
lib/src/widgets/blockchain_height_widget.dart
+5 -8
@@ -36,16 +36,13 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
36 restoreHeightController.addListener(() {
37 if (restoreHeightController.text.isNotEmpty) {
38 widget.onHeightOrDateEntered?.call(true);
39 - }
40 - else {
39 + } else {
40 widget.onHeightOrDateEntered?.call(false);
41 dateController.text = '';
42 }
43 try {
45 - _changeHeight(restoreHeightController.text != null &&
46 - restoreHeightController.text.isNotEmpty
47 - ? int.parse(restoreHeightController.text)
48 - : 0);
44 + _changeHeight(
45 + restoreHeightController.text.isNotEmpty ? int.parse(restoreHeightController.text) : 0);
46 } catch (_) {
47 _changeHeight(0);
48 }
@@ -117,7 +114,7 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
114 );
115 }
116
120 - Future _selectDate(BuildContext context) async {
117 + Future<void> _selectDate(BuildContext context) async {
118 final now = DateTime.now();
119 final date = await getDate(
120 context: context,
@@ -126,7 +123,7 @@ class BlockchainHeightState extends State<BlockchainHeightWidget> {
123 lastDate: now);
124
125 if (date != null) {
129 - final height = monero!.getHeigthByDate(date: date);
126 + final height = monero!.getHeightByDate(date: date);
127 setState(() {
128 dateController.text = DateFormat('yyyy-MM-dd').format(date);
129 restoreHeightController.text = '$height';
lib/store/dashboard/trade_filter_store.dart
+24 -22
@@ -1,7 +1,7 @@
1 -import 'package:cw_core/wallet_base.dart';
2 -import 'package:mobx/mobx.dart';
1 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
2 import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
3 +import 'package:cw_core/wallet_base.dart';
4 +import 'package:mobx/mobx.dart';
5
6 part'trade_filter_store.g.dart';
7
@@ -87,29 +87,31 @@ abstract class TradeFilterStoreBase with Store {
87 }
88
89 List<TradeListItem> filtered({required List<TradeListItem> trades, required WalletBase wallet}) {
90 - final _trades =
91 - trades.where((item) => item.trade.walletId == wallet.id).toList();
90 + final _trades = trades
91 + .where((item) => item.trade.walletId == wallet.id && isTradeInAccount(item, wallet))
92 + .toList();
93 final needToFilter = !displayAllTrades;
94
95 return needToFilter
96 ? _trades
96 - .where((item) =>
97 - (displayXMRTO &&
98 - item.trade.provider == ExchangeProviderDescription.xmrto) ||
99 - (displaySideShift &&
100 - item.trade.provider == ExchangeProviderDescription.sideShift) ||
101 - (displayChangeNow &&
102 - item.trade.provider ==
103 - ExchangeProviderDescription.changeNow) ||
104 - (displayMorphToken &&
105 - item.trade.provider ==
106 - ExchangeProviderDescription.morphToken)
107 - ||(displaySimpleSwap &&
108 - item.trade.provider ==
109 - ExchangeProviderDescription.simpleSwap)
110 - ||(displayTrocador && item.trade.provider == ExchangeProviderDescription.trocador)
111 - ||(displayExolix && item.trade.provider == ExchangeProviderDescription.exolix))
112 - .toList()
97 + .where((item) =>
98 + (displayXMRTO && item.trade.provider == ExchangeProviderDescription.xmrto) ||
99 + (displaySideShift &&
100 + item.trade.provider == ExchangeProviderDescription.sideShift) ||
101 + (displayChangeNow &&
102 + item.trade.provider == ExchangeProviderDescription.changeNow) ||
103 + (displayMorphToken &&
104 + item.trade.provider == ExchangeProviderDescription.morphToken) ||
105 + (displaySimpleSwap &&
106 + item.trade.provider == ExchangeProviderDescription.simpleSwap) ||
107 + (displayTrocador && item.trade.provider == ExchangeProviderDescription.trocador) ||
108 + (displayExolix && item.trade.provider == ExchangeProviderDescription.exolix))
109 + .toList()
110 : _trades;
111 }
115 -}
\ No newline at end of file
112 +
113 + bool isTradeInAccount(TradeListItem item, WalletBase wallet) =>
114 + item.trade.fromWalletAddress == null
115 + ? true
116 + : wallet.walletAddresses.containsAddress(item.trade.fromWalletAddress!);
117 +}
lib/view_model/dashboard/dashboard_view_model.dart
+84 -85
@@ -1,36 +1,36 @@
1 import 'package:cake_wallet/entities/auto_generate_subaddress_status.dart';
2 +import 'package:cake_wallet/entities/balance_display_mode.dart';
3 import 'package:cake_wallet/entities/buy_provider_types.dart';
4 import 'package:cake_wallet/entities/exchange_api_mode.dart';
4 -import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
5 -import 'package:cake_wallet/view_model/dashboard/anonpay_transaction_list_item.dart';
6 -import 'package:cake_wallet/view_model/settings/sync_mode.dart';
7 -import 'package:cake_wallet/wallet_type_utils.dart';
8 -import 'package:cw_core/transaction_history.dart';
9 -import 'package:cw_core/balance.dart';
10 -import 'package:cake_wallet/entities/balance_display_mode.dart';
11 -import 'package:cw_core/transaction_info.dart';
5 import 'package:cake_wallet/exchange/exchange_provider_description.dart';
13 -import 'package:cake_wallet/store/settings_store.dart';
6 +import 'package:cake_wallet/generated/i18n.dart';
7 +import 'package:cake_wallet/monero/monero.dart';
8 +import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
9 +import 'package:cake_wallet/store/app_store.dart';
10 import 'package:cake_wallet/store/dashboard/orders_store.dart';
11 +import 'package:cake_wallet/store/dashboard/trade_filter_store.dart';
12 +import 'package:cake_wallet/store/dashboard/trades_store.dart';
13 +import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart';
14 +import 'package:cake_wallet/store/settings_store.dart';
15 import 'package:cake_wallet/store/yat/yat_store.dart';
16 import 'package:cake_wallet/utils/mobx.dart';
17 +import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
18 +import 'package:cake_wallet/view_model/dashboard/anonpay_transaction_list_item.dart';
19 import 'package:cake_wallet/view_model/dashboard/balance_view_model.dart';
20 import 'package:cake_wallet/view_model/dashboard/filter_item.dart';
21 +import 'package:cake_wallet/view_model/dashboard/formatted_item_list.dart';
22 import 'package:cake_wallet/view_model/dashboard/order_list_item.dart';
23 import 'package:cake_wallet/view_model/dashboard/trade_list_item.dart';
24 import 'package:cake_wallet/view_model/dashboard/transaction_list_item.dart';
22 -import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
23 -import 'package:mobx/mobx.dart';
24 -import 'package:cw_core/wallet_base.dart';
25 +import 'package:cake_wallet/view_model/settings/sync_mode.dart';
26 +import 'package:cake_wallet/wallet_type_utils.dart';
27 +import 'package:cw_core/balance.dart';
28 import 'package:cw_core/sync_status.dart';
29 +import 'package:cw_core/transaction_history.dart';
30 +import 'package:cw_core/transaction_info.dart';
31 +import 'package:cw_core/wallet_base.dart';
32 import 'package:cw_core/wallet_type.dart';
27 -import 'package:cake_wallet/store/app_store.dart';
28 -import 'package:cake_wallet/generated/i18n.dart';
29 -import 'package:cake_wallet/store/dashboard/trades_store.dart';
30 -import 'package:cake_wallet/store/dashboard/trade_filter_store.dart';
31 -import 'package:cake_wallet/store/dashboard/transaction_filter_store.dart';
32 -import 'package:cake_wallet/view_model/dashboard/formatted_item_list.dart';
33 -import 'package:cake_wallet/monero/monero.dart';
33 +import 'package:mobx/mobx.dart';
34
35 part 'dashboard_view_model.g.dart';
36
@@ -47,69 +47,69 @@ abstract class DashboardViewModelBase with Store {
47 required this.yatStore,
48 required this.ordersStore,
49 required this.anonpayTransactionsStore})
50 - : hasSellAction = false,
51 - hasBuyAction = false,
52 - hasExchangeAction = false,
53 - isShowFirstYatIntroduction = false,
54 - isShowSecondYatIntroduction = false,
55 - isShowThirdYatIntroduction = false,
56 - filterItems = {
57 - S.current.transactions: [
58 - FilterItem(
59 - value: () => transactionFilterStore.displayAll,
60 - caption: S.current.all_transactions,
61 - onChanged: transactionFilterStore.toggleAll),
62 - FilterItem(
63 - value: () => transactionFilterStore.displayIncoming,
64 - caption: S.current.incoming,
65 - onChanged:transactionFilterStore.toggleIncoming),
66 - FilterItem(
67 - value: () => transactionFilterStore.displayOutgoing,
68 - caption: S.current.outgoing,
69 - onChanged: transactionFilterStore.toggleOutgoing),
70 - // FilterItem(
71 - // value: () => false,
72 - // caption: S.current.transactions_by_date,
73 - // onChanged: null),
74 - ],
75 - S.current.trades: [
76 - FilterItem(
77 - value: () => tradeFilterStore.displayAllTrades,
78 - caption: S.current.all_trades,
79 - onChanged: () => tradeFilterStore
80 - .toggleDisplayExchange(ExchangeProviderDescription.all)),
81 - FilterItem(
82 - value: () => tradeFilterStore.displayChangeNow,
83 - caption: ExchangeProviderDescription.changeNow.title,
84 - onChanged: () => tradeFilterStore
85 - .toggleDisplayExchange(ExchangeProviderDescription.changeNow)),
86 - FilterItem(
87 - value: () => tradeFilterStore.displaySideShift,
88 - caption: ExchangeProviderDescription.sideShift.title,
89 - onChanged: () => tradeFilterStore
90 - .toggleDisplayExchange(ExchangeProviderDescription.sideShift)),
91 - FilterItem(
92 - value: () => tradeFilterStore.displaySimpleSwap,
93 - caption: ExchangeProviderDescription.simpleSwap.title,
94 - onChanged: () => tradeFilterStore
95 - .toggleDisplayExchange(ExchangeProviderDescription.simpleSwap)),
96 - FilterItem(
97 - value: () => tradeFilterStore.displayTrocador,
98 - caption: ExchangeProviderDescription.trocador.title,
99 - onChanged: () => tradeFilterStore
100 - .toggleDisplayExchange(ExchangeProviderDescription.trocador)),
101 - FilterItem(
102 - value: () => tradeFilterStore.displayExolix,
103 - caption: ExchangeProviderDescription.exolix.title,
104 - onChanged: () => tradeFilterStore
105 - .toggleDisplayExchange(ExchangeProviderDescription.exolix)),
106 - ]
107 - },
108 - subname = '',
109 - name = appStore.wallet!.name,
110 - type = appStore.wallet!.type,
111 - transactions = ObservableList<TransactionListItem>(),
112 - wallet = appStore.wallet! {
50 + : hasSellAction = false,
51 + hasBuyAction = false,
52 + hasExchangeAction = false,
53 + isShowFirstYatIntroduction = false,
54 + isShowSecondYatIntroduction = false,
55 + isShowThirdYatIntroduction = false,
56 + filterItems = {
57 + S.current.transactions: [
58 + FilterItem(
59 + value: () => transactionFilterStore.displayAll,
60 + caption: S.current.all_transactions,
61 + onChanged: transactionFilterStore.toggleAll),
62 + FilterItem(
63 + value: () => transactionFilterStore.displayIncoming,
64 + caption: S.current.incoming,
65 + onChanged: transactionFilterStore.toggleIncoming),
66 + FilterItem(
67 + value: () => transactionFilterStore.displayOutgoing,
68 + caption: S.current.outgoing,
69 + onChanged: transactionFilterStore.toggleOutgoing),
70 + // FilterItem(
71 + // value: () => false,
72 + // caption: S.current.transactions_by_date,
73 + // onChanged: null),
74 + ],
75 + S.current.trades: [
76 + FilterItem(
77 + value: () => tradeFilterStore.displayAllTrades,
78 + caption: S.current.all_trades,
79 + onChanged: () =>
80 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.all)),
81 + FilterItem(
82 + value: () => tradeFilterStore.displayChangeNow,
83 + caption: ExchangeProviderDescription.changeNow.title,
84 + onChanged: () =>
85 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.changeNow)),
86 + FilterItem(
87 + value: () => tradeFilterStore.displaySideShift,
88 + caption: ExchangeProviderDescription.sideShift.title,
89 + onChanged: () =>
90 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.sideShift)),
91 + FilterItem(
92 + value: () => tradeFilterStore.displaySimpleSwap,
93 + caption: ExchangeProviderDescription.simpleSwap.title,
94 + onChanged: () =>
95 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.simpleSwap)),
96 + FilterItem(
97 + value: () => tradeFilterStore.displayTrocador,
98 + caption: ExchangeProviderDescription.trocador.title,
99 + onChanged: () =>
100 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.trocador)),
101 + FilterItem(
102 + value: () => tradeFilterStore.displayExolix,
103 + caption: ExchangeProviderDescription.exolix.title,
104 + onChanged: () =>
105 + tradeFilterStore.toggleDisplayExchange(ExchangeProviderDescription.exolix)),
106 + ]
107 + },
108 + subname = '',
109 + name = appStore.wallet!.name,
110 + type = appStore.wallet!.type,
111 + transactions = ObservableList<TransactionListItem>(),
112 + wallet = appStore.wallet! {
113 name = wallet.name;
114 type = wallet.type;
115 isShowFirstYatIntroduction = false;
@@ -222,9 +222,8 @@ abstract class DashboardViewModelBase with Store {
222 BalanceDisplayMode get balanceDisplayMode => appStore.settingsStore.balanceDisplayMode;
223
224 @computed
225 - bool get shouldShowMarketPlaceInDashboard {
226 - return appStore.settingsStore.shouldShowMarketPlaceInDashboard;
227 - }
225 + bool get shouldShowMarketPlaceInDashboard =>
226 + appStore.settingsStore.shouldShowMarketPlaceInDashboard;
227
228 @computed
229 List<TradeListItem> get trades =>
lib/view_model/dashboard/trade_list_item.dart
+4 -11
@@ -1,25 +1,18 @@
1 +import 'package:cake_wallet/entities/balance_display_mode.dart';
2 import 'package:cake_wallet/exchange/trade.dart';
3 import 'package:cake_wallet/store/settings_store.dart';
4 import 'package:cake_wallet/view_model/dashboard/action_list_item.dart';
4 -import 'package:cake_wallet/entities/balance_display_mode.dart';
5
6 class TradeListItem extends ActionListItem {
7 - TradeListItem({
8 - required this.trade,
9 - required this.settingsStore});
7 + TradeListItem({required this.trade, required this.settingsStore});
8
9 final Trade trade;
10 final SettingsStore settingsStore;
11
12 BalanceDisplayMode get displayMode => settingsStore.balanceDisplayMode;
13
16 - String get tradeFormattedAmount {
17 - return trade.amount != null
18 - ? displayMode == BalanceDisplayMode.hiddenBalance
19 - ? '---'
20 - : trade.amountFormatted()
21 - : trade.amount;
22 - }
14 + String get tradeFormattedAmount =>
15 + displayMode == BalanceDisplayMode.hiddenBalance ? '---' : trade.amountFormatted();
16
17 @override
18 DateTime get date => trade.createdAt!;
lib/view_model/exchange/exchange_view_model.dart
+1
@@ -491,6 +491,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with
491 final trade =
492 await provider.createTrade(request: request, isFixedRateMode: isFixedRateMode);
493 trade.walletId = wallet.id;
494 + trade.fromWalletAddress = wallet.walletAddresses.address;
495 tradesStore.setTrade(trade);
496 await trades.add(trade);
497 tradeState = TradeIsCreatedSuccessfully(trade: trade);
lib/view_model/wallet_keys_view_model.dart
+1 -2
@@ -1,4 +1,3 @@
1 -import 'package:cake_wallet/nano/nano.dart';
1 import 'package:cake_wallet/store/app_store.dart';
2 import 'package:cw_core/transaction_direction.dart';
3 import 'package:cw_core/transaction_info.dart';
@@ -194,7 +193,7 @@ abstract class WalletKeysViewModelBase with Store {
193
194 int _getRestoreHeightByTransactions(WalletType type, DateTime date) {
195 if (type == WalletType.monero) {
197 - return monero!.getHeigthByDate(date: date);
196 + return monero!.getHeightByDate(date: date);
197 } else if (type == WalletType.haven) {
198 return haven!.getHeightByDate(date: date);
199 }
tool/configure.dart
+1 -1
@@ -235,7 +235,7 @@ abstract class Monero {
235
236 String getSubaddressLabel(Object wallet, int accountIndex, int addressIndex);
237
238 - int getHeigthByDate({required DateTime date});
238 + int getHeightByDate({required DateTime date});
239 TransactionPriority getDefaultTransactionPriority();
240 TransactionPriority getMoneroTransactionPrioritySlow();
241 TransactionPriority getMoneroTransactionPriorityAutomatic();