@leofcoin/chain 1.9.24 → 1.10.1

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.
@@ -1,5 +1,19 @@
1
1
  import { createHash as createHash$1 } from 'crypto';
2
- import { T as TransactionMessage, C as ContractMessage, B as BlockMessage, e as BWMessage, g as BWRequestMessage, V as ValidatorMessage, S as StateMessage, L as LastBlockMessage, D as DEFAULT_NODE_OPTIONS } from './constants-COpvMqFX.js';
2
+ import { F as FormatInterface$2, T as TransactionMessage, C as ContractMessage, B as BlockMessage, q as BWMessage, V as ValidatorMessage, S as StateMessage, L as LastBlockMessage, D as DEFAULT_NODE_OPTIONS } from './constants-CUoFxEp2.js';
3
+
4
+ var proto = {};
5
+
6
+ class BWRequestMessage extends FormatInterface$2 {
7
+ get messageName() {
8
+ return "BWRequestMessage";
9
+ }
10
+ constructor(buffer) {
11
+ if (buffer instanceof BWRequestMessage)
12
+ return buffer;
13
+ const name = "bw-request-message";
14
+ super(buffer, proto, { name });
15
+ }
16
+ }
3
17
 
4
18
  var nodeConfig = async (config = {
5
19
  network: "leofcoin:peach",
@@ -18,11 +32,11 @@ var nodeConfig = async (config = {
18
32
  for (const proto of protos) {
19
33
  peernet.addProto(proto.name, proto.handler);
20
34
  }
21
- let name = `.${config.network}`;
35
+ let name = config.root || `.${config.network}`;
22
36
  const parts = config.network.split(":");
23
- if (parts[1])
37
+ if (!config.root && parts[1])
24
38
  name = `.${parts[0]}/${parts[1]}`;
25
- if (typeof config.storeNamespace === "string" && config.storeNamespace.length > 0) {
39
+ if (!config.root && typeof config.storeNamespace === "string" && config.storeNamespace.length > 0) {
26
40
  name = `${name}/${config.storeNamespace}`;
27
41
  }
28
42
  const stores = ["transactionPool", "state", "accounts", "contract", { name: "wallet", private: true }];
@@ -379,49 +393,17 @@ const base = (ALPHABET, options = {}) => {
379
393
  };
380
394
  };
381
395
 
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;
396
+ const ALPHABET$1$1 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
397
+ const ALPHABET_HEX$1 = "0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv";
398
+ const base58 = base(ALPHABET$1$1);
399
+ const base58Hex = base(ALPHABET_HEX$1);
400
+ const encode$4 = base58.encode;
401
+ const decode$5 = base58.decode;
402
+ const encodeHex$2 = base58Hex.encode;
403
+ const decodeHex$2 = base58Hex.decode;
422
404
  const isBase58 = (string) => {
423
405
  try {
424
- decode$4(string);
406
+ decode$5(string);
425
407
  return true;
426
408
  }
427
409
  catch (e) {
@@ -430,7 +412,7 @@ const isBase58 = (string) => {
430
412
  };
431
413
  const isBase58Hex = (string) => {
432
414
  try {
433
- decodeHex$1(string);
415
+ decodeHex$2(string);
434
416
  return true;
435
417
  }
436
418
  catch (e) {
@@ -439,12 +421,12 @@ const isBase58Hex = (string) => {
439
421
  };
440
422
  const whatType = (string) => {
441
423
  try {
442
- decode$4(string);
424
+ decode$5(string);
443
425
  return "base58";
444
426
  }
445
427
  catch (e) {
446
428
  try {
447
- decodeHex$1(string);
429
+ decodeHex$2(string);
448
430
  return "base58Hex";
449
431
  }
450
432
  catch {
@@ -453,15 +435,143 @@ const whatType = (string) => {
453
435
  }
454
436
  };
455
437
  var base58$1 = {
456
- encode: encode$3,
457
- decode: decode$4,
438
+ encode: encode$4,
439
+ decode: decode$5,
458
440
  isBase58,
459
441
  isBase58Hex,
460
- encodeHex: encodeHex$1,
461
- decodeHex: decodeHex$1,
442
+ encodeHex: encodeHex$2,
443
+ decodeHex: decodeHex$2,
462
444
  whatType,
463
445
  };
464
446
 
447
+ const randombytes = (strength) => crypto.getRandomValues(new Uint8Array(strength));
448
+
449
+ const { subtle: subtle$1 } = crypto;
450
+
451
+ /**
452
+ * ```js
453
+ * const {createHash} = await import('@leofcoin/crypto')
454
+ * createHash(data, algorithm)
455
+ * ```
456
+ * @param {Uint8Array} data
457
+ * @param {string} algorithm
458
+ * @returns Uint8Array
459
+ */
460
+ const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
461
+
462
+ /**
463
+ * Hashes the created hash again
464
+ * ```js
465
+ * const {createDoubleHash} = await import('@leofcoin/crypto')
466
+ * createDoubleHash(data, algorithm)
467
+ * ```
468
+ * @param {Uint8Array} data
469
+ * @param {string} algorithm
470
+ * @returns Uint8Array
471
+ */
472
+ const createDoubleHash = async (data, algorithm = 'SHA-512') =>
473
+ subtle$1.digest(algorithm, await subtle$1.digest(algorithm, data));
474
+
475
+ const generatePbkdf2 = async (password) => {
476
+ return subtle$1.importKey('raw', password, 'PBKDF2', false, ['deriveBits'])
477
+ };
478
+
479
+ const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
480
+ const key = await generatePbkdf2(password);
481
+ return subtle$1.deriveBits(
482
+ {
483
+ name: 'PBKDF2',
484
+ hash,
485
+ salt,
486
+ iterations
487
+ },
488
+ key,
489
+ length
490
+ )
491
+ };
492
+
493
+ var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
494
+ if (!options) options = {};
495
+
496
+ if (typeof options.seperator === 'string')
497
+ options.seperator = new TextEncoder().encode(options.seperator);
498
+
499
+ const length = options.length || input.reduce((total, current, i) => {
500
+ total += current.length;
501
+ if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
502
+ return total
503
+ }, 0);
504
+
505
+ const typedArray = new Uint8Array(length);
506
+
507
+ let currentIndex = 0;
508
+ let index = 0;
509
+ for (const source of input) {
510
+ typedArray.set(source, currentIndex);
511
+ if (options.seperator && input.length - 1 > index) {
512
+ typedArray.set(options.seperator, currentIndex + source.length);
513
+ currentIndex+= options.seperator.length;
514
+ }
515
+ currentIndex += source.length;
516
+ index += 1;
517
+ }
518
+
519
+ return typedArray
520
+ };
521
+
522
+ const concatAndDoubleHash = async (input) => {
523
+ return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
524
+ };
525
+
526
+ const encode$3 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
527
+ if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
528
+ throw new TypeError('Expected Uint8Array');
529
+ }
530
+ const hash = await concatAndDoubleHash([
531
+ prefix,
532
+ source
533
+ ]);
534
+ const uint8Array = typedArrayConcat([
535
+ prefix,
536
+ source,
537
+ hash.subarray(0, 4)
538
+ ]);
539
+ if (hex)
540
+ return base58$1.encodeHex(uint8Array);
541
+ return base58$1.encode(uint8Array);
542
+ };
543
+ const decode$4 = async (string, hex) => {
544
+ let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
545
+ const prefix = uint8Array.subarray(0, 2);
546
+ const source = uint8Array.subarray(2, -4);
547
+ const hash = await concatAndDoubleHash([
548
+ prefix,
549
+ source
550
+ ]);
551
+ let index = 0;
552
+ const slice = uint8Array.subarray(-4);
553
+ for (const check of slice) {
554
+ if (check !== hash[index]) {
555
+ throw new Error('Invalid checksum');
556
+ }
557
+ index++;
558
+ }
559
+ return { prefix, data: source };
560
+ };
561
+ const isBase58check = (string, hex) => {
562
+ try {
563
+ hex ? decode$4(string, true) : decode$4(string);
564
+ return true;
565
+ }
566
+ catch (e) {
567
+ return false;
568
+ }
569
+ };
570
+ const encodeHex$1 = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$3(uint8Array, prefix, true);
571
+ const decodeHex$1 = (string) => decode$4(string, true);
572
+ const isBase58checkHex = (string) => isBase58check(string, true);
573
+ var base58check = { encode: encode$3, decode: decode$4, encodeHex: encodeHex$1, decodeHex: decodeHex$1, isBase58check, isBase58checkHex };
574
+
465
575
  const MSB$1 = 0x80;
466
576
  const MSBALL = -128;
467
577
  const INT = Math.pow(2, 31);
@@ -530,16 +640,16 @@ var encodingLength = (value) => (value < N1 ? 1
530
640
  : value < N9 ? 9
531
641
  : 10);
532
642
 
533
- var index$3 = {
643
+ var index$4 = {
534
644
  encode: encode$2,
535
645
  decode: decode$3,
536
646
  encodingLength
537
647
  };
538
648
 
539
- var index$2 = (input, prefix) => {
649
+ var index$3 = (input, prefix) => {
540
650
  const encodedArray = [];
541
651
  const length = input.reduce((total, current) => {
542
- const encoded = index$3.encode(current.length);
652
+ const encoded = index$4.encode(current.length);
543
653
  encodedArray.push(encoded);
544
654
  total += current.length + encoded.length;
545
655
  return total;
@@ -557,12 +667,12 @@ var index$2 = (input, prefix) => {
557
667
  return typedArray;
558
668
  };
559
669
 
560
- var index$1$1 = (typedArray, prefix) => {
670
+ var index$2 = (typedArray, prefix) => {
561
671
  const set = [];
562
672
  const varintAndSub = (typedArray) => {
563
- const length = index$3.decode(typedArray);
673
+ const length = index$4.decode(typedArray);
564
674
  // remove length
565
- typedArray = typedArray.subarray(index$3.decode.bytes);
675
+ typedArray = typedArray.subarray(index$4.decode.bytes);
566
676
  // push value
567
677
  set.push(typedArray.subarray(0, length));
568
678
  // remove value
@@ -574,1814 +684,1686 @@ var index$1$1 = (typedArray, prefix) => {
574
684
  return varintAndSub(typedArray);
575
685
  };
576
686
 
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;
687
+ const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
688
+ const decoded = base58$1.decode(multiWif);
689
+ let [version, codec, privateKey] = index$2(decoded);
690
+ version = Number(new TextDecoder().decode(version));
691
+ codec = Number(new TextDecoder().decode(codec));
692
+ if (expectedVersion && version !== expectedVersion)
693
+ throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
694
+ if (expectedCodec && codec !== expectedCodec)
695
+ throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
696
+ return { version, codec, privateKey };
697
+ };
698
+ var index$1$1 = {
699
+ encode: (version, codec, privateKey) => {
700
+ return base58$1.encode(index$3([
701
+ new TextEncoder().encode(version.toString()),
702
+ new TextEncoder().encode(codec.toString()),
703
+ privateKey
704
+ ]));
705
+ },
706
+ decode: decode$2,
707
+ isMultiWif: (multiWif) => {
708
+ try {
709
+ const { version, codec, privateKey } = decode$2(multiWif);
710
+ if (version === undefined)
711
+ return false;
712
+ if (codec === undefined)
713
+ return false;
714
+ if (privateKey === undefined)
715
+ return false;
716
+ if (privateKey && privateKey.length !== 32)
717
+ return false;
718
+ }
719
+ catch {
720
+ return false;
721
+ }
722
+ return true;
723
+ }
614
724
  };
615
725
 
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;
726
+ /*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */
727
+ /**
728
+ * 5KB JS implementation of secp256k1 ECDSA / Schnorr signatures & ECDH.
729
+ * Compliant with RFC6979 & BIP340.
730
+ * @module
731
+ */
732
+ /**
733
+ * Curve params from SEC 2 v2 §2.4.1.
734
+ * secp256k1 is a short Weierstrass / Koblitz curve with equation
735
+ * `y² == x³ + ax + b`.
736
+ * * P = `2n**256n - 2n**32n - 977n` // field over which calculations are done
737
+ * * N = `2n**256n - 0x14551231950b75fc4402da1732fc9bebfn` // group order, amount of curve points
738
+ * * h = `1n` // cofactor
739
+ * * a = `0n` // equation param
740
+ * * b = `7n` // equation param
741
+ * * Gx, Gy are coordinates of Generator / base point
742
+ */
743
+ // Mirror noble-curves: Point.CURVE() returns shared params, but those params must stay frozen so
744
+ // callers cannot mutate them out from under the arithmetic constants captured below.
745
+ const secp256k1_CURVE = Object.freeze({
746
+ p: 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2fn,
747
+ n: 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141n,
748
+ h: 1n,
749
+ a: 0n,
750
+ b: 7n,
751
+ Gx: 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798n,
752
+ Gy: 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8n,
753
+ });
754
+ const { p: P, n: N, Gx, Gy, b: _b } = secp256k1_CURVE;
755
+ // 32-byte field / scalar width, and the SHA-256 / HMAC-DRBG output width used
756
+ // by the RFC6979 paths here.
757
+ const L = 32;
758
+ const L2 = 64; // 64-byte compact signatures, and 64 hex chars for zero-padded 32-byte scalars
759
+ const lengths = {
760
+ publicKey: L + 1,
761
+ publicKeyUncompressed: L2 + 1,
762
+ // 48-byte keygen seed floor: 384 bits exceeds FIPS 186-5 Table A.2's
763
+ // 352-bit recommendation for 256-bit prime curves.
764
+ seed: L + L / 2,
765
+ };
766
+ // Helpers and Precomputes sections are reused between libraries
767
+ // ## Helpers
768
+ // ----------
769
+ const err$1 = (message = '', E = Error) => {
770
+ const e = new E(message);
771
+ const { captureStackTrace } = Error;
772
+ if (typeof captureStackTrace === 'function')
773
+ captureStackTrace(e, err$1);
774
+ throw e;
775
+ };
776
+ // Plain `instanceof Uint8Array` is too strict for some Buffer / proxy / cross-realm cases. The
777
+ // fallback still requires a real ArrayBuffer view so plain JSON-deserialized `{ constructor: ... }`
778
+ // spoofing is rejected, and `BYTES_PER_ELEMENT === 1` keeps the fallback on byte-oriented views.
779
+ const isBytes = (a) => a instanceof Uint8Array ||
780
+ (ArrayBuffer.isView(a) &&
781
+ a.constructor.name === 'Uint8Array' &&
782
+ a.BYTES_PER_ELEMENT === 1);
783
+ /** Asserts something is Bytes. */
784
+ const abytes = (value, length, title = '') => {
785
+ const bytes = isBytes(value);
786
+ const len = value?.length;
787
+ const needsLen = length !== undefined;
788
+ if (!bytes || (needsLen && len !== length)) {
789
+ const prefix = title && `"${title}" `;
790
+ const ofLen = needsLen ? ` of length ${length}` : '';
791
+ const got = bytes ? `length=${len}` : `type=${typeof value}`;
792
+ const msg = prefix + 'expected Uint8Array' + ofLen + ', got ' + got;
793
+ return bytes ? err$1(msg, RangeError) : err$1(msg, TypeError);
669
794
  }
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
- }
795
+ return value;
796
+ };
797
+ /** create Uint8Array */
798
+ const u8n = (len) => new Uint8Array(len);
799
+ // Callers keep values non-negative and within the requested width; padStart() won't truncate over-wide inputs.
800
+ const padh = (n, pad) => n.toString(16).padStart(pad, '0');
801
+ /** Render bytes as lowercase hex. */
802
+ const bytesToHex = (b) => {
803
+ let hex = '';
804
+ for (const e of abytes(b))
805
+ hex += padh(e, 2);
806
+ return hex;
807
+ };
808
+ const C = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 }; // ASCII characters
809
+ // Strict ASCII nibble parser: non-ASCII hex lookalikes are rejected as undefined.
810
+ // prettier-ignore
811
+ const _ch = (ch) => ch >= C._0 && ch <= C._9 ? ch - C._0 // '2' => 50-48
812
+ : ch >= C.A && ch <= C.F ? ch - (C.A - 10) // 'B' => 66-(65-10)
813
+ : ch >= C.a && ch <= C.f ? ch - (C.a - 10) // 'b' => 98-(97-10)
814
+ : undefined;
815
+ const hexToBytes = (hex) => {
816
+ const e = 'hex invalid'; // Strict ASCII hex only, with one generic error for type and parse failures.
817
+ if (typeof hex !== 'string')
818
+ return err$1(e);
819
+ const hl = hex.length;
820
+ const al = hl / 2;
821
+ if (hl % 2)
822
+ return err$1(e);
823
+ const array = u8n(al);
824
+ for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {
825
+ // treat each char as ASCII
826
+ const n1 = _ch(hex.charCodeAt(hi)); // parse first char, multiply it by 16
827
+ const n2 = _ch(hex.charCodeAt(hi + 1)); // parse second char
828
+ if (n1 === undefined || n2 === undefined)
829
+ return err$1(e);
830
+ array[ai] = n1 * 16 + n2; // example: 'A9' => 10*16 + 9
676
831
  }
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;
832
+ return array;
833
+ };
834
+ // WebCrypto is available in all modern environments
835
+ const subtle = () => globalThis?.crypto?.subtle ?? err$1('crypto.subtle must be defined, consider polyfill');
836
+ // prettier-ignore
837
+ const concatBytes = (...arrs) => {
838
+ let len = 0;
839
+ for (const a of arrs)
840
+ len += abytes(a).length; // validate every input and sum lengths before copying
841
+ const r = u8n(len);
842
+ let pad = 0; // walk through each array,
843
+ for (const a of arrs)
844
+ r.set(a, pad), pad += a.length; // ensure they have proper type
845
+ return r;
846
+ };
847
+ /**
848
+ * WebCrypto OS-level CSPRNG (random number generator).
849
+ * Will throw when not available; large-request ceilings are delegated to getRandomValues().
850
+ */
851
+ const randomBytes = (len = L) => (globalThis?.crypto).getRandomValues(u8n(len));
852
+ const big = BigInt;
853
+ const arange = (n, min, max, msg = 'bad number: out of range') => {
854
+ if (typeof n !== 'bigint')
855
+ return err$1(msg, TypeError);
856
+ if (min <= n && n < max)
857
+ return n;
858
+ return err$1(msg, RangeError);
859
+ };
860
+ /** Canonical modular reduction. Callers must provide a positive modulus. */
861
+ const M = (a, b = P) => {
862
+ const r = a % b;
863
+ return r >= 0n ? r : b + r;
864
+ };
865
+ const modN = (a) => M(a, N);
866
+ /** Modular inversion using eucledian GCD (non-CT). No negative exponent for now. */
867
+ // prettier-ignore
868
+ const invert = (num, md) => {
869
+ if (num === 0n || md <= 0n)
870
+ err$1('no inverse n=' + num + ' mod=' + md);
871
+ let a = M(num, md), b = md, x = 0n, u = 1n;
872
+ while (a !== 0n) {
873
+ const q = b / a, r = b % a;
874
+ const m = x - u * q;
875
+ b = a, a = r, x = u, u = m;
688
876
  }
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!");
877
+ return b === 1n ? M(x, md) : err$1('no inverse'); // b is gcd at this point
878
+ };
879
+ const callHash = (name) => {
880
+ // @ts-ignore
881
+ const fn = hashes[name];
882
+ if (typeof fn !== 'function')
883
+ err$1('hashes.' + name + ' not set');
884
+ return fn;
885
+ };
886
+ // All exported provider slots are caller-configurable and may be unset or return arbitrary values,
887
+ // so wrapper helpers must enforce the exact 32-byte digest contract instead of trusting providers.
888
+ const gh = (name, a, b) => abytes(callHash(name)(a, b), L, 'digest');
889
+ const gha = (name, a, b) => Promise.resolve(callHash(name)(a, b)).then((r) => abytes(r, L, 'digest'));
890
+ // also rejects structurally similar Point values from other realms / bundled copies
891
+ const apoint = (p) => (p instanceof Point ? p : err$1('Point expected'));
892
+ // ## End of Helpers
893
+ // -----------------
894
+ /**
895
+ * secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
896
+ * making it x³+b; callers validate x first.
897
+ */
898
+ const koblitz = (x) => M(M(x * x) * x + _b);
899
+ /** assert is element of field mod P (incl. 0 for projective infinity coordinates) */
900
+ const FpIsValid = (n) => arange(n, 0n, P);
901
+ /** assert is element of field mod P (excl. 0 where current callers need a non-zero coordinate) */
902
+ const FpIsValidNot0 = (n) => arange(n, 1n, P);
903
+ /** assert is element of field mod N (excl. 0), matching the shared BIP340 scalar-failure rule used here */
904
+ const FnIsValidNot0 = (n) => arange(n, 1n, N);
905
+ // Shared parity primitive for BIP340 even-y checks and SEC 1 compressed prefixes.
906
+ const isEven = (y) => !(y & 1n);
907
+ /** create Uint8Array of byte n */
908
+ const u8of = (n) => Uint8Array.of(n);
909
+ /** SEC 1 compressed-prefix helper. Parity only: callers validate y before asking for the prefix byte. */
910
+ const getPrefix = (y) => u8of(isEven(y) ? 0x02 : 0x03);
911
+ /** lift_x from BIP340 returns the unique even square root for x³+7.
912
+ * SEC 1 callers still flip it for the odd-prefix branch. */
913
+ const lift_x = (x) => {
914
+ // Let c = x³ + 7 mod p. Fail if x ≥ p. (also fail if x < 1)
915
+ const c = koblitz(FpIsValidNot0(x));
916
+ // r = √c candidate
917
+ // r = c^((p+1)/4) mod p
918
+ // This formula works for fields p = 3 mod 4 -- a special, fast case.
919
+ // Paper: "Square Roots from 1;24,51,10 to Dan Shanks".
920
+ let r = 1n;
921
+ for (let num = c, e = (P + 1n) / 4n; e > 0n; e >>= 1n) {
922
+ // powMod: modular exponentiation.
923
+ if (e & 1n)
924
+ r = (r * num) % P; // Uses exponentiation by squaring.
925
+ num = (num * num) % P; // Not constant-time.
704
926
  }
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);
927
+ if (M(r * r) !== c)
928
+ err$1('sqrt invalid'); // check if result is valid
929
+ return isEven(r) ? r : M(-r);
930
+ };
931
+ /**
932
+ * Point in 3d xyz projective coordinates. 3d takes less inversions than 2d.
933
+ * @param X - X coordinate.
934
+ * @param Y - Y coordinate.
935
+ * @param Z - projective Z coordinate.
936
+ * @example
937
+ * Do point arithmetic with the base point and encode the result as hex.
938
+ * ```ts
939
+ * import { Point } from '@noble/secp256k1';
940
+ * const hex = Point.BASE.double().toHex();
941
+ * ```
942
+ */
943
+ class Point {
944
+ static BASE;
945
+ static ZERO;
946
+ X;
947
+ Y;
948
+ Z;
949
+ constructor(X, Y, Z) {
950
+ this.X = FpIsValid(X);
951
+ this.Y = FpIsValidNot0(Y); // Y can't be 0 in Projective
952
+ this.Z = FpIsValid(Z);
953
+ Object.freeze(this);
954
+ }
955
+ /** Returns the shared curve metadata object by reference.
956
+ * It is readonly only at type level, and mutating it won't retarget arithmetic,
957
+ * which already uses module-load snapshots. */
958
+ static CURVE() {
959
+ return secp256k1_CURVE;
960
+ }
961
+ /** Create 3d xyz point from 2d xy. (0, 0) => (0, 1, 0), not (0, 0, 1) */
962
+ static fromAffine(ap) {
963
+ const { x, y } = ap;
964
+ return x === 0n && y === 0n ? I : new Point(x, y, 1n);
965
+ }
966
+ /** Convert Uint8Array or hex string to Point. */
967
+ static fromBytes(bytes) {
968
+ abytes(bytes);
969
+ const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65
970
+ let p = undefined;
971
+ const length = bytes.length;
972
+ const head = bytes[0];
973
+ const tail = bytes.subarray(1);
974
+ const x = sliceBytesNumBE(tail, 0, L);
975
+ // SEC 1 defines the rare infinity encoding 0x00, but SEC 1 public-key validation rejects
976
+ // infinity. We keep 0x00 rejected here because this parser is reused by verify(), ECDH,
977
+ // and public-key validation helpers, so strict handling applies to all callers by default.
978
+ // Local secp256k1 crosstests show OpenSSL raw point codecs accept 0x00 too.
979
+ // Parse SEC 1 compressed/uncompressed encodings, then finish with assertValidity() before returning.
980
+ if (length === comp && (head === 0x02 || head === 0x03)) {
981
+ // Equation is y² == x³ + ax + b. We calculate y from x.
982
+ // lift_x() returns the even root; SEC 1 0x03 still needs the odd root.
983
+ let y = lift_x(x);
984
+ if (head === 0x03)
985
+ y = M(-y);
986
+ p = new Point(x, y, 1n);
711
987
  }
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;
988
+ // Uncompressed 65-byte point, 0x04 prefix
989
+ if (length === uncomp && head === 0x04)
990
+ p = new Point(x, sliceBytesNumBE(tail, L, L2), 1n);
991
+ // Validate point
992
+ return p ? p.assertValidity() : err$1('bad point: not on curve');
993
+ }
994
+ static fromHex(hex) {
995
+ return Point.fromBytes(hexToBytes(hex));
996
+ }
997
+ get x() {
998
+ return this.toAffine().x;
999
+ }
1000
+ get y() {
1001
+ return this.toAffine().y;
1002
+ }
1003
+ /** Equality check: compare points P&Q. */
1004
+ equals(other) {
1005
+ const { X: X1, Y: Y1, Z: Z1 } = this;
1006
+ const { X: X2, Y: Y2, Z: Z2 } = apoint(other); // checks class equality
1007
+ const X1Z2 = M(X1 * Z2);
1008
+ const X2Z1 = M(X2 * Z1);
1009
+ const Y1Z2 = M(Y1 * Z2);
1010
+ const Y2Z1 = M(Y2 * Z1);
1011
+ return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;
1012
+ }
1013
+ is0() {
1014
+ return this.equals(I);
1015
+ }
1016
+ /** Flip point over y coordinate. */
1017
+ negate() {
1018
+ return new Point(this.X, M(-this.Y), this.Z);
1019
+ }
1020
+ /** Point doubling: P+P, complete formula. */
1021
+ double() {
1022
+ return this.add(this);
1023
+ }
1024
+ /**
1025
+ * Point addition: P+Q, complete, exception-free formula
1026
+ * (Renes-Costello-Batina, algo 1 of [2015/1060](https://eprint.iacr.org/2015/1060)).
1027
+ * Cost: `12M + 0S + 3*a + 3*b3 + 23add`.
1028
+ */
1029
+ // prettier-ignore
1030
+ add(other) {
1031
+ const { X: X1, Y: Y1, Z: Z1 } = this;
1032
+ const { X: X2, Y: Y2, Z: Z2 } = apoint(other);
1033
+ const a = 0n;
1034
+ const b = _b;
1035
+ let X3 = 0n, Y3 = 0n, Z3 = 0n;
1036
+ const b3 = M(b * 3n);
1037
+ let t0 = M(X1 * X2), t1 = M(Y1 * Y2), t2 = M(Z1 * Z2), t3 = M(X1 + Y1); // step 1
1038
+ let t4 = M(X2 + Y2); // step 5
1039
+ t3 = M(t3 * t4);
1040
+ t4 = M(t0 + t1);
1041
+ t3 = M(t3 - t4);
1042
+ t4 = M(X1 + Z1);
1043
+ let t5 = M(X2 + Z2); // step 10
1044
+ t4 = M(t4 * t5);
1045
+ t5 = M(t0 + t2);
1046
+ t4 = M(t4 - t5);
1047
+ t5 = M(Y1 + Z1);
1048
+ X3 = M(Y2 + Z2); // step 15
1049
+ t5 = M(t5 * X3);
1050
+ X3 = M(t1 + t2);
1051
+ t5 = M(t5 - X3);
1052
+ Z3 = M(a * t4);
1053
+ X3 = M(b3 * t2); // step 20
1054
+ Z3 = M(X3 + Z3);
1055
+ X3 = M(t1 - Z3);
1056
+ Z3 = M(t1 + Z3);
1057
+ Y3 = M(X3 * Z3);
1058
+ t1 = M(t0 + t0); // step 25
1059
+ t1 = M(t1 + t0);
1060
+ t2 = M(a * t2);
1061
+ t4 = M(b3 * t4);
1062
+ t1 = M(t1 + t2);
1063
+ t2 = M(t0 - t2); // step 30
1064
+ t2 = M(a * t2);
1065
+ t4 = M(t4 + t2);
1066
+ t0 = M(t1 * t4);
1067
+ Y3 = M(Y3 + t0);
1068
+ t0 = M(t5 * t4); // step 35
1069
+ X3 = M(t3 * X3);
1070
+ X3 = M(X3 - t0);
1071
+ t0 = M(t3 * t1);
1072
+ Z3 = M(t5 * Z3);
1073
+ Z3 = M(Z3 + t0); // step 40
1074
+ return new Point(X3, Y3, Z3);
1075
+ }
1076
+ subtract(other) {
1077
+ return this.add(apoint(other).negate());
1078
+ }
1079
+ /**
1080
+ * Point-by-scalar multiplication. Scalar must be in range 1 <= n < CURVE.n.
1081
+ * Uses {@link wNAF} for base point.
1082
+ * Uses fake point to mitigate leakage shape in JS, not as a hard constant-time guarantee.
1083
+ * @param n scalar by which point is multiplied
1084
+ * @param safe safe mode guards against timing attacks; unsafe mode is faster
1085
+ */
1086
+ multiply(n, safe = true) {
1087
+ // Unsafe internal callers may legitimately need 0*P = O during double-scalar multiplication.
1088
+ if (!safe && n === 0n)
1089
+ return I;
1090
+ FnIsValidNot0(n);
1091
+ if (n === 1n)
1092
+ return this;
1093
+ if (this.equals(G))
1094
+ return wNAF(n).p;
1095
+ // init result point & fake point
1096
+ let p = I;
1097
+ let f = G;
1098
+ for (let d = this; n > 0n; d = d.double(), n >>= 1n) {
1099
+ // if bit is present, add to point
1100
+ // if not present, add to fake, for timing safety
1101
+ if (n & 1n)
1102
+ p = p.add(d);
1103
+ else if (safe)
1104
+ f = f.add(d);
726
1105
  }
1106
+ return p;
727
1107
  }
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;
1108
+ multiplyUnsafe(scalar) {
1109
+ return this.multiply(scalar, false);
1110
+ }
1111
+ /** Convert point to 2d xy affine point. (X, Y, Z) ∋ (x=X/Z, y=Y/Z) */
1112
+ toAffine() {
1113
+ const { X: x, Y: y, Z: z } = this;
1114
+ // fast-paths for ZERO point OR Z=1
1115
+ if (this.equals(I))
1116
+ return { x: 0n, y: 0n };
1117
+ if (z === 1n)
1118
+ return { x, y };
1119
+ const iz = invert(z, P);
1120
+ // (Z * Z^-1) must be 1, otherwise bad math
1121
+ if (M(z * iz) !== 1n)
1122
+ err$1('inverse invalid');
1123
+ // x = X*Z^-1; y = Y*Z^-1
1124
+ return { x: M(x * iz), y: M(y * iz) };
1125
+ }
1126
+ /** Checks if the point is valid and on-curve. */
1127
+ assertValidity() {
1128
+ const { x, y } = this.toAffine(); // convert to 2d xy affine point.
1129
+ FpIsValidNot0(x); // must be in range 1 <= x,y < P
1130
+ FpIsValidNot0(y);
1131
+ // y² == x³ + ax + b, equation sides must be equal
1132
+ return M(y * y) === koblitz(x) ? this : err$1('bad point: not on curve');
1133
+ }
1134
+ /** Converts point to 33/65-byte Uint8Array. */
1135
+ toBytes(isCompressed = true) {
1136
+ // Same policy as fromBytes(): SEC 1 has the rare infinity encoding 0x00, but we keep ZERO
1137
+ // out of this byte surface because callers treat these encodings as public keys by default.
1138
+ const { x, y } = this.assertValidity().toAffine();
1139
+ const x32b = numTo32b(x);
1140
+ if (isCompressed)
1141
+ return concatBytes(getPrefix(y), x32b);
1142
+ return concatBytes(u8of(0x04), x32b, numTo32b(y));
1143
+ }
1144
+ toHex(isCompressed) {
1145
+ return bytesToHex(this.toBytes(isCompressed));
746
1146
  }
747
- return bytes;
748
1147
  }
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!");
761
- }
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
- });
931
- }
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
1148
+ /** Generator / base point */
1149
+ const G = new Point(Gx, Gy, 1n);
1150
+ /** Identity / zero point */
1151
+ const I = new Point(0n, 1n, 0n);
1152
+ // Static aliases
1153
+ Point.BASE = G;
1154
+ Point.ZERO = I;
1155
+ /** `Q = u1⋅G + u2⋅R`. Verifies Q is not ZERO. Unsafe: non-CT. */
1156
+ const doubleScalarMulUns = (R, u1, u2) => {
1157
+ return G.multiply(u1, false)
1158
+ .add(R.multiply(u2, false))
1159
+ .assertValidity();
1160
+ };
1161
+ // Inherits byte validation from bytesToHex(); the || '0' fallback keeps empty input mapped to 0n.
1162
+ const bytesToNumBE = (b) => big('0x' + (bytesToHex(b) || '0'));
1163
+ // Callers provide monotone slice bounds; subarray() would otherwise clamp or reinterpret them silently.
1164
+ const sliceBytesNumBE = (b, from, to) => bytesToNumBE(b.subarray(from, to));
1165
+ const B256 = 2n ** 256n; // secp256k1 is weierstrass curve. Equation is x³ + ax + b.
1166
+ /** Generic 32-byte big-endian encoder. Must be 0 <= num < B256; call sites need not be field/scalar elements. */
1167
+ const numTo32b = (num) => hexToBytes(padh(arange(num, 0n, B256), L2));
1168
+ /** Normalize private key to scalar (bigint). Verifies scalar is in range 1 <= d < N. */
1169
+ const secretKeyToScalar = (secretKey) => {
1170
+ const num = bytesToNumBE(abytes(secretKey, L, 'secret key'));
1171
+ return arange(num, 1n, N, 'invalid secret key: outside of range');
956
1172
  };
957
-
958
- new Mutex();
959
1173
  /**
960
- * Creates a new SHA-1 hash instance
1174
+ * Creates a SEC 1 public key from a 32-byte private key.
1175
+ * @param privKey - 32-byte secret key.
1176
+ * @param isCompressed - return 33-byte compressed SEC 1 encoding when `true`, otherwise 65-byte uncompressed.
1177
+ * @returns serialized secp256k1 public key in SEC 1 encoding.
1178
+ * @example
1179
+ * Derive the serialized public key for a secp256k1 secret key.
1180
+ * ```ts
1181
+ * import * as secp from '@noble/secp256k1';
1182
+ * const secretKey = secp.utils.randomSecretKey();
1183
+ * const publicKey = secp.getPublicKey(secretKey);
1184
+ * ```
961
1185
  */
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
1186
+ const getPublicKey = (privKey, isCompressed = true) => {
1187
+ return G.multiply(secretKeyToScalar(privKey)).toBytes(isCompressed);
995
1188
  };
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");
1189
+ const isValidSecretKey = (secretKey) => {
1190
+ try {
1191
+ return !!secretKeyToScalar(secretKey);
1003
1192
  }
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));
1193
+ catch (error) {
1194
+ return false;
1013
1195
  }
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
1196
  };
1048
-
1049
- new Mutex();
1050
- /**
1051
- * Creates a new SHA-2 (SHA-224) hash instance
1052
- */
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();
1197
+ const isValidPublicKey = (publicKey, isCompressed) => {
1198
+ const { publicKey: comp, publicKeyUncompressed } = lengths;
1199
+ try {
1200
+ const l = publicKey.length;
1201
+ if (isCompressed === true && l !== comp)
1202
+ return false;
1203
+ if (isCompressed === false && l !== publicKeyUncompressed)
1204
+ return false;
1205
+ return !!Point.fromBytes(publicKey);
1206
+ }
1207
+ catch (error) {
1208
+ return false;
1209
+ }
1210
+ };
1211
+ const _sha = 'SHA-256';
1080
1212
  /**
1081
- * Creates a new SHA-2 (SHA-256) hash instance
1213
+ * Hash implementations used by the synchronous and async ECDSA / Schnorr helpers.
1214
+ * All slots are configurable API surface; wrapper helpers revalidate that SHA-256 and HMAC-SHA256
1215
+ * providers still return exact 32-byte Uint8Array digests.
1216
+ * @example
1217
+ * Provide sync hash helpers before calling the synchronous signing API.
1218
+ * ```ts
1219
+ * import * as secp from '@noble/secp256k1';
1220
+ * import { hmac } from '@noble/hashes/hmac.js';
1221
+ * import { sha256 } from '@noble/hashes/sha2.js';
1222
+ * secp.hashes.sha256 = sha256;
1223
+ * secp.hashes.hmacSha256 = (key, msg) => hmac(sha256, key, msg);
1224
+ * const secretKey = secp.utils.randomSecretKey();
1225
+ * const sig = secp.sign(new Uint8Array([1, 2, 3]), secretKey);
1226
+ * ```
1082
1227
  */
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
1228
+ const hashes = {
1229
+ hmacSha256Async: async (key, message) => {
1230
+ const s = subtle();
1231
+ const name = 'HMAC';
1232
+ const k = await s.importKey('raw', key, { name, hash: { name: _sha } }, false, ['sign']);
1233
+ return u8n(await s.sign(name, k, message));
1234
+ },
1235
+ hmacSha256: undefined,
1236
+ sha256Async: async (msg) => u8n(await subtle().digest(_sha, msg)),
1237
+ sha256: undefined,
1116
1238
  };
1117
-
1118
- new Mutex();
1119
1239
  /**
1120
- * Creates a new SHA-2 (SHA-384) hash instance
1240
+ * Elliptic Curve Diffie-Hellman (ECDH) on secp256k1.
1241
+ * Result is **NOT hashed** and returns the serialized shared point (compressed by default),
1242
+ * not the SEC 1 x-only primitive `z = x_P`.
1243
+ * secp256k1 has cofactor `h = 1`, so there is no separate cofactor-ECDH distinction here.
1244
+ * @param secretKeyA - local 32-byte secret key.
1245
+ * @param publicKeyB - peer public key.
1246
+ * @param isCompressed - return 33-byte compressed output when `true`.
1247
+ * @returns shared secret point bytes.
1248
+ * @example
1249
+ * Derive a shared secp256k1 secret with ECDH.
1250
+ * ```ts
1251
+ * import * as secp from '@noble/secp256k1';
1252
+ * const alice = secp.utils.randomSecretKey();
1253
+ * const bob = secp.utils.randomSecretKey();
1254
+ * const shared = secp.getSharedSecret(alice, secp.getPublicKey(bob));
1255
+ * ```
1121
1256
  */
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();
1257
+ const getSharedSecret = (secretKeyA, publicKeyB, isCompressed = true) => {
1258
+ return Point.fromBytes(publicKeyB).multiply(secretKeyToScalar(secretKeyA)).toBytes(isCompressed);
1259
+ };
1260
+ // FIPS 186-5 Appendix A.4.1 style key generation reduces a wide random integer mod (n - 1) and adds 1.
1261
+ // The 48-byte minimum keeps the secp256k1 bias bound below the appendix's epsilon <= 2^-64 target.
1262
+ const randomSecretKey = (seed) => {
1263
+ seed = seed === undefined ? randomBytes(lengths.seed) : seed;
1264
+ abytes(seed);
1265
+ // Keep the public range text aligned with the enforced 48-byte FIPS floor.
1266
+ if (seed.length < lengths.seed || seed.length > 1024)
1267
+ return err$1('expected 48-1024b', RangeError);
1268
+ const num = M(bytesToNumBE(seed), N - 1n);
1269
+ return numTo32b(num + 1n);
1270
+ };
1271
+ const createKeygen = (getPublicKey) => (seed) => {
1272
+ const secretKey = randomSecretKey(seed);
1273
+ return {
1274
+ secretKey,
1275
+ publicKey: getPublicKey(secretKey),
1276
+ };
1277
+ };
1149
1278
  /**
1150
- * Creates a new SHA-2 (SHA-512) hash instance
1279
+ * Math, hex, byte helpers. Not in `utils` because utils share API with noble-curves.
1280
+ * @example
1281
+ * Convert bytes to a hex string with the low-level helper namespace.
1282
+ * ```ts
1283
+ * import { etc } from '@noble/secp256k1';
1284
+ * const hex = etc.bytesToHex(new Uint8Array([1, 2, 3]));
1285
+ * ```
1151
1286
  */
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 = "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";
1188
- var hash$4 = "6abbce74";
1189
- var wasmJson$4 = {
1190
- name: name$4,
1191
- data: data$4,
1192
- hash: hash$4
1193
- };
1194
-
1195
- new Mutex();
1196
- /**
1197
- * Creates a new RIPEMD-160 hash instance
1198
- */
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;
1233
- }
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;
1247
- }
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
-
1287
+ const etc = /* @__PURE__ */ Object.freeze({
1288
+ hexToBytes,
1289
+ bytesToHex,
1290
+ concatBytes,
1291
+ bytesToNumberBE: bytesToNumBE,
1292
+ numberToBytesBE: numTo32b,
1293
+ mod: M,
1294
+ invert: invert, // math utilities; keep public alias type aligned with runtime
1295
+ randomBytes,
1296
+ secretKeyToScalar: secretKeyToScalar,
1297
+ abytes: abytes,
1298
+ });
1298
1299
  /**
1299
- * ```js
1300
- * const {createHash} = await import('@leofcoin/crypto')
1301
- * createHash(data, algorithm)
1300
+ * Curve-specific key utilities.
1301
+ * @example
1302
+ * Generate a fresh secret key and derive its public key.
1303
+ * ```ts
1304
+ * import * as secp from '@noble/secp256k1';
1305
+ * const secretKey = secp.utils.randomSecretKey();
1306
+ * const publicKey = secp.getPublicKey(secretKey);
1302
1307
  * ```
1303
- * @param {Uint8Array} data
1304
- * @param {string} algorithm
1305
- * @returns Uint8Array
1306
1308
  */
1307
- const createHash = (data, algorithm = 'SHA-512') => subtle$1.digest(algorithm, data);
1308
-
1309
+ const utils$2 = /* @__PURE__ */ Object.freeze({
1310
+ isValidSecretKey: isValidSecretKey,
1311
+ isValidPublicKey: isValidPublicKey,
1312
+ randomSecretKey: randomSecretKey, // preserve the optional seeded call
1313
+ });
1314
+ // Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.
1315
+ // https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki
1316
+ // Internal BIP340 tag names are ASCII-only here, so charCodeAt() is enough; this is not a general UTF-8 encoder.
1317
+ const getTag = (tag) => Uint8Array.from('BIP0340/' + tag, (c) => c.charCodeAt(0));
1318
+ const T_AUX = 'aux';
1319
+ const T_NONCE = 'nonce';
1320
+ const T_CHALLENGE = 'challenge';
1321
+ // Both SHA-256 provider slots are configurable, so tag hashing still goes through the checked
1322
+ // wrappers even though the built-in defaults are deterministic and the tag bytes are ASCII-only.
1323
+ const taggedHash = (tag, ...messages) => {
1324
+ const tagH = gh('sha256', getTag(tag));
1325
+ return gh('sha256', concatBytes(tagH, tagH, ...messages));
1326
+ };
1327
+ // Async twin of taggedHash with the same checked provider boundary.
1328
+ const taggedHashAsync = (tag, ...messages) => gha('sha256Async', getTag(tag)).then((tagH) => gha('sha256Async', concatBytes(tagH, tagH, ...messages)));
1329
+ // BIP340 PubKey(sk) = bytes(d'⋅G), where bytes(P) is bytes(x(P)); signing also normalizes
1330
+ // d to the equivalent scalar whose point has even y so the x-only public key stays canonical.
1331
+ const extpubSchnorr = (priv) => {
1332
+ const d_ = secretKeyToScalar(priv);
1333
+ const p = G.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside
1334
+ const { x, y } = p.assertValidity().toAffine(); // validate Point is not at infinity
1335
+ const d = isEven(y) ? d_ : modN(-d_);
1336
+ const px = numTo32b(x);
1337
+ return { d, px };
1338
+ };
1339
+ const bytesModN = (bytes) => modN(bytesToNumBE(bytes));
1340
+ const challenge = (...args) => bytesModN(taggedHash(T_CHALLENGE, ...args));
1341
+ const challengeAsync = async (...args) => bytesModN(await taggedHashAsync(T_CHALLENGE, ...args));
1342
+ /** Schnorr public key is just `x` coordinate of Point as per BIP340. */
1343
+ const pubSchnorr = (secretKey) => {
1344
+ return extpubSchnorr(secretKey).px; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)
1345
+ };
1346
+ const keygenSchnorr = /* @__PURE__ */ createKeygen(pubSchnorr);
1347
+ // Common preparation fn for both sync and async signing
1348
+ const prepSigSchnorr = (message, secretKey, auxRand) => {
1349
+ const { px, d } = extpubSchnorr(secretKey);
1350
+ return { m: abytes(message), px, d, a: abytes(auxRand, L) };
1351
+ };
1352
+ const extractK = (rand) => {
1353
+ const k_ = bytesModN(rand); // Let k' = int(rand) mod n
1354
+ if (k_ === 0n)
1355
+ err$1('sign failed: k is zero'); // Fail if k' = 0.
1356
+ const { px, d } = extpubSchnorr(numTo32b(k_)); // Let R = k'⋅G.
1357
+ return { rx: px, k: d };
1358
+ };
1359
+ // Common signature creation helper
1360
+ const createSigSchnorr = (k, px, e, d) => {
1361
+ return concatBytes(px, numTo32b(modN(k + e * d)));
1362
+ };
1363
+ const E_INVSIG = 'invalid signature produced';
1309
1364
  /**
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
1365
+ * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.
1366
+ * auxRand is optional and defaults to fresh 32-byte randomness; it is not the sole source of
1367
+ * k generation, so bad CSPRNG won't be the only entropy source.
1318
1368
  */
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'])
1369
+ const signSchnorr = (message, secretKey, auxRand = randomBytes(L)) => {
1370
+ const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
1371
+ const aux = taggedHash(T_AUX, a);
1372
+ // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
1373
+ const t = numTo32b(d ^ bytesToNumBE(aux));
1374
+ // Let rand = hash/nonce(t || bytes(P) || m)
1375
+ const rand = taggedHash(T_NONCE, t, px, m);
1376
+ const { rx, k } = extractK(rand);
1377
+ // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
1378
+ const e = challenge(rx, px, m);
1379
+ const sig = createSigSchnorr(k, rx, e, d);
1380
+ // If Verify(bytes(P), m, sig) (see below) returns failure, abort
1381
+ if (!verifySchnorr(sig, m, px))
1382
+ err$1(E_INVSIG);
1383
+ return sig;
1324
1384
  };
1325
-
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
1334
- },
1335
- key,
1336
- length
1337
- )
1385
+ const signSchnorrAsync = async (message, secretKey, auxRand = randomBytes(L)) => {
1386
+ const { m, px, d, a } = prepSigSchnorr(message, secretKey, auxRand);
1387
+ const aux = await taggedHashAsync(T_AUX, a);
1388
+ // Let t be the byte-wise xor of bytes(d) and hash/aux(a)
1389
+ const t = numTo32b(d ^ bytesToNumBE(aux));
1390
+ // Let rand = hash/nonce(t || bytes(P) || m)
1391
+ const rand = await taggedHashAsync(T_NONCE, t, px, m);
1392
+ const { rx, k } = extractK(rand);
1393
+ // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.
1394
+ const e = await challengeAsync(rx, px, m);
1395
+ const sig = createSigSchnorr(k, rx, e, d);
1396
+ // If Verify(bytes(P), m, sig) (see below) returns failure, abort
1397
+ if (!(await verifySchnorrAsync(sig, m, px)))
1398
+ err$1(E_INVSIG);
1399
+ return sig;
1338
1400
  };
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
1401
+ const callSyncAsyncFn = (res, later) => {
1402
+ return res instanceof Promise ? res.then(later) : later(res);
1367
1403
  };
