Set first gdev endpoint in bootstrap list; fix: default wallet on stratup

This commit is contained in:
poka 2022-05-27 06:11:09 +02:00
parent 6cbe5b2fd6
commit 1227e15fa2
12 changed files with 97 additions and 74 deletions

View File

@ -0,0 +1,3 @@
[
"wss://gdev.librelois.fr/ws"
]

View File

@ -1,3 +0,0 @@
[
"https://g1.librelois.fr/gva"
]

View File

@ -72,6 +72,7 @@ Future<void> main() async {
configBox = await Hive.openBox("configBox"); configBox = await Hive.openBox("configBox");
await Hive.deleteBoxFromDisk('g1WalletsBox'); 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();
@ -82,7 +83,7 @@ Future<void> main() async {
// 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.getValidEndpoints();
// if (endPointGVA == 'HS') { // if (endPointGVA == 'HS') {
// _homeProvider.playSound('faché', 0.8); // _homeProvider.playSound('faché', 0.8);

View File

@ -57,56 +57,62 @@ class HomeProvider with ChangeNotifier {
return version + '+' + buildNumber; return version + '+' + buildNumber;
} }
Future<String?> getValidEndpoint() async { Future<List?> getValidEndpoints() async {
List _listEndpoints = await rootBundle configBox.delete('endpoint');
.loadString('config/gva_endpoints.json')
.then((jsonStr) => jsonDecode(jsonStr));
_listEndpoints.shuffle();
int i = 0; List _listEndpoints = [];
String? _endpoint; if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == []) {
int _statusCode = 0; _listEndpoints = await rootBundle
.loadString('config/gdev_endpoints.json')
.then((jsonStr) => jsonDecode(jsonStr));
_listEndpoints.shuffle();
configBox.put('endpoint', _listEndpoints);
}
final _client = HttpClient(); // int i = 0;
_client.connectionTimeout = const Duration(milliseconds: 1000); // String? _endpoint;
// int _statusCode = 0;
do { // final _client = HttpClient();
i++; // _client.connectionTimeout = const Duration(milliseconds: 1000);
log.d(i.toString() + ' ème essai de recherche de endpoint GVA.');
log.d('Try GVA endpoint: ${_listEndpoints[i - 1]}');
int listLenght = _listEndpoints.length - 1;
if (i > listLenght) {
log.e('NO VALID GVA ENDPOINT FOUND');
_endpoint = 'HS';
break;
}
if (i != 0) {
await Future.delayed(const Duration(milliseconds: 300));
}
try { // do {
final request = await _client.postUrl(Uri.parse(_listEndpoints[i])); // i++;
final response = await request.close(); // log.d(i.toString() + ' ème essai de recherche de endpoint GVA.');
// log.d('Try GVA endpoint: ${_listEndpoints[i - 1]}');
// int listLenght = _listEndpoints.length - 1;
// if (i > listLenght) {
// log.e('NO VALID GVA ENDPOINT FOUND');
// _endpoint = 'HS';
// break;
// }
// if (i != 0) {
// await Future.delayed(const Duration(milliseconds: 300));
// }
_endpoint = _listEndpoints[i]; // try {
_statusCode = response.statusCode; // final request = await _client.postUrl(Uri.parse(_listEndpoints[i]));
} on TimeoutException catch (_) { // final response = await request.close();
log.e('This endpoint is timeout, next');
_statusCode = 50;
continue;
} on SocketException catch (_) {
log.e('This endpoint is a bad endpoint, next');
_statusCode = 70;
continue;
} on Exception {
log.e('Unknown error');
_statusCode = 60;
continue;
}
} while (_statusCode != 400);
log.i('ENDPOINT: ' + _endpoint!); // _endpoint = _listEndpoints[i];
return _endpoint; // _statusCode = response.statusCode;
// } on TimeoutException catch (_) {
// log.e('This endpoint is timeout, next');
// _statusCode = 50;
// continue;
// } on SocketException catch (_) {
// log.e('This endpoint is a bad endpoint, next');
// _statusCode = 70;
// continue;
// } on Exception {
// log.e('Unknown error');
// _statusCode = 60;
// continue;
// }
// } while (_statusCode != 400);
log.i('ENDPOINT: ' + _listEndpoints.toString());
return _listEndpoints;
} }
T getRandomElement<T>(List<T> list) { T getRandomElement<T>(List<T> list) {

View File

@ -22,11 +22,10 @@ class MyWalletsProvider with ChangeNotifier {
bool checkIfWalletExist() { bool checkIfWalletExist() {
// configBox.delete('endpoint'); // configBox.delete('endpoint');
if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == '') { // if (!configBox.containsKey('endpoint') || configBox.get('endpoint') == []) {
log.d('No endpoint, configure...'); // log.d('No endpoint, configure...');
// configBox.put('endpoint', 'wss://gdev.librelois.fr/ws'); // configBox.put('endpoint', 'wss://gdev.librelois.fr/ws');
configBox.put('endpoint', 'ws://127.0.0.1:9944'); // }
}
if (chestBox.isEmpty) { if (chestBox.isEmpty) {
log.i('No wallets detected'); log.i('No wallets detected');

View File

@ -11,6 +11,7 @@ import 'package:polkawallet_sdk/api/types/txInfoData.dart';
import 'package:polkawallet_sdk/polkawallet_sdk.dart'; import 'package:polkawallet_sdk/polkawallet_sdk.dart';
import 'package:polkawallet_sdk/storage/keyring.dart'; import 'package:polkawallet_sdk/storage/keyring.dart';
import 'package:polkawallet_sdk/storage/types/keyPairData.dart'; import 'package:polkawallet_sdk/storage/types/keyPairData.dart';
import 'package:provider/provider.dart';
import 'package:truncate/truncate.dart'; import 'package:truncate/truncate.dart';
// import 'package:web_socket_channel/io.dart'; // import 'package:web_socket_channel/io.dart';
@ -45,11 +46,15 @@ class SubstrateSdk with ChangeNotifier {
Future<void> connectNode(BuildContext ctx) async { Future<void> connectNode(BuildContext ctx) async {
List<NetworkParams> node = []; List<NetworkParams> node = [];
final n = NetworkParams();
n.name = currencyName; for (String _endpoint in configBox.get('endpoint')) {
n.endpoint = configBox.get('endpoint'); final n = NetworkParams();
n.ss58 = ss58; n.name = currencyName;
node.add(n); n.endpoint = _endpoint;
n.ss58 = ss58;
node.add(n);
}
int timeout = 10000; int timeout = 10000;
// if (n.endpoint!.startsWith('ws://')) { // if (n.endpoint!.startsWith('ws://')) {
@ -428,6 +433,10 @@ class SubstrateSdk with ChangeNotifier {
return await sdk.api.keyring.checkMnemonicValid(mnemonic); return await sdk.api.keyring.checkMnemonicValid(mnemonic);
} }
String? getConnectedEndpoint() {
return sdk.api.connectedNode?.endpoint;
}
} }
void snack(BuildContext context, String message, {int duration = 2}) { void snack(BuildContext context, String message, {int duration = 2}) {
@ -449,8 +458,10 @@ void snackNode(BuildContext context, bool isConnected) {
_message = _message =
"Aucun noeud Duniter disponible, veuillez réessayer ultérieurement"; "Aucun noeud Duniter disponible, veuillez réessayer ultérieurement";
} else { } else {
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
_message = _message =
"Vous êtes connecté au noeud\n${configBox.get('endpoint').split('//')[1]}"; "Vous êtes connecté au noeud\n${_sub.getConnectedEndpoint()!.split('//')[1]}";
} }
final snackBar = SnackBar( final snackBar = SnackBar(
padding: const EdgeInsets.all(20), padding: const EdgeInsets.all(20),

View File

@ -1,6 +1,7 @@
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
@ -74,8 +75,7 @@ class ChooseWalletScreen extends StatelessWidget {
WalletsProfilesProvider _walletViewProvider = WalletsProfilesProvider _walletViewProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
WalletData? defaultWallet = WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
_myWalletProvider.getDefaultWallet();
_selectedId ??= defaultWallet!.id(); _selectedId ??= defaultWallet!.id();
_derivation ??= defaultWallet!.derivation!; _derivation ??= defaultWallet!.derivation!;
@ -190,11 +190,14 @@ class ChooseWalletScreen extends StatelessWidget {
), ),
), ),
), ),
onTap: () { onTap: () async {
_derivation = _repository.derivation!; _derivation = _repository.derivation!;
_selectedId = _repository.id(); _selectedId = _repository.id();
chestBox.get(currentChest)!.defaultWallet =
_repository.number; ChestData _newChestData =
chestBox.get(currentChest)!;
_newChestData.defaultWallet = _repository.number;
await chestBox.put(currentChest, _newChestData);
_sub.setCurrentWallet(_repository.address!); _sub.setCurrentWallet(_repository.address!);
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();

View File

@ -198,7 +198,6 @@ class UnlockingWallet extends StatelessWidget {
) )
], ],
onCompleted: (_pin) async { onCompleted: (_pin) async {
log.d("Completed");
_myWalletProvider.pinCode = _pin.toUpperCase(); _myWalletProvider.pinCode = _pin.toUpperCase();
final isValid = await _sub.checkPassword( final isValid = await _sub.checkPassword(

View File

@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.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/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
@ -335,17 +336,18 @@ class WalletOptions extends StatelessWidget {
MyWalletsProvider _myWalletProvider, MyWalletsProvider _myWalletProvider,
WalletOptionsProvider _walletOptions, WalletOptionsProvider _walletOptions,
int _currentChest) { int _currentChest) {
WalletData defaultWallet = WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!;
_myWalletProvider.getDefaultWallet()!;
_walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]); _walletOptions.isDefaultWallet = (defaultWallet.number == wallet.id()[1]);
return InkWell( return InkWell(
key: const Key('setDefaultWallet'), key: const Key('setDefaultWallet'),
onTap: !walletProvider.isDefaultWallet onTap: !walletProvider.isDefaultWallet
? () { ? () async {
defaultWallet = wallet; defaultWallet = wallet;
chestBox.get(_currentChest)!.defaultWallet = wallet.number; ChestData _newChestData = chestBox.get(_currentChest)!;
_newChestData.defaultWallet = wallet.number;
await chestBox.put(_currentChest, _newChestData);
_myWalletProvider.readAllWallets(_currentChest); _myWalletProvider.readAllWallets(_currentChest);
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();
} }

View File

@ -30,12 +30,13 @@ class SettingsScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
const double buttonHigh = 50; const double buttonHigh = 50;
const double buttonWidth = 240; const double buttonWidth = 240;
const double fontSize = 16; const double fontSize = 16;
TextEditingController _endpointController = TextEditingController _endpointController =
TextEditingController(text: configBox.get('endpoint')); TextEditingController(text: _sub.getConnectedEndpoint());
// getAppDirectory(); // getAppDirectory();
return Scaffold( return Scaffold(
@ -71,7 +72,7 @@ class SettingsScreen extends StatelessWidget {
size: 40, size: 40,
), ),
onPressed: () async { onPressed: () async {
configBox.put('endpoint', _endpointController.text); configBox.put('endpoint', [_endpointController.text]);
await _sub.connectNode(context); await _sub.connectNode(context);
}); });
}), }),

View File

@ -193,6 +193,7 @@ class WalletViewScreen extends StatelessWidget {
const double shapeSize = 20; const double shapeSize = 20;
WalletData? defaultWallet = _myWalletProvider.getDefaultWallet(); WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
log.d(defaultWallet!.address);
bool canValidate = false; bool canValidate = false;
@ -213,7 +214,7 @@ class WalletViewScreen extends StatelessWidget {
if (_walletViewProvider.payAmount.text != '' && if (_walletViewProvider.payAmount.text != '' &&
double.parse(_walletViewProvider.payAmount.text) <= double.parse(_walletViewProvider.payAmount.text) <=
double.parse( double.parse(
balanceCache[defaultWallet!.address]!.split(' ')[0]) && balanceCache[defaultWallet.address]!.split(' ')[0]) &&
_walletViewProvider.pubkey != defaultWallet.address) { _walletViewProvider.pubkey != defaultWallet.address) {
canValidate = true; canValidate = true;
} else { } else {
@ -286,7 +287,7 @@ class WalletViewScreen extends StatelessWidget {
padding: const EdgeInsets.all(10), padding: const EdgeInsets.all(10),
child: Row(children: [ child: Row(children: [
Text(defaultWallet!.name!), Text(defaultWallet.name!),
const Spacer(), const Spacer(),
FutureBuilder( FutureBuilder(
future: future:

View File

@ -107,7 +107,7 @@ flutter:
assets: assets:
- images/ - images/
- config/gva_endpoints.json - config/gdev_endpoints.json
- assets/ - assets/
- assets/home/ - assets/home/
- assets/avatars/ - assets/avatars/