mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2024-12-23 03:59:23 +00:00
96b9b60f50
* feat: rebase btc-addr-types, migrate to bitcoin_base * feat: allow scanning elect-rs using get_tweaks * feat: scanning and adding addresses working with getTweaks, add btc SP address type * chore: pubspec.lock * chore: pubspec.lock * fix: scan when switching, fix multiple unspents in same tx * fix: initial scan * fix: initial scan * fix: scanning issues * fix: sync, storing silent unspents * chore: deps * fix: label issues, clear spent utxo * chore: deps * fix: build * fix: missing types * feat: new electrs API & changes, fixes for last block scanning * feat: Scan Silent Payments homepage toggle * chore: build configure * feat: generic fixes, testnet UI improvements, useSSL on bitcoin nodes * fix: invalid Object in sendData * feat: improve addresses page & address book displays * feat: silent payments labeled addresses disclaimer * fix: missing i18n * chore: print * feat: single block scan, rescan by date working for btc mainnet * feat: new cake features page replace market page, move sp scan toggle, auto switch node pop up alert * feat: delete silent addresses * fix: red dot in non ssl nodes * fix: inconsistent connection states, fix tx history * fix: tx & balance displays, cpfp sending * feat: new rust lib * chore: node path * fix: check node based on network * fix: missing txcount from addresses * style: padding in feature page cards * fix: restore not getting all wallet addresses by type * fix: auto switch node broken * fix: silent payment txs not being restored * feat: change scanning to subscription model, sync improvements * fix: scan re-subscription * fix: default nodes * fix: improve scanning by date, fix single block scan * refactor: common function for input tx selection * fix: nodes & build * fix: send all with multiple outs * refactor: unchanged file * Update pr_test_build.yml * chore: upgrade * chore: merge changes * refactor: unchanged files [skip ci] * fix: scan fixes, add date, allow sending while scanning * feat: sync fixes, sp settings * feat: fix resyncing * fix: date from height logic, status disconnected & chain tip get * fix: params * feat: electrum migration if using cake electrum * fix nodes update versions * re-enable tron * update sp_scanner to work on iOS [skip ci] * fix: wrong socket for old electrum nodes * Fix unchecked wallet type call * fix: double balance * feat: node domain * fix: menu name * fix: update tip on set scanning * fix: connection switching back and forth * feat: check if node is electrs, and supports sp * chore: fix build * minor enhancements * fixes and enhancements * solve conflicts with main * fix: status toggle * minor enhancement * Monero.com fixes * update sp_scanner to include windows and linux --------- Co-authored-by: Omar Hatem <omarh.ismail1@gmail.com>
102 lines
2.9 KiB
Dart
102 lines
2.9 KiB
Dart
import 'package:cw_bitcoin/exceptions.dart';
|
|
import 'package:bitcoin_base/bitcoin_base.dart';
|
|
import 'package:cw_core/pending_transaction.dart';
|
|
import 'package:cw_bitcoin/electrum.dart';
|
|
import 'package:cw_bitcoin/bitcoin_amount_format.dart';
|
|
import 'package:cw_bitcoin/electrum_transaction_info.dart';
|
|
import 'package:cw_core/transaction_direction.dart';
|
|
import 'package:cw_core/wallet_type.dart';
|
|
|
|
class PendingBitcoinTransaction with PendingTransaction {
|
|
PendingBitcoinTransaction(
|
|
this._tx,
|
|
this.type, {
|
|
required this.electrumClient,
|
|
required this.amount,
|
|
required this.fee,
|
|
required this.feeRate,
|
|
this.network,
|
|
required this.hasChange,
|
|
this.isSendAll = false,
|
|
this.hasTaprootInputs = false,
|
|
}) : _listeners = <void Function(ElectrumTransactionInfo transaction)>[];
|
|
|
|
final WalletType type;
|
|
final BtcTransaction _tx;
|
|
final ElectrumClient electrumClient;
|
|
final int amount;
|
|
final int fee;
|
|
final String feeRate;
|
|
final BasedUtxoNetwork? network;
|
|
final bool hasChange;
|
|
final bool isSendAll;
|
|
final bool hasTaprootInputs;
|
|
|
|
@override
|
|
String get id => _tx.txId();
|
|
|
|
@override
|
|
String get hex => _tx.serialize();
|
|
|
|
@override
|
|
String get amountFormatted => bitcoinAmountToString(amount: amount);
|
|
|
|
@override
|
|
String get feeFormatted => bitcoinAmountToString(amount: fee);
|
|
|
|
@override
|
|
int? get outputCount => _tx.outputs.length;
|
|
|
|
final List<void Function(ElectrumTransactionInfo transaction)> _listeners;
|
|
|
|
@override
|
|
Future<void> commit() async {
|
|
int? callId;
|
|
|
|
final result = await electrumClient.broadcastTransaction(
|
|
transactionRaw: hex, network: network, idCallback: (id) => callId = id);
|
|
|
|
if (result.isEmpty) {
|
|
if (callId != null) {
|
|
final error = electrumClient.getErrorMessage(callId!);
|
|
|
|
if (error.contains("dust")) {
|
|
if (hasChange) {
|
|
throw BitcoinTransactionCommitFailedDustChange();
|
|
} else if (!isSendAll) {
|
|
throw BitcoinTransactionCommitFailedDustOutput();
|
|
} else {
|
|
throw BitcoinTransactionCommitFailedDustOutputSendAll();
|
|
}
|
|
}
|
|
|
|
if (error.contains("bad-txns-vout-negative")) {
|
|
throw BitcoinTransactionCommitFailedVoutNegative();
|
|
}
|
|
|
|
if (error.contains("non-BIP68-final")) {
|
|
throw BitcoinTransactionCommitFailedBIP68Final();
|
|
}
|
|
|
|
throw BitcoinTransactionCommitFailed(errorMessage: error);
|
|
}
|
|
|
|
throw BitcoinTransactionCommitFailed();
|
|
}
|
|
|
|
_listeners.forEach((listener) => listener(transactionInfo()));
|
|
}
|
|
|
|
void addListener(void Function(ElectrumTransactionInfo transaction) listener) =>
|
|
_listeners.add(listener);
|
|
|
|
ElectrumTransactionInfo transactionInfo() => ElectrumTransactionInfo(type,
|
|
id: id,
|
|
height: 0,
|
|
amount: amount,
|
|
direction: TransactionDirection.outgoing,
|
|
date: DateTime.now(),
|
|
isPending: true,
|
|
confirmations: 0,
|
|
fee: fee);
|
|
}
|