sign method

dynamic sign (int vin, ECPair keyPair, int value, [ int hashType = Transaction.SIGHASH_ALL ])

Add signature for the input vin using keyPair and with a specified value

Throws ArgumentError if something goes wrong

Implementation

sign(int vin, ECPair keyPair, int value, [int hashType = Transaction.SIGHASH_ALL]) {
  hashType = hashType | Transaction.SIGHASH_BITCOINCASHBIP143;

  if (keyPair.network != null && keyPair.network.toString().compareTo(_network.toString()) != 0) {
    throw ArgumentError('Inconsistent network');
  }

  if (vin >= _inputs.length) {
    throw ArgumentError('No input at index: $vin');
  }

  if (this._needsOutputs(hashType)) {
    throw ArgumentError('Transaction needs outputs');
  }

  final input = _inputs[vin];
  final ourPubKey = keyPair.publicKey;

  if (!_canSign(input)) {
  //      Uint8List prevOutScript = pubkeyToOutputScript(ourPubKey);
    _prepareInput(input, ourPubKey, value);
  }

  var signatureHash = this._tx.hashForCashSignature(vin, input.signScript, value, hashType);

  // enforce in order signing of public keys
  var signed = false;
  for (var i = 0; i < input.pubkeys.length; i++) {
    if (HEX.encode(ourPubKey).compareTo(HEX.encode(input.pubkeys[i])) != 0) {
      continue;
    }

    if (input.signatures[i] != null) {
      throw ArgumentError('Signature already exists');
    }

    final signature = keyPair.sign(signatureHash);

    input.signatures[i] = bscript.encodeSignature(signature, hashType);
    signed = true;
  }

  if (!signed) {
    throw ArgumentError('Key pair cannot sign for this input');
  }
}