@leofcoin/chain 1.9.24 → 1.9.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -379,49 +379,17 @@ const base = (ALPHABET, options = {}) => {
379
379
  };
380
380
  };
381
381
 
382
- const ALPHABET$1$1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
383
- const ALPHABET_HEX$1 = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
384
- const base32 = base(ALPHABET$1$1);
385
- const base32Hex = base(ALPHABET_HEX$1);
386
- const decode$5 = base32.decode;
387
- const decodeHex$2 = base32Hex.decode;
388
- const encode$4 = base32.encode;
389
- const encodeHex$2 = base32Hex.encode;
390
- const isBase32 = (string, hex = false) => {
391
- try {
392
- if (hex)
393
- decodeHex$2(string);
394
- else
395
- decode$5(string);
396
- return true;
397
- }
398
- catch (e) {
399
- return false;
400
- }
401
- };
402
- const isBase32Hex = (string) => {
403
- return isBase32(string, true);
404
- };
405
- var index$4 = {
406
- encode: encode$4,
407
- decode: decode$5,
408
- encodeHex: encodeHex$2,
409
- decodeHex: decodeHex$2,
410
- isBase32,
411
- isBase32Hex,
412
- };
413
-
414
- const ALPHABET$2 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
415
- const ALPHABET_HEX = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
416
- const base58 = base(ALPHABET$2);
417
- const base58Hex = base(ALPHABET_HEX);
418
- const encode$3 = base58.encode;
419
- const decode$4 = base58.decode;
420
- const encodeHex$1 = base58Hex.encode;
421
- const decodeHex$1 = base58Hex.decode;
382
+ const ALPHABET$1$1 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
383
+ const ALPHABET_HEX$1 = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
384
+ const base58 = base(ALPHABET$1$1);
385
+ const base58Hex = base(ALPHABET_HEX$1);
386
+ const encode$4 = base58.encode;
387
+ const decode$5 = base58.decode;
388
+ const encodeHex$2 = base58Hex.encode;
389
+ const decodeHex$2 = base58Hex.decode;
422
390
  const isBase58 = (string) => {
423
391
  try {
424
- decode$4(string);
392
+ decode$5(string);
425
393
  return true;
426
394
  }
427
395
  catch (e) {
@@ -430,7 +398,7 @@ const isBase58 = (string) => {
430
398
  };
431
399
  const isBase58Hex = (string) => {
432
400
  try {
433
- decodeHex$1(string);
401
+ decodeHex$2(string);
434
402
  return true;
435
403
  }
436
404
  catch (e) {
@@ -439,12 +407,12 @@ const isBase58Hex = (string) => {
439
407
  };
440
408
  const whatType = (string) => {
441
409
  try {
442
- decode$4(string);
410
+ decode$5(string);
443
411
  return "base58";
444
412
  }
445
413
  catch (e) {
446
414
  try {
447
- decodeHex$1(string);
415
+ decodeHex$2(string);
448
416
  return "base58Hex";
449
417
  }
450
418
  catch {
@@ -453,15 +421,143 @@ const whatType = (string) => {
453
421
  }
454
422
  };
455
423
  var base58$1 = {
456
- encode: encode$3,
457
- decode: decode$4,
424
+ encode: encode$4,
425
+ decode: decode$5,
458
426
  isBase58,
459
427
  isBase58Hex,
460
- encodeHex: encodeHex$1,
461
- decodeHex: decodeHex$1,
428
+ encodeHex: encodeHex$2,
429
+ decodeHex: decodeHex$2,
462
430
  whatType,
463
431
  };
464
432
 
433
+ const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
434
+
435
+ const { subtle: subtle$1 } = crypto;
436
+
437
+ /**
438
+ * ```js
439
+ * const {createHash} = await import('@leofcoin/crypto')
440
+ * createHash(data, algorithm)
441
+ * ```
442
+ * @param {Uint8Array} data
443
+ * @param {string} algorithm
444
+ * @returns Uint8Array
445
+ */
446
+ const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
447
+
448
+ /**
449
+ * Hashes the created hash again
450
+ * ```js
451
+ * const {createDoubleHash} = await import('@leofcoin/crypto')
452
+ * createDoubleHash(data, algorithm)
453
+ * ```
454
+ * @param {Uint8Array} data
455
+ * @param {string} algorithm
456
+ * @returns Uint8Array
457
+ */
458
+ const createDoubleHash = async (data, algorithm = 'SHA-512') =>
459
+ subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
460
+
461
+ const generatePbkdf2 = async (password) => {
462
+ return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
463
+ };
464
+
465
+ const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
466
+ const key = await generatePbkdf2(password);
467
+ return subtle$1.deriveBits(
468
+ {
469
+ name: 'PBKDF2',
470
+ hash,
471
+ salt,
472
+ iterations
473
+ },
474
+ key,
475
+ length
476
+ )
477
+ };
478
+
479
+ var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
480
+ if (!options) options = {};
481
+
482
+ if (typeof options.seperator === 'string')
483
+ options.seperator = new TextEncoder().encode(options.seperator);
484
+
485
+ const length = options.length || input.reduce((total, current, i) => {
486
+ total += current.length;
487
+ if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
488
+ return total
489
+ }, 0);
490
+
491
+ const typedArray = new Uint8Array(length);
492
+
493
+ let currentIndex = 0;
494
+ let index = 0;
495
+ for (const source of input) {
496
+ typedArray.set(source, currentIndex);
497
+ if (options.seperator && input.length - 1 > index) {
498
+ typedArray.set(options.seperator, currentIndex + source.length);
499
+ currentIndex+= options.seperator.length;
500
+ }
501
+ currentIndex += source.length;
502
+ index += 1;
503
+ }
504
+
505
+ return typedArray
506
+ };
507
+
508
+ const concatAndDoubleHash = async (input) => {
509
+ return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
510
+ };
511
+
512
+ const encode$3 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
513
+ if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
514
+ throw new TypeError('Expected Uint8Array');
515
+ }
516
+ const hash = await concatAndDoubleHash([
517
+ prefix,
518
+ source
519
+ ]);
520
+ const uint8Array = typedArrayConcat([
521
+ prefix,
522
+ source,
523
+ hash.subarray(0, 4)
524
+ ]);
525
+ if (hex)
526
+ return base58$1.encodeHex(uint8Array);
527
+ return base58$1.encode(uint8Array);
528
+ };
529
+ const decode$4 = async (string, hex) => {
530
+ let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
531
+ const prefix = uint8Array.subarray(0, 2);
532
+ const source = uint8Array.subarray(2, -4);
533
+ const hash = await concatAndDoubleHash([
534
+ prefix,
535
+ source
536
+ ]);
537
+ let index = 0;
538
+ const slice = uint8Array.subarray(-4);
539
+ for (const check of slice) {
540
+ if (check !== hash[index]) {
541
+ throw new Error('Invalid checksum');
542
+ }
543
+ index++;
544
+ }
545
+ return { prefix, data: source };
546
+ };
547
+ const isBase58check = (string, hex) => {
548
+ try {
549
+ hex ? decode$4(string, true) : decode$4(string);
550
+ return true;
551
+ }
552
+ catch (e) {
553
+ return false;
554
+ }
555
+ };
556
+ const encodeHex$1 = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$3(uint8Array, prefix, true);
557
+ const decodeHex$1 = (string) => decode$4(string, true);
558
+ const isBase58checkHex = (string) => isBase58check(string, true);
559
+ var base58check = { encode: encode$3, decode: decode$4, encodeHex: encodeHex$1, decodeHex: decodeHex$1, isBase58check, isBase58checkHex };
560
+
465
561
  const MSB$1 = 0x80;
466
562
  const MSBALL = -128;
467
563
  const INT = Math.pow(2, 31);
@@ -530,16 +626,16 @@ var encodingLength = (value) => (value < N1 ? 1
530
626
  : value < N9 ? 9
531
627
  : 10);
532
628
 
533
- var index$3 = {
629
+ var index$4 = {
534
630
  encode: encode$2,
535
631
  decode: decode$3,
536
632
  encodingLength
537
633
  };
538
634
 
539
- var index$2 = (input, prefix) => {
635
+ var index$3 = (input, prefix) => {
540
636
  const encodedArray = [];
541
637
  const length = input.reduce((total, current) => {
542
- const encoded = index$3.encode(current.length);
638
+ const encoded = index$4.encode(current.length);
543
639
  encodedArray.push(encoded);
544
640
  total += current.length + encoded.length;
545
641
  return total;
@@ -557,12 +653,12 @@ var index$2 = (input, prefix) => {
557
653
  return typedArray;
558
654
  };
559
655
 
560
- var index$1$1 = (typedArray, prefix) => {
656
+ var index$2 = (typedArray, prefix) => {
561
657
  const set = [];
562
658
  const varintAndSub = (typedArray) => {
563
- const length = index$3.decode(typedArray);
659
+ const length = index$4.decode(typedArray);
564
660
  // remove length
565
- typedArray = typedArray.subarray(index$3.decode.bytes);
661
+ typedArray = typedArray.subarray(index$4.decode.bytes);
566
662
  // push value
567
663
  set.push(typedArray.subarray(0, length));
568
664
  // remove value
@@ -574,1814 +670,1686 @@ var index$1$1 = (typedArray, prefix) => {
574
670
  return varintAndSub(typedArray);
575
671
  };
576
672
 
577
- /*!
578
- * hash-wasm (https://www.npmjs.com/package/hash-wasm)
579
- * (c) Dani Biro
580
- * @license MIT
581
- */
582
-
583
-
584
- /******************************************************************************
585
- Copyright (c) Microsoft Corporation.
586
-
587
- Permission to use, copy, modify, and/or distribute this software for any
588
- purpose with or without fee is hereby granted.
589
-
590
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
591
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
592
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
593
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
594
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
595
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
596
- PERFORMANCE OF THIS SOFTWARE.
597
- ***************************************************************************** */
598
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
599
-
600
-
601
- function __awaiter(thisArg, _arguments, P, generator) {
602
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
603
- return new (P || (P = Promise))(function (resolve, reject) {
604
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
605
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
606
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
607
- step((generator = generator.apply(thisArg, [])).next());
608
- });
609
- }
610
-
611
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
612
- var e = new Error(message);
613
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
673
+ const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
674
+ const decoded = base58$1.decode(multiWif);
675
+ let [version, codec, privateKey] = index$2(decoded);
676
+ version = Number(new TextDecoder().decode(version));
677
+ codec = Number(new TextDecoder().decode(codec));
678
+ if (expectedVersion && version !== expectedVersion)
679
+ throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
680
+ if (expectedCodec && codec !== expectedCodec)
681
+ throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
682
+ return { version, codec, privateKey };
683
+ };
684
+ var index$1$1 = {
685
+ encode: (version, codec, privateKey) => {
686
+ return base58$1.encode(index$3([
687
+ new TextEncoder().encode(version.toString()),
688
+ new TextEncoder().encode(codec.toString()),
689
+ privateKey
690
+ ]));
691
+ },
692
+ decode: decode$2,
693
+ isMultiWif: (multiWif) => {
694
+ try {
695
+ const { version, codec, privateKey } = decode$2(multiWif);
696
+ if (version === undefined)
697
+ return false;
698
+ if (codec === undefined)
699
+ return false;
700
+ if (privateKey === undefined)
701
+ return false;
702
+ if (privateKey && privateKey.length !== 32)
703
+ return false;
704
+ }
705
+ catch {
706
+ return false;
707
+ }
708
+ return true;
709
+ }
614
710
  };
615
711
 
616
- class Mutex {
617
- constructor() {
618
- this.mutex = Promise.resolve();
619
- }
620
- lock() {
621
- let begin = () => { };
622
- this.mutex = this.mutex.then(() => new Promise(begin));
623
- return new Promise((res) => {
624
- begin = res;
625
- });
626
- }
627
- dispatch(fn) {
628
- return __awaiter(this, void 0, void 0, function* () {
629
- const unlock = yield this.lock();
630
- try {
631
- return yield Promise.resolve(fn());
632
- }
633
- finally {
634
- unlock();
635
- }
636
- });
637
- }
638
- }
639
-
640
- var _a;
641
- function getGlobal() {
642
- if (typeof globalThis !== "undefined")
643
- return globalThis;
644
- if (typeof self !== "undefined")
645
- return self;
646
- if (typeof window !== "undefined")
647
- return window;
648
- return global;
649
- }
650
- const globalObject = getGlobal();
651
- const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
652
- const textEncoder = globalObject.TextEncoder
653
- ? new globalObject.TextEncoder()
654
- : null;
655
- function hexCharCodesToInt(a, b) {
656
- return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
657
- ((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
658
- }
659
- function writeHexToUInt8(buf, str) {
660
- const size = str.length >> 1;
661
- for (let i = 0; i < size; i++) {
662
- const index = i << 1;
663
- buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
664
- }
665
- }
666
- function hexStringEqualsUInt8(str, buf) {
667
- if (str.length !== buf.length * 2) {
668
- return false;
712
+ /*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
713
+ /**
714
+ * 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
715
+ * Compliant with RFC6979 & BIP340.
716
+ * @module
717
+ */
718
+ /**
719
+ * Curve params from SEC 2 v2 §2.4.1.
720
+ * secp256k1 is a short Weierstrass / Koblitz curve with equation
721
+ * `y² == x³ + ax + b`.
722
+ * * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
723
+ * * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
724
+ * * h = `1n` // cofactor
725
+ * * a = `0n` // equation param
726
+ * * b = `7n` // equation param
727
+ * * Gx, Gy are coordinates of Generator / base point
728
+ */
729
+ // Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
730
+ // callers cannot mutate them out from under the arithmetic constants captured below.
731
+ const secp256k1_CURVE = Object.freeze({
732
+ p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
733
+ n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
734
+ h: 1n,
735
+ a: 0n,
736
+ b: 7n,
737
+ Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
738
+ Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
739
+ });
740
+ const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
741
+ // 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
742
+ // by the RFC6979 paths here.
743
+ const L = 32;
744
+ const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
745
+ const lengths = {
746
+ publicKey: L + 1,
747
+ publicKeyUncompressed: L2 + 1,
748
+ // 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
749
+ // 352-bit recommendation for 256-bit prime curves.
750
+ seed: L + L / 2,
751
+ };
752
+ // Helpers and Precomputes sections are reused between libraries
753
+ // ## Helpers
754
+ // ----------
755
+ const err$1 = (message = '', E = Error) => {
756
+ const e = new E(message);
757
+ const { captureStackTrace } = Error;
758
+ if (typeof captureStackTrace === 'function')
759
+ captureStackTrace(e, err$1);
760
+ throw e;
761
+ };
762
+ // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
763
+ // fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
764
+ // spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
765
+ const isBytes = (a) => a instanceof Uint8Array ||
766
+ (ArrayBuffer.isView(a) &&
767
+ a.constructor.name === 'Uint8Array' &&
768
+ a.BYTES_PER_ELEMENT === 1);
769
+ /** Asserts something is Bytes. */
770
+ const abytes = (value, length, title = '') => {
771
+ const bytes = isBytes(value);
772
+ const len = value?.length;
773
+ const needsLen = length !== undefined;
774
+ if (!bytes || (needsLen && len !== length)) {
775
+ const prefix = title && `"${title}" `;
776
+ const ofLen = needsLen ? ` of length ${length}` : '';
777
+ const got = bytes ? `length=${len}` : `type=${typeof value}`;
778
+ const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
779
+ return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
669
780
  }
670
- for (let i = 0; i < buf.length; i++) {
671
- const strIndex = i << 1;
672
- if (buf[i] !==
673
- hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
674
- return false;
675
- }
781
+ return value;
782
+ };
783
+ /** create Uint8Array */
784
+ const u8n = (len) => new Uint8Array(len);
785
+ // Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
786
+ const padh = (n, pad) => n.toString(16).padStart(pad, '0');
787
+ /** Render bytes as lowercase hex. */
788
+ const bytesToHex = (b) => {
789
+ let hex = '';
790
+ for (const e of abytes(b))
791
+ hex += padh(e, 2);
792
+ return hex;
793
+ };
794
+ const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
795
+ // Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
796
+ // prettier-ignore
797
+ const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
798
+ : ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
799
+ : ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
800
+ : undefined;
801
+ const hexToBytes = (hex) => {
802
+ const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
803
+ if (typeof hex !== 'string')
804
+ return err$1(e);
805
+ const hl = hex.length;
806
+ const al = hl / 2;
807
+ if (hl % 2)
808
+ return err$1(e);
809
+ const array = u8n(al);
810
+ for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
811
+ // treat each char as ASCII
812
+ const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
813
+ const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
814
+ if (n1 === undefined || n2 === undefined)
815
+ return err$1(e);
816
+ array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
676
817
  }
677
- return true;
678
- }
679
- const alpha = "a".charCodeAt(0) - 10;
680
- const digit = "0".charCodeAt(0);
681
- function getDigestHex(tmpBuffer, input, hashLength) {
682
- let p = 0;
683
- for (let i = 0; i < hashLength; i++) {
684
- let nibble = input[i] >>> 4;
685
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
686
- nibble = input[i] & 0xf;
687
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
818
+ return array;
819
+ };
820
+ // WebCrypto is available in all modern environments
821
+ const subtle = () => globalThis?.crypto?.subtle ?? err$1('crypto.subtle must be defined, consider polyfill');
822
+ // prettier-ignore
823
+ const concatBytes = (...arrs) => {
824
+ let len = 0;
825
+ for (const a of arrs)
826
+ len += abytes(a).length; // validate every input and sum lengths before copying
827
+ const r = u8n(len);
828
+ let pad = 0; // walk through each array,
829
+ for (const a of arrs)
830
+ r.set(a, pad), pad += a.length; // ensure they have proper type
831
+ return r;
832
+ };
833
+ /**
834
+ * WebCrypto OS-level CSPRNG (random number generator).
835
+ * Will throw when not available; large-request ceilings are delegated to getRandomValues().
836
+ */
837
+ const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
838
+ const big = BigInt;
839
+ const arange = (n, min, max, msg = 'bad number: out of range') => {
840
+ if (typeof n !== 'bigint')
841
+ return err$1(msg, TypeError);
842
+ if (min <= n && n < max)
843
+ return n;
844
+ return err$1(msg, RangeError);
845
+ };
846
+ /** Canonical modular reduction. Callers must provide a positive modulus. */
847
+ const M = (a, b = P) => {
848
+ const r = a % b;
849
+ return r >= 0n ? r : b + r;
850
+ };
851
+ const modN = (a) => M(a, N);
852
+ /** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
853
+ // prettier-ignore
854
+ const invert = (num, md) => {
855
+ if (num === 0n || md <= 0n)
856
+ err$1('no inverse n=' + num + ' mod=' + md);
857
+ let a = M(num, md), b = md, x = 0n, u = 1n;
858
+ while (a !== 0n) {
859
+ const q = b / a, r = b % a;
860
+ const m = x - u * q;
861
+ b = a, a = r, x = u, u = m;
688
862
  }
689
- return String.fromCharCode.apply(null, tmpBuffer);
690
- }
691
- const getUInt8Buffer = nodeBuffer !== null
692
- ? (data) => {
693
- if (typeof data === "string") {
694
- const buf = nodeBuffer.from(data, "utf8");
695
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
696
- }
697
- if (nodeBuffer.isBuffer(data)) {
698
- return new Uint8Array(data.buffer, data.byteOffset, data.length);
699
- }
700
- if (ArrayBuffer.isView(data)) {
701
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
702
- }
703
- throw new Error("Invalid data type!");
863
+ return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
864
+ };
865
+ const callHash = (name) => {
866
+ // @ts-ignore
867
+ const fn = hashes[name];
868
+ if (typeof fn !== 'function')
869
+ err$1('hashes.' + name + ' not set');
870
+ return fn;
871
+ };
872
+ // All exported provider slots are caller-configurable and may be unset or return arbitrary values,
873
+ // so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
874
+ const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
875
+ const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
876
+ // also rejects structurally similar Point values from other realms / bundled copies
877
+ const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
878
+ // ## End of Helpers
879
+ // -----------------
880
+ /**
881
+ * secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
882
+ * making it x³+b; callers validate x first.
883
+ */
884
+ const koblitz = (x) => M(M(x * x) * x + _b);
885
+ /** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
886
+ const FpIsValid = (n) => arange(n, 0n, P);
887
+ /** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
888
+ const FpIsValidNot0 = (n) => arange(n, 1n, P);
889
+ /** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
890
+ const FnIsValidNot0 = (n) => arange(n, 1n, N);
891
+ // Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
892
+ const isEven = (y) => !(y & 1n);
893
+ /** create Uint8Array of byte n */
894
+ const u8of = (n) => Uint8Array.of(n);
895
+ /** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
896
+ const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
897
+ /** lift_x from BIP340 returns the unique even square root for x³+7.
898
+ * SEC 1 callers still flip it for the odd-prefix branch. */
899
+ const lift_x = (x) => {
900
+ // Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
901
+ const c = koblitz(FpIsValidNot0(x));
902
+ // r = √c candidate
903
+ // r = c^((p+1)/4) mod p
904
+ // This formula works for fields p = 3 mod 4 -- a special, fast case.
905
+ // Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
906
+ let r = 1n;
907
+ for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
908
+ // powMod: modular exponentiation.
909
+ if (e & 1n)
910
+ r = (r * num) % P; // Uses exponentiation by squaring.
911
+ num = (num * num) % P; // Not constant-time.
704
912
  }
705
- : (data) => {
706
- if (typeof data === "string") {
707
- return textEncoder.encode(data);
708
- }
709
- if (ArrayBuffer.isView(data)) {
710
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
711
- }
712
- throw new Error("Invalid data type!");
713
- };
714
- const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
715
- const base64Lookup = new Uint8Array(256);
716
- for (let i = 0; i < base64Chars.length; i++) {
717
- base64Lookup[base64Chars.charCodeAt(i)] = i;
718
- }
719
- function getDecodeBase64Length(data) {
720
- let bufferLength = Math.floor(data.length * 0.75);
721
- const len = data.length;
722
- if (data[len - 1] === "=") {
723
- bufferLength -= 1;
724
- if (data[len - 2] === "=") {
725
- bufferLength -= 1;
913
+ if (M(r * r) !== c)
914
+ err$1('sqrt invalid'); // check if result is valid
915
+ return isEven(r) ? r : M(-r);
916
+ };
917
+ /**
918
+ * Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
919
+ * @param X - X coordinate.
920
+ * @param Y - Y coordinate.
921
+ * @param Z - projective Z coordinate.
922
+ * @example
923
+ * Do point arithmetic with the base point and encode the result as hex.
924
+ * ```ts
925
+ * import { Point } from '@noble/secp256k1';
926
+ * const hex = Point.BASE.double().toHex();
927
+ * ```
928
+ */
929
+ class Point {
930
+ static BASE;
931
+ static ZERO;
932
+ X;
933
+ Y;
934
+ Z;
935
+ constructor(X, Y, Z) {
936
+ this.X = FpIsValid(X);
937
+ this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
938
+ this.Z = FpIsValid(Z);
939
+ Object.freeze(this);
940
+ }
941
+ /** Returns the shared curve metadata object by reference.
942
+ * It is readonly only at type level, and mutating it won't retarget arithmetic,
943
+ * which already uses module-load snapshots. */
944
+ static CURVE() {
945
+ return secp256k1_CURVE;
946
+ }
947
+ /** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
948
+ static fromAffine(ap) {
949
+ const { x, y } = ap;
950
+ return x === 0n && y === 0n ? I : new Point(x, y, 1n);
951
+ }
952
+ /** Convert Uint8Array or hex string to Point. */
953
+ static fromBytes(bytes) {
954
+ abytes(bytes);
955
+ const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
956
+ let p = undefined;
957
+ const length = bytes.length;
958
+ const head = bytes[0];
959
+ const tail = bytes.subarray(1);
960
+ const x = sliceBytesNumBE(tail, 0, L);
961
+ // SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
962
+ // infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
963
+ // and public-key validation helpers, so strict handling applies to all callers by default.
964
+ // Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
965
+ // Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
966
+ if (length === comp && (head === 0x02 || head === 0x03)) {
967
+ // Equation is y² == x³ + ax + b. We calculate y from x.
968
+ // lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
969
+ let y = lift_x(x);
970
+ if (head === 0x03)
971
+ y = M(-y);
972
+ p = new Point(x, y, 1n);
726
973
  }
974
+ // Uncompressed 65-byte point, 0x04 prefix
975
+ if (length === uncomp && head === 0x04)
976
+ p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
977
+ // Validate point
978
+ return p ? p.assertValidity() : err$1('bad point: not on curve');
727
979
  }
728
- return bufferLength;
729
- }
730
- function decodeBase64(data) {
731
- const bufferLength = getDecodeBase64Length(data);
732
- const len = data.length;
733
- const bytes = new Uint8Array(bufferLength);
734
- let p = 0;
735
- for (let i = 0; i < len; i += 4) {
736
- const encoded1 = base64Lookup[data.charCodeAt(i)];
737
- const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
738
- const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
739
- const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
740
- bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
741
- p += 1;
742
- bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
743
- p += 1;
744
- bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
745
- p += 1;
980
+ static fromHex(hex) {
981
+ return Point.fromBytes(hexToBytes(hex));
746
982
  }
747
- return bytes;
748
- }
749
-
750
- const MAX_HEAP = 16 * 1024;
751
- const WASM_FUNC_HASH_LENGTH = 4;
752
- const wasmMutex = new Mutex();
753
- const wasmModuleCache = new Map();
754
- function WASMInterface(binary, hashLength) {
755
- return __awaiter(this, void 0, void 0, function* () {
756
- let wasmInstance = null;
757
- let memoryView = null;
758
- let initialized = false;
759
- if (typeof WebAssembly === "undefined") {
760
- throw new Error("WebAssembly is not supported in this environment!");
983
+ get x() {
984
+ return this.toAffine().x;
985
+ }
986
+ get y() {
987
+ return this.toAffine().y;
988
+ }
989
+ /** Equality check: compare points P&Q. */
990
+ equals(other) {
991
+ const { X: X1, Y: Y1, Z: Z1 } = this;
992
+ const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
993
+ const X1Z2 = M(X1 * Z2);
994
+ const X2Z1 = M(X2 * Z1);
995
+ const Y1Z2 = M(Y1 * Z2);
996
+ const Y2Z1 = M(Y2 * Z1);
997
+ return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
998
+ }
999
+ is0() {
1000
+ return this.equals(I);
1001
+ }
1002
+ /** Flip point over y coordinate. */
1003
+ negate() {
1004
+ return new Point(this.X, M(-this.Y), this.Z);
1005
+ }
1006
+ /** Point doubling: P+P, complete formula. */
1007
+ double() {
1008
+ return this.add(this);
1009
+ }
1010
+ /**
1011
+ * Point addition: P+Q, complete, exception-free formula
1012
+ * (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
1013
+ * Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
1014
+ */
1015
+ // prettier-ignore
1016
+ add(other) {
1017
+ const { X: X1, Y: Y1, Z: Z1 } = this;
1018
+ const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
1019
+ const a = 0n;
1020
+ const b = _b;
1021
+ let X3 = 0n, Y3 = 0n, Z3 = 0n;
1022
+ const b3 = M(b * 3n);
1023
+ let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
1024
+ let t4 = M(X2 + Y2); // step 5
1025
+ t3 = M(t3 * t4);
1026
+ t4 = M(t0 + t1);
1027
+ t3 = M(t3 - t4);
1028
+ t4 = M(X1 + Z1);
1029
+ let t5 = M(X2 + Z2); // step 10
1030
+ t4 = M(t4 * t5);
1031
+ t5 = M(t0 + t2);
1032
+ t4 = M(t4 - t5);
1033
+ t5 = M(Y1 + Z1);
1034
+ X3 = M(Y2 + Z2); // step 15
1035
+ t5 = M(t5 * X3);
1036
+ X3 = M(t1 + t2);
1037
+ t5 = M(t5 - X3);
1038
+ Z3 = M(a * t4);
1039
+ X3 = M(b3 * t2); // step 20
1040
+ Z3 = M(X3 + Z3);
1041
+ X3 = M(t1 - Z3);
1042
+ Z3 = M(t1 + Z3);
1043
+ Y3 = M(X3 * Z3);
1044
+ t1 = M(t0 + t0); // step 25
1045
+ t1 = M(t1 + t0);
1046
+ t2 = M(a * t2);
1047
+ t4 = M(b3 * t4);
1048
+ t1 = M(t1 + t2);
1049
+ t2 = M(t0 - t2); // step 30
1050
+ t2 = M(a * t2);
1051
+ t4 = M(t4 + t2);
1052
+ t0 = M(t1 * t4);
1053
+ Y3 = M(Y3 + t0);
1054
+ t0 = M(t5 * t4); // step 35
1055
+ X3 = M(t3 * X3);
1056
+ X3 = M(X3 - t0);
1057
+ t0 = M(t3 * t1);
1058
+ Z3 = M(t5 * Z3);
1059
+ Z3 = M(Z3 + t0); // step 40
1060
+ return new Point(X3, Y3, Z3);
1061
+ }
1062
+ subtract(other) {
1063
+ return this.add(apoint(other).negate());
1064
+ }
1065
+ /**
1066
+ * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
1067
+ * Uses {@link wNAF} for base point.
1068
+ * Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
1069
+ * @param n scalar by which point is multiplied
1070
+ * @param safe safe mode guards against timing attacks; unsafe mode is faster
1071
+ */
1072
+ multiply(n, safe = true) {
1073
+ // Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
1074
+ if (!safe && n === 0n)
1075
+ return I;
1076
+ FnIsValidNot0(n);
1077
+ if (n === 1n)
1078
+ return this;
1079
+ if (this.equals(G))
1080
+ return wNAF(n).p;
1081
+ // init result point & fake point
1082
+ let p = I;
1083
+ let f = G;
1084
+ for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
1085
+ // if bit is present, add to point
1086
+ // if not present, add to fake, for timing safety
1087
+ if (n & 1n)
1088
+ p = p.add(d);
1089
+ else if (safe)
1090
+ f = f.add(d);
761
1091
  }
762
- const writeMemory = (data, offset = 0) => {
763
- memoryView.set(data, offset);
764
- };
765
- const getMemory = () => memoryView;
766
- const getExports = () => wasmInstance.exports;
767
- const setMemorySize = (totalSize) => {
768
- wasmInstance.exports.Hash_SetMemorySize(totalSize);
769
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
770
- const memoryBuffer = wasmInstance.exports.memory.buffer;
771
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
772
- };
773
- const getStateSize = () => {
774
- const view = new DataView(wasmInstance.exports.memory.buffer);
775
- const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
776
- return stateSize;
777
- };
778
- const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
779
- if (!wasmModuleCache.has(binary.name)) {
780
- const asm = decodeBase64(binary.data);
781
- const promise = WebAssembly.compile(asm);
782
- wasmModuleCache.set(binary.name, promise);
783
- }
784
- const module = yield wasmModuleCache.get(binary.name);
785
- wasmInstance = yield WebAssembly.instantiate(module, {
786
- // env: {
787
- // emscripten_memcpy_big: (dest, src, num) => {
788
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
789
- // const memView = new Uint8Array(memoryBuffer, 0);
790
- // memView.set(memView.subarray(src, src + num), dest);
791
- // },
792
- // print_memory: (offset, len) => {
793
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
794
- // const memView = new Uint8Array(memoryBuffer, 0);
795
- // console.log('print_int32', memView.subarray(offset, offset + len));
796
- // },
797
- // },
798
- });
799
- // wasmInstance.exports._start();
800
- }));
801
- const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
802
- if (!wasmInstance) {
803
- yield loadWASMPromise;
804
- }
805
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
806
- const memoryBuffer = wasmInstance.exports.memory.buffer;
807
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
808
- });
809
- const init = (bits = null) => {
810
- initialized = true;
811
- wasmInstance.exports.Hash_Init(bits);
812
- };
813
- const updateUInt8Array = (data) => {
814
- let read = 0;
815
- while (read < data.length) {
816
- const chunk = data.subarray(read, read + MAX_HEAP);
817
- read += chunk.length;
818
- memoryView.set(chunk);
819
- wasmInstance.exports.Hash_Update(chunk.length);
820
- }
821
- };
822
- const update = (data) => {
823
- if (!initialized) {
824
- throw new Error("update() called before init()");
825
- }
826
- const Uint8Buffer = getUInt8Buffer(data);
827
- updateUInt8Array(Uint8Buffer);
828
- };
829
- const digestChars = new Uint8Array(hashLength * 2);
830
- const digest = (outputType, padding = null) => {
831
- if (!initialized) {
832
- throw new Error("digest() called before init()");
833
- }
834
- initialized = false;
835
- wasmInstance.exports.Hash_Final(padding);
836
- if (outputType === "binary") {
837
- // the data is copied to allow GC of the original memory object
838
- return memoryView.slice(0, hashLength);
839
- }
840
- return getDigestHex(digestChars, memoryView, hashLength);
841
- };
842
- const save = () => {
843
- if (!initialized) {
844
- throw new Error("save() can only be called after init() and before digest()");
845
- }
846
- const stateOffset = wasmInstance.exports.Hash_GetState();
847
- const stateLength = getStateSize();
848
- const memoryBuffer = wasmInstance.exports.memory.buffer;
849
- const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
850
- // prefix is 4 bytes from SHA1 hash of the WASM binary
851
- // it is used to detect incompatible internal states between different versions of hash-wasm
852
- const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
853
- writeHexToUInt8(prefixedState, binary.hash);
854
- prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
855
- return prefixedState;
856
- };
857
- const load = (state) => {
858
- if (!(state instanceof Uint8Array)) {
859
- throw new Error("load() expects an Uint8Array generated by save()");
860
- }
861
- const stateOffset = wasmInstance.exports.Hash_GetState();
862
- const stateLength = getStateSize();
863
- const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
864
- const memoryBuffer = wasmInstance.exports.memory.buffer;
865
- if (state.length !== overallLength) {
866
- throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
867
- }
868
- if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
869
- throw new Error("This state was written by an incompatible hash implementation");
870
- }
871
- const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
872
- new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
873
- initialized = true;
874
- };
875
- const isDataShort = (data) => {
876
- if (typeof data === "string") {
877
- // worst case is 4 bytes / char
878
- return data.length < MAX_HEAP / 4;
879
- }
880
- return data.byteLength < MAX_HEAP;
881
- };
882
- let canSimplify = isDataShort;
883
- switch (binary.name) {
884
- case "argon2":
885
- case "scrypt":
886
- canSimplify = () => true;
887
- break;
888
- case "blake2b":
889
- case "blake2s":
890
- // if there is a key at blake2 then cannot simplify
891
- canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
892
- break;
893
- case "blake3":
894
- // if there is a key at blake3 then cannot simplify
895
- canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
896
- break;
897
- case "xxhash64": // cannot simplify
898
- case "xxhash3":
899
- case "xxhash128":
900
- case "crc64":
901
- canSimplify = () => false;
902
- break;
903
- }
904
- // shorthand for (init + update + digest) for better performance
905
- const calculate = (data, initParam = null, digestParam = null) => {
906
- if (!canSimplify(data, initParam)) {
907
- init(initParam);
908
- update(data);
909
- return digest("hex", digestParam);
910
- }
911
- const buffer = getUInt8Buffer(data);
912
- memoryView.set(buffer);
913
- wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
914
- return getDigestHex(digestChars, memoryView, hashLength);
915
- };
916
- yield setupInterface();
917
- return {
918
- getMemory,
919
- writeMemory,
920
- getExports,
921
- setMemorySize,
922
- init,
923
- update,
924
- digest,
925
- save,
926
- load,
927
- calculate,
928
- hashLength,
929
- };
930
- });
1092
+ return p;
1093
+ }
1094
+ multiplyUnsafe(scalar) {
1095
+ return this.multiply(scalar, false);
1096
+ }
1097
+ /** Convert point to 2d xy affine point. (X, Y, Z) (x=X/Z, y=Y/Z) */
1098
+ toAffine() {
1099
+ const { X: x, Y: y, Z: z } = this;
1100
+ // fast-paths for ZERO point OR Z=1
1101
+ if (this.equals(I))
1102
+ return { x: 0n, y: 0n };
1103
+ if (z === 1n)
1104
+ return { x, y };
1105
+ const iz = invert(z, P);
1106
+ // (Z * Z^-1) must be 1, otherwise bad math
1107
+ if (M(z * iz) !== 1n)
1108
+ err$1('inverse invalid');
1109
+ // x = X*Z^-1; y = Y*Z^-1
1110
+ return { x: M(x * iz), y: M(y * iz) };
1111
+ }
1112
+ /** Checks if the point is valid and on-curve. */
1113
+ assertValidity() {
1114
+ const { x, y } = this.toAffine(); // convert to 2d xy affine point.
1115
+ FpIsValidNot0(x); // must be in range 1 <= x,y < P
1116
+ FpIsValidNot0(y);
1117
+ // == x³ + ax + b, equation sides must be equal
1118
+ return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
1119
+ }
1120
+ /** Converts point to 33/65-byte Uint8Array. */
1121
+ toBytes(isCompressed = true) {
1122
+ // Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
1123
+ // out of this byte surface because callers treat these encodings as public keys by default.
1124
+ const { x, y } = this.assertValidity().toAffine();
1125
+ const x32b = numTo32b(x);
1126
+ if (isCompressed)
1127
+ return concatBytes(getPrefix(y), x32b);
1128
+ return concatBytes(u8of(0x04), x32b, numTo32b(y));
1129
+ }
1130
+ toHex(isCompressed) {
1131
+ return bytesToHex(this.toBytes(isCompressed));
1132
+ }
931
1133
  }
932
-
933
- new Mutex();
934
-
935
- new Mutex();
936
-
937
- new Mutex();
938
-
939
- new Mutex();
940
-
941
- new Mutex();
942
-
943
- new Mutex();
944
-
945
- new Mutex();
946
-
947
- new Mutex();
948
-
949
- var name$c = "sha1";
950
- var data$c = "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";
951
- var hash$c = "6b530c24";
952
- var wasmJson$c = {
953
- name: name$c,
954
- data: data$c,
955
- hash: hash$c
1134
+ /** Generator / base point */
1135
+ const G = new Point(Gx, Gy, 1n);
1136
+ /** Identity / zero point */
1137
+ const I = new Point(0n, 1n, 0n);
1138
+ // Static aliases
1139
+ Point.BASE = G;
1140
+ Point.ZERO = I;
1141
+ /** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
1142
+ const doubleScalarMulUns = (R, u1, u2) => {
1143
+ return G.multiply(u1, false)
1144
+ .add(R.multiply(u2, false))
1145
+ .assertValidity();
1146
+ };
1147
+ // Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
1148
+ const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
1149
+ // Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
1150
+ const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
1151
+ const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
1152
+ /** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
1153
+ const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
1154
+ /** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
1155
+ const secretKeyToScalar = (secretKey) => {
1156
+ const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
1157
+ return arange(num, 1n, N, 'invalid secret key: outside of range');
956
1158
  };
957
-
958
- new Mutex();
959
1159
  /**
960
- * Creates a new SHA-1 hash instance
1160
+ * Creates a SEC 1 public key from a 32-byte private key.
1161
+ * @param privKey - 32-byte secret key.
1162
+ * @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
1163
+ * @returns serialized secp256k1 public key in SEC 1 encoding.
1164
+ * @example
1165
+ * Derive the serialized public key for a secp256k1 secret key.
1166
+ * ```ts
1167
+ * import * as secp from '@noble/secp256k1';
1168
+ * const secretKey = secp.utils.randomSecretKey();
1169
+ * const publicKey = secp.getPublicKey(secretKey);
1170
+ * ```
961
1171
  */
962
- function createSHA1() {
963
- return WASMInterface(wasmJson$c, 20).then((wasm) => {
964
- wasm.init();
965
- const obj = {
966
- init: () => {
967
- wasm.init();
968
- return obj;
969
- },
970
- update: (data) => {
971
- wasm.update(data);
972
- return obj;
973
- },
974
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
975
- digest: (outputType) => wasm.digest(outputType),
976
- save: () => wasm.save(),
977
- load: (data) => {
978
- wasm.load(data);
979
- return obj;
980
- },
981
- blockSize: 64,
982
- digestSize: 20,
983
- };
984
- return obj;
985
- });
986
- }
987
-
988
- var name$b = "sha3";
989
- var data$b = "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";
990
- var hash$b = "fb24e536";
991
- var wasmJson$b = {
992
- name: name$b,
993
- data: data$b,
994
- hash: hash$b
1172
+ const getPublicKey = (privKey, isCompressed = true) => {
1173
+ return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
995
1174
  };
996
-
997
- new Mutex();
998
-
999
- new Mutex();
1000
- function validateBits(bits) {
1001
- if (![224, 256, 384, 512].includes(bits)) {
1002
- return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
1175
+ const isValidSecretKey = (secretKey) => {
1176
+ try {
1177
+ return !!secretKeyToScalar(secretKey);
1003
1178
  }
1004
- return null;
1005
- }
1006
- /**
1007
- * Creates a new Keccak hash instance
1008
- * @param bits Number of output bits. Valid values: 224, 256, 384, 512
1009
- */
1010
- function createKeccak(bits = 512) {
1011
- if (validateBits(bits)) {
1012
- return Promise.reject(validateBits(bits));
1179
+ catch (error) {
1180
+ return false;
1013
1181
  }
1014
- const outputSize = bits / 8;
1015
- return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
1016
- wasm.init(bits);
1017
- const obj = {
1018
- init: () => {
1019
- wasm.init(bits);
1020
- return obj;
1021
- },
1022
- update: (data) => {
1023
- wasm.update(data);
1024
- return obj;
1025
- },
1026
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1027
- digest: (outputType) => wasm.digest(outputType, 0x01),
1028
- save: () => wasm.save(),
1029
- load: (data) => {
1030
- wasm.load(data);
1031
- return obj;
1032
- },
1033
- blockSize: 200 - 2 * outputSize,
1034
- digestSize: outputSize,
1035
- };
1036
- return obj;
1037
- });
1038
- }
1039
-
1040
- var name$a = "sha256";
1041
- var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBhqIgFqIhNqICogEmogLSARaiApIAlqIBMgEiARc3EgEXNqIBNBGncgE0EVd3MgE0EHd3NqQcvM6cB6aiIYIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogFGoiAmoiCSATIBJzcSASc2ogCUEadyAJQRV3cyAJQQd3c2pB8JauknxqIhQgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAXaiIDaiIRIAkgE3NxIBNzaiARQRp3IBFBFXdzIBFBB3dzakGjo7G7fGoiFyADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBlqIgFqIhIgESAJc3EgCXNqIBJBGncgEkEVd3MgEkEHd3NqQZnQy4x9aiIZIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGmoiAmoiE2ogMCASaiAvIBFqICsgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBpIzktH1qIhogAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAYaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakGF67igf2oiGCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBRqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQfDAqoMBaiIUIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogF2oiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pBloKTzQFqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiITIDZqIDIgEmogNSARaiAxIAlqIBMgEiARc3EgEXNqIBNBGncgE0EVd3MgE0EHd3NqQYjY3fEBaiIZIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGmoiAWoiCSATIBJzcSASc2ogCUEadyAJQRV3cyAJQQd3c2pBzO6hugJqIhogASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAYaiICaiIRIAkgE3NxIBNzaiARQRp3IBFBFXdzIBFBB3dzakG1+cKlA2oiGCACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBRqIgNqIhIgESAJc3EgCXNqIBJBGncgEkEVd3MgEkEHd3NqQbOZ8MgDaiIUIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogF2oiAWoiE2ogLEEZdyAsQQ53cyAsQQN2cyAoaiA0aiAzQQ93IDNBDXdzIDNBCnZzaiIXIBJqIDcgEWogMyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakHK1OL2BGoiGyABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBlqIgJqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQc+U89wFaiIZIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGmoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB89+5wQZqIhogAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAYaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakHuhb6kB2oiHCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBRqIgJqIhNqIC5BGXcgLkEOd3MgLkEDdnMgKmogNmogLUEZdyAtQQ53cyAtQQN2cyApaiA1aiAXQQ93IBdBDXdzIBdBCnZzaiIUQQ93IBRBDXdzIBRBCnZzaiIYIBJqIDkgEWogFCAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakHvxpXFB2oiCSACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBtqIgNqIhEgEyASc3EgEnNqIBFBGncgEUEVd3MgEUEHd3NqQZTwoaZ4aiIbIAMgAnMgAXEgAyACcXMgA0EedyADQRN3cyADQQp3c2ogGWoiAWoiEiARIBNzcSATc2ogEkEadyASQRV3cyASQQd3c2pBiISc5nhqIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiITIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakH6//uFeWoiGiACIAFzIANxIAIgAXFzIAJBHncgAkETd3MgAkEKd3NqIBxqIgNqIhQgPGo2AuSJAUEAID8gAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAJaiIBIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBtqIgIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGWoiAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAaaiIJajYC1IkBQQAgPSAvQRl3IC9BDndzIC9BA3ZzICtqIDdqIBhBD3cgGEENd3MgGEEKdnNqIhggEWogFCATIBJzcSASc2ogFEEadyAUQRV3cyAUQQd3c2pB69nBonpqIhkgAWoiEWo2AuCJAUEAIEEgCSADcyACcSAJIANxcyAJQR53IAlBE3dzIAlBCndzaiAZaiIBajYC0IkBQQAgPiAwQRl3IDBBDndzIDBBA3ZzIC9qIBdqIDpBD3cgOkENd3MgOkEKdnNqIBJqIBEgFCATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQffH5vd7aiIXIAJqIhJqNgLciQFBACBDIAEgCXMgA3EgASAJcXMgAUEedyABQRN3cyABQQp3c2ogF2oiAmo2AsyJAUEAIDsgNEEZdyA0QQ53cyA0QQN2cyAwaiA4aiAYQQ93IBhBDXdzIBhBCnZzaiATaiASIBEgFHNxIBRzaiASQRp3IBJBFXdzIBJBB3dzakHy8cWzfGoiESADamo2AtiJAUEAIAAgAiABcyAJcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiARamo2AsiJAQuyBgIEfwF+QQAoAsCJASIAQQJ2QQ9xIgFBAnRBgIkBaiICIAIoAgBBfyAAQQN0IgB0QX9zcUGAASAAdHM2AgACQAJAAkAgAUEOSQ0AAkAgAUEORw0AQQBBADYCvIkBC0GAiQEQA0EAIQIMAQsgAUENRg0BIAFBAWohAgsgAiEDAkBBBiACa0EHcSIARQ0AIAIgAGohAyACQQJ0QYCJAWohAQNAIAFBADYCACABQQRqIQEgAEF/aiIADQALCyACQXlqQQdJDQAgA0ECdCEBA0AgAUGYiQFqQgA3AgAgAUGQiQFqQgA3AgAgAUGIiQFqQgA3AgAgAUGAiQFqQgA3AgAgAUEgaiIBQThHDQALC0EAIQFBAEEAKQPAiQEiBKciAEEbdCAAQQt0QYCA/AdxciAAQQV2QYD+A3EgAEEDdEEYdnJyNgK8iQFBACAEQh2IpyIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYCuIkBQYCJARADQQBBACgC5IkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLkiQFBAEEAKALgiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AuCJAUEAQQAoAtyJASIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYC3IkBQQBBACgC2IkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLYiQFBAEEAKALUiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AtSJAUEAQQAoAtCJASIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYC0IkBQQBBACgCzIkBIgBBGHQgAEGA/gNxQQh0ciAAQQh2QYD+A3EgAEEYdnJyNgLMiQFBAEEAKALIiQEiAEEYdCAAQYD+A3FBCHRyIABBCHZBgP4DcSAAQRh2cnI2AsiJAQJAQQAoAuiJASICRQ0AQQAhAANAIAFBgAlqIAFByIkBai0AADoAACABQQFqIQEgAiAAQQFqIgBB/wFxSw0ACwsLBgBBgIkBC6MBAEEAQgA3A8CJAUEAQRxBICABQeABRiIBGzYC6IkBQQBCp5/mp8b0k/2+f0Krs4/8kaOz8NsAIAEbNwPgiQFBAEKxloD+n6KFrOgAQv+kuYjFkdqCm38gARs3A9iJAUEAQpe6w4OTp5aHd0Ly5rvjo6f9p6V/IAEbNwPQiQFBAELYvZaI/KC1vjZC58yn0NbQ67O7fyABGzcDyIkBIAAQAhAECwsLAQBBgAgLBHAAAAA=";
1042
- var hash$a = "8c18dd94";
1043
- var wasmJson$a = {
1044
- name: name$a,
1045
- data: data$a,
1046
- hash: hash$a
1047
1182
  };
1048
-
1049
- new Mutex();
1183
+ const isValidPublicKey = (publicKey, isCompressed) => {
1184
+ const { publicKey: comp, publicKeyUncompressed } = lengths;
1185
+ try {
1186
+ const l = publicKey.length;
1187
+ if (isCompressed === true && l !== comp)
1188
+ return false;
1189
+ if (isCompressed === false && l !== publicKeyUncompressed)
1190
+ return false;
1191
+ return !!Point.fromBytes(publicKey);
1192
+ }
1193
+ catch (error) {
1194
+ return false;
1195
+ }
1196
+ };
1197
+ const _sha = 'SHA-256';
1050
1198
  /**
1051
- * Creates a new SHA-2 (SHA-224) hash instance
1199
+ * Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
1200
+ * All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
1201
+ * providers still return exact 32-byte Uint8Array digests.
1202
+ * @example
1203
+ * Provide sync hash helpers before calling the synchronous signing API.
1204
+ * ```ts
1205
+ * import * as secp from '@noble/secp256k1';
1206
+ * import { hmac } from '@noble/hashes/hmac.js';
1207
+ * import { sha256 } from '@noble/hashes/sha2.js';
1208
+ * secp.hashes.sha256 = sha256;
1209
+ * secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
1210
+ * const secretKey = secp.utils.randomSecretKey();
1211
+ * const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
1212
+ * ```
1052
1213
  */
1053
- function createSHA224() {
1054
- return WASMInterface(wasmJson$a, 28).then((wasm) => {
1055
- wasm.init(224);
1056
- const obj = {
1057
- init: () => {
1058
- wasm.init(224);
1059
- return obj;
1060
- },
1061
- update: (data) => {
1062
- wasm.update(data);
1063
- return obj;
1064
- },
1065
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1066
- digest: (outputType) => wasm.digest(outputType),
1067
- save: () => wasm.save(),
1068
- load: (data) => {
1069
- wasm.load(data);
1070
- return obj;
1071
- },
1072
- blockSize: 64,
1073
- digestSize: 28,
1074
- };
1075
- return obj;
1076
- });
1077
- }
1078
-
1079
- new Mutex();
1214
+ const hashes = {
1215
+ hmacSha256Async: async (key, message) => {
1216
+ const s = subtle();
1217
+ const name = 'HMAC';
1218
+ const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
1219
+ return u8n(await s.sign(name, k, message));
1220
+ },
1221
+ hmacSha256: undefined,
1222
+ sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
1223
+ sha256: undefined,
1224
+ };
1080
1225
  /**
1081
- * Creates a new SHA-2 (SHA-256) hash instance
1226
+ * Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
1227
+ * Result is **NOT hashed** and returns the serialized shared point (compressed by default),
1228
+ * not the SEC 1 x-only primitive `z = x_P`.
1229
+ * secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
1230
+ * @param secretKeyA - local 32-byte secret key.
1231
+ * @param publicKeyB - peer public key.
1232
+ * @param isCompressed - return 33-byte compressed output when `true`.
1233
+ * @returns shared secret point bytes.
1234
+ * @example
1235
+ * Derive a shared secp256k1 secret with ECDH.
1236
+ * ```ts
1237
+ * import * as secp from '@noble/secp256k1';
1238
+ * const alice = secp.utils.randomSecretKey();
1239
+ * const bob = secp.utils.randomSecretKey();
1240
+ * const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
1241
+ * ```
1082
1242
  */
1083
- function createSHA256() {
1084
- return WASMInterface(wasmJson$a, 32).then((wasm) => {
1085
- wasm.init(256);
1086
- const obj = {
1087
- init: () => {
1088
- wasm.init(256);
1089
- return obj;
1090
- },
1091
- update: (data) => {
1092
- wasm.update(data);
1093
- return obj;
1094
- },
1095
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1096
- digest: (outputType) => wasm.digest(outputType),
1097
- save: () => wasm.save(),
1098
- load: (data) => {
1099
- wasm.load(data);
1100
- return obj;
1101
- },
1102
- blockSize: 64,
1103
- digestSize: 32,
1104
- };
1105
- return obj;
1106
- });
1107
- }
1108
-
1109
- var name$9 = "sha512";
1110
- var data$9 = "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";
1111
- var hash$9 = "f2e40eb1";
1112
- var wasmJson$9 = {
1113
- name: name$9,
1114
- data: data$9,
1115
- hash: hash$9
1243
+ const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
1244
+ return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
1245
+ };
1246
+ // FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
1247
+ // The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
1248
+ const randomSecretKey = (seed) => {
1249
+ seed = seed === undefined ? randomBytes(lengths.seed) : seed;
1250
+ abytes(seed);
1251
+ // Keep the public range text aligned with the enforced 48-byte FIPS floor.
1252
+ if (seed.length < lengths.seed || seed.length > 1024)
1253
+ return err$1('expected 48-1024b', RangeError);
1254
+ const num = M(bytesToNumBE(seed), N - 1n);
1255
+ return numTo32b(num + 1n);
1256
+ };
1257
+ const createKeygen = (getPublicKey) => (seed) => {
1258
+ const secretKey = randomSecretKey(seed);
1259
+ return {
1260
+ secretKey,
1261
+ publicKey: getPublicKey(secretKey),
1262
+ };
1116
1263
  };
1117
-
1118
- new Mutex();
1119
1264
  /**
1120
- * Creates a new SHA-2 (SHA-384) hash instance
1265
+ * Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
1266
+ * @example
1267
+ * Convert bytes to a hex string with the low-level helper namespace.
1268
+ * ```ts
1269
+ * import { etc } from '@noble/secp256k1';
1270
+ * const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
1271
+ * ```
1121
1272
  */
1122
- function createSHA384() {
1123
- return WASMInterface(wasmJson$9, 48).then((wasm) => {
1124
- wasm.init(384);
1125
- const obj = {
1126
- init: () => {
1127
- wasm.init(384);
1128
- return obj;
1129
- },
1130
- update: (data) => {
1131
- wasm.update(data);
1132
- return obj;
1133
- },
1134
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1135
- digest: (outputType) => wasm.digest(outputType),
1136
- save: () => wasm.save(),
1137
- load: (data) => {
1138
- wasm.load(data);
1139
- return obj;
1140
- },
1141
- blockSize: 128,
1142
- digestSize: 48,
1143
- };
1144
- return obj;
1145
- });
1146
- }
1147
-
1148
- new Mutex();
1273
+ const etc = /* @__PURE__ */ Object.freeze({
1274
+ hexToBytes,
1275
+ bytesToHex,
1276
+ concatBytes,
1277
+ bytesToNumberBE: bytesToNumBE,
1278
+ numberToBytesBE: numTo32b,
1279
+ mod: M,
1280
+ invert: invert, // math utilities; keep public alias type aligned with runtime
1281
+ randomBytes,
1282
+ secretKeyToScalar: secretKeyToScalar,
1283
+ abytes: abytes,
1284
+ });
1149
1285
  /**
1150
- * Creates a new SHA-2 (SHA-512) hash instance
1286
+ * Curve-specific key utilities.
1287
+ * @example
1288
+ * Generate a fresh secret key and derive its public key.
1289
+ * ```ts
1290
+ * import * as secp from '@noble/secp256k1';
1291
+ * const secretKey = secp.utils.randomSecretKey();
1292
+ * const publicKey = secp.getPublicKey(secretKey);
1293
+ * ```
1151
1294
  */
1152
- function createSHA512() {
1153
- return WASMInterface(wasmJson$9, 64).then((wasm) => {
1154
- wasm.init(512);
1155
- const obj = {
1156
- init: () => {
1157
- wasm.init(512);
1158
- return obj;
1159
- },
1160
- update: (data) => {
1161
- wasm.update(data);
1162
- return obj;
1163
- },
1164
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1165
- digest: (outputType) => wasm.digest(outputType),
1166
- save: () => wasm.save(),
1167
- load: (data) => {
1168
- wasm.load(data);
1169
- return obj;
1170
- },
1171
- blockSize: 128,
1172
- digestSize: 64,
1173
- };
1174
- return obj;
1175
- });
1176
- }
1177
-
1178
- new Mutex();
1179
-
1180
- new Mutex();
1181
-
1182
- new Mutex();
1183
-
1184
- new Mutex();
1185
-
1186
- var name$4 = "ripemd160";
1187
- var data$4 = "AGFzbQEAAAABEQRgAAF/YAAAYAF/AGACf38AAwkIAAECAwIBAAIFBAEBAgIGDgJ/AUHgiQULfwBBgAgLB4MBCQZtZW1vcnkCAA5IYXNoX0dldEJ1ZmZlcgAACUhhc2hfSW5pdAABEHJpcGVtZDE2MF91cGRhdGUAAwtIYXNoX1VwZGF0ZQAECkhhc2hfRmluYWwABQ1IYXNoX0dldFN0YXRlAAYOSGFzaF9DYWxjdWxhdGUABwpTVEFURV9TSVpFAwEKzzIIBQBBgAkLOgBBAEHww8uefDYCmIkBQQBC/rnrxemOlZkQNwKQiQFBAEKBxpS6lvHq5m83AoiJAUEAQgA3AoCJAQuPLAEhf0EAIAAoAiQiASAAKAIAIgIgACgCECIDIAIgACgCLCIEIAAoAgwiBSAAKAIEIgYgACgCPCIHIAIgACgCMCIIIAcgACgCCCIJQQAoAoiJASIKQQAoApCJASILQQAoApSJASIMQX9zckEAKAKMiQEiDXNqIAAoAhQiDmpB5peKhQVqQQh3QQAoApiJASIPaiIQQQp3IhFqIAEgDUEKdyISaiACIAtBCnciE2ogDCAAKAIcIhRqIA8gACgCOCIVaiAQIA0gE0F/c3JzakHml4qFBWpBCXcgDGoiFiAQIBJBf3Nyc2pB5peKhQVqQQl3IBNqIhAgFiARQX9zcnNqQeaXioUFakELdyASaiIXIBAgFkEKdyIWQX9zcnNqQeaXioUFakENdyARaiIYIBcgEEEKdyIZQX9zcnNqQeaXioUFakEPdyAWaiIaQQp3IhtqIAAoAhgiECAYQQp3IhxqIAAoAjQiESAXQQp3IhdqIAMgGWogBCAWaiAaIBggF0F/c3JzakHml4qFBWpBD3cgGWoiFiAaIBxBf3Nyc2pB5peKhQVqQQV3IBdqIhcgFiAbQX9zcnNqQeaXioUFakEHdyAcaiIYIBcgFkEKdyIZQX9zcnNqQeaXioUFakEHdyAbaiIaIBggF0EKdyIXQX9zcnNqQeaXioUFakEIdyAZaiIbQQp3IhxqIAUgGkEKdyIdaiAAKAIoIhYgGEEKdyIYaiAGIBdqIAAoAiAiACAZaiAbIBogGEF/c3JzakHml4qFBWpBC3cgF2oiFyAbIB1Bf3Nyc2pB5peKhQVqQQ53IBhqIhggFyAcQX9zcnNqQeaXioUFakEOdyAdaiIZIBggF0EKdyIaQX9zcnNqQeaXioUFakEMdyAcaiIbIBkgGEEKdyIcQX9zcnNqQeaXioUFakEGdyAaaiIdQQp3IhdqIAUgGUEKdyIYaiAQIBpqIBsgGEF/c3FqIB0gGHFqQaSit+IFakEJdyAcaiIaIBdBf3NxaiAEIBxqIB0gG0EKdyIZQX9zcWogGiAZcWpBpKK34gVqQQ13IBhqIhsgF3FqQaSit+IFakEPdyAZaiIcIBtBCnciGEF/c3FqIBQgGWogGyAaQQp3IhlBf3NxaiAcIBlxakGkorfiBWpBB3cgF2oiGyAYcWpBpKK34gVqQQx3IBlqIh1BCnciF2ogFiAcQQp3IhpqIBEgGWogGyAaQX9zcWogHSAacWpBpKK34gVqQQh3IBhqIhwgF0F/c3FqIA4gGGogHSAbQQp3IhhBf3NxaiAcIBhxakGkorfiBWpBCXcgGmoiGiAXcWpBpKK34gVqQQt3IBhqIhsgGkEKdyIZQX9zcWogFSAYaiAaIBxBCnciGEF/c3FqIBsgGHFqQaSit+IFakEHdyAXaiIcIBlxakGkorfiBWpBB3cgGGoiHUEKdyIXaiADIBtBCnciGmogACAYaiAcIBpBf3NxaiAdIBpxakGkorfiBWpBDHcgGWoiGyAXQX9zcWogCCAZaiAdIBxBCnciGEF/c3FqIBsgGHFqQaSit+IFakEHdyAaaiIaIBdxakGkorfiBWpBBncgGGoiHCAaQQp3IhlBf3NxaiABIBhqIBogG0EKdyIYQX9zcWogHCAYcWpBpKK34gVqQQ93IBdqIhogGXFqQaSit+IFakENdyAYaiIbQQp3Ih1qIAYgGkEKdyIeaiAOIBxBCnciF2ogByAZaiAJIBhqIBogF0F/c3FqIBsgF3FqQaSit+IFakELdyAZaiIYIBtBf3NyIB5zakHz/cDrBmpBCXcgF2oiFyAYQX9zciAdc2pB8/3A6wZqQQd3IB5qIhkgF0F/c3IgGEEKdyIYc2pB8/3A6wZqQQ93IB1qIhogGUF/c3IgF0EKdyIXc2pB8/3A6wZqQQt3IBhqIhtBCnciHGogASAaQQp3Ih1qIBAgGUEKdyIZaiAVIBdqIBQgGGogGyAaQX9zciAZc2pB8/3A6wZqQQh3IBdqIhcgG0F/c3IgHXNqQfP9wOsGakEGdyAZaiIYIBdBf3NyIBxzakHz/cDrBmpBBncgHWoiGSAYQX9zciAXQQp3IhdzakHz/cDrBmpBDncgHGoiGiAZQX9zciAYQQp3IhhzakHz/cDrBmpBDHcgF2oiG0EKdyIcaiAWIBpBCnciHWogCSAZQQp3IhlqIAggGGogACAXaiAbIBpBf3NyIBlzakHz/cDrBmpBDXcgGGoiFyAbQX9zciAdc2pB8/3A6wZqQQV3IBlqIhggF0F/c3IgHHNqQfP9wOsGakEOdyAdaiIZIBhBf3NyIBdBCnciF3NqQfP9wOsGakENdyAcaiIaIBlBf3NyIBhBCnciGHNqQfP9wOsGakENdyAXaiIbQQp3IhxqIBEgGGogAyAXaiAbIBpBf3NyIBlBCnciGXNqQfP9wOsGakEHdyAYaiIYIBtBf3NyIBpBCnciGnNqQfP9wOsGakEFdyAZaiIXQQp3IhsgECAaaiAYQQp3Ih0gACAZaiAcIBdBf3NxaiAXIBhxakHp7bXTB2pBD3cgGmoiGEF/c3FqIBggF3FqQenttdMHakEFdyAcaiIXQX9zcWogFyAYcWpB6e210wdqQQh3IB1qIhlBCnciGmogBSAbaiAXQQp3IhwgBiAdaiAYQQp3Ih0gGUF/c3FqIBkgF3FqQenttdMHakELdyAbaiIXQX9zcWogFyAZcWpB6e210wdqQQ53IB1qIhhBCnciGyAHIBxqIBdBCnciHiAEIB1qIBogGEF/c3FqIBggF3FqQenttdMHakEOdyAcaiIXQX9zcWogFyAYcWpB6e210wdqQQZ3IBpqIhhBf3NxaiAYIBdxakHp7bXTB2pBDncgHmoiGUEKdyIaaiAIIBtqIBhBCnciHCAOIB5qIBdBCnciHSAZQX9zcWogGSAYcWpB6e210wdqQQZ3IBtqIhdBf3NxaiAXIBlxakHp7bXTB2pBCXcgHWoiGEEKdyIbIBEgHGogF0EKdyIeIAkgHWogGiAYQX9zcWogGCAXcWpB6e210wdqQQx3IBxqIhdBf3NxaiAXIBhxakHp7bXTB2pBCXcgGmoiGEF/c3FqIBggF3FqQenttdMHakEMdyAeaiIZQQp3IhogB2ogFSAXQQp3IhxqIBogFiAbaiAYQQp3Ih0gFCAeaiAcIBlBf3NxaiAZIBhxakHp7bXTB2pBBXcgG2oiF0F/c3FqIBcgGXFqQenttdMHakEPdyAcaiIYQX9zcWogGCAXcWpB6e210wdqQQh3IB1qIhkgGEEKdyIbcyAdIAhqIBggF0EKdyIXcyAZc2pBCHcgGmoiGHNqQQV3IBdqIhpBCnciHCAAaiAZQQp3IhkgBmogFyAWaiAYIBlzIBpzakEMdyAbaiIXIBxzIBsgA2ogGiAYQQp3IhhzIBdzakEJdyAZaiIZc2pBDHcgGGoiGiAZQQp3IhtzIBggDmogGSAXQQp3IhdzIBpzakEFdyAcaiIYc2pBDncgF2oiGUEKdyIcIBVqIBpBCnciGiAJaiAXIBRqIBggGnMgGXNqQQZ3IBtqIhcgHHMgGyAQaiAZIBhBCnciGHMgF3NqQQh3IBpqIhlzakENdyAYaiIaIBlBCnciG3MgGCARaiAZIBdBCnciGHMgGnNqQQZ3IBxqIhlzakEFdyAYaiIcQQp3Ih0gDGogBCAWIA4gDiARIBYgDiAUIAEgACABIBAgFCAEIBAgBiAPaiATIA1zIAsgDXMgDHMgCmogAmpBC3cgD2oiF3NqQQ53IAxqIh5BCnciH2ogAyASaiAJIAxqIBcgEnMgHnNqQQ93IBNqIgwgH3MgBSATaiAeIBdBCnciE3MgDHNqQQx3IBJqIhJzakEFdyATaiIXIBJBCnciHnMgEyAOaiASIAxBCnciDHMgF3NqQQh3IB9qIhJzakEHdyAMaiITQQp3Ih9qIAEgF0EKdyIXaiAMIBRqIBIgF3MgE3NqQQl3IB5qIgwgH3MgHiAAaiATIBJBCnciEnMgDHNqQQt3IBdqIhNzakENdyASaiIXIBNBCnciHnMgEiAWaiATIAxBCnciDHMgF3NqQQ53IB9qIhJzakEPdyAMaiITQQp3Ih9qIB4gEWogEyASQQp3IiBzIAwgCGogEiAXQQp3IgxzIBNzakEGdyAeaiISc2pBB3cgDGoiE0EKdyIXICAgB2ogEyASQQp3Ih5zIAwgFWogEiAfcyATc2pBCXcgIGoiE3NqQQh3IB9qIgxBf3NxaiAMIBNxakGZ84nUBWpBB3cgHmoiEkEKdyIfaiARIBdqIAxBCnciICADIB5qIBNBCnciEyASQX9zcWogEiAMcWpBmfOJ1AVqQQZ3IBdqIgxBf3NxaiAMIBJxakGZ84nUBWpBCHcgE2oiEkEKdyIXIBYgIGogDEEKdyIeIAYgE2ogHyASQX9zcWogEiAMcWpBmfOJ1AVqQQ13ICBqIgxBf3NxaiAMIBJxakGZ84nUBWpBC3cgH2oiEkF/c3FqIBIgDHFqQZnzidQFakEJdyAeaiITQQp3Ih9qIAUgF2ogEkEKdyIgIAcgHmogDEEKdyIeIBNBf3NxaiATIBJxakGZ84nUBWpBB3cgF2oiDEF/c3FqIAwgE3FqQZnzidQFakEPdyAeaiISQQp3IhcgAiAgaiAMQQp3IiEgCCAeaiAfIBJBf3NxaiASIAxxakGZ84nUBWpBB3cgIGoiDEF/c3FqIAwgEnFqQZnzidQFakEMdyAfaiISQX9zcWogEiAMcWpBmfOJ1AVqQQ93ICFqIhNBCnciHmogCSAXaiASQQp3Ih8gDiAhaiAMQQp3IiAgE0F/c3FqIBMgEnFqQZnzidQFakEJdyAXaiIMQX9zcWogDCATcWpBmfOJ1AVqQQt3ICBqIhJBCnciEyAEIB9qIAxBCnciFyAVICBqIB4gEkF/c3FqIBIgDHFqQZnzidQFakEHdyAfaiIMQX9zcWogDCAScWpBmfOJ1AVqQQ13IB5qIhJBf3MiIHFqIBIgDHFqQZnzidQFakEMdyAXaiIeQQp3Ih9qIAMgEkEKdyISaiAVIAxBCnciDGogFiATaiAFIBdqIB4gIHIgDHNqQaHX5/YGakELdyATaiITIB5Bf3NyIBJzakGh1+f2BmpBDXcgDGoiDCATQX9zciAfc2pBodfn9gZqQQZ3IBJqIhIgDEF/c3IgE0EKdyITc2pBodfn9gZqQQd3IB9qIhcgEkF/c3IgDEEKdyIMc2pBodfn9gZqQQ53IBNqIh5BCnciH2ogCSAXQQp3IiBqIAYgEkEKdyISaiAAIAxqIAcgE2ogHiAXQX9zciASc2pBodfn9gZqQQl3IAxqIgwgHkF/c3IgIHNqQaHX5/YGakENdyASaiISIAxBf3NyIB9zakGh1+f2BmpBD3cgIGoiEyASQX9zciAMQQp3IgxzakGh1+f2BmpBDncgH2oiFyATQX9zciASQQp3IhJzakGh1+f2BmpBCHcgDGoiHkEKdyIfaiAEIBdBCnciIGogESATQQp3IhNqIBAgEmogAiAMaiAeIBdBf3NyIBNzakGh1+f2BmpBDXcgEmoiDCAeQX9zciAgc2pBodfn9gZqQQZ3IBNqIhIgDEF/c3IgH3NqQaHX5/YGakEFdyAgaiITIBJBf3NyIAxBCnciF3NqQaHX5/YGakEMdyAfaiIeIBNBf3NyIBJBCnciEnNqQaHX5/YGakEHdyAXaiIfQQp3IgxqIAEgE0EKdyITaiAIIBdqIB8gHkF/c3IgE3NqQaHX5/YGakEFdyASaiIXIAxBf3NxaiAGIBJqIB8gHkEKdyISQX9zcWogFyAScWpB3Pnu+HhqQQt3IBNqIh4gDHFqQdz57vh4akEMdyASaiIfIB5BCnciE0F/c3FqIAQgEmogHiAXQQp3IhJBf3NxaiAfIBJxakHc+e74eGpBDncgDGoiHiATcWpB3Pnu+HhqQQ93IBJqIiBBCnciDGogCCAfQQp3IhdqIAIgEmogHiAXQX9zcWogICAXcWpB3Pnu+HhqQQ53IBNqIh8gDEF/c3FqIAAgE2ogICAeQQp3IhJBf3NxaiAfIBJxakHc+e74eGpBD3cgF2oiFyAMcWpB3Pnu+HhqQQl3IBJqIh4gF0EKdyITQX9zcWogAyASaiAXIB9BCnciEkF/c3FqIB4gEnFqQdz57vh4akEIdyAMaiIfIBNxakHc+e74eGpBCXcgEmoiIEEKdyIMaiAHIB5BCnciF2ogBSASaiAfIBdBf3NxaiAgIBdxakHc+e74eGpBDncgE2oiHiAMQX9zcWogFCATaiAgIB9BCnciEkF/c3FqIB4gEnFqQdz57vh4akEFdyAXaiIXIAxxakHc+e74eGpBBncgEmoiHyAXQQp3IhNBf3NxaiAVIBJqIBcgHkEKdyISQX9zcWogHyAScWpB3Pnu+HhqQQh3IAxqIhcgE3FqQdz57vh4akEGdyASaiIeQQp3IiBqIAIgF0EKdyIOaiADIB9BCnciDGogCSATaiAeIA5Bf3NxaiAQIBJqIBcgDEF/c3FqIB4gDHFqQdz57vh4akEFdyATaiIDIA5xakHc+e74eGpBDHcgDGoiDCADICBBf3Nyc2pBzvrPynpqQQl3IA5qIg4gDCADQQp3IgNBf3Nyc2pBzvrPynpqQQ93ICBqIhIgDiAMQQp3IgxBf3Nyc2pBzvrPynpqQQV3IANqIhNBCnciF2ogCSASQQp3IhZqIAggDkEKdyIJaiAUIAxqIAEgA2ogEyASIAlBf3Nyc2pBzvrPynpqQQt3IAxqIgMgEyAWQX9zcnNqQc76z8p6akEGdyAJaiIIIAMgF0F/c3JzakHO+s/KempBCHcgFmoiCSAIIANBCnciA0F/c3JzakHO+s/KempBDXcgF2oiDiAJIAhBCnciCEF/c3JzakHO+s/KempBDHcgA2oiFEEKdyIWaiAAIA5BCnciDGogBSAJQQp3IgBqIAYgCGogFSADaiAUIA4gAEF/c3JzakHO+s/KempBBXcgCGoiAyAUIAxBf3Nyc2pBzvrPynpqQQx3IABqIgAgAyAWQX9zcnNqQc76z8p6akENdyAMaiIGIAAgA0EKdyIDQX9zcnNqQc76z8p6akEOdyAWaiIIIAYgAEEKdyIAQX9zcnNqQc76z8p6akELdyADaiIJQQp3IhVqNgKQiQFBACALIBggAmogGSAaQQp3IgJzIBxzakEPdyAbaiIOQQp3IhZqIBAgA2ogCSAIIAZBCnciA0F/c3JzakHO+s/KempBCHcgAGoiBkEKd2o2AoyJAUEAIA0gGyAFaiAcIBlBCnciBXMgDnNqQQ13IAJqIhRBCndqIAcgAGogBiAJIAhBCnciAEF/c3JzakHO+s/KempBBXcgA2oiB2o2AoiJAUEAIAAgCmogAiABaiAOIB1zIBRzakELdyAFaiIBaiARIANqIAcgBiAVQX9zcnNqQc76z8p6akEGd2o2ApiJAUEAIAAgD2ogHWogBSAEaiAUIBZzIAFzakELd2o2ApSJAQuiAwEIfwJAIAFFDQBBACECQQBBACgCgIkBIgMgAWoiBDYCgIkBIANBP3EhBQJAIAQgA08NAEEAQQAoAoSJAUEBajYChIkBCwJAIAVFDQACQCABQcAAIAVrIgZPDQAgBSECDAELIAZBA3EhB0EAIQMCQCAFQT9zQQNJDQAgBUGAiQFqIQggBkH8AHEhCUEAIQMDQCAIIANqIgJBHGogACADaiIELQAAOgAAIAJBHWogBEEBai0AADoAACACQR5qIARBAmotAAA6AAAgAkEfaiAEQQNqLQAAOgAAIAkgA0EEaiIDRw0ACwsCQCAHRQ0AIAAgA2ohAiADIAVqQZyJAWohAwNAIAMgAi0AADoAACACQQFqIQIgA0EBaiEDIAdBf2oiBw0ACwtBnIkBEAIgASAGayEBIAAgBmohAEEAIQILAkAgAUHAAEkNAANAIAAQAiAAQcAAaiEAIAFBQGoiAUE/Sw0ACwsgAUUNACACQZyJAWohA0EAIQIDQCADIAAtAAA6AAAgAEEBaiEAIANBAWohAyABIAJBAWoiAkH/AXFLDQALCwsJAEGACSAAEAMLggEBAn8jAEEQayIAJAAgAEEAKAKAiQEiAUEDdDYCCCAAQQAoAoSJAUEDdCABQR12cjYCDEGQCEE4QfgAIAFBP3EiAUE4SRsgAWsQAyAAQQhqQQgQA0EAQQAoAoiJATYCgAlBAEEAKQKMiQE3AoQJQQBBACkClIkBNwKMCSAAQRBqJAALBgBBgIkBC8EBAQF/IwBBEGsiASQAQQBB8MPLnnw2ApiJAUEAQv6568XpjpWZEDcCkIkBQQBCgcaUupbx6uZvNwKIiQFBAEIANwKAiQFBgAkgABADIAFBACgCgIkBIgBBA3Q2AgggAUEAKAKEiQFBA3QgAEEddnI2AgxBkAhBOEH4ACAAQT9xIgBBOEkbIABrEAMgAUEIakEIEANBAEEAKAKIiQE2AoAJQQBBACkCjIkBNwKECUEAQQApApSJATcCjAkgAUEQaiQACwtXAQBBgAgLUFwAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
1188
- var hash$4 = "6abbce74";
1189
- var wasmJson$4 = {
1190
- name: name$4,
1191
- data: data$4,
1192
- hash: hash$4
1295
+ const utils$2 = /* @__PURE__ */ Object.freeze({
1296
+ isValidSecretKey: isValidSecretKey,
1297
+ isValidPublicKey: isValidPublicKey,
1298
+ randomSecretKey: randomSecretKey, // preserve the optional seeded call
1299
+ });
1300
+ // Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
1301
+ // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
1302
+ // Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
1303
+ const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
1304
+ const T_AUX = 'aux';
1305
+ const T_NONCE = 'nonce';
1306
+ const T_CHALLENGE = 'challenge';
1307
+ // Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
1308
+ // wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
1309
+ const taggedHash = (tag, ...messages) => {
1310
+ const tagH = gh('sha256', getTag(tag));
1311
+ return gh('sha256', concatBytes(tagH, tagH, ...messages));
1193
1312
  };
1194
-
1195
- new Mutex();
1313
+ // Async twin of taggedHash with the same checked provider boundary.
1314
+ const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
1315
+ // BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
1316
+ // d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
1317
+ const extpubSchnorr = (priv) => {
1318
+ const d_ = secretKeyToScalar(priv);
1319
+ const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
1320
+ const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
1321
+ const d = isEven(y) ? d_ : modN(-d_);
1322
+ const px = numTo32b(x);
1323
+ return { d, px };
1324
+ };
1325
+ const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
1326
+ const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
1327
+ const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
1328
+ /** Schnorr public key is just `x` coordinate of Point as per BIP340. */
1329
+ const pubSchnorr = (secretKey) => {
1330
+ return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
1331
+ };
1332
+ const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
1333
+ // Common preparation fn for both sync and async signing
1334
+ const prepSigSchnorr = (message, secretKey, auxRand) => {
1335
+ const { px, d } = extpubSchnorr(secretKey);
1336
+ return { m: abytes(message), px, d, a: abytes(auxRand, L) };
1337
+ };
1338
+ const extractK = (rand) => {
1339
+ const k_ = bytesModN(rand); // Let k' = int(rand) mod n
1340
+ if (k_ === 0n)
1341
+ err$1('sign failed: k is zero'); // Fail if k' = 0.
1342
+ const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
1343
+ return { rx: px, k: d };
1344
+ };
1345
+ // Common signature creation helper
1346
+ const createSigSchnorr = (k, px, e, d) => {
1347
+ return concatBytes(px, numTo32b(modN(k + e * d)));
1348
+ };
1349
+ const E_INVSIG = 'invalid signature produced';
1196
1350
  /**
1197
- * Creates a new RIPEMD-160 hash instance
1351
+ * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
1352
+ * auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
1353
+ * k generation, so bad CSPRNG won't be the only entropy source.
1198
1354
  */
1199
- function createRIPEMD160() {
1200
- return WASMInterface(wasmJson$4, 20).then((wasm) => {
1201
- wasm.init();
1202
- const obj = {
1203
- init: () => {
1204
- wasm.init();
1205
- return obj;
1206
- },
1207
- update: (data) => {
1208
- wasm.update(data);
1209
- return obj;
1210
- },
1211
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1212
- digest: (outputType) => wasm.digest(outputType),
1213
- save: () => wasm.save(),
1214
- load: (data) => {
1215
- wasm.load(data);
1216
- return obj;
1217
- },
1218
- blockSize: 64,
1219
- digestSize: 20,
1220
- };
1221
- return obj;
1222
- });
1223
- }
1224
-
1225
- function calculateKeyBuffer(hasher, key) {
1226
- const { blockSize } = hasher;
1227
- const buf = getUInt8Buffer(key);
1228
- if (buf.length > blockSize) {
1229
- hasher.update(buf);
1230
- const uintArr = hasher.digest("binary");
1231
- hasher.init();
1232
- return uintArr;
1355
+ const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
1356
+ const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
1357
+ const aux = taggedHash(T_AUX, a);
1358
+ // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
1359
+ const t = numTo32b(d ^ bytesToNumBE(aux));
1360
+ // Let rand = hash/nonce(t || bytes(P) || m)
1361
+ const rand = taggedHash(T_NONCE, t, px, m);
1362
+ const { rx, k } = extractK(rand);
1363
+ // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
1364
+ const e = challenge(rx, px, m);
1365
+ const sig = createSigSchnorr(k, rx, e, d);
1366
+ // If Verify(bytes(P), m, sig) (see below) returns failure, abort
1367
+ if (!verifySchnorr(sig, m, px))
1368
+ err$1(E_INVSIG);
1369
+ return sig;
1370
+ };
1371
+ const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
1372
+ const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
1373
+ const aux = await taggedHashAsync(T_AUX, a);
1374
+ // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
1375
+ const t = numTo32b(d ^ bytesToNumBE(aux));
1376
+ // Let rand = hash/nonce(t || bytes(P) || m)
1377
+ const rand = await taggedHashAsync(T_NONCE, t, px, m);
1378
+ const { rx, k } = extractK(rand);
1379
+ // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
1380
+ const e = await challengeAsync(rx, px, m);
1381
+ const sig = createSigSchnorr(k, rx, e, d);
1382
+ // If Verify(bytes(P), m, sig) (see below) returns failure, abort
1383
+ if (!(await verifySchnorrAsync(sig, m, px)))
1384
+ err$1(E_INVSIG);
1385
+ return sig;
1386
+ };
1387
+ const callSyncAsyncFn = (res, later) => {
1388
+ return res instanceof Promise ? res.then(later) : later(res);
1389
+ };
1390
+ const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
1391
+ const sig = abytes(signature, L2, 'signature');
1392
+ const msg = abytes(message, undefined, 'message');
1393
+ const pub = abytes(publicKey, L, 'publicKey');
1394
+ try {
1395
+ // lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
1396
+ // Fail if x ≥ p. Let c = x³ + 7 mod p.
1397
+ const x = bytesToNumBE(pub);
1398
+ const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
1399
+ const P_ = new Point(x, y, 1n).assertValidity();
1400
+ const px = numTo32b(P_.toAffine().x);
1401
+ // P = lift_x(int(pk)); fail if that fails
1402
+ const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
1403
+ arange(r, 1n, P);
1404
+ const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
1405
+ // Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
1406
+ // s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
1407
+ // crafted edge cases and fail closed instead of carrying that extra verification surface.
1408
+ arange(s, 1n, N);
1409
+ const i = concatBytes(numTo32b(r), px, msg);
1410
+ // int(challenge(bytes(r)||bytes(P)||m))%n
1411
+ return callSyncAsyncFn(challengeFn(i), (e) => {
1412
+ const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
1413
+ if (!isEven(y) || x !== r)
1414
+ return false; // -eP == (n-e)P
1415
+ return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
1416
+ });
1233
1417
  }
1234
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
1235
- }
1236
- function calculateHmac(hasher, key) {
1237
- hasher.init();
1238
- const { blockSize } = hasher;
1239
- const keyBuf = calculateKeyBuffer(hasher, key);
1240
- const keyBuffer = new Uint8Array(blockSize);
1241
- keyBuffer.set(keyBuf);
1242
- const opad = new Uint8Array(blockSize);
1243
- for (let i = 0; i < blockSize; i++) {
1244
- const v = keyBuffer[i];
1245
- opad[i] = v ^ 0x5c;
1246
- keyBuffer[i] = v ^ 0x36;
1418
+ catch (error) {
1419
+ return false;
1247
1420
  }
1248
- hasher.update(keyBuffer);
1249
- const obj = {
1250
- init: () => {
1251
- hasher.init();
1252
- hasher.update(keyBuffer);
1253
- return obj;
1254
- },
1255
- update: (data) => {
1256
- hasher.update(data);
1257
- return obj;
1258
- },
1259
- digest: ((outputType) => {
1260
- const uintArr = hasher.digest("binary");
1261
- hasher.init();
1262
- hasher.update(opad);
1263
- hasher.update(uintArr);
1264
- return hasher.digest(outputType);
1265
- // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
1266
- }),
1267
- save: () => {
1268
- throw new Error("save() not supported");
1269
- },
1270
- load: () => {
1271
- throw new Error("load() not supported");
1272
- },
1273
- blockSize: hasher.blockSize,
1274
- digestSize: hasher.digestSize,
1275
- };
1276
- return obj;
1277
- }
1278
- /**
1279
- * Calculates HMAC hash
1280
- * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
1281
- * @param key Key (string, Buffer or TypedArray)
1282
- */
1283
- function createHMAC(hash, key) {
1284
- if (!hash || !hash.then) {
1285
- throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
1286
- }
1287
- return hash.then((hasher) => calculateHmac(hasher, key));
1288
- }
1289
-
1290
- new Mutex();
1291
-
1292
- new Mutex();
1293
-
1294
- const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
1295
-
1296
- const { subtle: subtle$1 } = crypto;
1297
-
1421
+ };
1422
+ /** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
1423
+ * after the initial byte checks. */
1424
+ const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
1425
+ /** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
1426
+ * become false, but async backend failures reject the promise. Missing crypto.subtle is a
1427
+ * runtime/backend error, not an "invalid signature" result, so we surface it instead of
1428
+ * turning it into false. */
1429
+ const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
1298
1430
  /**
1299
- * ```js
1300
- * const {createHash} = await import('@leofcoin/crypto')
1301
- * createHash(data, algorithm)
1431
+ * BIP340 Schnorr helpers over secp256k1.
1432
+ * @example
1433
+ * Sign and verify a BIP340 Schnorr signature.
1434
+ * ```ts
1435
+ * import * as secp from '@noble/secp256k1';
1436
+ * import { sha256 } from '@noble/hashes/sha2.js';
1437
+ * secp.hashes.sha256 = sha256;
1438
+ * const secretKey = secp.utils.randomSecretKey();
1439
+ * const message = new Uint8Array([1, 2, 3]);
1440
+ * const sig = secp.schnorr.sign(message, secretKey);
1441
+ * const publicKey = secp.schnorr.getPublicKey(secretKey);
1442
+ * const isValid = secp.schnorr.verify(sig, message, publicKey);
1302
1443
  * ```
1303
- * @param {Uint8Array} data
1304
- * @param {string} algorithm
1305
- * @returns Uint8Array
1306
1444
  */
1307
- const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
1308
-
1445
+ const schnorr = /* @__PURE__ */ Object.freeze({
1446
+ keygen: keygenSchnorr,
1447
+ getPublicKey: pubSchnorr,
1448
+ sign: signSchnorr,
1449
+ verify: verifySchnorr,
1450
+ signAsync: signSchnorrAsync,
1451
+ verifyAsync: verifySchnorrAsync,
1452
+ });
1453
+ // ## Precomputes
1454
+ // --------------
1455
+ const W = 8; // W is window size
1456
+ const scalarBits = 256;
1457
+ const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
1458
+ const pwindowSize = 2 ** (W - 1); // 128 for W=8
1459
+ const precompute = () => {
1460
+ const points = [];
1461
+ let p = G;
1462
+ let b = p;
1463
+ for (let w = 0; w < pwindows; w++) {
1464
+ b = p;
1465
+ points.push(b);
1466
+ for (let i = 1; i < pwindowSize; i++) {
1467
+ b = b.add(p);
1468
+ points.push(b);
1469
+ } // i=1, bc we skip 0
1470
+ p = b.double();
1471
+ }
1472
+ return points;
1473
+ };
1474
+ let Gpows = undefined; // precomputes for base point G
1475
+ // Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
1476
+ const ctneg = (cnd, p) => {
1477
+ const n = p.negate();
1478
+ return cnd ? n : p;
1479
+ };
1309
1480
  /**
1310
- * Hashes the created hash again
1311
- * ```js
1312
- * const {createDoubleHash} = await import('@leofcoin/crypto')
1313
- * createDoubleHash(data, algorithm)
1314
- * ```
1315
- * @param {Uint8Array} data
1316
- * @param {string} algorithm
1317
- * @returns Uint8Array
1481
+ * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
1482
+ * caching multiples of G (base point). Cache is stored in 32MB of RAM.
1483
+ * Any time `G.multiply` is done, precomputes are used.
1484
+ * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
1485
+ *
1486
+ * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
1487
+ * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
1488
+ *
1489
+ * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
1318
1490
  */
1319
- const createDoubleHash = async (data, algorithm = 'SHA-512') =>
1320
- subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
1321
-
1322
- const generatePbkdf2 = async (password) => {
1323
- return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
1491
+ const wNAF = (n) => {
1492
+ const comp = Gpows || (Gpows = precompute());
1493
+ let p = I;
1494
+ let f = G; // f must be G, or could become I in the end
1495
+ const pow_2_w = 2 ** W; // 256 for W=8
1496
+ const maxNum = pow_2_w; // 256 for W=8
1497
+ const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
1498
+ const shiftBy = big(W); // 8 for W=8
1499
+ for (let w = 0; w < pwindows; w++) {
1500
+ let wbits = Number(n & mask); // extract W bits.
1501
+ n >>= shiftBy; // shift number by W bits.
1502
+ // We use negative indexes to reduce size of precomputed table by 2x.
1503
+ // Instead of needing precomputes 0..256, we only calculate them for 0..128.
1504
+ // If an index > 128 is found, we do (256-index) - where 256 is next window.
1505
+ // Naive: index +127 => 127, +224 => 224
1506
+ // Optimized: index +127 => 127, +224 => 256-32
1507
+ if (wbits > pwindowSize) {
1508
+ wbits -= maxNum;
1509
+ n += 1n;
1510
+ }
1511
+ const off = w * pwindowSize;
1512
+ const offF = off; // offsets, evaluate both
1513
+ const offP = off + Math.abs(wbits) - 1;
1514
+ const isEven = w % 2 !== 0; // conditions, evaluate both
1515
+ const isNeg = wbits < 0;
1516
+ if (wbits === 0) {
1517
+ // off == I: can't add it. Adding random offF instead.
1518
+ f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
1519
+ }
1520
+ else {
1521
+ p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
1522
+ }
1523
+ }
1524
+ if (n !== 0n)
1525
+ err$1('invalid wnaf');
1526
+ return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
1324
1527
  };
1325
1528
 
1326
- const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
1327
- const key = await generatePbkdf2(password);
1328
- return subtle$1.deriveBits(
1329
- {
1330
- name: 'PBKDF2',
1331
- hash,
1332
- salt,
1333
- iterations
1529
+ const leofcoinOlivia = {
1530
+ messagePrefix: '\u0019Leofcoin Signed Message:',
1531
+ version: 1,
1532
+ pubKeyHash: 0x73, // o
1533
+ scriptHash: 0x76, // p
1534
+ multiTxHash: 0x8b4125, // omtx
1535
+ payments: {
1536
+ version: 0,
1537
+ unspent: 0x1fa443d7 // ounsp
1334
1538
  },
1335
- key,
1336
- length
1337
- )
1539
+ wif: 0x7D, // s
1540
+ multiCodec: 0x7c4,
1541
+ bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
1338
1542
  };
1339
-
1340
- var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
1341
- if (!options) options = {};
1342
-
1343
- if (typeof options.seperator === 'string')
1344
- options.seperator = new TextEncoder().encode(options.seperator);
1345
-
1346
- const length = options.length || input.reduce((total, current, i) => {
1347
- total += current.length;
1348
- if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
1349
- return total
1350
- }, 0);
1351
-
1352
- const typedArray = new Uint8Array(length);
1353
-
1354
- let currentIndex = 0;
1355
- let index = 0;
1356
- for (const source of input) {
1357
- typedArray.set(source, currentIndex);
1358
- if (options.seperator && input.length - 1 > index) {
1359
- typedArray.set(options.seperator, currentIndex + source.length);
1360
- currentIndex+= options.seperator.length;
1361
- }
1362
- currentIndex += source.length;
1363
- index += 1;
1364
- }
1365
-
1366
- return typedArray
1543
+ const bitcoinTestnet = {
1544
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
1545
+ version: 1,
1546
+ bech32: 'tb',
1547
+ pubKeyHash: 0x6f,
1548
+ scriptHash: 0xc4,
1549
+ wif: 0xef,
1550
+ bip32: {
1551
+ public: 0x043587cf,
1552
+ private: 0x04358394
1553
+ },
1554
+ multiCodec: 0
1555
+ };
1556
+ var testnets = {
1557
+ 'leofcoin:olivia': leofcoinOlivia,
1558
+ 'bitcoin:testnet': bitcoinTestnet
1367
1559
  };
1368
1560
 
1369
- const concatAndDoubleHash = async (input) => {
1370
- return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
1371
- };
1372
-
1373
- const encode$1$1 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
1374
- if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
1375
- throw new TypeError('Expected Uint8Array');
1376
- }
1377
- const hash = await concatAndDoubleHash([
1378
- prefix,
1379
- source
1380
- ]);
1381
- const uint8Array = typedArrayConcat([
1382
- prefix,
1383
- source,
1384
- hash.subarray(0, 4)
1385
- ]);
1386
- if (hex)
1387
- return base58$1.encodeHex(uint8Array);
1388
- return base58$1.encode(uint8Array);
1389
- };
1390
- const decode$2 = async (string, hex) => {
1391
- let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
1392
- const prefix = uint8Array.subarray(0, 2);
1393
- const source = uint8Array.subarray(2, -4);
1394
- const hash = await concatAndDoubleHash([
1395
- prefix,
1396
- source
1397
- ]);
1398
- let index = 0;
1399
- const slice = uint8Array.subarray(-4);
1400
- for (const check of slice) {
1401
- if (check !== hash[index]) {
1402
- throw new Error('Invalid checksum');
1403
- }
1404
- index++;
1405
- }
1406
- return { prefix, data: source };
1407
- };
1408
- const isBase58check = (string, hex) => {
1409
- try {
1410
- hex ? decode$2(string, true) : decode$2(string);
1411
- return true;
1412
- }
1413
- catch (e) {
1414
- return false;
1415
- }
1416
- };
1417
- const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$1$1(uint8Array, prefix, true);
1418
- const decodeHex = (string) => decode$2(string, true);
1419
- const isBase58checkHex = (string) => isBase58check(string, true);
1420
- var base58check = { encode: encode$1$1, decode: decode$2, encodeHex, decodeHex, isBase58check, isBase58checkHex };
1421
-
1422
- const decode$1$1 = (multiWif, expectedVersion, expectedCodec) => {
1423
- const decoded = base58$1.decode(multiWif);
1424
- let [version, codec, privateKey] = index$1$1(decoded);
1425
- version = Number(new TextDecoder().decode(version));
1426
- codec = Number(new TextDecoder().decode(codec));
1427
- if (expectedVersion && version !== expectedVersion)
1428
- throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
1429
- if (expectedCodec && codec !== expectedCodec)
1430
- throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
1431
- return { version, codec, privateKey };
1432
- };
1433
- var index$5 = {
1434
- encode: (version, codec, privateKey) => {
1435
- return base58$1.encode(index$2([
1436
- new TextEncoder().encode(version.toString()),
1437
- new TextEncoder().encode(codec.toString()),
1438
- privateKey
1439
- ]));
1440
- },
1441
- decode: decode$1$1,
1442
- isMultiWif: (multiWif) => {
1443
- try {
1444
- const { version, codec, privateKey } = decode$1$1(multiWif);
1445
- if (version === undefined)
1446
- return false;
1447
- if (codec === undefined)
1448
- return false;
1449
- if (privateKey === undefined)
1450
- return false;
1451
- if (privateKey && privateKey.length !== 32)
1452
- return false;
1453
- }
1454
- catch {
1455
- return false;
1456
- }
1457
- return true;
1458
- }
1459
- };
1460
-
1461
- /*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
1462
- /**
1463
- * 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
1464
- * Compliant with RFC6979 & BIP340.
1465
- * @module
1466
- */
1561
+ // https://en.bitcoin.it/wiki/List_of_address_prefixes
1562
+ // usage:
1563
+ // networks['bitcoin']['testnet']
1564
+ // networks.bitcoin.testnet
1467
1565
  /**
1468
- * Curve params from SEC 2 v2 §2.4.1.
1469
- * secp256k1 is a short Weierstrass / Koblitz curve with equation
1470
- * `y² == x³ + ax + b`.
1471
- * * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
1472
- * * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
1473
- * * h = `1n` // cofactor
1474
- * * a = `0n` // equation param
1475
- * * b = `7n` // equation param
1476
- * * Gx, Gy are coordinates of Generator / base point
1566
+ * Main network
1567
+ * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
1477
1568
  */
1478
- // Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
1479
- // callers cannot mutate them out from under the arithmetic constants captured below.
1480
- const secp256k1_CURVE = Object.freeze({
1481
- p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
1482
- n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
1483
- h: 1n,
1484
- a: 0n,
1485
- b: 7n,
1486
- Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
1487
- Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
1488
- });
1489
- const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
1490
- // 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
1491
- // by the RFC6979 paths here.
1492
- const L = 32;
1493
- const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
1494
- const lengths = {
1495
- publicKey: L + 1,
1496
- publicKeyUncompressed: L2 + 1,
1497
- // 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
1498
- // 352-bit recommendation for 256-bit prime curves.
1499
- seed: L + L / 2,
1500
- };
1501
- // Helpers and Precomputes sections are reused between libraries
1502
- // ## Helpers
1503
- // ----------
1504
- const err$1 = (message = '', E = Error) => {
1505
- const e = new E(message);
1506
- const { captureStackTrace } = Error;
1507
- if (typeof captureStackTrace === 'function')
1508
- captureStackTrace(e, err$1);
1509
- throw e;
1510
- };
1511
- // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
1512
- // fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
1513
- // spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
1514
- const isBytes = (a) => a instanceof Uint8Array ||
1515
- (ArrayBuffer.isView(a) &&
1516
- a.constructor.name === 'Uint8Array' &&
1517
- a.BYTES_PER_ELEMENT === 1);
1518
- /** Asserts something is Bytes. */
1519
- const abytes = (value, length, title = '') => {
1520
- const bytes = isBytes(value);
1521
- const len = value?.length;
1522
- const needsLen = length !== undefined;
1523
- if (!bytes || (needsLen && len !== length)) {
1524
- const prefix = title && `"${title}" `;
1525
- const ofLen = needsLen ? ` of length ${length}` : '';
1526
- const got = bytes ? `length=${len}` : `type=${typeof value}`;
1527
- const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
1528
- return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
1529
- }
1530
- return value;
1569
+ const leofcoin = {
1570
+ messagePrefix: '\u0019Leofcoin Signed Message:',
1571
+ version: 1,
1572
+ pubKeyHash: 0x30, // L
1573
+ scriptHash: 0x37, // P
1574
+ multiTxHash: 0x3adeed, // Lmtx
1575
+ payments: {
1576
+ version: 0,
1577
+ unspent: 0x0d6e0327 // Lunsp
1578
+ },
1579
+ coin_type: 640,
1580
+ wif: 0x3F, // S
1581
+ multiCodec: 0x3c4,
1582
+ bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
1583
+ testnet: testnets['leofcoin:olivia']
1531
1584
  };
1532
- /** create Uint8Array */
1533
- const u8n = (len) => new Uint8Array(len);
1534
- // Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
1535
- const padh = (n, pad) => n.toString(16).padStart(pad, '0');
1536
- /** Render bytes as lowercase hex. */
1537
- const bytesToHex = (b) => {
1538
- let hex = '';
1539
- for (const e of abytes(b))
1540
- hex += padh(e, 2);
1541
- return hex;
1585
+ const bitcoin = {
1586
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
1587
+ version: 1,
1588
+ bech32: 'bc',
1589
+ pubKeyHash: 0x00,
1590
+ multiCodec: 0x00,
1591
+ scriptHash: 0x05,
1592
+ wif: 0x80,
1593
+ coin_type: 0,
1594
+ bip32: {
1595
+ public: 0x0488b21e, private: 0x0488ade4
1596
+ },
1597
+ testnet: testnets['bitcoin:testnet']
1542
1598
  };
1543
- const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
1544
- // Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
1545
- // prettier-ignore
1546
- const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
1547
- : ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
1548
- : ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
1549
- : undefined;
1550
- const hexToBytes = (hex) => {
1551
- const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
1552
- if (typeof hex !== 'string')
1553
- return err$1(e);
1554
- const hl = hex.length;
1555
- const al = hl / 2;
1556
- if (hl % 2)
1557
- return err$1(e);
1558
- const array = u8n(al);
1559
- for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
1560
- // treat each char as ASCII
1561
- const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
1562
- const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
1563
- if (n1 === undefined || n2 === undefined)
1564
- return err$1(e);
1565
- array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
1566
- }
1567
- return array;
1599
+ const litecoin = {
1600
+ messagePrefix: '\x19Litecoin Signed Message:\n',
1601
+ version: 1,
1602
+ pubKeyHash: 0x30,
1603
+ scriptHash: 0x32,
1604
+ wif: 0xb0,
1605
+ bip32: {
1606
+ public: 0x019da462,
1607
+ private: 0x019d9cfe
1608
+ },
1609
+ bech32: '',
1610
+ multiCodec: 0
1568
1611
  };
1569
- // WebCrypto is available in all modern environments
1570
- const subtle = () => globalThis?.crypto?.subtle ?? err$1('crypto.subtle must be defined, consider polyfill');
1571
- // prettier-ignore
1572
- const concatBytes = (...arrs) => {
1573
- let len = 0;
1574
- for (const a of arrs)
1575
- len += abytes(a).length; // validate every input and sum lengths before copying
1576
- const r = u8n(len);
1577
- let pad = 0; // walk through each array,
1578
- for (const a of arrs)
1579
- r.set(a, pad), pad += a.length; // ensure they have proper type
1580
- return r;
1612
+ const ethereum = {
1613
+ messagePrefix: '\x19Ethereum Signed Message:\n',
1614
+ version: 1,
1615
+ pubKeyHash: 0x30,
1616
+ scriptHash: 0x32,
1617
+ bip32: {
1618
+ private: 0x0488ADE4, public: 0x0488B21E
1619
+ },
1620
+ coin_type: 60,
1621
+ wif: 0x45, //E
1622
+ multiCodec: 0x3c5
1581
1623
  };
1582
1624
  /**
1583
- * WebCrypto OS-level CSPRNG (random number generator).
1584
- * Will throw when not available; large-request ceilings are delegated to getRandomValues().
1625
+ * Our & supported networks
1626
+ * @return {leofcoin, olivia}
1585
1627
  */
1586
- const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
1587
- const big = BigInt;
1588
- const arange = (n, min, max, msg = 'bad number: out of range') => {
1589
- if (typeof n !== 'bigint')
1590
- return err$1(msg, TypeError);
1591
- if (min <= n && n < max)
1592
- return n;
1593
- return err$1(msg, RangeError);
1594
- };
1595
- /** Canonical modular reduction. Callers must provide a positive modulus. */
1596
- const M = (a, b = P) => {
1597
- const r = a % b;
1598
- return r >= 0n ? r : b + r;
1599
- };
1600
- const modN = (a) => M(a, N);
1601
- /** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
1602
- // prettier-ignore
1603
- const invert = (num, md) => {
1604
- if (num === 0n || md <= 0n)
1605
- err$1('no inverse n=' + num + ' mod=' + md);
1606
- let a = M(num, md), b = md, x = 0n, u = 1n;
1607
- while (a !== 0n) {
1608
- const q = b / a, r = b % a;
1609
- const m = x - u * q;
1610
- b = a, a = r, x = u, u = m;
1611
- }
1612
- return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
1613
- };
1614
- const callHash = (name) => {
1615
- // @ts-ignore
1616
- const fn = hashes[name];
1617
- if (typeof fn !== 'function')
1618
- err$1('hashes.' + name + ' not set');
1619
- return fn;
1628
+ var networks = {
1629
+ leofcoin,
1630
+ bitcoin,
1631
+ litecoin,
1632
+ ethereum
1620
1633
  };
1621
- // All exported provider slots are caller-configurable and may be unset or return arbitrary values,
1622
- // so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
1623
- const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
1624
- const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
1625
- // also rejects structurally similar Point values from other realms / bundled copies
1626
- const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
1627
- // ## End of Helpers
1628
- // -----------------
1629
- /**
1630
- * secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
1631
- * making it x³+b; callers validate x first.
1632
- */
1633
- const koblitz = (x) => M(M(x * x) * x + _b);
1634
- /** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
1635
- const FpIsValid = (n) => arange(n, 0n, P);
1636
- /** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
1637
- const FpIsValidNot0 = (n) => arange(n, 1n, P);
1638
- /** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
1639
- const FnIsValidNot0 = (n) => arange(n, 1n, N);
1640
- // Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
1641
- const isEven = (y) => !(y & 1n);
1642
- /** create Uint8Array of byte n */
1643
- const u8of = (n) => Uint8Array.of(n);
1644
- /** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
1645
- const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
1646
- /** lift_x from BIP340 returns the unique even square root for x³+7.
1647
- * SEC 1 callers still flip it for the odd-prefix branch. */
1648
- const lift_x = (x) => {
1649
- // Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
1650
- const c = koblitz(FpIsValidNot0(x));
1651
- // r = √c candidate
1652
- // r = c^((p+1)/4) mod p
1653
- // This formula works for fields p = 3 mod 4 -- a special, fast case.
1654
- // Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
1655
- let r = 1n;
1656
- for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
1657
- // powMod: modular exponentiation.
1658
- if (e & 1n)
1659
- r = (r * num) % P; // Uses exponentiation by squaring.
1660
- num = (num * num) % P; // Not constant-time.
1661
- }
1662
- if (M(r * r) !== c)
1663
- err$1('sqrt invalid'); // check if result is valid
1664
- return isEven(r) ? r : M(-r);
1665
- };
1666
- /**
1667
- * Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
1668
- * @param X - X coordinate.
1669
- * @param Y - Y coordinate.
1670
- * @param Z - projective Z coordinate.
1671
- * @example
1672
- * Do point arithmetic with the base point and encode the result as hex.
1673
- * ```ts
1674
- * import { Point } from '@noble/secp256k1';
1675
- * const hex = Point.BASE.double().toHex();
1676
- * ```
1634
+
1635
+ /*!
1636
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
1637
+ * (c) Dani Biro
1638
+ * @license MIT
1677
1639
  */
1678
- class Point {
1679
- static BASE;
1680
- static ZERO;
1681
- X;
1682
- Y;
1683
- Z;
1684
- constructor(X, Y, Z) {
1685
- this.X = FpIsValid(X);
1686
- this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
1687
- this.Z = FpIsValid(Z);
1688
- Object.freeze(this);
1689
- }
1690
- /** Returns the shared curve metadata object by reference.
1691
- * It is readonly only at type level, and mutating it won't retarget arithmetic,
1692
- * which already uses module-load snapshots. */
1693
- static CURVE() {
1694
- return secp256k1_CURVE;
1695
- }
1696
- /** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
1697
- static fromAffine(ap) {
1698
- const { x, y } = ap;
1699
- return x === 0n && y === 0n ? I : new Point(x, y, 1n);
1640
+
1641
+
1642
+ /******************************************************************************
1643
+ Copyright (c) Microsoft Corporation.
1644
+
1645
+ Permission to use, copy, modify, and/or distribute this software for any
1646
+ purpose with or without fee is hereby granted.
1647
+
1648
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1649
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1650
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1651
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1652
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1653
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1654
+ PERFORMANCE OF THIS SOFTWARE.
1655
+ ***************************************************************************** */
1656
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
1657
+
1658
+
1659
+ function __awaiter(thisArg, _arguments, P, generator) {
1660
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1661
+ return new (P || (P = Promise))(function (resolve, reject) {
1662
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1663
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1664
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1665
+ step((generator = generator.apply(thisArg, [])).next());
1666
+ });
1667
+ }
1668
+
1669
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1670
+ var e = new Error(message);
1671
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1672
+ };
1673
+
1674
+ class Mutex {
1675
+ constructor() {
1676
+ this.mutex = Promise.resolve();
1700
1677
  }
1701
- /** Convert Uint8Array or hex string to Point. */
1702
- static fromBytes(bytes) {
1703
- abytes(bytes);
1704
- const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
1705
- let p = undefined;
1706
- const length = bytes.length;
1707
- const head = bytes[0];
1708
- const tail = bytes.subarray(1);
1709
- const x = sliceBytesNumBE(tail, 0, L);
1710
- // SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
1711
- // infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
1712
- // and public-key validation helpers, so strict handling applies to all callers by default.
1713
- // Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
1714
- // Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
1715
- if (length === comp && (head === 0x02 || head === 0x03)) {
1716
- // Equation is y² == x³ + ax + b. We calculate y from x.
1717
- // lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
1718
- let y = lift_x(x);
1719
- if (head === 0x03)
1720
- y = M(-y);
1721
- p = new Point(x, y, 1n);
1722
- }
1723
- // Uncompressed 65-byte point, 0x04 prefix
1724
- if (length === uncomp && head === 0x04)
1725
- p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
1726
- // Validate point
1727
- return p ? p.assertValidity() : err$1('bad point: not on curve');
1678
+ lock() {
1679
+ let begin = () => { };
1680
+ this.mutex = this.mutex.then(() => new Promise(begin));
1681
+ return new Promise((res) => {
1682
+ begin = res;
1683
+ });
1728
1684
  }
1729
- static fromHex(hex) {
1730
- return Point.fromBytes(hexToBytes(hex));
1685
+ dispatch(fn) {
1686
+ return __awaiter(this, void 0, void 0, function* () {
1687
+ const unlock = yield this.lock();
1688
+ try {
1689
+ return yield Promise.resolve(fn());
1690
+ }
1691
+ finally {
1692
+ unlock();
1693
+ }
1694
+ });
1731
1695
  }
1732
- get x() {
1733
- return this.toAffine().x;
1696
+ }
1697
+
1698
+ var _a;
1699
+ function getGlobal() {
1700
+ if (typeof globalThis !== "undefined")
1701
+ return globalThis;
1702
+ if (typeof self !== "undefined")
1703
+ return self;
1704
+ if (typeof window !== "undefined")
1705
+ return window;
1706
+ return global;
1707
+ }
1708
+ const globalObject = getGlobal();
1709
+ const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
1710
+ const textEncoder = globalObject.TextEncoder
1711
+ ? new globalObject.TextEncoder()
1712
+ : null;
1713
+ function hexCharCodesToInt(a, b) {
1714
+ return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
1715
+ ((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
1716
+ }
1717
+ function writeHexToUInt8(buf, str) {
1718
+ const size = str.length >> 1;
1719
+ for (let i = 0; i < size; i++) {
1720
+ const index = i << 1;
1721
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
1734
1722
  }
1735
- get y() {
1736
- return this.toAffine().y;
1723
+ }
1724
+ function hexStringEqualsUInt8(str, buf) {
1725
+ if (str.length !== buf.length * 2) {
1726
+ return false;
1737
1727
  }
1738
- /** Equality check: compare points P&Q. */
1739
- equals(other) {
1740
- const { X: X1, Y: Y1, Z: Z1 } = this;
1741
- const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
1742
- const X1Z2 = M(X1 * Z2);
1743
- const X2Z1 = M(X2 * Z1);
1744
- const Y1Z2 = M(Y1 * Z2);
1745
- const Y2Z1 = M(Y2 * Z1);
1746
- return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
1728
+ for (let i = 0; i < buf.length; i++) {
1729
+ const strIndex = i << 1;
1730
+ if (buf[i] !==
1731
+ hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
1732
+ return false;
1733
+ }
1747
1734
  }
1748
- is0() {
1749
- return this.equals(I);
1735
+ return true;
1736
+ }
1737
+ const alpha = "a".charCodeAt(0) - 10;
1738
+ const digit = "0".charCodeAt(0);
1739
+ function getDigestHex(tmpBuffer, input, hashLength) {
1740
+ let p = 0;
1741
+ for (let i = 0; i < hashLength; i++) {
1742
+ let nibble = input[i] >>> 4;
1743
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
1744
+ nibble = input[i] & 0xf;
1745
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
1750
1746
  }
1751
- /** Flip point over y coordinate. */
1752
- negate() {
1753
- return new Point(this.X, M(-this.Y), this.Z);
1747
+ return String.fromCharCode.apply(null, tmpBuffer);
1748
+ }
1749
+ const getUInt8Buffer = nodeBuffer !== null
1750
+ ? (data) => {
1751
+ if (typeof data === "string") {
1752
+ const buf = nodeBuffer.from(data, "utf8");
1753
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
1754
+ }
1755
+ if (nodeBuffer.isBuffer(data)) {
1756
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
1757
+ }
1758
+ if (ArrayBuffer.isView(data)) {
1759
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
1760
+ }
1761
+ throw new Error("Invalid data type!");
1754
1762
  }
1755
- /** Point doubling: P+P, complete formula. */
1756
- double() {
1757
- return this.add(this);
1758
- }
1759
- /**
1760
- * Point addition: P+Q, complete, exception-free formula
1761
- * (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
1762
- * Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
1763
- */
1764
- // prettier-ignore
1765
- add(other) {
1766
- const { X: X1, Y: Y1, Z: Z1 } = this;
1767
- const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
1768
- const a = 0n;
1769
- const b = _b;
1770
- let X3 = 0n, Y3 = 0n, Z3 = 0n;
1771
- const b3 = M(b * 3n);
1772
- let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
1773
- let t4 = M(X2 + Y2); // step 5
1774
- t3 = M(t3 * t4);
1775
- t4 = M(t0 + t1);
1776
- t3 = M(t3 - t4);
1777
- t4 = M(X1 + Z1);
1778
- let t5 = M(X2 + Z2); // step 10
1779
- t4 = M(t4 * t5);
1780
- t5 = M(t0 + t2);
1781
- t4 = M(t4 - t5);
1782
- t5 = M(Y1 + Z1);
1783
- X3 = M(Y2 + Z2); // step 15
1784
- t5 = M(t5 * X3);
1785
- X3 = M(t1 + t2);
1786
- t5 = M(t5 - X3);
1787
- Z3 = M(a * t4);
1788
- X3 = M(b3 * t2); // step 20
1789
- Z3 = M(X3 + Z3);
1790
- X3 = M(t1 - Z3);
1791
- Z3 = M(t1 + Z3);
1792
- Y3 = M(X3 * Z3);
1793
- t1 = M(t0 + t0); // step 25
1794
- t1 = M(t1 + t0);
1795
- t2 = M(a * t2);
1796
- t4 = M(b3 * t4);
1797
- t1 = M(t1 + t2);
1798
- t2 = M(t0 - t2); // step 30
1799
- t2 = M(a * t2);
1800
- t4 = M(t4 + t2);
1801
- t0 = M(t1 * t4);
1802
- Y3 = M(Y3 + t0);
1803
- t0 = M(t5 * t4); // step 35
1804
- X3 = M(t3 * X3);
1805
- X3 = M(X3 - t0);
1806
- t0 = M(t3 * t1);
1807
- Z3 = M(t5 * Z3);
1808
- Z3 = M(Z3 + t0); // step 40
1809
- return new Point(X3, Y3, Z3);
1810
- }
1811
- subtract(other) {
1812
- return this.add(apoint(other).negate());
1813
- }
1814
- /**
1815
- * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
1816
- * Uses {@link wNAF} for base point.
1817
- * Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
1818
- * @param n scalar by which point is multiplied
1819
- * @param safe safe mode guards against timing attacks; unsafe mode is faster
1820
- */
1821
- multiply(n, safe = true) {
1822
- // Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
1823
- if (!safe && n === 0n)
1824
- return I;
1825
- FnIsValidNot0(n);
1826
- if (n === 1n)
1827
- return this;
1828
- if (this.equals(G))
1829
- return wNAF(n).p;
1830
- // init result point & fake point
1831
- let p = I;
1832
- let f = G;
1833
- for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
1834
- // if bit is present, add to point
1835
- // if not present, add to fake, for timing safety
1836
- if (n & 1n)
1837
- p = p.add(d);
1838
- else if (safe)
1839
- f = f.add(d);
1840
- }
1841
- return p;
1842
- }
1843
- multiplyUnsafe(scalar) {
1844
- return this.multiply(scalar, false);
1845
- }
1846
- /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
1847
- toAffine() {
1848
- const { X: x, Y: y, Z: z } = this;
1849
- // fast-paths for ZERO point OR Z=1
1850
- if (this.equals(I))
1851
- return { x: 0n, y: 0n };
1852
- if (z === 1n)
1853
- return { x, y };
1854
- const iz = invert(z, P);
1855
- // (Z * Z^-1) must be 1, otherwise bad math
1856
- if (M(z * iz) !== 1n)
1857
- err$1('inverse invalid');
1858
- // x = X*Z^-1; y = Y*Z^-1
1859
- return { x: M(x * iz), y: M(y * iz) };
1860
- }
1861
- /** Checks if the point is valid and on-curve. */
1862
- assertValidity() {
1863
- const { x, y } = this.toAffine(); // convert to 2d xy affine point.
1864
- FpIsValidNot0(x); // must be in range 1 <= x,y < P
1865
- FpIsValidNot0(y);
1866
- // y² == x³ + ax + b, equation sides must be equal
1867
- return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
1868
- }
1869
- /** Converts point to 33/65-byte Uint8Array. */
1870
- toBytes(isCompressed = true) {
1871
- // Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
1872
- // out of this byte surface because callers treat these encodings as public keys by default.
1873
- const { x, y } = this.assertValidity().toAffine();
1874
- const x32b = numTo32b(x);
1875
- if (isCompressed)
1876
- return concatBytes(getPrefix(y), x32b);
1877
- return concatBytes(u8of(0x04), x32b, numTo32b(y));
1878
- }
1879
- toHex(isCompressed) {
1880
- return bytesToHex(this.toBytes(isCompressed));
1763
+ : (data) => {
1764
+ if (typeof data === "string") {
1765
+ return textEncoder.encode(data);
1766
+ }
1767
+ if (ArrayBuffer.isView(data)) {
1768
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
1769
+ }
1770
+ throw new Error("Invalid data type!");
1771
+ };
1772
+ const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1773
+ const base64Lookup = new Uint8Array(256);
1774
+ for (let i = 0; i < base64Chars.length; i++) {
1775
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
1776
+ }
1777
+ function getDecodeBase64Length(data) {
1778
+ let bufferLength = Math.floor(data.length * 0.75);
1779
+ const len = data.length;
1780
+ if (data[len - 1] === "=") {
1781
+ bufferLength -= 1;
1782
+ if (data[len - 2] === "=") {
1783
+ bufferLength -= 1;
1784
+ }
1881
1785
  }
1786
+ return bufferLength;
1882
1787
  }
1883
- /** Generator / base point */
1884
- const G = new Point(Gx, Gy, 1n);
1885
- /** Identity / zero point */
1886
- const I = new Point(0n, 1n, 0n);
1887
- // Static aliases
1888
- Point.BASE = G;
1889
- Point.ZERO = I;
1890
- /** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
1891
- const doubleScalarMulUns = (R, u1, u2) => {
1892
- return G.multiply(u1, false)
1893
- .add(R.multiply(u2, false))
1894
- .assertValidity();
1895
- };
1896
- // Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
1897
- const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
1898
- // Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
1899
- const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
1900
- const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
1901
- /** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
1902
- const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
1903
- /** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
1904
- const secretKeyToScalar = (secretKey) => {
1905
- const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
1906
- return arange(num, 1n, N, 'invalid secret key: outside of range');
1907
- };
1908
- /**
1909
- * Creates a SEC 1 public key from a 32-byte private key.
1910
- * @param privKey - 32-byte secret key.
1911
- * @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
1912
- * @returns serialized secp256k1 public key in SEC 1 encoding.
1913
- * @example
1914
- * Derive the serialized public key for a secp256k1 secret key.
1915
- * ```ts
1916
- * import * as secp from '@noble/secp256k1';
1917
- * const secretKey = secp.utils.randomSecretKey();
1918
- * const publicKey = secp.getPublicKey(secretKey);
1919
- * ```
1920
- */
1921
- const getPublicKey = (privKey, isCompressed = true) => {
1922
- return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
1923
- };
1924
- const isValidSecretKey = (secretKey) => {
1925
- try {
1926
- return !!secretKeyToScalar(secretKey);
1927
- }
1928
- catch (error) {
1929
- return false;
1930
- }
1931
- };
1932
- const isValidPublicKey = (publicKey, isCompressed) => {
1933
- const { publicKey: comp, publicKeyUncompressed } = lengths;
1934
- try {
1935
- const l = publicKey.length;
1936
- if (isCompressed === true && l !== comp)
1937
- return false;
1938
- if (isCompressed === false && l !== publicKeyUncompressed)
1939
- return false;
1940
- return !!Point.fromBytes(publicKey);
1941
- }
1942
- catch (error) {
1943
- return false;
1788
+ function decodeBase64(data) {
1789
+ const bufferLength = getDecodeBase64Length(data);
1790
+ const len = data.length;
1791
+ const bytes = new Uint8Array(bufferLength);
1792
+ let p = 0;
1793
+ for (let i = 0; i < len; i += 4) {
1794
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
1795
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
1796
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
1797
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
1798
+ bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
1799
+ p += 1;
1800
+ bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
1801
+ p += 1;
1802
+ bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
1803
+ p += 1;
1944
1804
  }
1805
+ return bytes;
1806
+ }
1807
+
1808
+ const MAX_HEAP = 16 * 1024;
1809
+ const WASM_FUNC_HASH_LENGTH = 4;
1810
+ const wasmMutex = new Mutex();
1811
+ const wasmModuleCache = new Map();
1812
+ function WASMInterface(binary, hashLength) {
1813
+ return __awaiter(this, void 0, void 0, function* () {
1814
+ let wasmInstance = null;
1815
+ let memoryView = null;
1816
+ let initialized = false;
1817
+ if (typeof WebAssembly === "undefined") {
1818
+ throw new Error("WebAssembly is not supported in this environment!");
1819
+ }
1820
+ const writeMemory = (data, offset = 0) => {
1821
+ memoryView.set(data, offset);
1822
+ };
1823
+ const getMemory = () => memoryView;
1824
+ const getExports = () => wasmInstance.exports;
1825
+ const setMemorySize = (totalSize) => {
1826
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
1827
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
1828
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1829
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
1830
+ };
1831
+ const getStateSize = () => {
1832
+ const view = new DataView(wasmInstance.exports.memory.buffer);
1833
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
1834
+ return stateSize;
1835
+ };
1836
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
1837
+ if (!wasmModuleCache.has(binary.name)) {
1838
+ const asm = decodeBase64(binary.data);
1839
+ const promise = WebAssembly.compile(asm);
1840
+ wasmModuleCache.set(binary.name, promise);
1841
+ }
1842
+ const module = yield wasmModuleCache.get(binary.name);
1843
+ wasmInstance = yield WebAssembly.instantiate(module, {
1844
+ // env: {
1845
+ // emscripten_memcpy_big: (dest, src, num) => {
1846
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
1847
+ // const memView = new Uint8Array(memoryBuffer, 0);
1848
+ // memView.set(memView.subarray(src, src + num), dest);
1849
+ // },
1850
+ // print_memory: (offset, len) => {
1851
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
1852
+ // const memView = new Uint8Array(memoryBuffer, 0);
1853
+ // console.log('print_int32', memView.subarray(offset, offset + len));
1854
+ // },
1855
+ // },
1856
+ });
1857
+ // wasmInstance.exports._start();
1858
+ }));
1859
+ const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
1860
+ if (!wasmInstance) {
1861
+ yield loadWASMPromise;
1862
+ }
1863
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
1864
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1865
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
1866
+ });
1867
+ const init = (bits = null) => {
1868
+ initialized = true;
1869
+ wasmInstance.exports.Hash_Init(bits);
1870
+ };
1871
+ const updateUInt8Array = (data) => {
1872
+ let read = 0;
1873
+ while (read < data.length) {
1874
+ const chunk = data.subarray(read, read + MAX_HEAP);
1875
+ read += chunk.length;
1876
+ memoryView.set(chunk);
1877
+ wasmInstance.exports.Hash_Update(chunk.length);
1878
+ }
1879
+ };
1880
+ const update = (data) => {
1881
+ if (!initialized) {
1882
+ throw new Error("update() called before init()");
1883
+ }
1884
+ const Uint8Buffer = getUInt8Buffer(data);
1885
+ updateUInt8Array(Uint8Buffer);
1886
+ };
1887
+ const digestChars = new Uint8Array(hashLength * 2);
1888
+ const digest = (outputType, padding = null) => {
1889
+ if (!initialized) {
1890
+ throw new Error("digest() called before init()");
1891
+ }
1892
+ initialized = false;
1893
+ wasmInstance.exports.Hash_Final(padding);
1894
+ if (outputType === "binary") {
1895
+ // the data is copied to allow GC of the original memory object
1896
+ return memoryView.slice(0, hashLength);
1897
+ }
1898
+ return getDigestHex(digestChars, memoryView, hashLength);
1899
+ };
1900
+ const save = () => {
1901
+ if (!initialized) {
1902
+ throw new Error("save() can only be called after init() and before digest()");
1903
+ }
1904
+ const stateOffset = wasmInstance.exports.Hash_GetState();
1905
+ const stateLength = getStateSize();
1906
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1907
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
1908
+ // prefix is 4 bytes from SHA1 hash of the WASM binary
1909
+ // it is used to detect incompatible internal states between different versions of hash-wasm
1910
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
1911
+ writeHexToUInt8(prefixedState, binary.hash);
1912
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
1913
+ return prefixedState;
1914
+ };
1915
+ const load = (state) => {
1916
+ if (!(state instanceof Uint8Array)) {
1917
+ throw new Error("load() expects an Uint8Array generated by save()");
1918
+ }
1919
+ const stateOffset = wasmInstance.exports.Hash_GetState();
1920
+ const stateLength = getStateSize();
1921
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
1922
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1923
+ if (state.length !== overallLength) {
1924
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
1925
+ }
1926
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
1927
+ throw new Error("This state was written by an incompatible hash implementation");
1928
+ }
1929
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
1930
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
1931
+ initialized = true;
1932
+ };
1933
+ const isDataShort = (data) => {
1934
+ if (typeof data === "string") {
1935
+ // worst case is 4 bytes / char
1936
+ return data.length < MAX_HEAP / 4;
1937
+ }
1938
+ return data.byteLength < MAX_HEAP;
1939
+ };
1940
+ let canSimplify = isDataShort;
1941
+ switch (binary.name) {
1942
+ case "argon2":
1943
+ case "scrypt":
1944
+ canSimplify = () => true;
1945
+ break;
1946
+ case "blake2b":
1947
+ case "blake2s":
1948
+ // if there is a key at blake2 then cannot simplify
1949
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
1950
+ break;
1951
+ case "blake3":
1952
+ // if there is a key at blake3 then cannot simplify
1953
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
1954
+ break;
1955
+ case "xxhash64": // cannot simplify
1956
+ case "xxhash3":
1957
+ case "xxhash128":
1958
+ case "crc64":
1959
+ canSimplify = () => false;
1960
+ break;
1961
+ }
1962
+ // shorthand for (init + update + digest) for better performance
1963
+ const calculate = (data, initParam = null, digestParam = null) => {
1964
+ if (!canSimplify(data, initParam)) {
1965
+ init(initParam);
1966
+ update(data);
1967
+ return digest("hex", digestParam);
1968
+ }
1969
+ const buffer = getUInt8Buffer(data);
1970
+ memoryView.set(buffer);
1971
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
1972
+ return getDigestHex(digestChars, memoryView, hashLength);
1973
+ };
1974
+ yield setupInterface();
1975
+ return {
1976
+ getMemory,
1977
+ writeMemory,
1978
+ getExports,
1979
+ setMemorySize,
1980
+ init,
1981
+ update,
1982
+ digest,
1983
+ save,
1984
+ load,
1985
+ calculate,
1986
+ hashLength,
1987
+ };
1988
+ });
1989
+ }
1990
+
1991
+ new Mutex();
1992
+
1993
+ new Mutex();
1994
+
1995
+ new Mutex();
1996
+
1997
+ new Mutex();
1998
+
1999
+ new Mutex();
2000
+
2001
+ new Mutex();
2002
+
2003
+ new Mutex();
2004
+
2005
+ new Mutex();
2006
+
2007
+ var name$c = "sha1";
2008
+ var data$c = "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";
2009
+ var hash$c = "6b530c24";
2010
+ var wasmJson$c = {
2011
+ name: name$c,
2012
+ data: data$c,
2013
+ hash: hash$c
1945
2014
  };
1946
- const _sha = 'SHA-256';
1947
- /**
1948
- * Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
1949
- * All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
1950
- * providers still return exact 32-byte Uint8Array digests.
1951
- * @example
1952
- * Provide sync hash helpers before calling the synchronous signing API.
1953
- * ```ts
1954
- * import * as secp from '@noble/secp256k1';
1955
- * import { hmac } from '@noble/hashes/hmac.js';
1956
- * import { sha256 } from '@noble/hashes/sha2.js';
1957
- * secp.hashes.sha256 = sha256;
1958
- * secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
1959
- * const secretKey = secp.utils.randomSecretKey();
1960
- * const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
1961
- * ```
1962
- */
1963
- const hashes = {
1964
- hmacSha256Async: async (key, message) => {
1965
- const s = subtle();
1966
- const name = 'HMAC';
1967
- const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
1968
- return u8n(await s.sign(name, k, message));
1969
- },
1970
- hmacSha256: undefined,
1971
- sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
1972
- sha256: undefined,
1973
- };
1974
- /**
1975
- * Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
1976
- * Result is **NOT hashed** and returns the serialized shared point (compressed by default),
1977
- * not the SEC 1 x-only primitive `z = x_P`.
1978
- * secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
1979
- * @param secretKeyA - local 32-byte secret key.
1980
- * @param publicKeyB - peer public key.
1981
- * @param isCompressed - return 33-byte compressed output when `true`.
1982
- * @returns shared secret point bytes.
1983
- * @example
1984
- * Derive a shared secp256k1 secret with ECDH.
1985
- * ```ts
1986
- * import * as secp from '@noble/secp256k1';
1987
- * const alice = secp.utils.randomSecretKey();
1988
- * const bob = secp.utils.randomSecretKey();
1989
- * const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
1990
- * ```
1991
- */
1992
- const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
1993
- return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
1994
- };
1995
- // FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
1996
- // The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
1997
- const randomSecretKey = (seed) => {
1998
- seed = seed === undefined ? randomBytes(lengths.seed) : seed;
1999
- abytes(seed);
2000
- // Keep the public range text aligned with the enforced 48-byte FIPS floor.
2001
- if (seed.length < lengths.seed || seed.length > 1024)
2002
- return err$1('expected 48-1024b', RangeError);
2003
- const num = M(bytesToNumBE(seed), N - 1n);
2004
- return numTo32b(num + 1n);
2005
- };
2006
- const createKeygen = (getPublicKey) => (seed) => {
2007
- const secretKey = randomSecretKey(seed);
2008
- return {
2009
- secretKey,
2010
- publicKey: getPublicKey(secretKey),
2011
- };
2012
- };
2013
- /**
2014
- * Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
2015
- * @example
2016
- * Convert bytes to a hex string with the low-level helper namespace.
2017
- * ```ts
2018
- * import { etc } from '@noble/secp256k1';
2019
- * const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
2020
- * ```
2021
- */
2022
- const etc = /* @__PURE__ */ Object.freeze({
2023
- hexToBytes,
2024
- bytesToHex,
2025
- concatBytes,
2026
- bytesToNumberBE: bytesToNumBE,
2027
- numberToBytesBE: numTo32b,
2028
- mod: M,
2029
- invert: invert, // math utilities; keep public alias type aligned with runtime
2030
- randomBytes,
2031
- secretKeyToScalar: secretKeyToScalar,
2032
- abytes: abytes,
2033
- });
2034
- /**
2035
- * Curve-specific key utilities.
2036
- * @example
2037
- * Generate a fresh secret key and derive its public key.
2038
- * ```ts
2039
- * import * as secp from '@noble/secp256k1';
2040
- * const secretKey = secp.utils.randomSecretKey();
2041
- * const publicKey = secp.getPublicKey(secretKey);
2042
- * ```
2043
- */
2044
- const utils$2 = /* @__PURE__ */ Object.freeze({
2045
- isValidSecretKey: isValidSecretKey,
2046
- isValidPublicKey: isValidPublicKey,
2047
- randomSecretKey: randomSecretKey, // preserve the optional seeded call
2048
- });
2049
- // Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
2050
- // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
2051
- // Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
2052
- const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
2053
- const T_AUX = 'aux';
2054
- const T_NONCE = 'nonce';
2055
- const T_CHALLENGE = 'challenge';
2056
- // Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
2057
- // wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
2058
- const taggedHash = (tag, ...messages) => {
2059
- const tagH = gh('sha256', getTag(tag));
2060
- return gh('sha256', concatBytes(tagH, tagH, ...messages));
2061
- };
2062
- // Async twin of taggedHash with the same checked provider boundary.
2063
- const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
2064
- // BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
2065
- // d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
2066
- const extpubSchnorr = (priv) => {
2067
- const d_ = secretKeyToScalar(priv);
2068
- const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
2069
- const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
2070
- const d = isEven(y) ? d_ : modN(-d_);
2071
- const px = numTo32b(x);
2072
- return { d, px };
2073
- };
2074
- const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
2075
- const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
2076
- const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
2077
- /** Schnorr public key is just `x` coordinate of Point as per BIP340. */
2078
- const pubSchnorr = (secretKey) => {
2079
- return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
2080
- };
2081
- const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
2082
- // Common preparation fn for both sync and async signing
2083
- const prepSigSchnorr = (message, secretKey, auxRand) => {
2084
- const { px, d } = extpubSchnorr(secretKey);
2085
- return { m: abytes(message), px, d, a: abytes(auxRand, L) };
2086
- };
2087
- const extractK = (rand) => {
2088
- const k_ = bytesModN(rand); // Let k' = int(rand) mod n
2089
- if (k_ === 0n)
2090
- err$1('sign failed: k is zero'); // Fail if k' = 0.
2091
- const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
2092
- return { rx: px, k: d };
2093
- };
2094
- // Common signature creation helper
2095
- const createSigSchnorr = (k, px, e, d) => {
2096
- return concatBytes(px, numTo32b(modN(k + e * d)));
2097
- };
2098
- const E_INVSIG = 'invalid signature produced';
2015
+
2016
+ new Mutex();
2099
2017
  /**
2100
- * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
2101
- * auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
2102
- * k generation, so bad CSPRNG won't be the only entropy source.
2018
+ * Creates a new SHA-1 hash instance
2103
2019
  */
2104
- const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
2105
- const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
2106
- const aux = taggedHash(T_AUX, a);
2107
- // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
2108
- const t = numTo32b(d ^ bytesToNumBE(aux));
2109
- // Let rand = hash/nonce(t || bytes(P) || m)
2110
- const rand = taggedHash(T_NONCE, t, px, m);
2111
- const { rx, k } = extractK(rand);
2112
- // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
2113
- const e = challenge(rx, px, m);
2114
- const sig = createSigSchnorr(k, rx, e, d);
2115
- // If Verify(bytes(P), m, sig) (see below) returns failure, abort
2116
- if (!verifySchnorr(sig, m, px))
2117
- err$1(E_INVSIG);
2118
- return sig;
2119
- };
2120
- const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
2121
- const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
2122
- const aux = await taggedHashAsync(T_AUX, a);
2123
- // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
2124
- const t = numTo32b(d ^ bytesToNumBE(aux));
2125
- // Let rand = hash/nonce(t || bytes(P) || m)
2126
- const rand = await taggedHashAsync(T_NONCE, t, px, m);
2127
- const { rx, k } = extractK(rand);
2128
- // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
2129
- const e = await challengeAsync(rx, px, m);
2130
- const sig = createSigSchnorr(k, rx, e, d);
2131
- // If Verify(bytes(P), m, sig) (see below) returns failure, abort
2132
- if (!(await verifySchnorrAsync(sig, m, px)))
2133
- err$1(E_INVSIG);
2134
- return sig;
2135
- };
2136
- const callSyncAsyncFn = (res, later) => {
2137
- return res instanceof Promise ? res.then(later) : later(res);
2138
- };
2139
- const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
2140
- const sig = abytes(signature, L2, 'signature');
2141
- const msg = abytes(message, undefined, 'message');
2142
- const pub = abytes(publicKey, L, 'publicKey');
2143
- try {
2144
- // lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
2145
- // Fail if x ≥ p. Let c = x³ + 7 mod p.
2146
- const x = bytesToNumBE(pub);
2147
- const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
2148
- const P_ = new Point(x, y, 1n).assertValidity();
2149
- const px = numTo32b(P_.toAffine().x);
2150
- // P = lift_x(int(pk)); fail if that fails
2151
- const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
2152
- arange(r, 1n, P);
2153
- const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
2154
- // Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
2155
- // s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
2156
- // crafted edge cases and fail closed instead of carrying that extra verification surface.
2157
- arange(s, 1n, N);
2158
- const i = concatBytes(numTo32b(r), px, msg);
2159
- // int(challenge(bytes(r)||bytes(P)||m))%n
2160
- return callSyncAsyncFn(challengeFn(i), (e) => {
2161
- const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
2162
- if (!isEven(y) || x !== r)
2163
- return false; // -eP == (n-e)P
2164
- return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
2165
- });
2166
- }
2167
- catch (error) {
2168
- return false;
2169
- }
2020
+ function createSHA1() {
2021
+ return WASMInterface(wasmJson$c, 20).then((wasm) => {
2022
+ wasm.init();
2023
+ const obj = {
2024
+ init: () => {
2025
+ wasm.init();
2026
+ return obj;
2027
+ },
2028
+ update: (data) => {
2029
+ wasm.update(data);
2030
+ return obj;
2031
+ },
2032
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2033
+ digest: (outputType) => wasm.digest(outputType),
2034
+ save: () => wasm.save(),
2035
+ load: (data) => {
2036
+ wasm.load(data);
2037
+ return obj;
2038
+ },
2039
+ blockSize: 64,
2040
+ digestSize: 20,
2041
+ };
2042
+ return obj;
2043
+ });
2044
+ }
2045
+
2046
+ var name$b = "sha3";
2047
+ var data$b = "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";
2048
+ var hash$b = "fb24e536";
2049
+ var wasmJson$b = {
2050
+ name: name$b,
2051
+ data: data$b,
2052
+ hash: hash$b
2170
2053
  };
2171
- /** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
2172
- * after the initial byte checks. */
2173
- const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
2174
- /** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
2175
- * become false, but async backend failures reject the promise. Missing crypto.subtle is a
2176
- * runtime/backend error, not an "invalid signature" result, so we surface it instead of
2177
- * turning it into false. */
2178
- const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
2179
- /**
2180
- * BIP340 Schnorr helpers over secp256k1.
2181
- * @example
2182
- * Sign and verify a BIP340 Schnorr signature.
2183
- * ```ts
2184
- * import * as secp from '@noble/secp256k1';
2185
- * import { sha256 } from '@noble/hashes/sha2.js';
2186
- * secp.hashes.sha256 = sha256;
2187
- * const secretKey = secp.utils.randomSecretKey();
2188
- * const message = new Uint8Array([1, 2, 3]);
2189
- * const sig = secp.schnorr.sign(message, secretKey);
2190
- * const publicKey = secp.schnorr.getPublicKey(secretKey);
2191
- * const isValid = secp.schnorr.verify(sig, message, publicKey);
2192
- * ```
2054
+
2055
+ new Mutex();
2056
+
2057
+ new Mutex();
2058
+ function validateBits(bits) {
2059
+ if (![224, 256, 384, 512].includes(bits)) {
2060
+ return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
2061
+ }
2062
+ return null;
2063
+ }
2064
+ /**
2065
+ * Creates a new Keccak hash instance
2066
+ * @param bits Number of output bits. Valid values: 224, 256, 384, 512
2193
2067
  */
2194
- const schnorr = /* @__PURE__ */ Object.freeze({
2195
- keygen: keygenSchnorr,
2196
- getPublicKey: pubSchnorr,
2197
- sign: signSchnorr,
2198
- verify: verifySchnorr,
2199
- signAsync: signSchnorrAsync,
2200
- verifyAsync: verifySchnorrAsync,
2201
- });
2202
- // ## Precomputes
2203
- // --------------
2204
- const W = 8; // W is window size
2205
- const scalarBits = 256;
2206
- const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
2207
- const pwindowSize = 2 ** (W - 1); // 128 for W=8
2208
- const precompute = () => {
2209
- const points = [];
2210
- let p = G;
2211
- let b = p;
2212
- for (let w = 0; w < pwindows; w++) {
2213
- b = p;
2214
- points.push(b);
2215
- for (let i = 1; i < pwindowSize; i++) {
2216
- b = b.add(p);
2217
- points.push(b);
2218
- } // i=1, bc we skip 0
2219
- p = b.double();
2068
+ function createKeccak(bits = 512) {
2069
+ if (validateBits(bits)) {
2070
+ return Promise.reject(validateBits(bits));
2220
2071
  }
2221
- return points;
2222
- };
2223
- let Gpows = undefined; // precomputes for base point G
2224
- // Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
2225
- const ctneg = (cnd, p) => {
2226
- const n = p.negate();
2227
- return cnd ? n : p;
2072
+ const outputSize = bits / 8;
2073
+ return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
2074
+ wasm.init(bits);
2075
+ const obj = {
2076
+ init: () => {
2077
+ wasm.init(bits);
2078
+ return obj;
2079
+ },
2080
+ update: (data) => {
2081
+ wasm.update(data);
2082
+ return obj;
2083
+ },
2084
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2085
+ digest: (outputType) => wasm.digest(outputType, 0x01),
2086
+ save: () => wasm.save(),
2087
+ load: (data) => {
2088
+ wasm.load(data);
2089
+ return obj;
2090
+ },
2091
+ blockSize: 200 - 2 * outputSize,
2092
+ digestSize: outputSize,
2093
+ };
2094
+ return obj;
2095
+ });
2096
+ }
2097
+
2098
+ var name$a = "sha256";
2099
+ var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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";
2100
+ var hash$a = "8c18dd94";
2101
+ var wasmJson$a = {
2102
+ name: name$a,
2103
+ data: data$a,
2104
+ hash: hash$a
2228
2105
  };
2106
+
2107
+ new Mutex();
2229
2108
  /**
2230
- * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
2231
- * caching multiples of G (base point). Cache is stored in 32MB of RAM.
2232
- * Any time `G.multiply` is done, precomputes are used.
2233
- * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
2234
- *
2235
- * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
2236
- * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
2237
- *
2238
- * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
2109
+ * Creates a new SHA-2 (SHA-224) hash instance
2239
2110
  */
2240
- const wNAF = (n) => {
2241
- const comp = Gpows || (Gpows = precompute());
2242
- let p = I;
2243
- let f = G; // f must be G, or could become I in the end
2244
- const pow_2_w = 2 ** W; // 256 for W=8
2245
- const maxNum = pow_2_w; // 256 for W=8
2246
- const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
2247
- const shiftBy = big(W); // 8 for W=8
2248
- for (let w = 0; w < pwindows; w++) {
2249
- let wbits = Number(n & mask); // extract W bits.
2250
- n >>= shiftBy; // shift number by W bits.
2251
- // We use negative indexes to reduce size of precomputed table by 2x.
2252
- // Instead of needing precomputes 0..256, we only calculate them for 0..128.
2253
- // If an index > 128 is found, we do (256-index) - where 256 is next window.
2254
- // Naive: index +127 => 127, +224 => 224
2255
- // Optimized: index +127 => 127, +224 => 256-32
2256
- if (wbits > pwindowSize) {
2257
- wbits -= maxNum;
2258
- n += 1n;
2259
- }
2260
- const off = w * pwindowSize;
2261
- const offF = off; // offsets, evaluate both
2262
- const offP = off + Math.abs(wbits) - 1;
2263
- const isEven = w % 2 !== 0; // conditions, evaluate both
2264
- const isNeg = wbits < 0;
2265
- if (wbits === 0) {
2266
- // off == I: can't add it. Adding random offF instead.
2267
- f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
2268
- }
2269
- else {
2270
- p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
2271
- }
2272
- }
2273
- if (n !== 0n)
2274
- err$1('invalid wnaf');
2275
- return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
2111
+ function createSHA224() {
2112
+ return WASMInterface(wasmJson$a, 28).then((wasm) => {
2113
+ wasm.init(224);
2114
+ const obj = {
2115
+ init: () => {
2116
+ wasm.init(224);
2117
+ return obj;
2118
+ },
2119
+ update: (data) => {
2120
+ wasm.update(data);
2121
+ return obj;
2122
+ },
2123
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2124
+ digest: (outputType) => wasm.digest(outputType),
2125
+ save: () => wasm.save(),
2126
+ load: (data) => {
2127
+ wasm.load(data);
2128
+ return obj;
2129
+ },
2130
+ blockSize: 64,
2131
+ digestSize: 28,
2132
+ };
2133
+ return obj;
2134
+ });
2135
+ }
2136
+
2137
+ new Mutex();
2138
+ /**
2139
+ * Creates a new SHA-2 (SHA-256) hash instance
2140
+ */
2141
+ function createSHA256() {
2142
+ return WASMInterface(wasmJson$a, 32).then((wasm) => {
2143
+ wasm.init(256);
2144
+ const obj = {
2145
+ init: () => {
2146
+ wasm.init(256);
2147
+ return obj;
2148
+ },
2149
+ update: (data) => {
2150
+ wasm.update(data);
2151
+ return obj;
2152
+ },
2153
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2154
+ digest: (outputType) => wasm.digest(outputType),
2155
+ save: () => wasm.save(),
2156
+ load: (data) => {
2157
+ wasm.load(data);
2158
+ return obj;
2159
+ },
2160
+ blockSize: 64,
2161
+ digestSize: 32,
2162
+ };
2163
+ return obj;
2164
+ });
2165
+ }
2166
+
2167
+ var name$9 = "sha512";
2168
+ var data$9 = "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";
2169
+ var hash$9 = "f2e40eb1";
2170
+ var wasmJson$9 = {
2171
+ name: name$9,
2172
+ data: data$9,
2173
+ hash: hash$9
2276
2174
  };
2277
2175
 
2278
- const leofcoinOlivia = {
2279
- messagePrefix: '\u0019Leofcoin Signed Message:',
2280
- version: 1,
2281
- pubKeyHash: 0x73, // o
2282
- scriptHash: 0x76, // p
2283
- multiTxHash: 0x8b4125, // omtx
2284
- payments: {
2285
- version: 0,
2286
- unspent: 0x1fa443d7 // ounsp
2287
- },
2288
- wif: 0x7D, // s
2289
- multiCodec: 0x7c4,
2290
- bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
2291
- };
2292
- const bitcoinTestnet = {
2293
- messagePrefix: '\x18Bitcoin Signed Message:\n',
2294
- version: 1,
2295
- bech32: 'tb',
2296
- pubKeyHash: 0x6f,
2297
- scriptHash: 0xc4,
2298
- wif: 0xef,
2299
- bip32: {
2300
- public: 0x043587cf,
2301
- private: 0x04358394
2302
- },
2303
- multiCodec: 0
2304
- };
2305
- var testnets = {
2306
- 'leofcoin:olivia': leofcoinOlivia,
2307
- 'bitcoin:testnet': bitcoinTestnet
2176
+ new Mutex();
2177
+ /**
2178
+ * Creates a new SHA-2 (SHA-384) hash instance
2179
+ */
2180
+ function createSHA384() {
2181
+ return WASMInterface(wasmJson$9, 48).then((wasm) => {
2182
+ wasm.init(384);
2183
+ const obj = {
2184
+ init: () => {
2185
+ wasm.init(384);
2186
+ return obj;
2187
+ },
2188
+ update: (data) => {
2189
+ wasm.update(data);
2190
+ return obj;
2191
+ },
2192
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2193
+ digest: (outputType) => wasm.digest(outputType),
2194
+ save: () => wasm.save(),
2195
+ load: (data) => {
2196
+ wasm.load(data);
2197
+ return obj;
2198
+ },
2199
+ blockSize: 128,
2200
+ digestSize: 48,
2201
+ };
2202
+ return obj;
2203
+ });
2204
+ }
2205
+
2206
+ new Mutex();
2207
+ /**
2208
+ * Creates a new SHA-2 (SHA-512) hash instance
2209
+ */
2210
+ function createSHA512() {
2211
+ return WASMInterface(wasmJson$9, 64).then((wasm) => {
2212
+ wasm.init(512);
2213
+ const obj = {
2214
+ init: () => {
2215
+ wasm.init(512);
2216
+ return obj;
2217
+ },
2218
+ update: (data) => {
2219
+ wasm.update(data);
2220
+ return obj;
2221
+ },
2222
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2223
+ digest: (outputType) => wasm.digest(outputType),
2224
+ save: () => wasm.save(),
2225
+ load: (data) => {
2226
+ wasm.load(data);
2227
+ return obj;
2228
+ },
2229
+ blockSize: 128,
2230
+ digestSize: 64,
2231
+ };
2232
+ return obj;
2233
+ });
2234
+ }
2235
+
2236
+ new Mutex();
2237
+
2238
+ new Mutex();
2239
+
2240
+ new Mutex();
2241
+
2242
+ new Mutex();
2243
+
2244
+ var name$4 = "ripemd160";
2245
+ var data$4 = "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";
2246
+ var hash$4 = "6abbce74";
2247
+ var wasmJson$4 = {
2248
+ name: name$4,
2249
+ data: data$4,
2250
+ hash: hash$4
2308
2251
  };
2309
2252
 
2310
- // https://en.bitcoin.it/wiki/List_of_address_prefixes
2311
- // usage:
2312
- // networks['bitcoin']['testnet']
2313
- // networks.bitcoin.testnet
2253
+ new Mutex();
2314
2254
  /**
2315
- * Main network
2316
- * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
2255
+ * Creates a new RIPEMD-160 hash instance
2317
2256
  */
2318
- const leofcoin = {
2319
- messagePrefix: '\u0019Leofcoin Signed Message:',
2320
- version: 1,
2321
- pubKeyHash: 0x30, // L
2322
- scriptHash: 0x37, // P
2323
- multiTxHash: 0x3adeed, // Lmtx
2324
- payments: {
2325
- version: 0,
2326
- unspent: 0x0d6e0327 // Lunsp
2327
- },
2328
- coin_type: 640,
2329
- wif: 0x3F, // S
2330
- multiCodec: 0x3c4,
2331
- bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
2332
- testnet: testnets['leofcoin:olivia']
2333
- };
2334
- const bitcoin = {
2335
- messagePrefix: '\x18Bitcoin Signed Message:\n',
2336
- version: 1,
2337
- bech32: 'bc',
2338
- pubKeyHash: 0x00,
2339
- multiCodec: 0x00,
2340
- scriptHash: 0x05,
2341
- wif: 0x80,
2342
- coin_type: 0,
2343
- bip32: {
2344
- public: 0x0488b21e, private: 0x0488ade4
2345
- },
2346
- testnet: testnets['bitcoin:testnet']
2347
- };
2348
- const litecoin = {
2349
- messagePrefix: '\x19Litecoin Signed Message:\n',
2350
- version: 1,
2351
- pubKeyHash: 0x30,
2352
- scriptHash: 0x32,
2353
- wif: 0xb0,
2354
- bip32: {
2355
- public: 0x019da462,
2356
- private: 0x019d9cfe
2357
- },
2358
- bech32: '',
2359
- multiCodec: 0
2360
- };
2361
- const ethereum = {
2362
- messagePrefix: '\x19Ethereum Signed Message:\n',
2363
- version: 1,
2364
- pubKeyHash: 0x30,
2365
- scriptHash: 0x32,
2366
- bip32: {
2367
- private: 0x0488ADE4, public: 0x0488B21E
2368
- },
2369
- coin_type: 60,
2370
- wif: 0x45, //E
2371
- multiCodec: 0x3c5
2372
- };
2257
+ function createRIPEMD160() {
2258
+ return WASMInterface(wasmJson$4, 20).then((wasm) => {
2259
+ wasm.init();
2260
+ const obj = {
2261
+ init: () => {
2262
+ wasm.init();
2263
+ return obj;
2264
+ },
2265
+ update: (data) => {
2266
+ wasm.update(data);
2267
+ return obj;
2268
+ },
2269
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2270
+ digest: (outputType) => wasm.digest(outputType),
2271
+ save: () => wasm.save(),
2272
+ load: (data) => {
2273
+ wasm.load(data);
2274
+ return obj;
2275
+ },
2276
+ blockSize: 64,
2277
+ digestSize: 20,
2278
+ };
2279
+ return obj;
2280
+ });
2281
+ }
2282
+
2283
+ function calculateKeyBuffer(hasher, key) {
2284
+ const { blockSize } = hasher;
2285
+ const buf = getUInt8Buffer(key);
2286
+ if (buf.length > blockSize) {
2287
+ hasher.update(buf);
2288
+ const uintArr = hasher.digest("binary");
2289
+ hasher.init();
2290
+ return uintArr;
2291
+ }
2292
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
2293
+ }
2294
+ function calculateHmac(hasher, key) {
2295
+ hasher.init();
2296
+ const { blockSize } = hasher;
2297
+ const keyBuf = calculateKeyBuffer(hasher, key);
2298
+ const keyBuffer = new Uint8Array(blockSize);
2299
+ keyBuffer.set(keyBuf);
2300
+ const opad = new Uint8Array(blockSize);
2301
+ for (let i = 0; i < blockSize; i++) {
2302
+ const v = keyBuffer[i];
2303
+ opad[i] = v ^ 0x5c;
2304
+ keyBuffer[i] = v ^ 0x36;
2305
+ }
2306
+ hasher.update(keyBuffer);
2307
+ const obj = {
2308
+ init: () => {
2309
+ hasher.init();
2310
+ hasher.update(keyBuffer);
2311
+ return obj;
2312
+ },
2313
+ update: (data) => {
2314
+ hasher.update(data);
2315
+ return obj;
2316
+ },
2317
+ digest: ((outputType) => {
2318
+ const uintArr = hasher.digest("binary");
2319
+ hasher.init();
2320
+ hasher.update(opad);
2321
+ hasher.update(uintArr);
2322
+ return hasher.digest(outputType);
2323
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2324
+ }),
2325
+ save: () => {
2326
+ throw new Error("save() not supported");
2327
+ },
2328
+ load: () => {
2329
+ throw new Error("load() not supported");
2330
+ },
2331
+ blockSize: hasher.blockSize,
2332
+ digestSize: hasher.digestSize,
2333
+ };
2334
+ return obj;
2335
+ }
2373
2336
  /**
2374
- * Our & supported networks
2375
- * @return {leofcoin, olivia}
2337
+ * Calculates HMAC hash
2338
+ * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
2339
+ * @param key Key (string, Buffer or TypedArray)
2376
2340
  */
2377
- var networks = {
2378
- leofcoin,
2379
- bitcoin,
2380
- litecoin,
2381
- ethereum
2382
- };
2341
+ function createHMAC(hash, key) {
2342
+ if (!hash || !hash.then) {
2343
+ throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
2344
+ }
2345
+ return hash.then((hasher) => calculateHmac(hasher, key));
2346
+ }
2347
+
2348
+ new Mutex();
2349
+
2350
+ new Mutex();
2383
2351
 
2384
- const encode$5 = (version, privateKey, compressed) => {
2352
+ const encode$1$1 = (version, privateKey, compressed) => {
2385
2353
  if (privateKey.length !== 32)
2386
2354
  throw new TypeError(`Invalid privateKey length: expected 32 got ${privateKey.length}`);
2387
2355
  const uint8Array = new Uint8Array(compressed ? 34 : 33);
@@ -2392,7 +2360,7 @@ const encode$5 = (version, privateKey, compressed) => {
2392
2360
  }
2393
2361
  return base58check.encode(uint8Array);
2394
2362
  };
2395
- const decode$6 = async (wif, version) => {
2363
+ const decode$1$1 = async (wif, version) => {
2396
2364
  wif = (await base58check.decode(wif)).data;
2397
2365
  if (version && wif[0] !== version)
2398
2366
  throw new Error('Invalid network version');
@@ -2407,7 +2375,7 @@ const decode$6 = async (wif, version) => {
2407
2375
  compressed: wif.length === 33 ? false : true
2408
2376
  };
2409
2377
  };
2410
- var wif = { encode: encode$5, decode: decode$6 };
2378
+ var wif = { encode: encode$1$1, decode: decode$1$1 };
2411
2379
 
2412
2380
  const HIGHEST_BIT = 0x80000000;
2413
2381
  const privateKeyVerify = (privateKey) => utils$2.isValidSecretKey(privateKey);
@@ -2528,7 +2496,7 @@ class HdNode {
2528
2496
  else {
2529
2497
  set.push(new Uint8Array(this.publicKey));
2530
2498
  }
2531
- return base58check.encode(index$2(set));
2499
+ return base58check.encode(index$3(set));
2532
2500
  }
2533
2501
  toWIF() {
2534
2502
  if (!this.#privateKey)
@@ -2544,14 +2512,14 @@ class HdNode {
2544
2512
  if (this.isNeutered)
2545
2513
  throw new TypeError('Missing private key for hardened child key');
2546
2514
  // data = 0x00 || ser256(kpar) || ser32(index)
2547
- data = index$2([
2515
+ data = index$3([
2548
2516
  new TextEncoder().encode('0'),
2549
2517
  this.privateKey,
2550
2518
  new TextEncoder().encode(index.toString()),
2551
2519
  ]);
2552
2520
  }
2553
2521
  else {
2554
- data = index$2([
2522
+ data = index$3([
2555
2523
  this.publicKey,
2556
2524
  new TextEncoder().encode(index.toString()),
2557
2525
  ]);
@@ -2611,7 +2579,7 @@ class HdNode {
2611
2579
  let buffer = (await base58check.decode(string)).data;
2612
2580
  // @ts-ignore
2613
2581
  network = network || networks.leofcoin;
2614
- const result = index$1$1(buffer);
2582
+ const result = index$2(buffer);
2615
2583
  const version = Number(new TextDecoder().decode(result[0]));
2616
2584
  const depth = Number(new TextDecoder().decode(result[1]));
2617
2585
  const parentFingerprint = Number(new TextDecoder().decode(result[2]));
@@ -4881,6 +4849,38 @@ class HDWallet {
4881
4849
  }
4882
4850
  }
4883
4851
 
4852
+ const ALPHABET$2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
4853
+ const ALPHABET_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
4854
+ const base32 = base(ALPHABET$2);
4855
+ const base32Hex = base(ALPHABET_HEX);
4856
+ const decode$6 = base32.decode;
4857
+ const decodeHex = base32Hex.decode;
4858
+ const encode$5 = base32.encode;
4859
+ const encodeHex = base32Hex.encode;
4860
+ const isBase32 = (string, hex = false) => {
4861
+ try {
4862
+ if (hex)
4863
+ decodeHex(string);
4864
+ else
4865
+ decode$6(string);
4866
+ return true;
4867
+ }
4868
+ catch (e) {
4869
+ return false;
4870
+ }
4871
+ };
4872
+ const isBase32Hex = (string) => {
4873
+ return isBase32(string, true);
4874
+ };
4875
+ var index$5 = {
4876
+ encode: encode$5,
4877
+ decode: decode$6,
4878
+ encodeHex,
4879
+ decodeHex,
4880
+ isBase32,
4881
+ isBase32Hex,
4882
+ };
4883
+
4884
4884
  hashes.sha256 = (message) => {
4885
4885
  message = Buffer.isBuffer(message) ? new Uint8Array(message) : message;
4886
4886
  return new Uint8Array(createHash$1("sha256").update(message).digest());
@@ -4950,8 +4950,8 @@ class MultiSignature {
4950
4950
  if (!signature)
4951
4951
  throw ReferenceError("signature undefined");
4952
4952
  this.#multiSignature = typedArrayConcat([
4953
- index$3.encode(this.version),
4954
- index$3.encode(this.multiCodec),
4953
+ index$4.encode(this.version),
4954
+ index$4.encode(this.multiCodec),
4955
4955
  signature,
4956
4956
  ]);
4957
4957
  return this.multiSignature;
@@ -4967,10 +4967,10 @@ class MultiSignature {
4967
4967
  if (!this.multiSignature)
4968
4968
  throw ReferenceError("multiSignature undefined");
4969
4969
  let buffer = this.multiSignature;
4970
- const version = index$3.decode(buffer);
4971
- buffer = buffer.subarray(index$3.decode.bytes);
4972
- const codec = index$3.decode(buffer);
4973
- buffer = buffer.subarray(index$3.decode.bytes);
4970
+ const version = index$4.decode(buffer);
4971
+ buffer = buffer.subarray(index$4.decode.bytes);
4972
+ const codec = index$4.decode(buffer);
4973
+ buffer = buffer.subarray(index$4.decode.bytes);
4974
4974
  const signature = buffer.subarray(0, buffer.length);
4975
4975
  console.log("[decode] extracted signature length:", signature.length);
4976
4976
  console.log("[decode] extracted signature (hex):", Buffer.from(signature).toString("hex"));
@@ -4998,16 +4998,16 @@ class MultiSignature {
4998
4998
  return this.decode(base58$1.decode(string));
4999
4999
  }
5000
5000
  toBs32() {
5001
- return index$4.encode(this.multiSignature);
5001
+ return index$5.encode(this.multiSignature);
5002
5002
  }
5003
5003
  fromBs32(string) {
5004
- return this.decode(index$4.decode(string));
5004
+ return this.decode(index$5.decode(string));
5005
5005
  }
5006
5006
  toBs32Hex() {
5007
- return index$4.encodeHex(this.multiSignature);
5007
+ return index$5.encodeHex(this.multiSignature);
5008
5008
  }
5009
5009
  fromBs32Hex(string) {
5010
- return this.decode(index$4.decodeHex(string));
5010
+ return this.decode(index$5.decodeHex(string));
5011
5011
  }
5012
5012
  toBs58Hex() {
5013
5013
  return base58$1.encodeHex(this.multiSignature);
@@ -5038,11 +5038,11 @@ var encrypt = async (password, data, version = new TextEncoder().encode('1')) =>
5038
5038
  name: 'AES-GCM',
5039
5039
  iv
5040
5040
  }, key, new TextEncoder().encode(data));
5041
- return index$2([version, salt, iv, new Uint8Array(encrypted)]);
5041
+ return index$3([version, salt, iv, new Uint8Array(encrypted)]);
5042
5042
  };
5043
5043
 
5044
5044
  var decrypt = async (password, concatecated) => {
5045
- const [version, salt, iv, cipher] = index$1$1(concatecated);
5045
+ const [version, salt, iv, cipher] = index$2(concatecated);
5046
5046
  let iterations;
5047
5047
  if (new TextDecoder().decode(version) === '1') {
5048
5048
  iterations = 250000;
@@ -5062,7 +5062,7 @@ class MultiHDNode extends HDWallet {
5062
5062
  super(network, hdnode);
5063
5063
  }
5064
5064
  get id() {
5065
- return base58check.encode(index$2([
5065
+ return base58check.encode(index$3([
5066
5066
  new TextEncoder().encode(this.version.toString()),
5067
5067
  this.account(0).hdnode.neutered.publicKey
5068
5068
  ]));
@@ -5072,8 +5072,8 @@ class MultiHDNode extends HDWallet {
5072
5072
  }
5073
5073
  async fromId(id) {
5074
5074
  let buffer = (await base58check.decode(id)).data;
5075
- index$3.decode(buffer);
5076
- buffer = buffer.slice(index$3.decode.bytes);
5075
+ index$4.decode(buffer);
5076
+ buffer = buffer.slice(index$4.decode.bytes);
5077
5077
  this.fromPublicKey(buffer, null, this.networkName);
5078
5078
  }
5079
5079
  async import(password, encrypted) {
@@ -5095,7 +5095,7 @@ class MultiHDNode extends HDWallet {
5095
5095
  this.locked = false;
5096
5096
  }
5097
5097
  fromMultiWif(string) {
5098
- const { version, codec, privateKey } = index$5.decode(string);
5098
+ const { version, codec, privateKey } = index$1$1.decode(string);
5099
5099
  this.network = Object.values(networks).reduce((p, c) => {
5100
5100
  if (c.multiCodec === codec)
5101
5101
  return c;
@@ -5109,7 +5109,7 @@ class MultiHDNode extends HDWallet {
5109
5109
  return this.fromPrivateKey(privateKey, undefined, this.network);
5110
5110
  }
5111
5111
  toMultiWif() {
5112
- return index$5.encode(this.network.version, this.network.multiCodec, this.privateKey);
5112
+ return index$1$1.encode(this.network.version, this.network.multiCodec, this.privateKey);
5113
5113
  }
5114
5114
  sign(hash) {
5115
5115
  return new MultiSignature(this.version, this.network.multiCodec)
@@ -5156,7 +5156,7 @@ class MultiWallet extends MultiHDNode {
5156
5156
  super(network, hdnode);
5157
5157
  }
5158
5158
  get id() {
5159
- return base58check.encode(index$2([
5159
+ return base58check.encode(index$3([
5160
5160
  new TextEncoder().encode(this.version.toString()),
5161
5161
  this.account(0).hdnode.neutered.publicKey,
5162
5162
  ]));
@@ -8337,7 +8337,7 @@ class Identity {
8337
8337
  this.selectedAccount = new TextDecoder().decode(selected);
8338
8338
  }
8339
8339
  else {
8340
- const importee = await import(/* webpackChunkName: "generate-account" */ './index-D6qd-AUn-cJS9xh8w.js');
8340
+ const importee = await import(/* webpackChunkName: "generate-account" */ './index-DIhxISkU-Bdapw5qM.js');
8341
8341
  const { identity, accounts } = await importee.default(password, this.network);
8342
8342
  await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
8343
8343
  await globalThis.walletStore.put('version', String(1));
@@ -8580,7 +8580,7 @@ var isHex = string => /^[A-F0-9]+$/i.test(
8580
8580
  string
8581
8581
  );
8582
8582
 
8583
- /*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
8583
+ /*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
8584
8584
  // (C) 1995-2013 Jean-loup Gailly and Mark Adler
8585
8585
  // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
8586
8586
  //
@@ -10002,7 +10002,7 @@ const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = tr
10002
10002
 
10003
10003
  const {
10004
10004
  Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1,
10005
- Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$1,
10005
+ Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$2,
10006
10006
  Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,
10007
10007
  Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,
10008
10008
  Z_UNKNOWN,
@@ -10101,11 +10101,35 @@ const slide_hash = (s) => {
10101
10101
  };
10102
10102
 
10103
10103
  /* eslint-disable new-cap */
10104
- let HASH_ZLIB = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
10105
- // This hash causes less collisions, https://github.com/nodeca/pako/issues/135
10106
- // But breaks binary compatibility
10107
- //let HASH_FAST = (s, prev, data) => ((prev << 8) + (prev >> 8) + (data << 4)) & s.hash_mask;
10108
- let HASH = HASH_ZLIB;
10104
+ let HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
10105
+
10106
+
10107
+ /* ===========================================================================
10108
+ * Insert string str in the dictionary and set match_head to the previous head
10109
+ * of the hash chain (the most recent string with same hash key). Return
10110
+ * the previous length of the hash chain.
10111
+ * IN assertion: all calls to INSERT_STRING are made with consecutive input
10112
+ * characters and the first MIN_MATCH bytes of str are valid (except for
10113
+ * the last MIN_MATCH-1 bytes of the input file).
10114
+ */
10115
+ const INSERT_STRING = (s, str) => {
10116
+ let h;
10117
+ if (s.legacy_hash) {
10118
+ /* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */
10119
+ h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
10120
+ } else {
10121
+ // ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash
10122
+ // restores classic zlib hash). Faster, with fewer collisions.
10123
+ const w = s.window;
10124
+ // Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in
10125
+ // `(value * 66521 + 66521) >> 16` exactly.
10126
+ const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24);
10127
+ h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask;
10128
+ }
10129
+ const hash_head = s.prev[str & s.w_mask] = s.head[h];
10130
+ s.head[h] = str;
10131
+ return hash_head;
10132
+ };
10109
10133
 
10110
10134
 
10111
10135
  /* =========================================================================
@@ -10379,7 +10403,20 @@ const fill_window = (s) => {
10379
10403
  s.lookahead += n;
10380
10404
 
10381
10405
  /* Initialize the hash value now that we have some input: */
10382
- if (s.lookahead + s.insert >= MIN_MATCH) {
10406
+ if (!s.legacy_hash) {
10407
+ /* The 4-byte hash reads one extra byte, so it needs one more available. */
10408
+ if (s.lookahead + s.insert > MIN_MATCH) {
10409
+ str = s.strstart - s.insert;
10410
+ while (s.insert) {
10411
+ INSERT_STRING(s, str);
10412
+ str++;
10413
+ s.insert--;
10414
+ if (s.lookahead + s.insert <= MIN_MATCH) {
10415
+ break;
10416
+ }
10417
+ }
10418
+ }
10419
+ } else if (s.lookahead + s.insert >= MIN_MATCH) {
10383
10420
  str = s.strstart - s.insert;
10384
10421
  s.ins_h = s.window[str];
10385
10422
 
@@ -10389,11 +10426,7 @@ const fill_window = (s) => {
10389
10426
  // Call update_hash() MIN_MATCH-3 more times
10390
10427
  //#endif
10391
10428
  while (s.insert) {
10392
- /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
10393
- s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
10394
-
10395
- s.prev[str & s.w_mask] = s.head[s.ins_h];
10396
- s.head[s.ins_h] = str;
10429
+ INSERT_STRING(s, str);
10397
10430
  str++;
10398
10431
  s.insert--;
10399
10432
  if (s.lookahead + s.insert < MIN_MATCH) {
@@ -10691,11 +10724,7 @@ const deflate_fast = (s, flush) => {
10691
10724
  */
10692
10725
  hash_head = 0/*NIL*/;
10693
10726
  if (s.lookahead >= MIN_MATCH) {
10694
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
10695
- s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
10696
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
10697
- s.head[s.ins_h] = s.strstart;
10698
- /***/
10727
+ hash_head = INSERT_STRING(s, s.strstart);
10699
10728
  }
10700
10729
 
10701
10730
  /* Find the longest match, discarding those <= prev_length.
@@ -10725,11 +10754,7 @@ const deflate_fast = (s, flush) => {
10725
10754
  s.match_length--; /* string at strstart already in table */
10726
10755
  do {
10727
10756
  s.strstart++;
10728
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
10729
- s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
10730
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
10731
- s.head[s.ins_h] = s.strstart;
10732
- /***/
10757
+ hash_head = INSERT_STRING(s, s.strstart);
10733
10758
  /* strstart never exceeds WSIZE-MAX_MATCH, so there are
10734
10759
  * always MIN_MATCH bytes ahead.
10735
10760
  */
@@ -10739,16 +10764,18 @@ const deflate_fast = (s, flush) => {
10739
10764
  {
10740
10765
  s.strstart += s.match_length;
10741
10766
  s.match_length = 0;
10742
- s.ins_h = s.window[s.strstart];
10743
- /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
10744
- s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);
10767
+ if (s.legacy_hash) {
10768
+ s.ins_h = s.window[s.strstart];
10769
+ /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
10770
+ s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);
10745
10771
 
10746
10772
  //#if MIN_MATCH != 3
10747
10773
  // Call UPDATE_HASH() MIN_MATCH-3 more times
10748
10774
  //#endif
10749
- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
10750
- * matter since it will be recomputed at next deflate call.
10751
- */
10775
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
10776
+ * matter since it will be recomputed at next deflate call.
10777
+ */
10778
+ }
10752
10779
  }
10753
10780
  } else {
10754
10781
  /* No match, output a literal byte */
@@ -10821,11 +10848,7 @@ const deflate_slow = (s, flush) => {
10821
10848
  */
10822
10849
  hash_head = 0/*NIL*/;
10823
10850
  if (s.lookahead >= MIN_MATCH) {
10824
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
10825
- s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
10826
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
10827
- s.head[s.ins_h] = s.strstart;
10828
- /***/
10851
+ hash_head = INSERT_STRING(s, s.strstart);
10829
10852
  }
10830
10853
 
10831
10854
  /* Find the longest match, discarding those <= prev_length.
@@ -10873,11 +10896,7 @@ const deflate_slow = (s, flush) => {
10873
10896
  s.prev_length -= 2;
10874
10897
  do {
10875
10898
  if (++s.strstart <= max_insert) {
10876
- /*** INSERT_STRING(s, s.strstart, hash_head); ***/
10877
- s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + MIN_MATCH - 1]);
10878
- hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
10879
- s.head[s.ins_h] = s.strstart;
10880
- /***/
10899
+ hash_head = INSERT_STRING(s, s.strstart);
10881
10900
  }
10882
10901
  } while (--s.prev_length !== 0);
10883
10902
  s.match_available = 0;
@@ -11202,6 +11221,7 @@ function DeflateState() {
11202
11221
  this.head = null; /* Heads of the hash chains or NIL. */
11203
11222
 
11204
11223
  this.ins_h = 0; /* hash index of string to be inserted */
11224
+ this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */
11205
11225
  this.hash_size = 0; /* number of elements in hash table */
11206
11226
  this.hash_bits = 0; /* log2(hash_size) */
11207
11227
  this.hash_mask = 0; /* hash_size-1 */
@@ -11424,7 +11444,7 @@ const deflateSetHeader = (strm, head) => {
11424
11444
  };
11425
11445
 
11426
11446
 
11427
- const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
11447
+ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => {
11428
11448
 
11429
11449
  if (!strm) { // === Z_NULL
11430
11450
  return Z_STREAM_ERROR$2;
@@ -11470,7 +11490,13 @@ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
11470
11490
  s.w_size = 1 << s.w_bits;
11471
11491
  s.w_mask = s.w_size - 1;
11472
11492
 
11493
+ s.legacy_hash = legacyHash ? 1 : 0;
11494
+
11473
11495
  s.hash_bits = memLevel + 7;
11496
+ /* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */
11497
+ if (!s.legacy_hash && s.hash_bits < 15) {
11498
+ s.hash_bits = 15;
11499
+ }
11474
11500
  s.hash_size = 1 << s.hash_bits;
11475
11501
  s.hash_mask = s.hash_size - 1;
11476
11502
  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
@@ -11562,7 +11588,7 @@ const deflate$2 = (strm, flush) => {
11562
11588
  if (!strm.output ||
11563
11589
  (strm.avail_in !== 0 && !strm.input) ||
11564
11590
  (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {
11565
- return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);
11591
+ return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2);
11566
11592
  }
11567
11593
 
11568
11594
  const old_flush = s.last_flush;
@@ -11588,12 +11614,12 @@ const deflate$2 = (strm, flush) => {
11588
11614
  */
11589
11615
  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
11590
11616
  flush !== Z_FINISH$3) {
11591
- return err(strm, Z_BUF_ERROR$1);
11617
+ return err(strm, Z_BUF_ERROR$2);
11592
11618
  }
11593
11619
 
11594
11620
  /* User must not provide more input after the first FINISH: */
11595
11621
  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
11596
- return err(strm, Z_BUF_ERROR$1);
11622
+ return err(strm, Z_BUF_ERROR$2);
11597
11623
  }
11598
11624
 
11599
11625
  /* Write the header */
@@ -11974,12 +12000,7 @@ const deflateSetDictionary = (strm, dictionary) => {
11974
12000
  let str = s.strstart;
11975
12001
  let n = s.lookahead - (MIN_MATCH - 1);
11976
12002
  do {
11977
- /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */
11978
- s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
11979
-
11980
- s.prev[str & s.w_mask] = s.head[s.ins_h];
11981
-
11982
- s.head[s.ins_h] = str;
12003
+ INSERT_STRING(s, str);
11983
12004
  str++;
11984
12005
  } while (--n);
11985
12006
  s.strstart = str;
@@ -12103,7 +12124,7 @@ const _utf8len = new Uint8Array(256);
12103
12124
  for (let q = 0; q < 256; q++) {
12104
12125
  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
12105
12126
  }
12106
- _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
12127
+ _utf8len[254] = _utf8len[255] = 1; // Invalid sequence start
12107
12128
 
12108
12129
 
12109
12130
  // convert string to array (typed, when possible)
@@ -12324,6 +12345,15 @@ const {
12324
12345
 
12325
12346
  /* ===========================================================================*/
12326
12347
 
12348
+ const defaultOptions$1 = {
12349
+ level: Z_DEFAULT_COMPRESSION,
12350
+ method: Z_DEFLATED$1,
12351
+ chunkSize: 16384,
12352
+ windowBits: 15,
12353
+ memLevel: 8,
12354
+ strategy: Z_DEFAULT_STRATEGY,
12355
+ legacyHash: true
12356
+ };
12327
12357
 
12328
12358
  /**
12329
12359
  * class Deflate
@@ -12379,6 +12409,10 @@ const {
12379
12409
  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
12380
12410
  * for more information on these.
12381
12411
  *
12412
+ * - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches
12413
+ * canonical zlib output byte-for-byte. Set to `false` to use the faster
12414
+ * ANZAC++ hash, which matches recent (chromium) node.js output instead.
12415
+ *
12382
12416
  * Additional options, for internal needs:
12383
12417
  *
12384
12418
  * - `chunkSize` - size of generated data chunks (16K by default)
@@ -12411,14 +12445,7 @@ const {
12411
12445
  * ```
12412
12446
  **/
12413
12447
  function Deflate$1(options) {
12414
- this.options = common.assign({
12415
- level: Z_DEFAULT_COMPRESSION,
12416
- method: Z_DEFLATED$1,
12417
- chunkSize: 16384,
12418
- windowBits: 15,
12419
- memLevel: 8,
12420
- strategy: Z_DEFAULT_STRATEGY
12421
- }, options || {});
12448
+ this.options = common.assign({}, defaultOptions$1, options || {});
12422
12449
 
12423
12450
  let opt = this.options;
12424
12451
 
@@ -12444,7 +12471,8 @@ function Deflate$1(options) {
12444
12471
  opt.method,
12445
12472
  opt.windowBits,
12446
12473
  opt.memLevel,
12447
- opt.strategy
12474
+ opt.strategy,
12475
+ opt.legacyHash
12448
12476
  );
12449
12477
 
12450
12478
  if (status !== Z_OK$2) {
@@ -13064,7 +13092,7 @@ const lbase = new Uint16Array([ /* Length codes 257..285 base */
13064
13092
 
13065
13093
  const lext = new Uint8Array([ /* Length codes 257..285 extra */
13066
13094
  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
13067
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78
13095
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75
13068
13096
  ]);
13069
13097
 
13070
13098
  const dbase = new Uint16Array([ /* Distance codes 0..29 base */
@@ -13401,7 +13429,7 @@ const DISTS = 2;
13401
13429
 
13402
13430
  const {
13403
13431
  Z_FINISH: Z_FINISH$1, Z_BLOCK, Z_TREES,
13404
- Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR,
13432
+ Z_OK: Z_OK$1, Z_STREAM_END: Z_STREAM_END$1, Z_NEED_DICT: Z_NEED_DICT$1, Z_STREAM_ERROR: Z_STREAM_ERROR$1, Z_DATA_ERROR: Z_DATA_ERROR$1, Z_MEM_ERROR: Z_MEM_ERROR$1, Z_BUF_ERROR: Z_BUF_ERROR$1,
13405
13433
  Z_DEFLATED
13406
13434
  } = constants$2;
13407
13435
 
@@ -13711,11 +13739,14 @@ const updatewindow = (strm, src, end, copy) => {
13711
13739
 
13712
13740
  /* if it hasn't been done already, allocate space for the window */
13713
13741
  if (state.window === null) {
13742
+ state.window = new Uint8Array(1 << state.wbits);
13743
+ }
13744
+
13745
+ /* if window not in use yet, initialize */
13746
+ if (state.wsize === 0) {
13714
13747
  state.wsize = 1 << state.wbits;
13715
13748
  state.wnext = 0;
13716
13749
  state.whave = 0;
13717
-
13718
- state.window = new Uint8Array(state.wsize);
13719
13750
  }
13720
13751
 
13721
13752
  /* copy state->wsize or less output bytes into the circular window */
@@ -14841,7 +14872,7 @@ const inflate$2 = (strm, flush) => {
14841
14872
  (state.mode === TYPE ? 128 : 0) +
14842
14873
  (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
14843
14874
  if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {
14844
- ret = Z_BUF_ERROR;
14875
+ ret = Z_BUF_ERROR$1;
14845
14876
  }
14846
14877
  return ret;
14847
14878
  };
@@ -15013,11 +15044,16 @@ const toString$2 = Object.prototype.toString;
15013
15044
 
15014
15045
  const {
15015
15046
  Z_NO_FLUSH, Z_FINISH,
15016
- Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR
15047
+ Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR
15017
15048
  } = constants$2;
15018
15049
 
15019
15050
  /* ===========================================================================*/
15020
15051
 
15052
+ const defaultOptions$2 = {
15053
+ chunkSize: 1024 * 64,
15054
+ windowBits: 15,
15055
+ to: ''
15056
+ };
15021
15057
 
15022
15058
  /**
15023
15059
  * class Inflate
@@ -15097,11 +15133,7 @@ const {
15097
15133
  * ```
15098
15134
  **/
15099
15135
  function Inflate$1(options) {
15100
- this.options = common.assign({
15101
- chunkSize: 1024 * 64,
15102
- windowBits: 15,
15103
- to: ''
15104
- }, options || {});
15136
+ this.options = common.assign({}, defaultOptions$2, options || {});
15105
15137
 
15106
15138
  const opt = this.options;
15107
15139
 
@@ -15232,11 +15264,19 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15232
15264
  }
15233
15265
  }
15234
15266
 
15235
- // Skip snyc markers if more data follows and not raw mode
15267
+ // Only the gzip format defines concatenated members (RFC 1952: a gzip file
15268
+ // is "a series of members"). A zlib stream (RFC 1950) ends after its
15269
+ // ADLER32, and a raw DEFLATE stream (RFC 1951) ends after its final block -
15270
+ // neither format allows anything to follow, so bytes after the end are not
15271
+ // ours to interpret and must be left in the input. Restart decoding only
15272
+ // for a gzip member: `state.flags` is non-zero only once a gzip header has
15273
+ // actually been decoded (it stays 0 for a zlib member, even when the format
15274
+ // was auto-detected and the gzip bit of `wrap` is set). A trailing zero
15275
+ // byte is padding, not the start of a member (no member can begin with 0).
15236
15276
  while (strm.avail_in > 0 &&
15237
15277
  status === Z_STREAM_END &&
15238
- strm.state.wrap > 0 &&
15239
- data[strm.next_in] !== 0)
15278
+ (strm.state.wrap & 2) && strm.state.flags !== 0 &&
15279
+ strm.input[strm.next_in] !== 0)
15240
15280
  {
15241
15281
  inflate_1$2.inflateReset(strm);
15242
15282
  status = inflate_1$2.inflate(strm, _flush_mode);
@@ -15257,7 +15297,9 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15257
15297
  last_avail_out = strm.avail_out;
15258
15298
 
15259
15299
  if (strm.next_out) {
15260
- if (strm.avail_out === 0 || status === Z_STREAM_END) {
15300
+ // Flush output if buffer is full, stream ended, or an explicit flush was
15301
+ // requested (e.g. Z_SYNC_FLUSH) - to push out the tail, same as node's zlib.
15302
+ if (strm.avail_out === 0 || status === Z_STREAM_END || _flush_mode > 0) {
15261
15303
 
15262
15304
  if (this.options.to === 'string') {
15263
15305
 
@@ -15275,12 +15317,22 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15275
15317
 
15276
15318
  } else {
15277
15319
  this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
15320
+
15321
+ // Force a fresh output buffer on next iteration / next push, so the
15322
+ // already emitted tail is not sent again.
15323
+ strm.avail_out = 0;
15324
+ strm.next_out = 0;
15278
15325
  }
15279
15326
  }
15280
15327
  }
15281
15328
 
15282
- // Must repeat iteration if out buffer is full
15283
- if (status === Z_OK && last_avail_out === 0) continue;
15329
+ // A full output buffer means there may be more to produce - allocate a new
15330
+ // one and call inflate again. The status depends on the flush mode: with
15331
+ // Z_NO_FLUSH a full buffer is reported as Z_OK, but with Z_FINISH the same
15332
+ // situation is reported as Z_BUF_ERROR ("could not make progress now",
15333
+ // non-fatal) even though output is still pending. Both must continue; the
15334
+ // distinction that matters is purely "was the output buffer exhausted".
15335
+ if ((status === Z_OK || status === Z_BUF_ERROR) && last_avail_out === 0) continue;
15284
15336
 
15285
15337
  // Finalize if end of stream reached.
15286
15338
  if (status === Z_STREAM_END) {
@@ -15290,7 +15342,23 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15290
15342
  return true;
15291
15343
  }
15292
15344
 
15293
- if (strm.avail_in === 0) break;
15345
+ if (strm.avail_in === 0) {
15346
+ // Input is exhausted. If the caller declared this the end of the stream
15347
+ // (Z_FINISH) but we never saw Z_STREAM_END, the compressed data ended
15348
+ // before its terminating marker - i.e. it is truncated/incomplete. That
15349
+ // is an error: returning the partial output as success would be
15350
+ // indistinguishable from a complete decode, hiding the data loss. Report
15351
+ // it via Z_BUF_ERROR. (Reached only when the output buffer still had room
15352
+ // - a full buffer is handled by the `continue` above - so this genuinely
15353
+ // means "ran out of input", not "ran out of output".)
15354
+ if (_flush_mode === Z_FINISH) {
15355
+ status = inflate_1$2.inflateEnd(this.strm);
15356
+ this.onEnd(status === Z_OK ? Z_BUF_ERROR : status);
15357
+ this.ended = true;
15358
+ return false;
15359
+ }
15360
+ break;
15361
+ }
15294
15362
  }
15295
15363
 
15296
15364
  return true;
@@ -15376,7 +15444,7 @@ Inflate$1.prototype.onEnd = function (status) {
15376
15444
  function inflate$1(input, options) {
15377
15445
  const inflator = new Inflate$1(options);
15378
15446
 
15379
- inflator.push(input);
15447
+ inflator.push(input, true);
15380
15448
 
15381
15449
  // That will never happens, if you don't cheat with options :)
15382
15450
  if (inflator.err) throw inflator.msg || messages[inflator.err];
@@ -15505,7 +15573,7 @@ const encode = (proto, input, compress) => {
15505
15573
  throw new Error(`minimumLength for ${token.key} is set to ${token.minimumLength} but got ${data.length}`);
15506
15574
  set.push(toType(data !== undefined ? data : token.defaultValue));
15507
15575
  }
15508
- return compress ? pako.deflate(index$2(set)) : index$2(set);
15576
+ return compress ? pako.deflate(index$3(set)) : index$3(set);
15509
15577
  };
15510
15578
 
15511
15579
  const ALPHABET$1 = '0123456789ABCDEF';
@@ -15544,7 +15612,7 @@ const toHex = (bytes) => bytes.reduce((string, byte) => string + byte.toString(1
15544
15612
  const fromArrayLike = (array) => Uint8Array.from(array);
15545
15613
  const toBase58 = (uint8Array) => base58$1.encode(uint8Array);
15546
15614
  const fromBase58 = (string) => base58$1.decode(string);
15547
- const toBase32 = (uint8Array) => index$4.encode(uint8Array);
15615
+ const toBase32 = (uint8Array) => index$5.encode(uint8Array);
15548
15616
  var index$1 = {
15549
15617
  toString: toString$1};
15550
15618
 
@@ -15553,7 +15621,7 @@ const decoder = new TextDecoder();
15553
15621
  const decode = (proto, uint8Array, compressed) => {
15554
15622
  if (compressed)
15555
15623
  uint8Array = pako.inflate(uint8Array);
15556
- let deconcated = index$1$1(uint8Array);
15624
+ let deconcated = index$2(uint8Array);
15557
15625
  const output = {};
15558
15626
  const tokens = getTokens(proto);
15559
15627
  if (tokens.length !== deconcated.length)
@@ -15644,13 +15712,13 @@ class BasicInterface {
15644
15712
  this.fromBs58(value);
15645
15713
  }
15646
15714
  catch {
15647
- if (index$4.isBase32(value))
15715
+ if (index$5.isBase32(value))
15648
15716
  this.fromBs32(value);
15649
15717
  else
15650
15718
  throw new Error('Invalid base58/base32 input');
15651
15719
  }
15652
15720
  }
15653
- else if (index$4.isBase32(value))
15721
+ else if (index$5.isBase32(value))
15654
15722
  this.fromBs32(value);
15655
15723
  else
15656
15724
  this.fromString(value);
@@ -15718,13 +15786,13 @@ class BasicInterface {
15718
15786
  return isHex(string);
15719
15787
  }
15720
15788
  isBase32(string) {
15721
- return index$4.isBase32(string);
15789
+ return index$5.isBase32(string);
15722
15790
  }
15723
15791
  isBase58(string) {
15724
15792
  return base58$1.isBase58(string);
15725
15793
  }
15726
15794
  fromBs32(encoded) {
15727
- return this.decode(index$4.decode(encoded));
15795
+ return this.decode(index$5.decode(encoded));
15728
15796
  }
15729
15797
  fromBs58(encoded) {
15730
15798
  return this.decode(fromBase58(encoded));
@@ -16052,7 +16120,7 @@ let Codec$1 = class Codec extends BasicInterface {
16052
16120
  super();
16053
16121
  if (buffer) {
16054
16122
  if (buffer instanceof Uint8Array) {
16055
- const codec = index$3.decode(buffer);
16123
+ const codec = index$4.decode(buffer);
16056
16124
  const name = this.getCodecName(codec);
16057
16125
  if (name) {
16058
16126
  this.name = name;
@@ -16064,7 +16132,7 @@ let Codec$1 = class Codec extends BasicInterface {
16064
16132
  }
16065
16133
  }
16066
16134
  else if (buffer instanceof ArrayBuffer) {
16067
- const codec = index$3.decode(buffer);
16135
+ const codec = index$4.decode(buffer);
16068
16136
  const name = this.getCodecName(codec);
16069
16137
  if (name) {
16070
16138
  this.name = name;
@@ -16093,7 +16161,7 @@ let Codec$1 = class Codec extends BasicInterface {
16093
16161
  }
16094
16162
  }
16095
16163
  fromEncoded(encoded) {
16096
- const codec = index$3.decode(encoded);
16164
+ const codec = index$4.decode(encoded);
16097
16165
  const name = this.getCodecName(codec);
16098
16166
  this.name = name;
16099
16167
  this.encoded = encoded;
@@ -16112,7 +16180,7 @@ let Codec$1 = class Codec extends BasicInterface {
16112
16180
  this.name = this.getCodecName(codec);
16113
16181
  this.hashAlg = this.getHashAlg(this.name);
16114
16182
  this.codec = this.getCodec(this.name);
16115
- this.codecBuffer = index$3.encode(this.codec);
16183
+ this.codecBuffer = index$4.encode(this.codec);
16116
16184
  this.decoded = {
16117
16185
  name: this.name,
16118
16186
  hashAlg: this.hashAlg,
@@ -16125,7 +16193,7 @@ let Codec$1 = class Codec extends BasicInterface {
16125
16193
  this.name = name;
16126
16194
  this.codec = codec;
16127
16195
  this.hashAlg = this.getHashAlg(name);
16128
- this.codecBuffer = index$3.encode(this.codec);
16196
+ this.codecBuffer = index$4.encode(this.codec);
16129
16197
  this.decoded = {
16130
16198
  name: this.name,
16131
16199
  hashAlg: this.hashAlg,
@@ -16135,13 +16203,13 @@ let Codec$1 = class Codec extends BasicInterface {
16135
16203
  }
16136
16204
  decode(encoded) {
16137
16205
  encoded = encoded || this.encoded;
16138
- const codec = index$3.decode(encoded);
16206
+ const codec = index$4.decode(encoded);
16139
16207
  this.fromCodec(codec);
16140
16208
  return this.decoded;
16141
16209
  }
16142
16210
  encode(codec) {
16143
16211
  codec = codec || this.codec;
16144
- this.encoded = index$3.encode(codec);
16212
+ this.encoded = index$4.encode(codec);
16145
16213
  return this.encoded;
16146
16214
  }
16147
16215
  };
@@ -16212,7 +16280,7 @@ class CodecHash extends BasicInterface {
16212
16280
  return uint8Array;
16213
16281
  }
16214
16282
  get length() {
16215
- return index$3.encode(this.size);
16283
+ return index$4.encode(this.size);
16216
16284
  }
16217
16285
  get buffer() {
16218
16286
  return this.encoded;
@@ -16246,7 +16314,7 @@ class CodecHash extends BasicInterface {
16246
16314
  if (!(buffer instanceof Uint8Array)) {
16247
16315
  throw new Error('CodecHash only supports Uint8Array input');
16248
16316
  }
16249
- const codec = index$3.decode(buffer);
16317
+ const codec = index$4.decode(buffer);
16250
16318
  if (this.codecs[codec]) {
16251
16319
  this.decode(buffer);
16252
16320
  }
@@ -16256,12 +16324,12 @@ class CodecHash extends BasicInterface {
16256
16324
  }
16257
16325
  decode(buffer) {
16258
16326
  this.encoded = buffer;
16259
- const codec = index$3.decode(buffer);
16327
+ const codec = index$4.decode(buffer);
16260
16328
  this.discoCodec = new Codec$1(codec, this.codecs);
16261
16329
  // TODO: validate codec
16262
- buffer = buffer.slice(index$3.decode.bytes);
16263
- this.size = index$3.decode(buffer);
16264
- this.digest = buffer.slice(index$3.decode.bytes);
16330
+ buffer = buffer.slice(index$4.decode.bytes);
16331
+ this.size = index$4.decode(buffer);
16332
+ this.digest = buffer.slice(index$4.decode.bytes);
16265
16333
  if (this.digest.length !== this.size) {
16266
16334
  throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
16267
16335
  }
@@ -16871,6 +16939,7 @@ class Peernet {
16871
16939
  client;
16872
16940
  network;
16873
16941
  stars;
16942
+ transport;
16874
16943
  networkVersion;
16875
16944
  bw;
16876
16945
  hasDaemon = false;
@@ -16892,6 +16961,7 @@ class Peernet {
16892
16961
  * @param {String} options.root - path to root directory
16893
16962
  * @param {String} options.version - path to root directory
16894
16963
  * @param {String} options.storePrefix - prefix for datatores (lfc)
16964
+ * @param {Object} options.transport - transport selection and fallback options passed to @netpeer/swarm
16895
16965
  *
16896
16966
  * @return {Promise} instance of Peernet
16897
16967
  *
@@ -16905,6 +16975,7 @@ class Peernet {
16905
16975
  this.network = options.network || 'leofcoin';
16906
16976
  this.autoStart = options.autoStart === undefined ? true : options.autoStart;
16907
16977
  this.stars = options.stars;
16978
+ this.transport = options.transport;
16908
16979
  this.version = options.version;
16909
16980
  const parts = this.network.split(':');
16910
16981
  this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
@@ -16998,7 +17069,7 @@ class Peernet {
16998
17069
  await getAddress();
16999
17070
  this.storePrefix = options.storePrefix;
17000
17071
  this.root = options.root;
17001
- const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-BfDvXW-x-BaHit_or.js');
17072
+ const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-BX59GgBQ-DVjVrJBf.js');
17002
17073
  /**
17003
17074
  * proto Object containing protos
17004
17075
  * @type {Object}
@@ -17045,7 +17116,7 @@ class Peernet {
17045
17116
  if (this.#starting || this.#started)
17046
17117
  return;
17047
17118
  this.#starting = true;
17048
- const importee = await import('./client-lPe0SUWx-DwxXCP5p.js');
17119
+ const importee = await import('./client-Ba1cHcxF-B4lH2-fQ.js');
17049
17120
  /**
17050
17121
  * @access public
17051
17122
  * @type {PeernetClient}
@@ -17055,7 +17126,8 @@ class Peernet {
17055
17126
  peerId: this.id,
17056
17127
  networkVersion: this.networkVersion,
17057
17128
  version: this.version,
17058
- stars: this.stars
17129
+ stars: this.stars,
17130
+ transport: this.transport
17059
17131
  });
17060
17132
  this.#started = true;
17061
17133
  this.#starting = false;