From a3aebbdb78efed727b7e254b3311ef7231767855 Mon Sep 17 00:00:00 2001
From: Hector Chu <hectorchu@gmail.com>
Date: Sun, 21 Apr 2024 12:19:44 +0100
Subject: [PATCH] Sync status

---
 cw_bitcoin/lib/litecoin_wallet.dart            | 18 +++++++++++++++---
 cw_mweb/.gitignore                             |  1 -
 cw_mweb/android/.gitignore                     |  1 +
 .../kotlin/com/cakewallet/mweb/CwMwebPlugin.kt |  7 +------
 cw_mweb/lib/cw_mweb.dart                       | 13 +++++++------
 cw_mweb/lib/cw_mweb_method_channel.dart        |  4 ++--
 cw_mweb/lib/cw_mweb_platform_interface.dart    |  2 +-
 7 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/cw_bitcoin/lib/litecoin_wallet.dart b/cw_bitcoin/lib/litecoin_wallet.dart
index f218ddd5d..628391eed 100644
--- a/cw_bitcoin/lib/litecoin_wallet.dart
+++ b/cw_bitcoin/lib/litecoin_wallet.dart
@@ -3,6 +3,7 @@ import 'package:bitcoin_base/bitcoin_base.dart';
 import 'package:cw_bitcoin/bitcoin_mnemonic.dart';
 import 'package:cw_bitcoin/bitcoin_transaction_priority.dart';
 import 'package:cw_core/crypto_currency.dart';
+import 'package:cw_core/sync_status.dart';
 import 'package:cw_core/unspent_coins_info.dart';
 import 'package:cw_bitcoin/litecoin_wallet_addresses.dart';
 import 'package:cw_core/transaction_priority.dart';
@@ -109,12 +110,23 @@ abstract class LitecoinWalletBase extends ElectrumWallet with Store {
   @action
   @override
   Future<void> startSync() async {
-    super.startSync();
+    await super.startSync();
     final stub = CwMweb.stub();
     Timer.periodic(
-      const Duration(seconds: 1), (timer) async {
+      const Duration(milliseconds: 1500), (timer) async {
+        final height = await electrumClient.getCurrentBlockChainTip() ?? 0;
         final resp = await stub.status(StatusRequest());
-        print(resp.blockHeaderHeight);
+        if (resp.blockHeaderHeight < height) {
+          int h = resp.blockHeaderHeight;
+          syncStatus = SyncingSyncStatus(height - h, h / height);
+        } else if (resp.mwebHeaderHeight < height) {
+          int h = resp.mwebHeaderHeight;
+          syncStatus = SyncingSyncStatus(height - h, h / height);
+        } else if (resp.mwebUtxosHeight < height) {
+          syncStatus = SyncingSyncStatus(1, 0.999);
+        } else {
+          syncStatus = SyncedSyncStatus();
+        }
       });
   }
 
diff --git a/cw_mweb/.gitignore b/cw_mweb/.gitignore
index 8959f5d70..96486fd93 100644
--- a/cw_mweb/.gitignore
+++ b/cw_mweb/.gitignore
@@ -28,4 +28,3 @@ migrate_working_dir/
 .dart_tool/
 .packages
 build/
-libs/
diff --git a/cw_mweb/android/.gitignore b/cw_mweb/android/.gitignore
index 161bdcdaf..881f3d95c 100644
--- a/cw_mweb/android/.gitignore
+++ b/cw_mweb/android/.gitignore
@@ -6,4 +6,5 @@
 .DS_Store
 /build
 /captures
+/libs
 .cxx
diff --git a/cw_mweb/android/src/main/kotlin/com/cakewallet/mweb/CwMwebPlugin.kt b/cw_mweb/android/src/main/kotlin/com/cakewallet/mweb/CwMwebPlugin.kt
index 394b607ab..cf194417b 100644
--- a/cw_mweb/android/src/main/kotlin/com/cakewallet/mweb/CwMwebPlugin.kt
+++ b/cw_mweb/android/src/main/kotlin/com/cakewallet/mweb/CwMwebPlugin.kt
@@ -17,7 +17,6 @@ class CwMwebPlugin: FlutterPlugin, MethodCallHandler {
   /// This local reference serves to register the plugin with the Flutter Engine and unregister it
   /// when the Flutter Engine is detached from the Activity
   private lateinit var channel : MethodChannel
-  private var started = false
 
   override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
     channel = MethodChannel(flutterPluginBinding.binaryMessenger, "cw_mweb")
@@ -26,12 +25,8 @@ class CwMwebPlugin: FlutterPlugin, MethodCallHandler {
 
   override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
     if (call.method == "start") {
-      if (started) return
       val dataDir = call.argument("dataDir") ?: ""
-      val server = Mwebd.newServer("mainnet", dataDir, "")
-      server.start(12345, true)
-      started = true
-      result.success(true)
+      result.success(Mwebd.newServer("", dataDir, "").start(0))
     } else {
       result.notImplemented()
     }
diff --git a/cw_mweb/lib/cw_mweb.dart b/cw_mweb/lib/cw_mweb.dart
index e73887aaf..fb3960ab0 100644
--- a/cw_mweb/lib/cw_mweb.dart
+++ b/cw_mweb/lib/cw_mweb.dart
@@ -3,15 +3,16 @@ import 'cw_mweb_platform_interface.dart';
 import 'mwebd.pbgrpc.dart';
 
 class CwMweb {
-  static Future<bool?> start(String dataDir) {
-    return CwMwebPlatform.instance.start(dataDir);
+  static var port;
+
+  static start(String dataDir) async {
+    port = port ?? await CwMwebPlatform.instance.start(dataDir);
   }
 
   static stub() {
-    final channel = ClientChannel('127.0.0.1',
-      port: 12345,
+    return RpcClient(ClientChannel('127.0.0.1',
+      port: port,
       options: const ChannelOptions(
-        credentials: ChannelCredentials.insecure()));
-    return RpcClient(channel);
+        credentials: ChannelCredentials.insecure())));
   }
 }
diff --git a/cw_mweb/lib/cw_mweb_method_channel.dart b/cw_mweb/lib/cw_mweb_method_channel.dart
index 112dcfaa7..cc880c6df 100644
--- a/cw_mweb/lib/cw_mweb_method_channel.dart
+++ b/cw_mweb/lib/cw_mweb_method_channel.dart
@@ -10,8 +10,8 @@ class MethodChannelCwMweb extends CwMwebPlatform {
   final methodChannel = const MethodChannel('cw_mweb');
 
   @override
-  Future<bool?> start(String dataDir) async {
-    final result = await methodChannel.invokeMethod<bool>('start', {'dataDir': dataDir});
+  Future<int?> start(String dataDir) async {
+    final result = await methodChannel.invokeMethod<int>('start', {'dataDir': dataDir});
     return result;
   }
 }
diff --git a/cw_mweb/lib/cw_mweb_platform_interface.dart b/cw_mweb/lib/cw_mweb_platform_interface.dart
index ce518402f..974e07284 100644
--- a/cw_mweb/lib/cw_mweb_platform_interface.dart
+++ b/cw_mweb/lib/cw_mweb_platform_interface.dart
@@ -23,7 +23,7 @@ abstract class CwMwebPlatform extends PlatformInterface {
     _instance = instance;
   }
 
-  Future<bool?> start(String dataDir) {
+  Future<int?> start(String dataDir) {
     throw UnimplementedError('start() has not been implemented.');
   }
 }