From aa374f912768bc5578be4807ec94a96be62c0b88 Mon Sep 17 00:00:00 2001 From: Rafael Saes Date: Mon, 6 Jan 2025 19:05:52 -0300 Subject: [PATCH] fix: initial fixes for timeouts --- cw_bitcoin/lib/electrum.dart | 4 +++- cw_bitcoin/lib/electrum_transaction_info.dart | 20 ++++++++-------- cw_bitcoin/lib/electrum_wallet.dart | 23 ++++++++----------- 3 files changed, 23 insertions(+), 24 deletions(-) diff --git a/cw_bitcoin/lib/electrum.dart b/cw_bitcoin/lib/electrum.dart index 1f5c369e3..78f82e19c 100644 --- a/cw_bitcoin/lib/electrum.dart +++ b/cw_bitcoin/lib/electrum.dart @@ -270,7 +270,9 @@ class ElectrumClient { Future getTransaction({required String hash, required bool verbose}) async { try { final result = await callWithTimeout( - method: 'blockchain.transaction.get', params: [hash, verbose], timeout: 10000); + method: 'blockchain.transaction.get', + params: [hash, verbose], + ); return result; } on RequestFailedTimeoutException catch (_) { return {}; diff --git a/cw_bitcoin/lib/electrum_transaction_info.dart b/cw_bitcoin/lib/electrum_transaction_info.dart index 7a8b3b951..b976d0ba1 100644 --- a/cw_bitcoin/lib/electrum_transaction_info.dart +++ b/cw_bitcoin/lib/electrum_transaction_info.dart @@ -123,16 +123,18 @@ class ElectrumTransactionInfo extends TransactionInfo { List inputAddresses = []; List outputAddresses = []; - for (var i = 0; i < bundle.originalTransaction.inputs.length; i++) { - final input = bundle.originalTransaction.inputs[i]; - final inputTransaction = bundle.ins[i]; - final outTransaction = inputTransaction.outputs[input.txIndex]; - inputAmount += outTransaction.amount.toInt(); - if (addresses.contains(addressFromOutputScript(outTransaction.scriptPubKey, network))) { - direction = TransactionDirection.outgoing; - inputAddresses.add(addressFromOutputScript(outTransaction.scriptPubKey, network)); + try { + for (var i = 0; i < bundle.originalTransaction.inputs.length; i++) { + final input = bundle.originalTransaction.inputs[i]; + final inputTransaction = bundle.ins[i]; + final outTransaction = inputTransaction.outputs[input.txIndex]; + inputAmount += outTransaction.amount.toInt(); + if (addresses.contains(addressFromOutputScript(outTransaction.scriptPubKey, network))) { + direction = TransactionDirection.outgoing; + inputAddresses.add(addressFromOutputScript(outTransaction.scriptPubKey, network)); + } } - } + } catch (_) {} final receivedAmounts = []; for (final out in bundle.originalTransaction.outputs) { diff --git a/cw_bitcoin/lib/electrum_wallet.dart b/cw_bitcoin/lib/electrum_wallet.dart index 9a7e45d05..7c883733c 100644 --- a/cw_bitcoin/lib/electrum_wallet.dart +++ b/cw_bitcoin/lib/electrum_wallet.dart @@ -1365,7 +1365,7 @@ abstract class ElectrumWalletBase List updatedUnspentCoins = []; final previousUnspentCoins = List.from(unspentCoins.where((utxo) => - utxo.bitcoinAddressRecord.type != SegwitAddresType.mweb && + utxo.bitcoinAddressRecord.type != SegwitAddresType.mweb && utxo.bitcoinAddressRecord is! BitcoinSilentPaymentAddressRecord)); if (hasSilentPaymentsScanning) { @@ -1423,7 +1423,6 @@ abstract class ElectrumWalletBase required List updatedUnspentCoins, required List?> results, }) { - if (failedCount == results.length) { printV("All UTXOs failed to fetch, falling back to previous UTXOs"); return previousUnspentCoins; @@ -1918,19 +1917,15 @@ abstract class ElectrumWalletBase final original = BtcTransaction.fromRaw(transactionHex); final ins = []; - for (final vin in original.inputs) { - final verboseTransaction = await electrumClient.getTransactionVerbose(hash: vin.txId); + try { + await Future.forEach(original.inputs, (vin) async { + String inputTransactionHex = await electrumClient.getTransactionHex( + hash: (vin as TxInput).txId, + ); - final String inputTransactionHex; - - if (verboseTransaction.isEmpty) { - inputTransactionHex = await electrumClient.getTransactionHex(hash: hash); - } else { - inputTransactionHex = verboseTransaction['hex'] as String; - } - - ins.add(BtcTransaction.fromRaw(inputTransactionHex)); - } + ins.add(BtcTransaction.fromRaw(inputTransactionHex)); + }); + } catch (_) {} return ElectrumTransactionBundle( original,