1368
-
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
- }
1404
+ const _verifSchnorr = (signature, message, publicKey, challengeFn) => {
1405
+ const sig = abytes(signature, L2, 'signature');
1406
+ const msg = abytes(message, undefined, 'message');
1407
+ const pub = abytes(publicKey, L, 'publicKey');
1408
+ try {
1409
+ // lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.
1410
+ // Fail if x p. Let c = + 7 mod p.
1411
+ const x = bytesToNumBE(pub);
1412
+ const y = lift_x(x); // lift_x already returns the unique even root required by BIP340.
1413
+ const P_ = new Point(x, y, 1n).assertValidity();
1414
+ const px = numTo32b(P_.toAffine().x);
1415
+ // P = lift_x(int(pk)); fail if that fails
1416
+ const r = sliceBytesNumBE(sig, 0, L); // Let r = int(sig[0:32]); fail if r ≥ p.
1417
+ arange(r, 1n, P);
1418
+ const s = sliceBytesNumBE(sig, L, L2); // Let s = int(sig[32:64]); fail if s ≥ n.
1419
+ // Stricter than BIP-340/libsecp256k1, which only reject s >= n. Honest signing reaches
1420
+ // s = 0 only with negligible probability (k + e*d ≡ 0 mod n), so treat zero-s inputs as
1421
+ // crafted edge cases and fail closed instead of carrying that extra verification surface.
1422
+ arange(s, 1n, N);
1423
+ const i = concatBytes(numTo32b(r), px, msg);
1424
+ // int(challenge(bytes(r)||bytes(P)||m))%n
1425
+ return callSyncAsyncFn(challengeFn(i), (e) => {
1426
+ const { x, y } = doubleScalarMulUns(P_, s, modN(-e)).toAffine(); // R = s⋅G - e⋅P
1427
+ if (!isEven(y) || x !== r)
1428
+ return false; // -eP == (n-e)P
1429
+ return true; // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.
1430
+ });
1431
+ }
1432
+ catch (error) {
1433
+ return false;
1434
+ }
1459
1435
  };
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
- */
1436
+ /** Verifies Schnorr signature. Sync wrapper returns false for post-validation failures
1437
+ * after the initial byte checks. */
1438
+ const verifySchnorr = (s, m, p) => _verifSchnorr(s, m, p, challenge);
1439
+ /** Async Schnorr verification. Curve/encoding failures after the initial byte checks still
1440
+ * become false, but async backend failures reject the promise. Missing crypto.subtle is a
1441
+ * runtime/backend error, not an "invalid signature" result, so we surface it instead of
1442
+ * turning it into false. */
1443
+ const verifySchnorrAsync = async (s, m, p) => _verifSchnorr(s, m, p, challengeAsync);
1467
1444
  /**
1468
- * Curve params from SEC 2 v2 §2.4.1.
1469
- * secp256k1 is a short Weierstrass / Koblitz curve with equation
1470
- * `y² == + 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
1445
+ * BIP340 Schnorr helpers over secp256k1.
1446
+ * @example
1447
+ * Sign and verify a BIP340 Schnorr signature.
1448
+ * ```ts
1449
+ * import * as secp from '@noble/secp256k1';
1450
+ * import { sha256 } from '@noble/hashes/sha2.js';
1451
+ * secp.hashes.sha256 = sha256;
1452
+ * const secretKey = secp.utils.randomSecretKey();
1453
+ * const message = new Uint8Array([1, 2, 3]);
1454
+ * const sig = secp.schnorr.sign(message, secretKey);
1455
+ * const publicKey = secp.schnorr.getPublicKey(secretKey);
1456
+ * const isValid = secp.schnorr.verify(sig, message, publicKey);
1457
+ * ```
1477
1458
  */
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,
1459
+ const schnorr = /* @__PURE__ */ Object.freeze({
1460
+ keygen: keygenSchnorr,
1461
+ getPublicKey: pubSchnorr,
1462
+ sign: signSchnorr,
1463
+ verify: verifySchnorr,
1464
+ signAsync: signSchnorrAsync,
1465
+ verifyAsync: verifySchnorrAsync,
1488
1466
  });
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,
1467
+ // ## Precomputes
1468
+ // --------------
1469
+ const W = 8; // W is window size
1470
+ const scalarBits = 256;
1471
+ const pwindows = Math.ceil(scalarBits / W) + 1; // 33 for W=8, NOT 32 - see wNAF loop
1472
+ const pwindowSize = 2 ** (W - 1); // 128 for W=8
1473
+ const precompute = () => {
1474
+ const points = [];
1475
+ let p = G;
1476
+ let b = p;
1477
+ for (let w = 0; w < pwindows; w++) {
1478
+ b = p;
1479
+ points.push(b);
1480
+ for (let i = 1; i < pwindowSize; i++) {
1481
+ b = b.add(p);
1482
+ points.push(b);
1483
+ } // i=1, bc we skip 0
1484
+ p = b.double();
1485
+ }
1486
+ return points;
1500
1487
  };
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;
1488
+ let Gpows = undefined; // precomputes for base point G
1489
+ // Branch-shaped negate helper for wNAF; not a hard constant-time primitive in JavaScript.
1490
+ const ctneg = (cnd, p) => {
1491
+ const n = p.negate();
1492
+ return cnd ? n : p;
1510
1493
  };
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);
1494
+ /**
1495
+ * Precomputes give 12x faster getPublicKey(), 10x sign(), 2x verify() by
1496
+ * caching multiples of G (base point). Cache is stored in 32MB of RAM.
1497
+ * Any time `G.multiply` is done, precomputes are used.
1498
+ * Not used for getSharedSecret, which instead multiplies random pubkey `P.multiply`.
1499
+ *
1500
+ * w-ary non-adjacent form (wNAF) precomputation method is 10% slower than windowed method,
1501
+ * but takes 2x less RAM. RAM reduction is possible by utilizing `.subtract`.
1502
+ *
1503
+ * !! Precomputes can be disabled by commenting-out call of the wNAF() inside Point#multiply().
1504
+ */
1505
+ const wNAF = (n) => {
1506
+ const comp = Gpows || (Gpows = precompute());
1507
+ let p = I;
1508
+ let f = G; // f must be G, or could become I in the end
1509
+ const pow_2_w = 2 ** W; // 256 for W=8
1510
+ const maxNum = pow_2_w; // 256 for W=8
1511
+ const mask = big(pow_2_w - 1); // 255 for W=8 == mask 0b11111111
1512
+ const shiftBy = big(W); // 8 for W=8
1513
+ for (let w = 0; w < pwindows; w++) {
1514
+ let wbits = Number(n & mask); // extract W bits.
1515
+ n >>= shiftBy; // shift number by W bits.
1516
+ // We use negative indexes to reduce size of precomputed table by 2x.
1517
+ // Instead of needing precomputes 0..256, we only calculate them for 0..128.
1518
+ // If an index > 128 is found, we do (256-index) - where 256 is next window.
1519
+ // Naive: index +127 => 127, +224 => 224
1520
+ // Optimized: index +127 => 127, +224 => 256-32
1521
+ if (wbits > pwindowSize) {
1522
+ wbits -= maxNum;
1523
+ n += 1n;
1524
+ }
1525
+ const off = w * pwindowSize;
1526
+ const offF = off; // offsets, evaluate both
1527
+ const offP = off + Math.abs(wbits) - 1;
1528
+ const isEven = w % 2 !== 0; // conditions, evaluate both
1529
+ const isNeg = wbits < 0;
1530
+ if (wbits === 0) {
1531
+ // off == I: can't add it. Adding random offF instead.
1532
+ f = f.add(ctneg(isEven, comp[offF])); // bits are 0: add garbage to fake point
1533
+ }
1534
+ else {
1535
+ p = p.add(ctneg(isNeg, comp[offP])); // bits are 1: add to result point
1536
+ }
1529
1537
  }
1530
- return value;
1538
+ if (n !== 0n)
1539
+ err$1('invalid wnaf');
1540
+ return { p, f }; // return both real and fake points for JIT/leakage-shape symmetry
1531
1541
  };
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;
1542
+
1543
+ const leofcoinOlivia = {
1544
+ messagePrefix: '\u0019Leofcoin Signed Message:',
1545
+ version: 1,
1546
+ pubKeyHash: 0x73, // o
1547
+ scriptHash: 0x76, // p
1548
+ multiTxHash: 0x8b4125, // omtx
1549
+ payments: {
1550
+ version: 0,
1551
+ unspent: 0x1fa443d7 // ounsp
1552
+ },
1553
+ wif: 0x7D, // s
1554
+ multiCodec: 0x7c4,
1555
+ bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
1542
1556
  };
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;
1557
+ const bitcoinTestnet = {
1558
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
1559
+ version: 1,
1560
+ bech32: 'tb',
1561
+ pubKeyHash: 0x6f,
1562
+ scriptHash: 0xc4,
1563
+ wif: 0xef,
1564
+ bip32: {
1565
+ public: 0x043587cf,
1566
+ private: 0x04358394
1567
+ },
1568
+ multiCodec: 0
1568
1569
  };
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;
1570
+ var testnets = {
1571
+ 'leofcoin:olivia': leofcoinOlivia,
1572
+ 'bitcoin:testnet': bitcoinTestnet
1581
1573
  };
