diff --git a/assets/translations/en.json b/assets/translations/en.json
index fdfeae167424d6f77eae9eabe30937d46bfe34b9..306a84bc08832fef3b8dc978b1b08a8046e9acb1 100644
--- a/assets/translations/en.json
+++ b/assets/translations/en.json
@@ -71,7 +71,7 @@
"yourChestAndWalletWereRestoredSuccessfully": "Super!\n\nYour safe and your portfolios have been restored with great success.\n\nCongratulations!",
"allGood": "That's all good!",
"areYouSureToForgetSafe": "Are you sure you want to forget the safe \"{}\"?",
- "areYouSureForgetAllChests": "Are you sure you want to forget all your safes?",
+ "areYouSureForgetAllSafes": "Are you sure you want to forget all your safes?",
"areYouSureToForgetWallet": "Are you sure you want to forget the wallet \"{}\"?\nThe balance will be transferred to your default wallet.",
"areYouSureYouWantToCertify1": "Are you sure you want to certify the identity :",
"areYouSureYouWantToCertify2": "having the address :",
diff --git a/assets/translations/es.json b/assets/translations/es.json
index 571c73fb27f1c0c1a7be3ee178b1299708132a45..23e5a273f11927fbd8efa889ae71a57858218387 100644
--- a/assets/translations/es.json
+++ b/assets/translations/es.json
@@ -71,7 +71,7 @@
"yourChestAndWalletWereRestoredSuccessfully": "¡Genial!\n\nTu cofre y tus monederos han sido restaurados con éxito.\n\n¡Felicidades!",
"allGood": "¡Todo bien!",
"areYouSureToForgetSafe": "¿Seguro de que quieres olvidar el cofre \"{}\"?",
- "areYouSureForgetAllChests": "¿Seguro de que quieres olvidar todos tus cofres?",
+ "areYouSureForgetAllSafes": "¿Seguro de que quieres olvidar todos tus cofres?",
"areYouSureToForgetWallet": "¿Seguro de que quieres olvidar el monedero \"{}\"?\nEl saldo será transferido al monedero por defecto.",
"areYouSureYouWantToCertify": "¿Seguro de que quiere certificar a la dirección\n\n{}?",
"areYouSureYouWantToCertify1": "¿Seguro de que quiere certificar a la identidad :",
diff --git a/assets/translations/fr.json b/assets/translations/fr.json
index 823af693896d22c0e227270b0c50b530affacb71..66ff74435bf49eaef9a4d4e9abab45e1fb15f2d1 100644
--- a/assets/translations/fr.json
+++ b/assets/translations/fr.json
@@ -71,7 +71,7 @@
"yourChestAndWalletWereRestoredSuccessfully": "Top !\n\nVotre coffre et vos portefeuilles ont été restaurés avec succès.\n\nFélicitations !",
"allGood": "C'est tout bon !",
"areYouSureToForgetSafe": "Êtes-vous sûr de vouloir oublier le coffre \"{}\" ?",
- "areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
+ "areYouSureForgetAllSafes": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
"areYouSureToForgetWallet": "Êtes-vous sûr de vouloir oublier le portefeuille \"{}\" ?\nLe solde sera transféré vers votre portefeuille par défaut.",
"areYouSureYouWantToCertify1": "Êtes-vous certain de vouloir certifier l'identité :",
"areYouSureYouWantToCertify2": "ayant pour adresse :",
diff --git a/assets/translations/it.json b/assets/translations/it.json
index 0e2b1cabd377f0c56d42343c095b21ac1de85dc2..7376d21f08eba4208b90e910ed70e2e0a3051cd6 100644
--- a/assets/translations/it.json
+++ b/assets/translations/it.json
@@ -70,7 +70,7 @@
"yourChestAndWalletWereRestoredSuccessfully": "Fantastico!\n\nIl tuo scrigno e i tuoi portafogli sono stati recuperati con successo.\n\nCongratulazioni!",
"allGood": "Tutto bene!",
"areYouSureToForgetSafe": "Sicuro che vuoi eliminare lo scrigno \"{}\"?",
- "areYouSureForgetAllChests": "Sicuro che vuoi dimenticare tutti i tuoi scrigni?",
+ "areYouSureForgetAllSafes": "Sicuro che vuoi dimenticare tutti i tuoi scrigni?",
"areYouSureToForgetWallet": "Sicuro che vuoi dimenticare il tuo portafoglio \"{}\"?",
"areYouSureYouWantToCertify": "Sicuro che vuoi certificare l'indirizzo\n\n{}?",
"areYouSureYouWantToCertify1": "Sicuro che vuoi certificare l'identitá :",
diff --git a/integration_test/utility/tests_utility.dart b/integration_test/utility/tests_utility.dart
index 4fa850ac59a513a7fced7135cb0c061ed3bc3aa1..f4e2c8aa4a2d306cb6ac8e6b4a097f957fa39914 100644
--- a/integration_test/utility/tests_utility.dart
+++ b/integration_test/utility/tests_utility.dart
@@ -1,10 +1,9 @@
+import 'package:durt2/durt2.dart' show Durt, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:gecko/globals.dart';
-import 'package:gecko/models/wallet_data.dart';
-import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/utils.dart';
@@ -14,24 +13,38 @@ import 'package:gecko/main.dart' as app;
import 'package:uuid/uuid.dart';
const isHumanReading = false;
-Timeout testTimeout([int seconds = 120]) => Timeout(Duration(seconds: isHumanReading ? 600 : seconds));
+Timeout testTimeout([int seconds = 120]) =>
+ Timeout(Duration(seconds: isHumanReading ? 600 : seconds));
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
late WidgetTester tester;
// TEST WALLETS CONSTS
-const testMnemonic = 'pipe paddle ketchup filter life ice feel embody glide quantum ride usage';
-final test1 = TestWallet('5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa', 'test1');
-final test2 = TestWallet('5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb', 'test2');
-final test3 = TestWallet('5FhTLzXLNBPmtXtDBFECmD7fvKmTtTQDtvBTfVr97tachA1p', 'test3');
-final test4 = TestWallet('5DXJ4CusmCg8S1yF6JGVn4fxgk5oFx42WctXqHZ17mykgje5', 'test4');
-final test5 = TestWallet('5Dq3giahrBfykJogPetZJ2jjSmhw49Fa7i6qKkseUvRJ2T3R', 'test5');
-final test6 = TestWallet('5GxEp3do81j97kNaH4JyZgDXuPoKWoTuxXXWGyyNXeKeVLHb', 'test6');
-final test7 = TestWallet('5FZ1sSvREbQLCtSSCvMUx7KCAnpJkB7q5mfz2oixiZq2ChET', 'test7');
-final test8 = TestWallet('5CoKV9EEgwb2NmWamTXUAa6ycfNb2k1iNfVGvJAkg7dLq9RH', 'test8');
-final cesiumTest1 = TestWallet('5GAT6CJW8yVKwUuQc7sM5Kk9GZVTpbZYk9PfjNXtvnNgAJZ1', 'cesiumTest1');
-final cesiumTest2 = TestWallet('5DTnny1tTkUs1SXHZTx98RUAj76Z88FfFhsQjd48dXnk8gHR', 'cesiumTest2');
-final cesiumTest3 = TestWallet('5EJct9jTDNKco4YiYfETAseq1gaduBtsJUcNnFicfvh3bTV6', 'cesiumTest3');
-final cesiumTest4 = TestWallet('5HD1oSv6A7VNxPYos6F86JFZ3bhz5LnEaWC4hkwLMj84v4ww', 'cesiumTest4');
+const testMnemonic =
+ 'pipe paddle ketchup filter life ice feel embody glide quantum ride usage';
+final test1 =
+ TestWallet('5FeggKqw2AbnGZF9Y9WPM2QTgzENS3Hit94Ewgmzdg5a3LNa', 'test1');
+final test2 =
+ TestWallet('5E4i8vcNjnrDp21Sbnp32WHm2gz8YP3GGFwmdpfg5bHd8Whb', 'test2');
+final test3 =
+ TestWallet('5FhTLzXLNBPmtXtDBFECmD7fvKmTtTQDtvBTfVr97tachA1p', 'test3');
+final test4 =
+ TestWallet('5DXJ4CusmCg8S1yF6JGVn4fxgk5oFx42WctXqHZ17mykgje5', 'test4');
+final test5 =
+ TestWallet('5Dq3giahrBfykJogPetZJ2jjSmhw49Fa7i6qKkseUvRJ2T3R', 'test5');
+final test6 =
+ TestWallet('5GxEp3do81j97kNaH4JyZgDXuPoKWoTuxXXWGyyNXeKeVLHb', 'test6');
+final test7 =
+ TestWallet('5FZ1sSvREbQLCtSSCvMUx7KCAnpJkB7q5mfz2oixiZq2ChET', 'test7');
+final test8 =
+ TestWallet('5CoKV9EEgwb2NmWamTXUAa6ycfNb2k1iNfVGvJAkg7dLq9RH', 'test8');
+final cesiumTest1 = TestWallet(
+ '5GAT6CJW8yVKwUuQc7sM5Kk9GZVTpbZYk9PfjNXtvnNgAJZ1', 'cesiumTest1');
+final cesiumTest2 = TestWallet(
+ '5DTnny1tTkUs1SXHZTx98RUAj76Z88FfFhsQjd48dXnk8gHR', 'cesiumTest2');
+final cesiumTest3 = TestWallet(
+ '5EJct9jTDNKco4YiYfETAseq1gaduBtsJUcNnFicfvh3bTV6', 'cesiumTest3');
+final cesiumTest4 = TestWallet(
+ '5HD1oSv6A7VNxPYos6F86JFZ3bhz5LnEaWC4hkwLMj84v4ww', 'cesiumTest4');
// CUSTOM FUNCTIONS
@@ -39,22 +52,27 @@ Future sleep([int time = 1000]) async {
await Future.delayed(Duration(milliseconds: time));
}
-Future pump({Duration duration = const Duration(milliseconds: 300), int number = 1}) async {
+Future pump(
+ {Duration duration = const Duration(milliseconds: 300),
+ int number = 1}) async {
for (int i = 0; i < number; i++) {
log.i("pump $i");
await tester.pump(duration = duration);
}
}
-Future<String> clipPaste() async => (await Clipboard.getData('text/plain'))?.text ?? '';
+Future<String> clipPaste() async =>
+ (await Clipboard.getData('text/plain'))?.text ?? '';
-clipCopy(String text) async => await Clipboard.setData(ClipboardData(text: text));
+clipCopy(String text) async =>
+ await Clipboard.setData(ClipboardData(text: text));
Future humanRead([int time = 1, bool force = false]) async {
if (isHumanReading || force) io.sleep(Duration(seconds: time));
}
-Future tapKey(Key buttonKey, {Finder? customFinder, int duration = 100, bool selectLast = false}) async {
+Future tapKey(Key buttonKey,
+ {Finder? customFinder, int duration = 100, bool selectLast = false}) async {
if (duration != 0) {
await tester.pumpAndSettle(Duration(milliseconds: duration));
}
@@ -82,7 +100,9 @@ Future scrollUntil(Key element) async {
);
}
-Future<void> waitForButtonEnabled(Key key, {Duration timeout = const Duration(seconds: 5), bool reverse = false}) async {
+Future<void> waitForButtonEnabled(Key key,
+ {Duration timeout = const Duration(seconds: 5),
+ bool reverse = false}) async {
final end = DateTime.now().add(timeout);
log.i('INTEGRATION TEST: Wait for $key to be enabled');
@@ -134,7 +154,8 @@ Future<void> waitFor(String text,
}
if (settle) {
- await tester.pumpAndSettle(Duration(milliseconds: pumpDuration), EnginePhase.sendSemanticsUpdate, timeout);
+ await tester.pumpAndSettle(Duration(milliseconds: pumpDuration),
+ EnginePhase.sendSemanticsUpdate, timeout);
}
await Future.delayed(const Duration(milliseconds: 100));
} while (reverse ? finder.evaluate().isNotEmpty : finder.evaluate().isEmpty);
@@ -142,7 +163,8 @@ Future<void> waitFor(String text,
}
// Test if text is visible on screen, return a boolean
-Future<bool> isPresent(String text, {Duration timeout = const Duration(seconds: 1), bool settle = true}) async {
+Future<bool> isPresent(String text,
+ {Duration timeout = const Duration(seconds: 1), bool settle = true}) async {
try {
await waitFor(text, timeout: timeout, settle: settle);
humanRead();
@@ -154,7 +176,8 @@ Future<bool> isPresent(String text, {Duration timeout = const Duration(seconds:
}
// Test if widget exist on screen, return a boolean
-Future<bool> isIconPresent(IconData icon, {Duration timeout = const Duration(seconds: 1)}) async {
+Future<bool> isIconPresent(IconData icon,
+ {Duration timeout = const Duration(seconds: 1)}) async {
await tester.pumpAndSettle();
final finder = find.byIcon(icon);
humanRead();
@@ -173,7 +196,10 @@ Future spawnBlock({int number = 1, int duration = 200, int? until}) async {
}
// Pay in background
-Future bkPay({required String fromAddress, required String destAddress, required double amount}) async {
+Future bkPay(
+ {required String fromAddress,
+ required String destAddress,
+ required double amount}) async {
final transactionId = const Uuid().v4();
sub.pay(
fromAddress: fromAddress,
@@ -189,7 +215,10 @@ Future bkPay({required String fromAddress, required String destAddress, required
}
// Certify in background
-Future bkCertify({required String fromAddress, required String destAddress, bool spawnBloc = true}) async {
+Future bkCertify(
+ {required String fromAddress,
+ required String destAddress,
+ bool spawnBloc = true}) async {
sub.certify(fromAddress, destAddress, 'AAAAA');
if (spawnBloc) {
await sleep(500);
@@ -199,7 +228,8 @@ Future bkCertify({required String fromAddress, required String destAddress, bool
}
// Confirm my identity in background
-Future bkConfirmIdentity({required String fromAddress, required String name}) async {
+Future bkConfirmIdentity(
+ {required String fromAddress, required String name}) async {
sub.confirmIdentity(fromAddress, name, 'AAAAA');
await sleep(500);
await spawnBlock();
@@ -218,33 +248,51 @@ Future bkSetNode([String? endpoint]) async {
// Restore chest in background
Future bkRestoreChest([String mnemonic = testMnemonic]) async {
- final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false);
- final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(homeContext, listen: false);
+ // final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext, listen: false);
- await generateWalletProvider.storeHDWChest(homeContext);
+ // await generateWalletProvider.storeHDWChest(homeContext);
for (int number = 0; number <= 4; number++) {
- await _addImportAccount(mnemonic: mnemonic, chest: 0, number: number, name: 'test${number + 1}', derivation: (number + 1) * 2);
+ await _addImportAccount(
+ mnemonic: mnemonic,
+ safeNumber: 0,
+ number: number,
+ name: 'test${number + 1}',
+ derivation: (number + 1) * 2);
}
myWalletProvider.reload();
}
-Future<WalletData> _addImportAccount({required String mnemonic, required int chest, required int number, required String name, required int derivation}) async {
- final address = await sub.importAccount(mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
- final myWallet =
- WalletData(chest: chest, address: address, number: number, name: name, derivation: derivation, imageDefaultPath: '${number % 4}.png', isOwned: true);
- await walletBox.put(myWallet.address, myWallet);
+Future<WalletData> _addImportAccount(
+ {required String mnemonic,
+ required int safeNumber,
+ required int number,
+ required String name,
+ required int derivation}) async {
+ final address = await sub.importAccount(
+ mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
+ final myWallet = WalletData(
+ safeBoxNumber: safeNumber,
+ address: address,
+ name: name,
+ derivation: derivation,
+ imagePath: '${number % 4}.png',
+ isOwned: true);
+ await Durt.i.walletService.walletDataBox.put(myWallet.address, myWallet);
return myWallet;
}
// Delete all wallets in background
Future bkDeleteAllWallets() async {
- final myWalletProvider = Provider.of<MyWalletsProvider>(homeContext, listen: false);
- final isWalletsPresents = await isPresent('scanQRCode'.tr(), timeout: const Duration(milliseconds: 300));
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(homeContext, listen: false);
+ final isWalletsPresents = await isPresent('scanQRCode'.tr(),
+ timeout: const Duration(milliseconds: 300));
if (isWalletsPresents) {
- await walletBox.clear();
- await chestBox.clear();
+ await Durt.i.walletService.clearWallet();
await configBox.delete('defaultWallet');
await configBox.delete('isUdUnit');
await sub.deleteAllAccounts();
diff --git a/lib/globals.dart b/lib/globals.dart
index 4e4046c3afe3bcf2b020aa65d2f37c359c76450a..7b9b826a133456a7cff795fb7667c3313805e6c9 100644
--- a/lib/globals.dart
+++ b/lib/globals.dart
@@ -1,9 +1,7 @@
import 'dart:io';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/g1_wallets_list.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/wallet_header_data.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:logger/logger.dart';
@@ -17,8 +15,6 @@ const int pinLength = 4;
const int maxWalletsInSafe = 30;
const String appLang = 'english';
-late Box<WalletData> walletBox;
-late Box<ChestData> chestBox;
late Box configBox;
late Box<G1WalletsList> g1WalletsBox;
late Box<G1WalletsList> contactsBox;
diff --git a/lib/main.dart b/lib/main.dart
index e18ec9041d5e519d0b3e8ace2c0d68b32c7d0ddd..abf8a8767a9b894d3fcb3e7c4823d650b53e8da5 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -14,7 +14,7 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'dart:async';
-import 'package:durt2/durt2.dart';
+import 'package:durt2/durt2.dart' show Durt, Networks;
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/chest_provider.dart';
@@ -33,10 +33,6 @@ import 'package:flutter/material.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/search.dart';
import 'package:gecko/screens/search_result.dart';
-import 'package:gecko/services/durt.service.dart';
-import 'package:gecko/services/wallets.service.dart';
-import 'package:get_it/get_it.dart';
-
import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart';
import 'package:responsive_framework/responsive_framework.dart';
@@ -61,16 +57,18 @@ Future<void> main() async {
await initHiveForFlutter();
await homeProvider.initHive();
-
-
appVersion = await homeProvider.getAppVersion();
// Register app dependencies
- await registerDependencies();
+ // await registerDependencies();
+
+ //Init durt2
+ await Durt().init(network: Networks.gdev);
if (kReleaseMode && enableSentry) {
await SentryFlutter.init((options) {
- options.dsn = 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110';
+ options.dsn =
+ 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110';
options.experimental.replay.sessionSampleRate = 1.0;
options.experimental.replay.onErrorSampleRate = 1.0;
// Privacy settings for PII masking
@@ -78,11 +76,17 @@ Future<void> main() async {
options.experimental.privacy.maskAllText = false;
options.experimental.privacy.maskAllImages = false;
},
- appRunner: () => SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) {
+ appRunner: () => SystemChrome.setPreferredOrientations(
+ [DeviceOrientation.portraitUp]).then((_) {
runApp(
SentryWidget(
child: EasyLocalization(
- supportedLocales: const [Locale('en'), Locale('fr'), Locale('es'), Locale('it')],
+ supportedLocales: const [
+ Locale('en'),
+ Locale('fr'),
+ Locale('es'),
+ Locale('it')
+ ],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: const Gecko(),
@@ -93,10 +97,16 @@ Future<void> main() async {
} else {
log.i('Debug mode enabled: No sentry alert');
- SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]).then((_) {
+ SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
+ .then((_) {
runApp(EasyLocalization(
// test, force locale :: startLocale: Locale.fromSubtags(languageCode: 'it'),
- supportedLocales: const [Locale('en'), Locale('fr'), Locale('es'), Locale('it')],
+ supportedLocales: const [
+ Locale('en'),
+ Locale('fr'),
+ Locale('es'),
+ Locale('it')
+ ],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: const Gecko(),
@@ -176,7 +186,8 @@ class Gecko extends StatelessWidget {
primaryColor: const Color(0xffFFD58D),
scaffoldBackgroundColor: backgroundColor,
canvasColor: backgroundColor,
- colorScheme: ColorScheme.fromSwatch().copyWith(secondary: Colors.grey[850]),
+ colorScheme:
+ ColorScheme.fromSwatch().copyWith(secondary: Colors.grey[850]),
dialogTheme: DialogThemeData(backgroundColor: backgroundColor),
),
initialRoute: "/",
@@ -191,11 +202,7 @@ class Gecko extends StatelessWidget {
}
}
-Future<void> registerDependencies() async {
- GetIt.I.registerSingleton<WalletsService>(WalletsService());
- GetIt.I.registerSingleton<DurtService>(DurtService());
- GetIt.I.registerSingleton<DuniterStorageService>(DuniterStorageService());
-
- // Wait for all non-lazy repos to be ready
- await GetIt.I.allReady();
-}
+// Future<void> registerDependencies() async {
+// // Wait for all non-lazy repos to be ready
+// await GetIt.I.allReady();
+// }
diff --git a/lib/models/chest_data.dart b/lib/models/chest_data.dart
deleted file mode 100644
index ef2d3f72d08d2dcf680b92ea882a1909079c1402..0000000000000000000000000000000000000000
--- a/lib/models/chest_data.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-import 'dart:io';
-import 'package:hive_flutter/hive_flutter.dart';
-part 'chest_data.g.dart';
-
-@HiveType(typeId: 1)
-class ChestData extends HiveObject {
- @HiveField(0)
- String? name;
-
- @HiveField(1)
- int? defaultWallet;
-
- @HiveField(2)
- String? imageName;
-
- @HiveField(3)
- File? imageFile;
-
- @HiveField(4)
- int? memberWallet;
-
- ChestData({
- this.name,
- this.defaultWallet,
- this.imageName,
- this.imageFile,
- this.memberWallet,
- });
-
- @override
- String toString() {
- return name!;
- }
-}
diff --git a/lib/models/chest_data.g.dart b/lib/models/chest_data.g.dart
deleted file mode 100644
index cf1aa52cd62489f22ba3b0dd4baaecb12cb5bfec..0000000000000000000000000000000000000000
--- a/lib/models/chest_data.g.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'chest_data.dart';
-
-// **************************************************************************
-// TypeAdapterGenerator
-// **************************************************************************
-
-class ChestDataAdapter extends TypeAdapter<ChestData> {
- @override
- final int typeId = 1;
-
- @override
- ChestData read(BinaryReader reader) {
- final numOfFields = reader.readByte();
- final fields = <int, dynamic>{
- for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
- };
- return ChestData(
- name: fields[0] as String?,
- defaultWallet: fields[1] as int?,
- imageName: fields[2] as String?,
- imageFile: fields[3] as File?,
- memberWallet: fields[4] as int?,
- );
- }
-
- @override
- void write(BinaryWriter writer, ChestData obj) {
- writer
- ..writeByte(5)
- ..writeByte(0)
- ..write(obj.name)
- ..writeByte(1)
- ..write(obj.defaultWallet)
- ..writeByte(2)
- ..write(obj.imageName)
- ..writeByte(3)
- ..write(obj.imageFile)
- ..writeByte(4)
- ..write(obj.memberWallet);
- }
-
- @override
- int get hashCode => typeId.hashCode;
-
- @override
- bool operator ==(Object other) =>
- identical(this, other) ||
- other is ChestDataAdapter &&
- runtimeType == other.runtimeType &&
- typeId == other.typeId;
-}
diff --git a/lib/models/membership_renewal.dart b/lib/models/membership_renewal.dart
index f477f99f460780bd6bd3dcae44bb4af8872c57ac..6ff3e2318150a47214b08ce125b5b582f7044796 100644
--- a/lib/models/membership_renewal.dart
+++ b/lib/models/membership_renewal.dart
@@ -1,9 +1,9 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show IdtyStatus;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
@@ -15,7 +15,7 @@ import 'package:gecko/models/membership_status.dart';
class MembershipRenewal {
static RenewalInfo calculateRenewalInfo(MembershipStatus status, int renewalPeriodBlocks) {
if (status.expireDate == null) {
- return status.idtyStatus == IdtyStatus.notMember
+ return status.idtyStatus == IdtyStatus.expired
? RenewalInfo(
canRenew: true,
isExpired: true,
diff --git a/lib/models/membership_status.dart b/lib/models/membership_status.dart
index 6059351ea9b2a5eb8e44d0459a164d43fe933133..a8cab69d1877f57e8e84885eea779a01e667fb54 100644
--- a/lib/models/membership_status.dart
+++ b/lib/models/membership_status.dart
@@ -1,4 +1,4 @@
-import 'package:gecko/models/wallet_data.dart';
+import 'package:durt2/durt2.dart' show IdtyStatus;
class MembershipStatus {
final DateTime? expireDate;
diff --git a/lib/models/migrate_wallet_checks.dart b/lib/models/migrate_wallet_checks.dart
index 5e4f03b9a7a549de2a2cd17a7f54616e79a25be1..81a7b86f0a69768f677dbabfcbbe3be28caa2e3a 100644
--- a/lib/models/migrate_wallet_checks.dart
+++ b/lib/models/migrate_wallet_checks.dart
@@ -1,4 +1,4 @@
-import 'package:gecko/models/wallet_data.dart';
+import 'package:durt2/durt2.dart' show IdtyStatus;
class MigrateWalletChecks {
final Map<String, dynamic> fromBalance;
diff --git a/lib/models/wallet_data.dart b/lib/models/wallet_data.dart
deleted file mode 100644
index 9f1fc93388bc074770ab3e82865e4d5ae0146051..0000000000000000000000000000000000000000
--- a/lib/models/wallet_data.dart
+++ /dev/null
@@ -1,148 +0,0 @@
-// ignore_for_file: use_build_context_synchronously
-
-import 'dart:io';
-
-import 'package:gecko/globals.dart';
-import 'package:gecko/providers/v2s_datapod.dart';
-import 'package:hive_flutter/hive_flutter.dart';
-import 'package:provider/provider.dart';
-import 'package:uuid/uuid.dart';
-part 'wallet_data.g.dart';
-
-@HiveType(typeId: 0)
-class WalletData extends HiveObject {
- @HiveField(0)
- String address;
-
- @HiveField(1)
- int? chest;
-
- @HiveField(2)
- int? number;
-
- @HiveField(3)
- String? name;
-
- @HiveField(4)
- int? derivation;
-
- @HiveField(5)
- String? imageDefaultPath;
-
- @HiveField(6)
- String? imageCustomPath;
-
- @HiveField(7)
- bool isOwned;
-
- @HiveField(8)
- IdtyStatus identityStatus;
-
- @HiveField(9)
- double balance;
-
- @HiveField(10)
- List<int>? certs;
-
- @HiveField(11)
- DateTime? profileUpdatedTime;
-
- WalletData({
- required this.address,
- this.chest,
- this.number,
- this.name,
- this.derivation,
- this.imageDefaultPath,
- this.imageCustomPath,
- this.profileUpdatedTime,
- this.isOwned = false,
- this.identityStatus = IdtyStatus.unknown,
- this.balance = 0,
- this.certs,
- });
-
- // representation of WalletData when debugging
- @override
- String toString() {
- return name!;
- }
-
- // creates the ':'-separated string from the WalletData
- String get inLine => "$chest:$number:$name:$derivation:$imageDefaultPath:$imageCustomPath:$identityStatus";
-
- bool get hasIdentity =>
- identityStatus == IdtyStatus.unconfirmed ||
- identityStatus == IdtyStatus.unvalidated ||
- identityStatus == IdtyStatus.member ||
- identityStatus == IdtyStatus.notMember;
-
- bool get isMembre => identityStatus == IdtyStatus.member;
-
- bool get exist => balance != 0;
-
- bool get hasCustomImage => imageCustomPath != null;
-
- List<int?> get id => [chest, number];
-
- Future<DateTime?> getUpdatedTime() async {
- final datapod = Provider.of<V2sDatapodProvider>(homeContext, listen: false);
- return await datapod.profileEditedAt(address);
- }
-
- Future<bool> shouldUpdateProfile() async {
- final remoteUpdatedProfile = await getUpdatedTime();
- late Duration difference;
- if (profileUpdatedTime != null && remoteUpdatedProfile != null) {
- difference = profileUpdatedTime!.difference(remoteUpdatedProfile);
- } else if (remoteUpdatedProfile != null) {
- return true;
- } else {
- difference = Duration.zero;
- }
- return difference.inSeconds.abs() >= 30;
- }
-
- /// This method get the remote avatar on v2s-datapod only if needed, and store it on disk
- Future getDatapodAvatar() async {
- if (!await shouldUpdateProfile()) return;
-
- final datapod = Provider.of<V2sDatapodProvider>(homeContext, listen: false);
- final avatarUuid = const Uuid().v4();
-
- await datapod.getRemoteAvatar(address, uuid: avatarUuid);
-
- final avatarPath = '${avatarsDirectory.path}/$address-$avatarUuid';
- if (!await File(avatarPath).exists()) return;
-
- profileUpdatedTime = await getUpdatedTime();
- imageCustomPath = avatarPath;
-
- walletBox.put(address, this);
- datapod.reload();
- }
-}
-
-@HiveType(typeId: 5)
-enum IdtyStatus {
- @HiveField(0)
- none,
-
- @HiveField(1)
- unconfirmed,
-
- @HiveField(2)
- unvalidated,
-
- @HiveField(3)
- member,
-
- @HiveField(4)
- notMember,
-
- @HiveField(5)
- revoked,
-
- @HiveField(6)
- unknown
-}
diff --git a/lib/models/wallet_data.g.dart b/lib/models/wallet_data.g.dart
deleted file mode 100644
index 71df96177fcea7159d9621e79e11396aec21cc61..0000000000000000000000000000000000000000
--- a/lib/models/wallet_data.g.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// GENERATED CODE - DO NOT MODIFY BY HAND
-
-part of 'wallet_data.dart';
-
-// **************************************************************************
-// TypeAdapterGenerator
-// **************************************************************************
-
-class WalletDataAdapter extends TypeAdapter<WalletData> {
- @override
- final int typeId = 0;
-
- @override
- WalletData read(BinaryReader reader) {
- final numOfFields = reader.readByte();
- final fields = <int, dynamic>{
- for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
- };
- return WalletData(
- address: fields[0] as String,
- chest: fields[1] as int?,
- number: fields[2] as int?,
- name: fields[3] as String?,
- derivation: fields[4] as int?,
- imageDefaultPath: fields[5] as String?,
- imageCustomPath: fields[6] as String?,
- profileUpdatedTime: fields[11] as DateTime?,
- isOwned: fields[7] as bool,
- identityStatus: fields[8] as IdtyStatus,
- balance: fields[9] as double,
- certs: (fields[10] as List?)?.cast<int>(),
- );
- }
-
- @override
- void write(BinaryWriter writer, WalletData obj) {
- writer
- ..writeByte(12)
- ..writeByte(0)
- ..write(obj.address)
- ..writeByte(1)
- ..write(obj.chest)
- ..writeByte(2)
- ..write(obj.number)
- ..writeByte(3)
- ..write(obj.name)
- ..writeByte(4)
- ..write(obj.derivation)
- ..writeByte(5)
- ..write(obj.imageDefaultPath)
- ..writeByte(6)
- ..write(obj.imageCustomPath)
- ..writeByte(7)
- ..write(obj.isOwned)
- ..writeByte(8)
- ..write(obj.identityStatus)
- ..writeByte(9)
- ..write(obj.balance)
- ..writeByte(10)
- ..write(obj.certs)
- ..writeByte(11)
- ..write(obj.profileUpdatedTime);
- }
-
- @override
- int get hashCode => typeId.hashCode;
-
- @override
- bool operator ==(Object other) =>
- identical(this, other) ||
- other is WalletDataAdapter &&
- runtimeType == other.runtimeType &&
- typeId == other.typeId;
-}
-
-class IdtyStatusAdapter extends TypeAdapter<IdtyStatus> {
- @override
- final int typeId = 5;
-
- @override
- IdtyStatus read(BinaryReader reader) {
- switch (reader.readByte()) {
- case 0:
- return IdtyStatus.none;
- case 1:
- return IdtyStatus.unconfirmed;
- case 2:
- return IdtyStatus.unvalidated;
- case 3:
- return IdtyStatus.member;
- case 4:
- return IdtyStatus.notMember;
- case 5:
- return IdtyStatus.revoked;
- case 6:
- return IdtyStatus.unknown;
- default:
- return IdtyStatus.none;
- }
- }
-
- @override
- void write(BinaryWriter writer, IdtyStatus obj) {
- switch (obj) {
- case IdtyStatus.none:
- writer.writeByte(0);
- break;
- case IdtyStatus.unconfirmed:
- writer.writeByte(1);
- break;
- case IdtyStatus.unvalidated:
- writer.writeByte(2);
- break;
- case IdtyStatus.member:
- writer.writeByte(3);
- break;
- case IdtyStatus.notMember:
- writer.writeByte(4);
- break;
- case IdtyStatus.revoked:
- writer.writeByte(5);
- break;
- case IdtyStatus.unknown:
- writer.writeByte(6);
- break;
- }
- }
-
- @override
- int get hashCode => typeId.hashCode;
-
- @override
- bool operator ==(Object other) =>
- identical(this, other) ||
- other is IdtyStatusAdapter &&
- runtimeType == other.runtimeType &&
- typeId == other.typeId;
-}
diff --git a/lib/providers/chest_provider.dart b/lib/providers/chest_provider.dart
index 28f454378d083b41bd34869ab61fb9df4ce1d97f..49092965b32b1301bc4b6cf6cde9ce80a5328ee1 100644
--- a/lib/providers/chest_provider.dart
+++ b/lib/providers/chest_provider.dart
@@ -1,9 +1,7 @@
import 'dart:async';
+import 'package:durt2/durt2.dart' show Durt, SafeBox, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:gecko/globals.dart';
-import 'package:gecko/models/chest_data.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/widgets/commons/confirmation_dialog.dart';
@@ -14,21 +12,22 @@ class ChestProvider with ChangeNotifier {
notifyListeners();
}
- Future forgetSafe(context, ChestData chest) async {
- final bool? answer = await (_confirmDeletingChest(context, chest.name));
+ Future forgetSafe(context, SafeBox safe) async {
+ final bool? answer = await (_confirmDeletingChest(context, safe.name));
final sub = Provider.of<SubstrateSdk>(context, listen: false);
if (answer ?? false) {
- await sub.deleteAccounts(getChestWallets(chest));
- await chestBox.delete(chest.key);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ await sub.deleteAccounts(getChestWallets(safe));
+ await Durt.i.walletService.deleteSafe(safe.key);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
myWalletProvider.pinCode = '';
- if (chestBox.isEmpty) {
- await configBox.put('currentChest', 0);
+ if (Durt.i.walletService.safeBox.isEmpty) {
+ await Durt.i.walletService.setDefaultSafeBoxNumber(0);
} else {
- int? lastChest = chestBox.toMap().keys.first;
- await configBox.put('currentChest', lastChest);
+ final int lastSafe = Durt.i.walletService.safeBox.toMap().keys.first;
+ await Durt.i.walletService.setDefaultSafeBoxNumber(lastSafe);
}
Navigator.popUntil(
@@ -39,10 +38,10 @@ class ChestProvider with ChangeNotifier {
}
}
- List<String> getChestWallets(ChestData chest) {
+ List<String> getChestWallets(SafeBox safe) {
List<String> toDelete = [];
- walletBox.toMap().forEach((key, WalletData value) {
- if (value.chest == chest.key) {
+ Durt.i.walletService.walletDataBox.toMap().forEach((key, WalletData value) {
+ if (value.safeBoxNumber == safe.key) {
toDelete.add(value.address);
}
});
diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart
index 9fc8324491548f4adeb94b51afb35dbf603227d7..a632c26f9f8e8a2a50251b512c1f75ebc87dc6f3 100644
--- a/lib/providers/generate_wallets.dart
+++ b/lib/providers/generate_wallets.dart
@@ -1,29 +1,19 @@
import 'dart:math';
import 'package:durt/durt.dart' as durt;
-import 'package:durt2/durt2.dart' show DuniterStorageService, Durt, Language, WalletBalance;
+import 'package:durt2/durt2.dart' show Durt, Language, WalletBalance, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/bip39_words.dart';
-import 'package:gecko/models/chest_data.dart';
-import 'package:gecko/models/wallet_data.dart';
-import 'package:gecko/providers/substrate_sdk.dart';
-import 'package:gecko/services/wallets.service.dart' show WalletsService;
import 'package:gecko/widgets/scan_derivations_info.dart';
import 'package:gecko/widgets/commons/common_elements.dart';
-import 'package:get_it/get_it.dart';
-import 'package:polkawallet_sdk/api/apiKeyring.dart';
-import 'package:provider/provider.dart';
import "package:unorm_dart/unorm_dart.dart" as unorm;
class GenerateWalletsProvider with ChangeNotifier {
GenerateWalletsProvider();
- final walletService = GetIt.I.get<WalletsService>();
- final duniterStorage = GetIt.I.get<DuniterStorageService>();
-
final walletNameFocus = FocusNode();
Color? askedWordColor = Colors.black;
bool isAskedWordValid = false;
@@ -64,29 +54,29 @@ class GenerateWalletsProvider with ChangeNotifier {
final cellController11 = TextEditingController();
bool isFirstTimeSentenceComplete = true;
- @Deprecated('Use Durt 2 instead')
- Future storeHDWChest(BuildContext context) async {
- int chestNumber = chestBox.isEmpty ? 0 : chestBox.keys.last + 1;
-
- String chestName;
- if (chestNumber == 0) {
- chestName = 'geckoChest'.tr();
- } else {
- chestName = '${'geckoChest'.tr()}${chestNumber + 1}';
- }
- await configBox.put('currentChest', chestNumber);
-
- ChestData thisChest = ChestData(
- name: chestName,
- defaultWallet: 0,
- imageName: '${chestNumber % 8}.png',
- );
- await chestBox.add(thisChest);
- int? chestKey = chestBox.keys.last;
-
- await configBox.put('currentChest', chestKey);
- notifyListeners();
- }
+ // @Deprecated('Use Durt 2 instead')
+ // Future storeHDWChest(BuildContext context) async {
+ // int chestNumber = chestBox.isEmpty ? 0 : chestBox.keys.last + 1;
+
+ // String chestName;
+ // if (chestNumber == 0) {
+ // chestName = 'geckoChest'.tr();
+ // } else {
+ // chestName = '${'geckoChest'.tr()}${chestNumber + 1}';
+ // }
+ // await configBox.put('currentChest', chestNumber);
+
+ // ChestData thisChest = ChestData(
+ // name: chestName,
+ // defaultWallet: 0,
+ // imageName: '${chestNumber % 8}.png',
+ // );
+ // await chestBox.add(thisChest);
+ // int? chestKey = chestBox.keys.last;
+
+ // await configBox.put('currentChest', chestKey);
+ // notifyListeners();
+ // }
void checkAskedWord(String inputWord, String mnemo) {
final expectedWord = mnemo.split(' ')[nbrWord];
@@ -159,10 +149,6 @@ class GenerateWalletsProvider with ChangeNotifier {
}
Future<List<String>?> generateWordList(BuildContext context) async {
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final walletService = GetIt.I.get<WalletsService>();
- if (!sub.sdkReady) return null;
-
final language = switch (appLang) {
'english' => Language.english,
'french' => Language.french,
@@ -171,7 +157,7 @@ class GenerateWalletsProvider with ChangeNotifier {
_ => Language.english,
};
- final generatedMnemonicTyped = walletService.generateMnemonic(language);
+ final generatedMnemonicTyped = Durt.i.walletService.generateMnemonic(language: language);
generatedMnemonic = generatedMnemonicTyped.sentence;
return generatedMnemonicTyped.words;
@@ -247,7 +233,9 @@ class GenerateWalletsProvider with ChangeNotifier {
Future pasteMnemonic(BuildContext context) async {
final sentence = await Clipboard.getData('text/plain');
- if (sentence?.text == null || sentence!.text!.split(' ').length != 12) return;
+ if (sentence?.text == null || sentence!.text!.split(' ').length != 12) {
+ return;
+ }
int nbr = 0;
@@ -282,16 +270,11 @@ class GenerateWalletsProvider with ChangeNotifier {
Future<ScanDerivationsResult> scanDerivations(BuildContext context, String pinCode) async {
try {
return await _scanDerivations(context, pinCode).timeout(
- const Duration(seconds: 20),
+ const Duration(seconds: 120),
onTimeout: () async {
- // // Remove the current chest
- // final currentChestNumber = configBox.get('currentChest');
- // if (currentChestNumber != null) {
- // final currentChest = chestBox.get(currentChestNumber);
- // if (currentChest != null) {
- // await chestBox.delete(currentChestNumber);
- // }
- // }
+ // Remove the current chest
+ final actualSafeNumber = Durt.i.walletService.defaultSafeBoxNumber;
+ await Durt.i.walletService.deleteSafe(actualSafeNumber);
// Display error message to user
// ignore: use_build_context_synchronously
@@ -308,6 +291,7 @@ class GenerateWalletsProvider with ChangeNotifier {
},
);
} catch (e) {
+ log.e('Error scanning derivations: $e');
// Handle any other errors
await infoPopup(context, "errorScanDerivations".tr());
@@ -327,48 +311,51 @@ class GenerateWalletsProvider with ChangeNotifier {
Map<String, int> addressToScan = {};
notifyListeners();
- if (!Durt.instance.isConnected) {
+ if (!Durt.i.isConnected) {
return ScanDerivationsResult.error;
}
scanStatus = ScanDerivationsStatus.rootScanning;
- final hasRoot = await scanRootBalance(pinCode);
notifyListeners();
+ final hasRoot = await scanRootBalance(pinCode);
if (hasRoot) {
isAlive = true;
}
scanStatus = ScanDerivationsStatus.scanning;
+ notifyListeners();
for (int derivationNbr in [for (var i = 0; i < numberScan; i += 1) i]) {
- final addressData = await sub.sdk.api.keyring
- .addressFromMnemonic(sub.currencyParameters['ss58']!, cryptoType: CryptoType.sr25519, mnemonic: generatedMnemonic!, derivePath: '//$derivationNbr');
- addressToScan.putIfAbsent(addressData.address!, () => derivationNbr);
+ if ([28, 29, 30].contains(derivationNbr)) continue;
+ print('derivationNbr: $derivationNbr');
+ final keypair = await Durt.i.walletService.getKeyPairFromMnemonic(generatedMnemonic!, derivation: derivationNbr);
+ addressToScan.putIfAbsent(keypair.address, () => derivationNbr);
}
- final balanceList = await sub.getBalanceMulti(addressToScan.keys.toList()).timeout(
+ final balanceList = await Durt.i.storage.getBalances(addressToScan.keys.toList()).timeout(
const Duration(seconds: 20),
onTimeout: () => {},
);
// Remove unused wallets
- balanceList.removeWhere((key, value) => value.transferableBalance == 0);
+ balanceList.removeWhere((key, value) => value.free == BigInt.zero);
scanedValidWalletNumber = balanceList.length + scanedWalletNumber;
scanStatus = ScanDerivationsStatus.import;
+ notifyListeners();
for (String scannedWallet in balanceList.keys) {
isAlive = true;
String walletName = scanedWalletNumber == 0 ? 'currentWallet'.tr() : '${'wallet'.tr()} ${scanedWalletNumber + 1}';
- await sub.importAccount(mnemonic: generatedMnemonic!, derivePath: "//${addressToScan[scannedWallet]}", password: pinCode);
+ await Durt.i.walletService.importDerivations(pinCode: pinCode, derivations: [addressToScan[scannedWallet]!]);
+ final actualSafeNumber = Durt.i.walletService.defaultSafeBoxNumber;
- WalletData myWallet = WalletData(
- chest: currentChestNumber,
+ final myWallet = WalletData(
+ safeBoxNumber: actualSafeNumber,
address: scannedWallet,
- number: scanedWalletNumber,
name: walletName,
derivation: addressToScan[scannedWallet],
- imageDefaultPath: '${scanedWalletNumber % 4}.png',
+ imagePath: '${scanedWalletNumber % 4}.png',
isOwned: true);
- await walletBox.put(myWallet.address, myWallet);
+ await Durt.i.walletService.walletDataBox.put(myWallet.address, myWallet);
scanedWalletNumber++;
notifyListeners();
}
@@ -381,31 +368,26 @@ class GenerateWalletsProvider with ChangeNotifier {
Future<bool> scanRootBalance(String pinCode) async {
if (generatedMnemonic == null) return false;
- // final addressData =
- // await sub.sdk.api.keyring.addressFromMnemonic(sub.currencyParameters['ss58']!, cryptoType: CryptoType.sr25519, mnemonic: generatedMnemonic!);
- final keypair = await walletService.getKeyPairFromMnemonic(generatedMnemonic!);
- if (keypair == null) return false;
+ final keypair = await Durt.i.walletService.getKeyPairFromMnemonic(generatedMnemonic!);
+
+ final address = Durt.i.walletService.getAddress(keypair.address);
// if (addressData.address == null) return false;
- final balance = await duniterStorage.getBalance(keypair.address).timeout(
+ final balance = await Durt.i.storage.getBalance(address).timeout(
const Duration(seconds: 1),
onTimeout: () => WalletBalance.empty(),
);
if (balance.free != BigInt.zero) {
- // String walletName = 'myRootWallet'.tr();
- //TODO: Use int pincode directly instead of cast
- final pinCodeint = int.parse(pinCode);
- await walletService.createSafe(mnemonic: generatedMnemonic!, pinCode: pinCodeint);
+ String walletName = 'myRootWallet'.tr();
- await walletService.importRootWallet(pinCode: pinCode);
+ await Durt.i.walletService.importRootWallet(pinCode: pinCode);
- // await sub.importAccount(mnemonic: generatedMnemonic!, password: pinCode);
+ final actualSafeNumber = Durt.i.walletService.defaultSafeBoxNumber;
- // WalletData myWallet = WalletData(
- // chest: currentChestNumber, address: addressData.address!, number: 0, name: walletName, derivation: -1, imageDefaultPath: '0.png', isOwned: true);
- // await walletBox.put(myWallet.address, myWallet);
+ WalletData myWallet = WalletData(safeBoxNumber: actualSafeNumber, address: address, name: walletName, derivation: -1, imagePath: '0.png', isOwned: true);
+ await Durt.i.walletService.walletDataBox.put(myWallet.address, myWallet);
scanedWalletNumber++;
return true;
} else {
diff --git a/lib/providers/home.dart b/lib/providers/home.dart
index 5810785fb83e8f615ff96f8585d9d886644bcaf5..1b2048aa4025163ccdf79bd2aac72b946ccad4ca 100644
--- a/lib/providers/home.dart
+++ b/lib/providers/home.dart
@@ -1,23 +1,25 @@
import 'dart:convert';
import 'dart:io';
import 'dart:math';
+import 'package:durt2/durt2.dart' show Durt, Networks;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';
import 'package:gecko/globals.dart';
import 'package:gecko/models/certification_data.dart';
+import 'package:gecko/providers/my_wallets.dart' show MyWalletsProvider;
import 'package:gecko/providers/substrate_sdk.dart';
+import 'package:gecko/providers/v2s_datapod.dart' show V2sDatapodProvider;
import 'package:gecko/providers/wallet_options.dart';
+import 'package:gecko/widgets/commons/common_elements.dart' show infoPopup;
import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb, setEquals;
import 'package:path_provider/path_provider.dart' as pp;
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
-import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/g1_wallets_list.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/wallet_header_data.dart';
import 'package:gecko/services/network_config_service.dart';
@@ -65,15 +67,11 @@ class HomeProvider with ChangeNotifier {
// Register Hive adapters
Hive.registerAdapter(WalletHeaderDataAdapter());
Hive.registerAdapter(BigIntAdapter());
- Hive.registerAdapter(WalletDataAdapter());
- Hive.registerAdapter(ChestDataAdapter());
Hive.registerAdapter(G1WalletsListAdapter());
Hive.registerAdapter(IdAdapter());
- Hive.registerAdapter(IdtyStatusAdapter());
Hive.registerAdapter(CertificationDataAdapter());
// Open required boxes synchronously
- chestBox = await Hive.openBox<ChestData>("chestBox");
configBox = await Hive.openBox("configBox");
// Check if walletHeaderDataVersion non compatible, drop wallet_header_cache
@@ -145,7 +143,7 @@ class HomeProvider with ChangeNotifier {
if (!setEquals(currentSet, remoteSet)) {
remoteEndpoints.shuffle();
- await configBox.put('endpoint', remoteEndpoints);
+ // await configBox.put('endpoint', remoteEndpoints);
log.i('Endpoints mis à jour en background');
}
} catch (e) {
@@ -160,7 +158,7 @@ class HomeProvider with ChangeNotifier {
}
// 1. Vérification rapide de la configBox
- final existingEndpoints = configBox.get('endpoint');
+ final existingEndpoints = Networks.listDuniterEndpoints;
if (_isValidEndpointsList(existingEndpoints)) {
// Lancer la mise à jour en background
unawaited(_updateEndpointsInBackground(List<String>.from(existingEndpoints)));
@@ -171,7 +169,7 @@ class HomeProvider with ChangeNotifier {
// 2. Tentative de fetch distant
final endpoints = await _fetchRemoteEndpoints();
endpoints.shuffle();
- await configBox.put('endpoint', endpoints);
+ // await configBox.put('endpoint', endpoints);
return endpoints;
} catch (e) {
// 3. Fallback sur le fichier local
@@ -179,11 +177,11 @@ class HomeProvider with ChangeNotifier {
final localEndpoints = await rootBundle.loadString('config/gdev_endpoints.json').then((jsonStr) => List<String>.from(jsonDecode(jsonStr)));
localEndpoints.shuffle();
- await configBox.put('endpoint', localEndpoints);
+ // await configBox.put('endpoint', localEndpoints);
return localEndpoints;
} catch (e) {
log.e('Erreur critique endpoints: $e');
- return configBox.get('endpoint') ?? [];
+ return Networks.listDuniterEndpoints;
}
}
}
@@ -202,4 +200,75 @@ class HomeProvider with ChangeNotifier {
void reload() {
notifyListeners();
}
+
+ Future<void> initHome(BuildContext context) async {
+ final homeProvider = Provider.of<HomeProvider>(context, listen: false);
+ final sub = Provider.of<SubstrateSdk>(context, listen: false);
+ final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final datapod = Provider.of<V2sDatapodProvider>(context, listen: false);
+
+ // Check if versionData non compatible, drop everything
+ if (configBox.get('dataVersion') == null) {
+ configBox.put('dataVersion', dataVersion);
+ }
+ if (myWalletProvider.isWalletsExists && (configBox.get('dataVersion')) < dataVersion) {
+ // if (!sub.sdkReady && !sub.sdkLoading) sub.initApi();
+ // ignore: use_build_context_synchronously
+ await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr());
+ await Hive.deleteBoxFromDisk('walletBox');
+ await Hive.deleteBoxFromDisk('chestBox');
+ await datapod.deleteAvatarsDirectory();
+ await avatarsDirectory.create();
+ await configBox.delete('defaultWallet');
+ // if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
+ await sub.deleteAllAccounts();
+ configBox.put('dataVersion', dataVersion);
+ myWalletProvider.reload();
+ } else {
+ // if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
+ }
+
+ if (!Durt.i.isConnected) {
+ await Hive.deleteBoxFromDisk('g1WalletsBox');
+ await datapod.deleteAvatarsCacheDirectory();
+ await avatarsCacheDirectory.create();
+ g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
+ contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
+
+ homeProvider.isWalletBoxInit = true;
+ myWalletProvider.reload();
+
+ // await homeProvider.getValidEndpoints();
+ if (configBox.get('isCacheChecked') == null) {
+ configBox.put('isCacheChecked', false);
+ }
+
+ // Connect to Duniter network
+ await Durt.i.connect();
+
+ // Future<void> updateConnectionStatus(List<ConnectivityResult> result) async {
+ // log.i('Network changed: $result');
+ // if (result.contains(ConnectivityResult.none)) {
+ // Durt.i.isConnected = false;
+ // await sub.sdk.api.setting.unsubscribeBestNumber();
+ // homeProvider.changeMessage("notConnectedToInternet".tr());
+ // sub.reload();
+ // } else {
+ // // Check if the phone is actually connected to the internet
+ // var connectivityResult = await (Connectivity().checkConnectivity());
+ // if (!connectivityResult.contains(ConnectivityResult.none)) {
+ // await sub.connectNode();
+
+ // // Load wallets list
+ // // myWalletProvider.readAllWallets(myWalletProvider.getCurrentSafe);
+
+ // //Connect to Indexer
+ // await duniterIndexer.getValidIndexerEndpoint();
+ // }
+ // }
+ // }
+
+ // Connectivity().onConnectivityChanged.listen(updateConnectionStatus);
+ }
+ }
}
diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart
index 0ea7d5d43b6ee3a2e7cfb5b82b0ff766a71aec1d..359f178b04183284bbd6a8258ce8c3c75a995ba2 100644
--- a/lib/providers/my_wallets.dart
+++ b/lib/providers/my_wallets.dart
@@ -1,11 +1,11 @@
import 'dart:io';
+import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/extensions.dart';
import 'dart:async';
import 'package:gecko/globals.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/commons/confirmation_dialog.dart';
@@ -25,28 +25,22 @@ class MyWalletsProvider with ChangeNotifier {
bool isOwner(String address) => listWallets.any((wallet) => wallet.address == address);
- int getCurrentChest() {
- if (configBox.get('currentChest') == null) {
- configBox.put('currentChest', 0);
- }
-
- return configBox.get('currentChest');
- }
+ int get getCurrentSafe => Durt.i.walletService.defaultSafeBoxNumber;
- bool isWalletsExists() => chestBox.isNotEmpty;
+ bool get isWalletsExists => Durt.i.walletService.safeBox.isNotEmpty;
WalletData? get idtyWallet => listWallets.firstWhereOrNull((w) => w.isMembre) ?? listWallets.firstWhereOrNull((w) => w.hasIdentity);
List<WalletData> get listWalletsWithoutIdty => listWallets.where((w) => w.address != idtyWallet?.address).toList();
- Future<List<WalletData>> readAllWallets([int? chest]) async {
- final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
- chest = chest ?? getCurrentChest();
+ Future<List<WalletData>> readAllWallets([int? safe]) async {
+ // final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
+ safe = safe ?? getCurrentSafe;
listWallets.clear();
- final wallets = walletBox.toMap().values.toList();
+ final wallets = Durt.i.walletService.walletDataBox.toMap().values.toList();
Map<String, WalletData> walletsToScan = {};
for (var walletFromBox in wallets) {
- if (walletFromBox.chest != chest) {
+ if (walletFromBox.safeBoxNumber != safe) {
continue;
}
if (walletFromBox.identityStatus == IdtyStatus.unknown) {
@@ -56,29 +50,29 @@ class MyWalletsProvider with ChangeNotifier {
}
}
- // update all idty status in lists
- int n = 0;
- final idtyStatusList = await sub.idtyStatusMulti(walletsToScan.keys.toList());
+ // final idtyStatusList =
+ // await sub.idtyStatusMulti(walletsToScan.keys.toList());
for (final wallet in walletsToScan.values) {
- wallet.identityStatus = idtyStatusList[n];
- walletBox.put(wallet.address, wallet);
+ // wallet.identityStatus = idtyStatusList[n];
+ if (Durt.i.walletService.walletDataBox.containsKey(wallet.address)) continue;
+
+ Durt.i.walletService.walletDataBox.put(wallet.address, wallet);
listWallets.add(wallet);
- n++;
}
- listWallets.sort((p1, p2) => Comparable.compare(p1.number!, p2.number!));
+ listWallets.sort((p1, p2) => Comparable.compare(p1.number, p2.number));
return listWallets;
}
WalletData? getWalletDataById(List<int?> id) {
if (id.isEmpty) return WalletData(address: '', isOwned: true);
- int? chest = id[0];
+ int? safe = id[0];
int? nbr = id[1];
WalletData? targetedWallet;
- walletBox.toMap().forEach((key, value) {
- if (value.chest == chest && value.number == nbr) {
+ Durt.i.walletService.walletDataBox.toMap().forEach((key, value) {
+ if (value.safeBoxNumber == safe && value.number == nbr) {
targetedWallet = value;
return;
}
@@ -102,34 +96,37 @@ class MyWalletsProvider with ChangeNotifier {
return pinCode.isNotEmpty;
}
- WalletData? getWalletDataByAddress(String address) => walletBox.toMap().values.firstWhereOrNull((wallet) => wallet.address == address);
+ WalletData? getWalletDataByAddress(String address) =>
+ Durt.i.walletService.walletDataBox.toMap().values.firstWhereOrNull((wallet) => wallet.address == address);
- WalletData getDefaultWallet([int? chest]) {
- if (chestBox.isEmpty) {
- return WalletData(address: '', chest: 0, number: 0, isOwned: true);
+ WalletData getDefaultWallet([int? safe]) {
+ if (Durt.i.walletService.safeBox.isEmpty) {
+ return WalletData(address: '', safeBoxNumber: 0, number: 0, isOwned: true);
} else {
- chest ??= getCurrentChest();
- int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
- return getWalletDataById([chest, defaultWalletNumber]) ?? WalletData(address: '', chest: chest, number: 0, isOwned: true);
+ safe ??= getCurrentSafe;
+ final defaultWallet = Durt.i.walletService.safeBox.get(safe)!.defaultAddress;
+ if (defaultWallet == null) {
+ return WalletData(address: '', safeBoxNumber: safe, number: 0, isOwned: true);
+ }
+ return getWalletDataByAddress(defaultWallet) ?? WalletData(address: '', safeBoxNumber: safe, number: 0, isOwned: true);
}
}
Future<int> deleteAllWallet(context) async {
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
try {
log.w('DELETE ALL WALLETS ?');
final answer = await showConfirmationDialog(
context: context,
- message: 'areYouSureForgetAllChests'.tr(),
+ message: 'areYouSureForgetAllSafes'.tr(),
type: ConfirmationDialogType.warning,
);
if (answer) {
- await walletBox.clear();
- await chestBox.clear();
+ await Durt.i.walletService.walletDataBox.clear();
+ await Durt.i.walletService.safeBox.clear();
await configBox.delete('defaultWallet');
- await sub.deleteAllAccounts();
+ // await sub.deleteAllAccounts();
final directory = await getApplicationDocumentsDirectory();
final avatarFolder = Directory('${directory.path}/avatars/');
@@ -156,7 +153,7 @@ class MyWalletsProvider with ChangeNotifier {
int newWalletNbr = idList[0];
int newDerivationNbr = number ?? idList[1];
- int? chest = getCurrentChest();
+ int? safeNumber = getCurrentSafe;
final sub = Provider.of<SubstrateSdk>(context, listen: false);
@@ -165,15 +162,15 @@ class MyWalletsProvider with ChangeNotifier {
final address = await sub.derive(context, defaultWallet.address, newDerivationNbr, pinCode);
WalletData newWallet = WalletData(
- chest: chest,
+ safeBoxNumber: safeNumber,
address: address,
number: newWalletNbr,
name: name,
derivation: newDerivationNbr,
- imageDefaultPath: '${newWalletNbr % 4}.png',
+ imagePath: '${newWalletNbr % 4}.png',
isOwned: true);
- await walletBox.put(newWallet.address, newWallet);
+ await Durt.i.walletService.walletDataBox.put(newWallet.address, newWallet);
await readAllWallets();
isNewDerivationLoading = false;
@@ -186,17 +183,17 @@ class MyWalletsProvider with ChangeNotifier {
isNewDerivationLoading = true;
notifyListeners();
int newWalletNbr;
- int? chest = getCurrentChest();
+ int? safeNumber = getCurrentSafe;
- List<WalletData> walletConfig = await readAllWallets(chest);
+ List<WalletData> walletConfig = await readAllWallets(safeNumber);
walletConfig.sort((p1, p2) {
- return Comparable.compare(p1.number!, p2.number!);
+ return Comparable.compare(p1.number, p2.number);
});
if (walletConfig.isEmpty) {
newWalletNbr = 0;
} else {
- newWalletNbr = walletConfig.last.number! + 1;
+ newWalletNbr = walletConfig.last.number + 1;
}
final sub = Provider.of<SubstrateSdk>(context, listen: false);
@@ -205,19 +202,19 @@ class MyWalletsProvider with ChangeNotifier {
final address = await sub.generateRootKeypair(defaultWallet.address, pinCode);
WalletData newWallet = WalletData(
- chest: chest, address: address, number: newWalletNbr, name: name, derivation: -1, imageDefaultPath: '${newWalletNbr % 4}.png', isOwned: true);
+ safeBoxNumber: safeNumber, address: address, number: newWalletNbr, name: name, derivation: -1, imagePath: '${newWalletNbr % 4}.png', isOwned: true);
- await walletBox.put(newWallet.address, newWallet);
+ await Durt.i.walletService.walletDataBox.put(newWallet.address, newWallet);
await readAllWallets();
isNewDerivationLoading = false;
notifyListeners();
}
- Future<List<int>> getNextWalletNumberAndDerivation({int? chestNumber}) async {
- chestNumber ??= getCurrentChest();
+ Future<List<int>> getNextWalletNumberAndDerivation({int? safeNumber}) async {
+ safeNumber ??= getCurrentSafe;
- listWallets.sort((p1, p2) => p1.number!.compareTo(p2.number!));
+ listWallets.sort((p1, p2) => p1.number.compareTo(p2.number));
if (listWallets.isEmpty) {
return [0, 0];
@@ -227,7 +224,7 @@ class MyWalletsProvider with ChangeNotifier {
final newDerivationNbr = maxDerivation == -1 ? 0 : maxDerivation + 1;
- final newWalletNbr = listWallets.last.number! + 1;
+ final newWalletNbr = listWallets.last.number + 1;
return [newWalletNbr, newDerivationNbr];
}
diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart
index 701cb10a51433ac8ec9a21cab6a2389525f74837..058c16464a626dd58e8eb31fdbc55d7725c4af68 100644
--- a/lib/providers/substrate_sdk.dart
+++ b/lib/providers/substrate_sdk.dart
@@ -1,18 +1,17 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:convert';
+import 'package:durt2/durt2.dart' show Durt, IdtyStatus, Networks;
import 'package:easy_localization/easy_localization.dart';
import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/certification_data.dart';
-import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/membership_status.dart';
import 'package:gecko/models/migrate_wallet_checks.dart';
import 'package:gecko/models/transaction_content.dart';
import 'package:gecko/models/wallet_balance.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/wallet_options.dart';
@@ -40,7 +39,7 @@ class SubstrateSdk with ChangeNotifier {
String generatedMnemonic = '';
bool sdkReady = false;
bool sdkLoading = false;
- bool nodeConnected = false;
+ // bool Durt.i.isConnected = false;
bool importIsLoading = false;
int blocNumber = 0;
bool isLoadingEndpoint = false;
@@ -142,6 +141,7 @@ class SubstrateSdk with ChangeNotifier {
// transactionStatus.remove(currentTransactionId);
}
+ @Deprecated('Use Durt 2 instead')
Future _getStorage(String call) async {
try {
// log.d(call);
@@ -316,7 +316,7 @@ class SubstrateSdk with ChangeNotifier {
}
Future<WalletBalance> getBalance(String address) async {
- if (!nodeConnected) {
+ if (!Durt.i.isConnected) {
return WalletBalance.empty();
}
@@ -393,7 +393,7 @@ class SubstrateSdk with ChangeNotifier {
}) {
int totalAmount = 0;
- if (firstEligibleUd == 0 || idtyStatus != IdtyStatus.member) return 0;
+ if (firstEligibleUd == 0 || idtyStatus != IdtyStatus.validated) return 0;
for (final List reval in pastReevals.reversed) {
final int udIndex = _convertToInt(reval[0]);
@@ -442,7 +442,7 @@ class SubstrateSdk with ChangeNotifier {
} else if (nextIssuableOn > blocNumber) {
final certDelayDuration = (nextIssuableOn - blocNumber) * 6;
return CertState(status: CertStatus.mustWaitBeforeCert, duration: Duration(seconds: certDelayDuration));
- } else if (toStatus == IdtyStatus.unconfirmed) {
+ } else if (toStatus == IdtyStatus.created) {
return CertState(status: CertStatus.mustConfirmIdentity);
} else {
return CertState(status: CertStatus.canCert);
@@ -482,10 +482,10 @@ class SubstrateSdk with ChangeNotifier {
final mapStatus = {
null: IdtyStatus.none,
- 'Unconfirmed': IdtyStatus.unconfirmed,
- 'Unvalidated': IdtyStatus.unvalidated,
- 'Member': IdtyStatus.member,
- 'NotMember': IdtyStatus.notMember,
+ 'Unconfirmed': IdtyStatus.created,
+ 'Unvalidated': IdtyStatus.confirmed,
+ 'Member': IdtyStatus.validated,
+ 'NotMember': IdtyStatus.expired,
'Revoked': IdtyStatus.revoked,
'unknown': IdtyStatus.unknown,
};
@@ -742,16 +742,16 @@ class SubstrateSdk with ChangeNotifier {
isLoadingEndpoint = false;
notifyListeners();
if (resNode != null) {
- nodeConnected = true;
+ // Durt.i.isConnected = true;
// Subscribe bloc number
sdk.api.setting.subscribeBestNumber((res) {
blocNumber = _convertToInt(res.toString());
if (sdk.api.connectedNode?.endpoint == null) {
- nodeConnected = false;
+ // Durt.i.isConnected = false;
homeProvider.changeMessage("networkLost".tr());
} else {
- nodeConnected = true;
+ // Durt.i.isConnected = true;
}
notifyListeners();
});
@@ -764,10 +764,10 @@ class SubstrateSdk with ChangeNotifier {
notifyListeners();
homeProvider.changeMessage("wellConnectedToNode".tr(args: [getConnectedEndpoint()!.split('/')[2]]));
} else {
- nodeConnected = false;
+ // Durt.i.isConnected = false;
notifyListeners();
homeProvider.changeMessage("noDuniterEndointAvailable".tr());
- if (!myWalletProvider.isWalletsExists()) snackNode(false);
+ if (!myWalletProvider.isWalletsExists) snackNode(false);
}
log.i('Connected to node: ${sdk.api.connectedNode?.endpoint}');
@@ -776,7 +776,7 @@ class SubstrateSdk with ChangeNotifier {
List<NetworkParams> getDuniterBootstrap() {
List<NetworkParams> node = [];
- for (String endpoint in configBox.get('endpoint')) {
+ for (String endpoint in Networks.listDuniterEndpoints) {
final n = NetworkParams();
n.name = currencyName;
n.endpoint = endpoint;
@@ -900,20 +900,20 @@ class SubstrateSdk with ChangeNotifier {
}
@Deprecated('Use Durt 2 instead')
- Future<String> setCurrentWallet(WalletData wallet) async {
- final currentChestNumber = configBox.get('currentChest');
- ChestData newChestData = chestBox.get(currentChestNumber)!;
- newChestData.defaultWallet = wallet.number;
- await chestBox.put(currentChestNumber, newChestData);
-
- try {
- final acc = getKeypair(wallet.address);
- keyring.setCurrent(acc);
- return acc.address!;
- } catch (e) {
- return (e.toString());
- }
- }
+ // Future<String> setCurrentWallet(WalletData wallet) async {
+ // final currentChestNumber = configBox.get('currentChest');
+ // ChestData newChestData = chestBox.get(currentChestNumber)!;
+ // newChestData.defaultWallet = wallet.number;
+ // await chestBox.put(currentChestNumber, newChestData);
+
+ // try {
+ // final acc = getKeypair(wallet.address);
+ // keyring.setCurrent(acc);
+ // return acc.address!;
+ // } catch (e) {
+ // return (e.toString());
+ // }
+ // }
@Deprecated('Use Durt 2 instead')
KeyPairData getCurrentKeyPair() {
@@ -951,15 +951,6 @@ class SubstrateSdk with ChangeNotifier {
return await importAccount(password: password);
}
- @Deprecated('Use Durt 2 instead')
- Future<bool> isMnemonicValid(String mnemonic) async {
- // Needed for bad encoding of UTF-8
- mnemonic = mnemonic.replaceAll('é', 'é');
- mnemonic = mnemonic.replaceAll('è', 'è');
-
- return await sdk.api.keyring.checkMnemonicValid(mnemonic);
- }
-
@Deprecated('Use Durt 2 instead')
Future<String> csToV2Address(String salt, String password) async {
final scrypt = pc.KeyDerivator('scrypt');
@@ -1112,7 +1103,7 @@ class SubstrateSdk with ChangeNotifier {
final toIndex = await _getIdentityIndexOf(destAddress);
- if (myIdtyStatus != IdtyStatus.member) {
+ if (myIdtyStatus != IdtyStatus.validated) {
return 'notMember';
}
@@ -1134,8 +1125,8 @@ class SubstrateSdk with ChangeNotifier {
sender,
);
txOptions = [destAddress];
- } else if (toIdtyStatus == IdtyStatus.member || toIdtyStatus == IdtyStatus.unvalidated) {
- if (toCerts.receivedCount >= currencyParameters['minCertForMembership']! - 1 && toIdtyStatus != IdtyStatus.member) {
+ } else if (toIdtyStatus == IdtyStatus.validated || toIdtyStatus == IdtyStatus.confirmed) {
+ if (toCerts.receivedCount >= currencyParameters['minCertForMembership']! - 1 && toIdtyStatus != IdtyStatus.validated) {
log.d('Batch cert and membership validation');
txInfo = TxInfoData(
'utility',
@@ -1411,7 +1402,7 @@ newKeySig: $newKeySigType""");
final Map<String, dynamic> expireOnMap = await _getStorage('membership.membership($idtyIndex)') ?? {};
- if (expireOnMap.isEmpty && idtyStatus == IdtyStatus.notMember) {
+ if (expireOnMap.isEmpty && idtyStatus == IdtyStatus.confirmed) {
return MembershipStatus(
expireDate: null,
hasPendingRenewal: hasPendingRenewal,
diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart
index 5fa7fbe7d5f3ee196e8b439850943ce0ff6bc929..2fe4516a6f3f336dc0c41423b3a43e6bb1737e01 100644
--- a/lib/providers/wallet_options.dart
+++ b/lib/providers/wallet_options.dart
@@ -1,6 +1,7 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:io';
+import 'package:durt2/durt2.dart' show Durt, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -9,7 +10,6 @@ import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/my_wallets.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/v2s_datapod.dart';
import 'package:gecko/utils.dart';
@@ -36,12 +36,14 @@ class WalletOptionsProvider with ChangeNotifier {
return pinLength;
}
- void _renameWallet(List<int?> walletID, String newName, {required bool isCesium}) async {
+ void _renameWallet(String address, String newName,
+ {required bool isCesium}) async {
MyWalletsProvider myWalletClass = MyWalletsProvider();
- WalletData walletTarget = myWalletClass.getWalletDataById(walletID)!;
+ WalletData walletTarget = myWalletClass.getWalletDataByAddress(address)!;
walletTarget.name = newName;
- await walletBox.put(walletTarget.key, walletTarget);
+ await Durt.i.walletService.walletDataBox
+ .put(walletTarget.address, walletTarget);
_newWalletName.text = '';
}
@@ -58,7 +60,8 @@ class WalletOptionsProvider with ChangeNotifier {
if (answer) {
//Check if balance is null
if (balanceCache[wallet.address] != 0) {
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet();
final transactionId = const Uuid().v4();
sub.pay(
@@ -71,9 +74,9 @@ class WalletOptionsProvider with ChangeNotifier {
);
}
- await walletBox.delete(wallet.address);
- if (wallet.imageCustomPath != null) {
- final avatarFile = File(wallet.imageCustomPath!);
+ await Durt.i.walletService.walletDataBox.delete(wallet.address);
+ if (wallet.imagePath != null) {
+ final avatarFile = File(wallet.imagePath!);
if (await avatarFile.exists()) {
await avatarFile.delete();
}
@@ -132,17 +135,17 @@ class WalletOptionsProvider with ChangeNotifier {
await File(croppedFile.path).rename(newPath);
- final walletData = MyWalletsProvider().getWalletDataByAddress(address.text);
+ final walletData =
+ MyWalletsProvider().getWalletDataByAddress(address.text);
- if (walletData!.imageCustomPath != null) {
- final avatarFile = File(walletData.imageCustomPath!);
+ if (walletData!.imagePath != null) {
+ final avatarFile = File(walletData.imagePath!);
await avatarFile.delete();
}
- walletData.profileUpdatedTime = DateTime.now();
- walletData.imageCustomPath = newPath;
+ walletData.imagePath = newPath;
- await walletBox.put(address.text, walletData);
+ await Durt.i.walletService.walletDataBox.put(address.text, walletData);
notifyListeners();
datapod.setAvatar(address.text, newPath);
@@ -156,8 +159,10 @@ class WalletOptionsProvider with ChangeNotifier {
Future<String?> confirmIdentityPopup(BuildContext context) async {
final idtyName = TextEditingController();
final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final walletOptions =
+ Provider.of<WalletOptionsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
bool canValidate = false;
@@ -181,7 +186,10 @@ class WalletOptionsProvider with ChangeNotifier {
key: keyEnterIdentityUsername,
onChanged: (_) async {
idtyExist = await duniterIndexer.isIdtyExist(idtyName.text);
- canValidate = !idtyExist && !await duniterIndexer.isIdtyExist(idtyName.text) && idtyName.text.length >= 2 && idtyName.text.length <= 32;
+ canValidate = !idtyExist &&
+ !await duniterIndexer.isIdtyExist(idtyName.text) &&
+ idtyName.text.length >= 2 &&
+ idtyName.text.length <= 32;
notifyListeners();
},
@@ -197,7 +205,8 @@ class WalletOptionsProvider with ChangeNotifier {
),
const SizedBox(height: 10),
Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) {
- return Text(idtyExist ? "thisIdentityAlreadyExist".tr() : '', style: TextStyle(color: Colors.red[500]));
+ return Text(idtyExist ? "thisIdentityAlreadyExist".tr() : '',
+ style: TextStyle(color: Colors.red[500]));
})
]),
),
@@ -205,22 +214,30 @@ class WalletOptionsProvider with ChangeNotifier {
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
- Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) {
+ Consumer<WalletOptionsProvider>(
+ builder: (context, wOptions, _) {
return TextButton(
key: keyConfirm,
onPressed: canValidate
? () async {
- idtyName.text = idtyName.text.trim().replaceAll(' ', '');
+ idtyName.text =
+ idtyName.text.trim().replaceAll(' ', '');
- if (idtyName.text.length.clamp(3, 32) != idtyName.text.length) {
+ if (idtyName.text.length.clamp(3, 32) !=
+ idtyName.text.length) {
return;
}
if (!await myWalletProvider.askPinCode()) return;
- final wallet = myWalletProvider.getWalletDataByAddress(address.text);
- await sub.setCurrentWallet(wallet!);
- final transactionId = await sub.confirmIdentity(walletOptions.address.text, idtyName.text, myWalletProvider.pinCode);
+ final wallet = myWalletProvider
+ .getWalletDataByAddress(address.text);
+ await Durt.i.walletService
+ .setDefaultAddress(wallet!.address);
+ final transactionId = await sub.confirmIdentity(
+ walletOptions.address.text,
+ idtyName.text,
+ myWalletProvider.pinCode);
Navigator.pop(context);
Navigator.push(
@@ -238,7 +255,11 @@ class WalletOptionsProvider with ChangeNotifier {
: null,
child: Text(
"validate".tr(),
- style: TextStyle(fontSize: 20, color: canValidate ? const Color(0xffD80000) : Colors.grey[500]),
+ style: TextStyle(
+ fontSize: 20,
+ color: canValidate
+ ? const Color(0xffD80000)
+ : Colors.grey[500]),
),
);
})
@@ -251,7 +272,7 @@ class WalletOptionsProvider with ChangeNotifier {
);
}
- Future<String?> editWalletName(BuildContext context, List<int?> wID) async {
+ Future<String?> editWalletName(BuildContext context, String address) async {
final walletName = TextEditingController();
canValidateNameBool = false;
@@ -282,21 +303,25 @@ class WalletOptionsProvider with ChangeNotifier {
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
- Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) {
+ Consumer<WalletOptionsProvider>(
+ builder: (context, wOptions, _) {
return TextButton(
key: keyInfoPopup,
child: Text(
"validate".tr(),
style: TextStyle(
fontSize: 20,
- color: canValidateNameBool ? const Color(0xffD80000) : Colors.grey,
+ color: canValidateNameBool
+ ? const Color(0xffD80000)
+ : Colors.grey,
fontWeight: FontWeight.w600,
),
),
onPressed: () async {
if (canValidateNameBool) {
nameController.text = walletName.text;
- _renameWallet(wID, walletName.text, isCesium: false);
+ _renameWallet(address, walletName.text,
+ isCesium: false);
notifyListeners();
Navigator.pop(context);
}
@@ -312,7 +337,10 @@ class WalletOptionsProvider with ChangeNotifier {
key: keyCancel,
child: Text(
"cancel".tr(),
- style: TextStyle(fontSize: 17, color: Colors.grey[800], fontWeight: FontWeight.w300),
+ style: TextStyle(
+ fontSize: 17,
+ color: Colors.grey[800],
+ fontWeight: FontWeight.w300),
),
onPressed: () async {
Navigator.pop(context);
@@ -328,9 +356,12 @@ class WalletOptionsProvider with ChangeNotifier {
}
bool canValidateName(BuildContext context, final walletName) {
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
- bool isNameValid = walletName.text.length >= 2 && !walletName.text.contains(':') && walletName.text.length <= 39;
+ bool isNameValid = walletName.text.length >= 2 &&
+ !walletName.text.contains(':') &&
+ walletName.text.length <= 39;
if (isNameValid) {
for (var wallet in myWalletProvider.listWallets) {
diff --git a/lib/screens/home.dart b/lib/screens/home.dart
index 4e0fa3b1103d8c2a7198b11c98d19f14ebf7eb43..1222cf1e9f133b869b1954b91364a892bb9460e5 100644
--- a/lib/screens/home.dart
+++ b/lib/screens/home.dart
@@ -1,29 +1,18 @@
-import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
-import 'package:gecko/models/chest_data.dart';
-import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/chest_provider.dart';
-import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
-import 'package:gecko/providers/substrate_sdk.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/my_wallets.dart';
-import 'package:gecko/models/wallet_data.dart';
-import 'package:gecko/providers/v2s_datapod.dart';
-import 'package:gecko/services/durt.service.dart';
import 'package:gecko/widgets/bubble_speak.dart';
import 'package:gecko/widgets/buttons/home_settings_button.dart';
import 'package:gecko/widgets/commons/animated_text.dart';
-import 'package:gecko/widgets/commons/common_elements.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/widgets/drawer.dart';
import 'package:gecko/widgets/buttons/home_buttons.dart';
-import 'package:get_it/get_it.dart';
-import 'package:hive_flutter/hive_flutter.dart';
import 'package:provider/provider.dart';
class HomeScreen extends StatefulWidget {
@@ -36,82 +25,10 @@ class HomeScreen extends StatefulWidget {
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
+ super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
- final homeProvider = Provider.of<HomeProvider>(context, listen: false);
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
- final datapod = Provider.of<V2sDatapodProvider>(context, listen: false);
-
- // Init durt 2
- await GetIt.I.get<DurtService>().init();
-
- final bool isWalletsExists = myWalletProvider.isWalletsExists();
-
- // Check if versionData non compatible, drop everything
- if (configBox.get('dataVersion') == null) {
- configBox.put('dataVersion', dataVersion);
- }
- if (isWalletsExists && (configBox.get('dataVersion')) < dataVersion) {
- if (!sub.sdkReady && !sub.sdkLoading) sub.initApi();
- // ignore: use_build_context_synchronously
- await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr());
- await Hive.deleteBoxFromDisk('walletBox');
- await Hive.deleteBoxFromDisk('chestBox');
- await datapod.deleteAvatarsDirectory();
- await avatarsDirectory.create();
- chestBox = await Hive.openBox<ChestData>("chestBox");
- await configBox.delete('defaultWallet');
- if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
- await sub.deleteAllAccounts();
- configBox.put('dataVersion', dataVersion);
- myWalletProvider.reload();
- } else {
- if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
- }
-
- if (sub.sdkReady && !sub.nodeConnected) {
- walletBox = await Hive.openBox<WalletData>("walletBox");
- await Hive.deleteBoxFromDisk('g1WalletsBox');
- await datapod.deleteAvatarsCacheDirectory();
- await avatarsCacheDirectory.create();
- g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
- contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
-
- homeProvider.isWalletBoxInit = true;
- myWalletProvider.reload();
-
- await homeProvider.getValidEndpoints();
- if (configBox.get('isCacheChecked') == null) {
- configBox.put('isCacheChecked', false);
- }
-
- Future<void> updateConnectionStatus(List<ConnectivityResult> result) async {
- log.i('Network changed: $result');
- if (result.contains(ConnectivityResult.none)) {
- sub.nodeConnected = false;
- await sub.sdk.api.setting.unsubscribeBestNumber();
- homeProvider.changeMessage("notConnectedToInternet".tr());
- sub.reload();
- } else {
- // Check if the phone is actually connected to the internet
- var connectivityResult = await (Connectivity().checkConnectivity());
- if (!connectivityResult.contains(ConnectivityResult.none)) {
- await sub.connectNode();
-
- // Load wallets list
- myWalletProvider.readAllWallets(myWalletProvider.getCurrentChest());
-
- //Connect to Indexer
- await duniterIndexer.getValidIndexerEndpoint();
- }
- }
- }
-
- Connectivity().onConnectivityChanged.listen(updateConnectionStatus);
- }
+ await Provider.of<HomeProvider>(context, listen: false).initHome(context);
});
- super.initState();
}
@override
@@ -120,10 +37,11 @@ class _HomeScreenState extends State<HomeScreen> {
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
Provider.of<ChestProvider>(context);
- final isWalletsExists = myWalletProvider.isWalletsExists();
-
- isTall = (MediaQuery.of(context).size.height / MediaQuery.of(context).size.width) > 1.75;
+ final isWalletsExists = myWalletProvider.isWalletsExists;
+ isTall = (MediaQuery.of(context).size.height /
+ MediaQuery.of(context).size.width) >
+ 1.75;
return Scaffold(
resizeToAvoidBottomInset: false,
drawer: MainDrawer(isWalletsExists: isWalletsExists),
@@ -143,7 +61,8 @@ Widget geckHome(context) {
fit: BoxFit.cover,
),
),
- child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
+ child:
+ Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
Stack(children: <Widget>[
Positioned(
top: statusBarHeight + scaleSize(10),
@@ -151,12 +70,15 @@ Widget geckHome(context) {
child: IconHomeSettings(),
),
Align(
- child: Image(image: const AssetImage('assets/home/header.png'), height: scaleSize(165)),
+ child: Image(
+ image: const AssetImage('assets/home/header.png'),
+ height: scaleSize(165)),
),
]),
Padding(
padding: const EdgeInsets.only(top: 15),
- child: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
+ child:
+ Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
DefaultTextStyle(
textAlign: TextAlign.center,
style: scaledTextStyle(
@@ -217,7 +139,8 @@ Widget welcomeHome(context) {
fit: BoxFit.cover,
),
),
- child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
+ child:
+ Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
Stack(children: <Widget>[
Positioned(
top: statusBarHeight + scaleSize(10),
@@ -225,12 +148,15 @@ Widget welcomeHome(context) {
child: IconHomeSettings(),
),
Align(
- child: Image(image: const AssetImage('assets/home/header.png'), height: scaleSize(165)),
+ child: Image(
+ image: const AssetImage('assets/home/header.png'),
+ height: scaleSize(165)),
),
]),
Padding(
padding: const EdgeInsets.only(top: 1),
- child: Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
+ child:
+ Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Expanded(
child: Text(
"fastAppDescription".tr(args: [currencyName]),
@@ -278,9 +204,11 @@ Widget welcomeHome(context) {
Expanded(
child: Stack(children: <Widget>[
Padding(
- padding: EdgeInsets.only(top: scaleSize(isTall ? 55 : 0)),
+ padding:
+ EdgeInsets.only(top: scaleSize(isTall ? 55 : 0)),
child: Image(
- image: const AssetImage('assets/home/gecko-bienvenue.png'),
+ image: const AssetImage(
+ 'assets/home/gecko-bienvenue.png'),
height: scaleSize(isTall ? 180 : 160),
),
),
@@ -326,7 +254,10 @@ Widget welcomeHome(context) {
},
child: Text(
'createWallet'.tr(),
- style: scaledTextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: Colors.white),
+ style: scaledTextStyle(
+ fontSize: 20,
+ fontWeight: FontWeight.w600,
+ color: Colors.white),
),
),
),
@@ -364,7 +295,10 @@ Widget welcomeHome(context) {
},
child: Text(
"restoreWallet".tr(),
- style: scaledTextStyle(fontSize: 20, color: orangeC, fontWeight: FontWeight.w600),
+ style: scaledTextStyle(
+ fontSize: 20,
+ color: orangeC,
+ fontWeight: FontWeight.w600),
),
),
),
diff --git a/lib/screens/myWallets/chest_options.dart b/lib/screens/myWallets/chest_options.dart
index 3645fca61ea9ab094ac74b3389c1200725e0e5e4..b5197711040eab537add215d58fa489d52fcfa96 100644
--- a/lib/screens/myWallets/chest_options.dart
+++ b/lib/screens/myWallets/chest_options.dart
@@ -1,5 +1,6 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
@@ -21,12 +22,12 @@ class ChestOptions extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final currentChest = chestBox.get(configBox.get('currentChest'))!;
+ final currentSafe = Durt.i.walletService.defaultSafeBox;
return Scaffold(
backgroundColor: backgroundColor,
resizeToAvoidBottomInset: false,
- appBar: GeckoAppBar(currentChest.name!),
+ appBar: GeckoAppBar(currentSafe.name),
bottomNavigationBar: const GeckoBottomAppBar(),
body: Stack(children: [
Builder(
@@ -54,8 +55,9 @@ class ChestOptionsContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
final chestProvider = Provider.of<ChestProvider>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
- final currentChest = chestBox.get(configBox.get('currentChest'))!;
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
+ final currentChest = Durt.i.walletService.defaultSafeBox;
final isAlone = myWalletProvider.listWallets.length == 1;
return Column(
@@ -75,7 +77,8 @@ class ChestOptionsContent extends StatelessWidget {
);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
children: [
Icon(
@@ -115,7 +118,8 @@ class ChestOptionsContent extends StatelessWidget {
);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
children: [
Icon(
@@ -145,22 +149,26 @@ class ChestOptionsContent extends StatelessWidget {
builder: (context, sub, _) {
return InkWell(
key: keycreateRootDerivation,
- onTap: sub.nodeConnected
+ onTap: Durt.i.isConnected
? () async {
await Navigator.push(
context,
- MaterialPageRoute(builder: (context) => const CustomDerivation()),
+ MaterialPageRoute(
+ builder: (context) => const CustomDerivation()),
);
}
: null,
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
children: [
Icon(
Icons.manage_accounts,
size: scaleSize(24),
- color: sub.nodeConnected ? Colors.black87 : Colors.grey[400],
+ color: Durt.i.isConnected
+ ? Colors.black87
+ : Colors.grey[400],
),
ScaledSizedBox(width: 16),
Expanded(
@@ -168,7 +176,9 @@ class ChestOptionsContent extends StatelessWidget {
'createDerivation'.tr(),
style: scaledTextStyle(
fontSize: 16,
- color: sub.nodeConnected ? Colors.black87 : Colors.grey[500],
+ color: Durt.i.isConnected
+ ? Colors.black87
+ : Colors.grey[500],
),
softWrap: true,
),
@@ -187,7 +197,8 @@ class ChestOptionsContent extends StatelessWidget {
await chestProvider.forgetSafe(context, currentChest);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
children: [
Image.asset(
diff --git a/lib/screens/myWallets/choose_chest.dart b/lib/screens/myWallets/choose_chest.dart
index fa1b7d9b5c1cdbe9818fbaa2bcae8d7daba972dd..843905105767ea13cd5ac699a8b8193ec232704e 100644
--- a/lib/screens/myWallets/choose_chest.dart
+++ b/lib/screens/myWallets/choose_chest.dart
@@ -1,5 +1,8 @@
// ignore_for_file: use_build_context_synchronously
+import 'dart:io';
+
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
@@ -23,7 +26,7 @@ class ChooseChest extends StatefulWidget {
class _ChooseChestState extends State<ChooseChest> {
final tplController = TextEditingController();
final buttonCarouselController = CarouselSliderController();
- int? currentChest = configBox.get('currentChest');
+ int currentChest = Durt.i.walletService.defaultSafeBoxNumber;
@override
Widget build(BuildContext context) {
@@ -41,30 +44,31 @@ class _ChooseChestState extends State<ChooseChest> {
options: CarouselOptions(
height: 210,
onPageChanged: (index, reason) {
- currentChest = chestBox.toMap().keys.toList()[index];
+ currentChest =
+ Durt.i.walletService.safeBox.toMap().keys.toList()[index];
setState(() {});
},
enableInfiniteScroll: false,
- initialPage: currentChest!,
+ initialPage: currentChest,
enlargeCenterPage: true,
viewportFraction: 0.5,
),
- items: chestBox.toMap().entries.map((i) {
+ items: Durt.i.walletService.safeBox.toMap().entries.map((i) {
return Builder(
builder: (BuildContext context) {
return Column(children: <Widget>[
- i.value.imageFile == null
+ i.value.imagePath == null
? Image.asset(
- 'assets/chests/${i.value.imageName}',
+ 'assets/chests/${i.value.number}.png',
height: 150,
)
: Image.file(
- i.value.imageFile!,
+ File(i.value.imagePath!),
height: 150,
),
const SizedBox(height: 30),
Text(
- i.value.name!,
+ i.value.name,
style: const TextStyle(fontSize: 20),
),
]);
@@ -72,10 +76,11 @@ class _ChooseChestState extends State<ChooseChest> {
);
}).toList(),
),
- if (chestBox.values.toList().length > 1)
+ if (Durt.i.walletService.safeBox.values.toList().length > 1)
Row(
mainAxisAlignment: MainAxisAlignment.center,
- children: chestBox.toMap().entries.map((entry) {
+ children:
+ Durt.i.walletService.safeBox.values.toList().map((entry) {
return GestureDetector(
onTap: () =>
buttonCarouselController.animateToPage(entry.key),
@@ -86,10 +91,13 @@ class _ChooseChestState extends State<ChooseChest> {
vertical: 8.0, horizontal: 4.0),
decoration: BoxDecoration(
shape: BoxShape.circle,
- color: (Theme.of(context).brightness == Brightness.dark
+ color: (Theme.of(context).brightness ==
+ Brightness.dark
? Colors.white
: Colors.black)
- .withValues(alpha: currentChest == entry.key ? 0.9 : 0.4)),
+ .withValues(
+ alpha:
+ currentChest == entry.key ? 0.9 : 0.4)),
),
);
}).toList(),
diff --git a/lib/screens/myWallets/confirm_change_pin.dart b/lib/screens/myWallets/confirm_change_pin.dart
index 8ae690a2348e8929f41fd3aabb7dacea97b9eb4d..88a57d94dde63523f1859b9ebbb79982fd58a455 100644
--- a/lib/screens/myWallets/confirm_change_pin.dart
+++ b/lib/screens/myWallets/confirm_change_pin.dart
@@ -136,7 +136,7 @@ class _ConfirmChangePinScreenState extends State<ConfirmChangePinScreen> {
widget.walletProvider.pinCode = pin;
// Recharger les wallets avec le nouveau PIN
- final currentChest = widget.walletProvider.getCurrentChest();
+ final currentChest = widget.walletProvider.getCurrentSafe;
await widget.walletProvider.readAllWallets(currentChest);
widget.walletProvider.reload();
diff --git a/lib/screens/myWallets/custom_derivations.dart b/lib/screens/myWallets/custom_derivations.dart
index d97e94eb76acf713b735eac789472c4e8b70faa4..9d60927d3bf85fdd5d6eab430fc0df774dbf52b6 100644
--- a/lib/screens/myWallets/custom_derivations.dart
+++ b/lib/screens/myWallets/custom_derivations.dart
@@ -1,10 +1,10 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:provider/provider.dart';
@@ -117,7 +117,7 @@ class _CustomDerivationState extends State<CustomDerivation> {
),
onPressed: () async {
if (!await myWalletProvider.askPinCode()) return;
- String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}';
+ String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}';
if (dropdownValue == 'root') {
await myWalletProvider.generateRootWallet(context, 'rootWallet'.tr());
} else {
diff --git a/lib/screens/myWallets/import_g1_v1.dart b/lib/screens/myWallets/import_g1_v1.dart
index 98e5ff8c9e665afe0bd345de777680c3c8c44ed3..0704ba6cd47c9a6622376e2bcbc0d38b8ca3921d 100644
--- a/lib/screens/myWallets/import_g1_v1.dart
+++ b/lib/screens/myWallets/import_g1_v1.dart
@@ -1,13 +1,13 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:async';
+import 'package:durt2/durt2.dart' show IdtyStatus, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/migrate_wallet_checks.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
diff --git a/lib/screens/myWallets/manage_membership.dart b/lib/screens/myWallets/manage_membership.dart
index e60898b935d92ec50177d897d03bc9323891f020..064118acacd141860445e79a27350235c46ec5cf 100644
--- a/lib/screens/myWallets/manage_membership.dart
+++ b/lib/screens/myWallets/manage_membership.dart
@@ -1,10 +1,10 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show IdtyStatus;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
@@ -196,7 +196,7 @@ class ManageMembership extends StatelessWidget {
status,
sub.currencyParameters['membershipRenewalPeriod']!,
);
- if (info.expireDate == null && status.idtyStatus != IdtyStatus.notMember) return const SizedBox.shrink();
+ if (info.expireDate == null && status.idtyStatus != IdtyStatus.expired) return const SizedBox.shrink();
return Container(
height: scaleSize(64),
diff --git a/lib/screens/myWallets/migrate_identity.dart b/lib/screens/myWallets/migrate_identity.dart
index 1f24c4387d133d3d5ab391b2700126f31390b302..4f3c01cfe7c2b84f03ab867c713ad9a64b0f3569 100644
--- a/lib/screens/myWallets/migrate_identity.dart
+++ b/lib/screens/myWallets/migrate_identity.dart
@@ -1,5 +1,6 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
@@ -43,7 +44,7 @@ class MigrateIdentityScreen extends StatelessWidget {
String matchInfo = '';
Future scanDerivations() async {
- if (!await isAddress(newWalletAddress.text) || !await sub.isMnemonicValid(newMnemonicSentence.text) || !statusData.canValidate) {
+ if (!await isAddress(newWalletAddress.text) || !Durt.i.walletService.isMnemonicValid(newMnemonicSentence.text) || !statusData.canValidate) {
mnemonicIsValid = false;
matchInfo = '';
walletOptions.reload();
diff --git a/lib/screens/myWallets/restore_chest.dart b/lib/screens/myWallets/restore_chest.dart
index dbf626813c43ab064b1cef88242cbd3a19211b58..567d9f4ae8d23368661a4c221229c4e1bbde862e 100644
--- a/lib/screens/myWallets/restore_chest.dart
+++ b/lib/screens/myWallets/restore_chest.dart
@@ -1,13 +1,13 @@
// ignore_for_file: use_build_context_synchronously
import 'package:bubble/bubble.dart';
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/generate_wallets.dart';
-import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/onBoarding/7.dart';
import 'package:gecko/screens/onBoarding/9.dart';
import 'package:gecko/widgets/commons/fader_transition.dart';
@@ -24,7 +24,6 @@ class RestoreChest extends StatelessWidget {
@override
Widget build(BuildContext context) {
final genW = Provider.of<GenerateWalletsProvider>(context, listen: false);
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
if (genW.isSentenceComplete(context)) {
genW.generatedMnemonic =
@@ -97,7 +96,7 @@ class RestoreChest extends StatelessWidget {
),
),
onPressed: () async {
- if (await sub.isMnemonicValid(genW.generatedMnemonic!)) {
+ if (Durt.i.walletService.isMnemonicValid(genW.generatedMnemonic!)) {
genW.resetImportView();
await Navigator.push(
context,
diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart
index 78bcac4056087a5e0ff0f558fe11f0e378c173f8..15f50526e8ab2ce9d0a2cd754cb0ae14a027a9db 100644
--- a/lib/screens/myWallets/show_seed.dart
+++ b/lib/screens/myWallets/show_seed.dart
@@ -1,9 +1,9 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart
index a10337c0f3249d558bae59b8476af143fe293e3c..d4c541084a3ebf67c19d6b28fae69be69c3444a5 100644
--- a/lib/screens/myWallets/unlocking_wallet.dart
+++ b/lib/screens/myWallets/unlocking_wallet.dart
@@ -1,13 +1,13 @@
import 'dart:async';
+import 'dart:io';
+import 'package:durt2/durt2.dart' show Durt, SafeBox, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
-import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/my_wallets.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:flutter/material.dart';
import 'package:pin_code_fields/pin_code_fields.dart';
@@ -23,8 +23,8 @@ class UnlockingWallet extends StatefulWidget {
}
class _UnlockingWalletState extends State<UnlockingWallet> {
- late int currentChestNumber;
- late ChestData currentChest;
+ late int currentSafeNumber;
+ late SafeBox currentSafe;
bool canUnlock = true;
late final TextEditingController enterPin;
late final FocusNode pinFocus;
@@ -36,14 +36,16 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
super.initState();
pinFocus = FocusNode(debugLabel: 'pinFocusNode');
enterPin = TextEditingController();
- currentChestNumber = configBox.get('currentChest');
- currentChest = chestBox.get(currentChestNumber)!;
+ currentSafeNumber = Durt.i.walletService.defaultSafeBoxNumber;
+ currentSafe = Durt.i.walletService.safeBox.get(currentSafeNumber)!;
}
@override
Widget build(BuildContext context) {
- final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final walletOptions =
+ Provider.of<WalletOptionsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final pinLenght = walletOptions.getPinLenght(widget.wallet.number);
@@ -79,19 +81,19 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
- currentChest.imageFile == null
+ currentSafe.imagePath == null
? Image.asset(
- 'assets/chests/${currentChest.imageName}',
+ 'assets/chests/${currentSafe.number}.png',
width: scaleSize(isTall ? 95 : 75),
)
: Image.file(
- currentChest.imageFile!,
+ File(currentSafe.imagePath!),
width: scaleSize(isTall ? 127 : 95),
),
ScaledSizedBox(width: 18),
Flexible(
child: Text(
- currentChest.name!,
+ currentSafe.name,
textAlign: TextAlign.center,
style: scaledTextStyle(
fontSize: isTall ? 24 : 20,
@@ -129,7 +131,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
),
),
ScaledSizedBox(height: isTall ? 24 : 12),
- if (!myWalletProvider.isPinValid && !myWalletProvider.isPinLoading)
+ if (!myWalletProvider.isPinValid &&
+ !myWalletProvider.isPinLoading)
Padding(
padding: const EdgeInsets.only(bottom: 16),
child: Text(
@@ -144,7 +147,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
pinForm(context, pinLenght),
ScaledSizedBox(height: isTall ? 16 : 8),
if (canUnlock)
- Consumer<WalletOptionsProvider>(builder: (context, sub, _) {
+ Consumer<WalletOptionsProvider>(
+ builder: (context, sub, _) {
return InkWell(
key: keyCachePassword,
onTap: () {
@@ -155,7 +159,9 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
mainAxisSize: MainAxisSize.min,
children: [
Icon(
- configBox.get('isCacheChecked') ? Icons.check_box : Icons.check_box_outline_blank,
+ configBox.get('isCacheChecked')
+ ? Icons.check_box
+ : Icons.check_box_outline_blank,
color: orangeC,
size: scaleSize(20),
),
@@ -193,7 +199,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
return Form(
child: Padding(
- padding: EdgeInsets.symmetric(vertical: scaleSize(3), horizontal: scaleSize(isTall ? 30 : 20)),
+ padding: EdgeInsets.symmetric(
+ vertical: scaleSize(3), horizontal: scaleSize(isTall ? 30 : 20)),
child: PinCodeTextField(
key: keyPinForm,
textCapitalization: TextCapitalization.characters,
@@ -246,7 +253,8 @@ class _UnlockingWalletState extends State<UnlockingWallet> {
onCompleted: (pin) async {
myWalletProvider.isPinLoading = true;
myWalletProvider.pinCode = pin.toUpperCase();
- final isValid = await sub.checkPassword(defaultWallet.address, pin.toUpperCase());
+ final isValid = await sub.checkPassword(
+ defaultWallet.address, pin.toUpperCase());
if (!isValid) {
await Future.delayed(const Duration(milliseconds: 20));
pinColor = Colors.red[600]!;
diff --git a/lib/screens/myWallets/wallet_options.dart b/lib/screens/myWallets/wallet_options.dart
index 3b708d5aa144d670b5f4c6e2a6aac7c3c4df939d..95740e028393ed99ea03cb95343ef94a970daf1c 100644
--- a/lib/screens/myWallets/wallet_options.dart
+++ b/lib/screens/myWallets/wallet_options.dart
@@ -2,6 +2,7 @@
import 'dart:async';
import 'dart:io';
+import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
@@ -11,7 +12,6 @@ import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/my_wallets.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
@@ -29,25 +29,30 @@ import 'package:gecko/widgets/wallet_header.dart';
import 'package:gecko/screens/identity/confirm_identity.dart';
class WalletOptions extends StatelessWidget {
- const WalletOptions({Key? keyMyWallets, required this.wallet}) : super(key: keyMyWallets);
+ const WalletOptions({Key? keyMyWallets, required this.wallet})
+ : super(key: keyMyWallets);
final WalletData wallet;
@override
Widget build(BuildContext context) {
- final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
- WalletsProfilesProvider historyProvider = Provider.of<WalletsProfilesProvider>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final walletOptions =
+ Provider.of<WalletOptionsProvider>(context, listen: false);
+ WalletsProfilesProvider historyProvider =
+ Provider.of<WalletsProfilesProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
walletOptions.address.text = wallet.address;
- final currentChest = myWalletProvider.getCurrentChest();
- final isWalletNameIndexed = duniterIndexer.walletNameIndexer[walletOptions.address.text] != null;
+ final currentChest = myWalletProvider.getCurrentSafe;
+ final isWalletNameIndexed =
+ duniterIndexer.walletNameIndexer[walletOptions.address.text] != null;
final isAlone = myWalletProvider.listWallets.length == 1;
final defaultWallet = myWalletProvider.getDefaultWallet();
- walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id[1]);
+ walletOptions.isDefaultWallet = defaultWallet.address == wallet.address;
return PopScope(
onPopInvokedWithResult: (_, __) {
@@ -58,7 +63,9 @@ class WalletOptions extends StatelessWidget {
backgroundColor: Colors.white,
appBar: WalletAppBar(
address: wallet.address,
- title: isWalletNameIndexed ? duniterIndexer.walletNameIndexer[walletOptions.address.text]! : wallet.name!,
+ title: isWalletNameIndexed
+ ? duniterIndexer.walletNameIndexer[walletOptions.address.text]!
+ : wallet.name!,
),
body: Stack(
children: [
@@ -66,8 +73,8 @@ class WalletOptions extends StatelessWidget {
children: [
WalletHeader(
address: wallet.address,
- customImagePath: wallet.imageCustomPath,
- defaultImagePath: wallet.imageDefaultPath,
+ customImagePath: wallet.imagePath,
+ defaultImagePath: wallet.imagePath,
),
// Corps avec les options
Expanded(
@@ -85,24 +92,37 @@ class WalletOptions extends StatelessWidget {
spacing: 8,
children: [
buildConfirmIdentitySection(walletProvider),
- if (wallet.hasIdentity) buildRenewMembershipSection(walletProvider),
- buildOptionsSection(context, walletProvider, historyProvider),
- if (!isAlone) buildDefaultWalletSection(context, walletProvider, myWalletProvider, walletOptions, currentChest),
+ if (wallet.hasIdentity)
+ buildRenewMembershipSection(walletProvider),
+ buildOptionsSection(
+ context, walletProvider, historyProvider),
+ if (!isAlone)
+ buildDefaultWalletSection(
+ context,
+ walletProvider,
+ myWalletProvider,
+ walletOptions,
+ currentChest),
if (!wallet.hasIdentity)
InkWell(
key: keyRenameWallet,
onTap: () async {
- await walletProvider.editWalletName(context, [wallet.id[0], wallet.id[1]]);
+ await walletProvider.editWalletName(
+ context, wallet.address);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(17), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(17),
+ vertical: scaleSize(12)),
child: Row(
- crossAxisAlignment: CrossAxisAlignment.center,
+ crossAxisAlignment:
+ CrossAxisAlignment.center,
children: [
Image.asset(
'assets/walletOptions/edit.png',
height: scaleSize(22),
- color: const Color(0xFF4A90E2).withValues(alpha: 0.8),
+ color: const Color(0xFF4A90E2)
+ .withValues(alpha: 0.8),
),
ScaledSizedBox(width: 18),
Expanded(
@@ -119,8 +139,12 @@ class WalletOptions extends StatelessWidget {
),
),
),
- if (!walletProvider.isDefaultWallet && !wallet.hasIdentity) deleteWallet(context, walletProvider, currentChest),
- if (wallet.hasIdentity) const ManageMembershipButton(),
+ if (!walletProvider.isDefaultWallet &&
+ !wallet.hasIdentity)
+ deleteWallet(
+ context, walletProvider, currentChest),
+ if (wallet.hasIdentity)
+ const ManageMembershipButton(),
if (isAlone) aloneWalletOptions(),
],
);
@@ -168,13 +192,13 @@ class WalletOptions extends StatelessWidget {
],
),
child: ClipOval(
- child: wallet.imageCustomPath == null || wallet.imageCustomPath == ''
+ child: wallet.imagePath == null || wallet.imagePath == ''
? Image.asset(
- 'assets/avatars/${wallet.imageDefaultPath}',
+ 'assets/avatars/${wallet.number}.png',
fit: BoxFit.cover,
)
: Image.file(
- File(wallet.imageCustomPath!),
+ File(wallet.imagePath!),
fit: BoxFit.cover,
),
),
@@ -190,7 +214,7 @@ class WalletOptions extends StatelessWidget {
),
child: InkWell(
onTap: () async {
- wallet.imageCustomPath = await walletProvider.changeAvatar();
+ wallet.imagePath = await walletProvider.changeAvatar();
walletProvider.reload();
},
child: Icon(
@@ -205,17 +229,23 @@ class WalletOptions extends StatelessWidget {
);
}
- Widget activityWidget(BuildContext context, WalletsProfilesProvider historyProvider, WalletOptionsProvider walletProvider) {
+ Widget activityWidget(
+ BuildContext context,
+ WalletsProfilesProvider historyProvider,
+ WalletOptionsProvider walletProvider) {
return InkWell(
key: keyOpenActivity,
onTap: () {
Navigator.push(
context,
- PageNoTransit(builder: (context) => ActivityScreen(address: walletProvider.address.text)),
+ PageNoTransit(
+ builder: (context) =>
+ ActivityScreen(address: walletProvider.address.text)),
);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@@ -242,44 +272,56 @@ class WalletOptions extends StatelessWidget {
}
Future setDefaultWallet(BuildContext context, int currentChest) async {
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
- final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
+ final walletOptions =
+ Provider.of<WalletOptionsProvider>(context, listen: false);
- await sub.setCurrentWallet(wallet);
+ await Durt.i.walletService.setDefaultWallet(walletOptions.address.text);
await myWalletProvider.readAllWallets(currentChest);
myWalletProvider.reload();
walletOptions.reload();
}
- Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions, int currentChest) {
+ Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions,
+ int currentChest) {
final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet();
- final bool isDefaultWallet = walletOptions.address.text == defaultWallet.address;
+ final bool isDefaultWallet =
+ walletOptions.address.text == defaultWallet.address;
return FutureBuilder(
future: sub.hasAccountConsumers(wallet.address),
builder: (BuildContext context, AsyncSnapshot<bool> hasConsumers) {
- if (hasConsumers.connectionState != ConnectionState.done || hasConsumers.hasError || !hasConsumers.hasData) {
+ if (hasConsumers.connectionState != ConnectionState.done ||
+ hasConsumers.hasError ||
+ !hasConsumers.hasData) {
return const SizedBox.shrink();
}
- final int balance = walletOptions.balanceCache[walletOptions.address.text] ?? -1;
- final bool canDelete = !isDefaultWallet && !hasConsumers.data! && (balance > 2 || balance == 0) && !wallet.hasIdentity;
+ final int balance =
+ walletOptions.balanceCache[walletOptions.address.text] ?? -1;
+ final bool canDelete = !isDefaultWallet &&
+ !hasConsumers.data! &&
+ (balance > 2 || balance == 0) &&
+ !wallet.hasIdentity;
return InkWell(
key: keyDeleteWallet,
onTap: canDelete
? () async {
await walletOptions.deleteWallet(context, wallet);
WidgetsBinding.instance.addPostFrameCallback((_) async {
- myWalletProvider.listWallets = await myWalletProvider.readAllWallets(currentChest);
+ myWalletProvider.listWallets =
+ await myWalletProvider.readAllWallets(currentChest);
myWalletProvider.reload();
});
}
: null,
child: canDelete
? Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
@@ -322,8 +364,12 @@ class WalletOptions extends StatelessWidget {
sub.currencyParameters['membershipRenewalPeriod']!,
);
- final twentyDaysBeforeExpiration = info.expireDate?.subtract(const Duration(days: 20));
- final shouldHideButton = !info.canRenew || (info.expireDate != null && !(twentyDaysBeforeExpiration?.isBefore(DateTime.now()) ?? false));
+ final twentyDaysBeforeExpiration =
+ info.expireDate?.subtract(const Duration(days: 20));
+ final shouldHideButton = !info.canRenew ||
+ (info.expireDate != null &&
+ !(twentyDaysBeforeExpiration?.isBefore(DateTime.now()) ??
+ false));
if (shouldHideButton) return const SizedBox.shrink();
@@ -343,10 +389,12 @@ class WalletOptions extends StatelessWidget {
borderRadius: BorderRadius.circular(8),
),
),
- onPressed: () => MembershipRenewal.executeRenewal(context, walletProvider.address.text),
+ onPressed: () => MembershipRenewal.executeRenewal(
+ context, walletProvider.address.text),
child: Text(
'renewMembership'.tr(),
- style: scaledTextStyle(fontSize: 16, color: Colors.white),
+ style:
+ scaledTextStyle(fontSize: 16, color: Colors.white),
),
),
),
@@ -361,12 +409,19 @@ class WalletOptions extends StatelessWidget {
);
}
- Widget buildOptionsSection(BuildContext context, WalletOptionsProvider walletProvider, WalletsProfilesProvider historyProvider) {
+ Widget buildOptionsSection(
+ BuildContext context,
+ WalletOptionsProvider walletProvider,
+ WalletsProfilesProvider historyProvider) {
return activityWidget(context, historyProvider, walletProvider);
}
Widget buildDefaultWalletSection(
- BuildContext context, WalletOptionsProvider walletProvider, MyWalletsProvider myWalletProvider, WalletOptionsProvider walletOptions, int currentChest) {
+ BuildContext context,
+ WalletOptionsProvider walletProvider,
+ MyWalletsProvider myWalletProvider,
+ WalletOptionsProvider walletOptions,
+ int currentChest) {
return Consumer<MyWalletsProvider>(
builder: (context, myWalletProvider, _) {
return InkWell(
@@ -378,22 +433,29 @@ class WalletOptions extends StatelessWidget {
}
: null,
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Icon(
Icons.check_circle_outline,
size: scaleSize(24),
- color: walletProvider.isDefaultWallet ? Colors.grey[400] : const Color(0xFF4CAF50).withValues(alpha: 0.8),
+ color: walletProvider.isDefaultWallet
+ ? Colors.grey[400]
+ : const Color(0xFF4CAF50).withValues(alpha: 0.8),
),
ScaledSizedBox(width: 16),
Expanded(
child: Text(
- walletProvider.isDefaultWallet ? 'thisWalletIsDefault'.tr() : 'defineWalletAsDefault'.tr(),
+ walletProvider.isDefaultWallet
+ ? 'thisWalletIsDefault'.tr()
+ : 'defineWalletAsDefault'.tr(),
style: scaledTextStyle(
fontSize: 16,
- color: walletProvider.isDefaultWallet ? Colors.grey[500] : Colors.black87,
+ color: walletProvider.isDefaultWallet
+ ? Colors.grey[500]
+ : Colors.black87,
),
softWrap: true,
),
@@ -411,9 +473,12 @@ class WalletOptions extends StatelessWidget {
return FutureBuilder(
future: sub.idtyStatusMulti([walletProvider.address.text]),
initialData: const [IdtyStatus.unknown],
- builder: (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
+ builder:
+ (BuildContext context, AsyncSnapshot<List<IdtyStatus>> snapshot) {
return Visibility(
- visible: snapshot.hasData && !snapshot.hasError && snapshot.data!.first == IdtyStatus.unconfirmed,
+ visible: snapshot.hasData &&
+ !snapshot.hasError &&
+ snapshot.data!.first == IdtyStatus.created,
child: Column(children: [
ScaledSizedBox(height: 22),
SizedBox(
@@ -473,20 +538,25 @@ Widget aloneWalletOptions() {
onTap: () async {
if (!myWalletProvider.isNewDerivationLoading) {
if (!await myWalletProvider.askPinCode()) return;
- String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}';
- await myWalletProvider.generateNewDerivation(context, newDerivationName);
+ String newDerivationName =
+ '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}';
+ await myWalletProvider.generateNewDerivation(
+ context, newDerivationName);
Navigator.pushReplacementNamed(context, '/mywallets');
}
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Icon(
Icons.add_circle_outline,
size: scaleSize(24),
- color: sub.nodeConnected ? Color(0xFF4CAF50).withValues(alpha: 0.8) : Colors.grey[400],
+ color: Durt.i.isConnected
+ ? Color(0xFF4CAF50).withValues(alpha: 0.8)
+ : Colors.grey[400],
),
ScaledSizedBox(width: 16),
Expanded(
@@ -494,7 +564,9 @@ Widget aloneWalletOptions() {
'createNewWallet'.tr(),
style: scaledTextStyle(
fontSize: 16,
- color: sub.nodeConnected ? Colors.black87 : Colors.grey[500],
+ color: Durt.i.isConnected
+ ? Colors.black87
+ : Colors.grey[500],
),
softWrap: true,
),
@@ -513,7 +585,8 @@ Widget aloneWalletOptions() {
);
},
child: Container(
- padding: EdgeInsets.symmetric(horizontal: scaleSize(16), vertical: scaleSize(12)),
+ padding: EdgeInsets.symmetric(
+ horizontal: scaleSize(16), vertical: scaleSize(12)),
child: Row(
children: [
SvgPicture.asset(
diff --git a/lib/screens/myWallets/wallets_home.dart b/lib/screens/myWallets/wallets_home.dart
index 882ed481fd37ac93d7572d7b4a1834449e24b7c1..80bd603a49b871fe1c0f260e63f49a769c958662 100644
--- a/lib/screens/myWallets/wallets_home.dart
+++ b/lib/screens/myWallets/wallets_home.dart
@@ -1,8 +1,8 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' hide Provider;
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
-import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
@@ -27,13 +27,17 @@ class WalletsHome extends StatefulWidget {
State<WalletsHome> createState() => _WalletsHomeState();
}
-class _WalletsHomeState extends State<WalletsHome> with SingleTickerProviderStateMixin {
+class _WalletsHomeState extends State<WalletsHome>
+ with SingleTickerProviderStateMixin {
@override
Widget build(BuildContext context) {
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
return Scaffold(
- body: myWalletProvider.listWallets.length == 1 ? WalletOptions(wallet: myWalletProvider.listWallets[0]) : _WalletsHomeContent(),
+ body: myWalletProvider.listWallets.length == 1
+ ? WalletOptions(wallet: myWalletProvider.listWallets[0])
+ : _WalletsHomeContent(),
);
}
}
@@ -41,9 +45,11 @@ class _WalletsHomeState extends State<WalletsHome> with SingleTickerProviderStat
class _WalletsHomeContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
- final currentChestNumber = myWalletProvider.getCurrentChest();
- final ChestData currentChest = chestBox.get(currentChestNumber)!;
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
+ final currentChestNumber = myWalletProvider.getCurrentSafe;
+ final SafeBox currentChest =
+ Durt.i.walletService.safeBox.get(currentChestNumber)!;
return Scaffold(
backgroundColor: backgroundColor,
@@ -52,18 +58,22 @@ class _WalletsHomeContent extends StatelessWidget {
title: Row(
children: [
Image.asset(
- 'assets/chests/${currentChest.imageName}',
+ 'assets/chests/${currentChest.number}.png',
height: 32,
),
ScaledSizedBox(width: 17),
Text(
- currentChest.name!,
- style: scaledTextStyle(color: Colors.grey[850], fontSize: 16, fontWeight: FontWeight.w500),
+ currentChest.name,
+ style: scaledTextStyle(
+ color: Colors.grey[850],
+ fontSize: 16,
+ fontWeight: FontWeight.w500),
),
],
),
),
- bottomNavigationBar: Consumer<MyWalletsProvider>(builder: (context, _, __) {
+ bottomNavigationBar:
+ Consumer<MyWalletsProvider>(builder: (context, _, __) {
return myWalletProvider.lastFlyBy == null
? const GeckoBottomAppBar(
actualRoute: 'safeHome',
@@ -83,7 +93,7 @@ class _WalletsHomeContent extends StatelessWidget {
Widget myWalletsTiles(BuildContext context, int currentChestNumber) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
- final isWalletsExists = myWalletProvider.isWalletsExists();
+ final isWalletsExists = myWalletProvider.isWalletsExists;
if (!isWalletsExists) {
return const Text('');
@@ -122,7 +132,8 @@ class _WalletsHomeContent extends StatelessWidget {
Text(
'explainDraggableWallet'.tr(),
textAlign: TextAlign.center,
- style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w500),
+ style: scaledTextStyle(
+ fontSize: 16, fontWeight: FontWeight.w500),
),
],
))
@@ -138,7 +149,8 @@ class _WalletsHomeContent extends StatelessWidget {
);
// configBox.delete('showDraggableTutorial');
- final bool showDraggableTutorial = configBox.get('showDraggableTutorial') ?? true;
+ final bool showDraggableTutorial =
+ configBox.get('showDraggableTutorial') ?? true;
if (myWalletProvider.listWallets.length > 1 && showDraggableTutorial) {
tutorialCoachMark.show(context: context);
@@ -156,16 +168,25 @@ class _WalletsHomeContent extends StatelessWidget {
child: WalletTileMembre(wallet: myWalletProvider.idtyWallet!),
),
),
- SliverGrid.count(key: keyListWallets, crossAxisCount: nTule, childAspectRatio: 1, crossAxisSpacing: 0, mainAxisSpacing: 0, children: <Widget>[
- for (final repository in myWalletProvider.listWalletsWithoutIdty)
- DragTuleAction(
- wallet: repository,
- child: WalletTile(repository: repository),
- ),
- Consumer<SubstrateSdk>(builder: (context, sub, _) {
- return sub.nodeConnected && myWalletProvider.listWallets.length < maxWalletsInSafe ? const AddNewDerivationButton() : const Text('');
- }),
- ]),
+ SliverGrid.count(
+ key: keyListWallets,
+ crossAxisCount: nTule,
+ childAspectRatio: 1,
+ crossAxisSpacing: 0,
+ mainAxisSpacing: 0,
+ children: <Widget>[
+ for (final repository in myWalletProvider.listWalletsWithoutIdty)
+ DragTuleAction(
+ wallet: repository,
+ child: WalletTile(repository: repository),
+ ),
+ Consumer<SubstrateSdk>(builder: (context, sub, _) {
+ return Durt.i.isConnected &&
+ myWalletProvider.listWallets.length < maxWalletsInSafe
+ ? const AddNewDerivationButton()
+ : const Text('');
+ }),
+ ]),
const SliverToBoxAdapter(child: ChestOptionsButtons()),
]),
);
diff --git a/lib/screens/onBoarding/10.dart b/lib/screens/onBoarding/10.dart
index 96f98e2de72886f751c542ebde1d2d0d7cd2d2e6..619ca93fedfcd853bf9744d29b2d1d483357fbe7 100644
--- a/lib/screens/onBoarding/10.dart
+++ b/lib/screens/onBoarding/10.dart
@@ -1,5 +1,6 @@
// ignore_for_file: file_names, use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@@ -7,7 +8,6 @@ import 'package:flutter/services.dart';
import 'package:gecko/extensions.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/my_wallets.dart';
@@ -44,18 +44,19 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
bool hasError = false;
late final FocusNode pinFocus;
late final TextEditingController enterPin;
+ final generateWalletProvider = Provider.of<GenerateWalletsProvider>(homeContext);
@override
void initState() {
super.initState();
pinFocus = FocusNode(debugLabel: 'pinFocusNode10');
enterPin = TextEditingController();
+ generateWalletProvider.scanStatus = ScanDerivationsStatus.none;
}
@override
Widget build(BuildContext context) {
final walletOptions = Provider.of<WalletOptionsProvider>(context);
- final sub = Provider.of<SubstrateSdk>(context);
final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
final pinLenght = widget.pinCode.length;
@@ -88,7 +89,7 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
}),
ScaledSizedBox(height: isTall ? 20 : 0),
Consumer<SubstrateSdk>(builder: (context, sub, _) {
- return sub.nodeConnected
+ return Durt.i.isConnected
? pinForm(context, walletOptions, pinLenght, 1, 2)
: Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Text(
@@ -103,7 +104,7 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
]);
}),
Consumer<WalletOptionsProvider>(builder: (context, walletOptions, _) {
- return sub.nodeConnected
+ return Durt.i.isConnected
? InkWell(
key: keyCachePassword,
onTap: () {
@@ -136,10 +137,8 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
Widget pinForm(BuildContext context, WalletOptionsProvider walletOptions, int pinLenght, int walletNbr, int derivation) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
- final generateWalletProvider = Provider.of<GenerateWalletsProvider>(context);
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final currentChest = myWalletProvider.getCurrentChest();
+ final currentChest = myWalletProvider.getCurrentSafe;
return Form(
key: formKey,
@@ -204,7 +203,10 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
myWalletProvider.isPinLoading = false;
myWalletProvider.isPinValid = true;
- // await generateWalletProvider.storeHDWChest(context);
+ //TODO: Use int pincode directly instead of cast
+ final pinCodeint = int.parse(widget.pinCode);
+ await Durt.i.walletService.createSafe(mnemonic: generateWalletProvider.generatedMnemonic!, pinCode: pinCodeint);
+
ScanDerivationsResult scanStatus = ScanDerivationsResult.none;
if (widget.scanDerivation) {
scanStatus = await generateWalletProvider.scanDerivations(context, widget.pinCode);
@@ -212,19 +214,18 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
switch (scanStatus) {
case ScanDerivationsResult.none:
case ScanDerivationsResult.walletNotFound:
- final address = await sub.importAccount(
- mnemonic: generateWalletProvider.generatedMnemonic!,
- password: widget.pinCode,
- );
+ final walletData = await Durt.i.walletService.importRootWallet(pinCode: widget.pinCode);
+ final address = Durt.i.walletService.getAddress(walletData.address);
+
WalletData myWallet = WalletData(
- chest: configBox.get('currentChest'),
- address: address,
- number: 0,
- derivation: -1,
- name: 'currentWallet'.tr(),
- imageDefaultPath: '0.png',
- isOwned: true);
- await walletBox.put(myWallet.address, myWallet);
+ safeBoxNumber: configBox.get('currentChest'),
+ address: address,
+ number: 0,
+ derivation: -1,
+ name: 'currentWallet'.tr(),
+ isOwned: true,
+ );
+ await Durt.i.walletService.walletDataBox.put(myWallet.address, myWallet);
break;
case ScanDerivationsResult.timeout:
case ScanDerivationsResult.error:
@@ -247,7 +248,10 @@ class _OnboardingStepTenState extends State<OnboardingStepTen> {
if (defaultWallet == null && myWalletProvider.listWallets.isNotEmpty) {
defaultWallet = myWalletProvider.listWallets.first;
}
- if (defaultWallet != null) await sub.setCurrentWallet(defaultWallet);
+ if (defaultWallet != null) {
+ final address = Durt.i.walletService.getAddress(defaultWallet.address);
+ await Durt.i.walletService.setDefaultWallet(address);
+ }
await Navigator.push(
context,
diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart
index b83780fcda05a74f785f5c950cd362df9556e6a8..8dfd761e07fceee3f0bc6ddcaf63839b236a04df 100644
--- a/lib/screens/onBoarding/5.dart
+++ b/lib/screens/onBoarding/5.dart
@@ -86,24 +86,24 @@ class _ChooseChestState extends State<OnboardingStepFive> {
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Row(children: <Widget>[
- arrayCell(mnemonicList![0]),
- arrayCell(mnemonicList![1]),
- arrayCell(mnemonicList![2]),
- arrayCell(mnemonicList![3]),
+ arrayCell(1, mnemonicList![0]),
+ arrayCell(2, mnemonicList![1]),
+ arrayCell(3, mnemonicList![2]),
+ arrayCell(4, mnemonicList![3]),
]),
ScaledSizedBox(height: 15),
Row(children: <Widget>[
- arrayCell(mnemonicList![4]),
- arrayCell(mnemonicList![5]),
- arrayCell(mnemonicList![6]),
- arrayCell(mnemonicList![7]),
+ arrayCell(5, mnemonicList![4]),
+ arrayCell(6, mnemonicList![5]),
+ arrayCell(7, mnemonicList![6]),
+ arrayCell(8, mnemonicList![7]),
]),
ScaledSizedBox(height: 15),
Row(children: <Widget>[
- arrayCell(mnemonicList![8]),
- arrayCell(mnemonicList![9]),
- arrayCell(mnemonicList![10]),
- arrayCell(mnemonicList![11]),
+ arrayCell(9, mnemonicList![8]),
+ arrayCell(10, mnemonicList![9]),
+ arrayCell(11, mnemonicList![10]),
+ arrayCell(12, mnemonicList![11]),
]),
],
),
@@ -122,17 +122,17 @@ class _ChooseChestState extends State<OnboardingStepFive> {
);
}
- Widget arrayCell(String dataWord) {
+ Widget arrayCell(int index, String dataWord) {
return ScaledSizedBox(
width: 82,
child: Column(children: <Widget>[
Text(
- dataWord.split(':')[0],
+ index.toString(),
style: scaledTextStyle(fontSize: 10, color: const Color(0xff6b6b52)),
),
Text(
- dataWord.split(':')[1],
- key: keyMnemonicWord(dataWord.split(':')[0]),
+ dataWord,
+ key: keyMnemonicWord(index.toString()),
style: scaledTextStyle(fontSize: 15, color: Colors.black),
),
]),
diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart
index 7170563015f42f3fdfb277372e0045eedea7e1f3..5ff588f8b8bd29c508d3676da59c46b3b7869d55 100644
--- a/lib/screens/settings.dart
+++ b/lib/screens/settings.dart
@@ -1,5 +1,6 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
@@ -41,7 +42,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
_endpointController = TextEditingController(
- text: configBox.containsKey('customEndpoint') ? configBox.get('customEndpoint') : sub.getConnectedEndpoint() ?? 'wss://',
+ text: configBox.containsKey('customEndpoint')
+ ? configBox.get('customEndpoint')
+ : sub.getConnectedEndpoint() ?? 'wss://',
);
_indexerEndpointController = TextEditingController(
@@ -60,7 +63,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
final duniterIndexer = Provider.of<DuniterIndexer>(context);
// Mise à jour du champ node quand le nœud est connecté
- if (sub.nodeConnected && !configBox.containsKey('customEndpoint')) {
+ if (Durt.i.isConnected && !configBox.containsKey('customEndpoint')) {
final endpoint = sub.getConnectedEndpoint();
if (endpoint != null && endpoint != _endpointController.text) {
_endpointController.text = endpoint;
@@ -68,7 +71,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
}
// Mise à jour du champ indexer quand il devient disponible
- if (duniterIndexer.listIndexerEndpoints.isNotEmpty && !configBox.containsKey('customIndexer')) {
+ if (duniterIndexer.listIndexerEndpoints.isNotEmpty &&
+ !configBox.containsKey('customIndexer')) {
final indexerEndpoint = duniterIndexer.listIndexerEndpoints[0];
if (indexerEndpoint != _indexerEndpointController.text) {
_indexerEndpointController.text = indexerEndpoint;
@@ -129,7 +133,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Column(
children: [
Padding(
- padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
+ padding:
+ EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
child: chooseCurrencyUnit(context),
),
],
@@ -176,7 +181,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
}
},
child: Padding(
- padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
+ padding:
+ EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
child: Row(
children: [
Icon(
@@ -226,7 +232,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Column(
children: [
Padding(
- padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
+ padding:
+ EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
child: duniterEndpointSelection(context),
),
],
@@ -250,7 +257,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Column(
children: [
Padding(
- padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
+ padding:
+ EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
child: indexerEndpointSelection(context),
),
],
@@ -274,7 +282,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
- border: Border.all(color: const Color(0xffD80000).withValues(alpha: 0.1)),
+ border: Border.all(
+ color: const Color(0xffD80000).withValues(alpha: 0.1)),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.05),
@@ -290,7 +299,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
await _myWallets.deleteAllWallet(context);
},
child: Padding(
- padding: EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
+ padding:
+ EdgeInsets.all(scaleSize(isSmallScreen ? 10 : 14)),
child: Row(
children: [
Icon(
@@ -363,7 +373,11 @@ class _SettingsScreenState extends State<SettingsScreen> {
);
}
- Future<void> _showNodeSelectionDialog(BuildContext context, List<NetworkParams> nodes, String selectedEndpoint, TextEditingController controller) async {
+ Future<void> _showNodeSelectionDialog(
+ BuildContext context,
+ List<NetworkParams> nodes,
+ String selectedEndpoint,
+ TextEditingController controller) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final set = Provider.of<SettingsProvider>(context, listen: false);
@@ -397,7 +411,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
mainAxisSize: MainAxisSize.min,
children: [
Icon(
- isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
+ isSelected
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
color: isSelected ? orangeC : Colors.grey[400],
size: scaleSize(20),
),
@@ -440,7 +456,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
String? selectedDuniterEndpoint;
var duniterBootstrapNodes = sub.getDuniterBootstrap();
- selectedDuniterEndpoint = sub.getConnectedEndpoint() ?? duniterBootstrapNodes.first.endpoint;
+ selectedDuniterEndpoint =
+ sub.getConnectedEndpoint() ?? duniterBootstrapNodes.first.endpoint;
final customEndpoint = NetworkParams();
customEndpoint.endpoint = 'Personnalisé';
@@ -491,8 +508,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
),
ScaledSizedBox(width: 12),
Icon(
- sub.nodeConnected && !sub.isLoadingEndpoint ? Icons.check_circle : Icons.error,
- color: sub.nodeConnected && !sub.isLoadingEndpoint ? Colors.green : Colors.red,
+ Durt.i.isConnected && !sub.isLoadingEndpoint
+ ? Icons.check_circle
+ : Icons.error,
+ color: Durt.i.isConnected && !sub.isLoadingEndpoint
+ ? Colors.green
+ : Colors.red,
size: scaleSize(16),
),
const Spacer(),
@@ -536,8 +557,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Row(
children: [
Icon(
- configBox.get('autoEndpoint') == true ? Icons.radio_button_checked : Icons.radio_button_unchecked,
- color: configBox.get('autoEndpoint') == true ? orangeC : Colors.grey[400],
+ configBox.get('autoEndpoint') == true
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
+ color: configBox.get('autoEndpoint') == true
+ ? orangeC
+ : Colors.grey[400],
size: scaleSize(20),
),
ScaledSizedBox(width: 12),
@@ -557,8 +582,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Row(
children: [
Icon(
- configBox.get('autoEndpoint') != true ? Icons.radio_button_checked : Icons.radio_button_unchecked,
- color: configBox.get('autoEndpoint') != true ? orangeC : Colors.grey[400],
+ configBox.get('autoEndpoint') != true
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
+ color: configBox.get('autoEndpoint') != true
+ ? orangeC
+ : Colors.grey[400],
size: scaleSize(20),
),
ScaledSizedBox(width: 12),
@@ -599,7 +628,10 @@ class _SettingsScreenState extends State<SettingsScreen> {
await _showNodeSelectionDialog(
context,
duniterBootstrapNodes
- .where((node) => node.endpoint != 'Auto' && node.endpoint != 'Personnalisé' && node.endpoint != 'ws://10.0.2.2:9944')
+ .where((node) =>
+ node.endpoint != 'Auto' &&
+ node.endpoint != 'Personnalisé' &&
+ node.endpoint != 'ws://10.0.2.2:9944')
.toList(),
selectedDuniterEndpoint ?? '',
endpointController,
@@ -612,12 +644,15 @@ class _SettingsScreenState extends State<SettingsScreen> {
} else {
configBox.put('autoEndpoint', false);
if (!configBox.containsKey('customEndpoint')) {
- configBox.put('customEndpoint', _endpointController.text);
+ configBox.put(
+ 'customEndpoint', _endpointController.text);
}
set.reload();
_duniterFocusNode.requestFocus();
- _endpointController.selection = TextSelection.fromPosition(
- TextPosition(offset: _endpointController.text.length),
+ _endpointController.selection =
+ TextSelection.fromPosition(
+ TextPosition(
+ offset: _endpointController.text.length),
);
}
},
@@ -629,7 +664,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (sub.isLoadingEndpoint)
Padding(
padding: EdgeInsets.only(top: scaleSize(16)),
- child: Center(child: Loading(size: scaleSize(24), stroke: 2)),
+ child:
+ Center(child: Loading(size: scaleSize(24), stroke: 2)),
),
],
);
@@ -713,7 +749,11 @@ class _SettingsScreenState extends State<SettingsScreen> {
);
}
- Future<void> _showIndexerSelectionDialog(BuildContext context, List<String> indexers, String selectedEndpoint, TextEditingController controller) async {
+ Future<void> _showIndexerSelectionDialog(
+ BuildContext context,
+ List<String> indexers,
+ String selectedEndpoint,
+ TextEditingController controller) async {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
final set = Provider.of<SettingsProvider>(context, listen: false);
@@ -747,7 +787,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
mainAxisSize: MainAxisSize.min,
children: [
Icon(
- isSelected ? Icons.radio_button_checked : Icons.radio_button_unchecked,
+ isSelected
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
color: isSelected ? orangeC : Colors.grey[400],
size: scaleSize(20),
),
@@ -791,7 +833,9 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (configBox.containsKey('customIndexer')) {
selectedIndexerEndpoint = configBox.get('customIndexer');
} else {
- selectedIndexerEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty ? duniterIndexer.listIndexerEndpoints[0] : 'https://';
+ selectedIndexerEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty
+ ? duniterIndexer.listIndexerEndpoints[0]
+ : 'https://';
}
final indexerEndpointController = _indexerEndpointController;
@@ -868,8 +912,13 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Row(
children: [
Icon(
- !configBox.containsKey('customIndexer') ? Icons.radio_button_checked : Icons.radio_button_unchecked,
- color: !configBox.containsKey('customIndexer') ? orangeC : Colors.grey[400],
+ !configBox.containsKey('customIndexer')
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
+ color:
+ !configBox.containsKey('customIndexer')
+ ? orangeC
+ : Colors.grey[400],
size: scaleSize(20),
),
ScaledSizedBox(width: 12),
@@ -888,8 +937,13 @@ class _SettingsScreenState extends State<SettingsScreen> {
child: Row(
children: [
Icon(
- configBox.containsKey('customIndexer') ? Icons.radio_button_checked : Icons.radio_button_unchecked,
- color: configBox.containsKey('customIndexer') ? orangeC : Colors.grey[400],
+ configBox.containsKey('customIndexer')
+ ? Icons.radio_button_checked
+ : Icons.radio_button_unchecked,
+ color:
+ configBox.containsKey('customIndexer')
+ ? orangeC
+ : Colors.grey[400],
size: scaleSize(20),
),
ScaledSizedBox(width: 12),
@@ -934,19 +988,27 @@ class _SettingsScreenState extends State<SettingsScreen> {
);
} else if (value == 'Auto') {
configBox.delete('customIndexer');
- final defaultEndpoint = duniterIndexer.listIndexerEndpoints.isNotEmpty ? duniterIndexer.listIndexerEndpoints[0] : 'https://';
+ final defaultEndpoint =
+ duniterIndexer.listIndexerEndpoints.isNotEmpty
+ ? duniterIndexer.listIndexerEndpoints[0]
+ : 'https://';
selectedIndexerEndpoint = defaultEndpoint;
indexerEndpointController.text = defaultEndpoint;
- await indexer.checkIndexerEndpoint(defaultEndpoint);
+ await indexer
+ .checkIndexerEndpoint(defaultEndpoint);
set.reload();
} else {
if (!configBox.containsKey('customIndexer')) {
- configBox.put('customIndexer', _indexerEndpointController.text);
+ configBox.put('customIndexer',
+ _indexerEndpointController.text);
}
set.reload();
_indexerFocusNode.requestFocus();
- _indexerEndpointController.selection = TextSelection.fromPosition(
- TextPosition(offset: _indexerEndpointController.text.length),
+ _indexerEndpointController.selection =
+ TextSelection.fromPosition(
+ TextPosition(
+ offset:
+ _indexerEndpointController.text.length),
);
}
},
@@ -958,7 +1020,8 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (indexer.isLoadingIndexer)
Padding(
padding: EdgeInsets.only(top: scaleSize(16)),
- child: Center(child: Loading(size: scaleSize(24), stroke: 2)),
+ child:
+ Center(child: Loading(size: scaleSize(24), stroke: 2)),
),
],
);
diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart
index b5cf4f155ee38d6f8a3e49c430f1fae9d652d9a2..d0ecaf8dd3989fcefcda16452e778b5241a6e462 100644
--- a/lib/screens/wallet_view.dart
+++ b/lib/screens/wallet_view.dart
@@ -1,5 +1,6 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
@@ -23,7 +24,8 @@ const double buttonSize = 75;
const double buttonFontSize = 13;
class WalletViewScreen extends StatefulWidget {
- const WalletViewScreen({required this.address, required this.username, super.key});
+ const WalletViewScreen(
+ {required this.address, required this.username, super.key});
final String address;
final String? username;
@@ -44,20 +46,20 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
@override
Widget build(BuildContext context) {
- final walletProfile = Provider.of<WalletsProfilesProvider>(context, listen: false);
- final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
- final defaultWallet = myWalletProvider.getDefaultWallet();
+ final walletProfile =
+ Provider.of<WalletsProfilesProvider>(context, listen: false);
walletProfile.address = address;
- sub.setCurrentWallet(defaultWallet);
+ Durt.i.walletService.setDefaultWallet(address);
return Scaffold(
backgroundColor: backgroundColor,
resizeToAvoidBottomInset: true,
appBar: WalletAppBar(
address: address,
- titleBuilder: (username) => username == null ? 'seeAWallet'.tr() : 'memberAccountOf'.tr(args: [username]),
+ titleBuilder: (username) => username == null
+ ? 'seeAWallet'.tr()
+ : 'memberAccountOf'.tr(args: [username]),
),
bottomNavigationBar: const GeckoBottomAppBar(),
body: SafeArea(
@@ -87,7 +89,8 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
onTap: () => Navigator.push(
context,
PageNoTransit(
- builder: (context) => ActivityScreen(address: address),
+ builder: (context) =>
+ ActivityScreen(address: address),
),
),
),
@@ -95,11 +98,15 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
builder: (context, sub, _) {
return FutureBuilder(
future: sub.certState(address),
- builder: (context, AsyncSnapshot<CertState> snapshot) {
- if (!snapshot.hasData) return const SizedBox.shrink();
+ builder: (context,
+ AsyncSnapshot<CertState> snapshot) {
+ if (!snapshot.hasData) {
+ return const SizedBox.shrink();
+ }
final certState = snapshot.data!;
return Visibility(
- visible: certState.status != CertStatus.none,
+ visible:
+ certState.status != CertStatus.none,
child: CertStateWidget(
certState: certState,
address: address,
@@ -213,13 +220,15 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
),
),
child: Opacity(
- opacity: sub.nodeConnected ? 1 : 0.5,
+ opacity: Durt.i.isConnected ? 1 : 0.5,
child: Material(
color: Colors.transparent,
child: InkWell(
key: keyPay,
borderRadius: BorderRadius.circular((buttonSize + 5) / 2),
- onTap: sub.nodeConnected ? () => _handleTransfer(context) : null,
+ onTap: Durt.i.isConnected
+ ? () => _handleTransfer(context)
+ : null,
child: Padding(
padding: EdgeInsets.all(scaleSize(15)),
child: Image.asset(
@@ -237,7 +246,7 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.bodySmall?.copyWith(
fontWeight: FontWeight.w500,
- color: sub.nodeConnected ? Colors.black87 : Colors.grey[500],
+ color: Durt.i.isConnected ? Colors.black87 : Colors.grey[500],
),
),
],
@@ -246,7 +255,8 @@ class _WalletViewScreenState extends State<WalletViewScreen> {
}
Future<void> _handleTransfer(BuildContext context) async {
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
diff --git a/lib/services/durt.service.dart b/lib/services/durt.service.dart
deleted file mode 100644
index e39aa6275a9468fb1662d760379095950ecf4df8..0000000000000000000000000000000000000000
--- a/lib/services/durt.service.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-import 'package:durt2/durt2.dart' show Durt, Networks;
-
-class DurtService {
- Future<void> init() async {
- await Durt().init(network: Networks.gdev);
- }
-}
diff --git a/lib/services/wallets.service.dart b/lib/services/wallets.service.dart
deleted file mode 100644
index 061cdce1f626813165df9e9b1c8aced216a2dd5c..0000000000000000000000000000000000000000
--- a/lib/services/wallets.service.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-import 'package:durt2/durt2.dart';
-import 'package:gecko/globals.dart';
-
-class WalletsService {
- Future<void> createSafe({
- required String mnemonic,
- required int pinCode,
- }) async {
- try {
- final keypair = await KeyPair.sr25519.fromMnemonic(mnemonic);
-
- await WalletService.storeMnemonic(
- address: keypair.address,
- mnemonic: mnemonic,
- pinCode: pinCode,
- );
- } catch (e) {
- log.e('Invalid mnemonic: $e');
- }
- }
-
- Future<WalletData?> generateNextDerivation({
- required String pinCode,
- int? safeBoxNumber,
- String? walletName,
- bool setAsDefault = false,
- }) async {
- return await WalletService.generateNextDerivation(
- pinCode: pinCode,
- safeBoxNumber: safeBoxNumber,
- walletName: walletName,
- setAsDefault: setAsDefault,
- );
- }
-
- Mnemonic generateMnemonic(Language language) => WalletService.generateMnemonic(language);
-
- Future<KeyPair?> getKeyPairFromMnemonic(String mnemonic, {int? derivation}) async =>
- await WalletService.getKeyPairFromMnemonic(mnemonic, derivation: derivation);
-
- Future<List<WalletData>> importDerivations({
- required String pinCode,
- required List<int> derivations,
- int? safeBoxNumber,
- }) async =>
- await WalletService.importDerivations(pinCode: pinCode, derivations: derivations, safeBoxNumber: safeBoxNumber);
-
- Future<WalletData?> importRootWallet({
- required String pinCode,
- int? safeBoxNumber,
- }) async =>
- await WalletService.importRootWallet(pinCode: pinCode, safeBoxNumber: safeBoxNumber);
-}
diff --git a/lib/widgets/buttons/add_new_derivation_button.dart b/lib/widgets/buttons/add_new_derivation_button.dart
index 0e621f350697e7a117dd6f03c13e96276e6d42db..bec9623e11f874a6439c4f3bcc57197e9b2f2999 100644
--- a/lib/widgets/buttons/add_new_derivation_button.dart
+++ b/lib/widgets/buttons/add_new_derivation_button.dart
@@ -17,7 +17,7 @@ class AddNewDerivationButton extends StatelessWidget {
Widget build(BuildContext context) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
- String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}';
+ String newDerivationName = '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number + 2}';
return Padding(
padding: EdgeInsets.all(scaleSize(11)),
child: Container(
diff --git a/lib/widgets/buttons/home_buttons.dart b/lib/widgets/buttons/home_buttons.dart
index 16826844cf8a8523ebd97e02e1bf343cd0843aa6..85f54eeddd32fd0d0927ca24fc69d9c4a96ed503 100644
--- a/lib/widgets/buttons/home_buttons.dart
+++ b/lib/widgets/buttons/home_buttons.dart
@@ -1,10 +1,10 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart';
diff --git a/lib/widgets/certify/certify_button.dart b/lib/widgets/certify/certify_button.dart
index 17aaffd72046031cd445f17f3b26a91c29f7960c..195348e95a6c05756a0560ba9ddc75a4d8f812e7 100644
--- a/lib/widgets/certify/certify_button.dart
+++ b/lib/widgets/certify/certify_button.dart
@@ -1,5 +1,6 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
@@ -24,7 +25,8 @@ class CertifyButton extends StatelessWidget {
Widget build(BuildContext context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
return Column(
children: <Widget>[
@@ -44,20 +46,25 @@ class CertifyButton extends StatelessWidget {
final result = await showConfirmationDialog(
context: context,
- title: walletName != null ? 'certification'.tr() : 'identityCreation'.tr(),
+ title: walletName != null
+ ? 'certification'.tr()
+ : 'identityCreation'.tr(),
message: message,
- type: walletName != null ? ConfirmationDialogType.question : ConfirmationDialogType.info,
+ type: walletName != null
+ ? ConfirmationDialogType.question
+ : ConfirmationDialogType.info,
);
if (!result) return;
- await sub.setCurrentWallet(myWalletProvider.idtyWallet!);
+ await Durt.i.walletService.setDefaultWallet(address);
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
- return UnlockingWallet(wallet: myWalletProvider.idtyWallet!);
+ return UnlockingWallet(
+ wallet: myWalletProvider.idtyWallet!);
},
),
);
@@ -65,7 +72,9 @@ class CertifyButton extends StatelessWidget {
if (myWalletProvider.pinCode == '') {
return;
}
- WalletsProfilesProvider walletViewProvider = Provider.of<WalletsProfilesProvider>(context, listen: false);
+ WalletsProfilesProvider walletViewProvider =
+ Provider.of<WalletsProfilesProvider>(context,
+ listen: false);
final acc = sub.getCurrentKeyPair();
final transactionId = await sub.certify(
acc.address!,
@@ -96,7 +105,8 @@ class CertifyButton extends StatelessWidget {
child: Text(
"certify".tr(),
textAlign: TextAlign.center,
- style: scaledTextStyle(fontSize: buttonFontSize, fontWeight: FontWeight.w500),
+ style: scaledTextStyle(
+ fontSize: buttonFontSize, fontWeight: FontWeight.w500),
),
),
],
diff --git a/lib/widgets/commons/offline_info.dart b/lib/widgets/commons/offline_info.dart
index 0ace80e91c904c75fdcccaff39696a5cdc1a67e8..6aef7452cfbff72dea51f49d78612d77dbaeee4a 100644
--- a/lib/widgets/commons/offline_info.dart
+++ b/lib/widgets/commons/offline_info.dart
@@ -1,3 +1,4 @@
+import 'package:durt2/durt2.dart' show Durt;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
@@ -14,7 +15,7 @@ class OfflineInfo extends StatelessWidget {
final screenWidth = MediaQuery.of(homeContext).size.width;
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return Visibility(
- visible: !sub.nodeConnected,
+ visible: !Durt.i.isConnected,
child: Positioned(
top: 0,
child: Container(
diff --git a/lib/widgets/contacts_list.dart b/lib/widgets/contacts_list.dart
index caa43a35c7eb2fa98c00949e6f979d2c8882578a..d3478d29fa8789b403c5775e034707ebb8823733 100644
--- a/lib/widgets/contacts_list.dart
+++ b/lib/widgets/contacts_list.dart
@@ -1,9 +1,9 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/wallets_profiles.dart';
diff --git a/lib/widgets/drag_tule_action.dart b/lib/widgets/drag_tule_action.dart
index 5fc1e07c87b48d90b8e92f002839b97def69c124..184abd4607c6287f09945ac8e1ca5bf602150d89 100644
--- a/lib/widgets/drag_tule_action.dart
+++ b/lib/widgets/drag_tule_action.dart
@@ -1,9 +1,9 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt, WalletData;
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/widgets/payment_popup.dart';
@@ -22,7 +22,8 @@ class DragTuleAction extends StatelessWidget {
return LongPressDraggable<String>(
delay: const Duration(milliseconds: 200),
data: wallet.address,
- dragAnchorStrategy: (Draggable<Object> _, BuildContext __, Offset ___) => const Offset(55, 55),
+ dragAnchorStrategy: (Draggable<Object> _, BuildContext __, Offset ___) =>
+ const Offset(55, 55),
onDragStarted: () => myWalletProvider.dragAddress = wallet,
onDragEnd: (_) {
myWalletProvider.lastFlyBy = null;
@@ -43,10 +44,12 @@ class DragTuleAction extends StatelessWidget {
),
child: DragTarget<String>(
onAcceptWithDetails: (senderAddress) async {
- final walletData = myWalletProvider.getWalletDataByAddress(senderAddress.data);
- await sub.setCurrentWallet(walletData!);
+ final walletData =
+ myWalletProvider.getWalletDataByAddress(senderAddress.data);
+ await Durt.i.walletService.setDefaultWallet(walletData!.address);
sub.reload();
- paymentPopup(context, wallet.address, g1WalletsBox.get(wallet.address)!.username ?? wallet.name!);
+ paymentPopup(context, wallet.address,
+ g1WalletsBox.get(wallet.address)!.username ?? wallet.name!);
},
onMove: (details) {
if (wallet.address != myWalletProvider.lastFlyBy?.address) {
@@ -54,7 +57,8 @@ class DragTuleAction extends StatelessWidget {
myWalletProvider.reload();
}
},
- onWillAcceptWithDetails: (senderAddress) => senderAddress.data != wallet.address,
+ onWillAcceptWithDetails: (senderAddress) =>
+ senderAddress.data != wallet.address,
builder: (
BuildContext context,
List<dynamic> accepted,
diff --git a/lib/widgets/drag_wallets_info.dart b/lib/widgets/drag_wallets_info.dart
index c02c288e638fbd4b45edfffafca3b36ad6af6546..e567f258e00c0e30b448ce61121f2825f5c58be6 100644
--- a/lib/widgets/drag_wallets_info.dart
+++ b/lib/widgets/drag_wallets_info.dart
@@ -1,15 +1,14 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:provider/provider.dart';
class DragWalletsInfo extends StatelessWidget {
- const DragWalletsInfo(
- {super.key, required this.dragAddress, required this.lastFlyBy});
+ const DragWalletsInfo({super.key, required this.dragAddress, required this.lastFlyBy});
final WalletData dragAddress;
final WalletData lastFlyBy;
@@ -22,11 +21,9 @@ class DragWalletsInfo extends StatelessWidget {
final screenWidth = MediaQuery.of(homeContext).size.width;
- final fromName = duniterIndexer.walletNameIndexer[dragAddress.address] ??
- dragAddress.name;
+ final fromName = duniterIndexer.walletNameIndexer[dragAddress.address] ?? dragAddress.name;
- final toName =
- duniterIndexer.walletNameIndexer[lastFlyBy.address] ?? lastFlyBy.name;
+ final toName = duniterIndexer.walletNameIndexer[lastFlyBy.address] ?? lastFlyBy.name;
final mdStyle = MarkdownStyleSheet(
p: scaledTextStyle(fontSize: 15, color: Colors.black, letterSpacing: 0.3),
textAlign: WrapAlignment.spaceBetween,
@@ -44,18 +41,13 @@ class DragWalletsInfo extends StatelessWidget {
'${'executeATransfer'.tr()}:',
style: scaledTextStyle(fontSize: 15),
),
- MarkdownBody(
- data: '${'from'.tr(args: [''])} **$fromName**',
- styleSheet: mdStyle),
+ MarkdownBody(data: '${'from'.tr(args: [''])} **$fromName**', styleSheet: mdStyle),
if (isSameAddress)
Text(
'chooseATargetWallet'.tr(),
style: scaledTextStyle(fontSize: 15),
),
- if (!isSameAddress)
- MarkdownBody(
- data: '${'to'.tr(args: [''])} **$toName**',
- styleSheet: mdStyle),
+ if (!isSameAddress) MarkdownBody(data: '${'to'.tr(args: [''])} **$toName**', styleSheet: mdStyle),
],
)),
);
diff --git a/lib/widgets/idty_status.dart b/lib/widgets/idty_status.dart
index a9fda4baa9c94623b3d3676c74a708f96ad3b751..bd221e0a25b5acc566b969e7f18c842d1f478e6e 100644
--- a/lib/widgets/idty_status.dart
+++ b/lib/widgets/idty_status.dart
@@ -1,21 +1,22 @@
+import 'package:durt2/durt2.dart' show Durt, IdtyStatus, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
-import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/widgets/commons/animated_text.dart';
import 'package:gecko/widgets/name_by_address.dart';
import 'package:provider/provider.dart';
class IdentityStatus extends StatelessWidget {
- const IdentityStatus({super.key, required this.address, this.color = Colors.black});
+ const IdentityStatus(
+ {super.key, required this.address, this.color = Colors.black});
final String address;
final Color color;
@override
Widget build(BuildContext context) {
- final walletData = walletBox.get(address) ?? WalletData(address: address);
+ final walletData = Durt.i.walletService.walletDataBox.get(address) ??
+ WalletData(address: address);
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder(
@@ -25,21 +26,31 @@ class IdentityStatus extends StatelessWidget {
if (snapshot.data != null && !snapshot.hasError) {
final resStatus = snapshot.data!.first;
walletData.identityStatus = resStatus;
- walletBox.put(address, walletData);
+ Durt.i.walletService.walletDataBox.put(address, walletData);
}
final resStatus = walletData.identityStatus;
- final nameByAddress = resStatus == IdtyStatus.member
- ? NameByAddress(wallet: walletData, size: 18, color: Colors.black, fontWeight: FontWeight.w500, fontStyle: FontStyle.normal)
- : NameByAddress(wallet: walletData, size: 16, color: Colors.grey[700]!, fontWeight: FontWeight.w500, fontStyle: FontStyle.italic);
+ final nameByAddress = resStatus == IdtyStatus.validated
+ ? NameByAddress(
+ wallet: walletData,
+ size: 18,
+ color: Colors.black,
+ fontWeight: FontWeight.w500,
+ fontStyle: FontStyle.normal)
+ : NameByAddress(
+ wallet: walletData,
+ size: 16,
+ color: Colors.grey[700]!,
+ fontWeight: FontWeight.w500,
+ fontStyle: FontStyle.italic);
final Map<IdtyStatus, String> statusText = {
IdtyStatus.none: '',
- IdtyStatus.unconfirmed: 'identityCreated'.tr(),
- IdtyStatus.unvalidated: 'identityConfirmed'.tr(),
- IdtyStatus.member: 'memberValidated'.tr(),
- IdtyStatus.notMember: 'identityExpired'.tr(),
+ IdtyStatus.created: 'identityCreated'.tr(),
+ IdtyStatus.confirmed: 'identityConfirmed'.tr(),
+ IdtyStatus.validated: 'memberValidated'.tr(),
+ IdtyStatus.expired: 'identityExpired'.tr(),
IdtyStatus.revoked: 'identityRevoked'.tr(),
IdtyStatus.unknown: ''
};
@@ -48,21 +59,27 @@ class IdentityStatus extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
nameByAddress,
- showText(statusText[resStatus]!, bold: resStatus == IdtyStatus.member, size: scaleSize(15)),
+ showText(statusText[resStatus]!,
+ bold: resStatus == IdtyStatus.validated,
+ size: scaleSize(15)),
],
);
});
});
}
- AnimatedFadeOutIn showText(String text, {double size = 18, bool bold = false}) {
+ AnimatedFadeOutIn showText(String text,
+ {double size = 18, bool bold = false}) {
return AnimatedFadeOutIn<String>(
data: text,
duration: const Duration(milliseconds: 150),
builder: (value) => Text(
value,
textAlign: TextAlign.center,
- style: TextStyle(fontSize: size, color: bold ? color : Colors.black, fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
+ style: TextStyle(
+ fontSize: size,
+ color: bold ? color : Colors.black,
+ fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
),
);
}
diff --git a/lib/widgets/name_by_address.dart b/lib/widgets/name_by_address.dart
index 49ee3ba85da9c351da8202b704b77b9d0018736a..ca2724bca0ab147a197c8a60819416b66b907562 100644
--- a/lib/widgets/name_by_address.dart
+++ b/lib/widgets/name_by_address.dart
@@ -1,10 +1,10 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/widgets/commons/loading.dart';
import 'package:gecko/widgets/wallet_name.dart';
diff --git a/lib/widgets/payment_popup.dart b/lib/widgets/payment_popup.dart
index 7e2cc0a38a70ebf723876016adf7394553eb7585..9727898f8e96f4db0328f24dbb77469056ad50ec 100644
--- a/lib/widgets/payment_popup.dart
+++ b/lib/widgets/payment_popup.dart
@@ -1,12 +1,12 @@
// ignore_for_file: use_build_context_synchronously
+import 'package:durt2/durt2.dart' show Durt, WalletData;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/text_input_formaters.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
@@ -21,8 +21,10 @@ import 'package:url_launcher/url_launcher.dart';
import 'package:uuid/uuid.dart';
void paymentPopup(BuildContext context, String toAddress, String? username) {
- final walletViewProvider = Provider.of<WalletsProfilesProvider>(context, listen: false);
- final myWalletProvider = Provider.of<MyWalletsProvider>(context, listen: false);
+ final walletViewProvider =
+ Provider.of<WalletsProfilesProvider>(context, listen: false);
+ final myWalletProvider =
+ Provider.of<MyWalletsProvider>(context, listen: false);
double fees = 0;
const double shapeSize = 16;
@@ -77,12 +79,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
if (payAmount.isEmpty) return false;
// Récupération des soldes
- final walletOptions = Provider.of<WalletOptionsProvider>(context, listen: false);
- final defaultWalletBalance = walletOptions.balanceCache[defaultWallet.address] ?? 0;
+ final walletOptions =
+ Provider.of<WalletOptionsProvider>(context, listen: false);
+ final defaultWalletBalance =
+ walletOptions.balanceCache[defaultWallet.address] ?? 0;
final toAddressBalance = walletOptions.balanceCache[toAddress] ?? 0;
// Conversion du montant en unités de base
- final int payAmountValue = balanceRatio == 1 ? (double.parse(payAmount) * balanceRatio * 100).round() : (double.parse(payAmount) * balanceRatio).round();
+ final int payAmountValue = balanceRatio == 1
+ ? (double.parse(payAmount) * balanceRatio * 100).round()
+ : (double.parse(payAmount) * balanceRatio).round();
// TODO: récupérer la valeur réelle de l'existential deposit depuis le storage de Duniter
const existentialDeposit = 200;
@@ -90,13 +96,20 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
// Vérifications de validité
final bool isAmountValid = payAmountValue > 0;
final bool isNotSendingToSelf = toAddress != defaultWallet.address;
- final bool hasEnoughBalance = payAmountValue <= defaultWalletBalance - existentialDeposit || defaultWalletBalance == payAmountValue;
- final bool respectsExistentialDeposit = toAddressBalance > 0 || payAmountValue >= existentialDeposit;
+ final bool hasEnoughBalance =
+ payAmountValue <= defaultWalletBalance - existentialDeposit ||
+ defaultWalletBalance == payAmountValue;
+ final bool respectsExistentialDeposit =
+ toAddressBalance > 0 || payAmountValue >= existentialDeposit;
- return isAmountValid && isNotSendingToSelf && hasEnoughBalance && respectsExistentialDeposit;
+ return isAmountValid &&
+ isNotSendingToSelf &&
+ hasEnoughBalance &&
+ respectsExistentialDeposit;
}
- myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets.sort((a, b) => (a.derivation ?? -1).compareTo(b.derivation ?? -1)));
+ myWalletProvider.readAllWallets().then((value) => myWalletProvider.listWallets
+ .sort((a, b) => (a.derivation ?? -1).compareTo(b.derivation ?? -1)));
showModalBottomSheet<void>(
shape: const RoundedRectangleBorder(
@@ -112,7 +125,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
// Si l'écran est trop petit, on utilisera 90% de sa hauteur.
final screenHeight = MediaQuery.of(context).size.height;
final double desiredHeight = scaleSize(380);
- final double bottomSheetHeight = screenHeight < desiredHeight ? screenHeight * 0.9 : desiredHeight;
+ final double bottomSheetHeight =
+ screenHeight < desiredHeight ? screenHeight * 0.9 : desiredHeight;
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
@@ -121,7 +135,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
canValidate = canValidatePayment();
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return Padding(
- padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
+ padding: EdgeInsets.only(
+ bottom: MediaQuery.of(context).viewInsets.bottom),
child: Container(
// On fixe la hauteur maximale du bottom sheet
height: bottomSheetHeight,
@@ -156,7 +171,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
children: [
Text(
'executeATransfer'.tr(),
- style: scaledTextStyle(fontSize: 17, fontWeight: FontWeight.w700),
+ style: scaledTextStyle(
+ fontSize: 17, fontWeight: FontWeight.w700),
),
IconButton(
key: keyPopButton,
@@ -171,14 +187,20 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
ScaledSizedBox(height: 4),
Text(
'from'.tr(args: ['']),
- style: scaledTextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: Colors.grey[600]),
+ style: scaledTextStyle(
+ fontSize: 14,
+ fontWeight: FontWeight.w500,
+ color: Colors.grey[600]),
),
ScaledSizedBox(height: 4),
Consumer<SubstrateSdk>(builder: (context, sub, _) {
return Container(
decoration: BoxDecoration(
- border: Border.all(color: Colors.blueAccent.shade200, width: 1.5),
- borderRadius: const BorderRadius.all(Radius.circular(8)),
+ border: Border.all(
+ color: Colors.blueAccent.shade200,
+ width: 1.5),
+ borderRadius:
+ const BorderRadius.all(Radius.circular(8)),
),
alignment: Alignment.center,
padding: const EdgeInsets.all(0),
@@ -189,17 +211,21 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
value: defaultWallet,
menuMaxHeight: scaleSize(270),
onTap: () {
- FocusScope.of(context).requestFocus(amountFocus);
+ FocusScope.of(context)
+ .requestFocus(amountFocus);
},
selectedItemBuilder: (_) {
- return myWalletProvider.listWallets.map((WalletData wallet) {
+ return myWalletProvider.listWallets
+ .map((WalletData wallet) {
return Container(
width: scaleSize(isTall ? 315 : 310),
padding: EdgeInsets.all(scaleSize(7)),
child: Visibility(
- visible: wallet.address == defaultWallet.address,
+ visible: wallet.address ==
+ defaultWallet.address,
child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
children: [
NameByAddress(
wallet: wallet,
@@ -207,21 +233,26 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
size: 16,
),
const Spacer(),
- Balance(address: wallet.address, size: 16),
+ Balance(
+ address: wallet.address,
+ size: 16),
],
),
),
);
}).toList();
},
- onChanged: (WalletData? newSelectedWallet) async {
+ onChanged:
+ (WalletData? newSelectedWallet) async {
defaultWallet = newSelectedWallet!;
- await sub.setCurrentWallet(newSelectedWallet);
+ await Durt.i.walletService.setDefaultWallet(
+ newSelectedWallet.address);
sub.reload();
amountFocus.requestFocus();
setState(() {});
},
- items: myWalletProvider.listWallets.map((WalletData wallet) {
+ items: myWalletProvider.listWallets
+ .map((WalletData wallet) {
return DropdownMenuItem(
value: wallet,
key: keySelectThisWallet(wallet.address),
@@ -230,7 +261,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
width: scaleSize(isTall ? 315 : 310),
padding: const EdgeInsets.all(10),
child: Row(
- mainAxisAlignment: MainAxisAlignment.center,
+ mainAxisAlignment:
+ MainAxisAlignment.center,
children: [
NameByAddress(
wallet: wallet,
@@ -238,7 +270,9 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
size: 16,
),
const Spacer(),
- Balance(address: wallet.address, size: 16),
+ Balance(
+ address: wallet.address,
+ size: 16),
],
),
),
@@ -252,12 +286,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
children: [
Text(
'to'.tr(args: ['']),
- style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]),
+ style: scaledTextStyle(
+ fontSize: 15,
+ fontWeight: FontWeight.w500,
+ color: Colors.grey[600]),
),
ScaledSizedBox(width: 10),
Text(
username ?? getShortPubkey(toAddress),
- style: scaledTextStyle(fontSize: 17, fontWeight: FontWeight.w600),
+ style: scaledTextStyle(
+ fontSize: 17, fontWeight: FontWeight.w600),
),
],
),
@@ -266,7 +304,10 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
children: [
Text(
'amount'.tr(),
- style: scaledTextStyle(fontSize: 15, fontWeight: FontWeight.w500, color: Colors.grey[600]),
+ style: scaledTextStyle(
+ fontSize: 15,
+ fontWeight: FontWeight.w500,
+ color: Colors.grey[600]),
),
const Spacer(),
if (fees > 0)
@@ -274,10 +315,14 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
onTap: () => infoFeesPopup(context),
child: Row(
children: [
- Icon(Icons.info_outlined, color: orangeC, size: scaleSize(21)),
+ Icon(Icons.info_outlined,
+ color: orangeC, size: scaleSize(21)),
ScaledSizedBox(width: 5),
Text(
- 'fees'.tr(args: [fees.toString(), currencyName]),
+ 'fees'.tr(args: [
+ fees.toString(),
+ currencyName
+ ]),
style: scaledTextStyle(
color: orangeC,
fontSize: 13,
@@ -295,7 +340,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
onFocusChange: (focused) {
if (!commentFocus.hasFocus) {
setState(() {
- FocusScope.of(context).requestFocus(amountFocus);
+ FocusScope.of(context)
+ .requestFocus(amountFocus);
});
}
},
@@ -315,18 +361,25 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
maxLines: 1,
textAlign: TextAlign.center,
autocorrect: false,
- keyboardType: const TextInputType.numberWithOptions(decimal: true),
+ keyboardType:
+ const TextInputType.numberWithOptions(
+ decimal: true),
onChanged: (_) async {
fees = await sub.txFees(
defaultWallet.address,
toAddress,
- double.parse(walletViewProvider.payAmount.text == '' ? '0' : walletViewProvider.payAmount.text),
+ double.parse(
+ walletViewProvider.payAmount.text == ''
+ ? '0'
+ : walletViewProvider.payAmount.text),
);
setState(() {});
},
inputFormatters: <TextInputFormatter>[
- FilteringTextInputFormatter.deny(',', replacementString: '.'),
- FilteringTextInputFormatter.allow(RegExp(r'(^\d+\.?\d{0,2})')),
+ FilteringTextInputFormatter.deny(',',
+ replacementString: '.'),
+ FilteringTextInputFormatter.allow(
+ RegExp(r'(^\d+\.?\d{0,2})')),
],
decoration: InputDecoration(
hintText: '0.00',
@@ -337,20 +390,27 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
filled: true,
fillColor: Colors.transparent,
focusedBorder: OutlineInputBorder(
- borderSide: BorderSide(color: Colors.grey[500]!, width: 1.5),
+ borderSide: BorderSide(
+ color: Colors.grey[500]!, width: 1.5),
borderRadius: BorderRadius.circular(8),
),
contentPadding: EdgeInsets.all(scaleSize(6)),
),
- style: scaledTextStyle(fontSize: 22, color: Colors.black, fontWeight: FontWeight.w600),
+ style: scaledTextStyle(
+ fontSize: 22,
+ color: Colors.black,
+ fontWeight: FontWeight.w600),
),
),
- if (walletViewProvider.isCommentVisible) const SizedBox(height: 8),
+ if (walletViewProvider.isCommentVisible)
+ const SizedBox(height: 8),
Consumer<WalletsProfilesProvider>(
builder: (context, provider, _) {
return AnimatedCrossFade(
duration: const Duration(milliseconds: 200),
- crossFadeState: provider.isCommentVisible ? CrossFadeState.showSecond : CrossFadeState.showFirst,
+ crossFadeState: provider.isCommentVisible
+ ? CrossFadeState.showSecond
+ : CrossFadeState.showFirst,
firstChild: TextButton.icon(
style: TextButton.styleFrom(
padding: EdgeInsets.symmetric(
@@ -365,11 +425,15 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
),
label: Text(
'addComment'.tr(),
- style: scaledTextStyle(fontSize: 13, color: Colors.grey[600], fontWeight: FontWeight.w500),
+ style: scaledTextStyle(
+ fontSize: 13,
+ color: Colors.grey[600],
+ fontWeight: FontWeight.w500),
),
onPressed: () {
provider.toggleCommentVisibility();
- Future.delayed(const Duration(milliseconds: 250), () {
+ Future.delayed(
+ const Duration(milliseconds: 250), () {
if (context.mounted) {
amountFocus.unfocus();
commentFocus.requestFocus();
@@ -384,19 +448,25 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
TextField(
controller: provider.payComment,
focusNode: commentFocus,
- onChanged: (value) => provider.comment = value,
+ onChanged: (value) =>
+ provider.comment = value,
inputFormatters: [
- Utf8LengthLimitingTextInputFormatter(146),
+ Utf8LengthLimitingTextInputFormatter(
+ 146),
],
textInputAction: TextInputAction.done,
onEditingComplete: () async {
- if (canValidate) await executeTransfert();
+ if (canValidate) {
+ await executeTransfert();
+ }
},
maxLines: 1,
- style: scaledTextStyle(fontSize: 13, color: Colors.black87),
+ style: scaledTextStyle(
+ fontSize: 13, color: Colors.black87),
decoration: InputDecoration(
hintText: 'optionalComment'.tr(),
- hintStyle: TextStyle(color: Colors.grey[400]),
+ hintStyle:
+ TextStyle(color: Colors.grey[400]),
filled: true,
fillColor: Colors.white.withAlpha(128),
contentPadding: EdgeInsets.symmetric(
@@ -420,14 +490,16 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
},
),
border: OutlineInputBorder(
- borderRadius: BorderRadius.circular(8),
+ borderRadius:
+ BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.grey[300]!,
width: 1,
),
),
focusedBorder: OutlineInputBorder(
- borderRadius: BorderRadius.circular(8),
+ borderRadius:
+ BorderRadius.circular(8),
borderSide: BorderSide(
color: Colors.grey[400]!,
width: 1.5,
@@ -458,7 +530,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
: null,
child: Text(
'executeTheTransfer'.tr(),
- style: scaledTextStyle(fontSize: 16, fontWeight: FontWeight.w600),
+ style: scaledTextStyle(
+ fontSize: 16, fontWeight: FontWeight.w600),
),
),
),
@@ -536,7 +609,8 @@ Future<void> infoFeesPopup(BuildContext context) async {
padding: const EdgeInsets.all(8),
child: Text(
'gotit'.tr(),
- style: scaledTextStyle(fontSize: 20, color: const Color(0xffD80000)),
+ style: scaledTextStyle(
+ fontSize: 20, color: const Color(0xffD80000)),
),
),
onPressed: () {
diff --git a/lib/widgets/search_result_list.dart b/lib/widgets/search_result_list.dart
index 752e118c993ccd67235147c9eb0d6a1002ae5692..47c9fe2c80764dde5455260f13ca74b043b1328e 100644
--- a/lib/widgets/search_result_list.dart
+++ b/lib/widgets/search_result_list.dart
@@ -1,7 +1,7 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:flutter/material.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/search.dart';
diff --git a/lib/widgets/wallet_header.dart b/lib/widgets/wallet_header.dart
index fafed280a50f516e2ae5be6c581e298fc804c147..850cec57ed0f1decfa98b5b3029aa8b4216c3fca 100644
--- a/lib/widgets/wallet_header.dart
+++ b/lib/widgets/wallet_header.dart
@@ -1,11 +1,11 @@
// ignore_for_file: use_build_context_synchronously
import 'dart:io';
+import 'package:durt2/durt2.dart' show IdtyStatus;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/my_wallets.dart';
diff --git a/lib/widgets/wallet_name.dart b/lib/widgets/wallet_name.dart
index 735c1fc40bbc33ecd43e405022660cb814e1612c..6d9436dc3bcb7844668ddc01d15ebc09e8d40f7f 100644
--- a/lib/widgets/wallet_name.dart
+++ b/lib/widgets/wallet_name.dart
@@ -1,6 +1,6 @@
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
class WalletName extends StatelessWidget {
const WalletName({
diff --git a/lib/widgets/wallet_tile.dart b/lib/widgets/wallet_tile.dart
index 4340ce249c5aa4f82ce656447ffcb0988e2370e6..72e428862568224b7372b72a093c3b82a20ef186 100644
--- a/lib/widgets/wallet_tile.dart
+++ b/lib/widgets/wallet_tile.dart
@@ -1,8 +1,8 @@
import 'dart:io';
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/v2s_datapod.dart';
@@ -22,8 +22,6 @@ class WalletTile extends StatelessWidget {
@override
Widget build(BuildContext context) {
- repository.getDatapodAvatar();
-
return Padding(
padding: EdgeInsets.all(scaleSize(11)),
child: GestureDetector(
@@ -74,11 +72,11 @@ class WalletTile extends StatelessWidget {
],
),
),
- child: repository.imageCustomPath == null || repository.imageCustomPath == ''
+ child: repository.imagePath == null || repository.imagePath == ''
? Padding(
padding: EdgeInsets.all(scaleSize(16)),
child: Image.asset(
- 'assets/avatars/${repository.imageDefaultPath}',
+ 'assets/avatars/${repository.imagePath}',
alignment: Alignment.bottomCenter,
),
)
@@ -89,7 +87,7 @@ class WalletTile extends StatelessWidget {
image: DecorationImage(
fit: BoxFit.fitHeight,
image: FileImage(
- File(repository.imageCustomPath!),
+ File(repository.imagePath!),
),
),
),
diff --git a/lib/widgets/wallet_tile_membre.dart b/lib/widgets/wallet_tile_membre.dart
index 7e9f7e1affd69567265ee4203a88a2f56caf6987..4045fd8944e4a28b6bbae3ecc2f38780ac3859d4 100644
--- a/lib/widgets/wallet_tile_membre.dart
+++ b/lib/widgets/wallet_tile_membre.dart
@@ -1,8 +1,8 @@
import 'dart:io';
+import 'package:durt2/durt2.dart' show WalletData;
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
-import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/v2s_datapod.dart';
@@ -20,8 +20,6 @@ class WalletTileMembre extends StatelessWidget {
@override
Widget build(BuildContext context) {
- wallet.getDatapodAvatar();
-
return Padding(
padding: EdgeInsets.symmetric(horizontal: scaleSize(52), vertical: scaleSize(15)),
child: GestureDetector(
@@ -75,11 +73,11 @@ class WalletTileMembre extends StatelessWidget {
],
),
),
- child: wallet.imageCustomPath == null || wallet.imageCustomPath == ''
+ child: wallet.imagePath == null || wallet.imagePath == ''
? Padding(
padding: EdgeInsets.all(scaleSize(16)),
child: Image.asset(
- 'assets/avatars/${wallet.imageDefaultPath}',
+ 'assets/avatars/${wallet.imagePath}',
alignment: Alignment.bottomCenter,
),
)
@@ -90,7 +88,7 @@ class WalletTileMembre extends StatelessWidget {
image: DecorationImage(
fit: BoxFit.fitHeight,
image: FileImage(
- File(wallet.imageCustomPath!),
+ File(wallet.imagePath!),
),
),
),
diff --git a/pubspec.lock b/pubspec.lock
index 9b3be6503ebe772b593525abe70799764ef7e18a..b6bd8d5a3e6b75f4c14a90e543168337a50c6a8f 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -346,10 +346,10 @@ packages:
dependency: transitive
description:
name: dart_style
- sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820"
+ sha256: "27eb0ae77836989a3bc541ce55595e8ceee0992807f14511552a898ddd0d88ac"
url: "https://pub.dev"
source: hosted
- version: "2.3.8"
+ version: "3.0.1"
dbus:
dependency: transitive
description:
@@ -393,10 +393,10 @@ packages:
durt2:
dependency: "direct main"
description:
- path: "../../durt2"
+ path: "../durt2"
relative: true
source: path
- version: "0.1.0"
+ version: "0.2.0"
easy_localization:
dependency: "direct main"
description:
@@ -848,10 +848,10 @@ packages:
dependency: transitive
description:
name: graphql
- sha256: b90f3faa525fed0d8b57f528af913cf1363e1d77f287004d3a15ce699fa866ee
+ sha256: "735bbbaa4db10d38054932e726d291bdd46e46e0575cd482a74b0615b8622e1c"
url: "https://pub.dev"
source: hosted
- version: "5.2.0-beta.9"
+ version: "5.2.1"
graphql_flutter:
dependency: "direct main"
description:
@@ -1445,34 +1445,34 @@ packages:
dependency: transitive
description:
name: polkadart
- sha256: a3a5d0a3857f1fa4d3413cdeb2cbc3aee8aa8a8860df34236e13350dfe62fe51
+ sha256: b2369eeb33ee155dcdf2a7af18de8961037b9cc28640e200f1475cea497bc3ab
url: "https://pub.dev"
source: hosted
- version: "0.6.1"
+ version: "0.7.1"
polkadart_cli:
dependency: transitive
description:
name: polkadart_cli
- sha256: a2aaad2fe19edfc7e2ffc7f27a898b6aef3d2e5a0452f75a8351f54e55779852
+ sha256: "3c2371134031c518b7728e24fd1b5dbcce98a364c97dd5a89518cccfc7222712"
url: "https://pub.dev"
source: hosted
- version: "0.6.1"
+ version: "0.7.1"
polkadart_keyring:
dependency: transitive
description:
name: polkadart_keyring
- sha256: "3bb8b0a8053efc5b722a113f3d12842178a832cd3d0733e00bae10c2246c70db"
+ sha256: e99a93c845466dfb53e23bf650bd6ccd772d7cefe7c7ff2c93c6e86d387e5215
url: "https://pub.dev"
source: hosted
- version: "0.6.1"
+ version: "0.7.0"
polkadart_scale_codec:
dependency: transitive
description:
name: polkadart_scale_codec
- sha256: "2eec792030deab36e48f035230f235afd3bcf2db4cd4490c9c1f6a51b57594b2"
+ sha256: db0d61adc58d8b395e663558ba6b2aed2ab2291d343733c49c693de62a2498d2
url: "https://pub.dev"
source: hosted
- version: "1.4.2"
+ version: "1.5.0"
polkawallet_sdk:
dependency: "direct main"
description:
@@ -1776,13 +1776,13 @@ packages:
source: sdk
version: "0.0.0"
source_gen:
- dependency: transitive
+ dependency: "direct overridden"
description:
name: source_gen
- sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
+ sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
url: "https://pub.dev"
source: hosted
- version: "1.5.0"
+ version: "2.0.0"
source_helper:
dependency: transitive
description:
@@ -1811,10 +1811,10 @@ packages:
dependency: transitive
description:
name: sr25519
- sha256: e4495d8c86d90610931693565c16277503a3799da9814f3745b7123b5f85659d
+ sha256: "122c930a933da6af018ec4a2ccdb853a7d0eb1a0891bfb03467e366b56f86f12"
url: "https://pub.dev"
source: hosted
- version: "0.6.1"
+ version: "0.7.0"
ss58:
dependency: transitive
description:
@@ -1867,18 +1867,18 @@ packages:
dependency: transitive
description:
name: substrate_bip39
- sha256: "256f440b45e33a37a374eb2a6a83ff879ecefb67b28a0b15599f09c8d920f6e3"
+ sha256: ba880015808079804f40a0fde8c5bff0315ec6792fe3a4281a704e408f1c6bdb
url: "https://pub.dev"
source: hosted
- version: "0.6.1"
+ version: "0.7.0"
substrate_metadata:
dependency: transitive
description:
name: substrate_metadata
- sha256: "22d1909dafa574edf279bb46da3cd8e5ce26f8607fd32e40e1371d66dab66c3a"
+ sha256: "6f9e9e3e1078c0c143dd63824043370b9df582d34c431a759253ce2f9cbb7f13"
url: "https://pub.dev"
source: hosted
- version: "1.4.1"
+ version: "1.5.0"
sync_http:
dependency: transitive
description:
@@ -2111,14 +2111,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.7.3"
+ web_socket:
+ dependency: transitive
+ description:
+ name: web_socket
+ sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.1"
web_socket_channel:
dependency: transitive
description:
name: web_socket_channel
- sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
+ sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
url: "https://pub.dev"
source: hosted
- version: "2.4.0"
+ version: "3.0.3"
+ web_socket_client:
+ dependency: transitive
+ description:
+ name: web_socket_client
+ sha256: "22264cb5143e9bb55c943d6b051d207fdd6470ffb77ee45778c9a7a0fda100bc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.0"
webdriver:
dependency: transitive
description:
diff --git a/pubspec.yaml b/pubspec.yaml
index 4cbc2bd7c4092bac5a5dd59182d7ed6ccd3008c9..22129e9f67b4e5c4d751f248f6543b5fc847b618 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -62,12 +62,14 @@ dependencies:
gif_view: ^1.0.2
get_it: ^8.0.3
durt2:
- path: ../../durt2
+ path: ../durt2
# git:
# url: https://git.duniter.org/libs/durt2
dependency_overrides:
intl: ^0.19.0
+ # To keep compatibility with polkadart_cli and Hive
+ source_gen: ^2.0.0
dev_dependencies:
icons_launcher: ^3.0.0
diff --git a/scripts/generatePartFiles.sh b/scripts/build_runner.sh
similarity index 100%
rename from scripts/generatePartFiles.sh
rename to scripts/build_runner.sh