From cccf1a7012f86b4581637a5a991dc79d34670765 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 9 May 2024 12:25:32 -0600 Subject: [PATCH] don't attempt to identify already checked used coin tags and add some more logging --- .../spark_interface.dart | 42 +++++++++++++------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index b552a07d0..f25f22323 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -602,9 +602,6 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { } } - // TODO lots of room for performance improvements here. Should be similar to - // recoverSparkWallet but only fetch and check anonymity set data that we - // have not yet parsed. Future refreshSparkData() async { final sparkAddresses = await mainDB.isar.addresses .where() @@ -620,6 +617,7 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { final latestSparkCoinId = await electrumXClient.getSparkLatestCoinId(); final blockHash = await _getCachedSparkBlockHash(); + final startNumber = await _getSparkCoinsStartNumber(); final anonymitySetFuture = blockHash == null ? electrumXCachedClient.getSparkAnonymitySet( @@ -630,9 +628,10 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { coinGroupId: latestSparkCoinId.toString(), startBlockHash: blockHash, ); - final spentCoinTagsFuture = - electrumXClient.getSparkUsedCoinsTags(startNumber: 0); - // electrumXCachedClient.getSparkUsedCoinsTags(coin: info.coin); + + final spentCoinTagsFuture = startNumber == null + ? electrumXCachedClient.getSparkUsedCoinsTags(coin: info.coin) + : electrumXClient.getSparkUsedCoinsTags(startNumber: startNumber); final futureResults = await Future.wait([ anonymitySetFuture, @@ -670,7 +669,11 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // update blockHash in cache final String newBlockHash = base64ToReverseHex(anonymitySet["blockHash"] as String); - await _setCachedSparkBlockHash(newBlockHash); + + await Future.wait([ + _setCachedSparkBlockHash(newBlockHash), + _setSparkCoinsStartNumber(spentCoinTags.length - 1), + ]); } // check current coins @@ -692,8 +695,10 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // refresh spark balance await refreshSparkBalance(); } catch (e, s) { - // todo logging - + Logging.instance.log( + "$runtimeType $walletId ${info.name}: $e\n$s", + level: LogLevel.Error, + ); rethrow; } } @@ -790,8 +795,10 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // refresh spark balance await refreshSparkBalance(); } catch (e, s) { - // todo logging - + Logging.instance.log( + "$runtimeType $walletId ${info.name}: $e\n$s", + level: LogLevel.Error, + ); rethrow; } } @@ -1154,7 +1161,6 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { generate: true, ); - final int i = 0; for (int i = 0; i < recipients.length; i++) { final recipient = recipients[i]; final out = ( @@ -1597,6 +1603,7 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // ====================== Private ============================================ final _kSparkAnonSetCachedBlockHashKey = "SparkAnonSetCachedBlockHashKey"; + final _kSparkCoinsStartNumberKey = "SparkCoinsStartNumberKey"; Future _getCachedSparkBlockHash() async { return info.otherData[_kSparkAnonSetCachedBlockHashKey] as String?; @@ -1609,6 +1616,17 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { ); } + Future _getSparkCoinsStartNumber() async { + return info.otherData[_kSparkCoinsStartNumberKey] as int?; + } + + Future _setSparkCoinsStartNumber(int startNumber) async { + await info.updateOtherData( + newEntries: {_kSparkCoinsStartNumberKey: startNumber}, + isar: mainDB.isar, + ); + } + Future _addOrUpdateSparkCoins(List coins) async { if (coins.isNotEmpty) { await mainDB.isar.writeTxn(() async {