1574
+
1575
+ // https://en.bitcoin.it/wiki/List_of_address_prefixes
1576
+ // usage:
1577
+ // networks['bitcoin']['testnet']
1578
+ // networks.bitcoin.testnet
1582
1579
  /**
1583
- * WebCrypto OS-level CSPRNG (random number generator).
1584
- * Will throw when not available; large-request ceilings are delegated to getRandomValues().
1580
+ * Main network
1581
+ * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
1585
1582
  */
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);
1583
+ const leofcoin = {
1584
+ messagePrefix: '\u0019Leofcoin Signed Message:',
1585
+ version: 1,
1586
+ pubKeyHash: 0x30, // L
1587
+ scriptHash: 0x37, // P
1588
+ multiTxHash: 0x3adeed, // Lmtx
1589
+ payments: {
1590
+ version: 0,
1591
+ unspent: 0x0d6e0327 // Lunsp
1592
+ },
1593
+ coin_type: 640,
1594
+ wif: 0x3F, // S
1595
+ multiCodec: 0x3c4,
1596
+ bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
1597
+ testnet: testnets['leofcoin:olivia']
1594
1598
  };
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
+ const bitcoin = {
1600
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
1601
+ version: 1,
1602
+ bech32: 'bc',
1603
+ pubKeyHash: 0x00,
1604
+ multiCodec: 0x00,
1605
+ scriptHash: 0x05,
1606
+ wif: 0x80,
1607
+ coin_type: 0,
1608
+ bip32: {
1609
+ public: 0x0488b21e, private: 0x0488ade4
1610
+ },
1611
+ testnet: testnets['bitcoin:testnet']
1599
1612
  };
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
+ const litecoin = {
1614
+ messagePrefix: '\x19Litecoin Signed Message:\n',
1615
+ version: 1,
1616
+ pubKeyHash: 0x30,
1617
+ scriptHash: 0x32,
1618
+ wif: 0xb0,
1619
+ bip32: {
1620
+ public: 0x019da462,
1621
+ private: 0x019d9cfe
1622
+ },
1623
+ bech32: '',
1624
+ multiCodec: 0
1613
1625
  };
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;
1626
+ const ethereum = {
1627
+ messagePrefix: '\x19Ethereum Signed Message:\n',
1628
+ version: 1,
1629
+ pubKeyHash: 0x30,
1630
+ scriptHash: 0x32,
1631
+ bip32: {
1632
+ private: 0x0488ADE4, public: 0x0488B21E
1633
+ },
1634
+ coin_type: 60,
1635
+ wif: 0x45, //E
1636
+ multiCodec: 0x3c5
1620
1637
  };
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
1638
  /**
1630
- * secp256k1 formula. Koblitz curves are subclass of weierstrass curves with a=0,
1631
- * making it x³+b; callers validate x first.
1639
+ * Our & supported networks
1640
+ * @return {leofcoin, olivia}
1632
1641
  */
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);
1642
+ var networks = {
1643
+ leofcoin,
1644
+ bitcoin,
1645
+ litecoin,
1646
+ ethereum
1665
1647
  };
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
- * ```
1648
+
1649
+ /*!
1650
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
1651
+ * (c) Dani Biro
1652
+ * @license MIT
1677
1653
  */
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;
1654
+
1655
+
1656
+ /******************************************************************************
1657
+ Copyright (c) Microsoft Corporation.
1658
+
1659
+ Permission to use, copy, modify, and/or distribute this software for any
1660
+ purpose with or without fee is hereby granted.
1661
+
1662
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
1663
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
1664
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
1665
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
1666
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1667
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1668
+ PERFORMANCE OF THIS SOFTWARE.
1669
+ ***************************************************************************** */
1670
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
1671
+
1672
+
1673
+ function __awaiter(thisArg, _arguments, P, generator) {
1674
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
1675
+ return new (P || (P = Promise))(function (resolve, reject) {
1676
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
1677
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
1678
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
1679
+ step((generator = generator.apply(thisArg, [])).next());
1680
+ });
1681
+ }
1682
+
1683
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1684
+ var e = new Error(message);
1685
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1686
+ };
1687
+
1688
+ class Mutex {
1689
+ constructor() {
1690
+ this.mutex = Promise.resolve();
1695
1691
  }
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);
1692
+ lock() {
1693
+ let begin = () => { };
1694
+ this.mutex = this.mutex.then(() => new Promise(begin));
1695
+ return new Promise((res) => {
1696
+ begin = res;
1697
+ });
1700
1698
  }
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');
1699
+ dispatch(fn) {
1700
+ return __awaiter(this, void 0, void 0, function* () {
1701
+ const unlock = yield this.lock();
1702
+ try {
1703
+ return yield Promise.resolve(fn());
1704
+ }
1705
+ finally {
1706
+ unlock();
1707
+ }
1708
+ });
1728
1709
  }
1729
- static fromHex(hex) {
1730
- return Point.fromBytes(hexToBytes(hex));
1710
+ }
1711
+
1712
+ var _a;
1713
+ function getGlobal() {
1714
+ if (typeof globalThis !== "undefined")
1715
+ return globalThis;
1716
+ if (typeof self !== "undefined")
1717
+ return self;
1718
+ if (typeof window !== "undefined")
1719
+ return window;
1720
+ return global;
1721
+ }
1722
+ const globalObject = getGlobal();
1723
+ const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
1724
+ const textEncoder = globalObject.TextEncoder
1725
+ ? new globalObject.TextEncoder()
1726
+ : null;
1727
+ function hexCharCodesToInt(a, b) {
1728
+ return ((((a & 0xf) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) |
1729
+ ((b & 0xf) + ((b >> 6) | ((b >> 3) & 0x8))));
1730
+ }
1731
+ function writeHexToUInt8(buf, str) {
1732
+ const size = str.length >> 1;
1733
+ for (let i = 0; i < size; i++) {
1734
+ const index = i << 1;
1735
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
1731
1736
  }
1732
- get x() {
1733
- return this.toAffine().x;
1737
+ }
1738
+ function hexStringEqualsUInt8(str, buf) {
1739
+ if (str.length !== buf.length * 2) {
1740
+ return false;
1734
1741
  }
1735
- get y() {
1736
- return this.toAffine().y;
1742
+ for (let i = 0; i < buf.length; i++) {
1743
+ const strIndex = i << 1;
1744
+ if (buf[i] !==
1745
+ hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
1746
+ return false;
1747
+ }
1737
1748
  }
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;
1749
+ return true;
1750
+ }
1751
+ const alpha = "a".charCodeAt(0) - 10;
1752
+ const digit = "0".charCodeAt(0);
1753
+ function getDigestHex(tmpBuffer, input, hashLength) {
1754
+ let p = 0;
1755
+ for (let i = 0; i < hashLength; i++) {
1756
+ let nibble = input[i] >>> 4;
1757
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
1758
+ nibble = input[i] & 0xf;
1759
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
1747
1760
  }
1748
- is0() {
1749
- return this.equals(I);
1761
+ return String.fromCharCode.apply(null, tmpBuffer);
1762
+ }
1763
+ const getUInt8Buffer = nodeBuffer !== null
1764
+ ? (data) => {
1765
+ if (typeof data === "string") {
1766
+ const buf = nodeBuffer.from(data, "utf8");
1767
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
1768
+ }
1769
+ if (nodeBuffer.isBuffer(data)) {
1770
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
1771
+ }
1772
+ if (ArrayBuffer.isView(data)) {
1773
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
1774
+ }
1775
+ throw new Error("Invalid data type!");
1750
1776
  }
1751
- /** Flip point over y coordinate. */
1752
- negate() {
1753
- return new Point(this.X, M(-this.Y), this.Z);
1754
- }
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));
1777
+ : (data) => {
1778
+ if (typeof data === "string") {
1779
+ return textEncoder.encode(data);
1780
+ }
1781
+ if (ArrayBuffer.isView(data)) {
1782
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
1783
+ }
1784
+ throw new Error("Invalid data type!");
1785
+ };
1786
+ const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1787
+ const base64Lookup = new Uint8Array(256);
1788
+ for (let i = 0; i < base64Chars.length; i++) {
1789
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
1790
+ }
1791
+ function getDecodeBase64Length(data) {
1792
+ let bufferLength = Math.floor(data.length * 0.75);
1793
+ const len = data.length;
1794
+ if (data[len - 1] === "=") {
1795
+ bufferLength -= 1;
1796
+ if (data[len - 2] === "=") {
1797
+ bufferLength -= 1;
1798
+ }
1881
1799
  }
1800
+ return bufferLength;
1882
1801
  }
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;
1802
+ function decodeBase64(data) {
1803
+ const bufferLength = getDecodeBase64Length(data);
1804
+ const len = data.length;
1805
+ const bytes = new Uint8Array(bufferLength);
1806
+ let p = 0;
1807
+ for (let i = 0; i < len; i += 4) {
1808
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
1809
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
1810
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
1811
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
1812
+ bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
1813
+ p += 1;
1814
+ bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
1815
+ p += 1;
1816
+ bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
1817
+ p += 1;
1944
1818
  }
1819
+ return bytes;
1820
+ }
1821
+
1822
+ const MAX_HEAP = 16 * 1024;
1823
+ const WASM_FUNC_HASH_LENGTH = 4;
1824
+ const wasmMutex = new Mutex();
1825
+ const wasmModuleCache = new Map();
1826
+ function WASMInterface(binary, hashLength) {
1827
+ return __awaiter(this, void 0, void 0, function* () {
1828
+ let wasmInstance = null;
1829
+ let memoryView = null;
1830
+ let initialized = false;
1831
+ if (typeof WebAssembly === "undefined") {
1832
+ throw new Error("WebAssembly is not supported in this environment!");
1833
+ }
1834
+ const writeMemory = (data, offset = 0) => {
1835
+ memoryView.set(data, offset);
1836
+ };
1837
+ const getMemory = () => memoryView;
1838
+ const getExports = () => wasmInstance.exports;
1839
+ const setMemorySize = (totalSize) => {
1840
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
1841
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
1842
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1843
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
1844
+ };
1845
+ const getStateSize = () => {
1846
+ const view = new DataView(wasmInstance.exports.memory.buffer);
1847
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
1848
+ return stateSize;
1849
+ };
1850
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
1851
+ if (!wasmModuleCache.has(binary.name)) {
1852
+ const asm = decodeBase64(binary.data);
1853
+ const promise = WebAssembly.compile(asm);
1854
+ wasmModuleCache.set(binary.name, promise);
1855
+ }
1856
+ const module = yield wasmModuleCache.get(binary.name);
1857
+ wasmInstance = yield WebAssembly.instantiate(module, {
1858
+ // env: {
1859
+ // emscripten_memcpy_big: (dest, src, num) => {
1860
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
1861
+ // const memView = new Uint8Array(memoryBuffer, 0);
1862
+ // memView.set(memView.subarray(src, src + num), dest);
1863
+ // },
1864
+ // print_memory: (offset, len) => {
1865
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
1866
+ // const memView = new Uint8Array(memoryBuffer, 0);
1867
+ // console.log('print_int32', memView.subarray(offset, offset + len));
1868
+ // },
1869
+ // },
1870
+ });
1871
+ // wasmInstance.exports._start();
1872
+ }));
1873
+ const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
1874
+ if (!wasmInstance) {
1875
+ yield loadWASMPromise;
1876
+ }
1877
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
1878
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1879
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
1880
+ });
1881
+ const init = (bits = null) => {
1882
+ initialized = true;
1883
+ wasmInstance.exports.Hash_Init(bits);
1884
+ };
1885
+ const updateUInt8Array = (data) => {
1886
+ let read = 0;
1887
+ while (read < data.length) {
1888
+ const chunk = data.subarray(read, read + MAX_HEAP);
1889
+ read += chunk.length;
1890
+ memoryView.set(chunk);
1891
+ wasmInstance.exports.Hash_Update(chunk.length);
1892
+ }
1893
+ };
1894
+ const update = (data) => {
1895
+ if (!initialized) {
1896
+ throw new Error("update() called before init()");
1897
+ }
1898
+ const Uint8Buffer = getUInt8Buffer(data);
1899
+ updateUInt8Array(Uint8Buffer);
1900
+ };
1901
+ const digestChars = new Uint8Array(hashLength * 2);
1902
+ const digest = (outputType, padding = null) => {
1903
+ if (!initialized) {
1904
+ throw new Error("digest() called before init()");
1905
+ }
1906
+ initialized = false;
1907
+ wasmInstance.exports.Hash_Final(padding);
1908
+ if (outputType === "binary") {
1909
+ // the data is copied to allow GC of the original memory object
1910
+ return memoryView.slice(0, hashLength);
1911
+ }
1912
+ return getDigestHex(digestChars, memoryView, hashLength);
1913
+ };
1914
+ const save = () => {
1915
+ if (!initialized) {
1916
+ throw new Error("save() can only be called after init() and before digest()");
1917
+ }
1918
+ const stateOffset = wasmInstance.exports.Hash_GetState();
1919
+ const stateLength = getStateSize();
1920
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1921
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
1922
+ // prefix is 4 bytes from SHA1 hash of the WASM binary
1923
+ // it is used to detect incompatible internal states between different versions of hash-wasm
1924
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
1925
+ writeHexToUInt8(prefixedState, binary.hash);
1926
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
1927
+ return prefixedState;
1928
+ };
1929
+ const load = (state) => {
1930
+ if (!(state instanceof Uint8Array)) {
1931
+ throw new Error("load() expects an Uint8Array generated by save()");
1932
+ }
1933
+ const stateOffset = wasmInstance.exports.Hash_GetState();
1934
+ const stateLength = getStateSize();
1935
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
1936
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
1937
+ if (state.length !== overallLength) {
1938
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
1939
+ }
1940
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
1941
+ throw new Error("This state was written by an incompatible hash implementation");
1942
+ }
1943
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
1944
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
1945
+ initialized = true;
1946
+ };
1947
+ const isDataShort = (data) => {
1948
+ if (typeof data === "string") {
1949
+ // worst case is 4 bytes / char
1950
+ return data.length < MAX_HEAP / 4;
1951
+ }
1952
+ return data.byteLength < MAX_HEAP;
1953
+ };
1954
+ let canSimplify = isDataShort;
1955
+ switch (binary.name) {
1956
+ case "argon2":
1957
+ case "scrypt":
1958
+ canSimplify = () => true;
1959
+ break;
1960
+ case "blake2b":
1961
+ case "blake2s":
1962
+ // if there is a key at blake2 then cannot simplify
1963
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
1964
+ break;
1965
+ case "blake3":
1966
+ // if there is a key at blake3 then cannot simplify
1967
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
1968
+ break;
1969
+ case "xxhash64": // cannot simplify
1970
+ case "xxhash3":
1971
+ case "xxhash128":
1972
+ case "crc64":
1973
+ canSimplify = () => false;
1974
+ break;
1975
+ }
1976
+ // shorthand for (init + update + digest) for better performance
1977
+ const calculate = (data, initParam = null, digestParam = null) => {
1978
+ if (!canSimplify(data, initParam)) {
1979
+ init(initParam);
1980
+ update(data);
1981
+ return digest("hex", digestParam);
1982
+ }
1983
+ const buffer = getUInt8Buffer(data);
1984
+ memoryView.set(buffer);
1985
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
1986
+ return getDigestHex(digestChars, memoryView, hashLength);
1987
+ };
1988
+ yield setupInterface();
1989
+ return {
1990
+ getMemory,
1991
+ writeMemory,
1992
+ getExports,
1993
+ setMemorySize,
1994
+ init,
1995
+ update,
1996
+ digest,
1997
+ save,
1998
+ load,
1999
+ calculate,
2000
+ hashLength,
2001
+ };
2002
+ });
2003
+ }
2004
+
2005
+ new Mutex();
2006
+
2007
+ new Mutex();
2008
+
2009
+ new Mutex();
2010
+
2011
+ new Mutex();
2012
+
2013
+ new Mutex();
2014
+
2015
+ new Mutex();
2016
+
2017
+ new Mutex();
2018
+
2019
+ new Mutex();
2020
+
2021
+ var name$c = "sha1";
2022
+ var data$c = "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";
2023
+ var hash$c = "6b530c24";
2024
+ var wasmJson$c = {
2025
+ name: name$c,
2026
+ data: data$c,
2027
+ hash: hash$c
1945
2028
  };
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';
2029
+
2030
+ new Mutex();
2099
2031
  /**
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.
2032
+ * Creates a new SHA-1 hash instance
2103
2033
  */
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
- }
2034
+ function createSHA1() {
2035
+ return WASMInterface(wasmJson$c, 20).then((wasm) => {
2036
+ wasm.init();
2037
+ const obj = {
2038
+ init: () => {
2039
+ wasm.init();
2040
+ return obj;
2041
+ },
2042
+ update: (data) => {
2043
+ wasm.update(data);
2044
+ return obj;
2045
+ },
2046
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2047
+ digest: (outputType) => wasm.digest(outputType),
2048
+ save: () => wasm.save(),
2049
+ load: (data) => {
2050
+ wasm.load(data);
2051
+ return obj;
2052
+ },
2053
+ blockSize: 64,
2054
+ digestSize: 20,
2055
+ };
2056
+ return obj;
2057
+ });
2058
+ }
2059
+
2060
+ var name$b = "sha3";
2061
+ var data$b = "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";
2062
+ var hash$b = "fb24e536";
2063
+ var wasmJson$b = {
2064
+ name: name$b,
2065
+ data: data$b,
2066
+ hash: hash$b
2170
2067
  };
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
- * ```
2068
+
2069
+ new Mutex();
2070
+
2071
+ new Mutex();
2072
+ function validateBits(bits) {
2073
+ if (![224, 256, 384, 512].includes(bits)) {
2074
+ return new Error("Invalid variant! Valid values: 224, 256, 384, 512");
2075
+ }
2076
+ return null;
2077
+ }
2078
+ /**
2079
+ * Creates a new Keccak hash instance
2080
+ * @param bits Number of output bits. Valid values: 224, 256, 384, 512
2193
2081
  */
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();
2082
+ function createKeccak(bits = 512) {
2083
+ if (validateBits(bits)) {
2084
+ return Promise.reject(validateBits(bits));
2220
2085
  }
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;
2086
+ const outputSize = bits / 8;
2087
+ return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
2088
+ wasm.init(bits);
2089
+ const obj = {
2090
+ init: () => {
2091
+ wasm.init(bits);
2092
+ return obj;
2093
+ },
2094
+ update: (data) => {
2095
+ wasm.update(data);
2096
+ return obj;
2097
+ },
2098
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2099
+ digest: (outputType) => wasm.digest(outputType, 0x01),
2100
+ save: () => wasm.save(),
2101
+ load: (data) => {
2102
+ wasm.load(data);
2103
+ return obj;
2104
+ },
2105
+ blockSize: 200 - 2 * outputSize,
2106
+ digestSize: outputSize,
2107
+ };
2108
+ return obj;
2109
+ });
2110
+ }
2111
+
2112
+ var name$a = "sha256";
2113
+ var data$a = "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c2pBx6KerX1qIhkgASADcyACcSABIANxcyABQR53IAFBE3dzIAFBCndzaiAaaiICaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakHRxqk2aiIaIAIgAXMgA3EgAiABcXMgAkEedyACQRN3cyACQQp3c2ogGGoiA2oiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pB59KkoQFqIhggAyACcyABcSADIAJxcyADQR53IANBE3dzIANBCndzaiAUaiIBaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGFldy9AmoiFCABIANzIAJxIAEgA3FzIAFBHncgAUETd3MgAUEKd3NqIBdqIgJqIhMgI2ogJiASaiAiIBFqICUgCWogEyASIBFzcSARc2ogE0EadyATQRV3cyATQQd3c2pBuMLs8AJqIhcgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAZaiIDaiIJIBMgEnNxIBJzaiAJQRp3IAlBFXdzIAlBB3dzakH827HpBGoiGSADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBpqIgFqIhEgCSATc3EgE3NqIBFBGncgEUEVd3MgEUEHd3NqQZOa4JkFaiIaIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGGoiAmoiEiARIAlzcSAJc2ogEkEadyASQRV3cyASQQd3c2pB1OapqAZqIhggAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAUaiIDaiITaiAoIBJqICQgEWogJyAJaiATIBIgEXNxIBFzaiATQRp3IBNBFXdzIBNBB3dzakG7laizB2oiFCADIAJzIAFxIAMgAnFzIANBHncgA0ETd3MgA0EKd3NqIBdqIgFqIgkgEyASc3EgEnNqIAlBGncgCUEVd3MgCUEHd3NqQa6Si454aiIXIAEgA3MgAnEgASADcXMgAUEedyABQRN3cyABQQp3c2ogGWoiAmoiESAJIBNzcSATc2ogEUEadyARQRV3cyARQQd3c2pBhdnIk3lqIhkgAiABcyADcSACIAFxcyACQR53IAJBE3dzIAJBCndzaiAaaiIDaiISIBEgCXNxIAlzaiASQRp3IBJBFXdzIBJBB3dzakGh0f+VemoiGiADIAJz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";
2114
+ var hash$a = "8c18dd94";
2115
+ var wasmJson$a = {
2116
+ name: name$a,
2117
+ data: data$a,
2118
+ hash: hash$a
2228
2119
  };
