diff --git a/assets/chests/1.png b/assets/chests/1.png
index 327ce15..419b1ac 100644
Binary files a/assets/chests/1.png and b/assets/chests/1.png differ
diff --git a/assets/chests/2.png b/assets/chests/2.png
index bfb1a08..4ed6b34 100644
Binary files a/assets/chests/2.png and b/assets/chests/2.png differ
diff --git a/assets/chests/3.png b/assets/chests/3.png
index fb93100..66add24 100644
Binary files a/assets/chests/3.png and b/assets/chests/3.png differ
diff --git a/assets/chests/4.png b/assets/chests/4.png
index a759503..7bc245f 100644
Binary files a/assets/chests/4.png and b/assets/chests/4.png differ
diff --git a/assets/chests/5.png b/assets/chests/5.png
index 84d1490..8852a69 100644
Binary files a/assets/chests/5.png and b/assets/chests/5.png differ
diff --git a/assets/chests/6.png b/assets/chests/6.png
index 8f1556b..1de8739 100644
Binary files a/assets/chests/6.png and b/assets/chests/6.png differ
diff --git a/assets/chests/7.png b/assets/chests/7.png
index c34e084..06bae0e 100644
Binary files a/assets/chests/7.png and b/assets/chests/7.png differ
diff --git a/assets/chests/secret_code.png b/assets/chests/secret_code.png
old mode 100755
new mode 100644
index 10ef999..495717e
Binary files a/assets/chests/secret_code.png and b/assets/chests/secret_code.png differ
diff --git a/assets/chests/vector.png b/assets/chests/vector.png
old mode 100755
new mode 100644
index 3fb42db..9eb11a7
Binary files a/assets/chests/vector.png and b/assets/chests/vector.png differ
diff --git a/assets/copy_key.png b/assets/copy_key.png
new file mode 100644
index 0000000..8957f50
Binary files /dev/null and b/assets/copy_key.png differ
diff --git a/assets/home/background.jpg b/assets/home/background.jpg
new file mode 100644
index 0000000..fed2fc8
Binary files /dev/null and b/assets/home/background.jpg differ
diff --git a/assets/home/background.png b/assets/home/background.png
new file mode 100755
index 0000000..55f24c7
Binary files /dev/null and b/assets/home/background.png differ
diff --git a/assets/home/bout_de_bulle.png b/assets/home/bout_de_bulle.png
new file mode 100755
index 0000000..30b6325
Binary files /dev/null and b/assets/home/bout_de_bulle.png differ
diff --git a/assets/home/gecko-bienvenue.png b/assets/home/gecko-bienvenue.png
new file mode 100644
index 0000000..aad8e6a
Binary files /dev/null and b/assets/home/gecko-bienvenue.png differ
diff --git a/assets/home/header.png b/assets/home/header.png
new file mode 100755
index 0000000..9d66bb0
Binary files /dev/null and b/assets/home/header.png differ
diff --git a/assets/home/header.svg b/assets/home/header.svg
new file mode 100755
index 0000000..171ccc8
--- /dev/null
+++ b/assets/home/header.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/home/loupe.png b/assets/home/loupe.png
new file mode 100644
index 0000000..79293d6
Binary files /dev/null and b/assets/home/loupe.png differ
diff --git a/assets/home/loupe.svg b/assets/home/loupe.svg
new file mode 100755
index 0000000..a9fc7ef
--- /dev/null
+++ b/assets/home/loupe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/home/qrcode.png b/assets/home/qrcode.png
new file mode 100644
index 0000000..407a5be
Binary files /dev/null and b/assets/home/qrcode.png differ
diff --git a/assets/home/wallet.png b/assets/home/wallet.png
new file mode 100755
index 0000000..ddadaec
Binary files /dev/null and b/assets/home/wallet.png differ
diff --git a/assets/home/wallet.svg b/assets/home/wallet.svg
new file mode 100644
index 0000000..7fa9217
--- /dev/null
+++ b/assets/home/wallet.svg
@@ -0,0 +1,92 @@
+
+
diff --git a/assets/loupe-noire.png b/assets/loupe-noire.png
new file mode 100644
index 0000000..bb8773d
Binary files /dev/null and b/assets/loupe-noire.png differ
diff --git a/assets/printer.png b/assets/printer.png
old mode 100755
new mode 100644
index ced5f5d..aab7940
Binary files a/assets/printer.png and b/assets/printer.png differ
diff --git a/assets/vector_white.png b/assets/vector_white.png
new file mode 100644
index 0000000..347caaa
Binary files /dev/null and b/assets/vector_white.png differ
diff --git a/assets/walletOptions/android-checkmark.png b/assets/walletOptions/android-checkmark.png
old mode 100755
new mode 100644
index 578859d..ef913f5
Binary files a/assets/walletOptions/android-checkmark.png and b/assets/walletOptions/android-checkmark.png differ
diff --git a/assets/walletOptions/camera.png b/assets/walletOptions/camera.png
old mode 100755
new mode 100644
index ce9ad0f..49fe6ba
Binary files a/assets/walletOptions/camera.png and b/assets/walletOptions/camera.png differ
diff --git a/assets/walletOptions/clock.png b/assets/walletOptions/clock.png
old mode 100755
new mode 100644
index cf9a802..a4a684f
Binary files a/assets/walletOptions/clock.png and b/assets/walletOptions/clock.png differ
diff --git a/assets/walletOptions/copy-white.png b/assets/walletOptions/copy-white.png
old mode 100755
new mode 100644
index 819e852..d085408
Binary files a/assets/walletOptions/copy-white.png and b/assets/walletOptions/copy-white.png differ
diff --git a/assets/walletOptions/edit.png b/assets/walletOptions/edit.png
old mode 100755
new mode 100644
index a45788d..3963753
Binary files a/assets/walletOptions/edit.png and b/assets/walletOptions/edit.png differ
diff --git a/assets/walletOptions/icon_oeuil.png b/assets/walletOptions/icon_oeuil.png
old mode 100755
new mode 100644
index f707647..75c12ec
Binary files a/assets/walletOptions/icon_oeuil.png and b/assets/walletOptions/icon_oeuil.png differ
diff --git a/assets/walletOptions/icon_oeuil_close.png b/assets/walletOptions/icon_oeuil_close.png
index 4a13e67..db1dc51 100644
Binary files a/assets/walletOptions/icon_oeuil_close.png and b/assets/walletOptions/icon_oeuil_close.png differ
diff --git a/assets/walletOptions/key.png b/assets/walletOptions/key.png
old mode 100755
new mode 100644
index 45c0e85..bfabc3d
Binary files a/assets/walletOptions/key.png and b/assets/walletOptions/key.png differ
diff --git a/assets/walletOptions/trash.png b/assets/walletOptions/trash.png
old mode 100755
new mode 100644
index 6dc972b..e2c1cbc
Binary files a/assets/walletOptions/trash.png and b/assets/walletOptions/trash.png differ
diff --git a/lib/globals.dart b/lib/globals.dart
index 115be3d..70cd2ae 100644
--- a/lib/globals.dart
+++ b/lib/globals.dart
@@ -1,6 +1,7 @@
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/wallet_data.dart';
import 'package:hive/hive.dart';
import 'package:logger/logger.dart';
@@ -16,9 +17,10 @@ int ramSys;
Box walletBox;
Box chestBox;
Box configBox;
+Box g1WalletsBox;
-// String cesiumPod = "https://g1.data.le-sou.org";
-String cesiumPod = "https://g1.data.e-is.pro";
+String cesiumPod = "https://g1.data.le-sou.org";
+// String cesiumPod = "https://g1.data.e-is.pro";
// Responsive ratios
bool isTall;
diff --git a/lib/main.dart b/lib/main.dart
index d53b367..3377e3a 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -23,16 +23,20 @@ import 'package:gecko/models/cesium_plus.dart';
import 'package:gecko/models/change_pin.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/chest_provider.dart';
+import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/generate_wallets.dart';
-import 'package:gecko/models/history.dart';
+import 'package:gecko/models/wallets_profiles.dart';
import 'package:gecko/models/home.dart';
import 'package:gecko/models/my_wallets.dart';
+import 'package:gecko/models/search.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/wallet_options.dart';
import 'package:gecko/screens/home.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
+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:path_provider/path_provider.dart';
@@ -41,17 +45,14 @@ import 'package:flutter/foundation.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
-import 'package:flutter_driver/driver_extension.dart';
const bool enableSentry = true;
Future main() async {
- enableFlutterDriverExtension();
WidgetsFlutterBinding.ensureInitialized();
HomeProvider _homeProvider = HomeProvider();
appPath = await getApplicationDocumentsDirectory();
- await _homeProvider.createDefaultAvatar();
appVersion = await _homeProvider.getAppVersion();
prefs = await SharedPreferences.getInstance();
@@ -59,15 +60,21 @@ Future main() async {
await Hive.initFlutter(appPath.path);
Hive.registerAdapter(WalletDataAdapter());
Hive.registerAdapter(ChestDataAdapter());
+ Hive.registerAdapter(G1WalletsListAdapter());
+ Hive.registerAdapter(IdAdapter());
walletBox = await Hive.openBox("walletBox");
chestBox = await Hive.openBox("chestBox");
configBox = await Hive.openBox("configBox");
+ g1WalletsBox = await Hive.openBox("g1WalletsBox");
+
+ g1WalletsBox.clear();
// final HiveStore _store =
// await HiveStore.open(path: '${appPath.path}/gqlCache');
// Get a valid GVA endpoint
- endPointGVA = 'https://g1.librelois.fr/gva';
+ // endPointGVA = 'https://g1.librelois.fr/gva';
+ endPointGVA = 'https://duniter-g1.p2p.legal/gva';
// await _homeProvider.getValidEndpoint();
// if (endPointGVA == 'HS') {
@@ -76,6 +83,8 @@ Future main() async {
// _homeProvider.playSound('start', 0.2);
// }
+ HttpOverrides.global = MyHttpOverrides();
+
if (kReleaseMode && enableSentry) {
// CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
// SentryHandler(SentryClient(SentryOptions(
@@ -107,8 +116,6 @@ Future main() async {
} else {
print('Debug mode enabled: No sentry alerte');
- HttpOverrides.global = MyHttpOverrides();
-
runApp(Gecko(endPointGVA));
}
}
@@ -134,54 +141,58 @@ class Gecko extends StatelessWidget {
// HistoryProvider _historyProvider = Provider.of(context);
// HistoryProvider('').snackNode(context);
return MultiProvider(
- providers: [
- // Provider(create: (context) => HistoryProvider()),
- ChangeNotifierProvider(create: (_) => HomeProvider()),
- ChangeNotifierProvider(create: (_) => HistoryProvider('')),
- ChangeNotifierProvider(create: (_) => MyWalletsProvider()),
- ChangeNotifierProvider(create: (_) => ChestProvider()),
- ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()),
- ChangeNotifierProvider(create: (_) => WalletOptionsProvider()),
- ChangeNotifierProvider(create: (_) => ChangePinProvider()),
- ChangeNotifierProvider(create: (_) => CesiumPlusProvider())
- ],
- child: GraphQLProvider(
- client: _client,
- child: MaterialApp(
- builder: (context, widget) => ResponsiveWrapper.builder(
- BouncingScrollWrapper.builder(context, widget),
- maxWidth: 1200,
- minWidth: 480,
- defaultScale: true,
- breakpoints: [
- const ResponsiveBreakpoint.resize(480, name: MOBILE),
- const ResponsiveBreakpoint.autoScale(800, name: TABLET),
- const ResponsiveBreakpoint.resize(1000, name: DESKTOP),
- ],
- background: Container(color: backgroundColor)),
- title: 'Ğecko',
- theme: ThemeData(
- appBarTheme: const AppBarTheme(
- color: Color(0xffFFD58D),
- foregroundColor: Color(0xFF000000),
- ),
- primaryColor: const Color(0xffFFD58D),
- textTheme: const TextTheme(
- bodyText1: TextStyle(),
- bodyText2: TextStyle(),
- ).apply(
- bodyColor: const Color(0xFF000000),
- ),
- colorScheme: ColorScheme.fromSwatch()
- .copyWith(secondary: Colors.grey[850]),
+ providers: [
+ // Provider(create: (context) => HistoryProvider()),
+ ChangeNotifierProvider(create: (_) => HomeProvider()),
+ ChangeNotifierProvider(create: (_) => WalletsProfilesProvider('')),
+ ChangeNotifierProvider(create: (_) => MyWalletsProvider()),
+ ChangeNotifierProvider(create: (_) => ChestProvider()),
+ ChangeNotifierProvider(create: (_) => GenerateWalletsProvider()),
+ ChangeNotifierProvider(create: (_) => WalletOptionsProvider()),
+ ChangeNotifierProvider(create: (_) => ChangePinProvider()),
+ ChangeNotifierProvider(create: (_) => SearchProvider()),
+ ChangeNotifierProvider(create: (_) => CesiumPlusProvider())
+ ],
+ child: GraphQLProvider(
+ client: _client,
+ child: MaterialApp(
+ builder: (context, widget) => ResponsiveWrapper.builder(
+ BouncingScrollWrapper.builder(context, widget),
+ maxWidth: 1200,
+ minWidth: 480,
+ defaultScale: true,
+ breakpoints: [
+ const ResponsiveBreakpoint.resize(480, name: MOBILE),
+ const ResponsiveBreakpoint.autoScale(800, name: TABLET),
+ const ResponsiveBreakpoint.resize(1000, name: DESKTOP),
+ ],
+ background: Container(color: backgroundColor)),
+ title: 'Ğecko',
+ theme: ThemeData(
+ appBarTheme: const AppBarTheme(
+ color: Color(0xffFFD58D),
+ foregroundColor: Color(0xFF000000),
),
- home: const HomeScreen(),
- initialRoute: "/",
- routes: {
- '/mywallets': (context) => WalletsHome(),
- },
+ primaryColor: const Color(0xffFFD58D),
+ textTheme: const TextTheme(
+ bodyText1: TextStyle(),
+ bodyText2: TextStyle(),
+ ).apply(
+ bodyColor: const Color(0xFF000000),
+ ),
+ colorScheme:
+ ColorScheme.fromSwatch().copyWith(secondary: Colors.grey[850]),
),
- ));
+ home: const HomeScreen(),
+ initialRoute: "/",
+ routes: {
+ '/mywallets': (context) => WalletsHome(),
+ '/search': (context) => const SearchScreen(),
+ '/searchResult': (context) => const SearchResultScreen(),
+ },
+ ),
+ ),
+ );
}
}
diff --git a/lib/models/bip39_words.dart b/lib/models/bip39_words.dart
new file mode 100644
index 0000000..0809642
--- /dev/null
+++ b/lib/models/bip39_words.dart
@@ -0,0 +1,2050 @@
+List bip39Words = [
+ 'abaisser',
+ 'abandon',
+ 'abdiquer',
+ 'abeille',
+ 'abolir',
+ 'aborder',
+ 'aboutir',
+ 'aboyer',
+ 'abrasif',
+ 'abreuver',
+ 'abriter',
+ 'abroger',
+ 'abrupt',
+ 'absence',
+ 'absolu',
+ 'absurde',
+ 'abusif',
+ 'abyssal',
+ 'académie',
+ 'acajou',
+ 'acarien',
+ 'accabler',
+ 'accepter',
+ 'acclamer',
+ 'accolade',
+ 'accroche',
+ 'accuser',
+ 'acerbe',
+ 'achat',
+ 'acheter',
+ 'aciduler',
+ 'acier',
+ 'acompte',
+ 'acquérir',
+ 'acronyme',
+ 'acteur',
+ 'actif',
+ 'actuel',
+ 'adepte',
+ 'adéquat',
+ 'adhésif',
+ 'adjectif',
+ 'adjuger',
+ 'admettre',
+ 'admirer',
+ 'adopter',
+ 'adorer',
+ 'adoucir',
+ 'adresse',
+ 'adroit',
+ 'adulte',
+ 'adverbe',
+ 'aérer',
+ 'aéronef',
+ 'affaire',
+ 'affecter',
+ 'affiche',
+ 'affreux',
+ 'affubler',
+ 'agacer',
+ 'agencer',
+ 'agile',
+ 'agiter',
+ 'agrafer',
+ 'agréable',
+ 'agrume',
+ 'aider',
+ 'aiguille',
+ 'ailier',
+ 'aimable',
+ 'aisance',
+ 'ajouter',
+ 'ajuster',
+ 'alarmer',
+ 'alchimie',
+ 'alerte',
+ 'algèbre',
+ 'algue',
+ 'aliéner',
+ 'aliment',
+ 'alléger',
+ 'alliage',
+ 'allouer',
+ 'allumer',
+ 'alourdir',
+ 'alpaga',
+ 'altesse',
+ 'alvéole',
+ 'amateur',
+ 'ambigu',
+ 'ambre',
+ 'aménager',
+ 'amertume',
+ 'amidon',
+ 'amiral',
+ 'amorcer',
+ 'amour',
+ 'amovible',
+ 'amphibie',
+ 'ampleur',
+ 'amusant',
+ 'analyse',
+ 'anaphore',
+ 'anarchie',
+ 'anatomie',
+ 'ancien',
+ 'anéantir',
+ 'angle',
+ 'angoisse',
+ 'anguleux',
+ 'animal',
+ 'annexer',
+ 'annonce',
+ 'annuel',
+ 'anodin',
+ 'anomalie',
+ 'anonyme',
+ 'anormal',
+ 'antenne',
+ 'antidote',
+ 'anxieux',
+ 'apaiser',
+ 'apéritif',
+ 'aplanir',
+ 'apologie',
+ 'appareil',
+ 'appeler',
+ 'apporter',
+ 'appuyer',
+ 'aquarium',
+ 'aqueduc',
+ 'arbitre',
+ 'arbuste',
+ 'ardeur',
+ 'ardoise',
+ 'argent',
+ 'arlequin',
+ 'armature',
+ 'armement',
+ 'armoire',
+ 'armure',
+ 'arpenter',
+ 'arracher',
+ 'arriver',
+ 'arroser',
+ 'arsenic',
+ 'artériel',
+ 'article',
+ 'aspect',
+ 'asphalte',
+ 'aspirer',
+ 'assaut',
+ 'asservir',
+ 'assiette',
+ 'associer',
+ 'assurer',
+ 'asticot',
+ 'astre',
+ 'astuce',
+ 'atelier',
+ 'atome',
+ 'atrium',
+ 'atroce',
+ 'attaque',
+ 'attentif',
+ 'attirer',
+ 'attraper',
+ 'aubaine',
+ 'auberge',
+ 'audace',
+ 'audible',
+ 'augurer',
+ 'aurore',
+ 'automne',
+ 'autruche',
+ 'avaler',
+ 'avancer',
+ 'avarice',
+ 'avenir',
+ 'averse',
+ 'aveugle',
+ 'aviateur',
+ 'avide',
+ 'avion',
+ 'aviser',
+ 'avoine',
+ 'avouer',
+ 'avril',
+ 'axial',
+ 'axiome',
+ 'badge',
+ 'bafouer',
+ 'bagage',
+ 'baguette',
+ 'baignade',
+ 'balancer',
+ 'balcon',
+ 'baleine',
+ 'balisage',
+ 'bambin',
+ 'bancaire',
+ 'bandage',
+ 'banlieue',
+ 'bannière',
+ 'banquier',
+ 'barbier',
+ 'baril',
+ 'baron',
+ 'barque',
+ 'barrage',
+ 'bassin',
+ 'bastion',
+ 'bataille',
+ 'bateau',
+ 'batterie',
+ 'baudrier',
+ 'bavarder',
+ 'belette',
+ 'bélier',
+ 'belote',
+ 'bénéfice',
+ 'berceau',
+ 'berger',
+ 'berline',
+ 'bermuda',
+ 'besace',
+ 'besogne',
+ 'bétail',
+ 'beurre',
+ 'biberon',
+ 'bicycle',
+ 'bidule',
+ 'bijou',
+ 'bilan',
+ 'bilingue',
+ 'billard',
+ 'binaire',
+ 'biologie',
+ 'biopsie',
+ 'biotype',
+ 'biscuit',
+ 'bison',
+ 'bistouri',
+ 'bitume',
+ 'bizarre',
+ 'blafard',
+ 'blague',
+ 'blanchir',
+ 'blessant',
+ 'blinder',
+ 'blond',
+ 'bloquer',
+ 'blouson',
+ 'bobard',
+ 'bobine',
+ 'boire',
+ 'boiser',
+ 'bolide',
+ 'bonbon',
+ 'bondir',
+ 'bonheur',
+ 'bonifier',
+ 'bonus',
+ 'bordure',
+ 'borne',
+ 'botte',
+ 'boucle',
+ 'boueux',
+ 'bougie',
+ 'boulon',
+ 'bouquin',
+ 'bourse',
+ 'boussole',
+ 'boutique',
+ 'boxeur',
+ 'branche',
+ 'brasier',
+ 'brave',
+ 'brebis',
+ 'brèche',
+ 'breuvage',
+ 'bricoler',
+ 'brigade',
+ 'brillant',
+ 'brioche',
+ 'brique',
+ 'brochure',
+ 'broder',
+ 'bronzer',
+ 'brousse',
+ 'broyeur',
+ 'brume',
+ 'brusque',
+ 'brutal',
+ 'bruyant',
+ 'buffle',
+ 'buisson',
+ 'bulletin',
+ 'bureau',
+ 'burin',
+ 'bustier',
+ 'butiner',
+ 'butoir',
+ 'buvable',
+ 'buvette',
+ 'cabanon',
+ 'cabine',
+ 'cachette',
+ 'cadeau',
+ 'cadre',
+ 'caféine',
+ 'caillou',
+ 'caisson',
+ 'calculer',
+ 'calepin',
+ 'calibre',
+ 'calmer',
+ 'calomnie',
+ 'calvaire',
+ 'camarade',
+ 'caméra',
+ 'camion',
+ 'campagne',
+ 'canal',
+ 'caneton',
+ 'canon',
+ 'cantine',
+ 'canular',
+ 'capable',
+ 'caporal',
+ 'caprice',
+ 'capsule',
+ 'capter',
+ 'capuche',
+ 'carabine',
+ 'carbone',
+ 'caresser',
+ 'caribou',
+ 'carnage',
+ 'carotte',
+ 'carreau',
+ 'carton',
+ 'cascade',
+ 'casier',
+ 'casque',
+ 'cassure',
+ 'causer',
+ 'caution',
+ 'cavalier',
+ 'caverne',
+ 'caviar',
+ 'cédille',
+ 'ceinture',
+ 'céleste',
+ 'cellule',
+ 'cendrier',
+ 'censurer',
+ 'central',
+ 'cercle',
+ 'cérébral',
+ 'cerise',
+ 'cerner',
+ 'cerveau',
+ 'cesser',
+ 'chagrin',
+ 'chaise',
+ 'chaleur',
+ 'chambre',
+ 'chance',
+ 'chapitre',
+ 'charbon',
+ 'chasseur',
+ 'chaton',
+ 'chausson',
+ 'chavirer',
+ 'chemise',
+ 'chenille',
+ 'chéquier',
+ 'chercher',
+ 'cheval',
+ 'chien',
+ 'chiffre',
+ 'chignon',
+ 'chimère',
+ 'chiot',
+ 'chlorure',
+ 'chocolat',
+ 'choisir',
+ 'chose',
+ 'chouette',
+ 'chrome',
+ 'chute',
+ 'cigare',
+ 'cigogne',
+ 'cimenter',
+ 'cinéma',
+ 'cintrer',
+ 'circuler',
+ 'cirer',
+ 'cirque',
+ 'citerne',
+ 'citoyen',
+ 'citron',
+ 'civil',
+ 'clairon',
+ 'clameur',
+ 'claquer',
+ 'classe',
+ 'clavier',
+ 'client',
+ 'cligner',
+ 'climat',
+ 'clivage',
+ 'cloche',
+ 'clonage',
+ 'cloporte',
+ 'cobalt',
+ 'cobra',
+ 'cocasse',
+ 'cocotier',
+ 'coder',
+ 'codifier',
+ 'coffre',
+ 'cogner',
+ 'cohésion',
+ 'coiffer',
+ 'coincer',
+ 'colère',
+ 'colibri',
+ 'colline',
+ 'colmater',
+ 'colonel',
+ 'combat',
+ 'comédie',
+ 'commande',
+ 'compact',
+ 'concert',
+ 'conduire',
+ 'confier',
+ 'congeler',
+ 'connoter',
+ 'consonne',
+ 'contact',
+ 'convexe',
+ 'copain',
+ 'copie',
+ 'corail',
+ 'corbeau',
+ 'cordage',
+ 'corniche',
+ 'corpus',
+ 'correct',
+ 'cortège',
+ 'cosmique',
+ 'costume',
+ 'coton',
+ 'coude',
+ 'coupure',
+ 'courage',
+ 'couteau',
+ 'couvrir',
+ 'coyote',
+ 'crabe',
+ 'crainte',
+ 'cravate',
+ 'crayon',
+ 'créature',
+ 'créditer',
+ 'crémeux',
+ 'creuser',
+ 'crevette',
+ 'cribler',
+ 'crier',
+ 'cristal',
+ 'critère',
+ 'croire',
+ 'croquer',
+ 'crotale',
+ 'crucial',
+ 'cruel',
+ 'crypter',
+ 'cubique',
+ 'cueillir',
+ 'cuillère',
+ 'cuisine',
+ 'cuivre',
+ 'culminer',
+ 'cultiver',
+ 'cumuler',
+ 'cupide',
+ 'curatif',
+ 'curseur',
+ 'cyanure',
+ 'cycle',
+ 'cylindre',
+ 'cynique',
+ 'daigner',
+ 'damier',
+ 'danger',
+ 'danseur',
+ 'dauphin',
+ 'débattre',
+ 'débiter',
+ 'déborder',
+ 'débrider',
+ 'débutant',
+ 'décaler',
+ 'décembre',
+ 'déchirer',
+ 'décider',
+ 'déclarer',
+ 'décorer',
+ 'décrire',
+ 'décupler',
+ 'dédale',
+ 'déductif',
+ 'déesse',
+ 'défensif',
+ 'défiler',
+ 'défrayer',
+ 'dégager',
+ 'dégivrer',
+ 'déglutir',
+ 'dégrafer',
+ 'déjeuner',
+ 'délice',
+ 'déloger',
+ 'demander',
+ 'demeurer',
+ 'démolir',
+ 'dénicher',
+ 'dénouer',
+ 'dentelle',
+ 'dénuder',
+ 'départ',
+ 'dépenser',
+ 'déphaser',
+ 'déplacer',
+ 'déposer',
+ 'déranger',
+ 'dérober',
+ 'désastre',
+ 'descente',
+ 'désert',
+ 'désigner',
+ 'désobéir',
+ 'dessiner',
+ 'destrier',
+ 'détacher',
+ 'détester',
+ 'détourer',
+ 'détresse',
+ 'devancer',
+ 'devenir',
+ 'deviner',
+ 'devoir',
+ 'diable',
+ 'dialogue',
+ 'diamant',
+ 'dicter',
+ 'différer',
+ 'digérer',
+ 'digital',
+ 'digne',
+ 'diluer',
+ 'dimanche',
+ 'diminuer',
+ 'dioxyde',
+ 'directif',
+ 'diriger',
+ 'discuter',
+ 'disposer',
+ 'dissiper',
+ 'distance',
+ 'divertir',
+ 'diviser',
+ 'docile',
+ 'docteur',
+ 'dogme',
+ 'doigt',
+ 'domaine',
+ 'domicile',
+ 'dompter',
+ 'donateur',
+ 'donjon',
+ 'donner',
+ 'dopamine',
+ 'dortoir',
+ 'dorure',
+ 'dosage',
+ 'doseur',
+ 'dossier',
+ 'dotation',
+ 'douanier',
+ 'double',
+ 'douceur',
+ 'douter',
+ 'doyen',
+ 'dragon',
+ 'draper',
+ 'dresser',
+ 'dribbler',
+ 'droiture',
+ 'duperie',
+ 'duplexe',
+ 'durable',
+ 'durcir',
+ 'dynastie',
+ 'éblouir',
+ 'écarter',
+ 'écharpe',
+ 'échelle',
+ 'éclairer',
+ 'éclipse',
+ 'éclore',
+ 'écluse',
+ 'école',
+ 'économie',
+ 'écorce',
+ 'écouter',
+ 'écraser',
+ 'écrémer',
+ 'écrivain',
+ 'écrou',
+ 'écume',
+ 'écureuil',
+ 'édifier',
+ 'éduquer',
+ 'effacer',
+ 'effectif',
+ 'effigie',
+ 'effort',
+ 'effrayer',
+ 'effusion',
+ 'égaliser',
+ 'égarer',
+ 'éjecter',
+ 'élaborer',
+ 'élargir',
+ 'électron',
+ 'élégant',
+ 'éléphant',
+ 'élève',
+ 'éligible',
+ 'élitisme',
+ 'éloge',
+ 'élucider',
+ 'éluder',
+ 'emballer',
+ 'embellir',
+ 'embryon',
+ 'émeraude',
+ 'émission',
+ 'emmener',
+ 'émotion',
+ 'émouvoir',
+ 'empereur',
+ 'employer',
+ 'emporter',
+ 'emprise',
+ 'émulsion',
+ 'encadrer',
+ 'enchère',
+ 'enclave',
+ 'encoche',
+ 'endiguer',
+ 'endosser',
+ 'endroit',
+ 'enduire',
+ 'énergie',
+ 'enfance',
+ 'enfermer',
+ 'enfouir',
+ 'engager',
+ 'engin',
+ 'englober',
+ 'énigme',
+ 'enjamber',
+ 'enjeu',
+ 'enlever',
+ 'ennemi',
+ 'ennuyeux',
+ 'enrichir',
+ 'enrobage',
+ 'enseigne',
+ 'entasser',
+ 'entendre',
+ 'entier',
+ 'entourer',
+ 'entraver',
+ 'énumérer',
+ 'envahir',
+ 'enviable',
+ 'envoyer',
+ 'enzyme',
+ 'éolien',
+ 'épaissir',
+ 'épargne',
+ 'épatant',
+ 'épaule',
+ 'épicerie',
+ 'épidémie',
+ 'épier',
+ 'épilogue',
+ 'épine',
+ 'épisode',
+ 'épitaphe',
+ 'époque',
+ 'épreuve',
+ 'éprouver',
+ 'épuisant',
+ 'équerre',
+ 'équipe',
+ 'ériger',
+ 'érosion',
+ 'erreur',
+ 'éruption',
+ 'escalier',
+ 'espadon',
+ 'espèce',
+ 'espiègle',
+ 'espoir',
+ 'esprit',
+ 'esquiver',
+ 'essayer',
+ 'essence',
+ 'essieu',
+ 'essorer',
+ 'estime',
+ 'estomac',
+ 'estrade',
+ 'étagère',
+ 'étaler',
+ 'étanche',
+ 'étatique',
+ 'éteindre',
+ 'étendoir',
+ 'éternel',
+ 'éthanol',
+ 'éthique',
+ 'ethnie',
+ 'étirer',
+ 'étoffer',
+ 'étoile',
+ 'étonnant',
+ 'étourdir',
+ 'étrange',
+ 'étroit',
+ 'étude',
+ 'euphorie',
+ 'évaluer',
+ 'évasion',
+ 'éventail',
+ 'évidence',
+ 'éviter',
+ 'évolutif',
+ 'évoquer',
+ 'exact',
+ 'exagérer',
+ 'exaucer',
+ 'exceller',
+ 'excitant',
+ 'exclusif',
+ 'excuse',
+ 'exécuter',
+ 'exemple',
+ 'exercer',
+ 'exhaler',
+ 'exhorter',
+ 'exigence',
+ 'exiler',
+ 'exister',
+ 'exotique',
+ 'expédier',
+ 'explorer',
+ 'exposer',
+ 'exprimer',
+ 'exquis',
+ 'extensif',
+ 'extraire',
+ 'exulter',
+ 'fable',
+ 'fabuleux',
+ 'facette',
+ 'facile',
+ 'facture',
+ 'faiblir',
+ 'falaise',
+ 'fameux',
+ 'famille',
+ 'farceur',
+ 'farfelu',
+ 'farine',
+ 'farouche',
+ 'fasciner',
+ 'fatal',
+ 'fatigue',
+ 'faucon',
+ 'fautif',
+ 'faveur',
+ 'favori',
+ 'fébrile',
+ 'féconder',
+ 'fédérer',
+ 'félin',
+ 'femme',
+ 'fémur',
+ 'fendoir',
+ 'féodal',
+ 'fermer',
+ 'féroce',
+ 'ferveur',
+ 'festival',
+ 'feuille',
+ 'feutre',
+ 'février',
+ 'fiasco',
+ 'ficeler',
+ 'fictif',
+ 'fidèle',
+ 'figure',
+ 'filature',
+ 'filetage',
+ 'filière',
+ 'filleul',
+ 'filmer',
+ 'filou',
+ 'filtrer',
+ 'financer',
+ 'finir',
+ 'fiole',
+ 'firme',
+ 'fissure',
+ 'fixer',
+ 'flairer',
+ 'flamme',
+ 'flasque',
+ 'flatteur',
+ 'fléau',
+ 'flèche',
+ 'fleur',
+ 'flexion',
+ 'flocon',
+ 'flore',
+ 'fluctuer',
+ 'fluide',
+ 'fluvial',
+ 'folie',
+ 'fonderie',
+ 'fongible',
+ 'fontaine',
+ 'forcer',
+ 'forgeron',
+ 'formuler',
+ 'fortune',
+ 'fossile',
+ 'foudre',
+ 'fougère',
+ 'fouiller',
+ 'foulure',
+ 'fourmi',
+ 'fragile',
+ 'fraise',
+ 'franchir',
+ 'frapper',
+ 'frayeur',
+ 'frégate',
+ 'freiner',
+ 'frelon',
+ 'frémir',
+ 'frénésie',
+ 'frère',
+ 'friable',
+ 'friction',
+ 'frisson',
+ 'frivole',
+ 'froid',
+ 'fromage',
+ 'frontal',
+ 'frotter',
+ 'fruit',
+ 'fugitif',
+ 'fuite',
+ 'fureur',
+ 'furieux',
+ 'furtif',
+ 'fusion',
+ 'futur',
+ 'gagner',
+ 'galaxie',
+ 'galerie',
+ 'gambader',
+ 'garantir',
+ 'gardien',
+ 'garnir',
+ 'garrigue',
+ 'gazelle',
+ 'gazon',
+ 'géant',
+ 'gélatine',
+ 'gélule',
+ 'gendarme',
+ 'général',
+ 'génie',
+ 'genou',
+ 'gentil',
+ 'géologie',
+ 'géomètre',
+ 'géranium',
+ 'germe',
+ 'gestuel',
+ 'geyser',
+ 'gibier',
+ 'gicler',
+ 'girafe',
+ 'givre',
+ 'glace',
+ 'glaive',
+ 'glisser',
+ 'globe',
+ 'gloire',
+ 'glorieux',
+ 'golfeur',
+ 'gomme',
+ 'gonfler',
+ 'gorge',
+ 'gorille',
+ 'goudron',
+ 'gouffre',
+ 'goulot',
+ 'goupille',
+ 'gourmand',
+ 'goutte',
+ 'graduel',
+ 'graffiti',
+ 'graine',
+ 'grand',
+ 'grappin',
+ 'gratuit',
+ 'gravir',
+ 'grenat',
+ 'griffure',
+ 'griller',
+ 'grimper',
+ 'grogner',
+ 'gronder',
+ 'grotte',
+ 'groupe',
+ 'gruger',
+ 'grutier',
+ 'gruyère',
+ 'guépard',
+ 'guerrier',
+ 'guide',
+ 'guimauve',
+ 'guitare',
+ 'gustatif',
+ 'gymnaste',
+ 'gyrostat',
+ 'habitude',
+ 'hachoir',
+ 'halte',
+ 'hameau',
+ 'hangar',
+ 'hanneton',
+ 'haricot',
+ 'harmonie',
+ 'harpon',
+ 'hasard',
+ 'hélium',
+ 'hématome',
+ 'herbe',
+ 'hérisson',
+ 'hermine',
+ 'héron',
+ 'hésiter',
+ 'heureux',
+ 'hiberner',
+ 'hibou',
+ 'hilarant',
+ 'histoire',
+ 'hiver',
+ 'homard',
+ 'hommage',
+ 'homogène',
+ 'honneur',
+ 'honorer',
+ 'honteux',
+ 'horde',
+ 'horizon',
+ 'horloge',
+ 'hormone',
+ 'horrible',
+ 'houleux',
+ 'housse',
+ 'hublot',
+ 'huileux',
+ 'humain',
+ 'humble',
+ 'humide',
+ 'humour',
+ 'hurler',
+ 'hydromel',
+ 'hygiène',
+ 'hymne',
+ 'hypnose',
+ 'idylle',
+ 'ignorer',
+ 'iguane',
+ 'illicite',
+ 'illusion',
+ 'image',
+ 'imbiber',
+ 'imiter',
+ 'immense',
+ 'immobile',
+ 'immuable',
+ 'impact',
+ 'impérial',
+ 'implorer',
+ 'imposer',
+ 'imprimer',
+ 'imputer',
+ 'incarner',
+ 'incendie',
+ 'incident',
+ 'incliner',
+ 'incolore',
+ 'indexer',
+ 'indice',
+ 'inductif',
+ 'inédit',
+ 'ineptie',
+ 'inexact',
+ 'infini',
+ 'infliger',
+ 'informer',
+ 'infusion',
+ 'ingérer',
+ 'inhaler',
+ 'inhiber',
+ 'injecter',
+ 'injure',
+ 'innocent',
+ 'inoculer',
+ 'inonder',
+ 'inscrire',
+ 'insecte',
+ 'insigne',
+ 'insolite',
+ 'inspirer',
+ 'instinct',
+ 'insulter',
+ 'intact',
+ 'intense',
+ 'intime',
+ 'intrigue',
+ 'intuitif',
+ 'inutile',
+ 'invasion',
+ 'inventer',
+ 'inviter',
+ 'invoquer',
+ 'ironique',
+ 'irradier',
+ 'irréel',
+ 'irriter',
+ 'isoler',
+ 'ivoire',
+ 'ivresse',
+ 'jaguar',
+ 'jaillir',
+ 'jambe',
+ 'janvier',
+ 'jardin',
+ 'jauger',
+ 'jaune',
+ 'javelot',
+ 'jetable',
+ 'jeton',
+ 'jeudi',
+ 'jeunesse',
+ 'joindre',
+ 'joncher',
+ 'jongler',
+ 'joueur',
+ 'jouissif',
+ 'journal',
+ 'jovial',
+ 'joyau',
+ 'joyeux',
+ 'jubiler',
+ 'jugement',
+ 'junior',
+ 'jupon',
+ 'juriste',
+ 'justice',
+ 'juteux',
+ 'juvénile',
+ 'kayak',
+ 'kimono',
+ 'kiosque',
+ 'label',
+ 'labial',
+ 'labourer',
+ 'lacérer',
+ 'lactose',
+ 'lagune',
+ 'laine',
+ 'laisser',
+ 'laitier',
+ 'lambeau',
+ 'lamelle',
+ 'lampe',
+ 'lanceur',
+ 'langage',
+ 'lanterne',
+ 'lapin',
+ 'largeur',
+ 'larme',
+ 'laurier',
+ 'lavabo',
+ 'lavoir',
+ 'lecture',
+ 'légal',
+ 'léger',
+ 'légume',
+ 'lessive',
+ 'lettre',
+ 'levier',
+ 'lexique',
+ 'lézard',
+ 'liasse',
+ 'libérer',
+ 'libre',
+ 'licence',
+ 'licorne',
+ 'liège',
+ 'lièvre',
+ 'ligature',
+ 'ligoter',
+ 'ligue',
+ 'limer',
+ 'limite',
+ 'limonade',
+ 'limpide',
+ 'linéaire',
+ 'lingot',
+ 'lionceau',
+ 'liquide',
+ 'lisière',
+ 'lister',
+ 'lithium',
+ 'litige',
+ 'littoral',
+ 'livreur',
+ 'logique',
+ 'lointain',
+ 'loisir',
+ 'lombric',
+ 'loterie',
+ 'louer',
+ 'lourd',
+ 'loutre',
+ 'louve',
+ 'loyal',
+ 'lubie',
+ 'lucide',
+ 'lucratif',
+ 'lueur',
+ 'lugubre',
+ 'luisant',
+ 'lumière',
+ 'lunaire',
+ 'lundi',
+ 'luron',
+ 'lutter',
+ 'luxueux',
+ 'machine',
+ 'magasin',
+ 'magenta',
+ 'magique',
+ 'maigre',
+ 'maillon',
+ 'maintien',
+ 'mairie',
+ 'maison',
+ 'majorer',
+ 'malaxer',
+ 'maléfice',
+ 'malheur',
+ 'malice',
+ 'mallette',
+ 'mammouth',
+ 'mandater',
+ 'maniable',
+ 'manquant',
+ 'manteau',
+ 'manuel',
+ 'marathon',
+ 'marbre',
+ 'marchand',
+ 'mardi',
+ 'maritime',
+ 'marqueur',
+ 'marron',
+ 'marteler',
+ 'mascotte',
+ 'massif',
+ 'matériel',
+ 'matière',
+ 'matraque',
+ 'maudire',
+ 'maussade',
+ 'mauve',
+ 'maximal',
+ 'méchant',
+ 'méconnu',
+ 'médaille',
+ 'médecin',
+ 'méditer',
+ 'méduse',
+ 'meilleur',
+ 'mélange',
+ 'mélodie',
+ 'membre',
+ 'mémoire',
+ 'menacer',
+ 'mener',
+ 'menhir',
+ 'mensonge',
+ 'mentor',
+ 'mercredi',
+ 'mérite',
+ 'merle',
+ 'messager',
+ 'mesure',
+ 'métal',
+ 'météore',
+ 'méthode',
+ 'métier',
+ 'meuble',
+ 'miauler',
+ 'microbe',
+ 'miette',
+ 'mignon',
+ 'migrer',
+ 'milieu',
+ 'million',
+ 'mimique',
+ 'mince',
+ 'minéral',
+ 'minimal',
+ 'minorer',
+ 'minute',
+ 'miracle',
+ 'miroiter',
+ 'missile',
+ 'mixte',
+ 'mobile',
+ 'moderne',
+ 'moelleux',
+ 'mondial',
+ 'moniteur',
+ 'monnaie',
+ 'monotone',
+ 'monstre',
+ 'montagne',
+ 'monument',
+ 'moqueur',
+ 'morceau',
+ 'morsure',
+ 'mortier',
+ 'moteur',
+ 'motif',
+ 'mouche',
+ 'moufle',
+ 'moulin',
+ 'mousson',
+ 'mouton',
+ 'mouvant',
+ 'multiple',
+ 'munition',
+ 'muraille',
+ 'murène',
+ 'murmure',
+ 'muscle',
+ 'muséum',
+ 'musicien',
+ 'mutation',
+ 'muter',
+ 'mutuel',
+ 'myriade',
+ 'myrtille',
+ 'mystère',
+ 'mythique',
+ 'nageur',
+ 'nappe',
+ 'narquois',
+ 'narrer',
+ 'natation',
+ 'nation',
+ 'nature',
+ 'naufrage',
+ 'nautique',
+ 'navire',
+ 'nébuleux',
+ 'nectar',
+ 'néfaste',
+ 'négation',
+ 'négliger',
+ 'négocier',
+ 'neige',
+ 'nerveux',
+ 'nettoyer',
+ 'neurone',
+ 'neutron',
+ 'neveu',
+ 'niche',
+ 'nickel',
+ 'nitrate',
+ 'niveau',
+ 'noble',
+ 'nocif',
+ 'nocturne',
+ 'noirceur',
+ 'noisette',
+ 'nomade',
+ 'nombreux',
+ 'nommer',
+ 'normatif',
+ 'notable',
+ 'notifier',
+ 'notoire',
+ 'nourrir',
+ 'nouveau',
+ 'novateur',
+ 'novembre',
+ 'novice',
+ 'nuage',
+ 'nuancer',
+ 'nuire',
+ 'nuisible',
+ 'numéro',
+ 'nuptial',
+ 'nuque',
+ 'nutritif',
+ 'obéir',
+ 'objectif',
+ 'obliger',
+ 'obscur',
+ 'observer',
+ 'obstacle',
+ 'obtenir',
+ 'obturer',
+ 'occasion',
+ 'occuper',
+ 'océan',
+ 'octobre',
+ 'octroyer',
+ 'octupler',
+ 'oculaire',
+ 'odeur',
+ 'odorant',
+ 'offenser',
+ 'officier',
+ 'offrir',
+ 'ogive',
+ 'oiseau',
+ 'oisillon',
+ 'olfactif',
+ 'olivier',
+ 'ombrage',
+ 'omettre',
+ 'onctueux',
+ 'onduler',
+ 'onéreux',
+ 'onirique',
+ 'opale',
+ 'opaque',
+ 'opérer',
+ 'opinion',
+ 'opportun',
+ 'opprimer',
+ 'opter',
+ 'optique',
+ 'orageux',
+ 'orange',
+ 'orbite',
+ 'ordonner',
+ 'oreille',
+ 'organe',
+ 'orgueil',
+ 'orifice',
+ 'ornement',
+ 'orque',
+ 'ortie',
+ 'osciller',
+ 'osmose',
+ 'ossature',
+ 'otarie',
+ 'ouragan',
+ 'ourson',
+ 'outil',
+ 'outrager',
+ 'ouvrage',
+ 'ovation',
+ 'oxyde',
+ 'oxygène',
+ 'ozone',
+ 'paisible',
+ 'palace',
+ 'palmarès',
+ 'palourde',
+ 'palper',
+ 'panache',
+ 'panda',
+ 'pangolin',
+ 'paniquer',
+ 'panneau',
+ 'panorama',
+ 'pantalon',
+ 'papaye',
+ 'papier',
+ 'papoter',
+ 'papyrus',
+ 'paradoxe',
+ 'parcelle',
+ 'paresse',
+ 'parfumer',
+ 'parler',
+ 'parole',
+ 'parrain',
+ 'parsemer',
+ 'partager',
+ 'parure',
+ 'parvenir',
+ 'passion',
+ 'pastèque',
+ 'paternel',
+ 'patience',
+ 'patron',
+ 'pavillon',
+ 'pavoiser',
+ 'payer',
+ 'paysage',
+ 'peigne',
+ 'peintre',
+ 'pelage',
+ 'pélican',
+ 'pelle',
+ 'pelouse',
+ 'peluche',
+ 'pendule',
+ 'pénétrer',
+ 'pénible',
+ 'pensif',
+ 'pénurie',
+ 'pépite',
+ 'péplum',
+ 'perdrix',
+ 'perforer',
+ 'période',
+ 'permuter',
+ 'perplexe',
+ 'persil',
+ 'perte',
+ 'peser',
+ 'pétale',
+ 'petit',
+ 'pétrir',
+ 'peuple',
+ 'pharaon',
+ 'phobie',
+ 'phoque',
+ 'photon',
+ 'phrase',
+ 'physique',
+ 'piano',
+ 'pictural',
+ 'pièce',
+ 'pierre',
+ 'pieuvre',
+ 'pilote',
+ 'pinceau',
+ 'pipette',
+ 'piquer',
+ 'pirogue',
+ 'piscine',
+ 'piston',
+ 'pivoter',
+ 'pixel',
+ 'pizza',
+ 'placard',
+ 'plafond',
+ 'plaisir',
+ 'planer',
+ 'plaque',
+ 'plastron',
+ 'plateau',
+ 'pleurer',
+ 'plexus',
+ 'pliage',
+ 'plomb',
+ 'plonger',
+ 'pluie',
+ 'plumage',
+ 'pochette',
+ 'poésie',
+ 'poète',
+ 'pointe',
+ 'poirier',
+ 'poisson',
+ 'poivre',
+ 'polaire',
+ 'policier',
+ 'pollen',
+ 'polygone',
+ 'pommade',
+ 'pompier',
+ 'ponctuel',
+ 'pondérer',
+ 'poney',
+ 'portique',
+ 'position',
+ 'posséder',
+ 'posture',
+ 'potager',
+ 'poteau',
+ 'potion',
+ 'pouce',
+ 'poulain',
+ 'poumon',
+ 'pourpre',
+ 'poussin',
+ 'pouvoir',
+ 'prairie',
+ 'pratique',
+ 'précieux',
+ 'prédire',
+ 'préfixe',
+ 'prélude',
+ 'prénom',
+ 'présence',
+ 'prétexte',
+ 'prévoir',
+ 'primitif',
+ 'prince',
+ 'prison',
+ 'priver',
+ 'problème',
+ 'procéder',
+ 'prodige',
+ 'profond',
+ 'progrès',
+ 'proie',
+ 'projeter',
+ 'prologue',
+ 'promener',
+ 'propre',
+ 'prospère',
+ 'protéger',
+ 'prouesse',
+ 'proverbe',
+ 'prudence',
+ 'pruneau',
+ 'psychose',
+ 'public',
+ 'puceron',
+ 'puiser',
+ 'pulpe',
+ 'pulsar',
+ 'punaise',
+ 'punitif',
+ 'pupitre',
+ 'purifier',
+ 'puzzle',
+ 'pyramide',
+ 'quasar',
+ 'querelle',
+ 'question',
+ 'quiétude',
+ 'quitter',
+ 'quotient',
+ 'racine',
+ 'raconter',
+ 'radieux',
+ 'ragondin',
+ 'raideur',
+ 'raisin',
+ 'ralentir',
+ 'rallonge',
+ 'ramasser',
+ 'rapide',
+ 'rasage',
+ 'ratisser',
+ 'ravager',
+ 'ravin',
+ 'rayonner',
+ 'réactif',
+ 'réagir',
+ 'réaliser',
+ 'réanimer',
+ 'recevoir',
+ 'réciter',
+ 'réclamer',
+ 'récolter',
+ 'recruter',
+ 'reculer',
+ 'recycler',
+ 'rédiger',
+ 'redouter',
+ 'refaire',
+ 'réflexe',
+ 'réformer',
+ 'refrain',
+ 'refuge',
+ 'régalien',
+ 'région',
+ 'réglage',
+ 'régulier',
+ 'réitérer',
+ 'rejeter',
+ 'rejouer',
+ 'relatif',
+ 'relever',
+ 'relief',
+ 'remarque',
+ 'remède',
+ 'remise',
+ 'remonter',
+ 'remplir',
+ 'remuer',
+ 'renard',
+ 'renfort',
+ 'renifler',
+ 'renoncer',
+ 'rentrer',
+ 'renvoi',
+ 'replier',
+ 'reporter',
+ 'reprise',
+ 'reptile',
+ 'requin',
+ 'réserve',
+ 'résineux',
+ 'résoudre',
+ 'respect',
+ 'rester',
+ 'résultat',
+ 'rétablir',
+ 'retenir',
+ 'réticule',
+ 'retomber',
+ 'retracer',
+ 'réunion',
+ 'réussir',
+ 'revanche',
+ 'revivre',
+ 'révolte',
+ 'révulsif',
+ 'richesse',
+ 'rideau',
+ 'rieur',
+ 'rigide',
+ 'rigoler',
+ 'rincer',
+ 'riposter',
+ 'risible',
+ 'risque',
+ 'rituel',
+ 'rival',
+ 'rivière',
+ 'rocheux',
+ 'romance',
+ 'rompre',
+ 'ronce',
+ 'rondin',
+ 'roseau',
+ 'rosier',
+ 'rotatif',
+ 'rotor',
+ 'rotule',
+ 'rouge',
+ 'rouille',
+ 'rouleau',
+ 'routine',
+ 'royaume',
+ 'ruban',
+ 'rubis',
+ 'ruche',
+ 'ruelle',
+ 'rugueux',
+ 'ruiner',
+ 'ruisseau',
+ 'ruser',
+ 'rustique',
+ 'rythme',
+ 'sabler',
+ 'saboter',
+ 'sabre',
+ 'sacoche',
+ 'safari',
+ 'sagesse',
+ 'saisir',
+ 'salade',
+ 'salive',
+ 'salon',
+ 'saluer',
+ 'samedi',
+ 'sanction',
+ 'sanglier',
+ 'sarcasme',
+ 'sardine',
+ 'saturer',
+ 'saugrenu',
+ 'saumon',
+ 'sauter',
+ 'sauvage',
+ 'savant',
+ 'savonner',
+ 'scalpel',
+ 'scandale',
+ 'scélérat',
+ 'scénario',
+ 'sceptre',
+ 'schéma',
+ 'science',
+ 'scinder',
+ 'score',
+ 'scrutin',
+ 'sculpter',
+ 'séance',
+ 'sécable',
+ 'sécher',
+ 'secouer',
+ 'sécréter',
+ 'sédatif',
+ 'séduire',
+ 'seigneur',
+ 'séjour',
+ 'sélectif',
+ 'semaine',
+ 'sembler',
+ 'semence',
+ 'séminal',
+ 'sénateur',
+ 'sensible',
+ 'sentence',
+ 'séparer',
+ 'séquence',
+ 'serein',
+ 'sergent',
+ 'sérieux',
+ 'serrure',
+ 'sérum',
+ 'service',
+ 'sésame',
+ 'sévir',
+ 'sevrage',
+ 'sextuple',
+ 'sidéral',
+ 'siècle',
+ 'siéger',
+ 'siffler',
+ 'sigle',
+ 'signal',
+ 'silence',
+ 'silicium',
+ 'simple',
+ 'sincère',
+ 'sinistre',
+ 'siphon',
+ 'sirop',
+ 'sismique',
+ 'situer',
+ 'skier',
+ 'social',
+ 'socle',
+ 'sodium',
+ 'soigneux',
+ 'soldat',
+ 'soleil',
+ 'solitude',
+ 'soluble',
+ 'sombre',
+ 'sommeil',
+ 'somnoler',
+ 'sonde',
+ 'songeur',
+ 'sonnette',
+ 'sonore',
+ 'sorcier',
+ 'sortir',
+ 'sosie',
+ 'sottise',
+ 'soucieux',
+ 'soudure',
+ 'souffle',
+ 'soulever',
+ 'soupape',
+ 'source',
+ 'soutirer',
+ 'souvenir',
+ 'spacieux',
+ 'spatial',
+ 'spécial',
+ 'sphère',
+ 'spiral',
+ 'stable',
+ 'station',
+ 'sternum',
+ 'stimulus',
+ 'stipuler',
+ 'strict',
+ 'studieux',
+ 'stupeur',
+ 'styliste',
+ 'sublime',
+ 'substrat',
+ 'subtil',
+ 'subvenir',
+ 'succès',
+ 'sucre',
+ 'suffixe',
+ 'suggérer',
+ 'suiveur',
+ 'sulfate',
+ 'superbe',
+ 'supplier',
+ 'surface',
+ 'suricate',
+ 'surmener',
+ 'surprise',
+ 'sursaut',
+ 'survie',
+ 'suspect',
+ 'syllabe',
+ 'symbole',
+ 'symétrie',
+ 'synapse',
+ 'syntaxe',
+ 'système',
+ 'tabac',
+ 'tablier',
+ 'tactile',
+ 'tailler',
+ 'talent',
+ 'talisman',
+ 'talonner',
+ 'tambour',
+ 'tamiser',
+ 'tangible',
+ 'tapis',
+ 'taquiner',
+ 'tarder',
+ 'tarif',
+ 'tartine',
+ 'tasse',
+ 'tatami',
+ 'tatouage',
+ 'taupe',
+ 'taureau',
+ 'taxer',
+ 'témoin',
+ 'temporel',
+ 'tenaille',
+ 'tendre',
+ 'teneur',
+ 'tenir',
+ 'tension',
+ 'terminer',
+ 'terne',
+ 'terrible',
+ 'tétine',
+ 'texte',
+ 'thème',
+ 'théorie',
+ 'thérapie',
+ 'thorax',
+ 'tibia',
+ 'tiède',
+ 'timide',
+ 'tirelire',
+ 'tiroir',
+ 'tissu',
+ 'titane',
+ 'titre',
+ 'tituber',
+ 'toboggan',
+ 'tolérant',
+ 'tomate',
+ 'tonique',
+ 'tonneau',
+ 'toponyme',
+ 'torche',
+ 'tordre',
+ 'tornade',
+ 'torpille',
+ 'torrent',
+ 'torse',
+ 'tortue',
+ 'totem',
+ 'toucher',
+ 'tournage',
+ 'tousser',
+ 'toxine',
+ 'traction',
+ 'trafic',
+ 'tragique',
+ 'trahir',
+ 'train',
+ 'trancher',
+ 'travail',
+ 'trèfle',
+ 'tremper',
+ 'trésor',
+ 'treuil',
+ 'triage',
+ 'tribunal',
+ 'tricoter',
+ 'trilogie',
+ 'triomphe',
+ 'tripler',
+ 'triturer',
+ 'trivial',
+ 'trombone',
+ 'tronc',
+ 'tropical',
+ 'troupeau',
+ 'tuile',
+ 'tulipe',
+ 'tumulte',
+ 'tunnel',
+ 'turbine',
+ 'tuteur',
+ 'tutoyer',
+ 'tuyau',
+ 'tympan',
+ 'typhon',
+ 'typique',
+ 'tyran',
+ 'ubuesque',
+ 'ultime',
+ 'ultrason',
+ 'unanime',
+ 'unifier',
+ 'union',
+ 'unique',
+ 'unitaire',
+ 'univers',
+ 'uranium',
+ 'urbain',
+ 'urticant',
+ 'usage',
+ 'usine',
+ 'usuel',
+ 'usure',
+ 'utile',
+ 'utopie',
+ 'vacarme',
+ 'vaccin',
+ 'vagabond',
+ 'vague',
+ 'vaillant',
+ 'vaincre',
+ 'vaisseau',
+ 'valable',
+ 'valise',
+ 'vallon',
+ 'valve',
+ 'vampire',
+ 'vanille',
+ 'vapeur',
+ 'varier',
+ 'vaseux',
+ 'vassal',
+ 'vaste',
+ 'vecteur',
+ 'vedette',
+ 'végétal',
+ 'véhicule',
+ 'veinard',
+ 'véloce',
+ 'vendredi',
+ 'vénérer',
+ 'venger',
+ 'venimeux',
+ 'ventouse',
+ 'verdure',
+ 'vérin',
+ 'vernir',
+ 'verrou',
+ 'verser',
+ 'vertu',
+ 'veston',
+ 'vétéran',
+ 'vétuste',
+ 'vexant',
+ 'vexer',
+ 'viaduc',
+ 'viande',
+ 'victoire',
+ 'vidange',
+ 'vidéo',
+ 'vignette',
+ 'vigueur',
+ 'vilain',
+ 'village',
+ 'vinaigre',
+ 'violon',
+ 'vipère',
+ 'virement',
+ 'virtuose',
+ 'virus',
+ 'visage',
+ 'viseur',
+ 'vision',
+ 'visqueux',
+ 'visuel',
+ 'vital',
+ 'vitesse',
+ 'viticole',
+ 'vitrine',
+ 'vivace',
+ 'vivipare',
+ 'vocation',
+ 'voguer',
+ 'voile',
+ 'voisin',
+ 'voiture',
+ 'volaille',
+ 'volcan',
+ 'voltiger',
+ 'volume',
+ 'vorace',
+ 'vortex',
+ 'voter',
+ 'vouloir',
+ 'voyage',
+ 'voyelle',
+ 'wagon',
+ 'xénon',
+ 'yacht',
+ 'zèbre',
+ 'zénith',
+ 'zeste',
+ 'zoologie'
+];
diff --git a/lib/models/cesium_plus.dart b/lib/models/cesium_plus.dart
index 8d73d00..e2659c1 100644
--- a/lib/models/cesium_plus.dart
+++ b/lib/models/cesium_plus.dart
@@ -1,15 +1,18 @@
import 'dart:convert';
import 'dart:io';
+import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
-import 'package:http/http.dart' as http;
import 'package:path_provider/path_provider.dart';
+// import 'package:http/http.dart' as http;
class CesiumPlusProvider with ChangeNotifier {
TextEditingController cesiumName = TextEditingController();
- int iAvatar = 0;
- bool isComplete = false;
+ Image defaultAvatar(double size) =>
+ Image.asset(('assets/icon_user.png'), height: size);
+
+ CancelToken avatarCancelToken = CancelToken();
Future _buildQuery(_pubkey) async {
var queryGetAvatar = json.encode({
@@ -61,45 +64,95 @@ class CesiumPlusProvider with ChangeNotifier {
Future getName(String _pubkey) async {
String _name;
+ if (g1WalletsBox.get(_pubkey).csName != null) {
+ return g1WalletsBox.get(_pubkey).csName;
+ }
+
List queryOptions = await _buildQuery(_pubkey);
- final response = await http.post((Uri.parse(queryOptions[0])),
- body: queryOptions[1], headers: queryOptions[2]);
- final responseJson = json.decode(response.body);
- if (responseJson['hits']['hits'].toString() == '[]') {
+
+ var dio = Dio();
+ Response response;
+ try {
+ response = await dio.post(
+ queryOptions[0],
+ data: queryOptions[1],
+ options: Options(
+ headers: queryOptions[2],
+ sendTimeout: 3000,
+ receiveTimeout: 5000,
+ ),
+ );
+ // response = await http.post((Uri.parse(queryOptions[0])),
+ // body: queryOptions[1], headers: queryOptions[2]);
+ } catch (e) {
+ log.e(e);
+ }
+
+ if (response.data['hits']['hits'].toString() == '[]') {
return '';
}
final bool _nameExist =
- responseJson['hits']['hits'][0]['_source'].containsKey("title");
+ response.data['hits']['hits'][0]['_source'].containsKey("title");
if (!_nameExist) {
return '';
}
- _name = responseJson['hits']['hits'][0]['_source']['title'];
+ _name = response.data['hits']['hits'][0]['_source']['title'];
+
+ g1WalletsBox.get(_pubkey).csName = _name;
return _name;
}
- Future getAvatar(String _pubkey) async {
+ Future getAvatar(String _pubkey, double size) async {
+ if (g1WalletsBox.get(_pubkey).avatar != null) {
+ return g1WalletsBox.get(_pubkey).avatar;
+ }
+ var dio = Dio();
+
+ // log.d(_pubkey);
+
List queryOptions = await _buildQuery(_pubkey);
- final response = await http.post((Uri.parse(queryOptions[0])),
- body: queryOptions[1], headers: queryOptions[2]);
- final responseJson = json.decode(response.body);
- if (responseJson['hits']['hits'].toString() == '[]') {
- return [File(appPath.path + '/default_avatar.png')];
+
+ Response response;
+ try {
+ response = await dio
+ .post(queryOptions[0],
+ data: queryOptions[1],
+ options: Options(
+ headers: queryOptions[2],
+ sendTimeout: 4000,
+ receiveTimeout: 15000,
+ ),
+ cancelToken: avatarCancelToken)
+ .timeout(
+ const Duration(seconds: 15),
+ );
+ // response = await http.post((Uri.parse(queryOptions[0])),
+ // body: queryOptions[1], headers: queryOptions[2]);
+ } catch (e) {
+ log.e(e);
}
- final bool avatarExist =
- responseJson['hits']['hits'][0]['_source'].containsKey("avatar");
- if (!avatarExist) {
- return [File(appPath.path + '/default_avatar.png')];
+
+ if (response.data['hits']['hits'].toString() == '[]' ||
+ !response.data['hits']['hits'][0]['_source'].containsKey("avatar")) {
+ return defaultAvatar(size);
}
+
final _avatar =
- responseJson['hits']['hits'][0]['_source']['avatar']['_content'];
+ response.data['hits']['hits'][0]['_source']['avatar']['_content'];
var avatarFile =
- File('${(await getTemporaryDirectory()).path}/avatar$iAvatar.png');
+ File('${(await getTemporaryDirectory()).path}/avatar_$_pubkey.png');
await avatarFile.writeAsBytes(base64.decode(_avatar));
- iAvatar++;
- isComplete = true;
- return [avatarFile];
+ final finalAvatar = Image.file(
+ avatarFile,
+ height: size,
+ fit: BoxFit.fitWidth,
+ );
+
+ g1WalletsBox.get(_pubkey).avatar = finalAvatar;
+
+ return finalAvatar;
}
}
diff --git a/lib/models/g1_wallets_list.dart b/lib/models/g1_wallets_list.dart
new file mode 100644
index 0000000..98fef2b
--- /dev/null
+++ b/lib/models/g1_wallets_list.dart
@@ -0,0 +1,74 @@
+import 'package:flutter/material.dart';
+import 'package:hive_flutter/hive_flutter.dart';
+
+part 'g1_wallets_list.g.dart';
+
+@HiveType(typeId: 2)
+class G1WalletsList {
+ @HiveField(0)
+ String pubkey;
+
+ @HiveField(1)
+ double balance;
+
+ @HiveField(3)
+ Id id;
+
+ @HiveField(4)
+ Image avatar;
+
+ @HiveField(5)
+ String username;
+
+ @HiveField(6)
+ String csName;
+
+ @HiveField(7)
+ bool isMembre;
+
+ G1WalletsList({
+ this.pubkey,
+ this.balance,
+ this.id,
+ this.avatar,
+ this.username,
+ this.csName,
+ this.isMembre,
+ });
+
+ G1WalletsList.fromJson(Map json) {
+ pubkey = json['pubkey'];
+ balance = json['balance'];
+ id = json['id'] != null ? Id.fromJson(json['id']) : null;
+ }
+
+ Map toJson() {
+ final Map data = {};
+ data['pubkey'] = pubkey;
+ data['balance'] = balance;
+ if (id != null) {
+ data['id'] = id.toJson();
+ }
+ return data;
+ }
+}
+
+@HiveType(typeId: 3)
+class Id {
+ bool isMember;
+ String username;
+
+ Id({this.isMember, this.username});
+
+ Id.fromJson(Map json) {
+ isMember = json['isMember'];
+ username = json['username'];
+ }
+
+ Map toJson() {
+ final Map data = {};
+ data['isMember'] = isMember;
+ data['username'] = username;
+ return data;
+ }
+}
diff --git a/lib/models/g1_wallets_list.g.dart b/lib/models/g1_wallets_list.g.dart
new file mode 100644
index 0000000..266daed
--- /dev/null
+++ b/lib/models/g1_wallets_list.g.dart
@@ -0,0 +1,90 @@
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+// ignore_for_file: unused_local_variable
+
+part of 'g1_wallets_list.dart';
+
+// **************************************************************************
+// TypeAdapterGenerator
+// **************************************************************************
+
+class G1WalletsListAdapter extends TypeAdapter {
+ @override
+ final int typeId = 2;
+
+ @override
+ G1WalletsList read(BinaryReader reader) {
+ final numOfFields = reader.readByte();
+ final fields = {
+ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
+ };
+ return G1WalletsList(
+ pubkey: fields[0] as String,
+ balance: fields[1] as double,
+ id: fields[3] as Id,
+ avatar: fields[4] as Image,
+ username: fields[5] as String,
+ csName: fields[6] as String,
+ isMembre: fields[7] as bool,
+ );
+ }
+
+ @override
+ void write(BinaryWriter writer, G1WalletsList obj) {
+ writer
+ ..writeByte(7)
+ ..writeByte(0)
+ ..write(obj.pubkey)
+ ..writeByte(1)
+ ..write(obj.balance)
+ ..writeByte(3)
+ ..write(obj.id)
+ ..writeByte(4)
+ ..write(obj.avatar)
+ ..writeByte(5)
+ ..write(obj.username)
+ ..writeByte(6)
+ ..write(obj.csName)
+ ..writeByte(7)
+ ..write(obj.isMembre);
+ }
+
+ @override
+ int get hashCode => typeId.hashCode;
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is G1WalletsListAdapter &&
+ runtimeType == other.runtimeType &&
+ typeId == other.typeId;
+}
+
+class IdAdapter extends TypeAdapter {
+ @override
+ final int typeId = 3;
+
+ @override
+ Id read(BinaryReader reader) {
+ final numOfFields = reader.readByte();
+ final fields = {
+ for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
+ };
+ return Id();
+ }
+
+ @override
+ void write(BinaryWriter writer, Id obj) {
+ writer.writeByte(0);
+ }
+
+ @override
+ int get hashCode => typeId.hashCode;
+
+ @override
+ bool operator ==(Object other) =>
+ identical(this, other) ||
+ other is IdAdapter &&
+ runtimeType == other.runtimeType &&
+ typeId == other.typeId;
+}
diff --git a/lib/models/generate_wallets.dart b/lib/models/generate_wallets.dart
index 1266dfc..c75e255 100644
--- a/lib/models/generate_wallets.dart
+++ b/lib/models/generate_wallets.dart
@@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
+import 'package:gecko/models/bip39_words.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:pdf/pdf.dart';
@@ -39,6 +40,21 @@ class GenerateWalletsProvider with ChangeNotifier {
bool canImport = false;
bool isPinChanged = false;
+ // Import Chest
+ TextEditingController cellController0 = TextEditingController();
+ TextEditingController cellController1 = TextEditingController();
+ TextEditingController cellController2 = TextEditingController();
+ TextEditingController cellController3 = TextEditingController();
+ TextEditingController cellController4 = TextEditingController();
+ TextEditingController cellController5 = TextEditingController();
+ TextEditingController cellController6 = TextEditingController();
+ TextEditingController cellController7 = TextEditingController();
+ TextEditingController cellController8 = TextEditingController();
+ TextEditingController cellController9 = TextEditingController();
+ TextEditingController cellController10 = TextEditingController();
+ TextEditingController cellController11 = TextEditingController();
+ bool isFirstTimeSentenceComplete = true;
+
Future storeHDWChest(
NewWallet _wallet, String _name, BuildContext context) async {
int chestNumber = 0;
@@ -140,7 +156,7 @@ class GenerateWalletsProvider with ChangeNotifier {
Future generateMnemonic() async {
try {
generatedMnemonic = await DubpRust.genMnemonic(language: Language.french);
- actualWallet = await generateWallet(generatedMnemonic);
+ actualWallet = await generateWallet(generatedMnemonic, isImport: false);
walletIsGenerated = true;
} catch (e) {
log.e(e);
@@ -148,7 +164,8 @@ class GenerateWalletsProvider with ChangeNotifier {
return generatedMnemonic;
}
- Future generateWallet(generatedMnemonic) async {
+ Future generateWallet(String generatedMnemonic,
+ {@required bool isImport}) async {
try {
actualWallet = await DubpRust.genWalletFromMnemonic(
language: Language.french,
@@ -159,8 +176,10 @@ class GenerateWalletsProvider with ChangeNotifier {
log.e(e);
}
- mnemonicController.text = generatedMnemonic;
- pin.text = actualWallet.pin;
+ if (!isImport) {
+ mnemonicController.text = generatedMnemonic;
+ pin.text = actualWallet.pin;
+ }
// notifyListeners();
return actualWallet;
@@ -288,15 +307,9 @@ class GenerateWalletsProvider with ChangeNotifier {
notifyListeners();
}
- void resetImportView() {
- cesiumID.text = '';
- cesiumPWD.text = '';
- cesiumPubkey.text = '';
- pin.text = '';
- canImport = false;
- isPinChanged = false;
- isCesiumIDVisible = false;
- isCesiumPWDVisible = false;
+ void resetCesiumImportView() {
+ cesiumID.text = cesiumPWD.text = cesiumPubkey.text = pin.text = '';
+ canImport = isPinChanged = isCesiumIDVisible = isCesiumPWDVisible = false;
actualWallet = null;
notifyListeners();
}
@@ -315,6 +328,83 @@ class GenerateWalletsProvider with ChangeNotifier {
return _wordsList;
}
+ bool isBipWord(String word) {
+ notifyListeners();
+
+ // Needed for bad encoding of UTF-8
+ word = word.replaceAll('é', 'é');
+ word = word.replaceAll('è', 'è');
+ return bip39Words.contains(word);
+ }
+
+ bool isBipWordsList(List words) {
+ bool isValid = true;
+ for (String word in words) {
+ // Needed for bad encoding of UTF-8
+ word = word.replaceAll('é', 'é');
+ word = word.replaceAll('è', 'è');
+ if (!bip39Words.contains(word)) {
+ isValid = false;
+ }
+ }
+ return isValid;
+ }
+
+ void resetImportView() {
+ cellController0.text = cellController1.text = cellController2.text =
+ cellController3.text = cellController4.text = cellController5.text =
+ cellController6.text = cellController7.text = cellController8.text =
+ cellController9.text =
+ cellController10.text = cellController11.text = '';
+ isFirstTimeSentenceComplete = true;
+ notifyListeners();
+ }
+
+ bool isSentenceComplete(BuildContext context) {
+ if (isBipWordsList(
+ [
+ cellController0.text,
+ cellController1.text,
+ cellController2.text,
+ cellController3.text,
+ cellController4.text,
+ cellController5.text,
+ cellController6.text,
+ cellController7.text,
+ cellController8.text,
+ cellController9.text,
+ cellController10.text,
+ cellController11.text
+ ],
+ )) {
+ if (isFirstTimeSentenceComplete) {
+ FocusScope.of(context).unfocus();
+ }
+ isFirstTimeSentenceComplete = false;
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ Future isSentenceValid() async {
+ String inputMnemonic =
+ '${cellController0.text} ${cellController1.text} ${cellController2.text} ${cellController3.text} ${cellController4.text} ${cellController5.text} ${cellController6.text} ${cellController7.text} ${cellController8.text} ${cellController9.text} ${cellController10.text} ${cellController11.text}';
+
+ // Needed for bad encoding of UTF-8
+ inputMnemonic = inputMnemonic.replaceAll('é', 'é');
+ inputMnemonic = inputMnemonic.replaceAll('è', 'è');
+
+ NewWallet generatedWallet =
+ await generateWallet(inputMnemonic, isImport: true);
+
+ if (generatedWallet == null) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
void reloadBuild() {
notifyListeners();
}
diff --git a/lib/models/home.dart b/lib/models/home.dart
index 69fe956..f661211 100644
--- a/lib/models/home.dart
+++ b/lib/models/home.dart
@@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';
import 'package:gecko/globals.dart';
-import 'package:gecko/screens/history.dart';
+import 'package:gecko/screens/old_history_pay.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:package_info/package_info.dart';
@@ -21,7 +21,8 @@ class HomeProvider with ChangeNotifier {
Widget appBarExplorer =
Text('Explorateur', style: TextStyle(color: Colors.grey[850]));
- List currentTab = [HistoryScreen(), WalletsHome()];
+ List currentTab = [OldHistoryScreen(), WalletsHome()];
+ bool isFirstBuild = true;
// AudioCache player = AudioCache(prefix: 'sounds/');
get currentIndex => _currentIndex;
@@ -99,16 +100,6 @@ class HomeProvider with ChangeNotifier {
return _endpoint;
}
- Future createDefaultAvatar() async {
- File defaultAvatar = File(appPath.path + '/default_avatar.png');
- final bool isAvatarExist = await defaultAvatar.exists();
- if (!isAvatarExist) {
- final byteData = await rootBundle.load('assets/icon_user.png');
- await defaultAvatar.writeAsBytes(byteData.buffer
- .asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
- }
- }
-
T getRandomElement(List list) {
final random = Random();
var i = random.nextInt(list.length);
@@ -139,6 +130,22 @@ class HomeProvider with ChangeNotifier {
notifyListeners();
}
+ void snackNode(context) {
+ if (isFirstBuild) {
+ String _message;
+ if (endPointGVA == 'HS') {
+ _message =
+ "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement";
+ } else {
+ _message = "Vous êtes connecté au noeud\n${endPointGVA.split('/')[2]}";
+ }
+ final snackBar = SnackBar(
+ content: Text(_message), duration: const Duration(seconds: 2));
+ isFirstBuild = false;
+ ScaffoldMessenger.of(context).showSnackBar(snackBar);
+ }
+ }
+
void rebuildWidget() {
notifyListeners();
}
diff --git a/lib/models/my_wallets.dart b/lib/models/my_wallets.dart
index 6953108..e8a6305 100644
--- a/lib/models/my_wallets.dart
+++ b/lib/models/my_wallets.dart
@@ -71,8 +71,13 @@ class MyWalletsProvider with ChangeNotifier {
await walletBox.clear();
await chestBox.clear();
await configBox.delete('defaultWallet');
+ // await Future.delayed(const Duration(milliseconds: 50));
+ // notifyListeners();
- Navigator.pop(context);
+ await Navigator.of(context).pushNamedAndRemoveUntil(
+ '/',
+ ModalRoute.withName('/'),
+ );
}
return 0;
} catch (e) {
diff --git a/lib/models/queries.dart b/lib/models/queries.dart
index 72ba0e9..ed47ac8 100644
--- a/lib/models/queries.dart
+++ b/lib/models/queries.dart
@@ -29,14 +29,12 @@ const String getHistory = r'''
issuers
comment
outputs
- writtenTime
}
sending {
currency
issuers
comment
outputs
- writtenTime
}
}
currentUd {
@@ -62,3 +60,36 @@ const String getBalance = r'''
}
}
''';
+
+const String getWallets = r'''
+query ($number: Int!, $cursor: String) {
+ wallets(pagination: {ord: ASC, pageSize: $number, cursor: $cursor}) {
+ pageInfo {
+ hasNextPage
+ endCursor
+ }
+ edges {
+ node {
+ script
+ balance {
+ amount
+ base
+ }
+ idty {
+ isMember
+ username
+ }
+ }
+ }
+ }
+}
+''';
+
+const String getId = r'''
+query ($pubkey: PubKeyGva!) {
+ idty(pubkey: $pubkey) {
+ isMember
+ username
+ }
+}
+''';
diff --git a/lib/models/search.dart b/lib/models/search.dart
new file mode 100644
index 0000000..5fdbb61
--- /dev/null
+++ b/lib/models/search.dart
@@ -0,0 +1,80 @@
+import 'package:dio/dio.dart';
+import 'package:flutter/foundation.dart';
+import 'package:flutter/material.dart';
+import 'package:gecko/globals.dart';
+import 'package:gecko/models/g1_wallets_list.dart';
+import 'package:gecko/models/wallets_profiles.dart';
+
+class SearchProvider with ChangeNotifier {
+ TextEditingController searchController = TextEditingController();
+ List searchResult = [];
+ final cacheDuring = 20 * 60 * 1000; //First number is minutes
+ int cacheTime = 0;
+
+ void rebuildWidget() {
+ notifyListeners();
+ }
+
+ Future searchBlockchain() async {
+ searchResult.clear();
+ int searchTime = DateTime.now().millisecondsSinceEpoch;
+ WalletsProfilesProvider _walletProfiles = WalletsProfilesProvider('pubkey');
+
+ if (cacheTime + cacheDuring <= searchTime) {
+ g1WalletsBox.clear();
+ // final url = Uri.parse('https://g1-stats.axiom-team.fr/data/forbes.json');
+ // final response = await http.get(url);
+
+ var dio = Dio();
+ Response response;
+ try {
+ response = await dio.get(
+ 'https://g1-stats.axiom-team.fr/data/forbes.json',
+ options: Options(
+ sendTimeout: 5000,
+ receiveTimeout: 10000,
+ ),
+ );
+ // response = await http.post((Uri.parse(queryOptions[0])),
+ // body: queryOptions[1], headers: queryOptions[2]);
+ } catch (e) {
+ log.e(e);
+ }
+
+ List _listWallets = _parseG1Wallets(response.data);
+ Map _mapWallets = {
+ for (var e in _listWallets) e.pubkey: e
+ };
+
+ await g1WalletsBox.putAll(_mapWallets);
+ cacheTime = DateTime.now().millisecondsSinceEpoch;
+ }
+
+ g1WalletsBox.toMap().forEach((key, value) {
+ if ((value.id != null &&
+ value.id.username != null &&
+ value.id.username
+ .toLowerCase()
+ .contains(searchController.text)) ||
+ value.pubkey.contains(searchController.text)) {
+ searchResult.add(value);
+ return;
+ }
+ });
+
+ if (searchResult.isEmpty &&
+ _walletProfiles.isPubkey(searchController.text)) {
+ searchResult = [G1WalletsList(pubkey: searchController.text)];
+ }
+
+ return searchResult;
+ }
+}
+
+List _parseG1Wallets(var responseBody) {
+ final parsed = responseBody.cast