getSignedTransaction method
Get the transaction if all inputs are signed.
Implementation
Transaction getSignedTransaction(BtcAddressType addressType) {
Transaction signedTransaction =
Transaction.parsePsbtTransaction(unsignedTransaction!.serialize());
//every input should have 2 partial sigs
for (int i = 0; i < inputs.length; i++) {
if (inputs[i].partialSigs!.length != 2 ||
inputs[i].taprootKeySpendSignature != null) {
throw Exception('Not enough signatures');
}
if (inputs[i].partialSigs!.length == 2) {
signedTransaction.inputs[i].setSignature(
addressType, inputs[i].partialSigs![0], inputs[i].partialSigs![1]);
} else if (inputs[i].taprootKeySpendSignature != null) {
signedTransaction.inputs[i].setSignature(addressType,
inputs[i].taprootKeySpendSignature!, inputs[i].taprootInternalKey!);
}
final String utxo;
if (inputs[i].witnessUtxo != null) {
utxo = inputs[i].witnessUtxo!.serialize();
} else if (inputs[i].previousTransaction != null) {
final outputIndex = unsignedTransaction!.inputs[i].index;
final previousOutputs = inputs[i].previousTransaction!.outputs;
if (outputIndex >= previousOutputs.length) {
throw Exception('Invalid previous output index');
}
utxo = previousOutputs[outputIndex].serialize();
} else {
throw Exception('Missing UTXO information');
}
if (!signedTransaction.validateSignature(i, utxo, addressType)) {
throw Exception('Invalid Signatures');
}
}
signedTransaction.setIsSegwit(addressType.isSegwit);
return signedTransaction;
}