From 2732b2fe7170edee191ee156bfd712ea3ca94281 Mon Sep 17 00:00:00 2001
From: likho <likhojiba@gmail.com>
Date: Tue, 22 Aug 2023 18:33:24 +0200
Subject: [PATCH] WIP: XLM fixes and refactor

---
 .../add_edit_node_view.dart                   |  9 ++-
 .../coins/stellar/stellar_wallet.dart         | 66 +++++++------------
 .../test_stellar_node_connection.dart         | 22 +++++++
 3 files changed, 54 insertions(+), 43 deletions(-)
 create mode 100644 lib/utilities/test_stellar_node_connection.dart

diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart
index 56b008093..af6256d23 100644
--- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart
+++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart
@@ -27,6 +27,7 @@ import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart';
 import 'package:stackwallet/utilities/logger.dart';
 import 'package:stackwallet/utilities/test_epic_box_connection.dart';
 import 'package:stackwallet/utilities/test_monero_node_connection.dart';
+import 'package:stackwallet/utilities/test_stellar_node_connection.dart';
 import 'package:stackwallet/utilities/text_styles.dart';
 import 'package:stackwallet/utilities/util.dart';
 import 'package:stackwallet/widgets/background.dart';
@@ -194,10 +195,14 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
           // await client.getSyncStatus();
         } catch (_) {}
 
-      case Coin.nano:
-      case Coin.banano:
       case Coin.stellar:
       case Coin.stellarTestnet:
+        try {
+          testPassed = await testStellarNodeConnection(formData.host!);
+        } catch(_) {}
+      case Coin.nano:
+      case Coin.banano:
+
         throw UnimplementedError();
         //TODO: check network/node
     }
diff --git a/lib/services/coins/stellar/stellar_wallet.dart b/lib/services/coins/stellar/stellar_wallet.dart
index c4c92373f..6fecb6eb3 100644
--- a/lib/services/coins/stellar/stellar_wallet.dart
+++ b/lib/services/coins/stellar/stellar_wallet.dart
@@ -1,5 +1,7 @@
 import 'dart:async';
+import 'dart:convert';
 
+import 'package:decimal/decimal.dart';
 import 'package:http/http.dart' as http;
 import 'package:isar/isar.dart';
 import 'package:stackwallet/db/isar/main_db.dart';
@@ -37,6 +39,7 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
   late StellarSDK stellarSdk;
   late Network stellarNetwork;
 
+
   StellarWallet({
     required String walletId,
     required String walletName,
@@ -53,20 +56,28 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
     initCache(walletId, coin);
     initWalletDB(mockableOverride: mockableOverride);
 
-    if (coin.name == "stellarTestnet") {
+
+    if (coin.isTestNet) {
       stellarSdk = StellarSDK.TESTNET;
       stellarNetwork = Network.TESTNET;
     } else {
       stellarSdk = StellarSDK.PUBLIC;
       stellarNetwork = Network.PUBLIC;
     }
+
+    _updateNode();
+  }
+
+  void _updateNode() {
+    _xlmNode = NodeService(secureStorageInterface: _secureStore)
+        .getPrimaryNodeFor(coin: coin) ??
+        DefaultNodes.getNodeFor(coin);
+    stellarSdk = StellarSDK("${_xlmNode!.host}:${_xlmNode!.port}");
   }
 
   late final TransactionNotificationTracker txTracker;
   late SecureStorageInterface _secureStore;
 
-  // final StellarSDK stellarSdk = StellarSDK.PUBLIC;
-
   @override
   bool get isFavorite => _isFavorite ??= getCachedIsFavorite();
   bool? _isFavorite;
@@ -232,32 +243,14 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
       (await _currentReceivingAddress)?.value ?? await getAddressSW();
 
   Future<int> getBaseFee() async {
-    // final nodeURI = Uri.parse("${getCurrentNode().host}:${getCurrentNode().port}");
-    final nodeURI = Uri.parse(getCurrentNode().host);
-    final httpClient = http.Client();
-    FeeStatsResponse fsp =
-        await FeeStatsRequestBuilder(httpClient, nodeURI).execute();
-    return int.parse(fsp.lastLedgerBaseFee);
+    var fees = await stellarSdk.feeStats.execute();
+    return int.parse(fees.lastLedgerBaseFee);
   }
 
   @override
   Future<Amount> estimateFeeFor(Amount amount, int feeRate) async {
     var baseFee = await getBaseFee();
-    int fee = 100;
-    switch (feeRate) {
-      case 0:
-        fee = baseFee * 10;
-      case 1:
-      case 2:
-        fee = baseFee * 50;
-      case 3:
-        fee = baseFee * 100;
-      case 4:
-        fee = baseFee * 200;
-      default:
-        fee = baseFee * 50;
-    }
-    return Amount(rawValue: BigInt.from(fee), fractionDigits: coin.decimals);
+    return Amount(rawValue: BigInt.from(baseFee), fractionDigits: coin.decimals);
   }
 
   @override
@@ -285,20 +278,13 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
 
   @override
   Future<FeeObject> get fees async {
-    // final nodeURI = Uri.parse("${getCurrentNode().host}:${getCurrentNode().port}");
-    final nodeURI = Uri.parse(getCurrentNode().host);
-
-    final httpClient = http.Client();
-    FeeStatsResponse fsp =
-        await FeeStatsRequestBuilder(httpClient, nodeURI).execute();
-
     return FeeObject(
-        numberOfBlocksFast: 0,
-        numberOfBlocksAverage: 0,
-        numberOfBlocksSlow: 0,
-        fast: int.parse(fsp.lastLedgerBaseFee) * 100,
-        medium: int.parse(fsp.lastLedgerBaseFee) * 50,
-        slow: int.parse(fsp.lastLedgerBaseFee) * 10);
+        numberOfBlocksFast: 10,
+        numberOfBlocksAverage: 10,
+        numberOfBlocksSlow: 10,
+        fast: 1,
+        medium: 1,
+        slow: 1);
   }
 
   @override
@@ -399,6 +385,7 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
       {required String address,
       required Amount amount,
       Map<String, dynamic>? args}) async {
+
     try {
       final feeRate = args?["feeRate"];
       var fee = 1000;
@@ -750,10 +737,7 @@ class StellarWallet extends CoinServiceAPI with WalletCache, WalletDB {
 
   @override
   Future<void> updateNode(bool shouldRefresh) async {
-    _xlmNode = NodeService(secureStorageInterface: _secureStore)
-            .getPrimaryNodeFor(coin: coin) ??
-        DefaultNodes.getNodeFor(coin);
-
+    _updateNode();
     if (shouldRefresh) {
       unawaited(refresh());
     }
diff --git a/lib/utilities/test_stellar_node_connection.dart b/lib/utilities/test_stellar_node_connection.dart
new file mode 100644
index 000000000..12e1e8dc9
--- /dev/null
+++ b/lib/utilities/test_stellar_node_connection.dart
@@ -0,0 +1,22 @@
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+
+Future<bool> testStellarNodeConnection(String host) async {
+
+  final client = http.Client();
+  Uri uri = Uri.parse(host);
+  final response = await client.get(
+    uri,
+    headers: {'Content-Type': 'application/json'},
+  ).timeout(const Duration(milliseconds: 2000),
+      onTimeout: () async => http.Response('Error', 408));
+
+  final json = jsonDecode(response.body);
+
+  if (response.statusCode == 200 && json["horizon_version"] != null) {
+    return true;
+  } else {
+    return false;
+  }
+}
\ No newline at end of file