Monero stability and cleanup (#1572)
* migrate monero.dart from it's own repository to monero_c * show errors when invalid monero_c library is being used * Delete unused code * Delete unused code * Fix potential bug causing missing Polyseeds and tx-keys; Add Waring * Remove unused wownero-code * bump monero_c commit --------- Co-authored-by: Czarek Nakamoto <cyjan@mrcyjanek.net> Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
Konstantin Ullrich committed
Aug 9, 2024 at 21:15 UTC
8e7233b5c39faf19775989437649125b7563450d
41 files changed
+279
-3993
cw_core/lib/monero_wallet_utils.dart
+3
-2
@@ -79,6 +79,7 @@ Future<bool> backupWalletFilesExists(String name) async {
79
backupAddressListFile.existsSync();
80
}
81
82
+// WARNING: Transaction keys and your Polyseed CANNOT be recovered if this file is deleted
83
Future<void> removeCache(String name) async {
84
final path = await pathForWallet(name: name, type: WalletType.monero);
85
final cacheFile = File(path);
@@ -92,8 +93,8 @@ Future<void> restoreOrResetWalletFiles(String name) async {
93
final backupsExists = await backupWalletFilesExists(name);
94
95
if (backupsExists) {
96
+ await removeCache(name);
97
+
98
await restoreWalletFiles(name);
99
}
97
-
98
- removeCache(name);
100
}
cw_monero/lib/api/exceptions/connection_to_node_exception.dart
deleted
-5
@@ -1,5 +0,0 @@
1
-class ConnectionToNodeException implements Exception {
2
- ConnectionToNodeException({required this.message});
3
-
4
- final String message;
5
-}
\ No newline at end of file
cw_monero/lib/api/structs/account_row.dart
deleted
-12
@@ -1,12 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class AccountRow extends Struct {
5
- @Int64()
6
- external int id;
7
-
8
- external Pointer<Utf8> label;
9
-
10
- String getLabel() => label.toDartString();
11
- int getId() => id;
12
-}
cw_monero/lib/api/structs/coins_info_row.dart
deleted
-73
@@ -1,73 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class CoinsInfoRow extends Struct {
5
- @Int64()
6
- external int blockHeight;
7
-
8
- external Pointer<Utf8> hash;
9
-
10
- @Uint64()
11
- external int internalOutputIndex;
12
-
13
- @Uint64()
14
- external int globalOutputIndex;
15
-
16
- @Int8()
17
- external int spent;
18
-
19
- @Int8()
20
- external int frozen;
21
-
22
- @Uint64()
23
- external int spentHeight;
24
-
25
- @Uint64()
26
- external int amount;
27
-
28
- @Int8()
29
- external int rct;
30
-
31
- @Int8()
32
- external int keyImageKnown;
33
-
34
- @Uint64()
35
- external int pkIndex;
36
-
37
- @Uint32()
38
- external int subaddrIndex;
39
-
40
- @Uint32()
41
- external int subaddrAccount;
42
-
43
- external Pointer<Utf8> address;
44
-
45
- external Pointer<Utf8> addressLabel;
46
-
47
- external Pointer<Utf8> keyImage;
48
-
49
- @Uint64()
50
- external int unlockTime;
51
-
52
- @Int8()
53
- external int unlocked;
54
-
55
- external Pointer<Utf8> pubKey;
56
-
57
- @Int8()
58
- external int coinbase;
59
-
60
- external Pointer<Utf8> description;
61
-
62
- String getHash() => hash.toDartString();
63
-
64
- String getAddress() => address.toDartString();
65
-
66
- String getAddressLabel() => addressLabel.toDartString();
67
-
68
- String getKeyImage() => keyImage.toDartString();
69
-
70
- String getPubKey() => pubKey.toDartString();
71
-
72
- String getDescription() => description.toDartString();
73
-}
cw_monero/lib/api/structs/subaddress_row.dart
deleted
-15
@@ -1,15 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class SubaddressRow extends Struct {
5
- @Int64()
6
- external int id;
7
-
8
- external Pointer<Utf8> address;
9
-
10
- external Pointer<Utf8> label;
11
-
12
- String getLabel() => label.toDartString();
13
- String getAddress() => address.toDartString();
14
- int getId() => id;
15
-}
\ No newline at end of file
cw_monero/lib/api/structs/transaction_info_row.dart
deleted
-41
@@ -1,41 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class TransactionInfoRow extends Struct {
5
- @Uint64()
6
- external int amount;
7
-
8
- @Uint64()
9
- external int fee;
10
-
11
- @Uint64()
12
- external int blockHeight;
13
-
14
- @Uint64()
15
- external int confirmations;
16
-
17
- @Uint32()
18
- external int subaddrAccount;
19
-
20
- @Int8()
21
- external int direction;
22
-
23
- @Int8()
24
- external int isPending;
25
-
26
- @Uint32()
27
- external int subaddrIndex;
28
-
29
- external Pointer<Utf8> hash;
30
-
31
- external Pointer<Utf8> paymentId;
32
-
33
- @Int64()
34
- external int datetime;
35
-
36
- int getDatetime() => datetime;
37
- int getAmount() => amount >= 0 ? amount : amount * -1;
38
- bool getIsPending() => isPending != 0;
39
- String getHash() => hash.toDartString();
40
- String getPaymentId() => paymentId.toDartString();
41
-}
cw_monero/lib/api/structs/ut8_box.dart
deleted
-8
@@ -1,8 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class Utf8Box extends Struct {
5
- external Pointer<Utf8> value;
6
-
7
- String getValue() => value.toDartString();
8
-}
cw_monero/lib/api/transaction_history.dart
+2
-3
@@ -1,4 +1,3 @@
1
-
1
import 'dart:ffi';
2
import 'dart:isolate';
3
@@ -288,7 +287,7 @@ class Transaction {
287
};
288
}
289
291
- // S finalubAddress? subAddress;
290
+ // final SubAddress? subAddress;
291
// List<Transfer> transfers = [];
292
// final int txIndex;
293
final monero.TransactionInfo txInfo;
@@ -324,4 +323,4 @@ class Transaction {
323
required this.key,
324
required this.txInfo
325
});
327
-}
\ No newline at end of file
326
+}
cw_monero/lib/api/wallet_manager.dart
+35
@@ -1,4 +1,5 @@
1
import 'dart:ffi';
2
+import 'dart:io';
3
import 'dart:isolate';
4
5
import 'package:cw_monero/api/account_list.dart';
@@ -8,8 +9,42 @@ import 'package:cw_monero/api/exceptions/wallet_restore_from_keys_exception.dart
9
import 'package:cw_monero/api/exceptions/wallet_restore_from_seed_exception.dart';
10
import 'package:cw_monero/api/transaction_history.dart';
11
import 'package:cw_monero/api/wallet.dart';
12
+import 'package:flutter/foundation.dart';
13
import 'package:monero/monero.dart' as monero;
14
15
+class MoneroCException implements Exception {
16
+ final String message;
17
+
18
+ MoneroCException(this.message);
19
+
20
+ @override
21
+ String toString() {
22
+ return message;
23
+ }
24
+}
25
+
26
+void checkIfMoneroCIsFine() {
27
+ final cppCsCpp = monero.MONERO_checksum_wallet2_api_c_cpp();
28
+ final cppCsH = monero.MONERO_checksum_wallet2_api_c_h();
29
+ final cppCsExp = monero.MONERO_checksum_wallet2_api_c_exp();
30
+
31
+ final dartCsCpp = monero.wallet2_api_c_cpp_sha256;
32
+ final dartCsH = monero.wallet2_api_c_h_sha256;
33
+ final dartCsExp = monero.wallet2_api_c_exp_sha256;
34
+
35
+ if (cppCsCpp != dartCsCpp) {
36
+ throw MoneroCException("monero_c and monero.dart cpp wrapper code mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsCpp'\ndart: '$dartCsCpp'");
37
+ }
38
+
39
+ if (cppCsH != dartCsH) {
40
+ throw MoneroCException("monero_c and monero.dart cpp wrapper header mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsH'\ndart: '$dartCsH'");
41
+ }
42
+
43
+ if (cppCsExp != dartCsExp && (Platform.isIOS || Platform.isMacOS)) {
44
+ throw MoneroCException("monero_c and monero.dart wrapper export list mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsExp'\ndart: '$dartCsExp'");
45
+ }
46
+}
47
+
48
monero.WalletManager? _wmPtr;
49
final monero.WalletManager wmPtr = Pointer.fromAddress((() {
50
try {
cw_monero/lib/cw_monero.dart
deleted
-8
@@ -1,8 +0,0 @@
1
-
2
-import 'cw_monero_platform_interface.dart';
3
-
4
-class CwMonero {
5
- Future<String?> getPlatformVersion() {
6
- return CwMoneroPlatform.instance.getPlatformVersion();
7
- }
8
-}
cw_monero/lib/cw_monero_method_channel.dart
deleted
-17
@@ -1,17 +0,0 @@
1
-import 'package:flutter/foundation.dart';
2
-import 'package:flutter/services.dart';
3
-
4
-import 'cw_monero_platform_interface.dart';
5
-
6
-/// An implementation of [CwMoneroPlatform] that uses method channels.
7
-class MethodChannelCwMonero extends CwMoneroPlatform {
8
- /// The method channel used to interact with the native platform.
9
- @visibleForTesting
10
- final methodChannel = const MethodChannel('cw_monero');
11
-
12
- @override
13
- Future<String?> getPlatformVersion() async {
14
- final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
15
- return version;
16
- }
17
-}
cw_monero/lib/cw_monero_platform_interface.dart
deleted
-29
@@ -1,29 +0,0 @@
1
-import 'package:plugin_platform_interface/plugin_platform_interface.dart';
2
-
3
-import 'cw_monero_method_channel.dart';
4
-
5
-abstract class CwMoneroPlatform extends PlatformInterface {
6
- /// Constructs a CwMoneroPlatform.
7
- CwMoneroPlatform() : super(token: _token);
8
-
9
- static final Object _token = Object();
10
-
11
- static CwMoneroPlatform _instance = MethodChannelCwMonero();
12
-
13
- /// The default instance of [CwMoneroPlatform] to use.
14
- ///
15
- /// Defaults to [MethodChannelCwMonero].
16
- static CwMoneroPlatform get instance => _instance;
17
-
18
- /// Platform-specific implementations should set this with their own
19
- /// platform-specific class that extends [CwMoneroPlatform] when
20
- /// they register themselves.
21
- static set instance(CwMoneroPlatform instance) {
22
- PlatformInterface.verifyToken(instance, _token);
23
- _instance = instance;
24
- }
25
-
26
- Future<String?> getPlatformVersion() {
27
- throw UnimplementedError('platformVersion() has not been implemented.');
28
- }
29
-}
cw_monero/lib/monero_transaction_info.dart
-23
@@ -1,8 +1,5 @@
1
-import 'dart:math';
2
-
1
import 'package:cw_core/transaction_info.dart';
2
import 'package:cw_core/monero_amount_format.dart';
5
-import 'package:cw_monero/api/structs/transaction_info_row.dart';
3
import 'package:cw_core/parseBoolFromString.dart';
4
import 'package:cw_core/transaction_direction.dart';
5
import 'package:cw_core/format_amount.dart';
@@ -37,26 +34,6 @@ class MoneroTransactionInfo extends TransactionInfo {
34
};
35
}
36
40
- MoneroTransactionInfo.fromRow(TransactionInfoRow row)
41
- : id = "${row.getHash()}_${row.getAmount()}_${row.subaddrAccount}_${row.subaddrIndex}",
42
- txHash = row.getHash(),
43
- height = row.blockHeight,
44
- direction = parseTransactionDirectionFromInt(row.direction),
45
- date = DateTime.fromMillisecondsSinceEpoch(row.getDatetime() * 1000),
46
- isPending = row.isPending != 0,
47
- amount = row.getAmount(),
48
- accountIndex = row.subaddrAccount,
49
- addressIndex = row.subaddrIndex,
50
- confirmations = row.confirmations,
51
- key = getTxKey(row.getHash()),
52
- fee = row.fee {
53
- additionalInfo = <String, dynamic>{
54
- 'key': key,
55
- 'accountIndex': accountIndex,
56
- 'addressIndex': addressIndex
57
- };
58
- }
59
-
37
final String id;
38
final String txHash;
39
final int height;
cw_monero/lib/monero_unspent.dart
-9
@@ -1,5 +1,4 @@
1
import 'package:cw_core/unspent_transaction_output.dart';
2
-import 'package:cw_monero/api/structs/coins_info_row.dart';
2
3
class MoneroUnspent extends Unspent {
4
MoneroUnspent(
@@ -8,13 +7,5 @@ class MoneroUnspent extends Unspent {
7
this.isFrozen = isFrozen;
8
}
9
11
- factory MoneroUnspent.fromCoinsInfoRow(CoinsInfoRow coinsInfoRow) => MoneroUnspent(
12
- coinsInfoRow.getAddress(),
13
- coinsInfoRow.getHash(),
14
- coinsInfoRow.getKeyImage(),
15
- coinsInfoRow.amount,
16
- coinsInfoRow.frozen == 1,
17
- coinsInfoRow.unlocked == 1);
18
-
10
final bool isUnlocked;
11
}
cw_monero/lib/monero_wallet.dart
+9
-15
@@ -109,9 +109,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
109
110
@override
111
String get seed => monero_wallet.getSeed();
112
- String seedLegacy(String? language) {
113
- return monero_wallet.getSeedLegacy(language);
114
- }
112
+ String seedLegacy(String? language) => monero_wallet.getSeedLegacy(language);
113
114
@override
115
MoneroWalletKeys get keys => MoneroWalletKeys(
@@ -190,12 +188,12 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
188
@override
189
Future<void> startSync() async {
190
try {
193
- _setInitialHeight();
191
+ _assertInitialHeight();
192
} catch (_) {
193
// our restore height wasn't correct, so lets see if using the backup works:
194
try {
197
- await resetCache(name);
198
- _setInitialHeight();
195
+ await resetCache(name); // Resetting the cache removes the TX Keys and Polyseed
196
+ _assertInitialHeight();
197
} catch (e) {
198
// we still couldn't get a valid height from the backup?!:
199
// try to use the date instead:
@@ -635,18 +633,14 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
633
_listener = monero_wallet.setListeners(_onNewBlock, _onNewTransaction);
634
}
635
638
- // check if the height is correct:
639
- void _setInitialHeight() {
640
- if (walletInfo.isRecovery) {
641
- return;
642
- }
636
+ /// Asserts the current height to be above [MIN_RESTORE_HEIGHT]
637
+ void _assertInitialHeight() {
638
+ if (walletInfo.isRecovery) return;
639
640
final height = monero_wallet.getCurrentHeight();
641
646
- if (height > MIN_RESTORE_HEIGHT) {
647
- // the restore height is probably correct, so we do nothing:
648
- return;
649
- }
642
+ // the restore height is probably correct, so we do nothing:
643
+ if (height > MIN_RESTORE_HEIGHT) return;
644
645
throw Exception("height isn't > $MIN_RESTORE_HEIGHT!");
646
}
cw_monero/lib/mymonero.dart
deleted
-1689
@@ -1,1689 +0,0 @@
1
-const prefixLength = 3;
2
-
3
-String swapEndianBytes(String original) {
4
- if (original.length != 8) {
5
- return '';
6
- }
7
-
8
- return original[6] +
9
- original[7] +
10
- original[4] +
11
- original[5] +
12
- original[2] +
13
- original[3] +
14
- original[0] +
15
- original[1];
16
-}
17
-
18
-List<String> tructWords(List<String> wordSet) {
19
- final start = 0;
20
- final end = prefixLength;
21
-
22
- return wordSet.map((word) => word.substring(start, end)).toList();
23
-}
24
-
25
-String mnemonicDecode(String seed) {
26
- final n = englistWordSet.length;
27
- var out = '';
28
- var wlist = seed.split(' ');
29
- wlist.removeLast();
30
-
31
- for (var i = 0; i < wlist.length; i += 3) {
32
- final w1 =
33
- tructWords(englistWordSet).indexOf(wlist[i].substring(0, prefixLength));
34
- final w2 = tructWords(englistWordSet)
35
- .indexOf(wlist[i + 1].substring(0, prefixLength));
36
- final w3 = tructWords(englistWordSet)
37
- .indexOf(wlist[i + 2].substring(0, prefixLength));
38
-
39
- if (w1 == -1 || w2 == -1 || w3 == -1) {
40
- print("invalid word in mnemonic");
41
- return '';
42
- }
43
-
44
- final x = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n);
45
-
46
- if (x % n != w1) {
47
- print("Something went wrong when decoding your private key, please try again");
48
- return '';
49
- }
50
-
51
- final _res = '0000000' + x.toRadixString(16);
52
- final start = _res.length - 8;
53
- final end = _res.length;
54
- final res = _res.substring(start, end);
55
-
56
- out += swapEndianBytes(res);
57
- }
58
-
59
- return out;
60
-}
61
-
62
-final englistWordSet = [
63
- "abbey",
64
- "abducts",
65
- "ability",
66
- "ablaze",
67
- "abnormal",
68
- "abort",
69
- "abrasive",
70
- "absorb",
71
- "abyss",
72
- "academy",
73
- "aces",
74
- "aching",
75
- "acidic",
76
- "acoustic",
77
- "acquire",
78
- "across",
79
- "actress",
80
- "acumen",
81
- "adapt",
82
- "addicted",
83
- "adept",
84
- "adhesive",
85
- "adjust",
86
- "adopt",
87
- "adrenalin",
88
- "adult",
89
- "adventure",
90
- "aerial",
91
- "afar",
92
- "affair",
93
- "afield",
94
- "afloat",
95
- "afoot",
96
- "afraid",
97
- "after",
98
- "against",
99
- "agenda",
100
- "aggravate",
101
- "agile",
102
- "aglow",
103
- "agnostic",
104
- "agony",
105
- "agreed",
106
- "ahead",
107
- "aided",
108
- "ailments",
109
- "aimless",
110
- "airport",
111
- "aisle",
112
- "ajar",
113
- "akin",
114
- "alarms",
115
- "album",
116
- "alchemy",
117
- "alerts",
118
- "algebra",
119
- "alkaline",
120
- "alley",
121
- "almost",
122
- "aloof",
123
- "alpine",
124
- "already",
125
- "also",
126
- "altitude",
127
- "alumni",
128
- "always",
129
- "amaze",
130
- "ambush",
131
- "amended",
132
- "amidst",
133
- "ammo",
134
- "amnesty",
135
- "among",
136
- "amply",
137
- "amused",
138
- "anchor",
139
- "android",
140
- "anecdote",
141
- "angled",
142
- "ankle",
143
- "annoyed",
144
- "answers",
145
- "antics",
146
- "anvil",
147
- "anxiety",
148
- "anybody",
149
- "apart",
150
- "apex",
151
- "aphid",
152
- "aplomb",
153
- "apology",
154
- "apply",
155
- "apricot",
156
- "aptitude",
157
- "aquarium",
158
- "arbitrary",
159
- "archer",
160
- "ardent",
161
- "arena",
162
- "argue",
163
- "arises",
164
- "army",
165
- "around",
166
- "arrow",
167
- "arsenic",
168
- "artistic",
169
- "ascend",
170
- "ashtray",
171
- "aside",
172
- "asked",
173
- "asleep",
174
- "aspire",
175
- "assorted",
176
- "asylum",
177
- "athlete",
178
- "atlas",
179
- "atom",
180
- "atrium",
181
- "attire",
182
- "auburn",
183
- "auctions",
184
- "audio",
185
- "august",
186
- "aunt",
187
- "austere",
188
- "autumn",
189
- "avatar",
190
- "avidly",
191
- "avoid",
192
- "awakened",
193
- "awesome",
194
- "awful",
195
- "awkward",
196
- "awning",
197
- "awoken",
198
- "axes",
199
- "axis",
200
- "axle",
201
- "aztec",
202
- "azure",
203
- "baby",
204
- "bacon",
205
- "badge",
206
- "baffles",
207
- "bagpipe",
208
- "bailed",
209
- "bakery",
210
- "balding",
211
- "bamboo",
212
- "banjo",
213
- "baptism",
214
- "basin",
215
- "batch",
216
- "bawled",
217
- "bays",
218
- "because",
219
- "beer",
220
- "befit",
221
- "begun",
222
- "behind",
223
- "being",
224
- "below",
225
- "bemused",
226
- "benches",
227
- "berries",
228
- "bested",
229
- "betting",
230
- "bevel",
231
- "beware",
232
- "beyond",
233
- "bias",
234
- "bicycle",
235
- "bids",
236
- "bifocals",
237
- "biggest",
238
- "bikini",
239
- "bimonthly",
240
- "binocular",
241
- "biology",
242
- "biplane",
243
- "birth",
244
- "biscuit",
245
- "bite",
246
- "biweekly",
247
- "blender",
248
- "blip",
249
- "bluntly",
250
- "boat",
251
- "bobsled",
252
- "bodies",
253
- "bogeys",
254
- "boil",
255
- "boldly",
256
- "bomb",
257
- "border",
258
- "boss",
259
- "both",
260
- "bounced",
261
- "bovine",
262
- "bowling",
263
- "boxes",
264
- "boyfriend",
265
- "broken",
266
- "brunt",
267
- "bubble",
268
- "buckets",
269
- "budget",
270
- "buffet",
271
- "bugs",
272
- "building",
273
- "bulb",
274
- "bumper",
275
- "bunch",
276
- "business",
277
- "butter",
278
- "buying",
279
- "buzzer",
280
- "bygones",
281
- "byline",
282
- "bypass",
283
- "cabin",
284
- "cactus",
285
- "cadets",
286
- "cafe",
287
- "cage",
288
- "cajun",
289
- "cake",
290
- "calamity",
291
- "camp",
292
- "candy",
293
- "casket",
294
- "catch",
295
- "cause",
296
- "cavernous",
297
- "cease",
298
- "cedar",
299
- "ceiling",
300
- "cell",
301
- "cement",
302
- "cent",
303
- "certain",
304
- "chlorine",
305
- "chrome",
306
- "cider",
307
- "cigar",
308
- "cinema",
309
- "circle",
310
- "cistern",
311
- "citadel",
312
- "civilian",
313
- "claim",
314
- "click",
315
- "clue",
316
- "coal",
317
- "cobra",
318
- "cocoa",
319
- "code",
320
- "coexist",
321
- "coffee",
322
- "cogs",
323
- "cohesive",
324
- "coils",
325
- "colony",
326
- "comb",
327
- "cool",
328
- "copy",
329
- "corrode",
330
- "costume",
331
- "cottage",
332
- "cousin",
333
- "cowl",
334
- "criminal",
335
- "cube",
336
- "cucumber",
337
- "cuddled",
338
- "cuffs",
339
- "cuisine",
340
- "cunning",
341
- "cupcake",
342
- "custom",
343
- "cycling",
344
- "cylinder",
345
- "cynical",
346
- "dabbing",
347
- "dads",
348
- "daft",
349
- "dagger",
350
- "daily",
351
- "damp",
352
- "dangerous",
353
- "dapper",
354
- "darted",
355
- "dash",
356
- "dating",
357
- "dauntless",
358
- "dawn",
359
- "daytime",
360
- "dazed",
361
- "debut",
362
- "decay",
363
- "dedicated",
364
- "deepest",
365
- "deftly",
366
- "degrees",
367
- "dehydrate",
368
- "deity",
369
- "dejected",
370
- "delayed",
371
- "demonstrate",
372
- "dented",
373
- "deodorant",
374
- "depth",
375
- "desk",
376
- "devoid",
377
- "dewdrop",
378
- "dexterity",
379
- "dialect",
380
- "dice",
381
- "diet",
382
- "different",
383
- "digit",
384
- "dilute",
385
- "dime",
386
- "dinner",
387
- "diode",
388
- "diplomat",
389
- "directed",
390
- "distance",
391
- "ditch",
392
- "divers",
393
- "dizzy",
394
- "doctor",
395
- "dodge",
396
- "does",
397
- "dogs",
398
- "doing",
399
- "dolphin",
400
- "domestic",
401
- "donuts",
402
- "doorway",
403
- "dormant",
404
- "dosage",
405
- "dotted",
406
- "double",
407
- "dove",
408
- "down",
409
- "dozen",
410
- "dreams",
411
- "drinks",
412
- "drowning",
413
- "drunk",
414
- "drying",
415
- "dual",
416
- "dubbed",
417
- "duckling",
418
- "dude",
419
- "duets",
420
- "duke",
421
- "dullness",
422
- "dummy",
423
- "dunes",
424
- "duplex",
425
- "duration",
426
- "dusted",
427
- "duties",
428
- "dwarf",
429
- "dwelt",
430
- "dwindling",
431
- "dying",
432
- "dynamite",
433
- "dyslexic",
434
- "each",
435
- "eagle",
436
- "earth",
437
- "easy",
438
- "eating",
439
- "eavesdrop",
440
- "eccentric",
441
- "echo",
442
- "eclipse",
443
- "economics",
444
- "ecstatic",
445
- "eden",
446
- "edgy",
447
- "edited",
448
- "educated",
449
- "eels",
450
- "efficient",
451
- "eggs",
452
- "egotistic",
453
- "eight",
454
- "either",
455
- "eject",
456
- "elapse",
457
- "elbow",
458
- "eldest",
459
- "eleven",
460
- "elite",
461
- "elope",
462
- "else",
463
- "eluded",
464
- "emails",
465
- "ember",
466
- "emerge",
467
- "emit",
468
- "emotion",
469
- "empty",
470
- "emulate",
471
- "energy",
472
- "enforce",
473
- "enhanced",
474
- "enigma",
475
- "enjoy",
476
- "enlist",
477
- "enmity",
478
- "enough",
479
- "enraged",
480
- "ensign",
481
- "entrance",
482
- "envy",
483
- "epoxy",
484
- "equip",
485
- "erase",
486
- "erected",
487
- "erosion",
488
- "error",
489
- "eskimos",
490
- "espionage",
491
- "essential",
492
- "estate",
493
- "etched",
494
- "eternal",
495
- "ethics",
496
- "etiquette",
497
- "evaluate",
498
- "evenings",
499
- "evicted",
500
- "evolved",
501
- "examine",
502
- "excess",
503
- "exhale",
504
- "exit",
505
- "exotic",
506
- "exquisite",
507
- "extra",
508
- "exult",
509
- "fabrics",
510
- "factual",
511
- "fading",
512
- "fainted",
513
- "faked",
514
- "fall",
515
- "family",
516
- "fancy",
517
- "farming",
518
- "fatal",
519
- "faulty",
520
- "fawns",
521
- "faxed",
522
- "fazed",
523
- "feast",
524
- "february",
525
- "federal",
526
- "feel",
527
- "feline",
528
- "females",
529
- "fences",
530
- "ferry",
531
- "festival",
532
- "fetches",
533
- "fever",
534
- "fewest",
535
- "fiat",
536
- "fibula",
537
- "fictional",
538
- "fidget",
539
- "fierce",
540
- "fifteen",
541
- "fight",
542
- "films",
543
- "firm",
544
- "fishing",
545
- "fitting",
546
- "five",
547
- "fixate",
548
- "fizzle",
549
- "fleet",
550
- "flippant",
551
- "flying",
552
- "foamy",
553
- "focus",
554
- "foes",
555
- "foggy",
556
- "foiled",
557
- "folding",
558
- "fonts",
559
- "foolish",
560
- "fossil",
561
- "fountain",
562
- "fowls",
563
- "foxes",
564
- "foyer",
565
- "framed",
566
- "friendly",
567
- "frown",
568
- "fruit",
569
- "frying",
570
- "fudge",
571
- "fuel",
572
- "fugitive",
573
- "fully",
574
- "fuming",
575
- "fungal",
576
- "furnished",
577
- "fuselage",
578
- "future",
579
- "fuzzy",
580
- "gables",
581
- "gadget",
582
- "gags",
583
- "gained",
584
- "galaxy",
585
- "gambit",
586
- "gang",
587
- "gasp",
588
- "gather",
589
- "gauze",
590
- "gave",
591
- "gawk",
592
- "gaze",
593
- "gearbox",
594
- "gecko",
595
- "geek",
596
- "gels",
597
- "gemstone",
598
- "general",
599
- "geometry",
600
- "germs",
601
- "gesture",
602
- "getting",
603
- "geyser",
604
- "ghetto",
605
- "ghost",
606
- "giant",
607
- "giddy",
608
- "gifts",
609
- "gigantic",
610
- "gills",
611
- "gimmick",
612
- "ginger",
613
- "girth",
614
- "giving",
615
- "glass",
616
- "gleeful",
617
- "glide",
618
- "gnaw",
619
- "gnome",
620
- "goat",
621
- "goblet",
622
- "godfather",
623
- "goes",
624
- "goggles",
625
- "going",
626
- "goldfish",
627
- "gone",
628
- "goodbye",
629
- "gopher",
630
- "gorilla",
631
- "gossip",
632
- "gotten",
633
- "gourmet",
634
- "governing",
635
- "gown",
636
- "greater",
637
- "grunt",
638
- "guarded",
639
- "guest",
640
- "guide",
641
- "gulp",
642
- "gumball",
643
- "guru",
644
- "gusts",
645
- "gutter",
646
- "guys",
647
- "gymnast",
648
- "gypsy",
649
- "gyrate",
650
- "habitat",
651
- "hacksaw",
652
- "haggled",
653
- "hairy",
654
- "hamburger",
655
- "happens",
656
- "hashing",
657
- "hatchet",
658
- "haunted",
659
- "having",
660
- "hawk",
661
- "haystack",
662
- "hazard",
663
- "hectare",
664
- "hedgehog",
665
- "heels",
666
- "hefty",
667
- "height",
668
- "hemlock",
669
- "hence",
670
- "heron",
671
- "hesitate",
672
- "hexagon",
673
- "hickory",
674
- "hiding",
675
- "highway",
676
- "hijack",
677
- "hiker",
678
- "hills",
679
- "himself",
680
- "hinder",
681
- "hippo",
682
- "hire",
683
- "history",
684
- "hitched",
685
- "hive",
686
- "hoax",
687
- "hobby",
688
- "hockey",
689
- "hoisting",
690
- "hold",
691
- "honked",
692
- "hookup",
693
- "hope",
694
- "hornet",
695
- "hospital",
696
- "hotel",
697
- "hounded",
698
- "hover",
699
- "howls",
700
- "hubcaps",
701
- "huddle",
702
- "huge",
703
- "hull",
704
- "humid",
705
- "hunter",
706
- "hurried",
707
- "husband",
708
- "huts",
709
- "hybrid",
710
- "hydrogen",
711
- "hyper",
712
- "iceberg",
713
- "icing",
714
- "icon",
715
- "identity",
716
- "idiom",
717
- "idled",
718
- "idols",
719
- "igloo",
720
- "ignore",
721
- "iguana",
722
- "illness",
723
- "imagine",
724
- "imbalance",
725
- "imitate",
726
- "impel",
727
- "inactive",
728
- "inbound",
729
- "incur",
730
- "industrial",
731
- "inexact",
732
- "inflamed",
733
- "ingested",
734
- "initiate",
735
- "injury",
736
- "inkling",
737
- "inline",
738
- "inmate",
739
- "innocent",
740
- "inorganic",
741
- "input",
742
- "inquest",
743
- "inroads",
744
- "insult",
745
- "intended",
746
- "inundate",
747
- "invoke",
748
- "inwardly",
749
- "ionic",
750
- "irate",
751
- "iris",
752
- "irony",
753
- "irritate",
754
- "island",
755
- "isolated",
756
- "issued",
757
- "italics",
758
- "itches",
759
- "items",
760
- "itinerary",
761
- "itself",
762
- "ivory",
763
- "jabbed",
764
- "jackets",
765
- "jaded",
766
- "jagged",
767
- "jailed",
768
- "jamming",
769
- "january",
770
- "jargon",
771
- "jaunt",
772
- "javelin",
773
- "jaws",
774
- "jazz",
775
- "jeans",
776
- "jeers",
777
- "jellyfish",
778
- "jeopardy",
779
- "jerseys",
780
- "jester",
781
- "jetting",
782
- "jewels",
783
- "jigsaw",
784
- "jingle",
785
- "jittery",
786
- "jive",
787
- "jobs",
788
- "jockey",
789
- "jogger",
790
- "joining",
791
- "joking",
792
- "jolted",
793
- "jostle",
794
- "journal",
795
- "joyous",
796
- "jubilee",
797
- "judge",
798
- "juggled",
799
- "juicy",
800
- "jukebox",
801
- "july",
802
- "jump",
803
- "junk",
804
- "jury",
805
- "justice",
806
- "juvenile",
807
- "kangaroo",
808
- "karate",
809
- "keep",
810
- "kennel",
811
- "kept",
812
- "kernels",
813
- "kettle",
814
- "keyboard",
815
- "kickoff",
816
- "kidneys",
817
- "king",
818
- "kiosk",
819
- "kisses",
820
- "kitchens",
821
- "kiwi",
822
- "knapsack",
823
- "knee",
824
- "knife",
825
- "knowledge",
826
- "knuckle",
827
- "koala",
828
- "laboratory",
829
- "ladder",
830
- "lagoon",
831
- "lair",
832
- "lakes",
833
- "lamb",
834
- "language",
835
- "laptop",
836
- "large",
837
- "last",
838
- "later",
839
- "launching",
840
- "lava",
841
- "lawsuit",
842
- "layout",
843
- "lazy",
844
- "lectures",
845
- "ledge",
846
- "leech",
847
- "left",
848
- "legion",
849
- "leisure",
850
- "lemon",
851
- "lending",
852
- "leopard",
853
- "lesson",
854
- "lettuce",
855
- "lexicon",
856
- "liar",
857
- "library",
858
- "licks",
859
- "lids",
860
- "lied",
861
- "lifestyle",
862
- "light",
863
- "likewise",
864
- "lilac",
865
- "limits",
866
- "linen",
867
- "lion",
868
- "lipstick",
869
- "liquid",
870
- "listen",
871
- "lively",
872
- "loaded",
873
- "lobster",
874
- "locker",
875
- "lodge",
876
- "lofty",
877
- "logic",
878
- "loincloth",
879
- "long",
880
- "looking",
881
- "lopped",
882
- "lordship",
883
- "losing",
884
- "lottery",
885
- "loudly",
886
- "love",
887
- "lower",
888
- "loyal",
889
- "lucky",
890
- "luggage",
891
- "lukewarm",
892
- "lullaby",
893
- "lumber",
894
- "lunar",
895
- "lurk",
896
- "lush",
897
- "luxury",
898
- "lymph",
899
- "lynx",
900
- "lyrics",
901
- "macro",
902
- "madness",
903
- "magically",
904
- "mailed",
905
- "major",
906
- "makeup",
907
- "malady",
908
- "mammal",
909
- "maps",
910
- "masterful",
911
- "match",
912
- "maul",
913
- "maverick",
914
- "maximum",
915
- "mayor",
916
- "maze",
917
- "meant",
918
- "mechanic",
919
- "medicate",
920
- "meeting",
921
- "megabyte",
922
- "melting",
923
- "memoir",
924
- "menu",
925
- "merger",
926
- "mesh",
927
- "metro",
928
- "mews",
929
- "mice",
930
- "midst",
931
- "mighty",
932
- "mime",
933
- "mirror",
934
- "misery",
935
- "mittens",
936
- "mixture",
937
- "moat",
938
- "mobile",
939
- "mocked",
940
- "mohawk",
941
- "moisture",
942
- "molten",
943
- "moment",
944
- "money",
945
- "moon",
946
- "mops",
947
- "morsel",
948
- "mostly",
949
- "motherly",
950
- "mouth",
951
- "movement",
952
- "mowing",
953
- "much",
954
- "muddy",
955
- "muffin",
956
- "mugged",
957
- "mullet",
958
- "mumble",
959
- "mundane",
960
- "muppet",
961
- "mural",
962
- "musical",
963
- "muzzle",
964
- "myriad",
965
- "mystery",
966
- "myth",
967
- "nabbing",
968
- "nagged",
969
- "nail",
970
- "names",
971
- "nanny",
972
- "napkin",
973
- "narrate",
974
- "nasty",
975
- "natural",
976
- "nautical",
977
- "navy",
978
- "nearby",
979
- "necklace",
980
- "needed",
981
- "negative",
982
- "neither",
983
- "neon",
984
- "nephew",
985
- "nerves",
986
- "nestle",
987
- "network",
988
- "neutral",
989
- "never",
990
- "newt",
991
- "nexus",
992
- "nibs",
993
- "niche",
994
- "niece",
995
- "nifty",
996
- "nightly",
997
- "nimbly",
998
- "nineteen",
999
- "nirvana",
1000
- "nitrogen",
1001
- "nobody",
1002
- "nocturnal",
1003
- "nodes",
1004
- "noises",
1005
- "nomad",
1006
- "noodles",
1007
- "northern",
1008
- "nostril",
1009
- "noted",
1010
- "nouns",
1011
- "novelty",
1012
- "nowhere",
1013
- "nozzle",
1014
- "nuance",
1015
- "nucleus",
1016
- "nudged",
1017
- "nugget",
1018
- "nuisance",
1019
- "null",
1020
- "number",
1021
- "nuns",
1022
- "nurse",
1023
- "nutshell",
1024
- "nylon",
1025
- "oaks",
1026
- "oars",
1027
- "oasis",
1028
- "oatmeal",
1029
- "obedient",
1030
- "object",
1031
- "obliged",
1032
- "obnoxious",
1033
- "observant",
1034
- "obtains",
1035
- "obvious",
1036
- "occur",
1037
- "ocean",
1038
- "october",
1039
- "odds",
1040
- "odometer",
1041
- "offend",
1042
- "often",
1043
- "oilfield",
1044
- "ointment",
1045
- "okay",
1046
- "older",
1047
- "olive",
1048
- "olympics",
1049
- "omega",
1050
- "omission",
1051
- "omnibus",
1052
- "onboard",
1053
- "oncoming",
1054
- "oneself",
1055
- "ongoing",
1056
- "onion",
1057
- "online",
1058
- "onslaught",
1059
- "onto",
1060
- "onward",
1061
- "oozed",
1062
- "opacity",
1063
- "opened",
1064
- "opposite",
1065
- "optical",
1066
- "opus",
1067
- "orange",
1068
- "orbit",
1069
- "orchid",
1070
- "orders",
1071
- "organs",
1072
- "origin",
1073
- "ornament",
1074
- "orphans",
1075
- "oscar",
1076
- "ostrich",
1077
- "otherwise",
1078
- "otter",
1079
- "ouch",
1080
- "ought",
1081
- "ounce",
1082
- "ourselves",
1083
- "oust",
1084
- "outbreak",
1085
- "oval",
1086
- "oven",
1087
- "owed",
1088
- "owls",
1089
- "owner",
1090
- "oxidant",
1091
- "oxygen",
1092
- "oyster",
1093
- "ozone",
1094
- "pact",
1095
- "paddles",
1096
- "pager",
1097
- "pairing",
1098
- "palace",
1099
- "pamphlet",
1100
- "pancakes",
1101
- "paper",
1102
- "paradise",
1103
- "pastry",
1104
- "patio",
1105
- "pause",
1106
- "pavements",
1107
- "pawnshop",
1108
- "payment",
1109
- "peaches",
1110
- "pebbles",
1111
- "peculiar",
1112
- "pedantic",
1113
- "peeled",
1114
- "pegs",
1115
- "pelican",
1116
- "pencil",
1117
- "people",
1118
- "pepper",
1119
- "perfect",
1120
- "pests",
1121
- "petals",
1122
- "phase",
1123
- "pheasants",
1124
- "phone",
1125
- "phrases",
1126
- "physics",
1127
- "piano",
1128
- "picked",
1129
- "pierce",
1130
- "pigment",
1131
- "piloted",
1132
- "pimple",
1133
- "pinched",
1134
- "pioneer",
1135
- "pipeline",
1136
- "pirate",
1137
- "pistons",
1138
- "pitched",
1139
- "pivot",
1140
- "pixels",
1141
- "pizza",
1142
- "playful",
1143
- "pledge",
1144
- "pliers",
1145
- "plotting",
1146
- "plus",
1147
- "plywood",
1148
- "poaching",
1149
- "pockets",
1150
- "podcast",
1151
- "poetry",
1152
- "point",
1153
- "poker",
1154
- "polar",
1155
- "ponies",
1156
- "pool",
1157
- "popular",
1158
- "portents",
1159
- "possible",
1160
- "potato",
1161
- "pouch",
1162
- "poverty",
1163
- "powder",
1164
- "pram",
1165
- "present",
1166
- "pride",
1167
- "problems",
1168
- "pruned",
1169
- "prying",
1170
- "psychic",
1171
- "public",
1172
- "puck",
1173
- "puddle",
1174
- "puffin",
1175
- "pulp",
1176
- "pumpkins",
1177
- "punch",
1178
- "puppy",
1179
- "purged",
1180
- "push",
1181
- "putty",
1182
- "puzzled",
1183
- "pylons",
1184
- "pyramid",
1185
- "python",
1186
- "queen",
1187
- "quick",
1188
- "quote",
1189
- "rabbits",
1190
- "racetrack",
1191
- "radar",
1192
- "rafts",
1193
- "rage",
1194
- "railway",
1195
- "raking",
1196
- "rally",
1197
- "ramped",
1198
- "randomly",
1199
- "rapid",
1200
- "rarest",
1201
- "rash",
1202
- "rated",
1203
- "ravine",
1204
- "rays",
1205
- "razor",
1206
- "react",
1207
- "rebel",
1208
- "recipe",
1209
- "reduce",
1210
- "reef",
1211
- "refer",
1212
- "regular",
1213
- "reheat",
1214
- "reinvest",
1215
- "rejoices",
1216
- "rekindle",
1217
- "relic",
1218
- "remedy",
1219
- "renting",
1220
- "reorder",
1221
- "repent",
1222
- "request",
1223
- "reruns",
1224
- "rest",
1225
- "return",
1226
- "reunion",
1227
- "revamp",
1228
- "rewind",
1229
- "rhino",
1230
- "rhythm",
1231
- "ribbon",
1232
- "richly",
1233
- "ridges",
1234
- "rift",
1235
- "rigid",
1236
- "rims",
1237
- "ringing",
1238
- "riots",
1239
- "ripped",
1240
- "rising",
1241
- "ritual",
1242
- "river",
1243
- "roared",
1244
- "robot",
1245
- "rockets",
1246
- "rodent",
1247
- "rogue",
1248
- "roles",
1249
- "romance",
1250
- "roomy",
1251
- "roped",
1252
- "roster",
1253
- "rotate",
1254
- "rounded",
1255
- "rover",
1256
- "rowboat",
1257
- "royal",
1258
- "ruby",
1259
- "rudely",
1260
- "ruffled",
1261
- "rugged",
1262
- "ruined",
1263
- "ruling",
1264
- "rumble",
1265
- "runway",
1266
- "rural",
1267
- "rustled",
1268
- "ruthless",
1269
- "sabotage",
1270
- "sack",
1271
- "sadness",
1272
- "safety",
1273
- "saga",
1274
- "sailor",
1275
- "sake",
1276
- "salads",
1277
- "sample",
1278
- "sanity",
1279
- "sapling",
1280
- "sarcasm",
1281
- "sash",
1282
- "satin",
1283
- "saucepan",
1284
- "saved",
1285
- "sawmill",
1286
- "saxophone",
1287
- "sayings",
1288
- "scamper",
1289
- "scenic",
1290
- "school",
1291
- "science",
1292
- "scoop",
1293
- "scrub",
1294
- "scuba",
1295
- "seasons",
1296
- "second",
1297
- "sedan",
1298
- "seeded",
1299
- "segments",
1300
- "seismic",
1301
- "selfish",
1302
- "semifinal",
1303
- "sensible",
1304
- "september",
1305
- "sequence",
1306
- "serving",
1307
- "session",
1308
- "setup",
1309
- "seventh",
1310
- "sewage",
1311
- "shackles",
1312
- "shelter",
1313
- "shipped",
1314
- "shocking",
1315
- "shrugged",
1316
- "shuffled",
1317
- "shyness",
1318
- "siblings",
1319
- "sickness",
1320
- "sidekick",
1321
- "sieve",
1322
- "sifting",
1323
- "sighting",
1324
- "silk",
1325
- "simplest",
1326
- "sincerely",
1327
- "sipped",
1328
- "siren",
1329
- "situated",
1330
- "sixteen",
1331
- "sizes",
1332
- "skater",
1333
- "skew",
1334
- "skirting",
1335
- "skulls",
1336
- "skydive",
1337
- "slackens",
1338
- "sleepless",
1339
- "slid",
1340
- "slower",
1341
- "slug",
1342
- "smash",
1343
- "smelting",
1344
- "smidgen",
1345
- "smog",
1346
- "smuggled",
1347
- "snake",
1348
- "sneeze",
1349
- "sniff",
1350
- "snout",
1351
- "snug",
1352
- "soapy",
1353
- "sober",
1354
- "soccer",
1355
- "soda",
1356
- "software",
1357
- "soggy",
1358
- "soil",
1359
- "solved",
1360
- "somewhere",
1361
- "sonic",
1362
- "soothe",
1363
- "soprano",
1364
- "sorry",
1365
- "southern",
1366
- "sovereign",
1367
- "sowed",
1368
- "soya",
1369
- "space",
1370
- "speedy",
1371
- "sphere",
1372
- "spiders",
1373
- "splendid",
1374
- "spout",
1375
- "sprig",
1376
- "spud",
1377
- "spying",
1378
- "square",
1379
- "stacking",
1380
- "stellar",
1381
- "stick",
1382
- "stockpile",
1383
- "strained",
1384
- "stunning",
1385
- "stylishly",
1386
- "subtly",
1387
- "succeed",
1388
- "suddenly",
1389
- "suede",
1390
- "suffice",
1391
- "sugar",
1392
- "suitcase",
1393
- "sulking",
1394
- "summon",
1395
- "sunken",
1396
- "superior",
1397
- "surfer",
1398
- "sushi",
1399
- "suture",
1400
- "swagger",
1401
- "swept",
1402
- "swiftly",
1403
- "sword",
1404
- "swung",
1405
- "syllabus",
1406
- "symptoms",
1407
- "syndrome",
1408
- "syringe",
1409
- "system",
1410
- "taboo",
1411
- "tacit",
1412
- "tadpoles",
1413
- "tagged",
1414
- "tail",
1415
- "taken",
1416
- "talent",
1417
- "tamper",
1418
- "tanks",
1419
- "tapestry",
1420
- "tarnished",
1421
- "tasked",
1422
- "tattoo",
1423
- "taunts",
1424
- "tavern",
1425
- "tawny",
1426
- "taxi",
1427
- "teardrop",
1428
- "technical",
1429
- "tedious",
1430
- "teeming",
1431
- "tell",
1432
- "template",
1433
- "tender",
1434
- "tepid",
1435
- "tequila",
1436
- "terminal",
1437
- "testing",
1438
- "tether",
1439
- "textbook",
1440
- "thaw",
1441
- "theatrics",
1442
- "thirsty",
1443
- "thorn",
1444
- "threaten",
1445
- "thumbs",
1446
- "thwart",
1447
- "ticket",
1448
- "tidy",
1449
- "tiers",
1450
- "tiger",
1451
- "tilt",
1452
- "timber",
1453
- "tinted",
1454
- "tipsy",
1455
- "tirade",
1456
- "tissue",
1457
- "titans",
1458
- "toaster",
1459
- "tobacco",
1460
- "today",
1461
- "toenail",
1462
- "toffee",
1463
- "together",
1464
- "toilet",
1465
- "token",
1466
- "tolerant",
1467
- "tomorrow",
1468
- "tonic",
1469
- "toolbox",
1470
- "topic",
1471
- "torch",
1472
- "tossed",
1473
- "total",
1474
- "touchy",
1475
- "towel",
1476
- "toxic",
1477
- "toyed",
1478
- "trash",
1479
- "trendy",
1480
- "tribal",
1481
- "trolling",
1482
- "truth",
1483
- "trying",
1484
- "tsunami",
1485
- "tubes",
1486
- "tucks",
1487
- "tudor",
1488
- "tuesday",
1489
- "tufts",
1490
- "tugs",
1491
- "tuition",
1492
- "tulips",
1493
- "tumbling",
1494
- "tunnel",
1495
- "turnip",
1496
- "tusks",
1497
- "tutor",
1498
- "tuxedo",
1499
- "twang",
1500
- "tweezers",
1501
- "twice",
1502
- "twofold",
1503
- "tycoon",
1504
- "typist",
1505
- "tyrant",
1506
- "ugly",
1507
- "ulcers",
1508
- "ultimate",
1509
- "umbrella",
1510
- "umpire",
1511
- "unafraid",
1512
- "unbending",
1513
- "uncle",
1514
- "under",
1515
- "uneven",
1516
- "unfit",
1517
- "ungainly",
1518
- "unhappy",
1519
- "union",
1520
- "unjustly",
1521
- "unknown",
1522
- "unlikely",
1523
- "unmask",
1524
- "unnoticed",
1525
- "unopened",
1526
- "unplugs",
1527
- "unquoted",
1528
- "unrest",
1529
- "unsafe",
1530
- "until",
1531
- "unusual",
1532
- "unveil",
1533
- "unwind",
1534
- "unzip",
1535
- "upbeat",
1536
- "upcoming",
1537
- "update",
1538
- "upgrade",
1539
- "uphill",
1540
- "upkeep",
1541
- "upload",
1542
- "upon",
1543
- "upper",
1544
- "upright",
1545
- "upstairs",
1546
- "uptight",
1547
- "upwards",
1548
- "urban",
1549
- "urchins",
1550
- "urgent",
1551
- "usage",
1552
- "useful",
1553
- "usher",
1554
- "using",
1555
- "usual",
1556
- "utensils",
1557
- "utility",
1558
- "utmost",
1559
- "utopia",
1560
- "uttered",
1561
- "vacation",
1562
- "vague",
1563
- "vain",
1564
- "value",
1565
- "vampire",
1566
- "vane",
1567
- "vapidly",
1568
- "vary",
1569
- "vastness",
1570
- "vats",
1571
- "vaults",
1572
- "vector",
1573
- "veered",
1574
- "vegan",
1575
- "vehicle",
1576
- "vein",
1577
- "velvet",
1578
- "venomous",
1579
- "verification",
1580
- "vessel",
1581
- "veteran",
1582
- "vexed",
1583
- "vials",
1584
- "vibrate",
1585
- "victim",
1586
- "video",
1587
- "viewpoint",
1588
- "vigilant",
1589
- "viking",
1590
- "village",
1591
- "vinegar",
1592
- "violin",
1593
- "vipers",
1594
- "virtual",
1595
- "visited",
1596
- "vitals",
1597
- "vivid",
1598
- "vixen",
1599
- "vocal",
1600
- "vogue",
1601
- "voice",
1602
- "volcano",
1603
- "vortex",
1604
- "voted",
1605
- "voucher",
1606
- "vowels",
1607
- "voyage",
1608
- "vulture",
1609
- "wade",
1610
- "waffle",
1611
- "wagtail",
1612
- "waist",
1613
- "waking",
1614
- "wallets",
1615
- "wanted",
1616
- "warped",
1617
- "washing",
1618
- "water",
1619
- "waveform",
1620
- "waxing",
1621
- "wayside",
1622
- "weavers",
1623
- "website",
1624
- "wedge",
1625
- "weekday",
1626
- "weird",
1627
- "welders",
1628
- "went",
1629
- "wept",
1630
- "were",
1631
- "western",
1632
- "wetsuit",
1633
- "whale",
1634
- "when",
1635
- "whipped",
1636
- "whole",
1637
- "wickets",
1638
- "width",
1639
- "wield",
1640
- "wife",
1641
- "wiggle",
1642
- "wildly",
1643
- "winter",
1644
- "wipeout",
1645
- "wiring",
1646
- "wise",
1647
- "withdrawn",
1648
- "wives",
1649
- "wizard",
1650
- "wobbly",
1651
- "woes",
1652
- "woken",
1653
- "wolf",
1654
- "womanly",
1655
- "wonders",
1656
- "woozy",
1657
- "worry",
1658
- "wounded",
1659
- "woven",
1660
- "wrap",
1661
- "wrist",
1662
- "wrong",
1663
- "yacht",
1664
- "yahoo",
1665
- "yanks",
1666
- "yard",
1667
- "yawning",
1668
- "yearbook",
1669
- "yellow",
1670
- "yesterday",
1671
- "yeti",
1672
- "yields",
1673
- "yodel",
1674
- "yoga",
1675
- "younger",
1676
- "yoyo",
1677
- "zapped",
1678
- "zeal",
1679
- "zebra",
1680
- "zero",
1681
- "zesty",
1682
- "zigzags",
1683
- "zinger",
1684
- "zippers",
1685
- "zodiac",
1686
- "zombie",
1687
- "zones",
1688
- "zoom"
1689
-];
cw_monero/pubspec.lock
+108
-92
@@ -21,18 +21,18 @@ packages:
21
dependency: transitive
22
description:
23
name: args
24
- sha256: "139d809800a412ebb26a3892da228b2d0ba36f0ef5d9a82166e5e52ec8d61611"
24
+ sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
25
url: "https://pub.dev"
26
source: hosted
27
- version: "2.3.2"
27
+ version: "2.5.0"
28
asn1lib:
29
dependency: transitive
30
description:
31
name: asn1lib
32
- sha256: ab96a1cb3beeccf8145c52e449233fe68364c9641623acd3adad66f8184f1039
32
+ sha256: "58082b3f0dca697204dbab0ef9ff208bfaea7767ea771076af9a343488428dda"
33
url: "https://pub.dev"
34
source: hosted
35
- version: "1.4.0"
35
+ version: "1.5.3"
36
async:
37
dependency: transitive
38
description:
@@ -53,10 +53,10 @@ packages:
53
dependency: transitive
54
description:
55
name: build
56
- sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777"
56
+ sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
57
url: "https://pub.dev"
58
source: hosted
59
- version: "2.3.1"
59
+ version: "2.4.1"
60
build_config:
61
dependency: transitive
62
description:
@@ -69,10 +69,10 @@ packages:
69
dependency: transitive
70
description:
71
name: build_daemon
72
- sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65"
72
+ sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1"
73
url: "https://pub.dev"
74
source: hosted
75
- version: "4.0.0"
75
+ version: "4.0.1"
76
build_resolvers:
77
dependency: "direct dev"
78
description:
@@ -93,10 +93,10 @@ packages:
93
dependency: transitive
94
description:
95
name: build_runner_core
96
- sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292"
96
+ sha256: "6d6ee4276b1c5f34f21fdf39425202712d2be82019983d52f351c94aafbc2c41"
97
url: "https://pub.dev"
98
source: hosted
99
- version: "7.2.7"
99
+ version: "7.2.10"
100
built_collection:
101
dependency: transitive
102
description:
@@ -109,10 +109,10 @@ packages:
109
dependency: transitive
110
description:
111
name: built_value
112
- sha256: "169565c8ad06adb760c3645bf71f00bff161b00002cace266cad42c5d22a7725"
112
+ sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
113
url: "https://pub.dev"
114
source: hosted
115
- version: "8.4.3"
115
+ version: "8.9.2"
116
characters:
117
dependency: transitive
118
description:
@@ -125,10 +125,10 @@ packages:
125
dependency: transitive
126
description:
127
name: checked_yaml
128
- sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311"
128
+ sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
129
url: "https://pub.dev"
130
source: hosted
131
- version: "2.0.2"
131
+ version: "2.0.3"
132
clock:
133
dependency: transitive
134
description:
@@ -141,10 +141,10 @@ packages:
141
dependency: transitive
142
description:
143
name: code_builder
144
- sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe"
144
+ sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37
145
url: "https://pub.dev"
146
source: hosted
147
- version: "4.4.0"
147
+ version: "4.10.0"
148
collection:
149
dependency: transitive
150
description:
@@ -165,10 +165,10 @@ packages:
165
dependency: transitive
166
description:
167
name: crypto
168
- sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
168
+ sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
169
url: "https://pub.dev"
170
source: hosted
171
- version: "3.0.2"
171
+ version: "3.0.3"
172
cw_core:
173
dependency: "direct main"
174
description:
@@ -188,10 +188,10 @@ packages:
188
dependency: "direct main"
189
description:
190
name: encrypt
191
- sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb"
191
+ sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
192
url: "https://pub.dev"
193
source: hosted
194
- version: "5.0.1"
194
+ version: "5.0.3"
195
fake_async:
196
dependency: transitive
197
description:
@@ -204,10 +204,10 @@ packages:
204
dependency: "direct main"
205
description:
206
name: ffi
207
- sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878"
207
+ sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
208
url: "https://pub.dev"
209
source: hosted
210
- version: "2.1.0"
210
+ version: "2.1.2"
211
file:
212
dependency: transitive
213
description:
@@ -233,10 +233,10 @@ packages:
233
dependency: "direct main"
234
description:
235
name: flutter_mobx
236
- sha256: "0da4add0016387a7bf309a0d0c41d36c6b3ae25ed7a176409267f166509e723e"
236
+ sha256: "859fbf452fa9c2519d2700b125dd7fb14c508bbdd7fb65e26ca8ff6c92280e2e"
237
url: "https://pub.dev"
238
source: hosted
239
- version: "2.0.6+5"
239
+ version: "2.2.1+1"
240
flutter_test:
241
dependency: "direct dev"
242
description: flutter
@@ -246,42 +246,42 @@ packages:
246
dependency: transitive
247
description:
248
name: frontend_server_client
249
- sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
249
+ sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
250
url: "https://pub.dev"
251
source: hosted
252
- version: "3.2.0"
252
+ version: "4.0.0"
253
glob:
254
dependency: transitive
255
description:
256
name: glob
257
- sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c"
257
+ sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
258
url: "https://pub.dev"
259
source: hosted
260
- version: "2.1.1"
260
+ version: "2.1.2"
261
graphs:
262
dependency: transitive
263
description:
264
name: graphs
265
- sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2
265
+ sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19
266
url: "https://pub.dev"
267
source: hosted
268
- version: "2.2.0"
268
+ version: "2.3.1"
269
hashlib:
270
dependency: transitive
271
description:
272
name: hashlib
273
- sha256: "71bf102329ddb8e50c8a995ee4645ae7f1728bb65e575c17196b4d8262121a96"
273
+ sha256: "5037d3b8c36384c03a728543ae67d962a56970c5432a50862279fe68ee4c8411"
274
url: "https://pub.dev"
275
source: hosted
276
- version: "1.12.0"
276
+ version: "1.19.1"
277
hashlib_codecs:
278
dependency: transitive
279
description:
280
name: hashlib_codecs
281
- sha256: "49e2a471f74b15f1854263e58c2ac11f2b631b5b12c836f9708a35397d36d626"
281
+ sha256: "2b570061f5a4b378425be28a576c1e11783450355ad4345a19f606ff3d96db0f"
282
url: "https://pub.dev"
283
source: hosted
284
- version: "2.2.0"
284
+ version: "2.5.0"
285
hive:
286
dependency: transitive
287
description:
@@ -302,10 +302,10 @@ packages:
302
dependency: "direct main"
303
description:
304
name: http
305
- sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
305
+ sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
306
url: "https://pub.dev"
307
source: hosted
308
- version: "1.1.0"
308
+ version: "1.2.1"
309
http_multi_server:
310
dependency: transitive
311
description:
@@ -342,18 +342,18 @@ packages:
342
dependency: transitive
343
description:
344
name: js
345
- sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
345
+ sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
346
url: "https://pub.dev"
347
source: hosted
348
- version: "0.6.7"
348
+ version: "0.7.1"
349
json_annotation:
350
dependency: transitive
351
description:
352
name: json_annotation
353
- sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317
353
+ sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
354
url: "https://pub.dev"
355
source: hosted
356
- version: "4.8.0"
356
+ version: "4.9.0"
357
leak_tracker:
358
dependency: transitive
359
description:
@@ -382,10 +382,10 @@ packages:
382
dependency: transitive
383
description:
384
name: logging
385
- sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d"
385
+ sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
386
url: "https://pub.dev"
387
source: hosted
388
- version: "1.1.1"
388
+ version: "1.2.0"
389
matcher:
390
dependency: transitive
391
description:
@@ -414,33 +414,33 @@ packages:
414
dependency: transitive
415
description:
416
name: mime
417
- sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
417
+ sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2"
418
url: "https://pub.dev"
419
source: hosted
420
- version: "1.0.4"
420
+ version: "1.0.5"
421
mobx:
422
dependency: "direct main"
423
description:
424
name: mobx
425
- sha256: f1862bd92c6a903fab67338f27e2f731117c3cb9ea37cee1a487f9e4e0de314a
425
+ sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
426
url: "https://pub.dev"
427
source: hosted
428
- version: "2.1.3+1"
428
+ version: "2.3.3+2"
429
mobx_codegen:
430
dependency: "direct dev"
431
description:
432
name: mobx_codegen
433
- sha256: "86122e410d8ea24dda0c69adb5c2a6ccadd5ce02ad46e144764e0d0184a06181"
433
+ sha256: d4beb9cea4b7b014321235f8fdc7c2193ee0fe1d1198e9da7403f8bc85c4407c
434
url: "https://pub.dev"
435
source: hosted
436
- version: "2.1.1"
436
+ version: "2.3.0"
437
monero:
438
dependency: "direct main"
439
description:
440
- path: "."
441
- ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
442
- resolved-ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
443
- url: "https://github.com/mrcyjanek/monero.dart"
440
+ path: "impls/monero.dart"
441
+ ref: "bcb328a4956105dc182afd0ce2e48fe263f5f20b"
442
+ resolved-ref: "bcb328a4956105dc182afd0ce2e48fe263f5f20b"
443
+ url: "https://github.com/mrcyjanek/monero_c"
444
source: git
445
version: "0.0.0"
446
mutex:
@@ -451,6 +451,14 @@ packages:
451
url: "https://pub.dev"
452
source: hosted
453
version: "3.1.0"
454
+ nested:
455
+ dependency: transitive
456
+ description:
457
+ name: nested
458
+ sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20"
459
+ url: "https://pub.dev"
460
+ source: hosted
461
+ version: "1.0.0"
462
package_config:
463
dependency: transitive
464
description:
@@ -471,26 +479,26 @@ packages:
479
dependency: "direct main"
480
description:
481
name: path_provider
474
- sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa
482
+ sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
483
url: "https://pub.dev"
484
source: hosted
477
- version: "2.1.1"
485
+ version: "2.1.3"
486
path_provider_android:
487
dependency: transitive
488
description:
489
name: path_provider_android
482
- sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72
490
+ sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
491
url: "https://pub.dev"
492
source: hosted
485
- version: "2.2.1"
493
+ version: "2.2.4"
494
path_provider_foundation:
495
dependency: transitive
496
description:
497
name: path_provider_foundation
490
- sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d"
498
+ sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16
499
url: "https://pub.dev"
500
source: hosted
493
- version: "2.3.1"
501
+ version: "2.4.0"
502
path_provider_linux:
503
dependency: transitive
504
description:
@@ -503,10 +511,10 @@ packages:
511
dependency: transitive
512
description:
513
name: path_provider_platform_interface
506
- sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c"
514
+ sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
515
url: "https://pub.dev"
516
source: hosted
509
- version: "2.1.1"
517
+ version: "2.1.2"
518
path_provider_windows:
519
dependency: transitive
520
description:
@@ -519,26 +527,26 @@ packages:
527
dependency: transitive
528
description:
529
name: platform
522
- sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
530
+ sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
531
url: "https://pub.dev"
532
source: hosted
525
- version: "3.1.0"
533
+ version: "3.1.5"
534
plugin_platform_interface:
535
dependency: transitive
536
description:
537
name: plugin_platform_interface
530
- sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a
538
+ sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
539
url: "https://pub.dev"
540
source: hosted
533
- version: "2.1.3"
541
+ version: "2.1.8"
542
pointycastle:
543
dependency: transitive
544
description:
545
name: pointycastle
538
- sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c"
546
+ sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe"
547
url: "https://pub.dev"
548
source: hosted
541
- version: "3.7.3"
549
+ version: "3.9.1"
550
polyseed:
551
dependency: "direct main"
552
description:
@@ -555,46 +563,46 @@ packages:
563
url: "https://pub.dev"
564
source: hosted
565
version: "1.5.1"
558
- process:
566
+ provider:
567
dependency: transitive
568
description:
561
- name: process
562
- sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
569
+ name: provider
570
+ sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c
571
url: "https://pub.dev"
572
source: hosted
565
- version: "4.2.4"
573
+ version: "6.1.2"
574
pub_semver:
575
dependency: transitive
576
description:
577
name: pub_semver
570
- sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17"
578
+ sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
579
url: "https://pub.dev"
580
source: hosted
573
- version: "2.1.3"
581
+ version: "2.1.4"
582
pubspec_parse:
583
dependency: transitive
584
description:
585
name: pubspec_parse
578
- sha256: "75f6614d6dde2dc68948dffbaa4fe5dae32cd700eb9fb763fe11dfb45a3c4d0a"
586
+ sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8
587
url: "https://pub.dev"
588
source: hosted
581
- version: "1.2.1"
589
+ version: "1.3.0"
590
shelf:
591
dependency: transitive
592
description:
593
name: shelf
586
- sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c
594
+ sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
595
url: "https://pub.dev"
596
source: hosted
589
- version: "1.4.0"
597
+ version: "1.4.1"
598
shelf_web_socket:
599
dependency: transitive
600
description:
601
name: shelf_web_socket
594
- sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8
602
+ sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
603
url: "https://pub.dev"
604
source: hosted
597
- version: "1.0.3"
605
+ version: "1.0.4"
606
sky_engine:
607
dependency: transitive
608
description: flutter
@@ -604,10 +612,10 @@ packages:
612
dependency: transitive
613
description:
614
name: socks5_proxy
607
- sha256: "1d21b5606169654bbf4cfb904e8e6ed897e9f763358709f87310c757096d909a"
615
+ sha256: "616818a0ea1064a4823b53c9f7eaf8da64ed82dcd51ed71371c7e54751ed5053"
616
url: "https://pub.dev"
617
source: hosted
610
- version: "1.0.4"
618
+ version: "1.0.6"
619
source_gen:
620
dependency: transitive
621
description:
@@ -692,10 +700,10 @@ packages:
700
dependency: transitive
701
description:
702
name: typed_data
695
- sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
703
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
704
url: "https://pub.dev"
705
source: hosted
698
- version: "1.3.1"
706
+ version: "1.3.2"
707
unorm_dart:
708
dependency: transitive
709
description:
@@ -728,38 +736,46 @@ packages:
736
url: "https://pub.dev"
737
source: hosted
738
version: "1.1.0"
739
+ web:
740
+ dependency: transitive
741
+ description:
742
+ name: web
743
+ sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
744
+ url: "https://pub.dev"
745
+ source: hosted
746
+ version: "0.5.1"
747
web_socket_channel:
748
dependency: transitive
749
description:
750
name: web_socket_channel
735
- sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b
751
+ sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
752
url: "https://pub.dev"
753
source: hosted
738
- version: "2.3.0"
754
+ version: "2.4.5"
755
win32:
756
dependency: transitive
757
description:
758
name: win32
743
- sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
759
+ sha256: "0eaf06e3446824099858367950a813472af675116bf63f008a4c2a75ae13e9cb"
760
url: "https://pub.dev"
761
source: hosted
746
- version: "3.1.3"
762
+ version: "5.5.0"
763
xdg_directories:
764
dependency: transitive
765
description:
766
name: xdg_directories
751
- sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86
767
+ sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
768
url: "https://pub.dev"
769
source: hosted
754
- version: "0.2.0+3"
770
+ version: "1.0.4"
771
yaml:
772
dependency: transitive
773
description:
774
name: yaml
759
- sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370"
775
+ sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
776
url: "https://pub.dev"
777
source: hosted
762
- version: "3.1.1"
778
+ version: "3.1.2"
779
sdks:
764
- dart: ">=3.2.0-0 <4.0.0"
765
- flutter: ">=3.7.0"
780
+ dart: ">=3.3.0 <4.0.0"
781
+ flutter: ">=3.16.6"
cw_monero/pubspec.yaml
+3
-2
@@ -24,8 +24,9 @@ dependencies:
24
path: ../cw_core
25
monero:
26
git:
27
- url: https://github.com/mrcyjanek/monero.dart
28
- ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
27
+ url: https://github.com/mrcyjanek/monero_c
28
+ ref: bcb328a4956105dc182afd0ce2e48fe263f5f20b # monero_c hash
29
+ path: impls/monero.dart
30
mutex: ^3.1.0
31
32
dev_dependencies:
cw_wownero/lib/api/exceptions/connection_to_node_exception.dart
deleted
-5
@@ -1,5 +0,0 @@
1
-class ConnectionToNodeException implements Exception {
2
- ConnectionToNodeException({required this.message});
3
-
4
- final String message;
5
-}
\ No newline at end of file
cw_wownero/lib/api/structs/account_row.dart
deleted
-12
@@ -1,12 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class AccountRow extends Struct {
5
- @Int64()
6
- external int id;
7
-
8
- external Pointer<Utf8> label;
9
-
10
- String getLabel() => label.toDartString();
11
- int getId() => id;
12
-}
cw_wownero/lib/api/structs/coins_info_row.dart
deleted
-73
@@ -1,73 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class CoinsInfoRow extends Struct {
5
- @Int64()
6
- external int blockHeight;
7
-
8
- external Pointer<Utf8> hash;
9
-
10
- @Uint64()
11
- external int internalOutputIndex;
12
-
13
- @Uint64()
14
- external int globalOutputIndex;
15
-
16
- @Int8()
17
- external int spent;
18
-
19
- @Int8()
20
- external int frozen;
21
-
22
- @Uint64()
23
- external int spentHeight;
24
-
25
- @Uint64()
26
- external int amount;
27
-
28
- @Int8()
29
- external int rct;
30
-
31
- @Int8()
32
- external int keyImageKnown;
33
-
34
- @Uint64()
35
- external int pkIndex;
36
-
37
- @Uint32()
38
- external int subaddrIndex;
39
-
40
- @Uint32()
41
- external int subaddrAccount;
42
-
43
- external Pointer<Utf8> address;
44
-
45
- external Pointer<Utf8> addressLabel;
46
-
47
- external Pointer<Utf8> keyImage;
48
-
49
- @Uint64()
50
- external int unlockTime;
51
-
52
- @Int8()
53
- external int unlocked;
54
-
55
- external Pointer<Utf8> pubKey;
56
-
57
- @Int8()
58
- external int coinbase;
59
-
60
- external Pointer<Utf8> description;
61
-
62
- String getHash() => hash.toDartString();
63
-
64
- String getAddress() => address.toDartString();
65
-
66
- String getAddressLabel() => addressLabel.toDartString();
67
-
68
- String getKeyImage() => keyImage.toDartString();
69
-
70
- String getPubKey() => pubKey.toDartString();
71
-
72
- String getDescription() => description.toDartString();
73
-}
cw_wownero/lib/api/structs/subaddress_row.dart
deleted
-15
@@ -1,15 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class SubaddressRow extends Struct {
5
- @Int64()
6
- external int id;
7
-
8
- external Pointer<Utf8> address;
9
-
10
- external Pointer<Utf8> label;
11
-
12
- String getLabel() => label.toDartString();
13
- String getAddress() => address.toDartString();
14
- int getId() => id;
15
-}
\ No newline at end of file
cw_wownero/lib/api/structs/transaction_info_row.dart
deleted
-41
@@ -1,41 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class TransactionInfoRow extends Struct {
5
- @Uint64()
6
- external int amount;
7
-
8
- @Uint64()
9
- external int fee;
10
-
11
- @Uint64()
12
- external int blockHeight;
13
-
14
- @Uint64()
15
- external int confirmations;
16
-
17
- @Uint32()
18
- external int subaddrAccount;
19
-
20
- @Int8()
21
- external int direction;
22
-
23
- @Int8()
24
- external int isPending;
25
-
26
- @Uint32()
27
- external int subaddrIndex;
28
-
29
- external Pointer<Utf8> hash;
30
-
31
- external Pointer<Utf8> paymentId;
32
-
33
- @Int64()
34
- external int datetime;
35
-
36
- int getDatetime() => datetime;
37
- int getAmount() => amount >= 0 ? amount : amount * -1;
38
- bool getIsPending() => isPending != 0;
39
- String getHash() => hash.toDartString();
40
- String getPaymentId() => paymentId.toDartString();
41
-}
cw_wownero/lib/api/structs/ut8_box.dart
deleted
-8
@@ -1,8 +0,0 @@
1
-import 'dart:ffi';
2
-import 'package:ffi/ffi.dart';
3
-
4
-class Utf8Box extends Struct {
5
- external Pointer<Utf8> value;
6
-
7
- String getValue() => value.toDartString();
8
-}
cw_wownero/lib/api/transaction_history.dart
+2
-2
@@ -285,7 +285,7 @@ class Transaction {
285
};
286
}
287
288
- // S finalubAddress? subAddress;
288
+ // final SubAddress? subAddress;
289
// List<Transfer> transfers = [];
290
// final int txIndex;
291
final wownero.TransactionInfo txInfo;
@@ -321,4 +321,4 @@ class Transaction {
321
required this.key,
322
required this.txInfo
323
});
324
-}
\ No newline at end of file
324
+}
cw_wownero/lib/api/wallet_manager.dart
+35
@@ -1,4 +1,5 @@
1
import 'dart:ffi';
2
+import 'dart:io';
3
import 'dart:isolate';
4
5
import 'package:cw_wownero/api/account_list.dart';
@@ -8,8 +9,42 @@ import 'package:cw_wownero/api/exceptions/wallet_restore_from_keys_exception.dar
9
import 'package:cw_wownero/api/exceptions/wallet_restore_from_seed_exception.dart';
10
import 'package:cw_wownero/api/transaction_history.dart';
11
import 'package:cw_wownero/api/wallet.dart';
12
+import 'package:flutter/foundation.dart';
13
import 'package:monero/wownero.dart' as wownero;
14
15
+class MoneroCException implements Exception {
16
+ final String message;
17
+
18
+ MoneroCException(this.message);
19
+
20
+ @override
21
+ String toString() {
22
+ return message;
23
+ }
24
+}
25
+
26
+void checkIfMoneroCIsFine() {
27
+ final cppCsCpp = wownero.WOWNERO_checksum_wallet2_api_c_cpp();
28
+ final cppCsH = wownero.WOWNERO_checksum_wallet2_api_c_h();
29
+ final cppCsExp = wownero.WOWNERO_checksum_wallet2_api_c_exp();
30
+
31
+ final dartCsCpp = wownero.wallet2_api_c_cpp_sha256;
32
+ final dartCsH = wownero.wallet2_api_c_h_sha256;
33
+ final dartCsExp = wownero.wallet2_api_c_exp_sha256;
34
+
35
+ if (cppCsCpp != dartCsCpp) {
36
+ throw MoneroCException("monero_c and monero.dart cpp wrapper code mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsCpp'\ndart: '$dartCsCpp'");
37
+ }
38
+
39
+ if (cppCsH != dartCsH) {
40
+ throw MoneroCException("monero_c and monero.dart cpp wrapper header mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsH'\ndart: '$dartCsH'");
41
+ }
42
+
43
+ if (cppCsExp != dartCsExp && (Platform.isIOS || Platform.isMacOS)) {
44
+ throw MoneroCException("monero_c and monero.dart wrapper export list mismatch.\nLogic errors can occur.\nRefusing to run in release mode.\ncpp: '$cppCsExp'\ndart: '$dartCsExp'");
45
+ }
46
+}
47
+
48
wownero.WalletManager? _wmPtr;
49
final wownero.WalletManager wmPtr = Pointer.fromAddress((() {
50
try {
cw_wownero/lib/cw_wownero.dart
deleted
-8
@@ -1,8 +0,0 @@
1
-
2
-import 'cw_wownero_platform_interface.dart';
3
-
4
-class CwWownero {
5
- Future<String?> getPlatformVersion() {
6
- return CwWowneroPlatform.instance.getPlatformVersion();
7
- }
8
-}
cw_wownero/lib/cw_wownero_method_channel.dart
deleted
-17
@@ -1,17 +0,0 @@
1
-import 'package:flutter/foundation.dart';
2
-import 'package:flutter/services.dart';
3
-
4
-import 'cw_wownero_platform_interface.dart';
5
-
6
-/// An implementation of [CwWowneroPlatform] that uses method channels.
7
-class MethodChannelCwWownero extends CwWowneroPlatform {
8
- /// The method channel used to interact with the native platform.
9
- @visibleForTesting
10
- final methodChannel = const MethodChannel('cw_wownero');
11
-
12
- @override
13
- Future<String?> getPlatformVersion() async {
14
- final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
15
- return version;
16
- }
17
-}
cw_wownero/lib/cw_wownero_platform_interface.dart
deleted
-29
@@ -1,29 +0,0 @@
1
-import 'package:plugin_platform_interface/plugin_platform_interface.dart';
2
-
3
-import 'cw_wownero_method_channel.dart';
4
-
5
-abstract class CwWowneroPlatform extends PlatformInterface {
6
- /// Constructs a CwWowneroPlatform.
7
- CwWowneroPlatform() : super(token: _token);
8
-
9
- static final Object _token = Object();
10
-
11
- static CwWowneroPlatform _instance = MethodChannelCwWownero();
12
-
13
- /// The default instance of [CwWowneroPlatform] to use.
14
- ///
15
- /// Defaults to [MethodChannelCwWownero].
16
- static CwWowneroPlatform get instance => _instance;
17
-
18
- /// Platform-specific implementations should set this with their own
19
- /// platform-specific class that extends [CwWowneroPlatform] when
20
- /// they register themselves.
21
- static set instance(CwWowneroPlatform instance) {
22
- PlatformInterface.verifyToken(instance, _token);
23
- _instance = instance;
24
- }
25
-
26
- Future<String?> getPlatformVersion() {
27
- throw UnimplementedError('platformVersion() has not been implemented.');
28
- }
29
-}
cw_wownero/lib/mywownero.dart
deleted
-1689
@@ -1,1689 +0,0 @@
1
-const prefixLength = 3;
2
-
3
-String swapEndianBytes(String original) {
4
- if (original.length != 8) {
5
- return '';
6
- }
7
-
8
- return original[6] +
9
- original[7] +
10
- original[4] +
11
- original[5] +
12
- original[2] +
13
- original[3] +
14
- original[0] +
15
- original[1];
16
-}
17
-
18
-List<String> tructWords(List<String> wordSet) {
19
- final start = 0;
20
- final end = prefixLength;
21
-
22
- return wordSet.map((word) => word.substring(start, end)).toList();
23
-}
24
-
25
-String mnemonicDecode(String seed) {
26
- final n = englistWordSet.length;
27
- var out = '';
28
- var wlist = seed.split(' ');
29
- wlist.removeLast();
30
-
31
- for (var i = 0; i < wlist.length; i += 3) {
32
- final w1 =
33
- tructWords(englistWordSet).indexOf(wlist[i].substring(0, prefixLength));
34
- final w2 = tructWords(englistWordSet)
35
- .indexOf(wlist[i + 1].substring(0, prefixLength));
36
- final w3 = tructWords(englistWordSet)
37
- .indexOf(wlist[i + 2].substring(0, prefixLength));
38
-
39
- if (w1 == -1 || w2 == -1 || w3 == -1) {
40
- print("invalid word in mnemonic");
41
- return '';
42
- }
43
-
44
- final x = w1 + n * (((n - w1) + w2) % n) + n * n * (((n - w2) + w3) % n);
45
-
46
- if (x % n != w1) {
47
- print("Something went wrong when decoding your private key, please try again");
48
- return '';
49
- }
50
-
51
- final _res = '0000000' + x.toRadixString(16);
52
- final start = _res.length - 8;
53
- final end = _res.length;
54
- final res = _res.substring(start, end);
55
-
56
- out += swapEndianBytes(res);
57
- }
58
-
59
- return out;
60
-}
61
-
62
-final englistWordSet = [
63
- "abbey",
64
- "abducts",
65
- "ability",
66
- "ablaze",
67
- "abnormal",
68
- "abort",
69
- "abrasive",
70
- "absorb",
71
- "abyss",
72
- "academy",
73
- "aces",
74
- "aching",
75
- "acidic",
76
- "acoustic",
77
- "acquire",
78
- "across",
79
- "actress",
80
- "acumen",
81
- "adapt",
82
- "addicted",
83
- "adept",
84
- "adhesive",
85
- "adjust",
86
- "adopt",
87
- "adrenalin",
88
- "adult",
89
- "adventure",
90
- "aerial",
91
- "afar",
92
- "affair",
93
- "afield",
94
- "afloat",
95
- "afoot",
96
- "afraid",
97
- "after",
98
- "against",
99
- "agenda",
100
- "aggravate",
101
- "agile",
102
- "aglow",
103
- "agnostic",
104
- "agony",
105
- "agreed",
106
- "ahead",
107
- "aided",
108
- "ailments",
109
- "aimless",
110
- "airport",
111
- "aisle",
112
- "ajar",
113
- "akin",
114
- "alarms",
115
- "album",
116
- "alchemy",
117
- "alerts",
118
- "algebra",
119
- "alkaline",
120
- "alley",
121
- "almost",
122
- "aloof",
123
- "alpine",
124
- "already",
125
- "also",
126
- "altitude",
127
- "alumni",
128
- "always",
129
- "amaze",
130
- "ambush",
131
- "amended",
132
- "amidst",
133
- "ammo",
134
- "amnesty",
135
- "among",
136
- "amply",
137
- "amused",
138
- "anchor",
139
- "android",
140
- "anecdote",
141
- "angled",
142
- "ankle",
143
- "annoyed",
144
- "answers",
145
- "antics",
146
- "anvil",
147
- "anxiety",
148
- "anybody",
149
- "apart",
150
- "apex",
151
- "aphid",
152
- "aplomb",
153
- "apology",
154
- "apply",
155
- "apricot",
156
- "aptitude",
157
- "aquarium",
158
- "arbitrary",
159
- "archer",
160
- "ardent",
161
- "arena",
162
- "argue",
163
- "arises",
164
- "army",
165
- "around",
166
- "arrow",
167
- "arsenic",
168
- "artistic",
169
- "ascend",
170
- "ashtray",
171
- "aside",
172
- "asked",
173
- "asleep",
174
- "aspire",
175
- "assorted",
176
- "asylum",
177
- "athlete",
178
- "atlas",
179
- "atom",
180
- "atrium",
181
- "attire",
182
- "auburn",
183
- "auctions",
184
- "audio",
185
- "august",
186
- "aunt",
187
- "austere",
188
- "autumn",
189
- "avatar",
190
- "avidly",
191
- "avoid",
192
- "awakened",
193
- "awesome",
194
- "awful",
195
- "awkward",
196
- "awning",
197
- "awoken",
198
- "axes",
199
- "axis",
200
- "axle",
201
- "aztec",
202
- "azure",
203
- "baby",
204
- "bacon",
205
- "badge",
206
- "baffles",
207
- "bagpipe",
208
- "bailed",
209
- "bakery",
210
- "balding",
211
- "bamboo",
212
- "banjo",
213
- "baptism",
214
- "basin",
215
- "batch",
216
- "bawled",
217
- "bays",
218
- "because",
219
- "beer",
220
- "befit",
221
- "begun",
222
- "behind",
223
- "being",
224
- "below",
225
- "bemused",
226
- "benches",
227
- "berries",
228
- "bested",
229
- "betting",
230
- "bevel",
231
- "beware",
232
- "beyond",
233
- "bias",
234
- "bicycle",
235
- "bids",
236
- "bifocals",
237
- "biggest",
238
- "bikini",
239
- "bimonthly",
240
- "binocular",
241
- "biology",
242
- "biplane",
243
- "birth",
244
- "biscuit",
245
- "bite",
246
- "biweekly",
247
- "blender",
248
- "blip",
249
- "bluntly",
250
- "boat",
251
- "bobsled",
252
- "bodies",
253
- "bogeys",
254
- "boil",
255
- "boldly",
256
- "bomb",
257
- "border",
258
- "boss",
259
- "both",
260
- "bounced",
261
- "bovine",
262
- "bowling",
263
- "boxes",
264
- "boyfriend",
265
- "broken",
266
- "brunt",
267
- "bubble",
268
- "buckets",
269
- "budget",
270
- "buffet",
271
- "bugs",
272
- "building",
273
- "bulb",
274
- "bumper",
275
- "bunch",
276
- "business",
277
- "butter",
278
- "buying",
279
- "buzzer",
280
- "bygones",
281
- "byline",
282
- "bypass",
283
- "cabin",
284
- "cactus",
285
- "cadets",
286
- "cafe",
287
- "cage",
288
- "cajun",
289
- "cake",
290
- "calamity",
291
- "camp",
292
- "candy",
293
- "casket",
294
- "catch",
295
- "cause",
296
- "cavernous",
297
- "cease",
298
- "cedar",
299
- "ceiling",
300
- "cell",
301
- "cement",
302
- "cent",
303
- "certain",
304
- "chlorine",
305
- "chrome",
306
- "cider",
307
- "cigar",
308
- "cinema",
309
- "circle",
310
- "cistern",
311
- "citadel",
312
- "civilian",
313
- "claim",
314
- "click",
315
- "clue",
316
- "coal",
317
- "cobra",
318
- "cocoa",
319
- "code",
320
- "coexist",
321
- "coffee",
322
- "cogs",
323
- "cohesive",
324
- "coils",
325
- "colony",
326
- "comb",
327
- "cool",
328
- "copy",
329
- "corrode",
330
- "costume",
331
- "cottage",
332
- "cousin",
333
- "cowl",
334
- "criminal",
335
- "cube",
336
- "cucumber",
337
- "cuddled",
338
- "cuffs",
339
- "cuisine",
340
- "cunning",
341
- "cupcake",
342
- "custom",
343
- "cycling",
344
- "cylinder",
345
- "cynical",
346
- "dabbing",
347
- "dads",
348
- "daft",
349
- "dagger",
350
- "daily",
351
- "damp",
352
- "dangerous",
353
- "dapper",
354
- "darted",
355
- "dash",
356
- "dating",
357
- "dauntless",
358
- "dawn",
359
- "daytime",
360
- "dazed",
361
- "debut",
362
- "decay",
363
- "dedicated",
364
- "deepest",
365
- "deftly",
366
- "degrees",
367
- "dehydrate",
368
- "deity",
369
- "dejected",
370
- "delayed",
371
- "demonstrate",
372
- "dented",
373
- "deodorant",
374
- "depth",
375
- "desk",
376
- "devoid",
377
- "dewdrop",
378
- "dexterity",
379
- "dialect",
380
- "dice",
381
- "diet",
382
- "different",
383
- "digit",
384
- "dilute",
385
- "dime",
386
- "dinner",
387
- "diode",
388
- "diplomat",
389
- "directed",
390
- "distance",
391
- "ditch",
392
- "divers",
393
- "dizzy",
394
- "doctor",
395
- "dodge",
396
- "does",
397
- "dogs",
398
- "doing",
399
- "dolphin",
400
- "domestic",
401
- "donuts",
402
- "doorway",
403
- "dormant",
404
- "dosage",
405
- "dotted",
406
- "double",
407
- "dove",
408
- "down",
409
- "dozen",
410
- "dreams",
411
- "drinks",
412
- "drowning",
413
- "drunk",
414
- "drying",
415
- "dual",
416
- "dubbed",
417
- "duckling",
418
- "dude",
419
- "duets",
420
- "duke",
421
- "dullness",
422
- "dummy",
423
- "dunes",
424
- "duplex",
425
- "duration",
426
- "dusted",
427
- "duties",
428
- "dwarf",
429
- "dwelt",
430
- "dwindling",
431
- "dying",
432
- "dynamite",
433
- "dyslexic",
434
- "each",
435
- "eagle",
436
- "earth",
437
- "easy",
438
- "eating",
439
- "eavesdrop",
440
- "eccentric",
441
- "echo",
442
- "eclipse",
443
- "economics",
444
- "ecstatic",
445
- "eden",
446
- "edgy",
447
- "edited",
448
- "educated",
449
- "eels",
450
- "efficient",
451
- "eggs",
452
- "egotistic",
453
- "eight",
454
- "either",
455
- "eject",
456
- "elapse",
457
- "elbow",
458
- "eldest",
459
- "eleven",
460
- "elite",
461
- "elope",
462
- "else",
463
- "eluded",
464
- "emails",
465
- "ember",
466
- "emerge",
467
- "emit",
468
- "emotion",
469
- "empty",
470
- "emulate",
471
- "energy",
472
- "enforce",
473
- "enhanced",
474
- "enigma",
475
- "enjoy",
476
- "enlist",
477
- "enmity",
478
- "enough",
479
- "enraged",
480
- "ensign",
481
- "entrance",
482
- "envy",
483
- "epoxy",
484
- "equip",
485
- "erase",
486
- "erected",
487
- "erosion",
488
- "error",
489
- "eskimos",
490
- "espionage",
491
- "essential",
492
- "estate",
493
- "etched",
494
- "eternal",
495
- "ethics",
496
- "etiquette",
497
- "evaluate",
498
- "evenings",
499
- "evicted",
500
- "evolved",
501
- "examine",
502
- "excess",
503
- "exhale",
504
- "exit",
505
- "exotic",
506
- "exquisite",
507
- "extra",
508
- "exult",
509
- "fabrics",
510
- "factual",
511
- "fading",
512
- "fainted",
513
- "faked",
514
- "fall",
515
- "family",
516
- "fancy",
517
- "farming",
518
- "fatal",
519
- "faulty",
520
- "fawns",
521
- "faxed",
522
- "fazed",
523
- "feast",
524
- "february",
525
- "federal",
526
- "feel",
527
- "feline",
528
- "females",
529
- "fences",
530
- "ferry",
531
- "festival",
532
- "fetches",
533
- "fever",
534
- "fewest",
535
- "fiat",
536
- "fibula",
537
- "fictional",
538
- "fidget",
539
- "fierce",
540
- "fifteen",
541
- "fight",
542
- "films",
543
- "firm",
544
- "fishing",
545
- "fitting",
546
- "five",
547
- "fixate",
548
- "fizzle",
549
- "fleet",
550
- "flippant",
551
- "flying",
552
- "foamy",
553
- "focus",
554
- "foes",
555
- "foggy",
556
- "foiled",
557
- "folding",
558
- "fonts",
559
- "foolish",
560
- "fossil",
561
- "fountain",
562
- "fowls",
563
- "foxes",
564
- "foyer",
565
- "framed",
566
- "friendly",
567
- "frown",
568
- "fruit",
569
- "frying",
570
- "fudge",
571
- "fuel",
572
- "fugitive",
573
- "fully",
574
- "fuming",
575
- "fungal",
576
- "furnished",
577
- "fuselage",
578
- "future",
579
- "fuzzy",
580
- "gables",
581
- "gadget",
582
- "gags",
583
- "gained",
584
- "galaxy",
585
- "gambit",
586
- "gang",
587
- "gasp",
588
- "gather",
589
- "gauze",
590
- "gave",
591
- "gawk",
592
- "gaze",
593
- "gearbox",
594
- "gecko",
595
- "geek",
596
- "gels",
597
- "gemstone",
598
- "general",
599
- "geometry",
600
- "germs",
601
- "gesture",
602
- "getting",
603
- "geyser",
604
- "ghetto",
605
- "ghost",
606
- "giant",
607
- "giddy",
608
- "gifts",
609
- "gigantic",
610
- "gills",
611
- "gimmick",
612
- "ginger",
613
- "girth",
614
- "giving",
615
- "glass",
616
- "gleeful",
617
- "glide",
618
- "gnaw",
619
- "gnome",
620
- "goat",
621
- "goblet",
622
- "godfather",
623
- "goes",
624
- "goggles",
625
- "going",
626
- "goldfish",
627
- "gone",
628
- "goodbye",
629
- "gopher",
630
- "gorilla",
631
- "gossip",
632
- "gotten",
633
- "gourmet",
634
- "governing",
635
- "gown",
636
- "greater",
637
- "grunt",
638
- "guarded",
639
- "guest",
640
- "guide",
641
- "gulp",
642
- "gumball",
643
- "guru",
644
- "gusts",
645
- "gutter",
646
- "guys",
647
- "gymnast",
648
- "gypsy",
649
- "gyrate",
650
- "habitat",
651
- "hacksaw",
652
- "haggled",
653
- "hairy",
654
- "hamburger",
655
- "happens",
656
- "hashing",
657
- "hatchet",
658
- "haunted",
659
- "having",
660
- "hawk",
661
- "haystack",
662
- "hazard",
663
- "hectare",
664
- "hedgehog",
665
- "heels",
666
- "hefty",
667
- "height",
668
- "hemlock",
669
- "hence",
670
- "heron",
671
- "hesitate",
672
- "hexagon",
673
- "hickory",
674
- "hiding",
675
- "highway",
676
- "hijack",
677
- "hiker",
678
- "hills",
679
- "himself",
680
- "hinder",
681
- "hippo",
682
- "hire",
683
- "history",
684
- "hitched",
685
- "hive",
686
- "hoax",
687
- "hobby",
688
- "hockey",
689
- "hoisting",
690
- "hold",
691
- "honked",
692
- "hookup",
693
- "hope",
694
- "hornet",
695
- "hospital",
696
- "hotel",
697
- "hounded",
698
- "hover",
699
- "howls",
700
- "hubcaps",
701
- "huddle",
702
- "huge",
703
- "hull",
704
- "humid",
705
- "hunter",
706
- "hurried",
707
- "husband",
708
- "huts",
709
- "hybrid",
710
- "hydrogen",
711
- "hyper",
712
- "iceberg",
713
- "icing",
714
- "icon",
715
- "identity",
716
- "idiom",
717
- "idled",
718
- "idols",
719
- "igloo",
720
- "ignore",
721
- "iguana",
722
- "illness",
723
- "imagine",
724
- "imbalance",
725
- "imitate",
726
- "impel",
727
- "inactive",
728
- "inbound",
729
- "incur",
730
- "industrial",
731
- "inexact",
732
- "inflamed",
733
- "ingested",
734
- "initiate",
735
- "injury",
736
- "inkling",
737
- "inline",
738
- "inmate",
739
- "innocent",
740
- "inorganic",
741
- "input",
742
- "inquest",
743
- "inroads",
744
- "insult",
745
- "intended",
746
- "inundate",
747
- "invoke",
748
- "inwardly",
749
- "ionic",
750
- "irate",
751
- "iris",
752
- "irony",
753
- "irritate",
754
- "island",
755
- "isolated",
756
- "issued",
757
- "italics",
758
- "itches",
759
- "items",
760
- "itinerary",
761
- "itself",
762
- "ivory",
763
- "jabbed",
764
- "jackets",
765
- "jaded",
766
- "jagged",
767
- "jailed",
768
- "jamming",
769
- "january",
770
- "jargon",
771
- "jaunt",
772
- "javelin",
773
- "jaws",
774
- "jazz",
775
- "jeans",
776
- "jeers",
777
- "jellyfish",
778
- "jeopardy",
779
- "jerseys",
780
- "jester",
781
- "jetting",
782
- "jewels",
783
- "jigsaw",
784
- "jingle",
785
- "jittery",
786
- "jive",
787
- "jobs",
788
- "jockey",
789
- "jogger",
790
- "joining",
791
- "joking",
792
- "jolted",
793
- "jostle",
794
- "journal",
795
- "joyous",
796
- "jubilee",
797
- "judge",
798
- "juggled",
799
- "juicy",
800
- "jukebox",
801
- "july",
802
- "jump",
803
- "junk",
804
- "jury",
805
- "justice",
806
- "juvenile",
807
- "kangaroo",
808
- "karate",
809
- "keep",
810
- "kennel",
811
- "kept",
812
- "kernels",
813
- "kettle",
814
- "keyboard",
815
- "kickoff",
816
- "kidneys",
817
- "king",
818
- "kiosk",
819
- "kisses",
820
- "kitchens",
821
- "kiwi",
822
- "knapsack",
823
- "knee",
824
- "knife",
825
- "knowledge",
826
- "knuckle",
827
- "koala",
828
- "laboratory",
829
- "ladder",
830
- "lagoon",
831
- "lair",
832
- "lakes",
833
- "lamb",
834
- "language",
835
- "laptop",
836
- "large",
837
- "last",
838
- "later",
839
- "launching",
840
- "lava",
841
- "lawsuit",
842
- "layout",
843
- "lazy",
844
- "lectures",
845
- "ledge",
846
- "leech",
847
- "left",
848
- "legion",
849
- "leisure",
850
- "lemon",
851
- "lending",
852
- "leopard",
853
- "lesson",
854
- "lettuce",
855
- "lexicon",
856
- "liar",
857
- "library",
858
- "licks",
859
- "lids",
860
- "lied",
861
- "lifestyle",
862
- "light",
863
- "likewise",
864
- "lilac",
865
- "limits",
866
- "linen",
867
- "lion",
868
- "lipstick",
869
- "liquid",
870
- "listen",
871
- "lively",
872
- "loaded",
873
- "lobster",
874
- "locker",
875
- "lodge",
876
- "lofty",
877
- "logic",
878
- "loincloth",
879
- "long",
880
- "looking",
881
- "lopped",
882
- "lordship",
883
- "losing",
884
- "lottery",
885
- "loudly",
886
- "love",
887
- "lower",
888
- "loyal",
889
- "lucky",
890
- "luggage",
891
- "lukewarm",
892
- "lullaby",
893
- "lumber",
894
- "lunar",
895
- "lurk",
896
- "lush",
897
- "luxury",
898
- "lymph",
899
- "lynx",
900
- "lyrics",
901
- "macro",
902
- "madness",
903
- "magically",
904
- "mailed",
905
- "major",
906
- "makeup",
907
- "malady",
908
- "mammal",
909
- "maps",
910
- "masterful",
911
- "match",
912
- "maul",
913
- "maverick",
914
- "maximum",
915
- "mayor",
916
- "maze",
917
- "meant",
918
- "mechanic",
919
- "medicate",
920
- "meeting",
921
- "megabyte",
922
- "melting",
923
- "memoir",
924
- "menu",
925
- "merger",
926
- "mesh",
927
- "metro",
928
- "mews",
929
- "mice",
930
- "midst",
931
- "mighty",
932
- "mime",
933
- "mirror",
934
- "misery",
935
- "mittens",
936
- "mixture",
937
- "moat",
938
- "mobile",
939
- "mocked",
940
- "mohawk",
941
- "moisture",
942
- "molten",
943
- "moment",
944
- "money",
945
- "moon",
946
- "mops",
947
- "morsel",
948
- "mostly",
949
- "motherly",
950
- "mouth",
951
- "movement",
952
- "mowing",
953
- "much",
954
- "muddy",
955
- "muffin",
956
- "mugged",
957
- "mullet",
958
- "mumble",
959
- "mundane",
960
- "muppet",
961
- "mural",
962
- "musical",
963
- "muzzle",
964
- "myriad",
965
- "mystery",
966
- "myth",
967
- "nabbing",
968
- "nagged",
969
- "nail",
970
- "names",
971
- "nanny",
972
- "napkin",
973
- "narrate",
974
- "nasty",
975
- "natural",
976
- "nautical",
977
- "navy",
978
- "nearby",
979
- "necklace",
980
- "needed",
981
- "negative",
982
- "neither",
983
- "neon",
984
- "nephew",
985
- "nerves",
986
- "nestle",
987
- "network",
988
- "neutral",
989
- "never",
990
- "newt",
991
- "nexus",
992
- "nibs",
993
- "niche",
994
- "niece",
995
- "nifty",
996
- "nightly",
997
- "nimbly",
998
- "nineteen",
999
- "nirvana",
1000
- "nitrogen",
1001
- "nobody",
1002
- "nocturnal",
1003
- "nodes",
1004
- "noises",
1005
- "nomad",
1006
- "noodles",
1007
- "northern",
1008
- "nostril",
1009
- "noted",
1010
- "nouns",
1011
- "novelty",
1012
- "nowhere",
1013
- "nozzle",
1014
- "nuance",
1015
- "nucleus",
1016
- "nudged",
1017
- "nugget",
1018
- "nuisance",
1019
- "null",
1020
- "number",
1021
- "nuns",
1022
- "nurse",
1023
- "nutshell",
1024
- "nylon",
1025
- "oaks",
1026
- "oars",
1027
- "oasis",
1028
- "oatmeal",
1029
- "obedient",
1030
- "object",
1031
- "obliged",
1032
- "obnoxious",
1033
- "observant",
1034
- "obtains",
1035
- "obvious",
1036
- "occur",
1037
- "ocean",
1038
- "october",
1039
- "odds",
1040
- "odometer",
1041
- "offend",
1042
- "often",
1043
- "oilfield",
1044
- "ointment",
1045
- "okay",
1046
- "older",
1047
- "olive",
1048
- "olympics",
1049
- "omega",
1050
- "omission",
1051
- "omnibus",
1052
- "onboard",
1053
- "oncoming",
1054
- "oneself",
1055
- "ongoing",
1056
- "onion",
1057
- "online",
1058
- "onslaught",
1059
- "onto",
1060
- "onward",
1061
- "oozed",
1062
- "opacity",
1063
- "opened",
1064
- "opposite",
1065
- "optical",
1066
- "opus",
1067
- "orange",
1068
- "orbit",
1069
- "orchid",
1070
- "orders",
1071
- "organs",
1072
- "origin",
1073
- "ornament",
1074
- "orphans",
1075
- "oscar",
1076
- "ostrich",
1077
- "otherwise",
1078
- "otter",
1079
- "ouch",
1080
- "ought",
1081
- "ounce",
1082
- "ourselves",
1083
- "oust",
1084
- "outbreak",
1085
- "oval",
1086
- "oven",
1087
- "owed",
1088
- "owls",
1089
- "owner",
1090
- "oxidant",
1091
- "oxygen",
1092
- "oyster",
1093
- "ozone",
1094
- "pact",
1095
- "paddles",
1096
- "pager",
1097
- "pairing",
1098
- "palace",
1099
- "pamphlet",
1100
- "pancakes",
1101
- "paper",
1102
- "paradise",
1103
- "pastry",
1104
- "patio",
1105
- "pause",
1106
- "pavements",
1107
- "pawnshop",
1108
- "payment",
1109
- "peaches",
1110
- "pebbles",
1111
- "peculiar",
1112
- "pedantic",
1113
- "peeled",
1114
- "pegs",
1115
- "pelican",
1116
- "pencil",
1117
- "people",
1118
- "pepper",
1119
- "perfect",
1120
- "pests",
1121
- "petals",
1122
- "phase",
1123
- "pheasants",
1124
- "phone",
1125
- "phrases",
1126
- "physics",
1127
- "piano",
1128
- "picked",
1129
- "pierce",
1130
- "pigment",
1131
- "piloted",
1132
- "pimple",
1133
- "pinched",
1134
- "pioneer",
1135
- "pipeline",
1136
- "pirate",
1137
- "pistons",
1138
- "pitched",
1139
- "pivot",
1140
- "pixels",
1141
- "pizza",
1142
- "playful",
1143
- "pledge",
1144
- "pliers",
1145
- "plotting",
1146
- "plus",
1147
- "plywood",
1148
- "poaching",
1149
- "pockets",
1150
- "podcast",
1151
- "poetry",
1152
- "point",
1153
- "poker",
1154
- "polar",
1155
- "ponies",
1156
- "pool",
1157
- "popular",
1158
- "portents",
1159
- "possible",
1160
- "potato",
1161
- "pouch",
1162
- "poverty",
1163
- "powder",
1164
- "pram",
1165
- "present",
1166
- "pride",
1167
- "problems",
1168
- "pruned",
1169
- "prying",
1170
- "psychic",
1171
- "public",
1172
- "puck",
1173
- "puddle",
1174
- "puffin",
1175
- "pulp",
1176
- "pumpkins",
1177
- "punch",
1178
- "puppy",
1179
- "purged",
1180
- "push",
1181
- "putty",
1182
- "puzzled",
1183
- "pylons",
1184
- "pyramid",
1185
- "python",
1186
- "queen",
1187
- "quick",
1188
- "quote",
1189
- "rabbits",
1190
- "racetrack",
1191
- "radar",
1192
- "rafts",
1193
- "rage",
1194
- "railway",
1195
- "raking",
1196
- "rally",
1197
- "ramped",
1198
- "randomly",
1199
- "rapid",
1200
- "rarest",
1201
- "rash",
1202
- "rated",
1203
- "ravine",
1204
- "rays",
1205
- "razor",
1206
- "react",
1207
- "rebel",
1208
- "recipe",
1209
- "reduce",
1210
- "reef",
1211
- "refer",
1212
- "regular",
1213
- "reheat",
1214
- "reinvest",
1215
- "rejoices",
1216
- "rekindle",
1217
- "relic",
1218
- "remedy",
1219
- "renting",
1220
- "reorder",
1221
- "repent",
1222
- "request",
1223
- "reruns",
1224
- "rest",
1225
- "return",
1226
- "reunion",
1227
- "revamp",
1228
- "rewind",
1229
- "rhino",
1230
- "rhythm",
1231
- "ribbon",
1232
- "richly",
1233
- "ridges",
1234
- "rift",
1235
- "rigid",
1236
- "rims",
1237
- "ringing",
1238
- "riots",
1239
- "ripped",
1240
- "rising",
1241
- "ritual",
1242
- "river",
1243
- "roared",
1244
- "robot",
1245
- "rockets",
1246
- "rodent",
1247
- "rogue",
1248
- "roles",
1249
- "romance",
1250
- "roomy",
1251
- "roped",
1252
- "roster",
1253
- "rotate",
1254
- "rounded",
1255
- "rover",
1256
- "rowboat",
1257
- "royal",
1258
- "ruby",
1259
- "rudely",
1260
- "ruffled",
1261
- "rugged",
1262
- "ruined",
1263
- "ruling",
1264
- "rumble",
1265
- "runway",
1266
- "rural",
1267
- "rustled",
1268
- "ruthless",
1269
- "sabotage",
1270
- "sack",
1271
- "sadness",
1272
- "safety",
1273
- "saga",
1274
- "sailor",
1275
- "sake",
1276
- "salads",
1277
- "sample",
1278
- "sanity",
1279
- "sapling",
1280
- "sarcasm",
1281
- "sash",
1282
- "satin",
1283
- "saucepan",
1284
- "saved",
1285
- "sawmill",
1286
- "saxophone",
1287
- "sayings",
1288
- "scamper",
1289
- "scenic",
1290
- "school",
1291
- "science",
1292
- "scoop",
1293
- "scrub",
1294
- "scuba",
1295
- "seasons",
1296
- "second",
1297
- "sedan",
1298
- "seeded",
1299
- "segments",
1300
- "seismic",
1301
- "selfish",
1302
- "semifinal",
1303
- "sensible",
1304
- "september",
1305
- "sequence",
1306
- "serving",
1307
- "session",
1308
- "setup",
1309
- "seventh",
1310
- "sewage",
1311
- "shackles",
1312
- "shelter",
1313
- "shipped",
1314
- "shocking",
1315
- "shrugged",
1316
- "shuffled",
1317
- "shyness",
1318
- "siblings",
1319
- "sickness",
1320
- "sidekick",
1321
- "sieve",
1322
- "sifting",
1323
- "sighting",
1324
- "silk",
1325
- "simplest",
1326
- "sincerely",
1327
- "sipped",
1328
- "siren",
1329
- "situated",
1330
- "sixteen",
1331
- "sizes",
1332
- "skater",
1333
- "skew",
1334
- "skirting",
1335
- "skulls",
1336
- "skydive",
1337
- "slackens",
1338
- "sleepless",
1339
- "slid",
1340
- "slower",
1341
- "slug",
1342
- "smash",
1343
- "smelting",
1344
- "smidgen",
1345
- "smog",
1346
- "smuggled",
1347
- "snake",
1348
- "sneeze",
1349
- "sniff",
1350
- "snout",
1351
- "snug",
1352
- "soapy",
1353
- "sober",
1354
- "soccer",
1355
- "soda",
1356
- "software",
1357
- "soggy",
1358
- "soil",
1359
- "solved",
1360
- "somewhere",
1361
- "sonic",
1362
- "soothe",
1363
- "soprano",
1364
- "sorry",
1365
- "southern",
1366
- "sovereign",
1367
- "sowed",
1368
- "soya",
1369
- "space",
1370
- "speedy",
1371
- "sphere",
1372
- "spiders",
1373
- "splendid",
1374
- "spout",
1375
- "sprig",
1376
- "spud",
1377
- "spying",
1378
- "square",
1379
- "stacking",
1380
- "stellar",
1381
- "stick",
1382
- "stockpile",
1383
- "strained",
1384
- "stunning",
1385
- "stylishly",
1386
- "subtly",
1387
- "succeed",
1388
- "suddenly",
1389
- "suede",
1390
- "suffice",
1391
- "sugar",
1392
- "suitcase",
1393
- "sulking",
1394
- "summon",
1395
- "sunken",
1396
- "superior",
1397
- "surfer",
1398
- "sushi",
1399
- "suture",
1400
- "swagger",
1401
- "swept",
1402
- "swiftly",
1403
- "sword",
1404
- "swung",
1405
- "syllabus",
1406
- "symptoms",
1407
- "syndrome",
1408
- "syringe",
1409
- "system",
1410
- "taboo",
1411
- "tacit",
1412
- "tadpoles",
1413
- "tagged",
1414
- "tail",
1415
- "taken",
1416
- "talent",
1417
- "tamper",
1418
- "tanks",
1419
- "tapestry",
1420
- "tarnished",
1421
- "tasked",
1422
- "tattoo",
1423
- "taunts",
1424
- "tavern",
1425
- "tawny",
1426
- "taxi",
1427
- "teardrop",
1428
- "technical",
1429
- "tedious",
1430
- "teeming",
1431
- "tell",
1432
- "template",
1433
- "tender",
1434
- "tepid",
1435
- "tequila",
1436
- "terminal",
1437
- "testing",
1438
- "tether",
1439
- "textbook",
1440
- "thaw",
1441
- "theatrics",
1442
- "thirsty",
1443
- "thorn",
1444
- "threaten",
1445
- "thumbs",
1446
- "thwart",
1447
- "ticket",
1448
- "tidy",
1449
- "tiers",
1450
- "tiger",
1451
- "tilt",
1452
- "timber",
1453
- "tinted",
1454
- "tipsy",
1455
- "tirade",
1456
- "tissue",
1457
- "titans",
1458
- "toaster",
1459
- "tobacco",
1460
- "today",
1461
- "toenail",
1462
- "toffee",
1463
- "together",
1464
- "toilet",
1465
- "token",
1466
- "tolerant",
1467
- "tomorrow",
1468
- "tonic",
1469
- "toolbox",
1470
- "topic",
1471
- "torch",
1472
- "tossed",
1473
- "total",
1474
- "touchy",
1475
- "towel",
1476
- "toxic",
1477
- "toyed",
1478
- "trash",
1479
- "trendy",
1480
- "tribal",
1481
- "trolling",
1482
- "truth",
1483
- "trying",
1484
- "tsunami",
1485
- "tubes",
1486
- "tucks",
1487
- "tudor",
1488
- "tuesday",
1489
- "tufts",
1490
- "tugs",
1491
- "tuition",
1492
- "tulips",
1493
- "tumbling",
1494
- "tunnel",
1495
- "turnip",
1496
- "tusks",
1497
- "tutor",
1498
- "tuxedo",
1499
- "twang",
1500
- "tweezers",
1501
- "twice",
1502
- "twofold",
1503
- "tycoon",
1504
- "typist",
1505
- "tyrant",
1506
- "ugly",
1507
- "ulcers",
1508
- "ultimate",
1509
- "umbrella",
1510
- "umpire",
1511
- "unafraid",
1512
- "unbending",
1513
- "uncle",
1514
- "under",
1515
- "uneven",
1516
- "unfit",
1517
- "ungainly",
1518
- "unhappy",
1519
- "union",
1520
- "unjustly",
1521
- "unknown",
1522
- "unlikely",
1523
- "unmask",
1524
- "unnoticed",
1525
- "unopened",
1526
- "unplugs",
1527
- "unquoted",
1528
- "unrest",
1529
- "unsafe",
1530
- "until",
1531
- "unusual",
1532
- "unveil",
1533
- "unwind",
1534
- "unzip",
1535
- "upbeat",
1536
- "upcoming",
1537
- "update",
1538
- "upgrade",
1539
- "uphill",
1540
- "upkeep",
1541
- "upload",
1542
- "upon",
1543
- "upper",
1544
- "upright",
1545
- "upstairs",
1546
- "uptight",
1547
- "upwards",
1548
- "urban",
1549
- "urchins",
1550
- "urgent",
1551
- "usage",
1552
- "useful",
1553
- "usher",
1554
- "using",
1555
- "usual",
1556
- "utensils",
1557
- "utility",
1558
- "utmost",
1559
- "utopia",
1560
- "uttered",
1561
- "vacation",
1562
- "vague",
1563
- "vain",
1564
- "value",
1565
- "vampire",
1566
- "vane",
1567
- "vapidly",
1568
- "vary",
1569
- "vastness",
1570
- "vats",
1571
- "vaults",
1572
- "vector",
1573
- "veered",
1574
- "vegan",
1575
- "vehicle",
1576
- "vein",
1577
- "velvet",
1578
- "venomous",
1579
- "verification",
1580
- "vessel",
1581
- "veteran",
1582
- "vexed",
1583
- "vials",
1584
- "vibrate",
1585
- "victim",
1586
- "video",
1587
- "viewpoint",
1588
- "vigilant",
1589
- "viking",
1590
- "village",
1591
- "vinegar",
1592
- "violin",
1593
- "vipers",
1594
- "virtual",
1595
- "visited",
1596
- "vitals",
1597
- "vivid",
1598
- "vixen",
1599
- "vocal",
1600
- "vogue",
1601
- "voice",
1602
- "volcano",
1603
- "vortex",
1604
- "voted",
1605
- "voucher",
1606
- "vowels",
1607
- "voyage",
1608
- "vulture",
1609
- "wade",
1610
- "waffle",
1611
- "wagtail",
1612
- "waist",
1613
- "waking",
1614
- "wallets",
1615
- "wanted",
1616
- "warped",
1617
- "washing",
1618
- "water",
1619
- "waveform",
1620
- "waxing",
1621
- "wayside",
1622
- "weavers",
1623
- "website",
1624
- "wedge",
1625
- "weekday",
1626
- "weird",
1627
- "welders",
1628
- "went",
1629
- "wept",
1630
- "were",
1631
- "western",
1632
- "wetsuit",
1633
- "whale",
1634
- "when",
1635
- "whipped",
1636
- "whole",
1637
- "wickets",
1638
- "width",
1639
- "wield",
1640
- "wife",
1641
- "wiggle",
1642
- "wildly",
1643
- "winter",
1644
- "wipeout",
1645
- "wiring",
1646
- "wise",
1647
- "withdrawn",
1648
- "wives",
1649
- "wizard",
1650
- "wobbly",
1651
- "woes",
1652
- "woken",
1653
- "wolf",
1654
- "womanly",
1655
- "wonders",
1656
- "woozy",
1657
- "worry",
1658
- "wounded",
1659
- "woven",
1660
- "wrap",
1661
- "wrist",
1662
- "wrong",
1663
- "yacht",
1664
- "yahoo",
1665
- "yanks",
1666
- "yard",
1667
- "yawning",
1668
- "yearbook",
1669
- "yellow",
1670
- "yesterday",
1671
- "yeti",
1672
- "yields",
1673
- "yodel",
1674
- "yoga",
1675
- "younger",
1676
- "yoyo",
1677
- "zapped",
1678
- "zeal",
1679
- "zebra",
1680
- "zero",
1681
- "zesty",
1682
- "zigzags",
1683
- "zinger",
1684
- "zippers",
1685
- "zodiac",
1686
- "zombie",
1687
- "zones",
1688
- "zoom"
1689
-];
cw_wownero/lib/wownero_transaction_info.dart
-21
@@ -1,6 +1,5 @@
1
import 'package:cw_core/transaction_info.dart';
2
import 'package:cw_core/wownero_amount_format.dart';
3
-import 'package:cw_wownero/api/structs/transaction_info_row.dart';
3
import 'package:cw_core/parseBoolFromString.dart';
4
import 'package:cw_core/transaction_direction.dart';
5
import 'package:cw_core/format_amount.dart';
@@ -35,26 +34,6 @@ class WowneroTransactionInfo extends TransactionInfo {
34
};
35
}
36
38
- WowneroTransactionInfo.fromRow(TransactionInfoRow row)
39
- : id = "${row.getHash()}_${row.getAmount()}_${row.subaddrAccount}_${row.subaddrIndex}",
40
- txHash = row.getHash(),
41
- height = row.blockHeight,
42
- direction = parseTransactionDirectionFromInt(row.direction),
43
- date = DateTime.fromMillisecondsSinceEpoch(row.getDatetime() * 1000),
44
- isPending = row.isPending != 0,
45
- amount = row.getAmount(),
46
- accountIndex = row.subaddrAccount,
47
- addressIndex = row.subaddrIndex,
48
- confirmations = row.confirmations,
49
- key = getTxKey(row.getHash()),
50
- fee = row.fee {
51
- additionalInfo = <String, dynamic>{
52
- 'key': key,
53
- 'accountIndex': accountIndex,
54
- 'addressIndex': addressIndex
55
- };
56
- }
57
-
37
final String id;
38
final String txHash;
39
final int height;
cw_wownero/lib/wownero_unspent.dart
-9
@@ -1,5 +1,4 @@
1
import 'package:cw_core/unspent_transaction_output.dart';
2
-import 'package:cw_wownero/api/structs/coins_info_row.dart';
2
3
class WowneroUnspent extends Unspent {
4
WowneroUnspent(
@@ -8,13 +7,5 @@ class WowneroUnspent extends Unspent {
7
this.isFrozen = isFrozen;
8
}
9
11
- factory WowneroUnspent.fromCoinsInfoRow(CoinsInfoRow coinsInfoRow) => WowneroUnspent(
12
- coinsInfoRow.getAddress(),
13
- coinsInfoRow.getHash(),
14
- coinsInfoRow.getKeyImage(),
15
- coinsInfoRow.amount,
16
- coinsInfoRow.frozen == 1,
17
- coinsInfoRow.unlocked == 1);
18
-
10
final bool isUnlocked;
11
}
cw_wownero/lib/wownero_wallet.dart
+8
-14
@@ -107,9 +107,7 @@ abstract class WowneroWalletBase
107
@override
108
String get seed => wownero_wallet.getSeed();
109
110
- String seedLegacy(String? language) {
111
- return wownero_wallet.getSeedLegacy(language);
112
- }
110
+ String seedLegacy(String? language) => wownero_wallet.getSeedLegacy(language);
111
112
@override
113
MoneroWalletKeys get keys => MoneroWalletKeys(
@@ -182,12 +180,12 @@ abstract class WowneroWalletBase
180
@override
181
Future<void> startSync() async {
182
try {
185
- _setInitialHeight();
183
+ _assertInitialHeight();
184
} catch (_) {
185
// our restore height wasn't correct, so lets see if using the backup works:
186
try {
187
await resetCache(name);
190
- _setInitialHeight();
188
+ _assertInitialHeight();
189
} catch (e) {
190
// we still couldn't get a valid height from the backup?!:
191
// try to use the date instead:
@@ -604,18 +602,14 @@ abstract class WowneroWalletBase
602
_listener = wownero_wallet.setListeners(_onNewBlock, _onNewTransaction);
603
}
604
607
- // check if the height is correct:
608
- void _setInitialHeight() {
609
- if (walletInfo.isRecovery) {
610
- return;
611
- }
605
+ /// Asserts the current height to be above [MIN_RESTORE_HEIGHT]
606
+ void _assertInitialHeight() {
607
+ if (walletInfo.isRecovery) return;
608
609
final height = wownero_wallet.getCurrentHeight();
610
615
- if (height > MIN_RESTORE_HEIGHT) {
616
- // the restore height is probably correct, so we do nothing:
617
- return;
618
- }
611
+ // the restore height is probably correct, so we do nothing:
612
+ if (height > MIN_RESTORE_HEIGHT) return;
613
614
throw Exception("height isn't > $MIN_RESTORE_HEIGHT!");
615
}
cw_wownero/pubspec.lock
+4
-4
@@ -437,10 +437,10 @@ packages:
437
monero:
438
dependency: "direct main"
439
description:
440
- path: "."
441
- ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
442
- resolved-ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
443
- url: "https://github.com/mrcyjanek/monero.dart"
440
+ path: "impls/monero.dart"
441
+ ref: "bcb328a4956105dc182afd0ce2e48fe263f5f20b"
442
+ resolved-ref: "bcb328a4956105dc182afd0ce2e48fe263f5f20b"
443
+ url: "https://github.com/mrcyjanek/monero_c"
444
source: git
445
version: "0.0.0"
446
mutex:
cw_wownero/pubspec.yaml
+3
-2
@@ -24,8 +24,9 @@ dependencies:
24
path: ../cw_core
25
monero:
26
git:
27
- url: https://github.com/mrcyjanek/monero.dart
28
- ref: d46753eca865e9e56c2f0ef6fe485c42e11982c5
27
+ url: https://github.com/mrcyjanek/monero_c
28
+ ref: bcb328a4956105dc182afd0ce2e48fe263f5f20b # monero_c hash
29
+ path: impls/monero.dart
30
mutex: ^3.1.0
31
32
dev_dependencies:
lib/monero/cw_monero.dart
+5
@@ -346,4 +346,9 @@ class CWMonero extends Monero {
346
Future<int> getCurrentHeight() async {
347
return monero_wallet_api.getCurrentHeight();
348
}
349
+
350
+ @override
351
+ void monerocCheck() {
352
+ checkIfMoneroCIsFine();
353
+ }
354
}
lib/src/screens/dashboard/pages/balance_page.dart
+30
@@ -124,6 +124,36 @@ class CryptoBalanceWidget extends StatelessWidget {
124
child: Column(
125
crossAxisAlignment: CrossAxisAlignment.center,
126
children: [
127
+ Observer(
128
+ builder: (_) {
129
+ if (dashboardViewModel.getMoneroError != null) {
130
+ return Padding(
131
+ padding: const EdgeInsets.fromLTRB(16,0,16,16),
132
+ child: DashBoardRoundedCardWidget(
133
+ title: "Invalid monero bindings",
134
+ subTitle: dashboardViewModel.getMoneroError.toString(),
135
+ onTap: () {},
136
+ ),
137
+ );
138
+ }
139
+ return Container();
140
+ },
141
+ ),
142
+ Observer(
143
+ builder: (_) {
144
+ if (dashboardViewModel.getWowneroError != null) {
145
+ return Padding(
146
+ padding: const EdgeInsets.fromLTRB(16,0,16,16),
147
+ child: DashBoardRoundedCardWidget(
148
+ title: "Invalid wownero bindings",
149
+ subTitle: dashboardViewModel.getWowneroError.toString(),
150
+ onTap: () {},
151
+ )
152
+ );
153
+ }
154
+ return Container();
155
+ },
156
+ ),
157
Observer(
158
builder: (_) => dashboardViewModel.balanceViewModel.hasAccounts
159
? HomeScreenAccountWidget(
lib/view_model/dashboard/dashboard_view_model.dart
+22
@@ -11,6 +11,7 @@ import 'package:cake_wallet/entities/service_status.dart';
11
import 'package:cake_wallet/exchange/exchange_provider_description.dart';
12
import 'package:cake_wallet/generated/i18n.dart';
13
import 'package:cake_wallet/monero/monero.dart';
14
+import 'package:cake_wallet/wownero/wownero.dart' as wow;
15
import 'package:cake_wallet/nano/nano.dart';
16
import 'package:cake_wallet/store/anonpay/anonpay_transactions_store.dart';
17
import 'package:cake_wallet/store/app_store.dart';
@@ -336,6 +337,27 @@ abstract class DashboardViewModelBase with Store {
337
wallet.type == WalletType.haven;
338
339
@computed
340
+ String? get getMoneroError {
341
+ if (wallet.type != WalletType.monero) return null;
342
+ try {
343
+ monero!.monerocCheck();
344
+ } catch (e) {
345
+ return e.toString();
346
+ }
347
+ return null;
348
+ }
349
+
350
+ @computed
351
+ String? get getWowneroError {
352
+ if (wallet.type != WalletType.wownero) return null;
353
+ try {
354
+ wow.wownero!.wownerocCheck();
355
+ } catch (e) {
356
+ return e.toString();
357
+ }
358
+ return null;
359
+ }
360
+
361
List<String> get isMoneroWalletBrokenReasons {
362
if (wallet.type != WalletType.monero) return [];
363
final keys = monero!.getKeys(wallet);
lib/wownero/cw_wownero.dart
+5
@@ -347,4 +347,9 @@ class CWWownero extends Wownero {
347
348
String getLegacySeed(Object wallet, String langName) =>
349
(wallet as WowneroWalletBase).seedLegacy(langName);
350
+
351
+ @override
352
+ void wownerocCheck() {
353
+ checkIfMoneroCIsFine();
354
+ }
355
}
scripts/prepare_moneroc.sh
+1
-1
@@ -8,7 +8,7 @@ if [[ ! -d "monero_c" ]];
8
then
9
git clone https://github.com/mrcyjanek/monero_c --branch rewrite-wip
10
cd monero_c
11
- git checkout c094ed5da69d2274747bf6edd7ca24124487bd34
11
+ git checkout bcb328a4956105dc182afd0ce2e48fe263f5f20b
12
git reset --hard
13
git submodule update --init --force --recursive
14
./apply_patches.sh monero
tool/configure.dart
+4
@@ -262,6 +262,7 @@ import 'package:cw_core/monero_amount_format.dart';
262
import 'package:cw_core/monero_transaction_priority.dart';
263
import 'package:cw_monero/monero_unspent.dart';
264
import 'package:cw_monero/monero_wallet_service.dart';
265
+import 'package:cw_monero/api/wallet_manager.dart';
266
import 'package:cw_monero/monero_wallet.dart';
267
import 'package:cw_monero/monero_transaction_info.dart';
268
import 'package:cw_monero/monero_transaction_creation_credentials.dart';
@@ -377,6 +378,7 @@ abstract class Monero {
378
double formatterMoneroAmountToDouble({required int amount});
379
int formatterMoneroParseAmount({required String amount});
380
Account getCurrentAccount(Object wallet);
381
+ void monerocCheck();
382
void setCurrentAccount(Object wallet, int id, String label, String? balance);
383
void onStartup();
384
int getTransactionInfoAccountId(TransactionInfo tx);
@@ -449,6 +451,7 @@ import 'package:cw_wownero/wownero_transaction_info.dart';
451
import 'package:cw_wownero/wownero_transaction_creation_credentials.dart';
452
import 'package:cw_core/account.dart' as wownero_account;
453
import 'package:cw_wownero/api/wallet.dart' as wownero_wallet_api;
454
+import 'package:cw_wownero/api/wallet_manager.dart';
455
import 'package:cw_wownero/mnemonics/english.dart';
456
import 'package:cw_wownero/mnemonics/chinese_simplified.dart';
457
import 'package:cw_wownero/mnemonics/dutch.dart';
@@ -540,6 +543,7 @@ abstract class Wownero {
543
Future<void> updateUnspents(Object wallet);
544
545
Future<int> getCurrentHeight();
546
+ void wownerocCheck();
547
548
WalletCredentials createWowneroRestoreWalletFromKeysCredentials({
549
required String name,