From 56a6213e9c8ea00faa43fa142079fa809e8926d5 Mon Sep 17 00:00:00 2001
From: poka <poka@p2p.legal>
Date: Sun, 21 Apr 2024 20:29:59 +0200
Subject: [PATCH] update to new gdev runtime and hasura squid

---
 assets/translations/en.json                   |   1 +
 assets/translations/es.json                   |   1 +
 assets/translations/fr.json                   |   1 +
 config/indexer_endpoints.json                 |   4 +-
 lib/globals.dart                              |   2 +-
 lib/models/queries_indexer.dart               | 148 ++---
 lib/models/wallet_data.dart                   |  19 +-
 lib/models/wallet_data.g.dart                 |  23 +-
 lib/providers/duniter_indexer.dart            |  86 +--
 lib/providers/substrate_sdk.dart              |  29 +-
 lib/providers/v2s_datapod.dart                |  47 +-
 lib/screens/home.dart                         |  20 +-
 lib/screens/myWallets/wallet_options.dart     |   4 +-
 lib/widgets/certs_list.dart                   |  11 +-
 lib/widgets/datapod_avatar.dart               |  44 +-
 lib/widgets/history_query.dart                |  31 +-
 lib/widgets/history_view.dart                 |   6 +-
 lib/widgets/idty_status.dart                  |  15 +-
 lib/widgets/name_by_address.dart              |   8 +-
 lib/widgets/payment_popup.dart                |   4 +-
 lib/widgets/search_identity_query.dart        |  28 +-
 lib/widgets/transaction_in_progress_tile.dart |  14 +-
 pubspec.lock                                  | 591 +++++++++++++-----
 pubspec.yaml                                  |  60 +-
 24 files changed, 721 insertions(+), 476 deletions(-)

diff --git a/assets/translations/en.json b/assets/translations/en.json
index 3ee0948b..ffa78a2f 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -103,6 +103,7 @@
     "identityCreated": "Identity created",
     "identityConfirmed": "Identity confirmed",
     "identityExpired": "Identity expired",
+    "identityRevoked": "Identity revoked",
     "confirmYourIdentity": "Confirm your identity",
     "noResult": "No results",
     "noDuniterNodeAvailableTryLater": "No Duniter node available, please try again later",
diff --git a/assets/translations/es.json b/assets/translations/es.json
index e1ca23e3..8e001274 100644
--- a/assets/translations/es.json
+++ b/assets/translations/es.json
@@ -104,6 +104,7 @@
     "identityCreated": "Identidad creada",
     "identityConfirmed": "Identidad confirmada",
     "identityExpired": "Identidad caducada",
+    "identityRevoked": "Identidad revocada",
     "confirmYourIdentity": "Confirma tu identidad",
     "noResult": "Ningún resultado",
     "noDuniterNodeAvailableTryLater": "No hay ningún nodo Duniter disponible, por favor, inténtalo más tarde",
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
index ffa277e4..9bf3dbce 100644
--- a/assets/translations/fr.json
+++ b/assets/translations/fr.json
@@ -103,6 +103,7 @@
     "identityCreated": "Identité créée",
     "identityConfirmed": "Identité confirmée",
     "identityExpired": "Identité expirée",
+    "identityRevoked": "Identité révoqué",
     "confirmYourIdentity": "Confirmez votre identité",
     "noResult": "Aucun résultat",
     "noDuniterNodeAvailableTryLater": "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement",
diff --git a/config/indexer_endpoints.json b/config/indexer_endpoints.json
index 66f30c3b..83e7ddf0 100644
--- a/config/indexer_endpoints.json
+++ b/config/indexer_endpoints.json
@@ -1,5 +1,3 @@
 [
-    "gdev-indexer.p2p.legal",
-    "gdev-hasura.cgeek.fr",
-    "hasura-gdev.pini.fr"
+    "gdev-squid.axiom-team.fr"
 ]
diff --git a/lib/globals.dart b/lib/globals.dart
index 3cb7d5f9..22b70ef2 100644
--- a/lib/globals.dart
+++ b/lib/globals.dart
@@ -8,7 +8,7 @@ import 'package:hive_flutter/hive_flutter.dart';
 import 'package:logger/logger.dart';
 
 // Version of box data
-const int dataVersion = 8;
+const int dataVersion = 9;
 
 late String appVersion;
 const int pinLength = 5;
