diff --git a/lib/globals.dart b/lib/globals.dart index c408d33..5751866 100644 --- a/lib/globals.dart +++ b/lib/globals.dart @@ -2,7 +2,6 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/g1_wallets_list.dart'; -import 'package:gecko/models/keystore_data.dart'; import 'package:gecko/models/wallet_data.dart'; import 'package:hive/hive.dart'; import 'package:logger/logger.dart'; @@ -21,7 +20,7 @@ late Box walletBox; late Box chestBox; late Box configBox; late Box g1WalletsBox; -late Box keystoreBox; +late Box keystoreBox; String cesiumPod = "https://g1.data.le-sou.org"; // String cesiumPod = "https://g1.data.e-is.pro"; diff --git a/lib/main.dart b/lib/main.dart index f4ccde6..775a137 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -19,7 +19,6 @@ import 'dart:async'; import 'dart:io'; import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/keystore_data.dart'; import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/change_pin.dart'; import 'package:gecko/models/chest_data.dart'; @@ -40,7 +39,6 @@ import 'package:gecko/screens/search.dart'; import 'package:gecko/screens/search_result.dart'; import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart'; -import 'package:polkawallet_sdk/storage/types/keyPairData.dart'; import 'package:provider/provider.dart'; import 'package:flutter/foundation.dart'; import 'package:responsive_framework/responsive_framework.dart'; @@ -68,13 +66,13 @@ Future main() async { Hive.registerAdapter(ChestDataAdapter()); Hive.registerAdapter(G1WalletsListAdapter()); Hive.registerAdapter(IdAdapter()); - Hive.registerAdapter(KeyStoreDataAdapter()); - Hive.registerAdapter(KeyPairData()); + // Hive.registerAdapter(KeyStoreDataAdapter()); + walletBox = await Hive.openBox("walletBox"); chestBox = await Hive.openBox("chestBox"); configBox = await Hive.openBox("configBox"); g1WalletsBox = await Hive.openBox("g1WalletsBox"); - keystoreBox = await Hive.openBox("keystoreBox"); + keystoreBox = await Hive.openBox("keystoreBox"); g1WalletsBox.clear(); @@ -185,7 +183,7 @@ class Gecko extends StatelessWidget { ), primaryColor: const Color(0xffFFD58D), textTheme: const TextTheme( - bodyText1: TextStyle(fontSize: 20), + bodyText1: TextStyle(fontSize: 16), bodyText2: TextStyle(fontSize: 18), ).apply( bodyColor: const Color(0xFF000000), diff --git a/lib/providers/substrate_sdk.dart b/lib/providers/substrate_sdk.dart index 774a3a5..7395d2b 100644 --- a/lib/providers/substrate_sdk.dart +++ b/lib/providers/substrate_sdk.dart @@ -1,6 +1,8 @@ +import 'dart:convert'; +import 'dart:math'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:gecko/globals.dart'; -import 'package:gecko/models/keystore_data.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/polkawallet_sdk.dart'; @@ -13,6 +15,7 @@ class SubstrateSdk with ChangeNotifier { final WalletSDK sdk = WalletSDK(); final Keyring keyring = Keyring(); bool sdkReady = false; + bool sdkLoading = false; bool nodeConnected = false; int blocNumber = 0; @@ -20,10 +23,12 @@ class SubstrateSdk with ChangeNotifier { TextEditingController keystorePassword = TextEditingController(); Future initApi() async { + sdkLoading = true; await keyring.init([0, 2]); await sdk.init(keyring); sdkReady = true; + sdkLoading = false; notifyListeners(); } @@ -39,6 +44,7 @@ class SubstrateSdk with ChangeNotifier { ); if (res != null) { nodeConnected = true; + print("Connecté au noeud ${sdk.api.connectedNode!.name}"); notifyListeners(); } @@ -53,7 +59,7 @@ class SubstrateSdk with ChangeNotifier { final json = await sdk.api.keyring.importAccount( keyring, keyType: KeyType.keystore, - key: jsonKeystore.text, + key: jsonKeystore.text.replaceAll("'", "\\'"), name: 'testKey', password: keystorePassword.text, ); @@ -64,12 +70,29 @@ class SubstrateSdk with ChangeNotifier { password: keystorePassword.text, ); - KeyStoreData _keystore = KeyStoreData(keystore: acc); - await keystoreBox.add(_keystore); + // await keystoreBox.clear(); + await keystoreBox.add(acc.toJson()); + Clipboard.setData(ClipboardData(text: jsonEncode(acc.toJson()))); notifyListeners(); } void reload() { notifyListeners(); } + + List getKeyStoreAddress() { + List result = []; + + for (var element in keystoreBox.values) { + // Clipboard.setData(ClipboardData(text: jsonEncode(element))); + result.add(element['address']); + } + + return result; + } + + Future generateMnemonic() async { + final gen = await sdk.api.keyring.generateMnemonic(42); + return gen.mnemonic!; + } } diff --git a/lib/screens/home.dart b/lib/screens/home.dart index fe80eee..4ca2a72 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -2,6 +2,7 @@ import 'package:bubble/bubble.dart'; import 'package:gecko/globals.dart'; import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/providers/chest_provider.dart'; +import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/wallets_profiles.dart'; import 'package:flutter/material.dart'; import 'package:gecko/providers/home.dart'; @@ -27,6 +28,7 @@ class HomeScreen extends StatelessWidget { Provider.of(context); Provider.of(context); HomeProvider homeClass = HomeProvider(); + SubstrateSdk _sub = Provider.of(context, listen: false); final bool isWalletsExists = _myWalletProvider.checkIfWalletExist(); @@ -84,7 +86,9 @@ class HomeScreen extends StatelessWidget { body: Builder( builder: (ctx) => StatefulWrapper( onInit: () { - WidgetsBinding.instance!.addPostFrameCallback((_) { + WidgetsBinding.instance!.addPostFrameCallback((_) async { + if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi(); + if (_sub.sdkReady && !_sub.nodeConnected) await _sub.connectNode(); if (isWalletsExists) homeClass.snackNode(ctx); }); }, @@ -533,7 +537,6 @@ Widget welcomeHome(context) { ); } - Widget bubbleSpeak(String text, {double? long, Key? textKey}) { return Bubble( padding: long == null diff --git a/lib/screens/substrate_sandbox.dart b/lib/screens/substrate_sandbox.dart index 0f91dd7..16dd38e 100644 --- a/lib/screens/substrate_sandbox.dart +++ b/lib/screens/substrate_sandbox.dart @@ -9,12 +9,12 @@ class SubstrateSandBox extends StatelessWidget { @override Widget build(BuildContext context) { - SubstrateSdk _sub = Provider.of(context, listen: false); + // SubstrateSdk _sub = Provider.of(context, listen: false); return StatefulWrapper( onInit: () async { - await _sub.initApi(); - await _sub.connectNode(); + // if (!_sub.sdkReady && !_sub.sdkLoading) await _sub.initApi(); + // if (_sub.sdkReady && !_sub.nodeConnected) await _sub.connectNode(); }, child: Scaffold( appBar: AppBar( @@ -26,51 +26,75 @@ class SubstrateSandBox extends StatelessWidget { ), body: SafeArea( child: Consumer(builder: (context, _sub, _) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('js-api chargé ?: ${_sub.sdkReady}'), - Text( - 'Noeud connecté ?: ${_sub.nodeConnected} (${_sub.subNode})'), - if (_sub.nodeConnected) - Text('Numéro de bloc: ${_sub.blocNumber}'), - const SizedBox(height: 20), - const Text('List des trousseaux:'), - Text(keystoreBox.isEmpty - ? '-' - : keystoreBox.toMap().entries.toString()), - const SizedBox(height: 20), - const Text('Trousseau:'), - TextField( - controller: _sub.jsonKeystore, - onChanged: (_) => _sub.reload(), - minLines: 5, - maxLines: 5, - ), - const SizedBox(height: 20), - const Text('Mot de passe:'), - TextField( - controller: _sub.keystorePassword, - onChanged: (_) => _sub.reload(), - ), - const SizedBox(height: 20), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( - style: ElevatedButton.styleFrom( - primary: yellowC, // background - onPrimary: Colors.black, // foreground - ), - onPressed: _sub.jsonKeystore.text.isNotEmpty && - _sub.keystorePassword.text.isNotEmpty - ? () async => await _sub.importFromKeystore() - : null, - child: const Text( - 'Importer la trousseau', - style: TextStyle(fontSize: 20), - ), + return SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('js-api chargé ?: ${_sub.sdkReady}'), + InkWell( + onTap: !_sub.nodeConnected + ? () async { + await _sub.connectNode(); + } + : null, + child: Text( + 'Noeud connecté ?: ${_sub.nodeConnected} (${_sub.subNode})')), + if (_sub.nodeConnected) + Text( + 'Noeud "${_sub.sdk.api.connectedNode!.name}", bloc N°${_sub.blocNumber}'), + const SizedBox(height: 20), + const Text('Liste des trousseaux:'), + Text(keystoreBox.isEmpty + ? '-' + : _sub.getKeyStoreAddress().toString()), + const SizedBox(height: 40), + const Text('Trousseau:'), + TextField( + controller: _sub.jsonKeystore, + onChanged: (_) => _sub.reload(), + minLines: 5, + maxLines: 5, ), + const SizedBox(height: 20), + const Text('Mot de passe:'), + TextField( + controller: _sub.keystorePassword, + obscureText: true, + obscuringCharacter: '•', + onChanged: (_) => _sub.reload(), + ), + const SizedBox(height: 20), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: yellowC, // background + onPrimary: Colors.black, // foreground + ), + onPressed: _sub.jsonKeystore.text.isNotEmpty && + _sub.keystorePassword.text.isNotEmpty + ? () async => await _sub.importFromKeystore() + : null, + child: const Text( + 'Importer la trousseau', + style: TextStyle(fontSize: 20), + ), + ), + const SizedBox(height: 40), + ElevatedButton( + style: ElevatedButton.styleFrom( + primary: yellowC, // background + onPrimary: Colors.black, // foreground + ), + onPressed: () async => + print(await _sub.generateMnemonic()), + child: const Text( + 'Générer un mnemonic', + style: TextStyle(fontSize: 20), + ), + ), + ]), ]), - ]); + ); }), ), ),