Sp enhancements (#1672)

* fix: enhance regex, fix multiline

* feat: improve scan msg, fix missing txs, use date api

* feat: node fixes, enhance send modal, TX list tag & filter, refactors

* fix: continuous scanning

* fix: missing close

* fix: resubscribe tweaks

* feat: use mempool api setting toggle

* handle any failure of height API and fallback to the old method [skip ci]

---------

Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
This commit is contained in:
Rafael 2024-09-20 14:24:25 +00:00 committed by GitHub
parent b6bc3df622
commit 3a391f10a3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
61 changed files with 872 additions and 531 deletions

View file

@ -4,7 +4,6 @@ import 'dart:io';
import 'dart:typed_data';
import 'package:bitcoin_base/bitcoin_base.dart';
import 'package:cw_bitcoin/bitcoin_amount_format.dart';
import 'package:cw_bitcoin/script_hash.dart';
import 'package:flutter/foundation.dart';
import 'package:rxdart/rxdart.dart';
@ -48,6 +47,7 @@ class ElectrumClient {
final Map<String, SocketTask> _tasks;
Map<String, SocketTask> get tasks => _tasks;
final Map<String, String> _errors;
ConnectionStatus _connectionStatus = ConnectionStatus.disconnected;
bool _isConnected;
Timer? _aliveTimer;
String unterminatedString;
@ -57,11 +57,13 @@ class ElectrumClient {
Future<void> connectToUri(Uri uri, {bool? useSSL}) async {
this.uri = uri;
this.useSSL = useSSL;
await connect(host: uri.host, port: uri.port, useSSL: useSSL);
if (useSSL != null) {
this.useSSL = useSSL;
}
await connect(host: uri.host, port: uri.port);
}
Future<void> connect({required String host, required int port, bool? useSSL}) async {
Future<void> connect({required String host, required int port}) async {
_setConnectionStatus(ConnectionStatus.connecting);
try {
@ -80,15 +82,26 @@ class ElectrumClient {
onBadCertificate: (_) => true,
);
}
} catch (_) {
_setConnectionStatus(ConnectionStatus.failed);
} catch (e) {
if (e is HandshakeException) {
useSSL = !(useSSL ?? false);
}
if (_connectionStatus != ConnectionStatus.connecting) {
_setConnectionStatus(ConnectionStatus.failed);
}
return;
}
if (socket == null) {
_setConnectionStatus(ConnectionStatus.failed);
if (_connectionStatus != ConnectionStatus.connecting) {
_setConnectionStatus(ConnectionStatus.failed);
}
return;
}
_setConnectionStatus(ConnectionStatus.connected);
socket!.listen(
@ -118,7 +131,7 @@ class ElectrumClient {
socket?.destroy();
_setConnectionStatus(ConnectionStatus.disconnected);
}
} catch(e) {
} catch (e) {
print(e.toString());
}
},
@ -217,25 +230,6 @@ class ElectrumClient {
return [];
});
Future<List<Map<String, dynamic>>> getListUnspentWithAddress(
String address, BasedUtxoNetwork network) =>
call(
method: 'blockchain.scripthash.listunspent',
params: [scriptHash(address, network: network)]).then((dynamic result) {
if (result is List) {
return result.map((dynamic val) {
if (val is Map<String, dynamic>) {
val['address'] = address;
return val;
}
return <String, dynamic>{};
}).toList();
}
return [];
});
Future<List<Map<String, dynamic>>> getListUnspent(String scriptHash) =>
call(method: 'blockchain.scripthash.listunspent', params: [scriptHash])
.then((dynamic result) {
@ -272,16 +266,12 @@ class ElectrumClient {
try {
final result = await callWithTimeout(
method: 'blockchain.transaction.get', params: [hash, verbose], timeout: 10000);
if (result is Map<String, dynamic>) {
return result;
}
return result;
} on RequestFailedTimeoutException catch (_) {
return <String, dynamic>{};
} catch (e) {
print("getTransaction: ${e.toString()}");
return <String, dynamic>{};
}
return <String, dynamic>{};
}
Future<Map<String, dynamic>> getTransactionVerbose({required String hash}) =>
@ -326,9 +316,8 @@ class ElectrumClient {
await call(method: 'blockchain.block.get_header', params: [height]) as Map<String, dynamic>;
BehaviorSubject<Object>? tweaksSubscribe({required int height, required int count}) {
_id += 1;
return subscribe<Object>(
id: 'blockchain.tweaks.subscribe:${height + count}',
id: 'blockchain.tweaks.subscribe',
method: 'blockchain.tweaks.subscribe',
params: [height, count, false],
);
@ -539,6 +528,7 @@ class ElectrumClient {
void _setConnectionStatus(ConnectionStatus status) {
onConnectionStatusChange?.call(status);
_connectionStatus = status;
_isConnected = status == ConnectionStatus.connected;
}