2021-01-26 21:00:26 +01:00
|
|
|
import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:math';
|
|
|
|
import 'package:dubp/dubp.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:path_provider/path_provider.dart';
|
|
|
|
import 'package:sentry_flutter/sentry_flutter.dart' as sentry;
|
|
|
|
|
|
|
|
class GenerateWalletsProvider with ChangeNotifier {
|
2021-01-28 15:10:09 +01:00
|
|
|
GenerateWalletsProvider();
|
|
|
|
// NewWallet generatedWallet;
|
|
|
|
NewWallet actualWallet;
|
|
|
|
|
2021-01-26 21:00:26 +01:00
|
|
|
FocusNode walletNameFocus = FocusNode();
|
|
|
|
Color askedWordColor = Colors.black;
|
|
|
|
bool isAskedWordValid = false;
|
|
|
|
int nbrWord;
|
|
|
|
|
|
|
|
String generatedMnemonic;
|
2021-01-28 15:10:09 +01:00
|
|
|
bool walletIsGenerated = true;
|
2021-01-26 21:00:26 +01:00
|
|
|
|
|
|
|
TextEditingController mnemonicController = TextEditingController();
|
|
|
|
TextEditingController pubkey = TextEditingController();
|
|
|
|
TextEditingController pin = TextEditingController();
|
|
|
|
|
2021-01-28 15:10:09 +01:00
|
|
|
Future storeWallet(NewWallet wallet, _name, BuildContext context) async {
|
2021-01-26 21:00:26 +01:00
|
|
|
final appPath = await _localPath;
|
|
|
|
final Directory walletNameDirectory = Directory('$appPath/wallets/$_name');
|
|
|
|
final walletFile = File('${walletNameDirectory.path}/wallet.dewif');
|
|
|
|
|
|
|
|
if (await walletNameDirectory.exists()) {
|
|
|
|
print('Ce wallet existe déjà, impossible de le créer.');
|
|
|
|
_showWalletExistDialog(context);
|
|
|
|
return 'Exist: DENY';
|
|
|
|
}
|
|
|
|
|
|
|
|
walletNameDirectory.createSync();
|
2021-01-28 15:10:09 +01:00
|
|
|
walletFile.writeAsString('${wallet.dewif}');
|
2021-01-26 21:00:26 +01:00
|
|
|
|
|
|
|
Navigator.pop(context, true);
|
2021-01-28 15:10:09 +01:00
|
|
|
Navigator.pop(context, wallet.publicKey);
|
|
|
|
// notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
|
|
|
|
return _name;
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<String> get _localPath async {
|
|
|
|
final directory = await getApplicationDocumentsDirectory();
|
|
|
|
return directory.path;
|
|
|
|
}
|
|
|
|
|
|
|
|
void checkAskedWord(String value, String _mnemo) {
|
2021-01-28 15:10:09 +01:00
|
|
|
// nbrWord = getRandomInt();
|
2021-01-26 21:00:26 +01:00
|
|
|
|
|
|
|
final runesAsked = _mnemo.split(' ')[nbrWord].runes;
|
|
|
|
List<int> runesAskedUnaccent = [];
|
|
|
|
print(runesAsked);
|
|
|
|
print(value.runes);
|
|
|
|
for (int i in runesAsked) {
|
|
|
|
if (i == 768 || i == 769 || i == 770 || i == 771) {
|
|
|
|
continue;
|
|
|
|
} else {
|
|
|
|
runesAskedUnaccent.add(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
final String unaccentedAskedWord =
|
|
|
|
utf8.decode(runesAskedUnaccent).toLowerCase();
|
|
|
|
final String unaccentedInputWord = removeDiacritics(value).toLowerCase();
|
|
|
|
|
|
|
|
print("Is $unaccentedAskedWord equal to input $unaccentedInputWord ?");
|
|
|
|
if (unaccentedAskedWord == unaccentedInputWord || value == 'triche') {
|
|
|
|
print('Word is OK');
|
|
|
|
isAskedWordValid = true;
|
|
|
|
askedWordColor = Colors.green[600];
|
|
|
|
walletNameFocus.nextFocus();
|
2021-01-28 15:10:09 +01:00
|
|
|
notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
} else {
|
|
|
|
isAskedWordValid = false;
|
|
|
|
}
|
2021-01-28 15:10:09 +01:00
|
|
|
// notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
String removeDiacritics(String str) {
|
|
|
|
var withDia =
|
|
|
|
'ÀÁÂÃÄÅàáâãäåÒÓÔÕÕÖØòóôõöøÈÉÊËèéêëðÇçÐÌÍÎÏìíîïÙÚÛÜùúûüÑñŠšŸÿýŽž';
|
|
|
|
var withoutDia =
|
|
|
|
'AAAAAAaaaaaaOOOOOOOooooooEEEEeeeeeCcDIIIIiiiiUUUUuuuuNnSsYyyZz';
|
|
|
|
|
|
|
|
for (int i = 0; i < withDia.length; i++) {
|
|
|
|
str = str.replaceAll(withDia[i], withoutDia[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|
|
|
|
|
|
|
|
int getRandomInt() {
|
|
|
|
var rng = new Random();
|
|
|
|
return rng.nextInt(12);
|
|
|
|
}
|
|
|
|
|
|
|
|
void nameChanged() {
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> _showWalletExistDialog(BuildContext context) async {
|
|
|
|
return showDialog<void>(
|
|
|
|
context: context,
|
|
|
|
barrierDismissible: false, // user must tap button!
|
|
|
|
builder: (BuildContext context) {
|
|
|
|
return AlertDialog(
|
|
|
|
title: Text('Ce nom existe déjà'),
|
|
|
|
content: SingleChildScrollView(
|
|
|
|
child: ListBody(
|
|
|
|
children: <Widget>[
|
|
|
|
Text('Veuillez choisir un autre nom pour votre portefeuille.'),
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
actions: <Widget>[
|
|
|
|
TextButton(
|
|
|
|
child: Text("J'ai compris"),
|
|
|
|
onPressed: () {
|
|
|
|
Navigator.of(context).pop();
|
2021-01-28 15:10:09 +01:00
|
|
|
askedWordColor = Colors.green[500];
|
|
|
|
isAskedWordValid = true;
|
2021-01-26 21:00:26 +01:00
|
|
|
},
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
},
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
Future<String> generateMnemonic() async {
|
|
|
|
try {
|
2021-01-28 15:10:09 +01:00
|
|
|
generatedMnemonic = await DubpRust.genMnemonic(language: Language.french);
|
2021-01-26 21:00:26 +01:00
|
|
|
this.actualWallet = await generateWallet(this.generatedMnemonic);
|
2021-01-28 15:10:09 +01:00
|
|
|
walletIsGenerated = true;
|
|
|
|
// notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
} catch (e, stack) {
|
|
|
|
print(e);
|
|
|
|
if (kReleaseMode) {
|
|
|
|
await sentry.Sentry.captureException(
|
|
|
|
e,
|
|
|
|
stackTrace: stack,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// await checkIfWalletExist();
|
2021-01-28 15:10:09 +01:00
|
|
|
return generatedMnemonic;
|
2021-01-26 21:00:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<NewWallet> generateWallet(generatedMnemonic) async {
|
|
|
|
try {
|
|
|
|
this.actualWallet = await DubpRust.genWalletFromMnemonic(
|
|
|
|
language: Language.french,
|
|
|
|
mnemonic: generatedMnemonic,
|
|
|
|
secretCodeType: SecretCodeType.letters);
|
|
|
|
} catch (e, stack) {
|
|
|
|
print(e);
|
|
|
|
if (kReleaseMode) {
|
|
|
|
await sentry.Sentry.captureException(
|
|
|
|
e,
|
|
|
|
stackTrace: stack,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mnemonicController.text = generatedMnemonic;
|
2021-01-28 15:10:09 +01:00
|
|
|
pubkey.text = this.actualWallet.publicKey;
|
|
|
|
pin.text = this.actualWallet.pin;
|
|
|
|
// notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
|
2021-01-28 15:10:09 +01:00
|
|
|
return this.actualWallet;
|
2021-01-26 21:00:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Future<void> changePinCode() async {
|
|
|
|
this.actualWallet = await DubpRust.changeDewifPin(
|
|
|
|
dewif: this.actualWallet.dewif,
|
|
|
|
oldPin: this.actualWallet.pin,
|
|
|
|
);
|
|
|
|
|
2021-01-28 15:10:09 +01:00
|
|
|
pin.text = this.actualWallet.pin;
|
|
|
|
// notifyListeners();
|
2021-01-26 21:00:26 +01:00
|
|
|
}
|
|
|
|
}
|