diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index eb2363df7..1521361aa 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -4,7 +4,7 @@ import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart'; import 'package:isar/isar.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'; import 'package:stackwallet/utilities/amount/amount.dart'; -import 'package:stackwallet/utilities/extensions/impl/uint8_list.dart'; +import 'package:stackwallet/utilities/extensions/extensions.dart'; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart'; import 'package:stackwallet/wallets/isar/models/spark_coin.dart'; import 'package:stackwallet/wallets/models/tx_data.dart'; @@ -76,7 +76,12 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { const index = 1; final root = await getRootHDNode(); - const derivationPath = "$kSparkBaseDerivationPath$index"; + final String derivationPath; + if (cryptoCurrency.network == CryptoCurrencyNetwork.test) { + derivationPath = "$kSparkBaseDerivationPathTestnet$index"; + } else { + derivationPath = "$kSparkBaseDerivationPath$index"; + } final keys = root.derivePath(derivationPath); final String addressString = await LibSpark.getAddress( @@ -152,9 +157,20 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // recoverSparkWallet but only fetch and check anonymity set data that we // have not yet parsed. Future<void> refreshSparkData() async { + final sparkAddresses = await mainDB.isar.addresses + .where() + .walletIdEqualTo(walletId) + .filter() + .typeEqualTo(AddressType.spark) + .findAll(); + + final Set<String> paths = + sparkAddresses.map((e) => e.derivationPath!.value).toSet(); + try { - final privateKeyHex = "TODO"; - final index = 0; + const index = 1; + + final root = await getRootHDNode(); final latestSparkCoinId = await electrumXClient.getSparkLatestCoinId(); @@ -175,50 +191,58 @@ mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { // find our coins final List<SparkCoin> myCoins = []; - for (final data - in List<List<String>>.from(anonymitySet["coin"] as List)) { - if (data.length != 2) { - throw Exception("Unexpected serialized coin info found"); - } - final serializedCoin = data.first; - final txHash = data.last; + for (final path in paths) { + final keys = root.derivePath(path); - final coin = LibSpark.identifyAndRecoverCoin( - serializedCoin, - privateKeyHex: privateKeyHex, - index: index, - ); + final privateKeyHex = keys.privateKey.data.toHex; - // its ours - if (coin != null) { - final SparkCoinType coinType; - switch (coin.type.value) { - case 0: - coinType = SparkCoinType.mint; - case 1: - coinType = SparkCoinType.spend; - default: - throw Exception("Unknown spark coin type detected"); + for (final dynData in anonymitySet["coins"] as List) { + final data = List<String>.from(dynData as List); + + if (data.length != 2) { + throw Exception("Unexpected serialized coin info found"); } - myCoins.add( - SparkCoin( - walletId: walletId, - type: coinType, - isUsed: spentCoinTags - .contains(coin.lTagHash!.toHex), // TODO: is hex right? - address: coin.address!, - txHash: txHash, - valueIntString: coin.value!.toString(), - lTagHash: coin.lTagHash!.toHex, // TODO: is hex right? - tag: coin.tag, - memo: coin.memo, - serial: coin.serial, - serialContext: coin.serialContext, - diversifierIntString: coin.diversifier!.toString(), - encryptedDiversifier: coin.encryptedDiversifier, - ), + + final serializedCoin = data.first; + final txHash = data.last; + + final coin = LibSpark.identifyAndRecoverCoin( + serializedCoin, + privateKeyHex: privateKeyHex, + index: index, + isTestNet: cryptoCurrency.network == CryptoCurrencyNetwork.test, ); + + // its ours + if (coin != null) { + final SparkCoinType coinType; + switch (coin.type.value) { + case 0: + coinType = SparkCoinType.mint; + case 1: + coinType = SparkCoinType.spend; + default: + throw Exception("Unknown spark coin type detected"); + } + myCoins.add( + SparkCoin( + walletId: walletId, + type: coinType, + isUsed: spentCoinTags.contains(coin.lTagHash!), + address: coin.address!, + txHash: txHash, + valueIntString: coin.value!.toString(), + lTagHash: coin.lTagHash!, + tag: coin.tag, + memo: coin.memo, + serial: coin.serial, + serialContext: coin.serialContext, + diversifierIntString: coin.diversifier!.toString(), + encryptedDiversifier: coin.encryptedDiversifier, + ), + ); + } } }