fix: inconsistent connection states, fix tx history

This commit is contained in:
Rafael Saes 2024-04-09 20:35:00 -03:00
parent 0777db81c7
commit 65d6a890d0
3 changed files with 25 additions and 16 deletions

View file

@ -64,7 +64,8 @@ class ElectrumClient {
} catch (_) {}
if (useSSL == true) {
socket = await SecureSocket.connect(host, port, timeout: connectionTimeout);
socket = await SecureSocket.connect(host, port,
timeout: connectionTimeout, onBadCertificate: (_) => true);
} else {
socket = await Socket.connect(host, port, timeout: connectionTimeout);
}
@ -418,7 +419,9 @@ class ElectrumClient {
Future<void> close() async {
_aliveTimer?.cancel();
await socket?.close();
try {
await socket?.close();
} catch (_) {}
onConnectionStatusChange = null;
}

View file

@ -158,6 +158,8 @@ class ElectrumTransactionInfo extends TransactionInfo {
}
factory ElectrumTransactionInfo.fromJson(Map<String, dynamic> data, WalletType type) {
final inputAddresses = data['inputAddresses'] as List<dynamic>;
final outputAddresses = data['outputAddresses'] as List<dynamic>;
return ElectrumTransactionInfo(
type,
id: data['id'] as String,
@ -168,8 +170,10 @@ class ElectrumTransactionInfo extends TransactionInfo {
date: DateTime.fromMillisecondsSinceEpoch(data['date'] as int),
isPending: data['isPending'] as bool,
confirmations: data['confirmations'] as int,
inputAddresses: data['inputAddresses'] as List<String>,
outputAddresses: data['outputAddresses'] as List<String>,
inputAddresses:
inputAddresses.isEmpty ? [] : inputAddresses.map((e) => e.toString()).toList(),
outputAddresses:
outputAddresses.isEmpty ? [] : outputAddresses.map((e) => e.toString()).toList(),
to: data['to'] as String?,
unspents: data['unspents'] != null
? (data['unspents'] as List<dynamic>)

View file

@ -322,31 +322,32 @@ abstract class ElectrumWalletBase
Node? node;
@action
Future<void> _electrumConnect(Node node, {bool? attemptedReconnect}) async {
@override
Future<void> connectToNode({required Node node}) async {
this.node = node;
try {
syncStatus = ConnectingSyncStatus();
await electrumClient.connectToUri(node.uri, useSSL: node.useSSL);
if (!electrumClient.isConnected) {
await electrumClient.close();
}
electrumClient.onConnectionStatusChange = (bool isConnected) async {
if (!isConnected) {
if (isConnected) {
syncStatus = ConnectedSyncStatus();
} else if (isConnected == false) {
syncStatus = LostConnectionSyncStatus();
if (attemptedReconnect == false) {
await _electrumConnect(node, attemptedReconnect: true);
}
}
};
syncStatus = ConnectedSyncStatus();
await electrumClient.connectToUri(node.uri, useSSL: node.useSSL);
} catch (e) {
print(e.toString());
syncStatus = FailedSyncStatus();
}
}
@action
@override
Future<void> connectToNode({required Node node}) => _electrumConnect(node);
int get _dustAmount => 546;
bool _isBelowDust(int amount) => amount <= _dustAmount && network != BitcoinNetwork.testnet;
@ -1420,6 +1421,7 @@ abstract class ElectrumWalletBase
Future<void> updateTransactions() async {
try {
if (_isTransactionUpdating) {
_isTransactionUpdating = false;
return;
}
@ -1713,7 +1715,7 @@ Future<void> startRefresh(ScanData scanData) async {
final electrumClient = await getElectrumConnection();
final scanningBlockCount =
scanData.isSingleScan ? 1 : (scanData.network == BitcoinNetwork.testnet ? 1 : 10);
scanData.isSingleScan ? 1 : (scanData.network == BitcoinNetwork.testnet ? 50 : 10);
Map<String, dynamic>? tweaks;
try {