2120
+
2121
+ new Mutex();
2229
2122
  /**
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().
2123
+ * Creates a new SHA-2 (SHA-224) hash instance
2239
2124
  */
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
2125
+ function createSHA224() {
2126
+ return WASMInterface(wasmJson$a, 28).then((wasm) => {
2127
+ wasm.init(224);
2128
+ const obj = {
2129
+ init: () => {
2130
+ wasm.init(224);
2131
+ return obj;
2132
+ },
2133
+ update: (data) => {
2134
+ wasm.update(data);
2135
+ return obj;
2136
+ },
2137
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2138
+ digest: (outputType) => wasm.digest(outputType),
2139
+ save: () => wasm.save(),
2140
+ load: (data) => {
2141
+ wasm.load(data);
2142
+ return obj;
2143
+ },
2144
+ blockSize: 64,
2145
+ digestSize: 28,
2146
+ };
2147
+ return obj;
2148
+ });
2149
+ }
2150
+
2151
+ new Mutex();
2152
+ /**
2153
+ * Creates a new SHA-2 (SHA-256) hash instance
2154
+ */
2155
+ function createSHA256() {
2156
+ return WASMInterface(wasmJson$a, 32).then((wasm) => {
2157
+ wasm.init(256);
2158
+ const obj = {
2159
+ init: () => {
2160
+ wasm.init(256);
2161
+ return obj;
2162
+ },
2163
+ update: (data) => {
2164
+ wasm.update(data);
2165
+ return obj;
2166
+ },
2167
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2168
+ digest: (outputType) => wasm.digest(outputType),
2169
+ save: () => wasm.save(),
2170
+ load: (data) => {
2171
+ wasm.load(data);
2172
+ return obj;
2173
+ },
2174
+ blockSize: 64,
2175
+ digestSize: 32,
2176
+ };
2177
+ return obj;
2178
+ });
2179
+ }
2180
+
2181
+ var name$9 = "sha512";
2182
+ var data$9 = "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";
2183
+ var hash$9 = "f2e40eb1";
2184
+ var wasmJson$9 = {
2185
+ name: name$9,
2186
+ data: data$9,
2187
+ hash: hash$9
2276
2188
  };
