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';
// Version of box data
const int dataVersion = 1;
const int dataVersion = 2;
// Files paths
Directory? appPath;

View File

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

View File

@ -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,

View File

@ -17,33 +17,27 @@ class ChestDataAdapter extends TypeAdapter<ChestData> {
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);
}

View File

@ -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',

View File

@ -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<void> generateNewDerivation(context, String _name) async {
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(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<MyWalletsProvider>(context, listen: false);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(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,

View File

@ -58,16 +58,14 @@ class WalletOptionsProvider with ChangeNotifier {
}
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}" ?'));
if (_answer!) {
await walletBox.delete(wallet.key);
await _sub.deleteAccounts([wallet.address!]);
// Navigator.popUntil(
// context,
// ModalRoute.withName('/mywallets'),
// );
Navigator.pop(context);
}
return 0;

View File

@ -192,53 +192,90 @@ class FaderTransition extends PageRouteBuilder {
);
}
Future<bool?> confirmPopop(BuildContext context, String title) async {
return showDialog<bool>(
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('confirmPopop'),
child: const Text(
"Oui",
style: TextStyle(
fontSize: 21,
color: Color(0xffD80000),
),
Future<bool?> confirmPopup(BuildContext context, String title) async {
return showDialog<bool>(
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('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<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() {
// return AppBar(

View File

@ -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
}
});

View File

@ -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<SubstrateSdk>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(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);

View File

@ -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<HomeProvider>(context);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
CommonElements common = CommonElements();
SubstrateSdk _sub = Provider.of<SubstrateSdk>(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: <Widget>[
const Spacer(flex: 1),
FutureBuilder(
future: _sub.getSeed(_chest!.address!, walletProvider.pinCode),
future: _sub.getSeed(defaultWallet.address!, walletProvider.pinCode),
builder: (BuildContext context, AsyncSnapshot<String?> _seed) {
if (_seed.connectionState != ConnectionState.done ||
_seed.hasError) {

View File

@ -42,6 +42,7 @@ class UnlockingWallet extends StatelessWidget {
currentChestNumber = configBox.get('currentChest');
currentChest = chestBox.get(currentChestNumber)!;
int _pinLenght = _walletOptions.getPinLenght(wallet!.number);
errorController = StreamController<ErrorAnimationType>();
@ -145,9 +146,10 @@ class UnlockingWallet extends StatelessWidget {
Provider.of<WalletOptionsProvider>(context);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(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));

View File

@ -12,18 +12,26 @@ import 'package:provider/provider.dart';
AsyncSnapshot<List>? mnemoList;
class OnboardingStepFive extends StatelessWidget {
class OnboardingStepFive extends StatefulWidget {
const OnboardingStepFive({Key? key, this.skipIntro = false})
: super(key: key);
final bool skipIntro;
@override
State<StatefulWidget> createState() {
return _ChooseChestState();
}
}
// ignore: unused_element
class _ChooseChestState extends State<OnboardingStepFive> {
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(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<GenerateWalletsProvider>(context);
Provider.of<GenerateWalletsProvider>(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<GenerateWalletsProvider>(context);
Provider.of<GenerateWalletsProvider>(context, listen: false);
return MaterialApp(
home: Scaffold(
appBar: AppBar(

View File

@ -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,

View File

@ -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'