fix: no chest address anymore; Delete all wallet on startup if bad dataVersion

This commit is contained in:
poka 2022-05-29 01:38:27 +02:00
parent 98bb94ab78
commit 488435405c
15 changed files with 154 additions and 108 deletions

View File

@ -8,7 +8,7 @@ import 'package:logger/logger.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
// Version of box data // Version of box data
const int dataVersion = 1; const int dataVersion = 2;
// Files paths // Files paths
Directory? appPath; Directory? appPath;

View File

@ -73,6 +73,7 @@ Future<void> main() async {
await Hive.deleteBoxFromDisk('g1WalletsBox'); await Hive.deleteBoxFromDisk('g1WalletsBox');
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox"); g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
// keystoreBox = await Hive.openBox("keystoreBox"); // keystoreBox = await Hive.openBox("keystoreBox");
// g1WalletsBox.clear(); // g1WalletsBox.clear();

View File

@ -7,29 +7,21 @@ part 'chest_data.g.dart';
@HiveType(typeId: 1) @HiveType(typeId: 1)
class ChestData extends HiveObject { class ChestData extends HiveObject {
@HiveField(0) @HiveField(0)
String? address;
@HiveField(1)
String? rootAddress;
@HiveField(2)
String? name; String? name;
@HiveField(3) @HiveField(1)
int? defaultWallet; int? defaultWallet;
@HiveField(4) @HiveField(2)
String? imageName; String? imageName;
@HiveField(5) @HiveField(3)
File? imageFile; File? imageFile;
@HiveField(6) @HiveField(4)
bool? isCesium; bool? isCesium;
ChestData({ ChestData({
this.address,
this.rootAddress,
this.name, this.name,
this.defaultWallet, this.defaultWallet,
this.imageName, this.imageName,

View File

@ -17,33 +17,27 @@ class ChestDataAdapter extends TypeAdapter<ChestData> {
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
}; };
return ChestData( return ChestData(
address: fields[0] as String?, name: fields[0] as String?,
rootAddress: fields[1] as String?, defaultWallet: fields[1] as int?,
name: fields[2] as String?, imageName: fields[2] as String?,
defaultWallet: fields[3] as int?, imageFile: fields[3] as File?,
imageName: fields[4] as String?, isCesium: fields[4] as bool?,
imageFile: fields[5] as File?,
isCesium: fields[6] as bool?,
); );
} }
@override @override
void write(BinaryWriter writer, ChestData obj) { void write(BinaryWriter writer, ChestData obj) {
writer 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(5)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.defaultWallet)
..writeByte(2)
..write(obj.imageName)
..writeByte(3)
..write(obj.imageFile) ..write(obj.imageFile)
..writeByte(6) ..writeByte(4)
..write(obj.isCesium); ..write(obj.isCesium);
} }

View File

@ -71,7 +71,6 @@ class GenerateWalletsProvider with ChangeNotifier {
chestName = 'Coffre à Ğecko ${chestNumber + 1}'; chestName = 'Coffre à Ğecko ${chestNumber + 1}';
} }
ChestData thisChest = ChestData( ChestData thisChest = ChestData(
address: address,
name: chestName, name: chestName,
defaultWallet: 0, defaultWallet: 0,
imageName: '${chestNumber % 8}.png', imageName: '${chestNumber % 8}.png',

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async'; import 'dart:async';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -73,7 +72,7 @@ class MyWalletsProvider with ChangeNotifier {
try { try {
log.w('DELETE ALL WALLETS ?'); 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 ?')); context, 'Êtes-vous sûr de vouloir oublier tous vos coffres ?'));
if (_answer!) { if (_answer!) {
await walletBox.clear(); await walletBox.clear();
@ -92,6 +91,9 @@ class MyWalletsProvider with ChangeNotifier {
} }
Future<void> generateNewDerivation(context, String _name) async { Future<void> generateNewDerivation(context, String _name) async {
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
isNewDerivationLoading = true; isNewDerivationLoading = true;
notifyListeners(); notifyListeners();
int _newDerivationNbr; int _newDerivationNbr;
@ -107,17 +109,12 @@ class MyWalletsProvider with ChangeNotifier {
_newDerivationNbr = _walletConfig.last.derivation! + 2; _newDerivationNbr = _walletConfig.last.derivation! + 2;
_newWalletNbr = _walletConfig.last.number! + 1; _newWalletNbr = _walletConfig.last.number! + 1;
} }
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final int? _currentChestNumber = myWalletProvider.getCurrentChest(); WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!;
final ChestData _currentChest = chestBox.get(_currentChestNumber)!;
final address = await _sub.derive( final address = await _sub.derive(
context, _currentChest.address!, _newDerivationNbr, pinCode); context, defaultWallet.address!, _newDerivationNbr, pinCode);
WalletData newWallet = WalletData( WalletData newWallet = WalletData(
version: dataVersion, version: dataVersion,

View File

@ -58,16 +58,14 @@ class WalletOptionsProvider with ChangeNotifier {
} }
Future<int> deleteWallet(context, WalletData wallet) async { Future<int> deleteWallet(context, WalletData wallet) async {
final bool? _answer = await (confirmPopop(context, SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final bool? _answer = await (confirmPopup(context,
'Êtes-vous sûr de vouloir oublier le portefeuille "${wallet.name}" ?')); 'Êtes-vous sûr de vouloir oublier le portefeuille "${wallet.name}" ?'));
if (_answer!) { if (_answer!) {
await walletBox.delete(wallet.key); await walletBox.delete(wallet.key);
await _sub.deleteAccounts([wallet.address!]);
// Navigator.popUntil(
// context,
// ModalRoute.withName('/mywallets'),
// );
Navigator.pop(context); Navigator.pop(context);
} }
return 0; return 0;

View File

@ -192,53 +192,90 @@ class FaderTransition extends PageRouteBuilder {
); );
} }
Future<bool?> confirmPopop(BuildContext context, String title) async { Future<bool?> confirmPopup(BuildContext context, String title) async {
return showDialog<bool>( return showDialog<bool>(
context: context, context: context,
barrierDismissible: true, // user must tap button! barrierDismissible: true, // user must tap button!
builder: (BuildContext context) { builder: (BuildContext context) {
return AlertDialog( return AlertDialog(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
content: Text( content: Text(
title, title,
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500), style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),
), ),
actions: <Widget>[ actions: <Widget>[
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
TextButton( TextButton(
key: const Key('confirmPopop'), key: const Key('confirmPopop'),
child: const Text( child: const Text(
"Oui", "Oui",
style: TextStyle( style: TextStyle(
fontSize: 21, fontSize: 21,
color: Color(0xffD80000), color: Color(0xffD80000),
),
), ),
onPressed: () {
Navigator.pop(context, true);
},
), ),
const SizedBox(width: 20), onPressed: () {
TextButton( Navigator.pop(context, true);
child: const Text( },
"Non", ),
style: TextStyle(fontSize: 21), const SizedBox(width: 20),
TextButton(
child: const Text(
"Non",
style: TextStyle(fontSize: 21),
),
onPressed: () {
Navigator.pop(context, false);
},
),
const SizedBox(height: 120)
],
)
],
);
},
);
}
Future<void> infoPopup(BuildContext context, String title) async {
return showDialog<void>(
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: <Widget>[
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() { // Widget geckoAppBar() {
// return AppBar( // return AppBar(

View File

@ -7,6 +7,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.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/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/onBoarding/1.dart'; import 'package:gecko/screens/onBoarding/1.dart';
@ -102,6 +103,17 @@ class HomeScreen extends StatelessWidget {
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi(); if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi();
if (_sub.sdkReady && !_sub.nodeConnected) { 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 await _sub.connectNode(ctx); //kopa
} }
}); });

View File

@ -3,6 +3,7 @@ import 'package:durt/durt.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/stateful_wrapper.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/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'dart:io'; import 'dart:io';
@ -26,6 +27,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
@ -100,9 +103,11 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
onPrimary: Colors.black, // foreground onPrimary: Colors.black, // foreground
), ),
onPressed: () async { onPressed: () async {
final _chest = chestBox.get(configBox.get('currentChest')); WalletData defaultWallet =
_myWalletProvider.getDefaultWallet()!;
await _sub.changePassword( await _sub.changePassword(
_chest!.address!, walletProvider.pinCode, newPin.text); defaultWallet.address!, walletProvider.pinCode, newPin.text);
walletProvider.pinCode = newPin.text; walletProvider.pinCode = newPin.text;
newPin.text = ''; newPin.text = '';
Navigator.pop(context); Navigator.pop(context);

View File

@ -2,6 +2,7 @@ import 'dart:typed_data';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -22,14 +23,14 @@ class ShowSeed extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// HomeProvider _homeProvider = Provider.of<HomeProvider>(context); MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final _chest = chestBox.get(configBox.get('currentChest')); WalletData defaultWallet =
// _sub.changePassword( _myWalletProvider.getDefaultWallet()!;
// _chest!.address!, walletProvider.pinCode, newPin.text);
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
@ -43,7 +44,7 @@ class ShowSeed extends StatelessWidget {
child: Column(children: <Widget>[ child: Column(children: <Widget>[
const Spacer(flex: 1), const Spacer(flex: 1),
FutureBuilder( FutureBuilder(
future: _sub.getSeed(_chest!.address!, walletProvider.pinCode), future: _sub.getSeed(defaultWallet.address!, walletProvider.pinCode),
builder: (BuildContext context, AsyncSnapshot<String?> _seed) { builder: (BuildContext context, AsyncSnapshot<String?> _seed) {
if (_seed.connectionState != ConnectionState.done || if (_seed.connectionState != ConnectionState.done ||
_seed.hasError) { _seed.hasError) {

View File

@ -42,6 +42,7 @@ class UnlockingWallet extends StatelessWidget {
currentChestNumber = configBox.get('currentChest'); currentChestNumber = configBox.get('currentChest');
currentChest = chestBox.get(currentChestNumber)!; currentChest = chestBox.get(currentChestNumber)!;
int _pinLenght = _walletOptions.getPinLenght(wallet!.number); int _pinLenght = _walletOptions.getPinLenght(wallet!.number);
errorController = StreamController<ErrorAnimationType>(); errorController = StreamController<ErrorAnimationType>();
@ -145,9 +146,10 @@ class UnlockingWallet extends StatelessWidget {
Provider.of<WalletOptionsProvider>(context); Provider.of<WalletOptionsProvider>(context);
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
FocusNode pinFocus = FocusNode(); FocusNode pinFocus = FocusNode();
return Form( return Form(
@ -201,7 +203,7 @@ class UnlockingWallet extends StatelessWidget {
_myWalletProvider.pinCode = _pin.toUpperCase(); _myWalletProvider.pinCode = _pin.toUpperCase();
final isValid = await _sub.checkPassword( final isValid = await _sub.checkPassword(
currentChest.address!, _pin.toUpperCase()); defaultWallet!.address!, _pin.toUpperCase());
if (!isValid) { if (!isValid) {
await Future.delayed(const Duration(milliseconds: 50)); await Future.delayed(const Duration(milliseconds: 50));

View File

@ -12,18 +12,26 @@ import 'package:provider/provider.dart';
AsyncSnapshot<List>? mnemoList; AsyncSnapshot<List>? mnemoList;
class OnboardingStepFive extends StatelessWidget { class OnboardingStepFive extends StatefulWidget {
const OnboardingStepFive({Key? key, this.skipIntro = false}) const OnboardingStepFive({Key? key, this.skipIntro = false})
: super(key: key); : super(key: key);
final bool skipIntro; final bool skipIntro;
@override
State<StatefulWidget> createState() {
return _ChooseChestState();
}
}
// ignore: unused_element
class _ChooseChestState extends State<OnboardingStepFive> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider _generateWalletProvider = GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
CommonElements common = CommonElements(); final CommonElements common = CommonElements();
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
@ -82,8 +90,8 @@ class OnboardingStepFive extends StatelessWidget {
onPrimary: Colors.black, // foreground onPrimary: Colors.black, // foreground
), ),
onPressed: () { onPressed: () {
_generateWalletProvider.reloadBuild(); // _generateWalletProvider.reloadBuild();
// setState(() {}); setState(() {});
}, },
child: Text("Choisir une autre phrase", child: Text("Choisir une autre phrase",
style: TextStyle( style: TextStyle(
@ -93,7 +101,7 @@ class OnboardingStepFive extends StatelessWidget {
), ),
), ),
SizedBox(height: 22 * ratio), 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), SizedBox(height: 35 * ratio),
]), ]),
), ),
@ -103,7 +111,7 @@ class OnboardingStepFive extends StatelessWidget {
Widget sentanceArray(BuildContext context) { Widget sentanceArray(BuildContext context) {
GenerateWalletsProvider _generateWalletProvider = GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context, listen: false);
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 3), padding: const EdgeInsets.symmetric(horizontal: 3),
@ -181,7 +189,7 @@ class PrintWallet extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
GenerateWalletsProvider _generateWalletProvider = GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context, listen: false);
return MaterialApp( return MaterialApp(
home: Scaffold( home: Scaffold(
appBar: AppBar( appBar: AppBar(

View File

@ -76,7 +76,7 @@ class WalletViewScreen extends StatelessWidget {
'assets/walletOptions/clock.png'), 'assets/walletOptions/clock.png'),
height: 90)), height: 90)),
onTap: () { onTap: () {
////TODO: wait for subsquid indexer //// Wait for subsquid indexer
// _historyProvider.nPage = 1; // _historyProvider.nPage = 1;
// Navigator.push( // Navigator.push(
// context, // context,

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages. # 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 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: environment:
sdk: '>=2.12.0 <3.0.0' sdk: '>=2.12.0 <3.0.0'