getSignedTxHex method

String getSignedTxHex()

Implementation

String getSignedTxHex() {
  if (!isSigned) {
    throw Exception('Transaction is not signed');
  }
  final chainConf = getChainConfig('btc').mainnet;
  if (isTaproot) {
    final btcTx = bitcoin.Transaction();
    final originTx = getOrigin(unsignedPsbt);

    btcTx.setVersion(originTx.version);
    btcTx.setLocktime(originTx.locktime);

    final inputs = originTx.inputs;
    final outputs = originTx.outputs;

    List signatures = [];
    signatures = psbt.inputs.map((e) => e.taprootKeySpendSignature).toList();

    for (int i = 0; i < inputs.length; i++) {
      final prevoutHash = dynamicToUint8List(inputs[i].prevout.hash)
          .reversed
          .toList()
          .toUint8List();

      final value =
          NumberUtil.numberPowToInt(value: inputs[i].coin.value, pow: 8);
      final script = bitcoin.Address.addressToOutputScript(
          inputs[i].coin.address, chainConf.networkType);

      btcTx.addInput(prevoutHash, inputs[i].prevout.index,
          value: value, prevoutScript: script);
    }

    for (var i = 0; i < outputs.length; i++) {
      final item = outputs[i];
      final address = item.address;
      final amount = NumberUtil.numberPowToInt(value: item.amount, pow: 8);
      final outputScript = bitcoin.Address.addressToOutputScript(
          address, chainConf.networkType);
      btcTx.addOutput(outputScript, amount);
    }

    for (var i = 0; i < inputs.length; i++) {
      btcTx.signSchnorrHd(vin: i, sig: fromHex(signatures[i] as String));
    }

    return btcTx.toHex();
  } else {
    return psbt
        .getSignedTransaction(address_type.BtcAddressType.p2pkh)
        .serialize();
  }
}