diff --git a/lib/g1/api.dart b/lib/g1/api.dart index 1152d8e4b5f5e8bfc4380c04b87c0ef0c7efb8ab..fc4748ad8f954249d423d5cdbd07f5a90277f57f 100644 --- a/lib/g1/api.dart +++ b/lib/g1/api.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:durt/durt.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:http/http.dart' as http; import 'package:http/http.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -22,6 +23,10 @@ import 'g1_helper.dart'; // https://g1.duniter.org/tx/history/FadJvhddHL7qbRd3WcRPrWEJJwABQa3oZvmCBhotc7Kg // https://g1.duniter.org/tx/history/6DrGg8cftpkgffv4Y4Lse9HSjgc8coEQor3yvMPHAnVH +// use g1-test or g1 for production (fallback to g1) +final String currencyDotEnv = "${dotenv.env['CURRENCY']}"; +final String currency = currencyDotEnv.isEmpty ? 'g1' : currencyDotEnv; + Future<String> getTxHistory(String publicKey) async { final Response response = await requestWithRetry(NodeType.duniter, '/tx/history/$publicKey'); @@ -264,7 +269,7 @@ Future<List<Node>> _fetchDuniterNodesFromPeers(NodeType type) async { jsonDecode(response.body) as Map<String, dynamic>; final List<dynamic> peers = (peerList['peers'] as List<dynamic>) .where((dynamic peer) => - (peer as Map<String, dynamic>)['currency'] == 'g1') + (peer as Map<String, dynamic>)['currency'] == currency) .where( (dynamic peer) => (peer as Map<String, dynamic>)['version'] == 10) .where((dynamic peer) => @@ -282,7 +287,7 @@ Future<List<Node>> _fetchDuniterNodesFromPeers(NodeType type) async { final String endpointUnParsed = endpoints[j]; final String? endpoint = parseHost(endpointUnParsed); if (endpoint != null && - !endpoint.contains('test') && + // !endpoint.contains('test') && !endpoint.contains('localhost')) { try { final NodeCheck nodeCheck = await _pingNode(endpoint, type); @@ -320,7 +325,7 @@ Future<List<Node>> _fetchDuniterNodesFromPeers(NodeType type) async { } } logger( - 'Fetched ${lNodes.length} ${type.name} nodes ordered by latency (first: ${lNodes.first.url})'); + 'Fetched ${lNodes.length} ${type.name} nodes ordered by latency ${lNodes.isNotEmpty ? '(first: ${lNodes.first.url})' : '(zero nodes)'}'); } catch (e, stacktrace) { await Sentry.captureException(e, stackTrace: stacktrace); logger('General error in fetch ${type.name} nodes: $e'); @@ -328,7 +333,11 @@ Future<List<Node>> _fetchDuniterNodesFromPeers(NodeType type) async { // rethrow; } lNodes.sort((Node a, Node b) => a.latency.compareTo(b.latency)); - logger('First node in list ${lNodes.first.url}'); + if (lNodes.isNotEmpty) { + logger('First node in list ${lNodes.first.url}'); + } else { + logger('No nodes in list'); + } return lNodes; } @@ -380,7 +389,7 @@ Future<List<Node>> _fetchNodes(NodeType type) async { } Future<NodeCheck> _pingNode(String node, NodeType type) async { - // Decrease timout during ping + // Decrease timeout during ping const Duration timeout = Duration(seconds: 10); int currentBlock = 0; Duration latency; @@ -414,10 +423,12 @@ Future<NodeCheck> _pingNode(String node, NodeType type) async { // NodeManager().updateNode(type, node.copyWith(latency: newLatency)); stopwatch.stop(); final double balance = await gva - .balance('EdWkzNABz7dPancFqW6JVLqv1wpGaQSxgWmMf1pmY7KG') + .balance('78ZwwgpgdH5uLZLbThUQH7LKwPgjMunYfLiCfUCySkM8') .timeout(timeout); latency = balance >= 0 ? stopwatch.elapsed : wrongNodeDuration; } + logger( + 'Ping tested in node $node ($type), latency ${latency.inMicroseconds}, current block $currentBlock'); return NodeCheck(latency: latency, currentBlock: currentBlock); } catch (e) { // Handle exception when node is unavailable etc