diff --git a/lib/models/queries_indexer.dart b/lib/models/queries_indexer.dart
index 9d76b12a..7c74ea3e 100644
--- a/lib/models/queries_indexer.dart
+++ b/lib/models/queries_indexer.dart
@@ -1,45 +1,55 @@
 const String getNameByAddressQ = r'''
 query ($address: String!) {
-  account_by_pk(pubkey: $address) {
-    identity {
-      name
+  identityConnection(
+    where: { accountId: { _eq: $address } }
+    orderBy: { name: ASC }
+  ) {
+    edges {
+      node {
+        name
+        accountId
+      }
     }
-    pubkey
   }
 }
 ''';
 
 const String searchAddressByNameQ = r'''
 query ($name: String!) {
-  search_identity(args: {name: $name}) {
-    pubkey
-    name
+  identityConnection(
+    where: { name: { _ilike: $name } }
+    orderBy: { name: ASC }
+  ) {
+    edges {
+      node {
+        name
+        accountId
+      }
+    }
   }
 }
 ''';
 
 const String getHistoryByAddressRelayQ = r'''
-query ($address: String!, $number: Int!, $cursor: String) {
-  transaction_connection(where: 
-  {_or: [
-    {issuer_pubkey: {_eq: $address}}, 
-    {receiver_pubkey: {_eq: $address}}
-  ]}, 
-  order_by: {created_at: desc},
-  first: $number,
-  after: $cursor) {
+query ($address: String!, $first: Int!, $after: String) {
+  transferConnection(
+    after: $after
+    first: $first
+    orderBy: { timestamp: DESC }
+    where: { _or: [{ fromId: { _eq: $address } }, { toId: { _eq: $address } }] }
+  ) {
     edges {
       node {
         amount
-        created_at
-        issuer_pubkey
-        receiver_pubkey
-        issuer {
+        timestamp
+        fromId
+        from {
           identity {
             name
           }
         }
-        receiver {
+        toId
+        to {
           identity {
             name
           }
@@ -49,35 +59,6 @@ query ($address: String!, $number: Int!, $cursor: String) {
     pageInfo {
       endCursor
       hasNextPage
-      hasPreviousPage
-      startCursor
-    }
-  }
-}
-''';
-
-const String getHistoryByAddressQ = r'''
-query ($address: String!, $number: Int!, $offset: Int!) {
-  transaction_aggregate(where: {_or: [{issuer_pubkey: {_eq: $address}}, {receiver_pubkey: {_eq: $address}}]}) {
-    aggregate {
-      count
-    }
-  }
-  transaction(where: {_or: [{issuer_pubkey: {_eq: $address}}, {receiver_pubkey: {_eq: $address}}]}, order_by: {created_at: desc}, limit: $number, offset: $offset) {
-    amount
-    comment
-    created_at
-    issuer {
-      pubkey
-      identity {
-        name
-      }
-    }
-    receiver {
-      pubkey
-      identity {
-        name
-      }
     }
   }
 }
@@ -85,52 +66,79 @@ query ($address: String!, $number: Int!, $offset: Int!) {
 
 const String getCertsReceived = r'''
 query ($address: String!) {
-  certification(where: {receiver: {pubkey: {_eq: $address}}}, order_by: {created_at: desc}) {
-    issuer {
-      pubkey
-      name
+  certConnection(
+    where: {receiver: {accountId: {_eq: $address}}}
+  ) {
+    edges {
+      node {
+        createdOn
+        issuer {
+          accountId
+          name
+        }
+      }
     }
-    created_at
   }
 }
 ''';
 
 const String getCertsSent = r'''
 query ($address: String!) {
-  certification(where: {issuer: {pubkey: {_eq: $address}}}, order_by: {created_at: desc}) {
-    receiver {
-      pubkey
-      name
+  certConnection(
+    where: {issuer: {accountId: {_eq: $address}}}
+  ) {
+    edges {
+      node {
+        createdOn
+        receiver {
+          accountId
+          name
+        }
+      }
     }
-    created_at
   }
 }
 ''';
 
 const String isIdtyExistQ = r'''
 query ($name: String!) {
-  identity(where: {name: {_eq: $name}}) {
-    name
+  identityConnection(where: {name: {_eq: ""}}) {
+    edges {
+      node {
+        name
+      }
+    }
   }
 }
 ''';
 
 const String getBlockchainStartQ = r'''
 query {
-  block(limit: 1) {
-    created_at
-    number
+  blockConnection(first: 1) {
+    edges {
+      node {
+        height
+        timestamp
+      }
+    }
   }
 }
 ''';
 
 const String subscribeHistoryIssuedQ = r'''
 subscription ($address: String!) {
-  account_by_pk(pubkey: $address) {
-    transactions_issued(limit: 1, order_by: {created_at: desc}) {
-      receiver_pubkey
-      amount
-      created_at
+  accountConnection(
+    where: {id: {_eq: $address}}
+  ) {
+    edges {
+      node {
+        transfersIssued(limit: 1, orderBy: {timestamp: DESC}) {
+          toId
+          amount
+          timestamp
+          blockNumber
+        }
+      }
     }
   }
 }
diff --git a/lib/models/wallet_data.dart b/lib/models/wallet_data.dart
index 725e7736..37782f70 100644
--- a/lib/models/wallet_data.dart
+++ b/lib/models/wallet_data.dart
@@ -74,13 +74,13 @@ class WalletData extends HiveObject {
   }
 
   bool hasIdentity() {
-    return identityStatus == IdtyStatus.created ||
-        identityStatus == IdtyStatus.confirmed ||
-        identityStatus == IdtyStatus.validated;
+    return identityStatus == IdtyStatus.unconfirmed ||
+        identityStatus == IdtyStatus.unvalidated ||
+        identityStatus == IdtyStatus.member;
   }
 
   bool isMembre() {
-    return identityStatus == IdtyStatus.validated;
+    return identityStatus == IdtyStatus.member;
   }
 
   bool exist() {
@@ -139,17 +139,20 @@ enum IdtyStatus {
   none,
 
   @HiveField(1)
-  created,
+  unconfirmed,
 
   @HiveField(2)
-  confirmed,
+  unvalidated,
 
   @HiveField(3)
-  validated,
+  member,
 
   @HiveField(4)
-  expired,
+  notMember,
 
   @HiveField(5)
+  revoked,
+
+  @HiveField(6)
   unknown
 }
diff --git a/lib/models/wallet_data.g.dart b/lib/models/wallet_data.g.dart
index 14c85c3e..71df9617 100644
--- a/lib/models/wallet_data.g.dart
+++ b/lib/models/wallet_data.g.dart
@@ -83,14 +83,16 @@ class IdtyStatusAdapter extends TypeAdapter<IdtyStatus> {
       case 0:
         return IdtyStatus.none;
       case 1:
-        return IdtyStatus.created;
+        return IdtyStatus.unconfirmed;
       case 2:
-        return IdtyStatus.confirmed;
+        return IdtyStatus.unvalidated;
       case 3:
-        return IdtyStatus.validated;
+        return IdtyStatus.member;
       case 4:
-        return IdtyStatus.expired;
+        return IdtyStatus.notMember;
       case 5:
+        return IdtyStatus.revoked;
+      case 6:
         return IdtyStatus.unknown;
       default:
         return IdtyStatus.none;
@@ -103,21 +105,24 @@ class IdtyStatusAdapter extends TypeAdapter<IdtyStatus> {
       case IdtyStatus.none:
         writer.writeByte(0);
         break;
-      case IdtyStatus.created:
+      case IdtyStatus.unconfirmed:
         writer.writeByte(1);
         break;
-      case IdtyStatus.confirmed:
+      case IdtyStatus.unvalidated:
         writer.writeByte(2);
         break;
-      case IdtyStatus.validated:
+      case IdtyStatus.member:
         writer.writeByte(3);
         break;
-      case IdtyStatus.expired:
+      case IdtyStatus.notMember:
         writer.writeByte(4);
         break;
-      case IdtyStatus.unknown:
+      case IdtyStatus.revoked:
         writer.writeByte(5);
         break;
+      case IdtyStatus.unknown:
+        writer.writeByte(6);
+        break;
     }
   }
 
diff --git a/lib/providers/duniter_indexer.dart b/lib/providers/duniter_indexer.dart
index a6ac5d17..a23ec65d 100644
--- a/lib/providers/duniter_indexer.dart
+++ b/lib/providers/duniter_indexer.dart
@@ -11,10 +11,11 @@ import 'package:graphql_flutter/graphql_flutter.dart';
 
 class DuniterIndexer with ChangeNotifier {
   Map<String, String?> walletNameIndexer = {};
+  String? fetchMoreCursor;
+  Map? pageInfo;
   List? transBC;
   List listIndexerEndpoints = [];
   bool isLoadingIndexer = false;
-  bool hasNextPage = false;
   Future<QueryResult<Object?>?> Function()? refetch;
   late GraphQLClient indexerClient;
 
@@ -29,7 +30,7 @@ class DuniterIndexer with ChangeNotifier {
     client.connectionTimeout = const Duration(milliseconds: 4000);
     try {
       final request =
-          await client.postUrl(Uri.parse('https://$endpoint/v1/graphql'));
+          await client.postUrl(Uri.parse('https://$endpoint/v1beta1/relay'));
       final response = await request.close();
       if (response.statusCode != 200) {
         log.w('Indexer $endpoint is offline');
@@ -98,7 +99,7 @@ class DuniterIndexer with ChangeNotifier {
       }
 
       try {
-        final endpointPath = 'https://${listIndexerEndpoints[i]}/v1/graphql';
+        final endpointPath = 'https://${listIndexerEndpoints[i]}/v1beta1/relay';
 
         final request = await client.postUrl(Uri.parse(endpointPath));
         final response = await request.close();
@@ -134,21 +135,21 @@ class DuniterIndexer with ChangeNotifier {
     List transBC = [];
     int i = 0;
 
-    for (final transaction in blockchainTX) {
-      final direction =
-          transaction['issuer']['pubkey'] != address ? 'RECEIVED' : 'SENT';
+    for (final transactionNode in blockchainTX) {
+      final transaction = transactionNode['node'];
+      final direction = transaction['fromId'] != address ? 'RECEIVED' : 'SENT';
 
       transBC.add(i);
       transBC[i] = [];
-      transBC[i].add(DateTime.parse(transaction['created_at']));
+      transBC[i].add(DateTime.parse(transaction['timestamp']));
       final amountBrut = transaction['amount'];
       final amount = removeDecimalZero(amountBrut / 100);
       if (direction == "RECEIVED") {
-        transBC[i].add(transaction['issuer']['pubkey']);
-        transBC[i].add(transaction['issuer']['identity']?['name'] ?? '');
+        transBC[i].add(transaction['fromId']);
+        transBC[i].add(transaction['from']['identity']?['name'] ?? '');
       } else if (direction == "SENT") {
-        transBC[i].add(transaction['receiver']['pubkey']);
-        transBC[i].add(transaction['receiver']['identity']?['name'] ?? '');
+        transBC[i].add(transaction['toId']);
+        transBC[i].add(transaction['to']['identity']?['name'] ?? '');
       }
       transBC[i].add(amount);
       transBC[i].add(direction);
@@ -158,36 +159,38 @@ class DuniterIndexer with ChangeNotifier {
     return transBC;
   }
 
-  FetchMoreOptions? mergeQueryResult(
-      {required List transactions,
-      required FetchMoreOptions? opts,
-      required String address,
-      required int nRepositories,
-      required int offset}) {
-    // pageInfo = result.data!['transaction_connection']['pageInfo'];
-    // fetchMoreCursor = pageInfo!['endCursor'];
+  FetchMoreOptions? mergeQueryResult(QueryResult result, FetchMoreOptions? opts,
+      String address, int nRepositories) {
+    final List<dynamic> blockchainTX =
+        (result.data!['transferConnection']['edges'] as List<dynamic>);
+
+    pageInfo = result.data!['transferConnection']['pageInfo'];
+    fetchMoreCursor = pageInfo!['endCursor'];
     // final hasNextPage = pageInfo!['hasNextPage'];
-    // final hasPreviousPage = pageInfo!['hasPreviousPage'];
-    // log.d('endCursor: $fetchMoreCursor $hasNextPage $hasPreviousPage');
-
-    // if (fetchMoreCursor != null) {
-    opts = FetchMoreOptions(
-      variables: {'offset': offset, 'number': nRepositories},
-      updateQuery: (previousResultData, fetchMoreResultData) {
-        final List<dynamic> repos = [
-          ...previousResultData!['transaction'] as List<dynamic>,
-          ...fetchMoreResultData!['transaction'] as List<dynamic>
-        ];
-
-        fetchMoreResultData['transaction'] = repos;
-        return fetchMoreResultData;
-      },
-    );
-    transBC = parseHistory(transactions, address);
-    // } else {
-    //   log.d("Activity start of $address");
-    // }
+    // log.d('endCursor: $fetchMoreCursor $hasNextPage');
+
+    if (fetchMoreCursor != null) {
+      opts = FetchMoreOptions(
+        variables: {'after': fetchMoreCursor, 'first': nRepositories},
+        updateQuery: (previousResultData, fetchMoreResultData) {
+          final List<dynamic> repos = [
+            ...previousResultData!['transferConnection']['edges']
+                as List<dynamic>,
+            ...fetchMoreResultData!['transferConnection']['edges']
+                as List<dynamic>
+          ];
+
+          fetchMoreResultData['transferConnection']['edges'] = repos;
+          return fetchMoreResultData;
+        },
+      );
+    }
 
+    if (fetchMoreCursor != null) {
+      transBC = parseHistory(blockchainTX, address);
+    } else {
+      log.d("Activity start of $address");
+    }
     return opts;
   }
 
@@ -203,14 +206,15 @@ class DuniterIndexer with ChangeNotifier {
       'name': name,
     };
     final result = await _execQuery(isIdtyExistQ, variables);
+    log.d(result.data);
     return result.data?['identity']?.isNotEmpty ?? false;
   }
 
   Future<DateTime> getBlockStart() async {
     final result = await _execQuery(getBlockchainStartQ, {});
     if (!result.hasException) {
-      startBlockchainTime =
-          DateTime.parse(result.data!['block'][0]['created_at']);
+      startBlockchainTime = DateTime.parse(
+          result.data!['blockConnection']['edges'][0]['node']['timestamp']);
       startBlockchainInitialized = true;
       return startBlockchainTime;
     }
diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart
index 520c54ec..f359a39f 100644
--- a/lib/providers/substrate_sdk.dart
+++ b/lib/providers/substrate_sdk.dart
@@ -215,7 +215,8 @@ class SubstrateSdk with ChangeNotifier {
       return [];
     }
     final certsReceiver =
-        await _getStorage('cert.storageIdtyCertMeta($idtyIndex)') ?? [];
+        await _getStorage('certification.storageIdtyCertMeta($idtyIndex)') ??
+            [];
 
     try {
       certsCounterCache.update(
@@ -241,7 +242,7 @@ class SubstrateSdk with ChangeNotifier {
     if (idtyIndexFrom == null || idtyIndexTo == null) return 0;
 
     final List certData =
-        await _getStorage('cert.certsByReceiver($idtyIndexTo)') ?? [];
+        await _getStorage('certification.certsByReceiver($idtyIndexTo)') ?? [];
 
     if (certData.isEmpty) return 0;
     for (List certInfo in certData) {
@@ -395,7 +396,7 @@ class SubstrateSdk with ChangeNotifier {
       } else if (nextIssuableOn > blocNumber) {
         final certDelayDuration = (nextIssuableOn - blocNumber) * 6;
         result.putIfAbsent('certDelay', () => certDelayDuration);
-      } else if (toStatus == IdtyStatus.created) {
+      } else if (toStatus == IdtyStatus.unconfirmed) {
         result.putIfAbsent('toStatus', () => 1);
       } else if (toStatus == IdtyStatus.none) {
         result.putIfAbsent('toStatus', () => 2);
@@ -412,7 +413,8 @@ class SubstrateSdk with ChangeNotifier {
     var idtyIndex = await _getIdentityIndexOf(address);
 
     final certMeta =
-        await _getStorage('cert.storageIdtyCertMeta($idtyIndex)') ?? '';
+        await _getStorage('certification.storageIdtyCertMeta($idtyIndex)') ??
+            '';
 
     return certMeta;
   }
@@ -455,10 +457,11 @@ class SubstrateSdk with ChangeNotifier {
     List<IdtyStatus> resultStatus = [];
     final mapStatus = {
       null: IdtyStatus.none,
-      'Created': IdtyStatus.created,
-      'ConfirmedByOwner': IdtyStatus.confirmed,
-      'Validated': IdtyStatus.validated,
-      'Expired': IdtyStatus.expired,
+      'Unconfirmed': IdtyStatus.unconfirmed,
+      'Unvalidated': IdtyStatus.unvalidated,
+      'Member': IdtyStatus.member,
+      'NotMember': IdtyStatus.notMember,
+      'Revoked': IdtyStatus.revoked,
       'unknown': IdtyStatus.unknown,
     };
 
@@ -1048,7 +1051,7 @@ class SubstrateSdk with ChangeNotifier {
     final fromIndex = idtyIndexList[0];
     final toIndex = idtyIndexList[1];
 
-    if (myIdtyStatus != IdtyStatus.validated) {
+    if (myIdtyStatus != IdtyStatus.member) {
       return 'notMember';
     }
 
@@ -1069,17 +1072,17 @@ class SubstrateSdk with ChangeNotifier {
         sender,
       );
       txOptions = [destAddress];
-    } else if (toIdtyStatus == IdtyStatus.validated ||
-        toIdtyStatus == IdtyStatus.confirmed) {
+    } else if (toIdtyStatus == IdtyStatus.member ||
+        toIdtyStatus == IdtyStatus.unvalidated) {
       if (toCerts[0] >= currencyParameters['minCertForMembership']! - 1 &&
-          toIdtyStatus != IdtyStatus.validated) {
+          toIdtyStatus != IdtyStatus.member) {
         log.d('Batch cert and membership validation');
         txInfo = TxInfoData(
           'utility',
           'batchAll',
           sender,
         );
-        final tx1 = 'api.tx.cert.addCert($fromIndex, $toIndex)';
+        final tx1 = 'api.tx.certification.addCert($fromIndex, $toIndex)';
 
         //TODO: add requestDistanceEvaluation tx when available
 
diff --git a/lib/providers/v2s_datapod.dart b/lib/providers/v2s_datapod.dart
index 21a84439..5797aaa6 100644
--- a/lib/providers/v2s_datapod.dart
+++ b/lib/providers/v2s_datapod.dart
@@ -32,12 +32,13 @@ class V2sDatapodProvider with ChangeNotifier {
     };
   }
 
-  Future<QueryResult> _execQuery(
+  Future<QueryResult?> _execQuery(
       String query, Map<String, dynamic> variables) async {
-    final QueryOptions options =
-        QueryOptions(document: gql(query), variables: variables);
-
-    return await datapodClient.query(options);
+    //TODO: Switch to IPFS Datapod
+    return null;
+    // final QueryOptions options =
+    //     QueryOptions(document: gql(query), variables: variables);
+    // return await datapodClient.query(options);
   }
 
   Future<bool> updateProfile(
@@ -61,11 +62,11 @@ class V2sDatapodProvider with ChangeNotifier {
     if (variables.isEmpty) return false;
 
     final result = await _execQuery(updateProfileQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      log.e(result?.exception.toString());
       return false;
     }
-    log.d(result.data!['updateProfile']['message']);
+    log.d(result!.data!['updateProfile']['message']);
     return true;
   }
 
@@ -75,11 +76,11 @@ class V2sDatapodProvider with ChangeNotifier {
     if (variables.isEmpty) return false;
 
     final result = await _execQuery(deleteProfileQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      log.e(result?.exception.toString());
       return false;
     }
-    log.d(result.data!['deleteProfile']['message']);
+    log.d(result!.data!['deleteProfile']['message']);
     return true;
   }
 
@@ -90,11 +91,11 @@ class V2sDatapodProvider with ChangeNotifier {
     if (variables.isEmpty) return false;
 
     final result = await _execQuery(migrateProfileQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      log.e(result?.exception.toString());
       return false;
     }
-    log.d(result.data!['migrateProfile']['message']);
+    log.d(result!.data!['migrateProfile']['message']);
     return true;
   }
 
@@ -112,11 +113,11 @@ class V2sDatapodProvider with ChangeNotifier {
     if (variables.isEmpty) return false;
 
     final result = await _execQuery(addTransactionCommentQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      log.e(result?.exception.toString());
       return false;
     }
-    log.d(result.data!['addTransaction']['message']);
+    log.d(result!.data!['addTransaction']['message']);
     return true;
   }
 
@@ -131,12 +132,12 @@ class V2sDatapodProvider with ChangeNotifier {
       'address': address,
     };
     final result = await _execQuery(profileEditedAtQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      // log.e(result?.exception.toString());
       return null;
     }
     final String? profileDateData =
-        result.data!['profiles_by_pk']?['updated_at'];
+        result!.data!['profiles_by_pk']?['updated_at'];
     final profileDate =
         profileDateData == null ? null : DateTime.tryParse(profileDateData);
     return profileDate;
@@ -148,11 +149,11 @@ class V2sDatapodProvider with ChangeNotifier {
       'address': address,
     };
     final result = await _execQuery(getAvatarQ, variables);
-    if (result.hasException) {
-      log.e(result.exception.toString());
+    if (result?.hasException ?? true) {
+      log.e(result?.exception.toString());
       return defaultAvatar(size);
     }
-    final String? avatar64 = result.data!['profiles_by_pk']?['avatar64'];
+    final String? avatar64 = result!.data!['profiles_by_pk']?['avatar64'];
 
     if (avatar64 == null) {
       return defaultAvatar(size);
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 9cbac103..8e0ff180 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -79,24 +79,24 @@ class _HomeScreenState extends State<HomeScreen> {
 
         duniterIndexer.getValidIndexerEndpoint().then((validIndexerEndpoint) {
           final wsLinkIndexer = WebSocketLink(
-            'wss://$validIndexerEndpoint/v1/graphql',
+            'wss://$validIndexerEndpoint/v1beta1/relay',
           );
 
-          const headerWebsocket =
-              datapodEndpoint == '10.0.2.2:8080' ? 'ws' : 'wss';
-          final wsLinkDatapod = WebSocketLink(
-            '$headerWebsocket://$datapodEndpoint/v1/graphql',
-          );
+          // const headerWebsocket =
+          //     datapodEndpoint == '10.0.2.2:8080' ? 'ws' : 'wss';
+          // final wsLinkDatapod = WebSocketLink(
+          //   '$headerWebsocket://$datapodEndpoint/v1/graphql',
+          // );
 
           duniterIndexer.indexerClient = GraphQLClient(
             cache: GraphQLCache(),
             link: wsLinkIndexer,
           );
 
-          datapod.datapodClient = GraphQLClient(
-            cache: GraphQLCache(),
-            link: wsLinkDatapod,
-          );
+          // datapod.datapodClient = GraphQLClient(
+          //   cache: GraphQLCache(),
+          //   link: wsLinkDatapod,
+          // );
         });
 
         await homeProvider.getValidEndpoints();
diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart
index 368b7413..a92239ce 100644
--- a/lib/screens/myWallets/wallet_options.dart
+++ b/lib/screens/myWallets/wallet_options.dart
@@ -151,7 +151,7 @@ class WalletOptions extends StatelessWidget {
                                           size: 24,
                                           color: Colors.black,
                                           fontWeight: wallet.identityStatus ==
-                                                  IdtyStatus.validated
+                                                  IdtyStatus.member
                                               ? FontWeight.w500
                                               : FontWeight.w400,
                                           fontStyle: FontStyle.normal);
@@ -330,7 +330,7 @@ class WalletOptions extends StatelessWidget {
             if (!snapshot.hasData || snapshot.hasError) {
               return const SizedBox.shrink();
             }
-            if (snapshot.data!.first == IdtyStatus.created) {
+            if (snapshot.data!.first == IdtyStatus.unconfirmed) {
               return Column(children: [
                 ScaledSizedBox(
                   width: 310,
diff --git a/lib/widgets/certs_list.dart b/lib/widgets/certs_list.dart
index 40cb4fd4..777afb76 100644
--- a/lib/widgets/certs_list.dart
+++ b/lib/widgets/certs_list.dart
@@ -62,7 +62,7 @@ class CertsList extends StatelessWidget {
                 style: scaledTextStyle(fontSize: 18),
               )
             ]);
-          } else if (result.data?['certification']?.isEmpty) {
+          } else if (result.data?['certConnection']['edges']?.isEmpty) {
             return Column(children: <Widget>[
               ScaledSizedBox(height: 50),
               Text(
@@ -72,12 +72,13 @@ class CertsList extends StatelessWidget {
             ]);
           }
 
-          final List certsData = result.data!['certification'];
+          final List certsData = result.data!['certConnection']['edges'];
           List listCerts = [];
-          for (final cert in certsData) {
-            final String issuerAddress = cert[certFrom]['pubkey'];
+          for (final certNode in certsData) {
+            final cert = certNode['node'];
+            final String issuerAddress = cert[certFrom]['accountId'];
             final String issuerName = cert[certFrom]['name'];
-            final date = DateTime.parse(cert['created_at']);
+            final date = DateTime.parse('2024-02-04T21:20:54.001+00:00');
             final dp = DateTime(date.year, date.month, date.day);
             final dateForm = '${dp.day}-${dp.month}-${dp.year}';
 
diff --git a/lib/widgets/datapod_avatar.dart b/lib/widgets/datapod_avatar.dart
index 7bf86fa1..31b2f71c 100644
--- a/lib/widgets/datapod_avatar.dart
+++ b/lib/widgets/datapod_avatar.dart
@@ -1,12 +1,8 @@
-import 'dart:convert';
 import 'dart:io';
-
 import 'package:flutter/material.dart';
 import 'package:gecko/globals.dart';
-import 'package:gecko/models/queries_datapod.dart';
 import 'package:gecko/models/scale_functions.dart';
 import 'package:gecko/providers/v2s_datapod.dart';
-import 'package:graphql_flutter/graphql_flutter.dart';
 import 'package:provider/provider.dart';
 
 class DatapodAvatar extends StatelessWidget {
@@ -31,44 +27,6 @@ class DatapodAvatar extends StatelessWidget {
     }
 
     return ScaledSizedBox(
-      width: size,
-      child: GraphQLProvider(
-        client: ValueNotifier(datapod.datapodClient),
-        child: Query(
-            options: QueryOptions(
-              document: gql(getAvatarQ),
-              variables: <String, dynamic>{
-                'address': address,
-              },
-            ),
-            builder: (QueryResult result, {fetchMore, refetch}) {
-              if (result.isLoading || result.data == null) {
-                return Center(
-                  child: ClipOval(child: datapod.defaultAvatar(size)),
-                );
-              }
-              final String? avatar64 =
-                  result.data!['profiles_by_pk']?['avatar64'];
-
-              if (avatar64 == null || result.data == null) {
-                return ClipOval(child: datapod.defaultAvatar(size));
-              }
-
-              final sanitizedAvatar64 = avatar64
-                  .replaceAll('\n', '')
-                  .replaceAll('\r', '')
-                  .replaceAll(' ', '');
-
-              datapod.cacheAvatar(address, sanitizedAvatar64);
-
-              return ClipOval(
-                child: Image.memory(
-                  base64.decode(sanitizedAvatar64),
-                  fit: BoxFit.cover,
-                ),
-              );
-            }),
-      ),
-    );
+        width: size, child: ClipOval(child: datapod.defaultAvatar(size)));
   }
 }
diff --git a/lib/widgets/history_query.dart b/lib/widgets/history_query.dart
index b300687f..37c9d5b7 100644
--- a/lib/widgets/history_query.dart
+++ b/lib/widgets/history_query.dart
@@ -45,11 +45,11 @@ class HistoryQuery extends StatelessWidget {
         children: <Widget>[
           Query(
             options: QueryOptions(
-              document: gql(getHistoryByAddressQ),
+              document: gql(getHistoryByAddressRelayQ),
               variables: <String, dynamic>{
                 'address': address,
-                'number': nRepositories,
-                'offset': 0
+                'first': nRepositories,
+                'after': null
               },
             ),
             builder: (QueryResult result, {fetchMore, refetch}) {
@@ -61,7 +61,8 @@ class HistoryQuery extends StatelessWidget {
                   ),
                 );
               }
-              final List transactions = result.data?["transaction"];
+              final List transactions =
+                  result.data?["transferConnection"]["edges"];
 
               // Get transaction in progress if exist
               String? transactionId;
@@ -106,18 +107,10 @@ class HistoryQuery extends StatelessWidget {
                 ]);
               }
 
-              final int totalTransactions =
-                  result.data!["transaction_aggregate"]["aggregate"]["count"];
-              duniterIndexer.hasNextPage =
-                  !(transactions.length == totalTransactions);
-
-              opts = duniterIndexer.mergeQueryResult(
-                transactions: transactions,
-                opts: opts,
-                address: address,
-                nRepositories: nRepositories,
-                offset: transactions.length,
-              );
+              if (result.isNotLoading) {
+                opts = duniterIndexer.mergeQueryResult(
+                    result, opts, address, nRepositories);
+              }
 
               // Build history list
               return NotificationListener(
@@ -144,10 +137,14 @@ class HistoryQuery extends StatelessWidget {
                     ),
                   ),
                   onNotification: (dynamic t) {
+                    if (duniterIndexer.pageInfo == null) {
+                      duniterIndexer.reload();
+                    }
+
                     if (t is ScrollEndNotification &&
                         scrollController.position.pixels >=
                             scrollController.position.maxScrollExtent * 0.7 &&
-                        duniterIndexer.hasNextPage &&
+                        duniterIndexer.pageInfo!['hasNextPage'] &&
                         result.isNotLoading) {
                       fetchMore!(opts!);
                     }
diff --git a/lib/widgets/history_view.dart b/lib/widgets/history_view.dart
index 6483e340..9d211292 100644
--- a/lib/widgets/history_view.dart
+++ b/lib/widgets/history_view.dart
@@ -99,14 +99,14 @@ class HistoryView extends StatelessWidget {
                     context: context),
               ]);
             }).toList()),
-            if (result.isLoading && duniterIndexer.hasNextPage)
+            if (result.isLoading && duniterIndexer.pageInfo!['hasNextPage'])
               const Row(
                 mainAxisAlignment: MainAxisAlignment.center,
                 children: <Widget>[
                   Loading(size: 30, stroke: 3),
                 ],
               ),
-            if (!duniterIndexer.hasNextPage &&
+            if (!duniterIndexer.pageInfo!['hasNextPage'] &&
                 sub.oldOwnerKeys[address]?[0] != null)
               Padding(
                 padding: const EdgeInsets.symmetric(vertical: 30),
@@ -152,7 +152,7 @@ class HistoryView extends StatelessWidget {
                   ),
                 ),
               ),
-            if (!duniterIndexer.hasNextPage)
+            if (!duniterIndexer.pageInfo!['hasNextPage'])
               Column(
                 children: <Widget>[
                   ScaledSizedBox(height: 15),
diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart
index 9eca2acc..f0a10b26 100644
--- a/lib/widgets/idty_status.dart
+++ b/lib/widgets/idty_status.dart
@@ -37,14 +37,14 @@ class IdentityStatus extends StatelessWidget {
             final resStatus = walletData.identityStatus;
 
             if (!isOwner) {
-              if (resStatus == IdtyStatus.confirmed) {
+              if (resStatus == IdtyStatus.unvalidated) {
                 return NameByAddress(
                     wallet: walletData,
                     size: 18,
                     color: Colors.grey[700]!,
                     fontWeight: FontWeight.w500,
                     fontStyle: FontStyle.italic);
-              } else if (resStatus == IdtyStatus.validated) {
+              } else if (resStatus == IdtyStatus.member) {
                 return NameByAddress(
                     wallet: walletData,
                     size: 20,
@@ -56,16 +56,17 @@ class IdentityStatus extends StatelessWidget {
 
             final Map<IdtyStatus, String> statusText = {
               IdtyStatus.none: '',
-              IdtyStatus.created: 'identityCreated'.tr(),
-              IdtyStatus.confirmed: 'identityConfirmed'.tr(),
-              IdtyStatus.validated: 'memberValidated'.tr(),
-              IdtyStatus.expired: 'identityExpired'.tr(),
+              IdtyStatus.unconfirmed: 'identityCreated'.tr(),
+              IdtyStatus.unvalidated: 'identityConfirmed'.tr(),
+              IdtyStatus.member: 'memberValidated'.tr(),
+              IdtyStatus.notMember: 'identityExpired'.tr(),
+              IdtyStatus.revoked: 'identityRevoked'.tr(),
               IdtyStatus.unknown: ''
             };
 
             return SizedBox(
               child: showText(statusText[resStatus]!,
-                  bold: resStatus == IdtyStatus.validated, size: scaleSize(17)),
+                  bold: resStatus == IdtyStatus.member, size: scaleSize(17)),
             );
           });
     });
diff --git a/lib/widgets/name_by_address.dart b/lib/widgets/name_by_address.dart
index 2817fe9e..ac71130a 100644
--- a/lib/widgets/name_by_address.dart
+++ b/lib/widgets/name_by_address.dart
@@ -56,8 +56,12 @@ class NameByAddress extends StatelessWidget {
               return const Loading();
             }
 
-            duniterIndexer.walletNameIndexer[wallet.address] =
-                result.data?['account_by_pk']?['identity']?['name'];
+            final edges = result.data?['identityConnection']['edges'];
+            final name = edges != null && edges.isNotEmpty
+                ? edges[0]['node']['name']
+                : null;
+
+            duniterIndexer.walletNameIndexer[wallet.address] = name;
 
             g1WalletsBox.put(
                 wallet.address,
diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart
index 2037b242..20de58af 100644
--- a/lib/widgets/payment_popup.dart
+++ b/lib/widgets/payment_popup.dart
@@ -38,8 +38,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
     // Payment workflow !
     final sub = Provider.of<SubstrateSdk>(context, listen: false);
     final acc = sub.getCurrentWallet();
-    log.d(
-        "fromAddress: ${acc.address!},destAddress: $toAddress, amount: ${double.parse(walletViewProvider.payAmount.text)}");
+    // log.d(
+    //     "fromAddress: ${acc.address!},destAddress: $toAddress, amount: ${double.parse(walletViewProvider.payAmount.text)}");
     final transactionId = await sub.pay(
         fromAddress: acc.address!,
         destAddress: toAddress,
diff --git a/lib/widgets/search_identity_query.dart b/lib/widgets/search_identity_query.dart
index 1d912cf9..352e7b5d 100644
--- a/lib/widgets/search_identity_query.dart
+++ b/lib/widgets/search_identity_query.dart
@@ -35,7 +35,7 @@ class SearchIdentityQuery extends StatelessWidget {
           options: QueryOptions(
             document: gql(searchAddressByNameQ),
             variables: {
-              'name': name,
+              'name': '%$name%',
             },
           ),
           builder: (QueryResult result,
@@ -50,15 +50,16 @@ class SearchIdentityQuery extends StatelessWidget {
               return Text('loading'.tr());
             }
 
-            final List identities = result.data?['search_identity'] ?? [];
+            final List identities =
+                result.data?['identityConnection']['edges'] ?? [];
 
             if (identities.isEmpty) {
               return Text('noResult'.tr());
             }
 
             for (Map profile in identities) {
-              duniterIndexer.walletNameIndexer
-                  .putIfAbsent(profile['pubkey'], () => profile['name']);
+              duniterIndexer.walletNameIndexer.putIfAbsent(
+                  profile['node']['accountId'], () => profile['node']['name']);
             }
 
             searchProvider.resultLenght = identities.length;
@@ -68,13 +69,14 @@ class SearchIdentityQuery extends StatelessWidget {
               child: ListView(children: <Widget>[
                 for (Map profile in identities)
                   ListTile(
-                      key: keySearchResult(profile['pubkey']),
+                      key: keySearchResult(profile['node']['accountId']),
                       horizontalTitleGap: 10,
                       contentPadding: const EdgeInsets.only(right: 2),
                       leading: DatapodAvatar(
-                          address: profile['pubkey'], size: avatarSize),
+                          address: profile['node']['accountId'],
+                          size: avatarSize),
                       title: Row(children: <Widget>[
-                        Text(getShortPubkey(profile['pubkey']),
+                        Text(getShortPubkey(profile['node']['accountId']),
                             style: scaledTextStyle(
                                 fontSize: 16,
                                 fontFamily: 'Monospace',
@@ -90,12 +92,13 @@ class SearchIdentityQuery extends StatelessWidget {
                                   mainAxisAlignment: MainAxisAlignment.center,
                                   children: [
                                     Balance(
-                                        address: profile['pubkey'], size: 15),
+                                        address: profile['node']['accountId'],
+                                        size: 15),
                                   ]),
                             ]),
                       ),
                       subtitle: Row(children: <Widget>[
-                        Text(profile['name'] ?? '',
+                        Text(profile['node']['name'] ?? '',
                             style: scaledTextStyle(
                                 fontSize: 17, fontWeight: FontWeight.w500),
                             textAlign: TextAlign.center),
@@ -107,10 +110,11 @@ class SearchIdentityQuery extends StatelessWidget {
                         Navigator.push(
                           context,
                           MaterialPageRoute(builder: (context) {
-                            walletsProfiles.address = profile['pubkey'];
+                            walletsProfiles.address =
+                                profile['node']['accountId'];
                             return WalletViewScreen(
-                              address: profile['pubkey'],
-                              username: profile['name'],
+                              address: profile['node']['accountId'],
+                              username: profile['node']['name'],
                             );
                           }),
                         );
diff --git a/lib/widgets/transaction_in_progress_tile.dart b/lib/widgets/transaction_in_progress_tile.dart
index ae487245..1e3d392e 100644
--- a/lib/widgets/transaction_in_progress_tile.dart
+++ b/lib/widgets/transaction_in_progress_tile.dart
@@ -39,17 +39,21 @@ class _TransactionInProgressTuleState extends State<TransactionInProgressTule> {
     final stream = duniterIndexer.subscribeHistoryIssued(widget.address);
     txContent = sub.transactionStatus[widget.transactionId]!;
 
+    //TODO: change way to get finliized transaction status
+
     subscription = stream.listen((result) {
-      if (result.data?['account_by_pk'] == null) return;
+      if (result.data?['accountConnection']['edges'] == null) return;
       if (result.hasException) {
         log.e(result.exception);
         isVisible = true;
       } else {
-        final Map transData =
-            result.data?['account_by_pk']['transactions_issued'].first;
-        final String receiver = transData['receiver_pubkey'];
+        final Map transDataNode =
+            result.data?['accountConnection']['edges'].first;
+        if (transDataNode['node']['transfersIssued'].isEmpty) return;
+        final Map transData = transDataNode['node']['transfersIssued'][0];
+        final String receiver = transData['toId'];
         final double amount = transData['amount'] / 100;
-        final createdAt = DateTime.parse(transData['created_at']);
+        final createdAt = DateTime.parse(transData['timestamp']);
         final difference = createdAt.difference(DateTime.now());
 
         if (receiver == txContent.to &&
diff --git a/pubspec.lock b/pubspec.lock
index 42b1dcff..65578940 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -17,6 +17,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.6.0"
+  adaptive_number:
+    dependency: transitive
+    description:
+      name: adaptive_number
+      sha256: "3a567544e9b5c9c803006f51140ad544aedc79604fd4f3f2c1380003f97c1d77"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.0"
   analyzer:
     dependency: transitive
     description:
@@ -37,10 +45,10 @@ packages:
     dependency: transitive
     description:
       name: args
-      sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
+      sha256: "7cf60b9f0cc88203c5a190b4cd62a99feea42759a7fa695010eb5de1c0b2252a"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.2"
+    version: "2.5.0"
   async:
     dependency: transitive
     description:
@@ -53,10 +61,10 @@ packages:
     dependency: transitive
     description:
       name: barcode
-      sha256: "91b143666f7bb13636f716b6d4e412e372ab15ff7969799af8c9e30a382e9385"
+      sha256: "1fe4a55344505850517ce72d4a3a7b9ccf51b0dc1631ee7e552f6eacc4947f96"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.6"
+    version: "2.2.7"
   barcode_scan2:
     dependency: "direct main"
     description:
@@ -65,22 +73,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.3.0"
-  bidi:
+  base_x:
     dependency: transitive
     description:
-      name: bidi
-      sha256: "1a7d0c696324b2089f72e7671fd1f1f64fef44c980f3cebc84e803967c597b63"
+      name: base_x
+      sha256: "519abcdafd637d4b6bd7e72fabd8f9264935f804b9b9f6c5d8411c7d52cbf8fd"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.10"
-  bip32:
+    version: "2.0.1"
+  bidi:
     dependency: transitive
     description:
-      name: bip32
-      sha256: "54787cd7a111e9d37394aabbf53d1fc5e2e0e0af2cd01c459147a97c0e3f8a97"
+      name: bidi
+      sha256: "1a7d0c696324b2089f72e7671fd1f1f64fef44c980f3cebc84e803967c597b63"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.0"
+    version: "2.0.10"
   bip32_ed25519:
     dependency: transitive
     description:
@@ -97,6 +105,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.0.6"
+  bip39_mnemonic:
+    dependency: transitive
+    description:
+      name: bip39_mnemonic
+      sha256: "24855a62fb9dd930f697063a274e084b0a574e1cc55ec270ca4756f579ab512c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.6"
   bip39_multi_nullsafety:
     dependency: transitive
     description:
@@ -113,14 +129,6 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.1.1"
-  bs58check:
-    dependency: transitive
-    description:
-      name: bs58check
-      sha256: c4a164d42b25c2f6bc88a8beccb9fc7d01440f3c60ba23663a20a70faf484ea9
-      url: "https://pub.dev"
-    source: hosted
-    version: "1.0.2"
   bubble:
     dependency: "direct main"
     description:
@@ -165,10 +173,10 @@ packages:
     dependency: "direct dev"
     description:
       name: build_runner
-      sha256: "581bacf68f89ec8792f5e5a0b2c4decd1c948e97ce659dc783688c8a88fbec21"
+      sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22"
       url: "https://pub.dev"
     source: hosted
-    version: "2.4.8"
+    version: "2.4.9"
   build_runner_core:
     dependency: transitive
     description:
@@ -189,10 +197,10 @@ packages:
     dependency: transitive
     description:
       name: built_value
-      sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e
+      sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb
       url: "https://pub.dev"
     source: hosted
-    version: "8.9.1"
+    version: "8.9.2"
   carousel_slider:
     dependency: "direct main"
     description:
@@ -253,10 +261,10 @@ packages:
     dependency: "direct main"
     description:
       name: connectivity_plus
-      sha256: b74247fad72c171381dbe700ca17da24deac637ab6d43c343b42867acb95c991
+      sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.6"
+    version: "5.0.2"
   connectivity_plus_platform_interface:
     dependency: transitive
     description:
@@ -277,10 +285,10 @@ packages:
     dependency: transitive
     description:
       name: cross_file
-      sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e
+      sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.3+8"
+    version: "0.3.4+1"
   crypto:
     dependency: "direct main"
     description:
@@ -289,6 +297,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.0.3"
+  cryptography:
+    dependency: transitive
+    description:
+      name: cryptography
+      sha256: d146b76d33d94548cf035233fbc2f4338c1242fa119013bead807d033fc4ae05
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.7.0"
   dart_style:
     dependency: transitive
     description:
@@ -305,22 +321,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.7.10"
-  decimal:
-    dependency: transitive
-    description:
-      name: decimal
-      sha256: "24a261d5d5c87e86c7651c417a5dbdf8bcd7080dd592533910e8d0505a279f21"
-      url: "https://pub.dev"
-    source: hosted
-    version: "2.3.3"
   dio:
     dependency: "direct main"
     description:
       name: dio
-      sha256: "49af28382aefc53562459104f64d16b9dfd1e8ef68c862d5af436cc8356ce5a8"
+      sha256: "11e40df547d418cc0c4900a9318b26304e665da6fa4755399a9ff9efd09034b5"
       url: "https://pub.dev"
     source: hosted
-    version: "5.4.1"
+    version: "5.4.3+1"
   dots_indicator:
     dependency: "direct main"
     description:
@@ -337,6 +345,13 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.1.8"
+  durt2:
+    dependency: "direct main"
+    description:
+      path: "../../durt2"
+      relative: true
+    source: path
+    version: "0.1.0"
   easy_localization:
     dependency: "direct main"
     description:
@@ -353,14 +368,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.0.2"
+  ed25519_edwards:
+    dependency: transitive
+    description:
+      name: ed25519_edwards
+      sha256: "6ce0112d131327ec6d42beede1e5dfd526069b18ad45dcf654f15074ad9276cd"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.3.1"
+  edwards25519:
+    dependency: transitive
+    description:
+      name: edwards25519
+      sha256: "48e4678136e362bed9790dfb716ebe8e2f34f026bdb900b058214620672c6273"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
   eip1559:
     dependency: transitive
     description:
       name: eip1559
-      sha256: de454d6321bd753eb79116e9ec4f8df20895c2e97f9a3839a032f3a728985516
+      sha256: c2b81ac85f3e0e71aaf558201dd9a4600f051ece7ebacd0c5d70065c9b458004
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.1"
+    version: "0.6.2"
   eip55:
     dependency: transitive
     description:
@@ -369,14 +400,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.0.2"
-  ethers:
+  equatable:
     dependency: transitive
     description:
-      name: ethers
-      sha256: e7f06c339a04c626c6df73f6c2559a956810a2c1b7fa32a5a6e198a78cd0c9ff
+      name: equatable
+      sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2
       url: "https://pub.dev"
     source: hosted
-    version: "0.0.1+3"
+    version: "2.0.5"
   fade_and_translate:
     dependency: "direct main"
     description:
@@ -470,6 +501,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.1.3"
+  flutter_curve25519:
+    dependency: transitive
+    description:
+      name: flutter_curve25519
+      sha256: d2d196e51de878f5f0289d2d7c5e93dc0c62ccda7ca98c7e47b5a58a6851b861
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.1.2"
   flutter_driver:
     dependency: transitive
     description: flutter
@@ -479,10 +518,10 @@ packages:
     dependency: transitive
     description:
       name: flutter_hooks
-      sha256: "6a126f703b89499818d73305e4ce1e3de33b4ae1c5512e3b8eab4b986f46774c"
+      sha256: cde36b12f7188c85286fba9b38cc5a902e7279f36dd676967106c041dc9dde70
       url: "https://pub.dev"
     source: hosted
-    version: "0.18.6"
+    version: "0.20.5"
   flutter_inappwebview:
     dependency: transitive
     description:
@@ -495,10 +534,10 @@ packages:
     dependency: "direct dev"
     description:
       name: flutter_lints
-      sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
+      sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.1"
+    version: "3.0.2"
   flutter_localizations:
     dependency: transitive
     description: flutter
@@ -508,26 +547,74 @@ packages:
     dependency: "direct main"
     description:
       name: flutter_markdown
-      sha256: cb44f7831b23a6bdd0f501718b0d2e8045cbc625a15f668af37ddb80314821db
+      sha256: "9921f9deda326f8a885e202b1e35237eadfc1345239a0f6f0f1ff287e047547f"
       url: "https://pub.dev"
     source: hosted
-    version: "0.6.21"
+    version: "0.7.1"
   flutter_plugin_android_lifecycle:
     dependency: transitive
     description:
       name: flutter_plugin_android_lifecycle
-      sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da
+      sha256: "8cf40eebf5dec866a6d1956ad7b4f7016e6c0cc69847ab946833b7d43743809f"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.17"
+    version: "2.0.19"
+  flutter_secure_storage:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage
+      sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685
+      url: "https://pub.dev"
+    source: hosted
+    version: "9.0.0"
+  flutter_secure_storage_linux:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage_linux
+      sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
+  flutter_secure_storage_macos:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage_macos
+      sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.1"
+  flutter_secure_storage_platform_interface:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage_platform_interface
+      sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.2"
+  flutter_secure_storage_web:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage_web
+      sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
+  flutter_secure_storage_windows:
+    dependency: transitive
+    description:
+      name: flutter_secure_storage_windows
+      sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.0"
   flutter_svg:
     dependency: "direct main"
     description:
       name: flutter_svg
-      sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c
+      sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.9"
+    version: "2.0.10+1"
   flutter_test:
     dependency: "direct dev"
     description: flutter
@@ -542,10 +629,10 @@ packages:
     dependency: transitive
     description:
       name: frontend_server_client
-      sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
+      sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
       url: "https://pub.dev"
     source: hosted
-    version: "3.2.0"
+    version: "4.0.0"
   fuchsia_remote_debug_protocol:
     dependency: transitive
     description: flutter
@@ -579,74 +666,74 @@ packages:
     dependency: transitive
     description:
       name: gql
-      sha256: "998304fbb88a3956cfea10cd27a56f8e5d4b3bc110f03c952c18a9310774e8bb"
+      sha256: afe032332ddfa69b79f1dea2ad7d95923d4993c1b269b224fc7bb3d17e32d33c
       url: "https://pub.dev"
     source: hosted
-    version: "0.14.0"
+    version: "1.0.1-alpha+1709845491443"
   gql_dedupe_link:
     dependency: transitive
     description:
       name: gql_dedupe_link
-      sha256: "89681048cf956348e865da872a40081499b8c087fc84dd4d4b9c134bd70d27b3"
+      sha256: "2971173c68623d5c43f5327ea899bd2ee64ce3461c1263f240b4bb6211f667be"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.3+1"
+    version: "2.0.4-alpha+1709845491527"
   gql_error_link:
     dependency: transitive
     description:
       name: gql_error_link
-      sha256: e7bfdd2b6232f3e15861cd96c2ad6b7c9c94693843b3dea18295136a5fb5b534
+      sha256: "93901458f3c050e33386dedb0ca7173e08cebd7078e4e0deca4bf23ab7a71f63"
       url: "https://pub.dev"
     source: hosted
-    version: "0.2.3+1"
+    version: "1.0.0+1"
   gql_exec:
     dependency: transitive
     description:
       name: gql_exec
-      sha256: "0d1fdb2e4154efbfc1dcf3f35ec36d19c8428ff0d560eb4c45b354f8f871dc50"
+      sha256: "394944626fae900f1d34343ecf2d62e44eb984826189c8979d305f0ae5846e38"
       url: "https://pub.dev"
     source: hosted
-    version: "0.4.3"
+    version: "1.1.1-alpha+1699813812660"
   gql_http_link:
     dependency: transitive
     description:
       name: gql_http_link
-      sha256: "89ef87b32947acf4189f564c095f1148b0ab9bb9996fe518716dbad66708b834"
+      sha256: "1f922eed1b7078fdbfd602187663026f9f659fe9a9499e2207b5d5e01617f658"
       url: "https://pub.dev"
     source: hosted
-    version: "0.4.5"
+    version: "1.0.1+1"
   gql_link:
     dependency: transitive
     description:
       name: gql_link
-      sha256: f7973279126bc922d465c4f4da6ed93d187085e597b3480f5e14e74d28fe14bd
+      sha256: "177500e250b3742d6d2673d57961e8413b6593dc6bd6a512c51865b6cf096f7e"
       url: "https://pub.dev"
     source: hosted
-    version: "0.5.1"
+    version: "1.0.1-alpha+1709845491457"
   gql_transform_link:
     dependency: transitive
     description:
       name: gql_transform_link
-      sha256: b1735a9a92d25a92960002a8b40dfaede95ec1e5ed848906125d69efd878661f
+      sha256: "0645fdd874ca1be695fd327271fdfb24c0cd6fa40774a64b946062f321a59709"
       url: "https://pub.dev"
     source: hosted
-    version: "0.2.2+1"
+    version: "1.0.0"
   graphql:
     dependency: transitive
     description:
       name: graphql
-      sha256: b061201579040e9548cec2bae17bbdea0ab30666cb4e7ba48b9675f14d982199
+      sha256: d066e53446166c12537458386b507f7426f2b8801ebafc184576aab3cbc64d56
       url: "https://pub.dev"
     source: hosted
-    version: "5.1.3"
+    version: "5.2.0-beta.7"
   graphql_flutter:
     dependency: "direct main"
     description:
       name: graphql_flutter
-      sha256: "06059ac9e8417c71582f05e28a59b1416d43959d34a6a0d9565341e3a362e117"
+      sha256: "39b5e830bc654ab02c5b776c31675841d1a8c95840fdd284efba713b1d47e65d"
       url: "https://pub.dev"
     source: hosted
-    version: "5.1.2"
+    version: "5.2.0-beta.6"
   graphs:
     dependency: transitive
     description:
@@ -655,6 +742,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.3.1"
+  hashlib_codecs:
+    dependency: transitive
+    description:
+      name: hashlib_codecs
+      sha256: "49e2a471f74b15f1854263e58c2ac11f2b631b5b12c836f9708a35397d36d626"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.2.0"
   hex:
     dependency: "direct main"
     description:
@@ -691,10 +786,10 @@ packages:
     dependency: transitive
     description:
       name: http
-      sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2"
+      sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
       url: "https://pub.dev"
     source: hosted
-    version: "0.13.6"
+    version: "1.2.1"
   http_multi_server:
     dependency: transitive
     description:
@@ -731,58 +826,58 @@ packages:
     dependency: "direct main"
     description:
       name: image_cropper
-      sha256: "542c3453109d16bcc388e43ae2276044d2cd6a6d20c68bdcff2c94ab9363ea15"
+      sha256: f4bad5ed2dfff5a7ce0dfbad545b46a945c702bb6182a921488ef01ba7693111
       url: "https://pub.dev"
     source: hosted
-    version: "4.0.1"
+    version: "5.0.1"
   image_cropper_for_web:
     dependency: transitive
     description:
       name: image_cropper_for_web
-      sha256: "89c936aa772a35b69ca67b78049ae9fa163a4fb8da2f6dee3893db8883fb49d2"
+      sha256: "865d798b5c9d826f1185b32e5d0018c4183ddb77b7b82a931e1a06aa3b74974e"
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.0"
+    version: "3.0.0"
   image_cropper_platform_interface:
     dependency: transitive
     description:
       name: image_cropper_platform_interface
-      sha256: b232175c132b2f7ede3e1f101652bcd635cb4079a77c6dded8e6d32e6578d685
+      sha256: ee160d686422272aa306125f3b6fb1c1894d9b87a5e20ed33fa008e7285da11e
       url: "https://pub.dev"
     source: hosted
-    version: "4.0.0"
+    version: "5.0.0"
   image_picker:
     dependency: "direct main"
     description:
       name: image_picker
-      sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd"
+      sha256: fe9ee64ccb8d599a5dfb0e21cc6652232c610bcf667af4e79b9eb175cc30a7a5
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.7"
+    version: "1.1.0"
   image_picker_android:
     dependency: transitive
     description:
       name: image_picker_android
-      sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1"
+      sha256: "8e75431a62b7feb4fd55cb4a5c6f0ac4564460ec5dc09f9c4a0d50a5ce7c4cb9"
       url: "https://pub.dev"
     source: hosted
-    version: "0.8.9+3"
+    version: "0.8.10"
   image_picker_for_web:
     dependency: transitive
     description:
       name: image_picker_for_web
-      sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3
+      sha256: "5d6eb13048cd47b60dbf1a5495424dea226c5faf3950e20bf8120a58efb5b5f3"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.2"
+    version: "3.0.4"
   image_picker_ios:
     dependency: transitive
     description:
       name: image_picker_ios
-      sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3
+      sha256: f4a6f62be96d6fd268f32a6bf8ef444cd8e3fff64d16923c6e6fe55e0c84a761
       url: "https://pub.dev"
     source: hosted
-    version: "0.8.9+1"
+    version: "0.8.10"
   image_picker_linux:
     dependency: transitive
     description:
@@ -803,10 +898,10 @@ packages:
     dependency: transitive
     description:
       name: image_picker_platform_interface
-      sha256: "3d2c323daea9d60608f1caf30be32a938916f4975434b8352e6f73dae496da38"
+      sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80"
       url: "https://pub.dev"
     source: hosted
-    version: "2.9.4"
+    version: "2.10.0"
   image_picker_windows:
     dependency: transitive
     description:
@@ -868,6 +963,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.0.2"
+  json_schema2:
+    dependency: transitive
+    description:
+      name: json_schema2
+      sha256: "094e60d3605333c0816eeb2e5310b4f71ffaea2c0abc026b27418c1ac41a5db3"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.4+9"
   leak_tracker:
     dependency: transitive
     description:
@@ -904,10 +1007,10 @@ packages:
     dependency: "direct main"
     description:
       name: logger
-      sha256: b3ff55aeb08d9d8901b767650285872cb1bb8f508373b3e348d60268b0c7f770
+      sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04"
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.0"
+    version: "2.2.0"
   logging:
     dependency: transitive
     description:
@@ -940,6 +1043,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.8.0"
+  merlin:
+    dependency: transitive
+    description:
+      name: merlin
+      sha256: c6b5d5bc70880aa7639686db66480d0be4b89da843b5cab20550610507da2540
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.3"
   meta:
     dependency: transitive
     description:
@@ -960,10 +1071,10 @@ packages:
     dependency: transitive
     description:
       name: mobx
-      sha256: "74ee54012dc7c1b3276eaa960a600a7418ef5f9997565deb8fca1fd88fb36b78"
+      sha256: "63920b27b32ad1910adfe767ab1750e4c212e8923232a1f891597b362074ea5e"
       url: "https://pub.dev"
     source: hosted
-    version: "2.3.0+1"
+    version: "2.3.3+2"
   nested:
     dependency: transitive
     description:
@@ -984,10 +1095,10 @@ packages:
     dependency: transitive
     description:
       name: normalize
-      sha256: baf8caf2d8b745af5737cca6c24f7fe3cf3158897fdbcde9a909b9c8d3e2e5af
+      sha256: "8a60e37de5b608eeaf9b839273370c71ebba445e9f73b08eee7725e0d92dbc43"
       url: "https://pub.dev"
     source: hosted
-    version: "0.7.2"
+    version: "0.8.2+1"
   package_config:
     dependency: transitive
     description:
@@ -1000,18 +1111,18 @@ packages:
     dependency: "direct main"
     description:
       name: package_info_plus
-      sha256: "88bc797f44a94814f2213db1c9bd5badebafdfb8290ca9f78d4b9ee2a3db4d79"
+      sha256: "2c582551839386fa7ddbc7770658be7c0f87f388a4bff72066478f597c34d17f"
       url: "https://pub.dev"
     source: hosted
-    version: "5.0.1"
+    version: "7.0.0"
   package_info_plus_platform_interface:
     dependency: transitive
     description:
       name: package_info_plus_platform_interface
-      sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6"
+      sha256: f49918f3433a3146047372f9d4f1f847511f2acd5cd030e1f44fe5a50036b70e
       url: "https://pub.dev"
     source: hosted
-    version: "2.0.1"
+    version: "3.0.0"
   path:
     dependency: transitive
     description:
@@ -1032,18 +1143,18 @@ packages:
     dependency: "direct main"
     description:
       name: path_provider
-      sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b
+      sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161
       url: "https://pub.dev"
     source: hosted
-    version: "2.1.2"
+    version: "2.1.3"
   path_provider_android:
     dependency: transitive
     description:
       name: path_provider_android
-      sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668"
+      sha256: a248d8146ee5983446bf03ed5ea8f6533129a12b11f12057ad1b4a67a2b3b41d
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.2.4"
   path_provider_foundation:
     dependency: transitive
     description:
@@ -1096,10 +1207,10 @@ packages:
     dependency: "direct main"
     description:
       name: permission_handler
-      sha256: "74e962b7fad7ff75959161bb2c0ad8fe7f2568ee82621c9c2660b751146bfe44"
+      sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb"
       url: "https://pub.dev"
     source: hosted
-    version: "11.3.0"
+    version: "11.3.1"
   permission_handler_android:
     dependency: transitive
     description:
@@ -1112,10 +1223,10 @@ packages:
     dependency: transitive
     description:
       name: permission_handler_apple
-      sha256: bdafc6db74253abb63907f4e357302e6bb786ab41465e8635f362ee71fd8707b
+      sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662
       url: "https://pub.dev"
     source: hosted
-    version: "9.4.0"
+    version: "9.4.4"
   permission_handler_html:
     dependency: transitive
     description:
@@ -1128,10 +1239,10 @@ packages:
     dependency: transitive
     description:
       name: permission_handler_platform_interface
-      sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78"
+      sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20"
       url: "https://pub.dev"
     source: hosted
-    version: "4.2.0"
+    version: "4.2.1"
   permission_handler_windows:
     dependency: transitive
     description:
@@ -1184,19 +1295,51 @@ packages:
     dependency: "direct main"
     description:
       name: pointycastle
-      sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29"
+      sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.9.0"
+  polkadart:
+    dependency: transitive
+    description:
+      name: polkadart
+      sha256: "4be169198d7938aec035eacead499b469795ccc9797589bb2df5b2ec6bd52535"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.3"
+  polkadart_cli:
+    dependency: transitive
+    description:
+      name: polkadart_cli
+      sha256: a0c82811e7ed935208afc7a8e0ef04446574d53f0a1855694ec5ad0792decef1
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.2"
+  polkadart_keyring:
+    dependency: transitive
+    description:
+      name: polkadart_keyring
+      sha256: "10cdd75e3319169ca7a4bb49745d85fab3f56bba2eafda35655c4f278a4c5e07"
       url: "https://pub.dev"
     source: hosted
-    version: "3.7.4"
+    version: "0.4.3"
+  polkadart_scale_codec:
+    dependency: transitive
+    description:
+      name: polkadart_scale_codec
+      sha256: fab60c739f6ebcc812796e56378656dca57179cec46e92c23614db6fd9ed0f86
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
   polkawallet_sdk:
     dependency: "direct main"
     description:
       path: "."
-      ref: "8b254d9e98cb367b4a57d67f8c6f5bbe89a52552"
-      resolved-ref: "8b254d9e98cb367b4a57d67f8c6f5bbe89a52552"
+      ref: fcfdb5e9f214c99c8d3a97d3aea38a67ea1fa6a5
+      resolved-ref: fcfdb5e9f214c99c8d3a97d3aea38a67ea1fa6a5
       url: "https://github.com/poka-IT/sdk.git"
     source: git
-    version: "0.5.4+4"
+    version: "0.5.9+4"
   pool:
     dependency: transitive
     description:
@@ -1269,14 +1412,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "4.1.0"
-  rational:
+  quiver:
     dependency: transitive
     description:
-      name: rational
-      sha256: ba58e9e18df9abde280e8b10051e4bce85091e41e8e7e411b6cde2e738d357cf
+      name: quiver
+      sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "3.2.1"
+  recase:
+    dependency: transitive
+    description:
+      name: recase
+      sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213
+      url: "https://pub.dev"
+    source: hosted
+    version: "4.1.0"
   responsive_framework:
     dependency: "direct main"
     description:
@@ -1285,6 +1436,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.4.0"
+  rest_client:
+    dependency: transitive
+    description:
+      name: rest_client
+      sha256: "90473416250779b85f8d620e9dc277f38ea67acf84d3c6299e005ce08caedd69"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.0"
+  ristretto255:
+    dependency: transitive
+    description:
+      name: ristretto255
+      sha256: "3824d6786146dfb3b0783f305b714d36fa213c0d08e0ba864267baa0ede51cdd"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.2"
   rxdart:
     dependency: transitive
     description:
@@ -1297,50 +1464,50 @@ packages:
     dependency: "direct main"
     description:
       name: screen_brightness
-      sha256: a1273cbc854c39c940c17ac400c040afd973166b8808f2efe2072763b23e4d30
+      sha256: "7d4ac84ae26b37c01d6f5db7123a72db7933e1f2a2a8c369a51e08f81b3178d8"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   screen_brightness_android:
     dependency: transitive
     description:
       name: screen_brightness_android
-      sha256: "69d903bb42071aa2ad8853bf24e206ff6c39894930278e6239751447aacb9fe4"
+      sha256: "8c69d3ac475e4d625e7fa682a3a51a69ff59abe5b4a9e57f6ec7d830a6c69bd6"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   screen_brightness_ios:
     dependency: transitive
     description:
       name: screen_brightness_ios
-      sha256: "265790af69e26c4840e515b9b34e31505f95c0ca8866fac47b80db3552196214"
+      sha256: f08f70ca1ac3e30719764b5cfb8b3fe1e28163065018a41b3e6f243ab146c2f1
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   screen_brightness_macos:
     dependency: transitive
     description:
       name: screen_brightness_macos
-      sha256: b83e7a8b7c0f1a3161b586620781517b585deb4082dfff3745a5b2779ea94996
+      sha256: "70c2efa4534e22b927e82693488f127dd4a0f008469fccf4f0eefe9061bbdd6a"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   screen_brightness_platform_interface:
     dependency: transitive
     description:
       name: screen_brightness_platform_interface
-      sha256: e160b78f37bc093a6a66bfa118bb9266c36bfa3163bf976f94e0e5aa79977ff9
+      sha256: "9f3ebf7f22d5487e7676fe9ddaf3fc55b6ff8057707cf6dc0121c7dfda346a16"
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   screen_brightness_windows:
     dependency: transitive
     description:
       name: screen_brightness_windows
-      sha256: "1f1f14436ec3d8fdda4dca60a8c6aa70f9ae1c04a55bd2cf40e3a4453a4bf78e"
+      sha256: c8e12a91cf6dd912a48bd41fcf749282a51afa17f536c3460d8d05702fb89ffa
       url: "https://pub.dev"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   scroll_to_index:
     dependency: transitive
     description:
@@ -1357,38 +1524,46 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.1.0"
+  secp256k1_ecdsa:
+    dependency: transitive
+    description:
+      name: secp256k1_ecdsa
+      sha256: "87008b4fd164d861b94b0edf2e01ffadd6f06769e1f0382e19bb091daecc0576"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.0"
   sentry:
     dependency: transitive
     description:
       name: sentry
-      sha256: a524a87d096799b775530176c8c082afe7aa1f10cc31ba078fecdd74e9afc923
+      sha256: "19a267774906ca3a3c4677fc7e9582ea9da79ae9a28f84bbe4885dac2c269b70"
       url: "https://pub.dev"
     source: hosted
-    version: "7.17.0"
+    version: "7.20.0"
   sentry_flutter:
     dependency: "direct main"
     description:
       name: sentry_flutter
-      sha256: e0f8367f8f7c74dba9f7521f71700bce6c6ee065cf342f065d4fce411b84fc7b
+      sha256: "2d2917f7d795167e33a790db9bc5e1104d2035569ecf83e09a3f491bc6978cfe"
       url: "https://pub.dev"
     source: hosted
-    version: "7.17.0"
+    version: "7.20.0"
   shared_preferences:
     dependency: transitive
     description:
       name: shared_preferences
-      sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02"
+      sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.2.3"
   shared_preferences_android:
     dependency: transitive
     description:
       name: shared_preferences_android
-      sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06"
+      sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.1"
+    version: "2.2.2"
   shared_preferences_foundation:
     dependency: transitive
     description:
@@ -1417,10 +1592,10 @@ packages:
     dependency: transitive
     description:
       name: shared_preferences_web
-      sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21"
+      sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.2"
+    version: "2.3.0"
   shared_preferences_windows:
     dependency: transitive
     description:
@@ -1474,6 +1649,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.10.0"
+  sprintf:
+    dependency: transitive
+    description:
+      name: sprintf
+      sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.0.0"
+  sr25519:
+    dependency: transitive
+    description:
+      name: sr25519
+      sha256: "266f7b2a4dd2d6a41a49924d41e80665f3b8340c157deff172f2b0cf64657a27"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.0"
+  ss58:
+    dependency: transitive
+    description:
+      name: ss58
+      sha256: b24d2713597b83708ef30daea5a565dba8bc9129031b30c025069e168301ae5e
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
   stack_trace:
     dependency: transitive
     description:
@@ -1506,6 +1705,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.2.0"
+  strobe:
+    dependency: transitive
+    description:
+      name: strobe
+      sha256: a23adf7d305e45c6f210270aa925d8b404819144e29f7c5257a67281b63e0887
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
+  substrate_bip39:
+    dependency: transitive
+    description:
+      name: substrate_bip39
+      sha256: "29548105e939d1fb213aba96686eb5c5aae472249fa12b8dda58b252d23f492c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.4.0"
+  substrate_metadata:
+    dependency: transitive
+    description:
+      name: substrate_metadata
+      sha256: "4557950c7dcea17cdf7e1224ac7822ab38dd9658f000be6d58b4a41b0a8126d4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
   sync_http:
     dependency: transitive
     description:
@@ -1574,26 +1797,34 @@ packages:
     dependency: "direct main"
     description:
       name: unorm_dart
-      sha256: "23d8bf65605401a6a32cff99435fed66ef3dab3ddcad3454059165df46496a3b"
+      sha256: "5b35bff83fce4d76467641438f9e867dc9bcfdb8c1694854f230579d68cd8f4b"
       url: "https://pub.dev"
     source: hosted
-    version: "0.3.0"
+    version: "0.2.0"
+  uri:
+    dependency: transitive
+    description:
+      name: uri
+      sha256: "889eea21e953187c6099802b7b4cf5219ba8f3518f604a1033064d45b1b8268a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.0"
   url_launcher:
     dependency: "direct main"
     description:
       name: url_launcher
-      sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e"
+      sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e"
       url: "https://pub.dev"
     source: hosted
-    version: "6.2.5"
+    version: "6.2.6"
   url_launcher_android:
     dependency: transitive
     description:
       name: url_launcher_android
-      sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745
+      sha256: "360a6ed2027f18b73c8d98e159dda67a61b7f2e0f6ec26e86c3ada33b0621775"
       url: "https://pub.dev"
     source: hosted
-    version: "6.3.0"
+    version: "6.3.1"
   url_launcher_ios:
     dependency: transitive
     description:
@@ -1630,10 +1861,10 @@ packages:
     dependency: transitive
     description:
       name: url_launcher_web
-      sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b
+      sha256: "8d9e750d8c9338601e709cd0885f95825086bd8b642547f26bda435aade95d8a"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.3"
+    version: "2.3.1"
   url_launcher_windows:
     dependency: transitive
     description:
@@ -1642,38 +1873,46 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.1.1"
+  utility:
+    dependency: transitive
+    description:
+      name: utility
+      sha256: "200d264c3804e87da7ea36aa81bd73fb845d2cb7b2e820f3f357a0a2bd4e37f5"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.3"
   uuid:
     dependency: "direct main"
     description:
       name: uuid
-      sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313"
+      sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8"
       url: "https://pub.dev"
     source: hosted
-    version: "3.0.7"
+    version: "4.4.0"
   vector_graphics:
     dependency: transitive
     description:
       name: vector_graphics
-      sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752"
+      sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.10+1"
+    version: "1.1.11+1"
   vector_graphics_codec:
     dependency: transitive
     description:
       name: vector_graphics_codec
-      sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33
+      sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.10+1"
+    version: "1.1.11+1"
   vector_graphics_compiler:
     dependency: transitive
     description:
       name: vector_graphics_compiler
-      sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a"
+      sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
       url: "https://pub.dev"
     source: hosted
-    version: "1.1.10+1"
+    version: "1.1.11+1"
   vector_math:
     dependency: transitive
     description:
@@ -1710,26 +1949,26 @@ packages:
     dependency: transitive
     description:
       name: web
-      sha256: "4188706108906f002b3a293509234588823c8c979dc83304e229ff400c996b05"
+      sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
       url: "https://pub.dev"
     source: hosted
-    version: "0.4.2"
+    version: "0.5.1"
   web3dart:
     dependency: transitive
     description:
       name: web3dart
-      sha256: "0b96223a6b284e3146e65dc842ded139eca68a85c4ab79c5ba1a73284927d3cd"
+      sha256: "885e5e8f0cc3c87c09f160a7fce6279226ca41316806f7ece2001959c62ecced"
       url: "https://pub.dev"
     source: hosted
-    version: "2.6.1"
+    version: "2.7.3"
   web_socket_channel:
     dependency: transitive
     description:
       name: web_socket_channel
-      sha256: "3a969ddcc204a3e34e863d204b29c0752716f78b6f9cc8235083208d268a4ccd"
+      sha256: "58c6666b342a38816b2e7e50ed0f1e261959630becd4c879c4f26bfa14aa5a42"
       url: "https://pub.dev"
     source: hosted
-    version: "2.2.0"
+    version: "2.4.5"
   webdriver:
     dependency: transitive
     description:
@@ -1750,10 +1989,10 @@ packages:
     dependency: transitive
     description:
       name: webview_flutter_android
-      sha256: "3e5f4e9d818086b0d01a66fb1ff9cc72ab0cc58c71980e3d3661c5685ea0efb0"
+      sha256: f038ee2fae73b509dde1bc9d2c5a50ca92054282de17631a9a3d515883740934
       url: "https://pub.dev"
     source: hosted
-    version: "3.15.0"
+    version: "3.16.0"
   webview_flutter_platform_interface:
     dependency: transitive
     description:
@@ -1766,18 +2005,18 @@ packages:
     dependency: transitive
     description:
       name: webview_flutter_wkwebview
-      sha256: "9bf168bccdf179ce90450b5f37e36fe263f591c9338828d6bf09b6f8d0f57f86"
+      sha256: f12f8d8a99784b863e8b85e4a9a5e3cf1839d6803d2c0c3e0533a8f3c5a992a7
       url: "https://pub.dev"
     source: hosted
-    version: "3.12.0"
+    version: "3.13.0"
   win32:
     dependency: transitive
     description:
       name: win32
-      sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8"
+      sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a"
       url: "https://pub.dev"
     source: hosted
-    version: "5.2.0"
+    version: "5.4.0"
   xdg_directories:
     dependency: transitive
     description:
@@ -1802,6 +2041,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "3.1.2"
+  yaon:
+    dependency: transitive
+    description:
+      name: yaon
+      sha256: "15909774f728b07066a72b54719d3212cbf58bae80450b8303d810302e68a53c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.4+7"
 sdks:
-  dart: ">=3.3.0 <4.0.0"
+  dart: ">=3.3.3 <4.0.0"
   flutter: ">=3.19.0"
diff --git a/pubspec.yaml b/pubspec.yaml
index 77b6d325..519e61fd 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -5,7 +5,7 @@ description: Pay with G1.
 # pub.dev using `pub publish`. This is preferred for private packages.
 publish_to: "none" # Remove this line if you wish to publish to pub.dev
 
-version: 0.1.5+72
+version: 0.1.6+73
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
@@ -15,59 +15,63 @@ dependencies:
     sdk: flutter
   bubble: ^1.2.1
   carousel_slider: ^4.2.1
-  graphql_flutter: ^5.1.2
+  graphql_flutter: ^5.2.0-beta.6
   hive_flutter: ^1.1.0
-  image_picker: ^1.0.5
+  image_picker: ^1.1.0
   jdenticon_dart: ^2.0.0
-  logger: ^2.0.2+1
-  path_provider: ^2.1.1
-  pdf: ^3.10.7
-  permission_handler: ^11.1.0
+  logger: ^2.2.0
+  path_provider: ^2.1.3
+  pdf: ^3.10.8
+  permission_handler: ^11.3.1
   pin_code_fields: ^8.0.1
-  printing: ^5.11.1
-  provider: ^6.1.1
+  printing: ^5.12.0
+  provider: ^6.1.2
   barcode_scan2: ^4.3.0
   qr_flutter: ^4.1.0
-  responsive_framework: ^1.1.1
-  sentry_flutter: ^7.14.0
+  responsive_framework: ^1.4.0
+  sentry_flutter: ^7.20.0
   truncate: ^3.0.1
-  unorm_dart: ^0.3.0
-  dio: ^5.4.0
-  durt: ^0.1.7
-  package_info_plus: ^5.0.1
+  unorm_dart: ^0.2.0
+  dio: ^5.4.3+1
+  durt: ^0.1.8
+  package_info_plus: ^7.0.0
   polkawallet_sdk: #^0.5.2
     git:
       # url: https://github.com/polkawallet-io/sdk.git
       # ref: develop
       url: https://github.com/poka-IT/sdk.git
       # ref: gecko-fixes-3
-      ref: 8b254d9e98cb367b4a57d67f8c6f5bbe89a52552
+      ref: fcfdb5e9f214c99c8d3a97d3aea38a67ea1fa6a5
   dots_indicator: ^3.0.0
-  connectivity_plus: ^3.0.6
-  image_cropper: ^4.0.1
-  easy_localization: ^3.0.3
-  flutter_markdown: ^0.6.18+2
-  pointycastle: ^3.7.3
+  connectivity_plus: ^5.0.2
+  image_cropper: ^5.0.1
+  easy_localization: ^3.0.5
+  flutter_markdown: ^0.7.1
+  pointycastle: ^3.9.0
   hex: ^0.2.0
   accordion: ^2.6.0
-  flutter_svg: ^2.0.9
+  flutter_svg: ^2.0.10+1
   pinenacl: ^0.5.1
   fast_base58: ^0.2.1
   tutorial_coach_mark: ^1.2.11
   confetti: ^0.7.0
-  url_launcher: ^6.2.2
+  url_launcher: ^6.2.6
   crypto: ^3.0.3
-  screen_brightness: ^1.0.0
-  uuid: ^3.0.7
+  screen_brightness: ^1.0.1
+  uuid: ^4.4.0
   fade_and_translate: ^0.1.3
+  durt2:
+    path: ../../durt2
+    # git:
+    #   url: https://git.duniter.org/libs/durt2
 
 dev_dependencies:
   # flutter_launcher_icons: ^0.9.2
   # flutter_launcher_icons_maker: ^^0.10.2
-  icons_launcher: ^2.1.6
-  build_runner: ^2.4.7
+  icons_launcher: ^2.1.7
+  build_runner: ^2.4.9
   hive_generator: ^2.0.1
-  flutter_lints: ^3.0.1
+  flutter_lints: ^3.0.2
   flutter_test:
     sdk: flutter
   integration_test:
-- 
GitLab