getTransactionDigest method

Uint8List getTransactionDigest({
  1. required int txInIndex,
  2. required Script script,
  3. int sighash = SIGHASH_ALL,
})

returns the transaction input's digest that is to be signed according.

txInIndex The index of the input that we wish to sign script The scriptPubKey of the UTXO that we want to spend sighash The type of the signature hash to be created

Implementation

Uint8List getTransactionDigest(
    {required int txInIndex,
    required Script script,
    int sighash = SIGHASH_ALL}) {
  final tx = copy(this);
  for (final i in tx.inputs) {
    i.scriptSig = const Script(script: []);
  }
  tx.inputs[txInIndex].scriptSig = script;
  if ((sighash & 0x1f) == SIGHASH_NONE) {
    tx.outputs.clear();
    for (int i = 0; i < tx.inputs.length; i++) {
      if (i != txInIndex) {
        tx.inputs[i].sequence = Uint8List.fromList(EMPTY_TX_SEQUENCE);
      }
    }
  } else if ((sighash & 0x1f) == SIGHASH_SINGLE) {
    if (txInIndex >= tx.outputs.length) {
      throw ArgumentError(
          "Transaction index is greater than theavailable outputs");
    }
    final txout = tx.outputs[txInIndex];
    tx.outputs.clear();
    for (int i = 0; i < txInIndex; i++) {
      tx.outputs.add(TxOutput(
          amount: BigInt.from(NEGATIVE_SATOSHI),
          scriptPubKey: const Script(script: [])));
    }
    tx.outputs.add(txout);
    for (int i = 0; i < tx.inputs.length; i++) {
      if (i != txInIndex) {
        tx.inputs[i].sequence = Uint8List.fromList(EMPTY_TX_SEQUENCE);
      }
    }
  }
  if ((sighash & SIGHASH_ANYONECANPAY) != 0) {
    final inp = tx.inputs[txInIndex];
    tx.inputs.clear();
    tx.inputs.add(inp);
  }
  Uint8List txForSign = tx.toBytes(segwit: false);

  Uint8List packedData = packInt32LE(sighash);

  txForSign = Uint8List.fromList([...txForSign, ...packedData]);
  return doubleHash(txForSign);
}