123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.Signature = void 0;
- const index_js_1 = require("../constants/index.js");
- const index_js_2 = require("../utils/index.js");
- // Constants
- const BN_0 = BigInt(0);
- const BN_1 = BigInt(1);
- const BN_2 = BigInt(2);
- const BN_27 = BigInt(27);
- const BN_28 = BigInt(28);
- const BN_35 = BigInt(35);
- const _guard = {};
- function toUint256(value) {
- return (0, index_js_2.zeroPadValue)((0, index_js_2.toBeArray)(value), 32);
- }
- /**
- * A Signature @TODO
- *
- *
- * @_docloc: api/crypto:Signing
- */
- class Signature {
- #r;
- #s;
- #v;
- #networkV;
- /**
- * The ``r`` value for a signautre.
- *
- * This represents the ``x`` coordinate of a "reference" or
- * challenge point, from which the ``y`` can be computed.
- */
- get r() { return this.#r; }
- set r(value) {
- (0, index_js_2.assertArgument)((0, index_js_2.dataLength)(value) === 32, "invalid r", "value", value);
- this.#r = (0, index_js_2.hexlify)(value);
- }
- /**
- * The ``s`` value for a signature.
- */
- get s() { return this.#s; }
- set s(_value) {
- (0, index_js_2.assertArgument)((0, index_js_2.dataLength)(_value) === 32, "invalid s", "value", _value);
- const value = (0, index_js_2.hexlify)(_value);
- (0, index_js_2.assertArgument)(parseInt(value.substring(0, 3)) < 8, "non-canonical s", "value", value);
- this.#s = value;
- }
- /**
- * The ``v`` value for a signature.
- *
- * Since a given ``x`` value for ``r`` has two possible values for
- * its correspondin ``y``, the ``v`` indicates which of the two ``y``
- * values to use.
- *
- * It is normalized to the values ``27`` or ``28`` for legacy
- * purposes.
- */
- get v() { return this.#v; }
- set v(value) {
- const v = (0, index_js_2.getNumber)(value, "value");
- (0, index_js_2.assertArgument)(v === 27 || v === 28, "invalid v", "v", value);
- this.#v = v;
- }
- /**
- * The EIP-155 ``v`` for legacy transactions. For non-legacy
- * transactions, this value is ``null``.
- */
- get networkV() { return this.#networkV; }
- /**
- * The chain ID for EIP-155 legacy transactions. For non-legacy
- * transactions, this value is ``null``.
- */
- get legacyChainId() {
- const v = this.networkV;
- if (v == null) {
- return null;
- }
- return Signature.getChainId(v);
- }
- /**
- * The ``yParity`` for the signature.
- *
- * See ``v`` for more details on how this value is used.
- */
- get yParity() {
- return (this.v === 27) ? 0 : 1;
- }
- /**
- * The [[link-eip-2098]] compact representation of the ``yParity``
- * and ``s`` compacted into a single ``bytes32``.
- */
- get yParityAndS() {
- // The EIP-2098 compact representation
- const yParityAndS = (0, index_js_2.getBytes)(this.s);
- if (this.yParity) {
- yParityAndS[0] |= 0x80;
- }
- return (0, index_js_2.hexlify)(yParityAndS);
- }
- /**
- * The [[link-eip-2098]] compact representation.
- */
- get compactSerialized() {
- return (0, index_js_2.concat)([this.r, this.yParityAndS]);
- }
- /**
- * The serialized representation.
- */
- get serialized() {
- return (0, index_js_2.concat)([this.r, this.s, (this.yParity ? "0x1c" : "0x1b")]);
- }
- /**
- * @private
- */
- constructor(guard, r, s, v) {
- (0, index_js_2.assertPrivate)(guard, _guard, "Signature");
- this.#r = r;
- this.#s = s;
- this.#v = v;
- this.#networkV = null;
- }
- [Symbol.for('nodejs.util.inspect.custom')]() {
- return `Signature { r: "${this.r}", s: "${this.s}", yParity: ${this.yParity}, networkV: ${this.networkV} }`;
- }
- /**
- * Returns a new identical [[Signature]].
- */
- clone() {
- const clone = new Signature(_guard, this.r, this.s, this.v);
- if (this.networkV) {
- clone.#networkV = this.networkV;
- }
- return clone;
- }
- /**
- * Returns a representation that is compatible with ``JSON.stringify``.
- */
- toJSON() {
- const networkV = this.networkV;
- return {
- _type: "signature",
- networkV: ((networkV != null) ? networkV.toString() : null),
- r: this.r, s: this.s, v: this.v,
- };
- }
- /**
- * Compute the chain ID from the ``v`` in a legacy EIP-155 transactions.
- *
- * @example:
- * Signature.getChainId(45)
- * //_result:
- *
- * Signature.getChainId(46)
- * //_result:
- */
- static getChainId(v) {
- const bv = (0, index_js_2.getBigInt)(v, "v");
- // The v is not an EIP-155 v, so it is the unspecified chain ID
- if ((bv == BN_27) || (bv == BN_28)) {
- return BN_0;
- }
- // Bad value for an EIP-155 v
- (0, index_js_2.assertArgument)(bv >= BN_35, "invalid EIP-155 v", "v", v);
- return (bv - BN_35) / BN_2;
- }
- /**
- * Compute the ``v`` for a chain ID for a legacy EIP-155 transactions.
- *
- * Legacy transactions which use [[link-eip-155]] hijack the ``v``
- * property to include the chain ID.
- *
- * @example:
- * Signature.getChainIdV(5, 27)
- * //_result:
- *
- * Signature.getChainIdV(5, 28)
- * //_result:
- *
- */
- static getChainIdV(chainId, v) {
- return ((0, index_js_2.getBigInt)(chainId) * BN_2) + BigInt(35 + v - 27);
- }
- /**
- * Compute the normalized legacy transaction ``v`` from a ``yParirty``,
- * a legacy transaction ``v`` or a legacy [[link-eip-155]] transaction.
- *
- * @example:
- * // The values 0 and 1 imply v is actually yParity
- * Signature.getNormalizedV(0)
- * //_result:
- *
- * // Legacy non-EIP-1559 transaction (i.e. 27 or 28)
- * Signature.getNormalizedV(27)
- * //_result:
- *
- * // Legacy EIP-155 transaction (i.e. >= 35)
- * Signature.getNormalizedV(46)
- * //_result:
- *
- * // Invalid values throw
- * Signature.getNormalizedV(5)
- * //_error:
- */
- static getNormalizedV(v) {
- const bv = (0, index_js_2.getBigInt)(v);
- if (bv === BN_0 || bv === BN_27) {
- return 27;
- }
- if (bv === BN_1 || bv === BN_28) {
- return 28;
- }
- (0, index_js_2.assertArgument)(bv >= BN_35, "invalid v", "v", v);
- // Otherwise, EIP-155 v means odd is 27 and even is 28
- return (bv & BN_1) ? 27 : 28;
- }
- /**
- * Creates a new [[Signature]].
- *
- * If no %%sig%% is provided, a new [[Signature]] is created
- * with default values.
- *
- * If %%sig%% is a string, it is parsed.
- */
- static from(sig) {
- function assertError(check, message) {
- (0, index_js_2.assertArgument)(check, message, "signature", sig);
- }
- ;
- if (sig == null) {
- return new Signature(_guard, index_js_1.ZeroHash, index_js_1.ZeroHash, 27);
- }
- if (typeof (sig) === "string") {
- const bytes = (0, index_js_2.getBytes)(sig, "signature");
- if (bytes.length === 64) {
- const r = (0, index_js_2.hexlify)(bytes.slice(0, 32));
- const s = bytes.slice(32, 64);
- const v = (s[0] & 0x80) ? 28 : 27;
- s[0] &= 0x7f;
- return new Signature(_guard, r, (0, index_js_2.hexlify)(s), v);
- }
- if (bytes.length === 65) {
- const r = (0, index_js_2.hexlify)(bytes.slice(0, 32));
- const s = bytes.slice(32, 64);
- assertError((s[0] & 0x80) === 0, "non-canonical s");
- const v = Signature.getNormalizedV(bytes[64]);
- return new Signature(_guard, r, (0, index_js_2.hexlify)(s), v);
- }
- assertError(false, "invalid raw signature length");
- }
- if (sig instanceof Signature) {
- return sig.clone();
- }
- // Get r
- const _r = sig.r;
- assertError(_r != null, "missing r");
- const r = toUint256(_r);
- // Get s; by any means necessary (we check consistency below)
- const s = (function (s, yParityAndS) {
- if (s != null) {
- return toUint256(s);
- }
- if (yParityAndS != null) {
- assertError((0, index_js_2.isHexString)(yParityAndS, 32), "invalid yParityAndS");
- const bytes = (0, index_js_2.getBytes)(yParityAndS);
- bytes[0] &= 0x7f;
- return (0, index_js_2.hexlify)(bytes);
- }
- assertError(false, "missing s");
- })(sig.s, sig.yParityAndS);
- assertError(((0, index_js_2.getBytes)(s)[0] & 0x80) == 0, "non-canonical s");
- // Get v; by any means necessary (we check consistency below)
- const { networkV, v } = (function (_v, yParityAndS, yParity) {
- if (_v != null) {
- const v = (0, index_js_2.getBigInt)(_v);
- return {
- networkV: ((v >= BN_35) ? v : undefined),
- v: Signature.getNormalizedV(v)
- };
- }
- if (yParityAndS != null) {
- assertError((0, index_js_2.isHexString)(yParityAndS, 32), "invalid yParityAndS");
- return { v: (((0, index_js_2.getBytes)(yParityAndS)[0] & 0x80) ? 28 : 27) };
- }
- if (yParity != null) {
- switch ((0, index_js_2.getNumber)(yParity, "sig.yParity")) {
- case 0: return { v: 27 };
- case 1: return { v: 28 };
- }
- assertError(false, "invalid yParity");
- }
- assertError(false, "missing v");
- })(sig.v, sig.yParityAndS, sig.yParity);
- const result = new Signature(_guard, r, s, v);
- if (networkV) {
- result.#networkV = networkV;
- }
- // If multiple of v, yParity, yParityAndS we given, check they match
- assertError(sig.yParity == null || (0, index_js_2.getNumber)(sig.yParity, "sig.yParity") === result.yParity, "yParity mismatch");
- assertError(sig.yParityAndS == null || sig.yParityAndS === result.yParityAndS, "yParityAndS mismatch");
- return result;
- }
- }
- exports.Signature = Signature;
- //# sourceMappingURL=signature.js.map
|