2277
2189
 
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
2190
+ new Mutex();
2191
+ /**
2192
+ * Creates a new SHA-2 (SHA-384) hash instance
2193
+ */
2194
+ function createSHA384() {
2195
+ return WASMInterface(wasmJson$9, 48).then((wasm) => {
2196
+ wasm.init(384);
2197
+ const obj = {
2198
+ init: () => {
2199
+ wasm.init(384);
2200
+ return obj;
2201
+ },
2202
+ update: (data) => {
2203
+ wasm.update(data);
2204
+ return obj;
2205
+ },
2206
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2207
+ digest: (outputType) => wasm.digest(outputType),
2208
+ save: () => wasm.save(),
2209
+ load: (data) => {
2210
+ wasm.load(data);
2211
+ return obj;
2212
+ },
2213
+ blockSize: 128,
2214
+ digestSize: 48,
2215
+ };
2216
+ return obj;
2217
+ });
2218
+ }
2219
+
2220
+ new Mutex();
2221
+ /**
2222
+ * Creates a new SHA-2 (SHA-512) hash instance
2223
+ */
2224
+ function createSHA512() {
2225
+ return WASMInterface(wasmJson$9, 64).then((wasm) => {
2226
+ wasm.init(512);
2227
+ const obj = {
2228
+ init: () => {
2229
+ wasm.init(512);
2230
+ return obj;
2231
+ },
2232
+ update: (data) => {
2233
+ wasm.update(data);
2234
+ return obj;
2235
+ },
2236
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2237
+ digest: (outputType) => wasm.digest(outputType),
2238
+ save: () => wasm.save(),
2239
+ load: (data) => {
2240
+ wasm.load(data);
2241
+ return obj;
2242
+ },
2243
+ blockSize: 128,
2244
+ digestSize: 64,
2245
+ };
2246
+ return obj;
2247
+ });
2248
+ }
2249
+
2250
+ new Mutex();
2251
+
2252
+ new Mutex();
2253
+
2254
+ new Mutex();
2255
+
2256
+ new Mutex();
2257
+
2258
+ var name$4 = "ripemd160";
2259
+ var data$4 = "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";
2260
+ var hash$4 = "6abbce74";
2261
+ var wasmJson$4 = {
2262
+ name: name$4,
2263
+ data: data$4,
2264
+ hash: hash$4
2308
2265
  };
