sign method
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');
}
}