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,