2309
2266
 
2310
- // https://en.bitcoin.it/wiki/List_of_address_prefixes
2311
- // usage:
2312
- // networks['bitcoin']['testnet']
2313
- // networks.bitcoin.testnet
2267
+ new Mutex();
2314
2268
  /**
2315
- * Main network
2316
- * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
2269
+ * Creates a new RIPEMD-160 hash instance
2317
2270
  */
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
- };
2271
+ function createRIPEMD160() {
2272
+ return WASMInterface(wasmJson$4, 20).then((wasm) => {
2273
+ wasm.init();
2274
+ const obj = {
2275
+ init: () => {
2276
+ wasm.init();
2277
+ return obj;
2278
+ },
2279
+ update: (data) => {
2280
+ wasm.update(data);
2281
+ return obj;
2282
+ },
2283
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2284
+ digest: (outputType) => wasm.digest(outputType),
2285
+ save: () => wasm.save(),
2286
+ load: (data) => {
2287
+ wasm.load(data);
2288
+ return obj;
2289
+ },
2290
+ blockSize: 64,
2291
+ digestSize: 20,
2292
+ };
2293
+ return obj;
2294
+ });
2295
+ }
2296
+
2297
+ function calculateKeyBuffer(hasher, key) {
2298
+ const { blockSize } = hasher;
2299
+ const buf = getUInt8Buffer(key);
2300
+ if (buf.length > blockSize) {
2301
+ hasher.update(buf);
2302
+ const uintArr = hasher.digest("binary");
2303
+ hasher.init();
2304
+ return uintArr;
2305
+ }
2306
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
2307
+ }
2308
+ function calculateHmac(hasher, key) {
2309
+ hasher.init();
2310
+ const { blockSize } = hasher;
2311
+ const keyBuf = calculateKeyBuffer(hasher, key);
2312
+ const keyBuffer = new Uint8Array(blockSize);
2313
+ keyBuffer.set(keyBuf);
2314
+ const opad = new Uint8Array(blockSize);
2315
+ for (let i = 0; i < blockSize; i++) {
2316
+ const v = keyBuffer[i];
2317
+ opad[i] = v ^ 0x5c;
2318
+ keyBuffer[i] = v ^ 0x36;
2319
+ }
2320
+ hasher.update(keyBuffer);
2321
+ const obj = {
2322
+ init: () => {
2323
+ hasher.init();
2324
+ hasher.update(keyBuffer);
2325
+ return obj;
2326
+ },
2327
+ update: (data) => {
2328
+ hasher.update(data);
2329
+ return obj;
2330
+ },
2331
+ digest: ((outputType) => {
2332
+ const uintArr = hasher.digest("binary");
2333
+ hasher.init();
2334
+ hasher.update(opad);
2335
+ hasher.update(uintArr);
2336
+ return hasher.digest(outputType);
2337
+ // biome-ignore lint/suspicious/noExplicitAny: Conflict with IHasher type
2338
+ }),
2339
+ save: () => {
2340
+ throw new Error("save() not supported");
2341
+ },
2342
+ load: () => {
2343
+ throw new Error("load() not supported");
2344
+ },
2345
+ blockSize: hasher.blockSize,
2346
+ digestSize: hasher.digestSize,
2347
+ };
2348
+ return obj;
2349
+ }
2373
2350
  /**
2374
- * Our & supported networks
2375
- * @return {leofcoin, olivia}
2351
+ * Calculates HMAC hash
2352
+ * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
2353
+ * @param key Key (string, Buffer or TypedArray)
2376
2354
  */
2377
- var networks = {
2378
- leofcoin,
2379
- bitcoin,
2380
- litecoin,
2381
- ethereum
2382
- };
2355
+ function createHMAC(hash, key) {
2356
+ if (!hash || !hash.then) {
2357
+ throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
2358
+ }
2359
+ return hash.then((hasher) => calculateHmac(hasher, key));
2360
+ }
2361
+
2362
+ new Mutex();
2383
2363
 
