getSignedTransaction method

Transaction getSignedTransaction(
  1. BtcAddressType addressType
)

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;
}