diff --git a/lib/script/scriptnum.js b/lib/script/scriptnum.js index 33593a52e..3a39c3962 100644 --- a/lib/script/scriptnum.js +++ b/lib/script/scriptnum.js @@ -43,14 +43,14 @@ Object.setPrototypeOf(ScriptNum.prototype, I64.prototype); * @returns {Number} */ -ScriptNum.prototype.toInt = function toInt() { - if (this.lt(I64.UINT32_MIN)) +ScriptNum.prototype.getInt = function getInt() { + if (this.lt(I64.INT32_MIN)) return I64.LONG_MIN; - if (this.gt(I64.UINT32_MAX)) + if (this.gt(I64.INT32_MAX)) return I64.LONG_MAX; - return this.lo; + return this.toInt(); }; /** @@ -128,6 +128,7 @@ ScriptNum.prototype.toRaw = function toRaw() { ScriptNum.prototype.fromRaw = function fromRaw(data) { assert(Buffer.isBuffer(data)); + assert(data.length <= 9); // Empty arrays are always zero. if (data.length === 0) @@ -240,6 +241,30 @@ ScriptNum.isMinimal = function isMinimal(data) { return true; }; +/** + * Encode a script number. + * @param {Number|ScriptNum|BN} num + * @returns {Buffer} + */ + +ScriptNum.encode = function encode(num) { + assert(num != null); + + if (ScriptNum.isScriptNum(num)) + return num.encode(); + + if (typeof num === 'number') + num = ScriptNum.fromNumber(num); + else if (I64.isN64(num)) + num = ScriptNum.fromObject(num); + else if (Array.isArray(num.words)) + num = ScriptNum.fromBN(num); + else + throw new Error('Object must be encodable.'); + + return num.encode(); +}; + /** * Decode and verify script number. * @param {Buffer} data @@ -252,6 +277,31 @@ ScriptNum.decode = function decode(data, minimal, limit) { return new ScriptNum().decode(data, minimal, limit); }; +/** + * Test whether object is encodable. + * @param {Object} obj + * @returns {Boolean} + */ + +ScriptNum.isEncodable = function isEncodable(obj) { + if (obj == null) + return false; + + if (ScriptNum.isScriptNum(obj)) + return true; + + if (typeof obj === 'number') + return true; + + if (I64.isN64(obj)) + return true; + + if (Array.isArray(obj.words)) + return true; + + return false; +}; + /** * Test whether object is a script number. * @param {Object} obj