WIP: Continue digging global substratization

This commit is contained in:
poka 2022-05-19 07:00:25 +02:00
parent b1b27743a0
commit a72390f428
29 changed files with 2361 additions and 674 deletions

View File

@ -1,5 +1,3 @@
[ [
"https://g1.librelois.fr/gva", "https://g1.librelois.fr/gva"
"https://duniter-gva.axiom-team.fr/gva",
"https://duniter-g1.p2p.legal/gva"
] ]

View File

@ -22,7 +22,8 @@ late Box configBox;
late Box<G1WalletsList> g1WalletsBox; late Box<G1WalletsList> g1WalletsBox;
// late Box keystoreBox; // late Box keystoreBox;
String cesiumPod = "https://g1.data.le-sou.org"; // String cesiumPod = "https://g1.data.le-sou.org";
String cesiumPod = "https://g1.data.presles.fr";
// String cesiumPod = "https://g1.data.e-is.pro"; // String cesiumPod = "https://g1.data.e-is.pro";
// Responsive ratios // Responsive ratios

View File

@ -20,7 +20,6 @@ import 'dart:io';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/change_pin.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/g1_wallets_list.dart';
@ -71,17 +70,18 @@ Future<void> main() async {
walletBox = await Hive.openBox<WalletData>("walletBox"); walletBox = await Hive.openBox<WalletData>("walletBox");
chestBox = await Hive.openBox<ChestData>("chestBox"); chestBox = await Hive.openBox<ChestData>("chestBox");
configBox = await Hive.openBox("configBox"); configBox = await Hive.openBox("configBox");
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();
// final HiveStore _store = // final HiveStore _store =
// await HiveStore.open(path: '${appPath.path}/gqlCache'); // await HiveStore.open(path: '${appPath.path}/gqlCache');
// Get a valid GVA endpoint // Get a valid GVA endpoint
// endPointGVA = 'https://g1.librelois.fr/gva'; endPointGVA = 'https://g1.librelois.fr/gva';
endPointGVA = 'https://duniter-g1.p2p.legal/gva'; // endPointGVA = 'https://duniter-g1.p2p.legal/gva';
// await _homeProvider.getValidEndpoint(); // await _homeProvider.getValidEndpoint();
// if (endPointGVA == 'HS') { // if (endPointGVA == 'HS') {
@ -156,7 +156,6 @@ class Gecko extends StatelessWidget {
ChangeNotifierProvider(create: (_) => ChestProvider()), ChangeNotifierProvider(create: (_) => ChestProvider()),
ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()), ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()),
ChangeNotifierProvider(create: (_) => WalletOptionsProvider()), ChangeNotifierProvider(create: (_) => WalletOptionsProvider()),
ChangeNotifierProvider(create: (_) => ChangePinProvider()),
ChangeNotifierProvider(create: (_) => SearchProvider()), ChangeNotifierProvider(create: (_) => SearchProvider()),
ChangeNotifierProvider(create: (_) => CesiumPlusProvider()), ChangeNotifierProvider(create: (_) => CesiumPlusProvider()),
ChangeNotifierProvider(create: (_) => SubstrateSdk()) ChangeNotifierProvider(create: (_) => SubstrateSdk())

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ part 'chest_data.g.dart';
@HiveType(typeId: 1) @HiveType(typeId: 1)
class ChestData extends HiveObject { class ChestData extends HiveObject {
@HiveField(0) @HiveField(0)
String? dewif; String? address;
@HiveField(1) @HiveField(1)
String? rootAddress; String? rootAddress;
@ -28,7 +28,7 @@ class ChestData extends HiveObject {
bool? isCesium; bool? isCesium;
ChestData({ ChestData({
this.dewif, this.address,
this.rootAddress, this.rootAddress,
this.name, this.name,
this.defaultWallet, this.defaultWallet,

View File

@ -17,7 +17,7 @@ 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(
dewif: fields[0] as String?, address: fields[0] as String?,
rootAddress: fields[1] as String?, rootAddress: fields[1] as String?,
name: fields[2] as String?, name: fields[2] as String?,
defaultWallet: fields[3] as int?, defaultWallet: fields[3] as int?,
@ -32,7 +32,7 @@ class ChestDataAdapter extends TypeAdapter<ChestData> {
writer writer
..writeByte(7) ..writeByte(7)
..writeByte(0) ..writeByte(0)
..write(obj.dewif) ..write(obj.address)
..writeByte(1) ..writeByte(1)
..write(obj.rootAddress) ..write(obj.rootAddress)
..writeByte(2) ..writeByte(2)

View File

@ -11,19 +11,19 @@ class G1WalletsList {
@HiveField(1) @HiveField(1)
double? balance; double? balance;
@HiveField(3) @HiveField(2)
Id? id; Id? id;
@HiveField(4) @HiveField(3)
Image? avatar; Image? avatar;
@HiveField(5) @HiveField(4)
String? username; String? username;
@HiveField(6) @HiveField(5)
String? csName; String? csName;
@HiveField(7) @HiveField(6)
bool? isMembre; bool? isMembre;
G1WalletsList({ G1WalletsList({

View File

@ -19,11 +19,11 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> {
return G1WalletsList( return G1WalletsList(
pubkey: fields[0] as String?, pubkey: fields[0] as String?,
balance: fields[1] as double?, balance: fields[1] as double?,
id: fields[3] as Id?, id: fields[2] as Id?,
avatar: fields[4] as Image?, avatar: fields[3] as Image?,
username: fields[5] as String?, username: fields[4] as String?,
csName: fields[6] as String?, csName: fields[5] as String?,
isMembre: fields[7] as bool?, isMembre: fields[6] as bool?,
); );
} }
@ -35,15 +35,15 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> {
..write(obj.pubkey) ..write(obj.pubkey)
..writeByte(1) ..writeByte(1)
..write(obj.balance) ..write(obj.balance)
..writeByte(3) ..writeByte(2)
..write(obj.id) ..write(obj.id)
..writeByte(4) ..writeByte(3)
..write(obj.avatar) ..write(obj.avatar)
..writeByte(5) ..writeByte(4)
..write(obj.username) ..write(obj.username)
..writeByte(6) ..writeByte(5)
..write(obj.csName) ..write(obj.csName)
..writeByte(7) ..writeByte(6)
..write(obj.isMembre); ..write(obj.isMembre);
} }

View File

@ -8,22 +8,26 @@ class WalletData extends HiveObject {
int? chest; int? chest;
@HiveField(1) @HiveField(1)
int? number; String? address;
@HiveField(2) @HiveField(2)
String? name; int? number;
@HiveField(3) @HiveField(3)
int? derivation; String? name;
@HiveField(4) @HiveField(4)
String? imageName; int? derivation;
@HiveField(5) @HiveField(5)
String? imageName;
@HiveField(6)
File? imageFile; File? imageFile;
WalletData( WalletData(
{this.chest, {this.chest,
this.address,
this.number, this.number,
this.name, this.name,
this.derivation, this.derivation,
@ -46,3 +50,10 @@ class WalletData extends HiveObject {
return [chest, number]; return [chest, number];
} }
} }
class NewWallet {
final String address;
final String password;
NewWallet._(this.address, this.password);
}

View File

@ -18,29 +18,32 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
}; };
return WalletData( return WalletData(
chest: fields[0] as int?, chest: fields[0] as int?,
number: fields[1] as int?, address: fields[1] as String?,
name: fields[2] as String?, number: fields[2] as int?,
derivation: fields[3] as int?, name: fields[3] as String?,
imageName: fields[4] as String?, derivation: fields[4] as int?,
imageFile: fields[5] as File?, imageName: fields[5] as String?,
imageFile: fields[6] as File?,
); );
} }
@override @override
void write(BinaryWriter writer, WalletData obj) { void write(BinaryWriter writer, WalletData obj) {
writer writer
..writeByte(6) ..writeByte(7)
..writeByte(0) ..writeByte(0)
..write(obj.chest) ..write(obj.chest)
..writeByte(1) ..writeByte(1)
..write(obj.number) ..write(obj.address)
..writeByte(2) ..writeByte(2)
..write(obj.name) ..write(obj.number)
..writeByte(3) ..writeByte(3)
..write(obj.derivation) ..write(obj.name)
..writeByte(4) ..writeByte(4)
..write(obj.imageName) ..write(obj.derivation)
..writeByte(5) ..writeByte(5)
..write(obj.imageName)
..writeByte(6)
..write(obj.imageFile); ..write(obj.imageFile);
} }

View File

@ -1,48 +0,0 @@
import 'package:durt/durt.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
class ChangePinProvider with ChangeNotifier {
bool ischangedPin = false;
TextEditingController newPin = TextEditingController();
String? pinToGive;
NewWallet? get badWallet => null;
Future<NewWallet?> changePin(String _oldPin, {String? newCustomPin}) async {
final NewWallet newWalletFile;
try {
final _chest = chestBox.get(configBox.get('currentChest'))!;
if (_chest.isCesium!) {
newWalletFile = await Dewif().changeCesiumPassword(
dewif: _chest.dewif!,
oldPassword: _oldPin.toUpperCase(),
newPassword: newCustomPin);
} else {
newWalletFile = await Dewif().changePassword(
dewif: _chest.dewif!,
oldPassword: _oldPin.toUpperCase(),
newPassword: newCustomPin);
}
newPin.text = pinToGive = newWalletFile.password;
ischangedPin = true;
// notifyListeners();
return newWalletFile;
} catch (e) {
log.e('Impossible de changer le code PIN: $e');
return badWallet;
}
}
void storeNewPinChest(context, NewWallet _newWalletFile) {
// ChestData currentChest = chestBox.getAt(configBox.get('currentChest'));
// currentChest.dewif = _newWalletFile.dewif;
// await chestBox.add(currentChest);
chestBox.get(configBox.get('currentChest'))!.dewif = _newWalletFile.dewif;
Navigator.pop(context, pinToGive);
pinToGive = '';
}
}

View File

@ -72,7 +72,7 @@ class GenerateWalletsProvider with ChangeNotifier {
chestName = 'Coffre à Ğecko ${chestNumber + 1}'; chestName = 'Coffre à Ğecko ${chestNumber + 1}';
} }
ChestData thisChest = ChestData( ChestData thisChest = ChestData(
dewif: address, address: address,
name: chestName, name: chestName,
defaultWallet: 0, defaultWallet: 0,
imageName: '${chestNumber % 8}.png', imageName: '${chestNumber % 8}.png',
@ -83,6 +83,7 @@ class GenerateWalletsProvider with ChangeNotifier {
WalletData myWallet = WalletData( WalletData myWallet = WalletData(
chest: chestKey, chest: chestKey,
address: address,
number: 0, number: 0,
name: _name, name: _name,
derivation: 3, derivation: 3,
@ -228,55 +229,55 @@ class GenerateWalletsProvider with ChangeNotifier {
log.d(_walletPubkey); log.d(_walletPubkey);
} }
Future<int?> importCesiumWallet() async { // Future<int?> importCesiumWallet() async {
// String _walletPubkey = await DubpRust.getLegacyPublicKey( // // String _walletPubkey = await DubpRust.getLegacyPublicKey(
// salt: _cesiumID, password: _cesiumPWD); // // salt: _cesiumID, password: _cesiumPWD);
// String shortPubkey = truncate(_walletPubkey, 9, // // String shortPubkey = truncate(_walletPubkey, 9,
// omission: "...", position: TruncatePosition.end); // // omission: "...", position: TruncatePosition.end);
// await storeWallet( // // await storeWallet(
// actualWallet, 'Portefeuille Cesium - $shortPubkey', context); // // actualWallet, 'Portefeuille Cesium - $shortPubkey', context);
// NewWallet myCesiumWallet = await DubpRust.genWalletFromDeprecatedSaltPassword(salt: _cesiumID, password: _cesiumPWD); // // NewWallet myCesiumWallet = await DubpRust.genWalletFromDeprecatedSaltPassword(salt: _cesiumID, password: _cesiumPWD);
cesiumID.text = ''; // cesiumID.text = '';
cesiumPWD.text = ''; // cesiumPWD.text = '';
cesiumPubkey.text = ''; // cesiumPubkey.text = '';
canImport = false; // canImport = false;
isCesiumIDVisible = false; // isCesiumIDVisible = false;
isCesiumPWDVisible = false; // isCesiumPWDVisible = false;
int chestNumber = 0; // int chestNumber = 0;
chestBox.toMap().forEach((key, value) { // chestBox.toMap().forEach((key, value) {
if (value.isCesium!) { // if (value.isCesium!) {
chestNumber++; // chestNumber++;
} // }
}); // });
String chestName; // String chestName;
if (chestNumber == 0) { // if (chestNumber == 0) {
chestName = 'Coffre à Césium'; // chestName = 'Coffre à Césium';
} else { // } else {
chestName = 'Coffre à Césium ${chestNumber + 1}'; // chestName = 'Coffre à Césium ${chestNumber + 1}';
} // }
log.d(pin.text); // log.d(pin.text);
durt.NewWallet cesiumDewif = // durt.NewWallet cesiumDewif =
await durt.Dewif().generateCesiumDewif(cesiumWallet.seed, pin.text); // await durt.Dewif().generateCesiumDewif(cesiumWallet.seed, pin.text);
ChestData cesiumChest = ChestData( // ChestData cesiumChest = ChestData(
dewif: cesiumDewif.dewif, // dewif: cesiumDewif.dewif,
name: chestName, // name: chestName,
imageName: 'cesium.png', // imageName: 'cesium.png',
defaultWallet: 0, // defaultWallet: 0,
isCesium: true); // isCesium: true);
await chestBox.add(cesiumChest).then((value) => null); // await chestBox.add(cesiumChest).then((value) => null);
int? chestKey = await chestBox.toMap().keys.last; // int? chestKey = await chestBox.toMap().keys.last;
// chestBox.toMap(). // // chestBox.toMap().
await configBox.put('currentChest', chestKey); // await configBox.put('currentChest', chestKey);
pin.text = ''; // pin.text = '';
return chestKey; // return chestKey;
} // }
void cesiumIDisVisible() { void cesiumIDisVisible() {
isCesiumIDVisible = !isCesiumIDVisible; isCesiumIDVisible = !isCesiumIDVisible;
@ -296,8 +297,7 @@ class GenerateWalletsProvider with ChangeNotifier {
} }
Future<List<String>> generateWordList(BuildContext context) async { Future<List<String>> generateWordList(BuildContext context) async {
SubstrateSdk _sdk = SubstrateSdk _sdk = Provider.of<SubstrateSdk>(context, listen: false);
Provider.of<SubstrateSdk>(context, listen: false);
generatedMnemonic = await _sdk.generateMnemonic(lang: appLang); generatedMnemonic = await _sdk.generateMnemonic(lang: appLang);
List<String> _wordsList = []; List<String> _wordsList = [];
@ -318,7 +318,7 @@ class GenerateWalletsProvider with ChangeNotifier {
// Needed for bad encoding of UTF-8 // Needed for bad encoding of UTF-8
word = word.replaceAll('é', ''); word = word.replaceAll('é', '');
word = word.replaceAll('è', ''); word = word.replaceAll('è', '');
return bip39Words.contains(word); return bip39Words(appLang).contains(word);
} }
bool isBipWordsList(List<String> words) { bool isBipWordsList(List<String> words) {
@ -327,7 +327,7 @@ class GenerateWalletsProvider with ChangeNotifier {
// Needed for bad encoding of UTF-8 // Needed for bad encoding of UTF-8
word = word.replaceAll('é', ''); word = word.replaceAll('é', '');
word = word.replaceAll('è', ''); word = word.replaceAll('è', '');
if (!bip39Words.contains(word)) { if (!bip39Words(appLang).contains(word)) {
isValid = false; isValid = false;
} }
} }

View File

@ -1,10 +1,11 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:durt/durt.dart';
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:provider/provider.dart';
class MyWalletsProvider with ChangeNotifier { class MyWalletsProvider with ChangeNotifier {
List<WalletData> listWallets = []; List<WalletData> listWallets = [];
@ -21,24 +22,6 @@ class MyWalletsProvider with ChangeNotifier {
return configBox.get('currentChest'); return configBox.get('currentChest');
} }
String dewifToMnemonic(context, WalletData _wallet, String _pin) {
String _mnemonic;
try {
String _localDewif = chestBox.get(_wallet.chest)!.dewif!;
_mnemonic = Dewif()
.mnemonicFromDewif(_localDewif, _pin.toUpperCase(), lang: appLang);
} on ChecksumException catch (e) {
log.e(e.cause);
return 'bad';
} catch (e) {
// _homeProvider.playSound('non', 0.6);
log.e('ERROR READING FILE: $e');
return 'bad';
}
return _mnemonic;
}
bool checkIfWalletExist() { bool checkIfWalletExist() {
if (chestBox.isEmpty) { if (chestBox.isEmpty) {
log.i('No wallets detected'); log.i('No wallets detected');
@ -150,8 +133,19 @@ class MyWalletsProvider with ChangeNotifier {
_newWalletNbr = _walletConfig.last.number! + 1; _newWalletNbr = _walletConfig.last.number! + 1;
} }
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
SubstrateSdk _sdk = Provider.of<SubstrateSdk>(context, listen: false);
final int? _currentChestNumber = myWalletProvider.getCurrentChest();
final ChestData _currentChest = chestBox.get(_currentChestNumber)!;
final address = await _sdk.derive(context, _currentChest.address!, _newDerivationNbr, pinCode);
WalletData newWallet = WalletData( WalletData newWallet = WalletData(
chest: _chest, chest: _chest,
address: address,
number: _newWalletNbr, number: _newWalletNbr,
name: _name, name: _name,
derivation: _newDerivationNbr, derivation: _newDerivationNbr,

View File

@ -4,6 +4,7 @@ import 'package:crypto/crypto.dart';
import 'package:fast_base58/fast_base58.dart'; import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/api/types/txInfoData.dart'; import 'package:polkawallet_sdk/api/types/txInfoData.dart';
@ -69,7 +70,8 @@ class SubstrateSdk with ChangeNotifier {
Future<String> importAccount( Future<String> importAccount(
{String mnemonic = '', {String mnemonic = '',
bool fromMnemonic = false, bool fromMnemonic = false,
String derivePath = ''}) async { String derivePath = '',
String password = ''}) async {
// toy exercise immense month enter answer table prefer speed cycle gold phone // toy exercise immense month enter answer table prefer speed cycle gold phone
final clipboardData = await Clipboard.getData(Clipboard.kTextPlain); final clipboardData = await Clipboard.getData(Clipboard.kTextPlain);
if (mnemonic != '') { if (mnemonic != '') {
@ -80,6 +82,10 @@ class SubstrateSdk with ChangeNotifier {
generatedMnemonic = clipboardData.text!; generatedMnemonic = clipboardData.text!;
} }
if (password == '') {
password = keystorePassword.text;
}
final KeyType keytype; final KeyType keytype;
final String keyToImport; final String keyToImport;
if (fromMnemonic) { if (fromMnemonic) {
@ -97,8 +103,8 @@ class SubstrateSdk with ChangeNotifier {
.importAccount(keyring, .importAccount(keyring,
keyType: keytype, keyType: keytype,
key: keyToImport, key: keyToImport,
name: 'testKey', name: derivePath,
password: keystorePassword.text, password: password,
derivePath: derivePath, derivePath: derivePath,
cryptoType: CryptoType.sr25519) cryptoType: CryptoType.sr25519)
.catchError((e) { .catchError((e) {
@ -107,16 +113,16 @@ class SubstrateSdk with ChangeNotifier {
}); });
if (json == null) return ''; if (json == null) return '';
print(json); print(json);
late KeyPairData? keyPairData;
try { try {
keyPairData = await sdk.api.keyring.addAccount( await sdk.api.keyring.addAccount(
keyring, keyring,
keyType: keytype, keyType: keytype,
acc: json, acc: json,
password: keystorePassword.text, password: password,
); );
// Clipboard.setData(ClipboardData(text: jsonEncode(acc.toJson()))); // Clipboard.setData(ClipboardData(text: jsonEncode(acc.toJson())));
} catch (e) { } catch (e) {
print(e);
importIsLoading = false; importIsLoading = false;
notifyListeners(); notifyListeners();
} }
@ -124,7 +130,8 @@ class SubstrateSdk with ChangeNotifier {
importIsLoading = false; importIsLoading = false;
await Future.delayed(const Duration(milliseconds: 20)); await Future.delayed(const Duration(milliseconds: 20));
notifyListeners(); notifyListeners();
return keyPairData!.address!; final bakedAddress = keyring.allAccounts.last.address;
return bakedAddress!;
} }
void reload() { void reload() {
@ -142,23 +149,56 @@ class SubstrateSdk with ChangeNotifier {
// account.balance = int.parse(p0.freeBalance) / 100; // account.balance = int.parse(p0.freeBalance) / 100;
// }); // });
// sdk.api.setting.unsubscribeBestNumber(); // sdk.api.setting.unsubscribeBestNumber();
if (nodeConnected) { account.balance = await getBalance(element.address!);
final brutBalance = await sdk.api.account.queryBalance(element.address);
account.balance = int.parse(brutBalance!.freeBalance) / 100;
}
result.add(account); result.add(account);
print('waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
print(element.indexInfo);
print(element.memo);
} }
return result; return result;
} }
Future<double> getBalance(String address, {bool isUd = false}) async {
double balance = 0.0;
if (nodeConnected) {
final brutBalance = await sdk.api.account.queryBalance(address);
balance = int.parse(brutBalance!.freeBalance) / 100;
}
return balance;
}
KeyPairData getKeypair(String address) {
return keyring.keyPairs.firstWhere((kp) => kp.address == address,
orElse: (() => KeyPairData()));
}
Future<bool> checkPassword(String address, String pass) async {
final account = getKeypair(address);
return await sdk.api.keyring.checkPassword(account, pass);
}
int getDerivationNumber(String address) {
final account = getKeypair(address);
final deriveNbr = account.name!.split('/')[1];
return int.parse(deriveNbr);
}
Future<KeyPairData?> changePassword(
String address, String passOld, String? passNew) async {
final account = getKeypair(address);
keyring.setCurrent(account);
return await sdk.api.keyring.changePassword(keyring, passOld, passNew);
}
Future<void> deleteAllAccounts() async { Future<void> deleteAllAccounts() async {
for (var account in keyring.allAccounts) { for (var account in keyring.allAccounts) {
await sdk.api.keyring.deleteAccount(keyring, account); await sdk.api.keyring.deleteAccount(keyring, account);
} }
} }
Future<String> generateMnemonic({String lang = 'english'}) async { Future<String> generateMnemonic({String lang = appLang}) async {
final gen = await sdk.api.keyring.generateMnemonic(ss58); final gen = await sdk.api.keyring.generateMnemonic(ss58);
generatedMnemonic = gen.mnemonic!; generatedMnemonic = gen.mnemonic!;
@ -192,16 +232,16 @@ class SubstrateSdk with ChangeNotifier {
} }
} }
derive( Future<String> derive(
BuildContext context, String address, int number, String password) async { BuildContext context, String address, int number, String password) async {
final keypair = final keypair = getKeypair(address);
keyring.keyPairs.firstWhere((element) => element.address == address);
final seedMap = final seedMap =
await keyring.store.getDecryptedSeed(keypair.pubKey, password); await keyring.store.getDecryptedSeed(keypair.pubKey, password);
print(seedMap); print(seedMap);
if (seedMap!['type'] != 'mnemonic') return;
final List seedList = seedMap['seed'].split('/'); if (seedMap?['type'] != 'mnemonic') return '';
final List seedList = seedMap!['seed'].split('/');
generatedMnemonic = seedList[0]; generatedMnemonic = seedList[0];
int sourceDerivation = -1; // To get derivation number of this account int sourceDerivation = -1; // To get derivation number of this account
if (seedList.length > 1) { if (seedList.length > 1) {
@ -210,7 +250,7 @@ class SubstrateSdk with ChangeNotifier {
print(generatedMnemonic); print(generatedMnemonic);
print(sourceDerivation); print(sourceDerivation);
importAccount(fromMnemonic: true, derivePath: '/$number'); return await importAccount(fromMnemonic: true, derivePath: '/$number');
} }
} }

View File

@ -1,6 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:crypto/crypto.dart'; import 'package:crypto/crypto.dart';
import 'package:durt/durt.dart';
import 'package:fast_base58/fast_base58.dart'; import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async'; import 'dart:async';
@ -12,7 +11,7 @@ import 'package:image_picker/image_picker.dart';
import 'package:truncate/truncate.dart'; import 'package:truncate/truncate.dart';
class WalletOptionsProvider with ChangeNotifier { class WalletOptionsProvider with ChangeNotifier {
TextEditingController pubkey = TextEditingController(); TextEditingController address = TextEditingController();
final TextEditingController _newWalletName = TextEditingController(); final TextEditingController _newWalletName = TextEditingController();
bool isWalletUnlock = false; bool isWalletUnlock = false;
bool ischangedPin = false; bool ischangedPin = false;
@ -25,82 +24,6 @@ class WalletOptionsProvider with ChangeNotifier {
Future<NewWallet>? get badWallet => null; Future<NewWallet>? get badWallet => null;
String _getPubkeyFromDewif(
String? _dewif, _pin, int _pinLenght, int? derivation) {
RegExp regExp = RegExp(
r'^[A-Z0-9]+$',
caseSensitive: false,
multiLine: false,
);
if (regExp.hasMatch(_pin) == true && _pin.length == _pinLenght) {
} else {
return 'false';
}
if (derivation != -1) {
try {
final _wallet = HdWallet.fromDewif(_dewif!, _pin, lang: appLang);
pubkey.text = _wallet.getPubkey(derivation!);
log.d(pubkey.text);
notifyListeners();
return pubkey.text;
} catch (e) {
log.w('Bad PIN code !\n' + e.toString());
notifyListeners();
return 'false';
}
} else {
try {
pubkey.text = CesiumWallet.fromDewif(_dewif!, _pin).pubkey;
notifyListeners();
return pubkey.text;
} catch (e) {
log.w('Bad PIN code !\n' + e.toString());
notifyListeners();
return 'false';
}
}
}
String? readLocalWallet(
context, WalletData _wallet, String _pin, int _pinLenght,
{String? mnemonic}) {
isWalletUnlock = false;
final String _localPubkey;
try {
String? _localDewif = chestBox.get(_wallet.chest)!.dewif;
if (mnemonic == null) {
_localPubkey = _getPubkeyFromDewif(
_localDewif, _pin.toUpperCase(), _pinLenght, _wallet.derivation);
} else {
final _hdwallet = HdWallet.fromMnemonic(mnemonic);
_localPubkey = _hdwallet.getPubkey(_wallet.derivation!);
}
if (_localPubkey != 'false') {
pubkey.text = _localPubkey;
isWalletUnlock = true;
log.d(pubkey.text);
return _localDewif;
} else {
throw 'Bad pubkey';
}
} on ChecksumException catch (e) {
log.e(e.cause);
return 'bad';
} catch (e) {
// _homeProvider.playSound('non', 0.6);
log.e('ERROR READING FILE: $e');
pubkey.clear();
return 'bad';
}
}
int getPinLenght(_walletNbr) { int getPinLenght(_walletNbr) {
// TODOo: Get real Dewif lenght // TODOo: Get real Dewif lenght
// String _localDewif; // String _localDewif;
@ -116,11 +39,6 @@ class WalletOptionsProvider with ChangeNotifier {
return pinLength; return pinLength;
} }
Future<double> getBalance(String pubkey, {bool isUd = false}) async {
final node = Gva(node: endPointGVA);
return await node.balance(pubkey, ud: isUd);
}
void _renameWallet(List<int?> _walletID, _newName, void _renameWallet(List<int?> _walletID, _newName,
{required bool isCesium}) async { {required bool isCesium}) async {
if (isCesium) { if (isCesium) {
@ -252,4 +170,18 @@ class WalletOptionsProvider with ChangeNotifier {
void reloadBuild() { void reloadBuild() {
notifyListeners(); notifyListeners();
} }
String? getAddress(int chest, int derivation) {
String? _address;
walletBox.toMap().forEach((key, value) {
if (value.chest == chest) {
_address = value.address!;
return;
}
});
address.text = _address ?? '';
return _address;
}
} }

View File

@ -103,7 +103,7 @@ 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) {
await _sub.connectNode(); await _sub.connectNode(); //kopa
} }
if (isWalletsExists) homeClass.snackNode(ctx); if (isWalletsExists) homeClass.snackNode(ctx);
}); });

View File

@ -38,7 +38,7 @@ class CesiumWalletOptions extends StatelessWidget {
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final String shortPubkey = final String shortPubkey =
_walletOptions.getShortPubkey(_walletOptions.pubkey.text); _walletOptions.getShortPubkey(_walletOptions.address.text);
if (_isNewNameValid == false) { if (_isNewNameValid == false) {
_walletOptions.nameController.text = cesiumWallet.name!; _walletOptions.nameController.text = cesiumWallet.name!;
@ -158,7 +158,7 @@ class CesiumWalletOptions extends StatelessWidget {
options: QueryOptions( options: QueryOptions(
document: gql(getBalance), document: gql(getBalance),
variables: { variables: {
'pubkey': _walletOptions.pubkey.text, 'pubkey': _walletOptions.address.text,
}, },
// pollInterval: Duration(seconds: 1), // pollInterval: Duration(seconds: 1),
), ),
@ -257,7 +257,7 @@ class CesiumWalletOptions extends StatelessWidget {
}), }),
SizedBox(height: 4 * ratio), SizedBox(height: 4 * ratio),
QrImageWidget( QrImageWidget(
data: _walletOptions.pubkey.text, data: _walletOptions.address.text,
version: QrVersions.auto, version: QrVersions.auto,
size: isTall ? 300 : 270, size: isTall ? 300 : 270,
), ),
@ -266,7 +266,7 @@ class CesiumWalletOptions extends StatelessWidget {
key: const Key('copyPubkey'), key: const Key('copyPubkey'),
onTap: () { onTap: () {
Clipboard.setData( Clipboard.setData(
ClipboardData(text: _walletOptions.pubkey.text)); ClipboardData(text: _walletOptions.address.text));
_walletOptions.snackCopyKey(ctx); _walletOptions.snackCopyKey(ctx);
}, },
child: SizedBox( child: SizedBox(
@ -303,7 +303,7 @@ class CesiumWalletOptions extends StatelessWidget {
), ),
onPressed: () { onPressed: () {
Clipboard.setData(ClipboardData( Clipboard.setData(ClipboardData(
text: _walletOptions.pubkey.text)); text: _walletOptions.address.text));
_walletOptions.snackCopyKey(ctx); _walletOptions.snackCopyKey(ctx);
}, },
child: Row(children: <Widget>[ child: Row(children: <Widget>[
@ -326,7 +326,7 @@ class CesiumWalletOptions extends StatelessWidget {
context, context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return HistoryScreen( return HistoryScreen(
pubkey: _walletOptions.pubkey.text); pubkey: _walletOptions.address.text);
}), }),
); );
}, },

View File

@ -3,9 +3,10 @@ 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/providers/change_pin.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'dart:io'; import 'dart:io';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// ignore: must_be_immutable // ignore: must_be_immutable
@ -19,15 +20,16 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
final MyWalletsProvider walletProvider; final MyWalletsProvider walletProvider;
Directory? appPath; Directory? appPath;
TextEditingController newPin = TextEditingController();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
ChangePinProvider _changePin = Provider.of<ChangePinProvider>(context); SubstrateSdk _sdk = Provider.of<SubstrateSdk>(context, listen: false);
// _walletOptions.changePin(walletName, oldPin);
// _walletOptions.newPin.text = _tmpPin;
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
_changePin.newPin.text = ''; newPin.text = '';
return Future<bool>.value(true); return Future<bool>.value(true);
}, },
child: Scaffold( child: Scaffold(
@ -37,7 +39,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
leading: IconButton( leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black), icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () { onPressed: () {
_changePin.newPin.text = ''; newPin.text = '';
Navigator.of(context).pop(); Navigator.of(context).pop();
}), }),
title: SizedBox( title: SizedBox(
@ -50,7 +52,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
child: Column(children: <Widget>[ child: Column(children: <Widget>[
StatefulWrapper( StatefulWrapper(
onInit: () { onInit: () {
_changePin.newPin.text = randomSecretCode(pinLength); newPin.text = randomSecretCode(pinLength);
}, },
child: Container(), child: Container(),
), ),
@ -69,7 +71,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
children: <Widget>[ children: <Widget>[
TextField( TextField(
enabled: false, enabled: false,
controller: _changePin.newPin, controller: newPin,
maxLines: 1, maxLines: 1,
textAlign: TextAlign.center, textAlign: TextAlign.center,
decoration: const InputDecoration(), decoration: const InputDecoration(),
@ -81,7 +83,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
icon: const Icon(Icons.replay), icon: const Icon(Icons.replay),
color: orangeC, color: orangeC,
onPressed: () async { onPressed: () async {
_changePin.newPin.text = randomSecretCode(pinLength); newPin.text = randomSecretCode(pinLength);
}, },
), ),
], ],
@ -97,12 +99,10 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
onPrimary: Colors.black, // foreground onPrimary: Colors.black, // foreground
), ),
onPressed: () async { onPressed: () async {
NewWallet? _newWalletFile = await _changePin.changePin( final _chest = chestBox.get(configBox.get('currentChest'));
walletProvider.pinCode, _sdk.changePassword(_chest!.address!, walletProvider.pinCode, newPin.text);
newCustomPin: _changePin.newPin.text); newPin.text = '';
_changePin.newPin.text = ''; walletProvider.pinCode = newPin.text;
_changePin.storeNewPinChest(context, _newWalletFile!);
walletProvider.pinCode = _changePin.newPin.text;
}, },
child: const Text( child: const Text(
'Confirmer', 'Confirmer',

View File

@ -5,6 +5,7 @@ import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/providers/generate_wallets.dart'; import 'package:gecko/providers/generate_wallets.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/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -32,6 +33,7 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
final int? _currentChest = _myWalletProvider.getCurrentChest(); final int? _currentChest = _myWalletProvider.getCurrentChest();
SubstrateSdk _sdk = Provider.of<SubstrateSdk>(context, listen: false);
_mnemonicController.text = generatedMnemonic!; _mnemonicController.text = generatedMnemonic!;
return WillPopScope( return WillPopScope(
@ -134,9 +136,16 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
.isAskedWordValid && .isAskedWordValid &&
walletName.text != '') walletName.text != '')
? () async { ? () async {
_generateWalletProvider.storeHDWChest( final address = await _sdk.importAccount(
generatedWallet!.dewif, fromMnemonic: true,
walletName.text, mnemonic: _generateWalletProvider
.generatedMnemonic!,
password:
_generateWalletProvider.pin.text,
derivePath: '/3');
await _generateWalletProvider.storeHDWChest(
address,
'Mon portefeuille courant',
context); context);
_generateWalletProvider.isAskedWordValid = _generateWalletProvider.isAskedWordValid =
false; false;

View File

@ -23,14 +23,9 @@ class GenerateFastChestScreen extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider _generateWalletProvider = GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context, listen: false);
if (_generateWalletProvider.mnemonicController.text == '') { _generateWalletProvider.changePinCode(reload: false);
_generateWalletProvider.generateWordList(context);
_generateWalletProvider.mnemonicController.text =
_generateWalletProvider.generatedMnemonic!;
_generateWalletProvider.pin.text = randomSecretCode(pinLength);
}
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
@ -59,9 +54,7 @@ class GenerateFastChestScreen extends StatelessWidget {
child: FloatingActionButton( child: FloatingActionButton(
heroTag: "buttonGenerateWallet", heroTag: "buttonGenerateWallet",
onPressed: () { onPressed: () {
_generateWalletProvider.generateWordList(context); _generateWalletProvider.reloadBuild();
_generateWalletProvider.mnemonicController.text =
_generateWalletProvider.generatedMnemonic!;
}, },
child: SizedBox( child: SizedBox(
height: 40.0, height: 40.0,
@ -77,18 +70,23 @@ class GenerateFastChestScreen extends StatelessWidget {
const SizedBox(height: 20), const SizedBox(height: 20),
toolTips(_toolTipSentence, 'Phrase de restauration:', toolTips(_toolTipSentence, 'Phrase de restauration:',
"Notez et gardez cette phrase précieusement sur un papier, elle vous servira à restaurer votre portefeuille sur un autre appareil"), "Notez et gardez cette phrase précieusement sur un papier, elle vous servira à restaurer votre portefeuille sur un autre appareil"),
TextField( Consumer<GenerateWalletsProvider>(builder: (context, _gWP, _) {
enabled: false, return FutureBuilder(
controller: _generateWalletProvider.mnemonicController, future: _gWP.generateWordList(context),
maxLines: 3, builder: (BuildContext context, AsyncSnapshot<List> _data) {
textAlign: TextAlign.center, if (!_data.hasData) {
decoration: const InputDecoration( return const Text('');
contentPadding: EdgeInsets.all(15.0), } else {
), return Text(_gWP.generatedMnemonic!,
style: const TextStyle( maxLines: 3,
fontSize: 22.0, textAlign: TextAlign.center,
color: Colors.black, style: const TextStyle(
fontWeight: FontWeight.w400)), fontSize: 22.0,
color: Colors.black,
fontWeight: FontWeight.w400));
}
});
}),
const SizedBox(height: 8), const SizedBox(height: 8),
toolTips(_toolTipSecret, 'Code secret:', toolTips(_toolTipSecret, 'Code secret:',
"Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"), "Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
@ -110,7 +108,7 @@ class GenerateFastChestScreen extends StatelessWidget {
icon: const Icon(Icons.replay), icon: const Icon(Icons.replay),
color: orangeC, color: orangeC,
onPressed: () { onPressed: () {
_generateWalletProvider.changePinCode(reload: true); _generateWalletProvider.changePinCode(reload: false);
}, },
), ),
], ],

View File

@ -1,244 +0,0 @@
import 'dart:async';
import 'package:durt/durt.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/generate_wallets.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart';
class ImportWalletScreen extends StatelessWidget {
const ImportWalletScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GlobalKey _toolTipSecret = GlobalKey();
Timer? _debounce;
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false);
WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
_generateWalletProvider.pin.text = randomSecretCode(pinLength);
return WillPopScope(
onWillPop: () {
_generateWalletProvider.resetCesiumImportView();
return Future<bool>.value(true);
},
child: Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_generateWalletProvider.resetCesiumImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
height: 22,
child: Text('Importer un portefeuille'),
)),
body: Builder(
builder: (ctx) => SafeArea(
child: Column(children: <Widget>[
const SizedBox(height: 20),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return TextFormField(
autofocus: true,
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce!.cancel();
}
_debounce = Timer(const Duration(milliseconds: 600), () {
walletProvider
.generateCesiumWalletPubkey(
text, walletProvider.cesiumPWD.text)
.then((value) {
walletProvider.canImport = true;
walletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: walletProvider.cesiumID,
obscureText: !walletProvider
.isCesiumIDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre identifiant Cesium',
suffixIcon: IconButton(
icon: Icon(
walletProvider.isCesiumIDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
walletProvider.cesiumIDisVisible();
},
),
),
);
}),
const SizedBox(height: 15),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return TextFormField(
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce!.cancel();
}
_debounce = Timer(const Duration(milliseconds: 600), () {
walletProvider
.generateCesiumWalletPubkey(
walletProvider.cesiumID.text, text)
.then((value) {
walletProvider.canImport = true;
walletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: walletProvider.cesiumPWD,
obscureText: !walletProvider
.isCesiumPWDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre mot de passe Cesium',
suffixIcon: IconButton(
icon: Icon(
walletProvider.isCesiumPWDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
walletProvider.cesiumPWDisVisible();
},
),
),
);
}),
const SizedBox(height: 15),
GestureDetector(
onTap: () {
Clipboard.setData(ClipboardData(
text: _generateWalletProvider.cesiumPubkey.text));
_walletOptions.snackCopyKey(ctx);
},
child: Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return Text(
_generateWalletProvider.cesiumPubkey.text,
style: const TextStyle(
fontSize: 14.0,
color: Colors.black,
fontWeight: FontWeight.bold,
fontFamily: 'Monospace'),
);
}),
),
const SizedBox(height: 20),
toolTips(_toolTipSecret, 'Code secret:',
"Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
Stack(
alignment: Alignment.centerRight,
children: <Widget>[
TextField(
enabled: false,
controller: _generateWalletProvider.pin,
maxLines: 1,
textAlign: TextAlign.center,
decoration: const InputDecoration(),
style: const TextStyle(
fontSize: 30.0,
color: Colors.black,
fontWeight: FontWeight.bold)),
IconButton(
icon: const Icon(Icons.replay),
color: orangeC,
onPressed: () {
_generateWalletProvider.changePinCode(reload: true);
},
),
],
),
const SizedBox(height: 30),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
primary: yellowC, // background
onPrimary: Colors.black, // foreground
),
onPressed: walletProvider.canImport
? () async {
final chestKey =
await walletProvider.importCesiumWallet();
_myWalletProvider.rebuildWidget();
await Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) {
return UnlockingWallet(
wallet: WalletData(chest: chestKey),
action: "mywallets",
);
}),
ModalRoute.withName('/'),
);
_generateWalletProvider.resetCesiumImportView();
}
: null,
child: const Text(
'Importer ce portefeuille Cesium',
style: TextStyle(fontSize: 20),
),
);
}),
]),
),
),
),
);
}
Widget toolTips(_key, _text, _message) {
return GestureDetector(
onTap: () {
final dynamic _toolTip = _key.currentState;
_toolTip.ensureTooltipVisible();
},
child: Tooltip(
padding: const EdgeInsets.all(10),
key: _key,
showDuration: const Duration(seconds: 5),
message: _message,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const SizedBox(width: 20),
Column(children: <Widget>[
SizedBox(
width: 30,
height: 25,
child:
Icon(Icons.info_outline, size: 22, color: orangeC)),
const SizedBox(height: 1)
]),
Text(
_text,
style: TextStyle(
fontSize: 15.0,
color: Colors.grey[600],
fontWeight: FontWeight.w400),
),
const SizedBox(width: 45)
])));
}
}

View File

@ -1,7 +1,9 @@
// ignore_for_file: avoid_print
import 'dart:async'; import 'dart:async';
import 'package:durt/durt.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.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';
@ -34,17 +36,12 @@ class UnlockingWallet extends StatelessWidget {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletOptionsProvider _walletOptions = WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(context); Provider.of<WalletOptionsProvider>(context);
final double statusBarHeight = MediaQuery.of(context).padding.top; // final double statusBarHeight = MediaQuery.of(context).padding.top;
int _pinLenght; int _pinLenght;
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!; ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
if (currentChest.isCesium!) { _pinLenght = _walletOptions.getPinLenght(wallet!.number);
_pinLenght = _walletOptions.getPinLenght(currentChest.dewif);
wallet = WalletData(derivation: -1, chest: currentChest.key);
} else {
_pinLenght = _walletOptions.getPinLenght(wallet!.number);
}
errorController = StreamController<ErrorAnimationType>(); errorController = StreamController<ErrorAnimationType>();
return Scaffold( return Scaffold(
@ -55,7 +52,7 @@ class UnlockingWallet extends StatelessWidget {
children: <Widget>[ children: <Widget>[
Stack(children: <Widget>[ Stack(children: <Widget>[
Positioned( Positioned(
top: statusBarHeight + 10, top: 10, //statusBarHeight + 10,
left: 15, left: 15,
child: Builder( child: Builder(
builder: (context) => IconButton( builder: (context) => IconButton(
@ -63,7 +60,7 @@ class UnlockingWallet extends StatelessWidget {
icon: const Icon( icon: const Icon(
Icons.arrow_back, Icons.arrow_back,
color: Colors.black, color: Colors.black,
size: 25, size: 30,
), ),
onPressed: () => Navigator.pop(context), onPressed: () => Navigator.pop(context),
), ),
@ -150,6 +147,8 @@ class UnlockingWallet extends StatelessWidget {
WalletsProfilesProvider _historyProvider = WalletsProfilesProvider _historyProvider =
Provider.of<WalletsProfilesProvider>(context); Provider.of<WalletsProfilesProvider>(context);
SubstrateSdk _sdk = Provider.of<SubstrateSdk>(context, listen: false);
FocusNode pinFocus = FocusNode(); FocusNode pinFocus = FocusNode();
return Form( return Form(
@ -201,30 +200,12 @@ class UnlockingWallet extends StatelessWidget {
], ],
onCompleted: (_pin) async { onCompleted: (_pin) async {
log.d("Completed"); log.d("Completed");
_myWalletProvider.pinCode = _pin; _myWalletProvider.pinCode = _pin.toUpperCase();
if (currentChest.isCesium!) { final isValid = await _sdk.checkPassword(
try { currentChest.address!, _pin.toUpperCase());
String _localDewif = chestBox.get(wallet!.chest)!.dewif!;
final cesiumWallet =
CesiumWallet.fromDewif(_localDewif, _pin.toUpperCase());
_walletOptions.pubkey.text = cesiumWallet.pubkey;
_myWalletProvider.cesiumSeed = cesiumWallet.seed;
_myWalletProvider.mnemonic = 'cesium';
} catch (e) {
log.e(e);
_myWalletProvider.mnemonic = 'bad';
}
} else {
_myWalletProvider.mnemonic = _myWalletProvider.dewifToMnemonic(
context, wallet!, _pin.toUpperCase());
}
// final String? resultWallet = _walletOptions.readLocalWallet(
// context, wallet!, _pin.toUpperCase(), _pinLenght);
// _myWalletProvider.pinCode = _pin.toUpperCase();
_myWalletProvider.pinLenght = _pinLenght;
if (_myWalletProvider.mnemonic == 'bad') { if (!isValid) {
await Future.delayed(const Duration(milliseconds: 50)); await Future.delayed(const Duration(milliseconds: 50));
errorController.add(ErrorAnimationType errorController.add(ErrorAnimationType
.shake); // Triggering error shake animation .shake); // Triggering error shake animation

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.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/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/history.dart'; import 'package:gecko/screens/history.dart';
@ -27,7 +28,7 @@ class WalletOptions extends StatelessWidget {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
log.d(_walletOptions.pubkey.text); log.d(_walletOptions.address.text);
final int _currentChest = _myWalletProvider.getCurrentChest()!; final int _currentChest = _myWalletProvider.getCurrentChest()!;
@ -97,7 +98,7 @@ class WalletOptions extends StatelessWidget {
}), }),
SizedBox(height: 4 * ratio), SizedBox(height: 4 * ratio),
QrImageWidget( QrImageWidget(
data: _walletOptions.pubkey.text, data: _walletOptions.address.text,
version: QrVersions.auto, version: QrVersions.auto,
size: isTall ? 300 : 270, size: isTall ? 300 : 270,
), ),
@ -221,9 +222,10 @@ class WalletOptions extends StatelessWidget {
} }
Widget balance(WalletOptionsProvider walletProvider) { Widget balance(WalletOptionsProvider walletProvider) {
SubstrateSdk _sdk = SubstrateSdk();
return Column(children: <Widget>[ return Column(children: <Widget>[
FutureBuilder( FutureBuilder(
future: walletProvider.getBalance(walletProvider.pubkey.text), future: _sdk.getBalance(walletProvider.address.text),
builder: (BuildContext context, AsyncSnapshot<num?> _balance) { builder: (BuildContext context, AsyncSnapshot<num?> _balance) {
if (_balance.connectionState != ConnectionState.done || if (_balance.connectionState != ConnectionState.done ||
_balance.hasError) { _balance.hasError) {
@ -262,11 +264,11 @@ class WalletOptions extends StatelessWidget {
Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) { Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) {
final String shortPubkey = final String shortPubkey =
walletProvider.getShortPubkey(walletProvider.pubkey.text); walletProvider.getShortPubkey(walletProvider.address.text);
return GestureDetector( return GestureDetector(
key: const Key('copyPubkey'), key: const Key('copyPubkey'),
onTap: () { onTap: () {
Clipboard.setData(ClipboardData(text: walletProvider.pubkey.text)); Clipboard.setData(ClipboardData(text: walletProvider.address.text));
walletProvider.snackCopyKey(ctx); walletProvider.snackCopyKey(ctx);
}, },
child: SizedBox( child: SizedBox(
@ -303,7 +305,7 @@ class WalletOptions extends StatelessWidget {
), ),
onPressed: () { onPressed: () {
Clipboard.setData( Clipboard.setData(
ClipboardData(text: walletProvider.pubkey.text)); ClipboardData(text: walletProvider.address.text));
walletProvider.snackCopyKey(ctx); walletProvider.snackCopyKey(ctx);
}, },
child: Row(children: <Widget>[ child: Row(children: <Widget>[
@ -336,7 +338,7 @@ class WalletOptions extends StatelessWidget {
context, context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return HistoryScreen( return HistoryScreen(
pubkey: walletProvider.pubkey.text, pubkey: walletProvider.address.text,
avatar: wallet.imageFile == null avatar: wallet.imageFile == null
? Image.asset( ? Image.asset(
'assets/avatars/${wallet.imageName}', 'assets/avatars/${wallet.imageName}',

View File

@ -1,4 +1,3 @@
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/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
@ -55,7 +54,7 @@ class WalletsHome extends StatelessWidget {
backgroundColor: const Color(0xffFFD58D), backgroundColor: const Color(0xffFFD58D),
), ),
body: SafeArea( body: SafeArea(
child: myWalletsTiles(context), child: myWalletsTiles(context, _currentChestNumber!),
), ),
), ),
); );
@ -132,7 +131,7 @@ class WalletsHome extends StatelessWidget {
]); ]);
} }
Widget myWalletsTiles(BuildContext context) { Widget myWalletsTiles(BuildContext context, int _currentChestNumber) {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
WalletOptionsProvider _walletOptions = WalletOptionsProvider _walletOptions =
@ -182,9 +181,8 @@ class WalletsHome extends StatelessWidget {
onTap: () { onTap: () {
// _walletOptions.readLocalWallet(context, _repository, // _walletOptions.readLocalWallet(context, _repository,
// _myWalletProvider.pinCode, pinLength); // _myWalletProvider.pinCode, pinLength);
_walletOptions.pubkey.text = _walletOptions.getAddress(
HdWallet.fromMnemonic(_myWalletProvider.mnemonic) _currentChestNumber, _repository.derivation!);
.getPubkey(_repository.derivation!);
Navigator.push( Navigator.push(
context, context,
SmoothTransition( SmoothTransition(
@ -275,10 +273,8 @@ class WalletsHome extends StatelessWidget {
// _repository, // _repository,
// _myWalletProvider.pinCode, // _myWalletProvider.pinCode,
// pinLength); // pinLength);
_walletOptions.pubkey.text = _walletOptions.getAddress(
HdWallet.fromMnemonic( _currentChestNumber, _repository.derivation!);
_myWalletProvider.mnemonic)
.getPubkey(_repository.derivation!);
Navigator.push( Navigator.push(
context, context,
SmoothTransition( SmoothTransition(

View File

@ -1,10 +1,8 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/import_cesium_wallet.dart';
import 'package:gecko/screens/onBoarding/1.dart'; import 'package:gecko/screens/onBoarding/1.dart';
class NoKeyChainScreen extends StatelessWidget { class NoKeyChainScreen extends StatelessWidget {
@ -66,46 +64,6 @@ class NoKeyChainScreen extends StatelessWidget {
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w500), fontWeight: FontWeight.w500),
), ),
const SizedBox(height: 70),
Container(
child: ClipOval(
child: Material(
color: const Color(0xffFFD58D), // button color
child: InkWell(
splashColor: orangeC, // inkwell color
child: Padding(
padding: const EdgeInsets.all(12),
child:
// Image(
// image: AssetImage('assets/cesium_bw3.png'),
// height: 60),
SvgPicture.asset('assets/cesium_small.svg',
semanticsLabel: 'Cesium Logo', height: 48),
),
onTap: () {
Navigator.push(context,
SlideLeftRoute(page: const ImportWalletScreen()));
}),
),
),
decoration: const BoxDecoration(
shape: BoxShape.circle,
color: Colors.white,
boxShadow: [
BoxShadow(
color: Colors.grey,
blurRadius: 4.0,
offset: Offset(2.0, 2.5),
spreadRadius: 0.5)
],
),
),
const SizedBox(height: 10),
const Text(
"Importer un\nportefeuille Cesium",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.black, fontSize: 13),
)
]), ]),
)); ));
} }

View File

@ -4,7 +4,7 @@ import 'package:flutter/services.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/screens/myWallets/generate_wallets.dart'; import 'package:gecko/screens/myWallets/generate_wallets.dart';
import 'dart:io'; import 'dart:io';
import 'package:gecko/screens/myWallets/import_cesium_wallet.dart'; // import 'package:gecko/screens/myWallets/import_cesium_wallet.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart';
@ -48,14 +48,15 @@ class SettingsScreen extends StatelessWidget {
primary: yellowC, // background primary: yellowC, // background
onPrimary: Colors.black, // foreground onPrimary: Colors.black, // foreground
), ),
onPressed: () => Navigator.push( onPressed: null,
context, // () => Navigator.push(
MaterialPageRoute(builder: (context) { // context,
return const ImportWalletScreen(); // MaterialPageRoute(builder: (context) {
}), // return const ImportWalletScreen();
).then((value) => { // }),
if (value == true) {Navigator.pop(context)} // ).then((value) => {
}), // if (value == true) {Navigator.pop(context)}
// }),
child: const Text( child: const Text(
"Importer un portefeuille Cesium", "Importer un portefeuille Cesium",
style: TextStyle(fontSize: 16), style: TextStyle(fontSize: 16),

View File

@ -94,7 +94,7 @@ class SubstrateSandBox extends StatelessWidget {
child: const Text("Dériver"), child: const Text("Dériver"),
) )
]) ])
]); ]);
}), }),
const SizedBox(height: 20), const SizedBox(height: 20),
const Text('Mot de passe du trousseau:'), const Text('Mot de passe du trousseau:'),

View File

@ -7,7 +7,7 @@ packages:
name: _fe_analyzer_shared name: _fe_analyzer_shared
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "38.0.0" version: "40.0.0"
aes_ecb_pkcs5_flutter: aes_ecb_pkcs5_flutter:
dependency: transitive dependency: transitive
description: description:
@ -21,7 +21,7 @@ packages:
name: analyzer name: analyzer
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.4.1" version: "4.1.0"
archive: archive:
dependency: transitive dependency: transitive
description: description:
@ -126,7 +126,7 @@ packages:
name: build_runner name: build_runner
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.10" version: "2.1.11"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
@ -381,7 +381,7 @@ packages:
name: flutter_logs name: flutter_logs
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "2.1.6"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
@ -412,7 +412,7 @@ packages:
name: frontend_server_client name: frontend_server_client
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
fuchsia_remote_debug_protocol: fuchsia_remote_debug_protocol:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -494,7 +494,7 @@ packages:
name: graphql name: graphql
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.2-beta.1" version: "5.1.1"
graphql_flutter: graphql_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@ -524,7 +524,7 @@ packages:
name: hive name: hive
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.2.1"
hive_flutter: hive_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@ -538,7 +538,7 @@ packages:
name: hive_generator name: hive_generator
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.3"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -573,7 +573,7 @@ packages:
name: icons_launcher name: icons_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.7" version: "1.1.8"
image: image:
dependency: transitive dependency: transitive
description: description:
@ -615,7 +615,7 @@ packages:
name: image_picker_ios name: image_picker_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.8.5+2" version: "0.8.5+4"
image_picker_platform_interface: image_picker_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -1387,7 +1387,7 @@ packages:
name: webview_flutter_platform_interface name: webview_flutter_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.9.0"
webview_flutter_wkwebview: webview_flutter_wkwebview:
dependency: transitive dependency: transitive
description: description:
@ -1401,7 +1401,7 @@ packages:
name: win32 name: win32
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.6.0" version: "2.6.1"
window_size: window_size:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -51,23 +51,20 @@ dependencies:
url: https://github.com/DavBfr/dart_pdf.git url: https://github.com/DavBfr/dart_pdf.git
path: printing path: printing
provider: ^6.0.1 provider: ^6.0.1
# qrscan: ^0.3.2 qrscan: #^0.3.2
qrscan:
git: git:
url: https://github.com/leyan95/qrcode_scanner.git url: https://github.com/leyan95/qrcode_scanner.git
ref: master # branch name ref: master # branch name
# qr_code_scanner: ^0.6.1 # qr_code_scanner: ^0.6.1
# qr_flutter: ^4.0.0 qr_flutter: #^4.0.0
qr_flutter:
git: git:
url: https://github.com/insinfo/qr.flutter.git url: https://github.com/insinfo/qr.flutter.git
ref: master # branch name ref: master # branch name
responsive_builder: ^0.4.1 responsive_builder: ^0.4.1
responsive_framework: ^0.1.4 responsive_framework: ^0.1.4
sentry: 6.5.1 sentry: ^6.5.1
sentry_flutter: ^6.5.1 sentry_flutter: ^6.5.1
shared_preferences: ^2.0.7 shared_preferences: ^2.0.7
# super_tooltip: ^1.0.1
sync_http: ^0.3.0 sync_http: ^0.3.0
test: ^1.17.10 test: ^1.17.10
truncate: ^3.0.1 truncate: ^3.0.1
@ -78,10 +75,7 @@ dependencies:
desktop_window: ^0.4.0 desktop_window: ^0.4.0
durt: ^0.1.6 durt: ^0.1.6
package_info_plus: ^1.4.2 package_info_plus: ^1.4.2
polkawallet_sdk: ^0.4.5 ## Wait for merging PR: https://github.com/polkawallet-io/sdk/pull/19 polkawallet_sdk: ^0.4.5
# git:
# url: git://github.com/poka-IT/sdk.git
# ref: fixAndroidActivityVersion
flutter_icons: flutter_icons:
android: true android: true