import 'dart:typed_data'; import 'package:bitcoin_base/bitcoin_base.dart'; import 'package:blockchain_utils/blockchain_utils.dart'; import 'package:collection/collection.dart'; import 'package:cw_bitcoin/bitcoin_address_record.dart'; import 'package:cw_bitcoin/bitcoin_unspent.dart'; import 'package:cw_bitcoin/bitcoin_wallet.dart'; import 'package:cw_bitcoin/utils.dart'; import 'package:ledger_bitcoin/psbt.dart'; import 'package:ledger_bitcoin/src/utils/buffer_writer.dart'; extension PsbtSigner on PsbtV2 { Uint8List extractUnsignedTX({bool getSegwit = true}) { final tx = BufferWriter()..writeUInt32(getGlobalTxVersion()); final isSegwit = getInputWitnessUtxo(0) != null; if (isSegwit && getSegwit) { tx.writeSlice(Uint8List.fromList([0, 1])); } final inputCount = getGlobalInputCount(); tx.writeVarInt(inputCount); for (var i = 0; i < inputCount; i++) { tx ..writeSlice(getInputPreviousTxid(i)) ..writeUInt32(getInputOutputIndex(i)) ..writeVarSlice(Uint8List(0)) ..writeUInt32(getInputSequence(i)); } final outputCount = getGlobalOutputCount(); tx.writeVarInt(outputCount); for (var i = 0; i < outputCount; i++) { tx.writeUInt64(getOutputAmount(i)); tx.writeVarSlice(getOutputScript(i)); } tx.writeUInt32(getGlobalFallbackLocktime() ?? 0); return tx.buffer(); } Future signWithUTXO( List utxos, UTXOSignerCallBack signer, [UTXOGetterCallBack? getTaprootPair]) async { final raw = BytesUtils.toHexString(extractUnsignedTX(getSegwit: false)); final tx = BtcTransaction.fromRaw(raw); /// when the transaction is taproot and we must use getTaproot transaction /// digest we need all of inputs amounts and owner script pub keys List taprootAmounts = []; List