UNPKG

3.15 kBJavaScriptView Raw
1'use strict';
2
3var _ = require('lodash');
4var $ = require('../util/preconditions');
5var inherits = require('inherits');
6var BufferUtil = require('../util/buffer');
7var JSUtil = require('../util/js');
8
9var PublicKey = require('../publickey');
10var errors = require('../errors');
11var Signature = require('../crypto/signature');
12
13/**
14 * @desc
15 * Wrapper around Signature with fields related to signing a transaction specifically
16 *
17 * @param {Object|string|TransactionSignature} arg
18 * @constructor
19 */
20function TransactionSignature(arg) {
21 if (!(this instanceof TransactionSignature)) {
22 return new TransactionSignature(arg);
23 }
24 if (arg instanceof TransactionSignature) {
25 return arg;
26 }
27 if (_.isObject(arg)) {
28 return this._fromObject(arg);
29 }
30 throw new errors.InvalidArgument('TransactionSignatures must be instantiated from an object');
31}
32inherits(TransactionSignature, Signature);
33
34TransactionSignature.prototype._fromObject = function(arg) {
35 this._checkObjectArgs(arg);
36 this.publicKey = new PublicKey(arg.publicKey);
37 this.prevTxId = BufferUtil.isBuffer(arg.prevTxId) ? arg.prevTxId : Buffer.from(arg.prevTxId, 'hex');
38 this.outputIndex = arg.outputIndex;
39 this.inputIndex = arg.inputIndex;
40 this.signature = (arg.signature instanceof Signature) ? arg.signature :
41 BufferUtil.isBuffer(arg.signature) ? Signature.fromBuffer(arg.signature) :
42 Signature.fromString(arg.signature);
43 this.sigtype = arg.sigtype;
44 return this;
45};
46
47TransactionSignature.prototype._checkObjectArgs = function(arg) {
48 $.checkArgument(PublicKey(arg.publicKey), 'publicKey');
49 $.checkArgument(!_.isUndefined(arg.inputIndex), 'inputIndex');
50 $.checkArgument(!_.isUndefined(arg.outputIndex), 'outputIndex');
51 $.checkState(_.isNumber(arg.inputIndex), 'inputIndex must be a number');
52 $.checkState(_.isNumber(arg.outputIndex), 'outputIndex must be a number');
53 $.checkArgument(arg.signature, 'signature');
54 $.checkArgument(arg.prevTxId, 'prevTxId');
55 $.checkState(arg.signature instanceof Signature ||
56 BufferUtil.isBuffer(arg.signature) ||
57 JSUtil.isHexa(arg.signature), 'signature must be a buffer or hexa value');
58 $.checkState(BufferUtil.isBuffer(arg.prevTxId) ||
59 JSUtil.isHexa(arg.prevTxId), 'prevTxId must be a buffer or hexa value');
60 $.checkArgument(arg.sigtype, 'sigtype');
61 $.checkState(_.isNumber(arg.sigtype), 'sigtype must be a number');
62};
63
64/**
65 * Serializes a transaction to a plain JS object
66 * @return {Object}
67 */
68TransactionSignature.prototype.toObject = TransactionSignature.prototype.toJSON = function toObject() {
69 return {
70 publicKey: this.publicKey.toString(),
71 prevTxId: this.prevTxId.toString('hex'),
72 outputIndex: this.outputIndex,
73 inputIndex: this.inputIndex,
74 signature: this.signature.toString(),
75 sigtype: this.sigtype
76 };
77};
78
79/**
80 * Builds a TransactionSignature from an object
81 * @param {Object} object
82 * @return {TransactionSignature}
83 */
84TransactionSignature.fromObject = function(object) {
85 $.checkArgument(object);
86 return new TransactionSignature(object);
87};
88
89module.exports = TransactionSignature;