dev
dart 150 lines 4.62 KB
Raw
1 import 'package:cw_wownero/api/account_list.dart';
2 import 'package:cw_wownero/api/transaction_history.dart';
3 import 'package:cw_wownero/api/wallet.dart';
4 import 'package:monero/wownero.dart' as wownero;
5
6 bool isUpdating = false;
7
8 class SubaddressInfoMetadata {
9 SubaddressInfoMetadata({
10 required this.accountIndex,
11 });
12 int accountIndex;
13 }
14
15 SubaddressInfoMetadata? subaddress = null;
16
17 void refreshSubaddresses({required int accountIndex}) {
18 try {
19 isUpdating = true;
20 subaddress = SubaddressInfoMetadata(accountIndex: accountIndex);
21 isUpdating = false;
22 } catch (e) {
23 isUpdating = false;
24 rethrow;
25 }
26 }
27
28 class Subaddress {
29 Subaddress({
30 required this.addressIndex,
31 required this.accountIndex,
32 required this.txCount,
33 required this.received,
34 });
35 late String address = getAddress(
36 accountIndex: accountIndex,
37 addressIndex: addressIndex,
38 );
39 final int addressIndex;
40 final int accountIndex;
41 String get label => wownero.Wallet_getSubaddressLabel(wptr!,
42 accountIndex: accountIndex, addressIndex: addressIndex);
43 final int txCount;
44 final int received;
45 }
46
47 class TinyTransactionDetails {
48 TinyTransactionDetails({
49 required this.address,
50 required this.amount,
51 });
52 final List<String> address;
53 final int amount;
54 }
55
56 int lastWptr = 0;
57 int lastTxCount = 0;
58 List<TinyTransactionDetails> ttDetails = [];
59
60 List<Subaddress> getAllSubaddresses() {
61 txhistory = wownero.Wallet_history(wptr!);
62 final txCount = wownero.TransactionHistory_count(txhistory!);
63 if (lastTxCount != txCount && lastWptr != wptr!.address) {
64 final List<TinyTransactionDetails> newttDetails = [];
65 lastTxCount = txCount;
66 lastWptr = wptr!.address;
67 for (var i = 0; i < txCount; i++) {
68 final tx = wownero.TransactionHistory_transaction(txhistory!, index: i);
69 final subaddrs = wownero.TransactionInfo_subaddrIndex(tx).split(",");
70 final account = wownero.TransactionInfo_subaddrAccount(tx);
71 newttDetails.add(TinyTransactionDetails(
72 address: List.generate(
73 subaddrs.length,
74 (index) => getAddress(
75 accountIndex: account, addressIndex: int.tryParse(subaddrs[index]) ?? 0)),
76 amount: wownero.TransactionInfo_amount(tx),
77 ));
78 }
79 ttDetails.clear();
80 ttDetails.addAll(newttDetails);
81 }
82 final size = wownero.Wallet_numSubaddresses(wptr!, accountIndex: subaddress!.accountIndex);
83 final list = List.generate(size, (index) {
84 final ttDetailsLocal = ttDetails.where((element) {
85 final address = getAddress(
86 accountIndex: subaddress!.accountIndex,
87 addressIndex: index,
88 );
89 if (address == element.address) return true;
90 return false;
91 }).toList();
92 int received = 0;
93 for (var i = 0; i < ttDetailsLocal.length; i++) {
94 received += ttDetailsLocal[i].amount;
95 }
96 return Subaddress(
97 accountIndex: subaddress!.accountIndex,
98 addressIndex: index,
99 received: received,
100 txCount: ttDetailsLocal.length,
101 );
102 }).reversed.toList();
103 if (list.isEmpty) {
104 list.add(Subaddress(
105 addressIndex: 0, accountIndex: subaddress!.accountIndex, txCount: 0, received: 0));
106 }
107 return list;
108 }
109
110 void addSubaddressSync({required int accountIndex, required String label}) {
111 wownero.Wallet_addSubaddress(wptr!, accountIndex: accountIndex, label: label);
112 refreshSubaddresses(accountIndex: accountIndex);
113 }
114
115 int numSubaddresses(int subaccountIndex) {
116 return wownero.Wallet_numSubaddresses(wptr!, accountIndex: subaccountIndex);
117 }
118
119 void setLabelForSubaddressSync(
120 {required int accountIndex, required int addressIndex, required String label}) {
121 wownero.Wallet_setSubaddressLabel(wptr!,
122 accountIndex: accountIndex, addressIndex: addressIndex, label: label);
123 }
124
125 void _addSubaddress(Map<String, dynamic> args) {
126 final label = args['label'] as String;
127 final accountIndex = args['accountIndex'] as int;
128
129 addSubaddressSync(accountIndex: accountIndex, label: label);
130 }
131
132 void _setLabelForSubaddress(Map<String, dynamic> args) {
133 final label = args['label'] as String;
134 final accountIndex = args['accountIndex'] as int;
135 final addressIndex = args['addressIndex'] as int;
136
137 setLabelForSubaddressSync(accountIndex: accountIndex, addressIndex: addressIndex, label: label);
138 }
139
140 Future<void> addSubaddress({required int accountIndex, required String label}) async {
141 _addSubaddress({'accountIndex': accountIndex, 'label': label});
142 await store();
143 }
144
145 Future<void> setLabelForSubaddress(
146 {required int accountIndex, required int addressIndex, required String label}) async {
147 _setLabelForSubaddress(
148 {'accountIndex': accountIndex, 'addressIndex': addressIndex, 'label': label});
149 await store();
150 }