diff --git a/cw_bitcoin/lib/electrum_worker/electrum_worker.dart b/cw_bitcoin/lib/electrum_worker/electrum_worker.dart index c5252cafd..7f63b5032 100644 --- a/cw_bitcoin/lib/electrum_worker/electrum_worker.dart +++ b/cw_bitcoin/lib/electrum_worker/electrum_worker.dart @@ -345,18 +345,21 @@ class ElectrumWorker { } if (transactionIdsForHeights.isNotEmpty) { - final transactionsVerbose = await _getBatchTransactionVerbose( - hashes: transactionIdsForHeights.keys.toList(), - ); + Map<String, Map<String, dynamic>>? transactionsVerbose; + if (_serverCapability!.supportsTxVerbose) { + transactionsVerbose = await _getBatchTransactionVerbose( + hashes: transactionIdsForHeights.keys.toList(), + ); + } Map<String, String> transactionHexes = {}; - if (transactionsVerbose.isEmpty) { + if (transactionsVerbose?.isEmpty ?? true) { transactionHexes = await _getBatchTransactionHex( hashes: transactionIdsForHeights.keys.toList(), ); } else { - transactionsVerbose.values.forEach((e) { + transactionsVerbose!.values.forEach((e) { transactionHexes[e['txid'] as String] = e['hex'] as String; }); } @@ -365,7 +368,7 @@ class ElectrumWorker { final hash = transactionIdHeight.key; final hex = transactionIdHeight.value; - final transactionVerbose = transactionsVerbose[hash]; + final transactionVerbose = transactionsVerbose?[hash]; late ElectrumTransactionBundle txBundle; @@ -473,37 +476,40 @@ class ElectrumWorker { if (transactionIdsForHeights.isNotEmpty) { await Future.wait(transactionIdsForHeights.keys.toList().map((hash) async { - final transactionVerbose = await _electrumClient!.request( - ElectrumRequestGetTransactionVerbose(transactionHash: hash), - ); + late String txHex; + Map<String, dynamic>? txVerbose; - late String transactionHex; - - if (transactionVerbose.isEmpty) { - transactionHex = await _electrumClient!.request( - ElectrumRequestGetTransactionHex( + if (_serverCapability!.supportsTxVerbose) { + txVerbose = await _electrumClient!.request( + ElectrumRequestGetTransactionVerbose( transactionHash: hash, ), ); + } + + if (txVerbose?.isEmpty ?? true) { + txHex = await _electrumClient!.request( + ElectrumRequestGetTransactionHex(transactionHash: hash), + ); } else { - transactionHex = transactionVerbose['hex'] as String; + txHex = txVerbose!['hex'] as String; } late ElectrumTransactionBundle txBundle; // this is the initial tx history update, so ins will be filled later one by one, // and time and confirmations will be updated if needed again - if (transactionVerbose.isNotEmpty) { + if (txVerbose?.isNotEmpty ?? false) { txBundle = ElectrumTransactionBundle( - BtcTransaction.fromRaw(transactionHex), + BtcTransaction.fromRaw(txHex), ins: [], - time: transactionVerbose['time'] as int?, - confirmations: (transactionVerbose['confirmations'] as int?) ?? 1, - isDateValidated: (transactionVerbose['time'] as int?) != null, + time: txVerbose!['time'] as int?, + confirmations: (txVerbose['confirmations'] as int?) ?? 1, + isDateValidated: (txVerbose['time'] as int?) != null, ); } else { txBundle = ElectrumTransactionBundle( - BtcTransaction.fromRaw(transactionHex), + BtcTransaction.fromRaw(txHex), ins: [], confirmations: 1, ); @@ -629,18 +635,22 @@ class ElectrumWorker { } if (transactionsByIds.isNotEmpty) { - final transactionsVerbose = await _getBatchTransactionVerbose( - hashes: transactionsByIds.keys.toList(), - ); + Map<String, Map<String, dynamic>>? transactionsVerbose; + + if (_serverCapability!.supportsTxVerbose) { + transactionsVerbose = await _getBatchTransactionVerbose( + hashes: transactionsByIds.keys.toList(), + ); + } Map<String, String> transactionHexes = {}; - if (transactionsVerbose.isEmpty) { + if (transactionsVerbose?.isEmpty ?? true) { transactionHexes = await _getBatchTransactionHex( hashes: transactionsByIds.keys.toList(), ); } else { - transactionsVerbose.values.forEach((e) { + transactionsVerbose!.values.forEach((e) { transactionHexes[e['txid'] as String] = e['hex'] as String; }); } @@ -649,7 +659,7 @@ class ElectrumWorker { final hash = entry.key; final txToFetch = entry.value; final storedTx = txToFetch.tx; - final txVerbose = transactionsVerbose[hash]; + final txVerbose = transactionsVerbose?[hash]; final txHex = transactionHexes[hash]!; final original = storedTx?.original ?? BtcTransaction.fromRaw((txVerbose?["hex"] as String?) ?? txHex); @@ -1088,16 +1098,20 @@ class ElectrumWorker { } } else { await Future.wait(hashes.map((hash) async { - final history = await _electrumClient!.request( - ElectrumRequestGetTransactionVerbose(transactionHash: hash), - ); + Map<String, dynamic>? txVerbose; - txVerboseResults.add(history); + if (_serverCapability!.supportsTxVerbose) { + txVerbose = await _electrumClient!.request( + ElectrumRequestGetTransactionVerbose( + transactionHash: hash, + ), + ); + } - if (history.isEmpty) { + if (txVerbose?.isEmpty ?? true) { emptyVerboseTxs.add(hash); } else { - transactionHexes.add(history['hex'] as String); + transactionHexes.add(txVerbose!['hex'] as String); } })); } @@ -1220,13 +1234,17 @@ class ElectrumWorker { int? time; DateResult? dates; - final transactionVerbose = await _electrumClient!.request( - ElectrumRequestGetTransactionVerbose(transactionHash: hash), - ); + Map<String, dynamic>? transactionVerbose; + if (_serverCapability!.supportsTxVerbose) { + transactionVerbose = await _electrumClient!.request( + ElectrumRequestGetTransactionVerbose(transactionHash: hash), + ); + } + String transactionHex; - if (transactionVerbose.isNotEmpty) { - transactionHex = transactionVerbose['hex'] as String; + if (transactionVerbose?.isNotEmpty ?? false) { + transactionHex = transactionVerbose!['hex'] as String; time = transactionVerbose['time'] as int?; confirmations = transactionVerbose['confirmations'] as int?; } else {