Gonna inherit from it on two subclasses: "P2SH Input" and "P2PKH Input" They'll have a `addSignature` method, to deal with new signatures, a `clearSignatures`, in case the outputs change and the signatures get invalidated, `countMissingSignatures`, and a reference to the UTXO they'll be spending, so all logic regarding "p2sh mapping" gets to be in here and the Transaction class is not polluted.
103 lines
2.6 KiB
JavaScript
103 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
var _ = require('lodash');
|
|
var BufferWriter = require('../../encoding/bufferwriter');
|
|
var buffer = require('buffer');
|
|
var bufferUtil = require('../../util/buffer');
|
|
var jsUtil = require('../../util/js');
|
|
var Script = require('../../script');
|
|
|
|
function Input(params) {
|
|
if (!(this instanceof Input)) {
|
|
return new Input(params);
|
|
}
|
|
if (params) {
|
|
return this._fromObject(params);
|
|
}
|
|
}
|
|
|
|
Object.defineProperty(Input.prototype, 'script', {
|
|
configurable: false,
|
|
writeable: false,
|
|
get: function() {
|
|
if (!this._script) {
|
|
this._script = new Script(this._scriptBuffer);
|
|
}
|
|
return this._script;
|
|
}
|
|
});
|
|
|
|
Input.prototype._fromObject = function(params) {
|
|
if (_.isString(params.prevTxId) && jsUtil.isHexa(params.prevTxId)) {
|
|
params.prevTxId = new buffer.Buffer(params.prevTxId, 'hex');
|
|
}
|
|
this.prevTxId = params.prevTxId;
|
|
this.outputIndex = params.outputIndex;
|
|
this.sequenceNumber = params.sequenceNumber;
|
|
if (params.script || params.scriptBuffer) {
|
|
this.setScript(params.script || params.scriptBuffer);
|
|
}
|
|
return this;
|
|
};
|
|
|
|
Input.prototype.toJSON = function() {
|
|
return {
|
|
prevTxId: this.prevTxId,
|
|
outputIndex: this.outputIndex,
|
|
sequenceNumber: this.sequenceNumber,
|
|
script: this._scriptBuffer.toString('hex')
|
|
};
|
|
};
|
|
|
|
Input.fromJSON = function(json) {
|
|
return new Input({
|
|
prevTxId: json.prevTxId || json.txidbuf,
|
|
outputIndex: json.outputIndex || json.txoutnum,
|
|
sequenceNumber: json.sequenceNumber || json.seqnum,
|
|
scriptBuffer: new Script(json.script, 'hex')
|
|
});
|
|
};
|
|
|
|
Input.fromBufferReader = function(br) {
|
|
var input = new Input();
|
|
input.prevTxId = br.readReverse(32);
|
|
input.outputIndex = br.readUInt32LE();
|
|
var scriptSize = br.readVarintNum();
|
|
if (scriptSize) {
|
|
input._scriptBuffer = br.read(scriptSize);
|
|
} else {
|
|
input._scriptBuffer = new buffer.Buffer([]);
|
|
}
|
|
input.sequenceNumber = br.readUInt32LE();
|
|
return input;
|
|
};
|
|
|
|
Input.prototype.toBufferWriter = function(writer) {
|
|
if (!writer) {
|
|
writer = new BufferWriter();
|
|
}
|
|
writer.writeReverse(this.prevTxId);
|
|
writer.writeUInt32LE(this.outputIndex);
|
|
var script = this._scriptBuffer;
|
|
writer.writeVarintNum(script.length);
|
|
writer.write(script);
|
|
writer.writeUInt32LE(this.sequenceNumber);
|
|
return writer;
|
|
};
|
|
|
|
Input.prototype.setScript = function(script) {
|
|
if (script instanceof Script) {
|
|
this._script = script;
|
|
this._scriptBuffer = script.toBuffer();
|
|
} else if (bufferUtil.isBuffer(script)) {
|
|
this._script = null;
|
|
this._scriptBuffer = new buffer.Buffer(script);
|
|
} else {
|
|
console.log(script);
|
|
throw new TypeError('Invalid Argument');
|
|
}
|
|
return this;
|
|
};
|
|
|
|
module.exports = Input;
|