2384
- const encode$5 = (version, privateKey, compressed) => {
2364
+ new Mutex();
2365
+
2366
+ const encode$1$1 = (version, privateKey, compressed) => {
2385
2367
  if (privateKey.length !== 32)
2386
2368
  throw new TypeError(`Invalid privateKey length: expected 32 got ${privateKey.length}`);
2387
2369
  const uint8Array = new Uint8Array(compressed ? 34 : 33);
@@ -2392,7 +2374,7 @@ const encode$5 = (version, privateKey, compressed) => {
2392
2374
  }
2393
2375
  return base58check.encode(uint8Array);
2394
2376
  };
2395
- const decode$6 = async (wif, version) => {
2377
+ const decode$1$1 = async (wif, version) => {
2396
2378
  wif = (await base58check.decode(wif)).data;
2397
2379
  if (version && wif[0] !== version)
2398
2380
  throw new Error('Invalid network version');
@@ -2407,7 +2389,7 @@ const decode$6 = async (wif, version) => {
2407
2389
  compressed: wif.length === 33 ? false : true
2408
2390
  };
2409
2391
  };
2410
- var wif = { encode: encode$5, decode: decode$6 };
2392
+ var wif = { encode: encode$1$1, decode: decode$1$1 };
2411
2393
 
2412
2394
  const HIGHEST_BIT = 0x80000000;
2413
2395
  const privateKeyVerify = (privateKey) => utils$2.isValidSecretKey(privateKey);
@@ -2528,7 +2510,7 @@ class HdNode {
2528
2510
  else {
2529
2511
  set.push(new Uint8Array(this.publicKey));
2530
2512
  }
2531
- return base58check.encode(index$2(set));
2513
+ return base58check.encode(index$3(set));
2532
2514
  }
2533
2515
  toWIF() {
2534
2516
  if (!this.#privateKey)
@@ -2544,14 +2526,14 @@ class HdNode {
2544
2526
  if (this.isNeutered)
2545
2527
  throw new TypeError('Missing private key for hardened child key');
2546
2528
  // data = 0x00 || ser256(kpar) || ser32(index)
2547
- data = index$2([
2529
+ data = index$3([
2548
2530
  new TextEncoder().encode('0'),
2549
2531
  this.privateKey,
2550
2532
  new TextEncoder().encode(index.toString()),
2551
2533
  ]);
2552
2534
  }
2553
2535
  else {
2554
- data = index$2([
2536
+ data = index$3([
2555
2537
  this.publicKey,
2556
2538
  new TextEncoder().encode(index.toString()),
2557
2539
  ]);
@@ -2611,7 +2593,7 @@ class HdNode {
2611
2593
  let buffer = (await base58check.decode(string)).data;
2612
2594
  // @ts-ignore
2613
2595
  network = network || networks.leofcoin;
2614
- const result = index$1$1(buffer);
2596
+ const result = index$2(buffer);
2615
2597
  const version = Number(new TextDecoder().decode(result[0]));
2616
2598
  const depth = Number(new TextDecoder().decode(result[1]));
2617
2599
  const parentFingerprint = Number(new TextDecoder().decode(result[2]));
@@ -4881,6 +4863,38 @@ class HDWallet {
4881
4863
  }
4882
4864
  }
4883
4865
 
4866
+ const ALPHABET$2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
4867
+ const ALPHABET_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
4868
+ const base32 = base(ALPHABET$2);
4869
+ const base32Hex = base(ALPHABET_HEX);
4870
+ const decode$6 = base32.decode;
4871
+ const decodeHex = base32Hex.decode;
4872
+ const encode$5 = base32.encode;
4873
+ const encodeHex = base32Hex.encode;
4874
+ const isBase32 = (string, hex = false) => {
4875
+ try {
4876
+ if (hex)
4877
+ decodeHex(string);
4878
+ else
4879
+ decode$6(string);
4880
+ return true;
4881
+ }
4882
+ catch (e) {
4883
+ return false;
4884
+ }
4885
+ };
4886
+ const isBase32Hex = (string) => {
4887
+ return isBase32(string, true);
4888
+ };
4889
+ var index$5 = {
4890
+ encode: encode$5,
4891
+ decode: decode$6,
4892
+ encodeHex,
4893
+ decodeHex,
4894
+ isBase32,
4895
+ isBase32Hex,
4896
+ };
4897
+
4884
4898
  hashes.sha256 = (message) => {
4885
4899
  message = Buffer.isBuffer(message) ? new Uint8Array(message) : message;
4886
4900
  return new Uint8Array(createHash$1("sha256").update(message).digest());
@@ -4950,8 +4964,8 @@ class MultiSignature {
4950
4964
  if (!signature)
4951
4965
  throw ReferenceError("signature undefined");
4952
4966
  this.#multiSignature = typedArrayConcat([
4953
- index$3.encode(this.version),
4954
- index$3.encode(this.multiCodec),
4967
+ index$4.encode(this.version),
4968
+ index$4.encode(this.multiCodec),
4955
4969
  signature,
4956
4970
  ]);
4957
4971
  return this.multiSignature;
@@ -4967,10 +4981,10 @@ class MultiSignature {
4967
4981
  if (!this.multiSignature)
4968
4982
  throw ReferenceError("multiSignature undefined");
4969
4983
  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);
4984
+ const version = index$4.decode(buffer);
4985
+ buffer = buffer.subarray(index$4.decode.bytes);
4986
+ const codec = index$4.decode(buffer);
4987
+ buffer = buffer.subarray(index$4.decode.bytes);
4974
4988
  const signature = buffer.subarray(0, buffer.length);
4975
4989
  console.log("[decode] extracted signature length:", signature.length);
4976
4990
  console.log("[decode] extracted signature (hex):", Buffer.from(signature).toString("hex"));
@@ -4998,16 +5012,16 @@ class MultiSignature {
4998
5012
  return this.decode(base58$1.decode(string));
4999
5013
  }
5000
5014
  toBs32() {
5001
- return index$4.encode(this.multiSignature);
5015
+ return index$5.encode(this.multiSignature);
5002
5016
  }
5003
5017
  fromBs32(string) {
5004
- return this.decode(index$4.decode(string));
5018
+ return this.decode(index$5.decode(string));
5005
5019
  }
5006
5020
  toBs32Hex() {
5007
- return index$4.encodeHex(this.multiSignature);
5021
+ return index$5.encodeHex(this.multiSignature);
5008
5022
  }
5009
5023
  fromBs32Hex(string) {
5010
- return this.decode(index$4.decodeHex(string));
5024
+ return this.decode(index$5.decodeHex(string));
5011
5025
  }
5012
5026
  toBs58Hex() {
5013
5027
  return base58$1.encodeHex(this.multiSignature);
@@ -5038,11 +5052,11 @@ var encrypt = async (password, data, version = new TextEncoder().encode('1')) =>
5038
5052
  name: 'AES-GCM',
5039
5053
  iv
5040
5054
  }, key, new TextEncoder().encode(data));
5041
- return index$2([version, salt, iv, new Uint8Array(encrypted)]);
5055
+ return index$3([version, salt, iv, new Uint8Array(encrypted)]);
5042
5056
  };
5043
5057
 
5044
5058
  var decrypt = async (password, concatecated) => {
5045
- const [version, salt, iv, cipher] = index$1$1(concatecated);
5059
+ const [version, salt, iv, cipher] = index$2(concatecated);
5046
5060
  let iterations;
5047
5061
  if (new TextDecoder().decode(version) === '1') {
5048
5062
  iterations = 250000;
@@ -5062,7 +5076,7 @@ class MultiHDNode extends HDWallet {
5062
5076
  super(network, hdnode);
5063
5077
  }
5064
5078
  get id() {
5065
- return base58check.encode(index$2([
5079
+ return base58check.encode(index$3([
5066
5080
  new TextEncoder().encode(this.version.toString()),
5067
5081
  this.account(0).hdnode.neutered.publicKey
5068
5082
  ]));
@@ -5072,8 +5086,8 @@ class MultiHDNode extends HDWallet {
5072
5086
  }
5073
5087
  async fromId(id) {
5074
5088
  let buffer = (await base58check.decode(id)).data;
5075
- index$3.decode(buffer);
5076
- buffer = buffer.slice(index$3.decode.bytes);
5089
+ index$4.decode(buffer);
5090
+ buffer = buffer.slice(index$4.decode.bytes);
5077
5091
  this.fromPublicKey(buffer, null, this.networkName);
5078
5092
  }
5079
5093
  async import(password, encrypted) {
@@ -5095,7 +5109,7 @@ class MultiHDNode extends HDWallet {
5095
5109
  this.locked = false;
5096
5110
  }
5097
5111
  fromMultiWif(string) {
5098
- const { version, codec, privateKey } = index$5.decode(string);
5112
+ const { version, codec, privateKey } = index$1$1.decode(string);
5099
5113
  this.network = Object.values(networks).reduce((p, c) => {
5100
5114
  if (c.multiCodec === codec)
5101
5115
  return c;
@@ -5109,7 +5123,7 @@ class MultiHDNode extends HDWallet {
5109
5123
  return this.fromPrivateKey(privateKey, undefined, this.network);
5110
5124
  }
5111
5125
  toMultiWif() {
5112
- return index$5.encode(this.network.version, this.network.multiCodec, this.privateKey);
5126
+ return index$1$1.encode(this.network.version, this.network.multiCodec, this.privateKey);
5113
5127
  }
5114
5128
  sign(hash) {
5115
5129
  return new MultiSignature(this.version, this.network.multiCodec)
@@ -5156,7 +5170,7 @@ class MultiWallet extends MultiHDNode {
5156
5170
  super(network, hdnode);
5157
5171
  }
5158
5172
  get id() {
5159
- return base58check.encode(index$2([
5173
+ return base58check.encode(index$3([
5160
5174
  new TextEncoder().encode(this.version.toString()),
5161
5175
  this.account(0).hdnode.neutered.publicKey,
5162
5176
  ]));
@@ -8300,6 +8314,7 @@ var qrcode = /*@__PURE__*/getDefaultExportFromCjs(browserExports);
8300
8314
 
8301
8315
  class Identity {
8302
8316
  #wallet;
8317
+ #accountWallets = new Map();
8303
8318
  network;
8304
8319
  id;
8305
8320
  selectedAccount;
@@ -8337,7 +8352,7 @@ class Identity {
8337
8352
  this.selectedAccount = new TextDecoder().decode(selected);
8338
8353
  }
8339
8354
  else {
8340
- const importee = await import(/* webpackChunkName: "generate-account" */ './index-D6qd-AUn-cJS9xh8w.js');
8355
+ const importee = await import(/* webpackChunkName: "generate-account" */ './index-B91mcwxm-D4wHXLVh.js');
8341
8356
  const { identity, accounts } = await importee.default(password, this.network);
8342
8357
  await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
8343
8358
  await globalThis.walletStore.put('version', String(1));
@@ -8351,13 +8366,36 @@ class Identity {
8351
8366
  this.#wallet = new MultiWallet(this.network);
8352
8367
  const multiWIF = await decrypt(password, base58$1.decode(identity.multiWIF));
8353
8368
  await this.#wallet.fromMultiWif(multiWIF);
8369
+ await this.#loadAccountWallets();
8370
+ }
8371
+ async #loadAccountWallets() {
8372
+ this.#accountWallets.clear();
8373
+ const accounts = await this.getAccounts();
8374
+ for (const [index, [, externalAddress, internalAddress]] of accounts.entries()) {
8375
+ const account = this.#wallet.account(index + 1);
8376
+ const external = (await account.external(1));
8377
+ const internal = (await account.internal(1));
8378
+ if ((await external.address) !== externalAddress || (await internal.address) !== internalAddress) {
8379
+ throw new Error(`stored account ${index + 1} does not match this identity`);
8380
+ }
8381
+ this.#accountWallets.set(externalAddress, external);
8382
+ this.#accountWallets.set(internalAddress, internal);
8383
+ }
8384
+ if (!this.#accountWallets.has(this.selectedAccount)) {
8385
+ throw new Error(`selected account ${this.selectedAccount} is not part of this identity`);
8386
+ }
8354
8387
  }
8355
8388
  selectAccount(account) {
8389
+ if (!this.#accountWallets.has(account))
8390
+ throw new Error(`unknown identity account ${account}`);
8356
8391
  this.selectedAccount = account;
8357
8392
  return walletStore.put('selected-account', account);
8358
8393
  }
8359
8394
  sign(hash) {
8360
- return this.#wallet.sign(hash.subarray(0, 32));
8395
+ const wallet = this.#accountWallets.get(this.selectedAccount);
8396
+ if (!wallet)
8397
+ throw new Error(`no signer available for selected account ${this.selectedAccount}`);
8398
+ return wallet.sign(hash.subarray(0, 32));
8361
8399
  }
8362
8400
  lock(password) {
8363
8401
  this.#wallet.lock(password);
@@ -8580,7 +8618,7 @@ var isHex = string => /^[A-F0-9]+$/i.test(
8580
8618
  string
8581
8619
  );
8582
8620
 
8583
- /*! pako 2.1.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
8621
+ /*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */
8584
8622
  // (C) 1995-2013 Jean-loup Gailly and Mark Adler
8585
8623
  // (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
8586
8624
  //
@@ -10002,7 +10040,7 @@ const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = tr
10002
10040
 
10003
10041
  const {
10004
10042
  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,
10043
+ 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
10044
  Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1,
10007
10045
  Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1,
10008
10046
  Z_UNKNOWN,
@@ -10101,11 +10139,35 @@ const slide_hash = (s) => {
10101
10139
  };
10102
10140
 
10103
10141
  /* 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;
10142
+ let HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask;
10143
+
10144
+
10145
+ /* ===========================================================================
10146
+ * Insert string str in the dictionary and set match_head to the previous head
10147
+ * of the hash chain (the most recent string with same hash key). Return
10148
+ * the previous length of the hash chain.
10149
+ * IN assertion: all calls to INSERT_STRING are made with consecutive input
10150
+ * characters and the first MIN_MATCH bytes of str are valid (except for
10151
+ * the last MIN_MATCH-1 bytes of the input file).
10152
+ */
10153
+ const INSERT_STRING = (s, str) => {
10154
+ let h;
10155
+ if (s.legacy_hash) {
10156
+ /* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */
10157
+ h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]);
10158
+ } else {
10159
+ // ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash
10160
+ // restores classic zlib hash). Faster, with fewer collisions.
10161
+ const w = s.window;
10162
+ // Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in
10163
+ // `(value * 66521 + 66521) >> 16` exactly.
10164
+ const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24);
10165
+ h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask;
10166
+ }
10167
+ const hash_head = s.prev[str & s.w_mask] = s.head[h];
10168
+ s.head[h] = str;
10169
+ return hash_head;
10170
+ };
10109
10171
 
10110
10172
 
10111
10173
  /* =========================================================================
@@ -10379,7 +10441,20 @@ const fill_window = (s) => {
10379
10441
  s.lookahead += n;
10380
10442
 
10381
10443
  /* Initialize the hash value now that we have some input: */
10382
- if (s.lookahead + s.insert >= MIN_MATCH) {
10444
+ if (!s.legacy_hash) {
10445
+ /* The 4-byte hash reads one extra byte, so it needs one more available. */
10446
+ if (s.lookahead + s.insert > MIN_MATCH) {
10447
+ str = s.strstart - s.insert;
10448
+ while (s.insert) {
10449
+ INSERT_STRING(s, str);
10450
+ str++;
10451
+ s.insert--;
10452
+ if (s.lookahead + s.insert <= MIN_MATCH) {
10453
+ break;
10454
+ }
10455
+ }
10456
+ }
10457
+ } else if (s.lookahead + s.insert >= MIN_MATCH) {
10383
10458
  str = s.strstart - s.insert;
10384
10459
  s.ins_h = s.window[str];
10385
10460
 
@@ -10389,11 +10464,7 @@ const fill_window = (s) => {
10389
10464
  // Call update_hash() MIN_MATCH-3 more times
10390
10465
  //#endif
10391
10466
  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;
10467
+ INSERT_STRING(s, str);
10397
10468
  str++;
10398
10469
  s.insert--;
10399
10470
  if (s.lookahead + s.insert < MIN_MATCH) {
@@ -10691,11 +10762,7 @@ const deflate_fast = (s, flush) => {
10691
10762
  */
10692
10763
  hash_head = 0/*NIL*/;
10693
10764
  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
- /***/
10765
+ hash_head = INSERT_STRING(s, s.strstart);
10699
10766
  }
10700
10767
 
10701
10768
  /* Find the longest match, discarding those <= prev_length.
@@ -10725,11 +10792,7 @@ const deflate_fast = (s, flush) => {
10725
10792
  s.match_length--; /* string at strstart already in table */
10726
10793
  do {
10727
10794
  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
- /***/
10795
+ hash_head = INSERT_STRING(s, s.strstart);
10733
10796
  /* strstart never exceeds WSIZE-MAX_MATCH, so there are
10734
10797
  * always MIN_MATCH bytes ahead.
10735
10798
  */
@@ -10739,16 +10802,18 @@ const deflate_fast = (s, flush) => {
10739
10802
  {
10740
10803
  s.strstart += s.match_length;
10741
10804
  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]);
10805
+ if (s.legacy_hash) {
10806
+ s.ins_h = s.window[s.strstart];
10807
+ /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */
10808
+ s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]);
10745
10809
 
10746
10810
  //#if MIN_MATCH != 3
10747
10811
  // Call UPDATE_HASH() MIN_MATCH-3 more times
10748
10812
  //#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
- */
10813
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
10814
+ * matter since it will be recomputed at next deflate call.
10815
+ */
10816
+ }
10752
10817
  }
10753
10818
  } else {
10754
10819
  /* No match, output a literal byte */
@@ -10821,11 +10886,7 @@ const deflate_slow = (s, flush) => {
10821
10886
  */
10822
10887
  hash_head = 0/*NIL*/;
10823
10888
  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
- /***/
10889
+ hash_head = INSERT_STRING(s, s.strstart);
10829
10890
  }
10830
10891
 
10831
10892
  /* Find the longest match, discarding those <= prev_length.
@@ -10873,11 +10934,7 @@ const deflate_slow = (s, flush) => {
10873
10934
  s.prev_length -= 2;
10874
10935
  do {
10875
10936
  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
- /***/
10937
+ hash_head = INSERT_STRING(s, s.strstart);
10881
10938
  }
10882
10939
  } while (--s.prev_length !== 0);
10883
10940
  s.match_available = 0;
@@ -11202,6 +11259,7 @@ function DeflateState() {
11202
11259
  this.head = null; /* Heads of the hash chains or NIL. */
11203
11260
 
11204
11261
  this.ins_h = 0; /* hash index of string to be inserted */
11262
+ this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */
11205
11263
  this.hash_size = 0; /* number of elements in hash table */
11206
11264
  this.hash_bits = 0; /* log2(hash_size) */
11207
11265
  this.hash_mask = 0; /* hash_size-1 */
@@ -11424,7 +11482,7 @@ const deflateSetHeader = (strm, head) => {
11424
11482
  };
11425
11483
 
11426
11484
 
11427
- const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
11485
+ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => {
11428
11486
 
11429
11487
  if (!strm) { // === Z_NULL
11430
11488
  return Z_STREAM_ERROR$2;
@@ -11470,7 +11528,13 @@ const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy) => {
11470
11528
  s.w_size = 1 << s.w_bits;
11471
11529
  s.w_mask = s.w_size - 1;
11472
11530
 
11531
+ s.legacy_hash = legacyHash ? 1 : 0;
11532
+
11473
11533
  s.hash_bits = memLevel + 7;
11534
+ /* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */
11535
+ if (!s.legacy_hash && s.hash_bits < 15) {
11536
+ s.hash_bits = 15;
11537
+ }
11474
11538
  s.hash_size = 1 << s.hash_bits;
11475
11539
  s.hash_mask = s.hash_size - 1;
11476
11540
  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
@@ -11562,7 +11626,7 @@ const deflate$2 = (strm, flush) => {
11562
11626
  if (!strm.output ||
11563
11627
  (strm.avail_in !== 0 && !strm.input) ||
11564
11628
  (s.status === FINISH_STATE && flush !== Z_FINISH$3)) {
11565
- return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$1 : Z_STREAM_ERROR$2);
11629
+ return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2);
11566
11630
  }
11567
11631
 
11568
11632
  const old_flush = s.last_flush;
@@ -11588,12 +11652,12 @@ const deflate$2 = (strm, flush) => {
11588
11652
  */
11589
11653
  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&
11590
11654
  flush !== Z_FINISH$3) {
11591
- return err(strm, Z_BUF_ERROR$1);
11655
+ return err(strm, Z_BUF_ERROR$2);
11592
11656
  }
11593
11657
 
11594
11658
  /* User must not provide more input after the first FINISH: */
11595
11659
  if (s.status === FINISH_STATE && strm.avail_in !== 0) {
11596
- return err(strm, Z_BUF_ERROR$1);
11660
+ return err(strm, Z_BUF_ERROR$2);
11597
11661
  }
11598
11662
 
11599
11663
  /* Write the header */
@@ -11974,12 +12038,7 @@ const deflateSetDictionary = (strm, dictionary) => {
11974
12038
  let str = s.strstart;
11975
12039
  let n = s.lookahead - (MIN_MATCH - 1);
11976
12040
  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;
12041
+ INSERT_STRING(s, str);
11983
12042
  str++;
11984
12043
  } while (--n);
11985
12044
  s.strstart = str;
@@ -12103,7 +12162,7 @@ const _utf8len = new Uint8Array(256);
12103
12162
  for (let q = 0; q < 256; q++) {
12104
12163
  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);
12105
12164
  }
12106
- _utf8len[254] = _utf8len[254] = 1; // Invalid sequence start
12165
+ _utf8len[254] = _utf8len[255] = 1; // Invalid sequence start
12107
12166
 
12108
12167
 
12109
12168
  // convert string to array (typed, when possible)
@@ -12324,6 +12383,15 @@ const {
12324
12383
 
12325
12384
  /* ===========================================================================*/
12326
12385
 
12386
+ const defaultOptions$1 = {
12387
+ level: Z_DEFAULT_COMPRESSION,
12388
+ method: Z_DEFLATED$1,
12389
+ chunkSize: 16384,
12390
+ windowBits: 15,
12391
+ memLevel: 8,
12392
+ strategy: Z_DEFAULT_STRATEGY,
12393
+ legacyHash: true
12394
+ };
12327
12395
 
12328
12396
  /**
12329
12397
  * class Deflate
@@ -12379,6 +12447,10 @@ const {
12379
12447
  * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)
12380
12448
  * for more information on these.
12381
12449
  *
12450
+ * - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches
12451
+ * canonical zlib output byte-for-byte. Set to `false` to use the faster
12452
+ * ANZAC++ hash, which matches recent (chromium) node.js output instead.
12453
+ *
12382
12454
  * Additional options, for internal needs:
12383
12455
  *
12384
12456
  * - `chunkSize` - size of generated data chunks (16K by default)
@@ -12411,14 +12483,7 @@ const {
12411
12483
  * ```
12412
12484
  **/
12413
12485
  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 || {});
12486
+ this.options = common.assign({}, defaultOptions$1, options || {});
12422
12487
 
12423
12488
  let opt = this.options;
12424
12489
 
@@ -12444,7 +12509,8 @@ function Deflate$1(options) {
12444
12509
  opt.method,
12445
12510
  opt.windowBits,
12446
12511
  opt.memLevel,
12447
- opt.strategy
12512
+ opt.strategy,
12513
+ opt.legacyHash
12448
12514
  );
12449
12515
 
12450
12516
  if (status !== Z_OK$2) {
@@ -13064,7 +13130,7 @@ const lbase = new Uint16Array([ /* Length codes 257..285 base */
13064
13130
 
13065
13131
  const lext = new Uint8Array([ /* Length codes 257..285 extra */
13066
13132
  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
13133
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 75
13068
13134
  ]);
13069
13135
 
13070
13136
  const dbase = new Uint16Array([ /* Distance codes 0..29 base */
@@ -13401,7 +13467,7 @@ const DISTS = 2;
13401
13467
 
13402
13468
  const {
13403
13469
  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,
13470
+ 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
13471
  Z_DEFLATED
13406
13472
  } = constants$2;
13407
13473
 
@@ -13711,11 +13777,14 @@ const updatewindow = (strm, src, end, copy) => {
13711
13777
 
13712
13778
  /* if it hasn't been done already, allocate space for the window */
13713
13779
  if (state.window === null) {
13780
+ state.window = new Uint8Array(1 << state.wbits);
13781
+ }
13782
+
13783
+ /* if window not in use yet, initialize */
13784
+ if (state.wsize === 0) {
13714
13785
  state.wsize = 1 << state.wbits;
13715
13786
  state.wnext = 0;
13716
13787
  state.whave = 0;
13717
-
13718
- state.window = new Uint8Array(state.wsize);
13719
13788
  }
13720
13789
 
13721
13790
  /* copy state->wsize or less output bytes into the circular window */
@@ -14841,7 +14910,7 @@ const inflate$2 = (strm, flush) => {
14841
14910
  (state.mode === TYPE ? 128 : 0) +
14842
14911
  (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
14843
14912
  if (((_in === 0 && _out === 0) || flush === Z_FINISH$1) && ret === Z_OK$1) {
14844
- ret = Z_BUF_ERROR;
14913
+ ret = Z_BUF_ERROR$1;
14845
14914
  }
14846
14915
  return ret;
14847
14916
  };
@@ -15013,11 +15082,16 @@ const toString$2 = Object.prototype.toString;
15013
15082
 
15014
15083
  const {
15015
15084
  Z_NO_FLUSH, Z_FINISH,
15016
- Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR
15085
+ Z_OK, Z_STREAM_END, Z_NEED_DICT, Z_STREAM_ERROR, Z_DATA_ERROR, Z_MEM_ERROR, Z_BUF_ERROR
15017
15086
  } = constants$2;
15018
15087
 
15019
15088
  /* ===========================================================================*/
15020
15089
 
15090
+ const defaultOptions$2 = {
15091
+ chunkSize: 1024 * 64,
15092
+ windowBits: 15,
15093
+ to: ''
15094
+ };
15021
15095
 
15022
15096
  /**
15023
15097
  * class Inflate
@@ -15097,11 +15171,7 @@ const {
15097
15171
  * ```
15098
15172
  **/
15099
15173
  function Inflate$1(options) {
15100
- this.options = common.assign({
15101
- chunkSize: 1024 * 64,
15102
- windowBits: 15,
15103
- to: ''
15104
- }, options || {});
15174
+ this.options = common.assign({}, defaultOptions$2, options || {});
15105
15175
 
15106
15176
  const opt = this.options;
15107
15177
 
@@ -15232,11 +15302,19 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15232
15302
  }
15233
15303
  }
15234
15304
 
15235
- // Skip snyc markers if more data follows and not raw mode
15305
+ // Only the gzip format defines concatenated members (RFC 1952: a gzip file
15306
+ // is "a series of members"). A zlib stream (RFC 1950) ends after its
15307
+ // ADLER32, and a raw DEFLATE stream (RFC 1951) ends after its final block -
15308
+ // neither format allows anything to follow, so bytes after the end are not
15309
+ // ours to interpret and must be left in the input. Restart decoding only
15310
+ // for a gzip member: `state.flags` is non-zero only once a gzip header has
15311
+ // actually been decoded (it stays 0 for a zlib member, even when the format
15312
+ // was auto-detected and the gzip bit of `wrap` is set). A trailing zero
15313
+ // byte is padding, not the start of a member (no member can begin with 0).
15236
15314
  while (strm.avail_in > 0 &&
15237
15315
  status === Z_STREAM_END &&
15238
- strm.state.wrap > 0 &&
15239
- data[strm.next_in] !== 0)
15316
+ (strm.state.wrap & 2) && strm.state.flags !== 0 &&
15317
+ strm.input[strm.next_in] !== 0)
15240
15318
  {
15241
15319
  inflate_1$2.inflateReset(strm);
15242
15320
  status = inflate_1$2.inflate(strm, _flush_mode);
@@ -15257,7 +15335,9 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15257
15335
  last_avail_out = strm.avail_out;
15258
15336
 
15259
15337
  if (strm.next_out) {
15260
- if (strm.avail_out === 0 || status === Z_STREAM_END) {
15338
+ // Flush output if buffer is full, stream ended, or an explicit flush was
15339
+ // requested (e.g. Z_SYNC_FLUSH) - to push out the tail, same as node's zlib.
15340
+ if (strm.avail_out === 0 || status === Z_STREAM_END || _flush_mode > 0) {
15261
15341
 
15262
15342
  if (this.options.to === 'string') {
15263
15343
 
@@ -15275,12 +15355,22 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15275
15355
 
15276
15356
  } else {
15277
15357
  this.onData(strm.output.length === strm.next_out ? strm.output : strm.output.subarray(0, strm.next_out));
15358
+
15359
+ // Force a fresh output buffer on next iteration / next push, so the
15360
+ // already emitted tail is not sent again.
15361
+ strm.avail_out = 0;
15362
+ strm.next_out = 0;
15278
15363
  }
15279
15364
  }
15280
15365
  }
15281
15366
 
15282
- // Must repeat iteration if out buffer is full
15283
- if (status === Z_OK && last_avail_out === 0) continue;
15367
+ // A full output buffer means there may be more to produce - allocate a new
15368
+ // one and call inflate again. The status depends on the flush mode: with
15369
+ // Z_NO_FLUSH a full buffer is reported as Z_OK, but with Z_FINISH the same
15370
+ // situation is reported as Z_BUF_ERROR ("could not make progress now",
15371
+ // non-fatal) even though output is still pending. Both must continue; the
15372
+ // distinction that matters is purely "was the output buffer exhausted".
15373
+ if ((status === Z_OK || status === Z_BUF_ERROR) && last_avail_out === 0) continue;
15284
15374
 
15285
15375
  // Finalize if end of stream reached.
15286
15376
  if (status === Z_STREAM_END) {
@@ -15290,7 +15380,23 @@ Inflate$1.prototype.push = function (data, flush_mode) {
15290
15380
  return true;
15291
15381
  }
15292
15382
 
15293
- if (strm.avail_in === 0) break;
15383
+ if (strm.avail_in === 0) {
15384
+ // Input is exhausted. If the caller declared this the end of the stream
15385
+ // (Z_FINISH) but we never saw Z_STREAM_END, the compressed data ended
15386
+ // before its terminating marker - i.e. it is truncated/incomplete. That
15387
+ // is an error: returning the partial output as success would be
15388
+ // indistinguishable from a complete decode, hiding the data loss. Report
15389
+ // it via Z_BUF_ERROR. (Reached only when the output buffer still had room
15390
+ // - a full buffer is handled by the `continue` above - so this genuinely
15391
+ // means "ran out of input", not "ran out of output".)
15392
+ if (_flush_mode === Z_FINISH) {
15393
+ status = inflate_1$2.inflateEnd(this.strm);
15394
+ this.onEnd(status === Z_OK ? Z_BUF_ERROR : status);
15395
+ this.ended = true;
15396
+ return false;
15397
+ }
15398
+ break;
15399
+ }
15294
15400
  }
15295
15401
 
15296
15402
  return true;
@@ -15376,7 +15482,7 @@ Inflate$1.prototype.onEnd = function (status) {
15376
15482
  function inflate$1(input, options) {
15377
15483
  const inflator = new Inflate$1(options);
15378
15484
 
15379
- inflator.push(input);
15485
+ inflator.push(input, true);
15380
15486
 
15381
15487
  // That will never happens, if you don't cheat with options :)
15382
15488
  if (inflator.err) throw inflator.msg || messages[inflator.err];
@@ -15505,7 +15611,7 @@ const encode = (proto, input, compress) => {
15505
15611
  throw new Error(`minimumLength for ${token.key} is set to ${token.minimumLength} but got ${data.length}`);
15506
15612
  set.push(toType(data !== undefined ? data : token.defaultValue));
15507
15613
  }
15508
- return compress ? pako.deflate(index$2(set)) : index$2(set);
15614
+ return compress ? pako.deflate(index$3(set)) : index$3(set);
15509
15615
  };
15510
15616
 
15511
15617
  const ALPHABET$1 = '0123456789ABCDEF';
@@ -15544,7 +15650,7 @@ const toHex = (bytes) => bytes.reduce((string, byte) => string + byte.toString(1
15544
15650
  const fromArrayLike = (array) => Uint8Array.from(array);
15545
15651
  const toBase58 = (uint8Array) => base58$1.encode(uint8Array);
15546
15652
  const fromBase58 = (string) => base58$1.decode(string);
15547
- const toBase32 = (uint8Array) => index$4.encode(uint8Array);
15653
+ const toBase32 = (uint8Array) => index$5.encode(uint8Array);
15548
15654
  var index$1 = {
15549
15655
  toString: toString$1};
15550
15656
 
@@ -15553,7 +15659,7 @@ const decoder = new TextDecoder();
15553
15659
  const decode = (proto, uint8Array, compressed) => {
15554
15660
  if (compressed)
15555
15661
  uint8Array = pako.inflate(uint8Array);
15556
- let deconcated = index$1$1(uint8Array);
15662
+ let deconcated = index$2(uint8Array);
15557
15663
  const output = {};
15558
15664
  const tokens = getTokens(proto);
15559
15665
  if (tokens.length !== deconcated.length)
@@ -15644,13 +15750,13 @@ class BasicInterface {
15644
15750
  this.fromBs58(value);
15645
15751
  }
15646
15752
  catch {
15647
- if (index$4.isBase32(value))
15753
+ if (index$5.isBase32(value))
15648
15754
  this.fromBs32(value);
15649
15755
  else
15650
15756
  throw new Error('Invalid base58/base32 input');
15651
15757
  }
15652
15758
  }
15653
- else if (index$4.isBase32(value))
15759
+ else if (index$5.isBase32(value))
15654
15760
  this.fromBs32(value);
15655
15761
  else
15656
15762
  this.fromString(value);
@@ -15718,13 +15824,13 @@ class BasicInterface {
15718
15824
  return isHex(string);
15719
15825
  }
15720
15826
  isBase32(string) {
15721
- return index$4.isBase32(string);
15827
+ return index$5.isBase32(string);
15722
15828
  }
15723
15829
  isBase58(string) {
15724
15830
  return base58$1.isBase58(string);
15725
15831
  }
15726
15832
  fromBs32(encoded) {
15727
- return this.decode(index$4.decode(encoded));
15833
+ return this.decode(index$5.decode(encoded));
15728
15834
  }
15729
15835
  fromBs58(encoded) {
15730
15836
  return this.decode(fromBase58(encoded));
@@ -16052,7 +16158,7 @@ let Codec$1 = class Codec extends BasicInterface {
16052
16158
  super();
16053
16159
  if (buffer) {
16054
16160
  if (buffer instanceof Uint8Array) {
16055
- const codec = index$3.decode(buffer);
16161
+ const codec = index$4.decode(buffer);
16056
16162
  const name = this.getCodecName(codec);
16057
16163
  if (name) {
16058
16164
  this.name = name;
@@ -16064,7 +16170,7 @@ let Codec$1 = class Codec extends BasicInterface {
16064
16170
  }
16065
16171
  }
16066
16172
  else if (buffer instanceof ArrayBuffer) {
16067
- const codec = index$3.decode(buffer);
16173
+ const codec = index$4.decode(buffer);
16068
16174
  const name = this.getCodecName(codec);
16069
16175
  if (name) {
16070
16176
  this.name = name;
@@ -16093,7 +16199,7 @@ let Codec$1 = class Codec extends BasicInterface {
16093
16199
  }
16094
16200
  }
16095
16201
  fromEncoded(encoded) {
16096
- const codec = index$3.decode(encoded);
16202
+ const codec = index$4.decode(encoded);
16097
16203
  const name = this.getCodecName(codec);
16098
16204
  this.name = name;
16099
16205
  this.encoded = encoded;
@@ -16112,7 +16218,7 @@ let Codec$1 = class Codec extends BasicInterface {
16112
16218
  this.name = this.getCodecName(codec);
16113
16219
  this.hashAlg = this.getHashAlg(this.name);
16114
16220
  this.codec = this.getCodec(this.name);
16115
- this.codecBuffer = index$3.encode(this.codec);
16221
+ this.codecBuffer = index$4.encode(this.codec);
16116
16222
  this.decoded = {
16117
16223
  name: this.name,
16118
16224
  hashAlg: this.hashAlg,
@@ -16125,7 +16231,7 @@ let Codec$1 = class Codec extends BasicInterface {
16125
16231
  this.name = name;
16126
16232
  this.codec = codec;
16127
16233
  this.hashAlg = this.getHashAlg(name);
16128
- this.codecBuffer = index$3.encode(this.codec);
16234
+ this.codecBuffer = index$4.encode(this.codec);
16129
16235
  this.decoded = {
16130
16236
  name: this.name,
16131
16237
  hashAlg: this.hashAlg,
@@ -16135,13 +16241,13 @@ let Codec$1 = class Codec extends BasicInterface {
16135
16241
  }
16136
16242
  decode(encoded) {
16137
16243
  encoded = encoded || this.encoded;
16138
- const codec = index$3.decode(encoded);
16244
+ const codec = index$4.decode(encoded);
16139
16245
  this.fromCodec(codec);
16140
16246
  return this.decoded;
16141
16247
  }
16142
16248
  encode(codec) {
16143
16249
  codec = codec || this.codec;
16144
- this.encoded = index$3.encode(codec);
16250
+ this.encoded = index$4.encode(codec);
16145
16251
  return this.encoded;
16146
16252
  }
16147
16253
  };
@@ -16212,7 +16318,7 @@ class CodecHash extends BasicInterface {
16212
16318
  return uint8Array;
16213
16319
  }
16214
16320
  get length() {
16215
- return index$3.encode(this.size);
16321
+ return index$4.encode(this.size);
16216
16322
  }
16217
16323
  get buffer() {
16218
16324
  return this.encoded;
@@ -16246,7 +16352,7 @@ class CodecHash extends BasicInterface {
16246
16352
  if (!(buffer instanceof Uint8Array)) {
16247
16353
  throw new Error('CodecHash only supports Uint8Array input');
16248
16354
  }
16249
- const codec = index$3.decode(buffer);
16355
+ const codec = index$4.decode(buffer);
16250
16356
  if (this.codecs[codec]) {
16251
16357
  this.decode(buffer);
16252
16358
  }
@@ -16256,12 +16362,12 @@ class CodecHash extends BasicInterface {
16256
16362
  }
16257
16363
  decode(buffer) {
16258
16364
  this.encoded = buffer;
16259
- const codec = index$3.decode(buffer);
16365
+ const codec = index$4.decode(buffer);
16260
16366
  this.discoCodec = new Codec$1(codec, this.codecs);
16261
16367
  // 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);
16368
+ buffer = buffer.slice(index$4.decode.bytes);
16369
+ this.size = index$4.decode(buffer);
16370
+ this.digest = buffer.slice(index$4.decode.bytes);
16265
16371
  if (this.digest.length !== this.size) {
16266
16372
  throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
16267
16373
  }
@@ -16871,6 +16977,7 @@ class Peernet {
16871
16977
  client;
16872
16978
  network;
16873
16979
  stars;
16980
+ transport;
16874
16981
  networkVersion;
16875
16982
  bw;
16876
16983
  hasDaemon = false;
@@ -16892,6 +16999,7 @@ class Peernet {
16892
16999
  * @param {String} options.root - path to root directory
16893
17000
  * @param {String} options.version - path to root directory
16894
17001
  * @param {String} options.storePrefix - prefix for datatores (lfc)
17002
+ * @param {Object} options.transport - transport selection and fallback options passed to @netpeer/swarm
16895
17003
  *
16896
17004
  * @return {Promise} instance of Peernet
16897
17005
  *
@@ -16905,6 +17013,7 @@ class Peernet {
16905
17013
  this.network = options.network || 'leofcoin';
16906
17014
  this.autoStart = options.autoStart === undefined ? true : options.autoStart;
16907
17015
  this.stars = options.stars;
17016
+ this.transport = options.transport;
16908
17017
  this.version = options.version;
16909
17018
  const parts = this.network.split(':');
16910
17019
  this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
@@ -16998,7 +17107,7 @@ class Peernet {
16998
17107
  await getAddress();
16999
17108
  this.storePrefix = options.storePrefix;
17000
17109
  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');
17110
+ const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile } = await import(/* webpackChunkName: "messages" */ './messages-D0Goitr6-BWN8uKkb.js');
17002
17111
  /**
17003
17112
  * proto Object containing protos
17004
17113
  * @type {Object}
@@ -17045,7 +17154,7 @@ class Peernet {
17045
17154
  if (this.#starting || this.#started)
17046
17155
  return;
17047
17156
  this.#starting = true;
17048
- const importee = await import('./client-lPe0SUWx-DwxXCP5p.js');
17157
+ const importee = await import('./client-eYBPUrVq-CukSyZyC.js');
17049
17158
  /**
17050
17159
  * @access public
17051
17160
  * @type {PeernetClient}
@@ -17055,7 +17164,8 @@ class Peernet {
17055
17164
  peerId: this.id,
17056
17165
  networkVersion: this.networkVersion,
17057
17166
  version: this.version,
17058
- stars: this.stars
17167
+ stars: this.stars,
17168
+ transport: this.transport
17059
17169
  });
17060
17170
  this.#started = true;
17061
17171
  this.#starting = false;