fix: no chest address anymore; Delete all wallet on startup if bad dataVersion
This commit is contained in:
parent
98bb94ab78
commit
488435405c
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue