From 488435405ce05a55dd9cb9e30f024c978ec0a3d7 Mon Sep 17 00:00:00 2001 From: poka Date: Sun, 29 May 2022 01:38:27 +0200 Subject: [PATCH] fix: no chest address anymore; Delete all wallet on startup if bad dataVersion --- lib/globals.dart | 2 +- lib/main.dart | 1 + lib/models/chest_data.dart | 16 +-- lib/models/chest_data.g.dart | 32 +++-- lib/providers/generate_wallets.dart | 1 - lib/providers/my_wallets.dart | 15 +-- lib/providers/wallet_options.dart | 8 +- lib/screens/common_elements.dart | 123 +++++++++++++------- lib/screens/home.dart | 12 ++ lib/screens/myWallets/change_pin.dart | 9 +- lib/screens/myWallets/show_seed.dart | 11 +- lib/screens/myWallets/unlocking_wallet.dart | 6 +- lib/screens/onBoarding/5.dart | 22 ++-- lib/screens/wallet_view.dart | 2 +- pubspec.yaml | 2 +- 15 files changed, 154 insertions(+), 108 deletions(-) diff --git a/lib/globals.dart b/lib/globals.dart index 1c7816f..1b3913c 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -8,7 +8,7 @@ import 'package:logger/logger.dart'; import 'package:shared_preferences/shared_preferences.dart'; // Version of box data -const int dataVersion = 1; +const int dataVersion = 2; // Files paths Directory? appPath; diff --git a/lib/main.dart b/lib/main.dart index f534cf7..d1e3a76 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -73,6 +73,7 @@ Future main() async { await Hive.deleteBoxFromDisk('g1WalletsBox'); g1WalletsBox = await Hive.openBox("g1WalletsBox"); + // keystoreBox = await Hive.openBox("keystoreBox"); // g1WalletsBox.clear(); diff --git a/lib/models/chest_data.dart b/lib/models/chest_data.dart index cd9ab30..7e04b13 100644 --- a/lib/models/chest_data.dart +++ b/lib/models/chest_data.dart @@ -7,29 +7,21 @@ part 'chest_data.g.dart'; @HiveType(typeId: 1) class ChestData extends HiveObject { @HiveField(0) - String? address; - - @HiveField(1) - String? rootAddress; - - @HiveField(2) String? name; - @HiveField(3) + @HiveField(1) int? defaultWallet; - @HiveField(4) + @HiveField(2) String? imageName; - @HiveField(5) + @HiveField(3) File? imageFile; - @HiveField(6) + @HiveField(4) bool? isCesium; ChestData({ - this.address, - this.rootAddress, this.name, this.defaultWallet, this.imageName, diff --git a/lib/models/chest_data.g.dart b/lib/models/chest_data.g.dart index b853f39..b547a6b 100644 --- a/lib/models/chest_data.g.dart +++ b/lib/models/chest_data.g.dart @@ -17,33 +17,27 @@ class ChestDataAdapter extends TypeAdapter { for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), }; return ChestData( - address: fields[0] as String?, - rootAddress: fields[1] as String?, - name: fields[2] as String?, - defaultWallet: fields[3] as int?, - imageName: fields[4] as String?, - imageFile: fields[5] as File?, - isCesium: fields[6] as bool?, + name: fields[0] as String?, + defaultWallet: fields[1] as int?, + imageName: fields[2] as String?, + imageFile: fields[3] as File?, + isCesium: fields[4] as bool?, ); } @override void write(BinaryWriter writer, ChestData obj) { writer - ..writeByte(7) - ..writeByte(0) - ..write(obj.address) - ..writeByte(1) - ..write(obj.rootAddress) - ..writeByte(2) - ..write(obj.name) - ..writeByte(3) - ..write(obj.defaultWallet) - ..writeByte(4) - ..write(obj.imageName) ..writeByte(5) + ..writeByte(0) + ..write(obj.name) + ..writeByte(1) + ..write(obj.defaultWallet) + ..writeByte(2) + ..write(obj.imageName) + ..writeByte(3) ..write(obj.imageFile) - ..writeByte(6) + ..writeByte(4) ..write(obj.isCesium); } diff --git a/lib/providers/generate_wallets.dart b/lib/providers/generate_wallets.dart index 56d8127..af03416 100644 --- a/lib/providers/generate_wallets.dart +++ b/lib/providers/generate_wallets.dart @@ -71,7 +71,6 @@ class GenerateWalletsProvider with ChangeNotifier { chestName = 'Coffre à Ğecko ${chestNumber + 1}'; } ChestData thisChest = ChestData( - address: address, name: chestName, defaultWallet: 0, imageName: '${chestNumber % 8}.png', diff --git a/lib/providers/my_wallets.dart b/lib/providers/my_wallets.dart index 536295c..2ba8566 100644 --- a/lib/providers/my_wallets.dart +++ b/lib/providers/my_wallets.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'dart:async'; import 'package:gecko/globals.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/screens/common_elements.dart'; @@ -73,7 +72,7 @@ class MyWalletsProvider with ChangeNotifier { try { log.w('DELETE ALL WALLETS ?'); - final bool? _answer = await (confirmPopop( + final bool? _answer = await (confirmPopup( context, 'Êtes-vous sûr de vouloir oublier tous vos coffres ?')); if (_answer!) { await walletBox.clear(); @@ -92,6 +91,9 @@ class MyWalletsProvider with ChangeNotifier { } Future generateNewDerivation(context, String _name) async { + MyWalletsProvider _myWalletProvider = + Provider.of(context, listen: false); + isNewDerivationLoading = true; notifyListeners(); int _newDerivationNbr; @@ -107,17 +109,12 @@ class MyWalletsProvider with ChangeNotifier { _newDerivationNbr = _walletConfig.last.derivation! + 2; _newWalletNbr = _walletConfig.last.number! + 1; } - - MyWalletsProvider myWalletProvider = - Provider.of(context, listen: false); - SubstrateSdk _sub = Provider.of(context, listen: false); - final int? _currentChestNumber = myWalletProvider.getCurrentChest(); - final ChestData _currentChest = chestBox.get(_currentChestNumber)!; + WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!; final address = await _sub.derive( - context, _currentChest.address!, _newDerivationNbr, pinCode); + context, defaultWallet.address!, _newDerivationNbr, pinCode); WalletData newWallet = WalletData( version: dataVersion, diff --git a/lib/providers/wallet_options.dart b/lib/providers/wallet_options.dart index 1ae0c36..02aeef8 100644 --- a/lib/providers/wallet_options.dart +++ b/lib/providers/wallet_options.dart @@ -58,16 +58,14 @@ class WalletOptionsProvider with ChangeNotifier { } Future deleteWallet(context, WalletData wallet) async { - final bool? _answer = await (confirmPopop(context, + SubstrateSdk _sub = Provider.of(context, listen: false); + final bool? _answer = await (confirmPopup(context, 'Êtes-vous sûr de vouloir oublier le portefeuille "${wallet.name}" ?')); if (_answer!) { await walletBox.delete(wallet.key); + await _sub.deleteAccounts([wallet.address!]); - // Navigator.popUntil( - // context, - // ModalRoute.withName('/mywallets'), - // ); Navigator.pop(context); } return 0; diff --git a/lib/screens/common_elements.dart b/lib/screens/common_elements.dart index f9daa8f..e78c7ff 100644 --- a/lib/screens/common_elements.dart +++ b/lib/screens/common_elements.dart @@ -192,53 +192,90 @@ class FaderTransition extends PageRouteBuilder { ); } -Future confirmPopop(BuildContext context, String title) async { - return showDialog( - context: context, - barrierDismissible: true, // user must tap button! - builder: (BuildContext context) { - return AlertDialog( - backgroundColor: backgroundColor, - content: Text( - title, - textAlign: TextAlign.center, - style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), - ), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - key: const Key('confirmPopop'), - child: const Text( - "Oui", - style: TextStyle( - fontSize: 21, - color: Color(0xffD80000), - ), +Future confirmPopup(BuildContext context, String title) async { + return showDialog( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: backgroundColor, + content: Text( + title, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + key: const Key('confirmPopop'), + child: const Text( + "Oui", + style: TextStyle( + fontSize: 21, + color: Color(0xffD80000), ), - onPressed: () { - Navigator.pop(context, true); - }, ), - const SizedBox(width: 20), - TextButton( - child: const Text( - "Non", - style: TextStyle(fontSize: 21), + onPressed: () { + Navigator.pop(context, true); + }, + ), + const SizedBox(width: 20), + TextButton( + child: const Text( + "Non", + style: TextStyle(fontSize: 21), + ), + onPressed: () { + Navigator.pop(context, false); + }, + ), + const SizedBox(height: 120) + ], + ) + ], + ); + }, + ); +} + +Future infoPopup(BuildContext context, String title) async { + return showDialog( + context: context, + barrierDismissible: true, // user must tap button! + builder: (BuildContext context) { + return AlertDialog( + backgroundColor: backgroundColor, + content: Text( + title, + textAlign: TextAlign.center, + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), + ), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + key: const Key('infoPopup'), + child: const Text( + "D'accord", + style: TextStyle( + fontSize: 21, + color: Color(0xffD80000), ), - onPressed: () { - Navigator.pop(context, false); - }, ), - const SizedBox(height: 120) - ], - ) - ], - ); - }, - ); - } + onPressed: () { + Navigator.pop(context, true); + }, + ), + ], + ) + ], + ); + }, + ); +} // Widget geckoAppBar() { // return AppBar( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index ec7ef45..55bc56a 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -7,6 +7,7 @@ import 'package:gecko/providers/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/models/wallet_data.dart'; +import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/onBoarding/1.dart'; @@ -102,6 +103,17 @@ class HomeScreen extends StatelessWidget { WidgetsBinding.instance.addPostFrameCallback((_) async { if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi(); if (_sub.sdkReady && !_sub.nodeConnected) { + if (walletBox.isNotEmpty && + walletBox.getAt(0)!.version! < dataVersion) { + await infoPopup(context, + "La version de vos coffres n'est plus comptabile avec cette version de Ğecko.\nTous vos coffres vont être oubliés, vous devez les importer de nouveau."); + await walletBox.clear(); + await chestBox.clear(); + await configBox.delete('defaultWallet'); + await _sub.deleteAllAccounts(); + _myWalletProvider.rebuildWidget(); + } + await _sub.connectNode(ctx); //kopa } }); diff --git a/lib/screens/myWallets/change_pin.dart b/lib/screens/myWallets/change_pin.dart index 1f038e0..52e88dd 100644 --- a/lib/screens/myWallets/change_pin.dart +++ b/lib/screens/myWallets/change_pin.dart @@ -3,6 +3,7 @@ import 'package:durt/durt.dart'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; +import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/substrate_sdk.dart'; import 'dart:io'; @@ -26,6 +27,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SubstrateSdk _sub = Provider.of(context, listen: false); + MyWalletsProvider _myWalletProvider = + Provider.of(context, listen: false); return WillPopScope( onWillPop: () { @@ -100,9 +103,11 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier { onPrimary: Colors.black, // foreground ), onPressed: () async { - final _chest = chestBox.get(configBox.get('currentChest')); + WalletData defaultWallet = + _myWalletProvider.getDefaultWallet()!; + await _sub.changePassword( - _chest!.address!, walletProvider.pinCode, newPin.text); + defaultWallet.address!, walletProvider.pinCode, newPin.text); walletProvider.pinCode = newPin.text; newPin.text = ''; Navigator.pop(context); diff --git a/lib/screens/myWallets/show_seed.dart b/lib/screens/myWallets/show_seed.dart index c05d794..8d035d8 100644 --- a/lib/screens/myWallets/show_seed.dart +++ b/lib/screens/myWallets/show_seed.dart @@ -2,6 +2,7 @@ import 'dart:typed_data'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; import 'package:flutter/material.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/common_elements.dart'; @@ -22,14 +23,14 @@ class ShowSeed extends StatelessWidget { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - // HomeProvider _homeProvider = Provider.of(context); + MyWalletsProvider _myWalletProvider = + Provider.of(context, listen: false); CommonElements common = CommonElements(); SubstrateSdk _sub = Provider.of(context, listen: false); - final _chest = chestBox.get(configBox.get('currentChest')); - // _sub.changePassword( - // _chest!.address!, walletProvider.pinCode, newPin.text); +WalletData defaultWallet = + _myWalletProvider.getDefaultWallet()!; return Scaffold( backgroundColor: backgroundColor, @@ -43,7 +44,7 @@ class ShowSeed extends StatelessWidget { child: Column(children: [ const Spacer(flex: 1), FutureBuilder( - future: _sub.getSeed(_chest!.address!, walletProvider.pinCode), + future: _sub.getSeed(defaultWallet.address!, walletProvider.pinCode), builder: (BuildContext context, AsyncSnapshot _seed) { if (_seed.connectionState != ConnectionState.done || _seed.hasError) { diff --git a/lib/screens/myWallets/unlocking_wallet.dart b/lib/screens/myWallets/unlocking_wallet.dart index 2b793e4..64acdaf 100644 --- a/lib/screens/myWallets/unlocking_wallet.dart +++ b/lib/screens/myWallets/unlocking_wallet.dart @@ -42,6 +42,7 @@ class UnlockingWallet extends StatelessWidget { currentChestNumber = configBox.get('currentChest'); currentChest = chestBox.get(currentChestNumber)!; + int _pinLenght = _walletOptions.getPinLenght(wallet!.number); errorController = StreamController(); @@ -145,9 +146,10 @@ class UnlockingWallet extends StatelessWidget { Provider.of(context); MyWalletsProvider _myWalletProvider = Provider.of(context); - SubstrateSdk _sub = Provider.of(context, listen: false); + WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); + FocusNode pinFocus = FocusNode(); return Form( @@ -201,7 +203,7 @@ class UnlockingWallet extends StatelessWidget { _myWalletProvider.pinCode = _pin.toUpperCase(); final isValid = await _sub.checkPassword( - currentChest.address!, _pin.toUpperCase()); + defaultWallet!.address!, _pin.toUpperCase()); if (!isValid) { await Future.delayed(const Duration(milliseconds: 50)); diff --git a/lib/screens/onBoarding/5.dart b/lib/screens/onBoarding/5.dart index 86a9e9f..596d1b2 100644 --- a/lib/screens/onBoarding/5.dart +++ b/lib/screens/onBoarding/5.dart @@ -12,18 +12,26 @@ import 'package:provider/provider.dart'; AsyncSnapshot? mnemoList; -class OnboardingStepFive extends StatelessWidget { +class OnboardingStepFive extends StatefulWidget { const OnboardingStepFive({Key? key, this.skipIntro = false}) : super(key: key); final bool skipIntro; + @override + State createState() { + return _ChooseChestState(); + } +} + +// ignore: unused_element +class _ChooseChestState extends State { @override Widget build(BuildContext context) { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); GenerateWalletsProvider _generateWalletProvider = Provider.of(context, listen: false); - CommonElements common = CommonElements(); + final CommonElements common = CommonElements(); return Scaffold( backgroundColor: backgroundColor, @@ -82,8 +90,8 @@ class OnboardingStepFive extends StatelessWidget { onPrimary: Colors.black, // foreground ), onPressed: () { - _generateWalletProvider.reloadBuild(); - // setState(() {}); + // _generateWalletProvider.reloadBuild(); + setState(() {}); }, child: Text("Choisir une autre phrase", style: TextStyle( @@ -93,7 +101,7 @@ class OnboardingStepFive extends StatelessWidget { ), ), SizedBox(height: 22 * ratio), - nextButton(context, "J'ai noté ma phrase", false, skipIntro), + nextButton(context, "J'ai noté ma phrase", false, widget.skipIntro), SizedBox(height: 35 * ratio), ]), ), @@ -103,7 +111,7 @@ class OnboardingStepFive extends StatelessWidget { Widget sentanceArray(BuildContext context) { GenerateWalletsProvider _generateWalletProvider = - Provider.of(context); + Provider.of(context, listen: false); return Padding( padding: const EdgeInsets.symmetric(horizontal: 3), @@ -181,7 +189,7 @@ class PrintWallet extends StatelessWidget { @override Widget build(BuildContext context) { GenerateWalletsProvider _generateWalletProvider = - Provider.of(context); + Provider.of(context, listen: false); return MaterialApp( home: Scaffold( appBar: AppBar( diff --git a/lib/screens/wallet_view.dart b/lib/screens/wallet_view.dart index 308e6b0..ebbf720 100644 --- a/lib/screens/wallet_view.dart +++ b/lib/screens/wallet_view.dart @@ -76,7 +76,7 @@ class WalletViewScreen extends StatelessWidget { 'assets/walletOptions/clock.png'), height: 90)), onTap: () { - ////TODO: wait for subsquid indexer + //// Wait for subsquid indexer // _historyProvider.nPage = 1; // Navigator.push( // context, diff --git a/pubspec.yaml b/pubspec.yaml index d6ed340..fac9f3e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Pay with G1. # pub.dev using `pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.7+2 +version: 0.0.7+3 environment: sdk: '>=2.12.0 <3.0.0'