Skip to content

Commit 203b32f

Browse files
committed
Merge branch 'staging' into testing
2 parents 21e0cf7 + 3e80df5 commit 203b32f

File tree

17 files changed

+192
-96
lines changed

17 files changed

+192
-96
lines changed

lib/db/sqlite/firo_cache.dart

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,13 @@ abstract class _FiroCache {
6565
await StackFileSystem.applicationFiroCacheSQLiteDirectory();
6666

6767
for (final network in networks) {
68-
final sparkSetCacheFile =
69-
File("${sqliteDir.path}/${sparkSetCacheFileName(network)}");
68+
final sparkSetCacheFile = File(
69+
"${sqliteDir.path}/${sparkSetCacheFileName(network)}",
70+
);
7071

71-
final sparkUsedTagsCacheFile =
72-
File("${sqliteDir.path}/${sparkUsedTagsCacheFileName(network)}");
72+
final sparkUsedTagsCacheFile = File(
73+
"${sqliteDir.path}/${sparkUsedTagsCacheFileName(network)}",
74+
);
7375

7476
if (!(await sparkSetCacheFile.exists())) {
7577
await _createSparkSetCacheDb(sparkSetCacheFile.path);
@@ -91,35 +93,40 @@ abstract class _FiroCache {
9193

9294
static Future<void> _deleteAllCache(CryptoCurrencyNetwork network) async {
9395
final start = DateTime.now();
94-
setCacheDB(network).execute(
95-
"""
96+
setCacheDB(network).execute("""
9697
DELETE FROM SparkSet;
9798
DELETE FROM SparkCoin;
9899
DELETE FROM SparkSetCoins;
99100
VACUUM;
100-
""",
101+
""");
102+
await _deleteUsedTagsCache(network);
103+
104+
Logging.instance.d(
105+
"_deleteAllCache() "
106+
"duration = ${DateTime.now().difference(start)}",
101107
);
102-
usedTagsCacheDB(network).execute(
103-
"""
108+
}
109+
110+
static Future<void> _deleteUsedTagsCache(
111+
CryptoCurrencyNetwork network,
112+
) async {
113+
final start = DateTime.now();
114+
115+
usedTagsCacheDB(network).execute("""
104116
DELETE FROM SparkUsedCoinTags;
105117
VACUUM;
106-
""",
107-
);
118+
""");
108119

109120
Logging.instance.d(
110-
"_deleteAllCache() "
121+
"_deleteUsedTagsCache() "
111122
"duration = ${DateTime.now().difference(start)}",
112123
);
113124
}
114125

115126
static Future<void> _createSparkSetCacheDb(String file) async {
116-
final db = sqlite3.open(
117-
file,
118-
mode: OpenMode.readWriteCreate,
119-
);
127+
final db = sqlite3.open(file, mode: OpenMode.readWriteCreate);
120128

121-
db.execute(
122-
"""
129+
db.execute("""
123130
CREATE TABLE SparkSet (
124131
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
125132
blockHash TEXT NOT NULL,
@@ -145,27 +152,21 @@ abstract class _FiroCache {
145152
FOREIGN KEY (setId) REFERENCES SparkSet(id),
146153
FOREIGN KEY (coinId) REFERENCES SparkCoin(id)
147154
);
148-
""",
149-
);
155+
""");
150156

151157
db.dispose();
152158
}
153159

154160
static Future<void> _createSparkUsedTagsCacheDb(String file) async {
155-
final db = sqlite3.open(
156-
file,
157-
mode: OpenMode.readWriteCreate,
158-
);
161+
final db = sqlite3.open(file, mode: OpenMode.readWriteCreate);
159162

160-
db.execute(
161-
"""
163+
db.execute("""
162164
CREATE TABLE SparkUsedCoinTags (
163165
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
164166
tag TEXT NOT NULL UNIQUE,
165167
txid TEXT NOT NULL
166168
);
167-
""",
168-
);
169+
""");
169170

170171
db.dispose();
171172
}

lib/db/sqlite/firo_cache_coordinator.dart

Lines changed: 36 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,13 @@ abstract class FiroCacheCoordinator {
2323
}
2424
}
2525

26-
static Future<void> clearSharedCache(CryptoCurrencyNetwork network) async {
26+
static Future<void> clearSharedCache(
27+
CryptoCurrencyNetwork network, {
28+
bool clearOnlyUsedTagsCache = false,
29+
}) async {
30+
if (clearOnlyUsedTagsCache) {
31+
return await _FiroCache._deleteUsedTagsCache(network);
32+
}
2733
return await _FiroCache._deleteAllCache(network);
2834
}
2935

@@ -38,9 +44,10 @@ abstract class FiroCacheCoordinator {
3844

3945
final setSize =
4046
(await setCacheFile.exists()) ? await setCacheFile.length() : 0;
41-
final tagsSize = (await usedTagsCacheFile.exists())
42-
? await usedTagsCacheFile.length()
43-
: 0;
47+
final tagsSize =
48+
(await usedTagsCacheFile.exists())
49+
? await usedTagsCacheFile.length()
50+
: 0;
4451

4552
Logging.instance.d("Spark cache used tags size: $tagsSize");
4653
Logging.instance.d("Spark cache anon set size: $setSize");
@@ -67,16 +74,11 @@ abstract class FiroCacheCoordinator {
6774
) async {
6875
await _tagLocks[network]!.protect(() async {
6976
final count = await FiroCacheCoordinator.getUsedCoinTagsCount(network);
70-
final unhashedTags =
71-
await client.getSparkUnhashedUsedCoinsTagsWithTxHashes(
72-
startNumber: count,
73-
);
77+
final unhashedTags = await client
78+
.getSparkUnhashedUsedCoinsTagsWithTxHashes(startNumber: count);
7479
if (unhashedTags.isNotEmpty) {
7580
await _workers[network]!.runTask(
76-
FCTask(
77-
func: FCFuncName._updateSparkUsedTagsWith,
78-
data: unhashedTags,
79-
),
81+
FCTask(func: FCFuncName._updateSparkUsedTagsWith, data: unhashedTags),
8082
);
8183
}
8284
});
@@ -98,9 +100,7 @@ abstract class FiroCacheCoordinator {
98100

99101
final prevSize = prevMeta?.size ?? 0;
100102

101-
final meta = await client.getSparkAnonymitySetMeta(
102-
coinGroupId: groupId,
103-
);
103+
final meta = await client.getSparkAnonymitySetMeta(coinGroupId: groupId);
104104

105105
progressUpdated?.call(prevSize, meta.size);
106106

@@ -141,9 +141,10 @@ abstract class FiroCacheCoordinator {
141141
coins.addAll(data);
142142
}
143143

144-
final result = coins
145-
.map((e) => RawSparkCoin.fromRPCResponse(e as List, groupId))
146-
.toList();
144+
final result =
145+
coins
146+
.map((e) => RawSparkCoin.fromRPCResponse(e as List, groupId))
147+
.toList();
147148

148149
await _workers[network]!.runTask(
149150
FCTask(
@@ -156,20 +157,18 @@ abstract class FiroCacheCoordinator {
156157

157158
// ===========================================================================
158159

159-
static Future<Set<String>> getUsedCoinTags(
160+
static Future<List<String>> getUsedCoinTags(
160161
int startNumber,
161162
CryptoCurrencyNetwork network,
162163
) async {
163164
final result = await _Reader._getSparkUsedCoinTags(
164165
startNumber,
165166
db: _FiroCache.usedTagsCacheDB(network),
166167
);
167-
return result.map((e) => e["tag"] as String).toSet();
168+
return result.map((e) => e["tag"] as String).toList();
168169
}
169170

170-
static Future<int> getUsedCoinTagsCount(
171-
CryptoCurrencyNetwork network,
172-
) async {
171+
static Future<int> getUsedCoinTagsCount(CryptoCurrencyNetwork network) async {
173172
final result = await _Reader._getUsedCoinTagsCount(
174173
db: _FiroCache.usedTagsCacheDB(network),
175174
);
@@ -195,24 +194,19 @@ abstract class FiroCacheCoordinator {
195194
return [];
196195
}
197196
return result.rows
198-
.map(
199-
(e) => (
200-
tag: e[0] as String,
201-
txid: e[1] as String,
202-
),
203-
)
197+
.map((e) => (tag: e[0] as String, txid: e[1] as String))
204198
.toList();
205199
}
206200

207-
static Future<Set<String>> getUsedCoinTagsFor({
201+
static Future<List<String>> getUsedCoinTagsFor({
208202
required String txid,
209203
required CryptoCurrencyNetwork network,
210204
}) async {
211205
final result = await _Reader._getUsedCoinTagsFor(
212206
txid,
213207
db: _FiroCache.usedTagsCacheDB(network),
214208
);
215-
return result.map((e) => e["tag"] as String).toSet();
209+
return result.map((e) => e["tag"] as String).toList();
216210
}
217211

218212
static Future<bool> checkTagIsUsed(
@@ -230,16 +224,17 @@ abstract class FiroCacheCoordinator {
230224
String? afterBlockHash,
231225
required CryptoCurrencyNetwork network,
232226
}) async {
233-
final resultSet = afterBlockHash == null
234-
? await _Reader._getSetCoinsForGroupId(
235-
groupId,
236-
db: _FiroCache.setCacheDB(network),
237-
)
238-
: await _Reader._getSetCoinsForGroupIdAndBlockHash(
239-
groupId,
240-
afterBlockHash,
241-
db: _FiroCache.setCacheDB(network),
242-
);
227+
final resultSet =
228+
afterBlockHash == null
229+
? await _Reader._getSetCoinsForGroupId(
230+
groupId,
231+
db: _FiroCache.setCacheDB(network),
232+
)
233+
: await _Reader._getSetCoinsForGroupIdAndBlockHash(
234+
groupId,
235+
afterBlockHash,
236+
db: _FiroCache.setCacheDB(network),
237+
);
243238

244239
return resultSet
245240
.map(

lib/db/sqlite/firo_cache_writer.dart

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,12 @@ class FCResult {
1313
/// update the sqlite cache
1414
/// Expected json format:
1515
/// returns true if successful, otherwise some exception
16-
FCResult _updateSparkUsedTagsWith(
17-
Database db,
18-
List<List<dynamic>> tags,
19-
) {
16+
FCResult _updateSparkUsedTagsWith(Database db, List<List<dynamic>> tags) {
2017
// hash the tags here since this function is called in a background isolate
21-
final hashedTags = LibSpark.hashTags(
22-
base64Tags: tags.map((e) => e[0] as String).toSet(),
23-
).toList();
24-
18+
final hashedTags =
19+
LibSpark.hashTags(
20+
base64Tags: tags.map((e) => e[0] as String).toList(),
21+
).toList();
2522
if (hashedTags.isEmpty) {
2623
// nothing to add, return early
2724
return FCResult(success: true);
@@ -70,11 +67,7 @@ FCResult _updateSparkAnonSetCoinsWith(
7067
FROM SparkSet
7168
WHERE blockHash = ? AND setHash = ? AND groupId = ?;
7269
""",
73-
[
74-
meta.blockHash,
75-
meta.setHash,
76-
meta.coinGroupId,
77-
],
70+
[meta.blockHash, meta.setHash, meta.coinGroupId],
7871
);
7972

8073
if (checkResult.isNotEmpty) {

lib/electrumx_rpc/electrumx_client.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1129,7 +1129,7 @@ class ElectrumXClient {
11291129
"Duration=${DateTime.now().difference(start)}",
11301130
);
11311131

1132-
return tags;
1132+
return tags.reversed.toList();
11331133
} catch (e, s) {
11341134
Logging.instance.e(e, error: e, stackTrace: s);
11351135
rethrow;

lib/pages/home_view/home_view.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import '../../utilities/constants.dart';
2929
import '../../utilities/idle_monitor.dart';
3030
import '../../utilities/prefs.dart';
3131
import '../../utilities/text_styles.dart';
32+
import '../../utilities/util.dart';
3233
import '../../widgets/animated_widgets/rotate_icon.dart';
3334
import '../../widgets/app_icon.dart';
3435
import '../../widgets/background.dart';
@@ -171,6 +172,41 @@ class _HomeViewState extends ConsumerState<HomeView> {
171172
);
172173
}
173174

175+
Future<void> precacheSettingsIcons(BuildContext context) async {
176+
if (Util.isDesktop) return;
177+
178+
final icons = [
179+
Assets.svg.addressBook,
180+
Assets.svg.downloadFolder,
181+
Assets.svg.lock,
182+
Assets.svg.dollarSign,
183+
Assets.svg.language,
184+
Assets.svg.node,
185+
Assets.svg.arrowRotate,
186+
Assets.svg.arrowUpRight,
187+
Assets.svg.sun,
188+
Assets.svg.circleAlert,
189+
Assets.svg.ellipsis,
190+
Assets.svg.solidSliders,
191+
Assets.svg.questionMessage,
192+
];
193+
194+
for (final asset in icons) {
195+
final loader = SvgAssetLoader(asset);
196+
await svg.cache.putIfAbsent(
197+
loader.cacheKey(context),
198+
() => loader.loadBytes(context),
199+
);
200+
}
201+
}
202+
203+
@override
204+
void didChangeDependencies() {
205+
super.didChangeDependencies();
206+
207+
precacheSettingsIcons(context);
208+
}
209+
174210
@override
175211
void initState() {
176212
_autoLockInfo = ref.read(prefsChangeNotifierProvider).autoLockInfo;

lib/pages/spark_names/buy_spark_name_view.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,22 @@ class _BuySparkNameViewState extends ConsumerState<BuySparkNameView> {
6969
try {
7070
final wallet =
7171
ref.read(pWallets).getWallet(widget.walletId) as SparkInterface;
72-
final myAddress = await wallet.getCurrentReceivingSparkAddress();
72+
Address? myAddress = await wallet.getCurrentReceivingSparkAddress();
7373
if (myAddress == null) {
7474
throw Exception("No spark address found");
7575
}
76-
addressController.text = myAddress.value;
76+
77+
final db = ref.read(pDrift(widget.walletId));
78+
final myNames = await db.select(db.sparkNames).get();
79+
while (myNames.where((e) => e.address == myAddress!.value).isNotEmpty) {
80+
Logging.instance.t(
81+
"Found address that already has a spark name. Generating next address...",
82+
);
83+
myAddress = await wallet.generateNextSparkAddress();
84+
await ref.read(mainDBProvider).updateOrPutAddresses([myAddress]);
85+
}
86+
87+
addressController.text = myAddress!.value;
7788
} catch (e, s) {
7889
Logging.instance.e("_fillCurrentReceiving", error: e, stackTrace: s);
7990
} finally {

0 commit comments

Comments
 (0)