dev
dart 161 lines 5.16 KB
Raw
1 import 'package:cw_core/account.dart';
2 import 'package:cw_core/payment_uris.dart';
3 import 'package:cw_core/subaddress.dart';
4 import 'package:cw_core/utils/print_verbose.dart';
5 import 'package:cw_core/wallet_addresses.dart';
6 import 'package:cw_core/wallet_info.dart';
7 import 'package:cw_wownero/api/subaddress_list.dart' as subaddress_list;
8 import 'package:cw_wownero/api/wallet.dart';
9 import 'package:cw_wownero/wownero_account_list.dart';
10 import 'package:cw_wownero/wownero_subaddress_list.dart';
11 import 'package:cw_wownero/wownero_transaction_history.dart';
12 import 'package:mobx/mobx.dart';
13
14 part 'wownero_wallet_addresses.g.dart';
15
16 class WowneroWalletAddresses = WowneroWalletAddressesBase with _$WowneroWalletAddresses;
17
18 abstract class WowneroWalletAddressesBase extends WalletAddresses with Store {
19 WowneroWalletAddressesBase(
20 WalletInfo walletInfo, WowneroTransactionHistory wowneroTransactionHistory)
21 : accountList = WowneroAccountList(),
22 _wowneroTransactionHistory = wowneroTransactionHistory,
23 subaddressList = WowneroSubaddressList(),
24 address = '',
25 super(walletInfo);
26
27 final WowneroTransactionHistory _wowneroTransactionHistory;
28 @override
29 @observable
30 String address;
31
32 @override
33 String get primaryAddress => getAddress(accountIndex: account?.id ?? 0, addressIndex: 0);
34
35 @override
36 String get latestAddress {
37 var addressIndex = subaddress_list.numSubaddresses(account?.id ?? 0) - 1;
38 var address = getAddress(accountIndex: account?.id ?? 0, addressIndex: addressIndex);
39 while (hiddenAddresses.contains(address)) {
40 addressIndex++;
41 address = getAddress(accountIndex: account?.id ?? 0, addressIndex: addressIndex);
42 }
43 return address;
44 }
45
46 @override
47 String get addressForExchange {
48 var addressIndex = subaddress_list.numSubaddresses(account?.id ?? 0) - 1;
49 var address = getAddress(accountIndex: account?.id ?? 0, addressIndex: addressIndex);
50 while (hiddenAddresses.contains(address) || manualAddresses.contains(address)) {
51 addressIndex++;
52 address = getAddress(accountIndex: account?.id ?? 0, addressIndex: addressIndex);
53 }
54 return address;
55 }
56
57 @observable
58 Account? account;
59
60 @observable
61 Subaddress? subaddress;
62
63 WowneroSubaddressList subaddressList;
64
65 WowneroAccountList accountList;
66
67 @override
68 Set<String> usedAddresses = Set();
69
70 @override
71 Future<void> init() async {
72 accountList.update();
73 account = accountList.accounts.isEmpty
74 ? Account(id: 0, label: "Primary address")
75 : accountList.accounts.first;
76 updateSubaddressList(accountIndex: account?.id ?? 0);
77 await updateAddressesInBox();
78 }
79
80 @override
81 Future<void> updateAddressesInBox() async {
82 try {
83 final _subaddressList = WowneroSubaddressList();
84
85 addressesMap.clear();
86 addressInfos.clear();
87
88 accountList.accounts.forEach((account) {
89 _subaddressList.update(accountIndex: account.id);
90 _subaddressList.subaddresses.forEach((subaddress) {
91 addressesMap[subaddress.address] = subaddress.label;
92 addressInfos[account.id] ??= [];
93 addressInfos[account.id]?.add(WalletInfoAddressInfo(
94 walletInfoId: walletInfo.internalId,
95 mapKey: account.id,
96 accountIndex: account.id,
97 address: subaddress.address,
98 label: subaddress.label));
99 });
100 });
101
102 await saveAddressesInBox();
103 } catch (e) {
104 printV(e.toString());
105 }
106 }
107
108 bool validate() {
109 accountList.update();
110 final accountListLength = accountList.accounts.length;
111
112 if (accountListLength <= 0) {
113 return false;
114 }
115
116 subaddressList.update(accountIndex: accountList.accounts.first.id);
117 final subaddressListLength = subaddressList.subaddresses.length;
118
119 if (subaddressListLength <= 0) {
120 return false;
121 }
122
123 return true;
124 }
125
126 void updateSubaddressList({required int accountIndex}) {
127 subaddressList.update(accountIndex: accountIndex);
128 address = subaddressList.subaddresses.isNotEmpty
129 ? subaddressList.subaddresses.first.address
130 : getAddress();
131 }
132
133 Future<void> updateUsedSubaddress() async {
134 final transactions = _wowneroTransactionHistory.transactions.values.toList();
135
136 transactions.forEach((element) {
137 final accountIndex = element.accountIndex;
138 final addressIndex = element.addressIndex;
139 usedAddresses.add(getAddress(accountIndex: accountIndex, addressIndex: addressIndex));
140 });
141 }
142
143 Future<void> updateUnusedSubaddress(
144 {required int accountIndex, required String defaultLabel}) async {
145 await subaddressList.updateWithAutoGenerate(
146 accountIndex: accountIndex,
147 defaultLabel: defaultLabel,
148 usedAddresses: usedAddresses.toList());
149 subaddress = (subaddressList.subaddresses.isEmpty)
150 ? Subaddress(id: 0, address: address, label: defaultLabel, balance: '0', txCount: 0)
151 : subaddressList.subaddresses.last;
152 address = subaddress!.address;
153 }
154
155 @override
156 bool containsAddress(String address) =>
157 addressInfos[account?.id ?? 0]?.any((it) => it.address == address) ?? false;
158
159 @override
160 PaymentURI getPaymentUri(String amount) => WowneroURI(address: address, amount: amount);
161 }