wip: use multiqueries for idtystatus and idtyindex

This commit is contained in:
poka 2023-11-24 16:48:05 +01:00
parent 5ccacea46d
commit 28a66a3dd8
4 changed files with 82 additions and 98 deletions

View File

@ -40,79 +40,31 @@ class MyWalletsProvider with ChangeNotifier {
chest = chest ?? configBox.get('currentChest') ?? 0;
listWallets.clear();
final wallets = walletBox.toMap().values.toList();
Map<String, WalletData> 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<WalletData> readAllWallets([int? chest]) {
// final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
// bool hasFetchStatus = false;
// List<Future> 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<int?> id) {
if (id.isEmpty) return WalletData(address: '', isOwned: true);
int? chest = id[0];
@ -260,15 +212,14 @@ class MyWalletsProvider with ChangeNotifier {
chestNumber ??= getCurrentChest();
List<WalletData> 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];

View File

@ -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<List<int?>> _getIdentityIndexOfMulti(List<String> addresses) async {
String jsonString = jsonEncode(addresses);
return List<int?>.from(
await _getStorage('identity.identityIndexOf.multi($jsonString)'));
// .map((e) => e as int?)
// .toList() as List<int?>;
}
Future<List<int>?> getCertsCounter(String address) async {
final idtyIndex = await _getIdentityIndexOf(address);
if (idtyIndex == null) {
@ -318,7 +329,7 @@ class SubstrateSdk with ChangeNotifier {
Future<Map<String, int>> certState(String from, String to) async {
Map<String, int> 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> idtyStatus(String address) async {
Future<List<IdtyStatus>> idtyStatus(List<String> addresses) async {
// final walletOptions =
// Provider.of<WalletOptionsProvider>(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<IdtyStatus> 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<bool> 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';

View File

@ -340,10 +340,11 @@ class WalletOptions extends StatelessWidget {
Widget confirmIdentityButton(WalletOptionsProvider walletProvider) {
return Consumer<SubstrateSdk>(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<List<IdtyStatus>> snapshot) {
if (snapshot.data!.first == IdtyStatus.created) {
return Column(children: [
SizedBox(
width: 320,

View File

@ -24,10 +24,10 @@ class IdentityStatus extends StatelessWidget {
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder(
future: sub.idtyStatus(address),
initialData: walletData.identityStatus,
builder: (context, AsyncSnapshot<IdtyStatus> snapshot) {
final resStatus = snapshot.data!;
future: sub.idtyStatus([address]),
initialData: [walletData.identityStatus],
builder: (context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
final resStatus = snapshot.data!.first;
walletData.identityStatus = resStatus;
walletBox.put(address, walletData);