diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 33a93b3..4aab0a3 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -40,79 +40,31 @@ class MyWalletsProvider with ChangeNotifier { chest = chest ?? configBox.get('currentChest') ?? 0; listWallets.clear(); final wallets = walletBox.toMap().values.toList(); + Map walletsToScan = {}; for (var walletFromBox in wallets) { if (walletFromBox.chest == chest) { if (walletFromBox.identityStatus == IdtyStatus.unknown) { - walletFromBox.identityStatus = - await sub.idtyStatus(walletFromBox.address); - walletBox.put(walletFromBox.address, walletFromBox); + walletsToScan.putIfAbsent( + walletFromBox.address, (() => walletFromBox)); + } else { + listWallets.add(walletFromBox); } - listWallets.add(walletFromBox); } } + // update all idty status in lists + int n = 0; + final idtyStatusList = await sub.idtyStatus(walletsToScan.keys.toList()); + for (final wallet in walletsToScan.values) { + wallet.identityStatus = idtyStatusList[n]; + walletBox.put(wallet.address, wallet); + listWallets.add(wallet); + n++; + } + return listWallets; } - // List readAllWallets([int? chest]) { - // final sub = Provider.of(homeContext, listen: false); - // bool hasFetchStatus = false; - // List futures = []; - // chest = chest ?? configBox.get('currentChest') ?? 0; - // listWallets.clear(); - // walletBox.toMap().forEach((key, walletFromBox) { - // if (walletFromBox.chest == chest) { - // if (walletFromBox.identityStatus == IdtyStatus.unknown) { - // hasFetchStatus = true; - // futures.add(sub.idtyStatus(walletFromBox.address).then((valueStatus) { - // walletFromBox.identityStatus = valueStatus; - // listWallets.add(walletFromBox); - // // walletBox.put(key, walletFromBox); - // })); - // } else { - // listWallets.add(walletFromBox); - // } - // } - // }); - // // if (hasFetchStatus) { - // // sleep(const Duration(milliseconds: 300)); - // // log.d('yoooooooooo'); - // // readAllWallets(chest); - // // } - - // if (hasFetchStatus) { - // Future.wait(futures).then((_) { - // return listWallets; - // // while (listWallets.any((element) => - // // element.chest == chest && - // // element.identityStatus == IdtyStatus.unknown)) { - - // // List tata = listWallets.toList(); - // // log.d(listWallets); - // // while (tata.length < walletBox.length) { - // // tata = listWallets.toList(); - // // sleep(const Duration(milliseconds: 500)); - // // Map status = {}; - // // for (var walletInList in tata) { - // // status.putIfAbsent( - // // walletInList.name, () => walletInList.identityStatus); - // // } - // // log.d(status); - // // log.d('yoooooo'); - - // // status.clear(); - // // } - // }); - // } - - // // if (hasFetchStatus) { - // // walletBox.putAll( - // // Map.fromEntries(listWallets.map((e) => MapEntry(e.address, e)))); - // // } - - // return listWallets; - // } - WalletData? getWalletDataById(List id) { if (id.isEmpty) return WalletData(address: '', isOwned: true); int? chest = id[0]; @@ -260,15 +212,14 @@ class MyWalletsProvider with ChangeNotifier { chestNumber ??= getCurrentChest(); - List walletConfig = await readAllWallets(chestNumber); - walletConfig.sort((p1, p2) { + listWallets.sort((p1, p2) { return Comparable.compare(p1.number!, p2.number!); }); - if (walletConfig.isEmpty) { + if (listWallets.isEmpty) { newDerivationNbr = 2; } else { - WalletData lastWallet = walletConfig.reduce( + WalletData lastWallet = listWallets.reduce( (curr, next) => curr.derivation! > next.derivation! ? curr : next); if (lastWallet.derivation == -1) { @@ -277,7 +228,7 @@ class MyWalletsProvider with ChangeNotifier { newDerivationNbr = lastWallet.derivation! + (isOneshoot ? 1 : 2); } - newWalletNbr = walletConfig.last.number! + 1; + newWalletNbr = listWallets.last.number! + 1; } return [newWalletNbr, newDerivationNbr]; diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index ae1398e..cfff3c2 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -1,5 +1,7 @@ // ignore_for_file: use_build_context_synchronously, body_might_complete_normally_catch_error +import 'dart:convert'; + import 'package:easy_localization/easy_localization.dart'; import 'package:fast_base58/fast_base58.dart'; import 'package:flutter/foundation.dart'; @@ -90,10 +92,11 @@ class SubstrateSdk with ChangeNotifier { Future _getStorage(String call) async { try { + log.d(call); return await sdk.webView!.evalJavascript('api.query.$call'); } catch (e) { log.e("_getStorage error: $e"); - return Future(() {}); + throw Exception("_getStorage error: $e"); } } @@ -141,6 +144,14 @@ class SubstrateSdk with ChangeNotifier { return await _getStorage('identity.identityIndexOf("$address")'); } + Future> _getIdentityIndexOfMulti(List addresses) async { + String jsonString = jsonEncode(addresses); + return List.from( + await _getStorage('identity.identityIndexOf.multi($jsonString)')); + // .map((e) => e as int?) + // .toList() as List; + } + Future?> getCertsCounter(String address) async { final idtyIndex = await _getIdentityIndexOf(address); if (idtyIndex == null) { @@ -318,7 +329,7 @@ class SubstrateSdk with ChangeNotifier { Future> certState(String from, String to) async { Map result = {}; - final toStatus = await idtyStatus(to); + final toStatus = (await idtyStatus([to])).first; final myWallets = MyWalletsProvider(); @@ -380,35 +391,52 @@ class SubstrateSdk with ChangeNotifier { return startBlockchainTime.add(Duration(seconds: blocNumber * 6)); } - Future idtyStatus(String address) async { + Future> idtyStatus(List addresses) async { // final walletOptions = // Provider.of(homeContext, listen: false); - var idtyIndex = await _getIdentityIndexOf(address); + log.d(addresses); + final idtyIndexes = (await _getIdentityIndexOfMulti(addresses)); + // .map((dynamic e) => e as String) + // .toList(); + log.d(idtyIndexes); + final jsonString = jsonEncode(idtyIndexes); + final List idtyStatusList = + await _getStorage('identity.identities.multi($jsonString)'); - if (idtyIndex == null) { - return IdtyStatus.none; - } + log.d(idtyStatusList); - final idtyStatus = await _getStorage('identity.identities($idtyIndex)'); + List resultStatus = []; + + for (final idtyStatus in idtyStatusList) { + if (idtyStatus == null) { + resultStatus.add(IdtyStatus.none); + continue; + } - if (idtyStatus != null) { switch (idtyStatus['status']) { case 'Created': - return IdtyStatus.created; + resultStatus.add(IdtyStatus.created); + break; case 'ConfirmedByOwner': - return IdtyStatus.confirmed; + resultStatus.add(IdtyStatus.confirmed); + break; case 'Validated': - return IdtyStatus.validated; + resultStatus.add(IdtyStatus.validated); + break; + + case 'Expired': + resultStatus.add(IdtyStatus.expired); + break; default: - return IdtyStatus.unknown; + resultStatus.add(IdtyStatus.unknown); + break; } - } else { - return IdtyStatus.expired; } + return resultStatus; } Future isSmith(String address) async { @@ -872,11 +900,12 @@ class SubstrateSdk with ChangeNotifier { final fromBalance = fromAddress == '' ? {'transferableBalance': 0} : await getBalance(fromAddress); - final fromIdtyStatus = - fromAddress == '' ? IdtyStatus.none : await idtyStatus(fromAddress); + + final statusList = await idtyStatus([fromAddress, toAddress]); + final fromIdtyStatus = statusList[0]; final fromHasConsumer = fromAddress == '' ? false : await hasAccountConsumers(fromAddress); - final toIdtyStatus = await idtyStatus(toAddress); + final toIdtyStatus = statusList[1]; final isSmithData = await isSmith(fromAddress); return [ @@ -951,11 +980,14 @@ class SubstrateSdk with ChangeNotifier { String fromAddress, String destAddress, String password) async { transactionStatus = ''; - final myIdtyStatus = await idtyStatus(fromAddress); - final toIdtyStatus = await idtyStatus(destAddress); + final statusList = await idtyStatus([fromAddress, destAddress]); + final myIdtyStatus = statusList[0]; + final toIdtyStatus = statusList[1]; - final fromIndex = await _getIdentityIndexOf(fromAddress); - final toIndex = await _getIdentityIndexOf(destAddress); + final idtyIndexList = + await _getIdentityIndexOfMulti([fromAddress, destAddress]); + final fromIndex = idtyIndexList[0]; + final toIndex = idtyIndexList[1]; if (myIdtyStatus != IdtyStatus.validated) { transactionStatus = 'notMember'; diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart index 18385a4..88fba6d 100644 --- a/lib/screens/myWallets/wallet_options.dart +++ b/lib/screens/myWallets/wallet_options.dart @@ -340,10 +340,11 @@ class WalletOptions extends StatelessWidget { Widget confirmIdentityButton(WalletOptionsProvider walletProvider) { return Consumer(builder: (context, sub, _) { return FutureBuilder( - future: sub.idtyStatus(walletProvider.address.text), - initialData: '', - builder: (context, snapshot) { - if (snapshot.data == IdtyStatus.created) { + future: sub.idtyStatus([walletProvider.address.text]), + initialData: const [IdtyStatus.unknown], + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.data!.first == IdtyStatus.created) { return Column(children: [ SizedBox( width: 320, diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart index 9e428e0..61d3bc7 100644 --- a/lib/widgets/idty_status.dart +++ b/lib/widgets/idty_status.dart @@ -24,10 +24,10 @@ class IdentityStatus extends StatelessWidget { return Consumer(builder: (context, sub, _) { return FutureBuilder( - future: sub.idtyStatus(address), - initialData: walletData.identityStatus, - builder: (context, AsyncSnapshot snapshot) { - final resStatus = snapshot.data!; + future: sub.idtyStatus([address]), + initialData: [walletData.identityStatus], + builder: (context, AsyncSnapshot> snapshot) { + final resStatus = snapshot.data!.first; walletData.identityStatus = resStatus; walletBox.put(address, walletData);