@scure/btc-signer 1.8.1 → 2.0.0-beta.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.
Files changed (85) hide show
  1. package/README.md +8 -5
  2. package/_type_test.js +9 -11
  3. package/_type_test.js.map +1 -1
  4. package/index.js +17 -61
  5. package/index.js.map +1 -1
  6. package/musig2.d.ts +2 -2
  7. package/musig2.d.ts.map +1 -1
  8. package/musig2.js +93 -90
  9. package/musig2.js.map +1 -1
  10. package/p2p.d.ts +7 -8
  11. package/p2p.d.ts.map +1 -1
  12. package/p2p.js +32 -38
  13. package/p2p.js.map +1 -1
  14. package/package.json +33 -102
  15. package/payment.js +73 -96
  16. package/payment.js.map +1 -1
  17. package/psbt.d.ts +224 -224
  18. package/psbt.d.ts.map +1 -1
  19. package/psbt.js +58 -63
  20. package/psbt.js.map +1 -1
  21. package/script.d.ts +125 -120
  22. package/script.d.ts.map +1 -1
  23. package/script.js +46 -146
  24. package/script.js.map +1 -1
  25. package/src/_type_test.ts +1 -1
  26. package/src/musig2.ts +43 -50
  27. package/src/p2p.ts +28 -40
  28. package/src/psbt.ts +7 -7
  29. package/src/script.ts +29 -26
  30. package/src/transaction.ts +21 -21
  31. package/src/utils.ts +41 -22
  32. package/transaction.d.ts +22 -28
  33. package/transaction.d.ts.map +1 -1
  34. package/transaction.js +134 -151
  35. package/transaction.js.map +1 -1
  36. package/utils.d.ts +11 -5
  37. package/utils.d.ts.map +1 -1
  38. package/utils.js +60 -62
  39. package/utils.js.map +1 -1
  40. package/utxo.d.ts +45 -45
  41. package/utxo.d.ts.map +1 -1
  42. package/utxo.js +62 -58
  43. package/utxo.js.map +1 -1
  44. package/esm/_type_test.d.ts +0 -2
  45. package/esm/_type_test.d.ts.map +0 -1
  46. package/esm/_type_test.js +0 -57
  47. package/esm/_type_test.js.map +0 -1
  48. package/esm/index.d.ts +0 -22
  49. package/esm/index.d.ts.map +0 -1
  50. package/esm/index.js +0 -22
  51. package/esm/index.js.map +0 -1
  52. package/esm/musig2.d.ts +0 -148
  53. package/esm/musig2.d.ts.map +0 -1
  54. package/esm/musig2.js +0 -404
  55. package/esm/musig2.js.map +0 -1
  56. package/esm/p2p.d.ts +0 -38
  57. package/esm/p2p.d.ts.map +0 -1
  58. package/esm/p2p.js +0 -156
  59. package/esm/p2p.js.map +0 -1
  60. package/esm/package.json +0 -1
  61. package/esm/payment.d.ts +0 -200
  62. package/esm/payment.d.ts.map +0 -1
  63. package/esm/payment.js +0 -697
  64. package/esm/payment.js.map +0 -1
  65. package/esm/psbt.d.ts +0 -820
  66. package/esm/psbt.d.ts.map +0 -1
  67. package/esm/psbt.js +0 -409
  68. package/esm/psbt.js.map +0 -1
  69. package/esm/script.d.ts +0 -170
  70. package/esm/script.d.ts.map +0 -1
  71. package/esm/script.js +0 -356
  72. package/esm/script.js.map +0 -1
  73. package/esm/transaction.d.ts +0 -172
  74. package/esm/transaction.d.ts.map +0 -1
  75. package/esm/transaction.js +0 -1185
  76. package/esm/transaction.js.map +0 -1
  77. package/esm/utils.d.ts +0 -35
  78. package/esm/utils.d.ts.map +0 -1
  79. package/esm/utils.js +0 -118
  80. package/esm/utils.js.map +0 -1
  81. package/esm/utxo.d.ts +0 -198
  82. package/esm/utxo.d.ts.map +0 -1
  83. package/esm/utxo.js +0 -461
  84. package/esm/utxo.js.map +0 -1
  85. package/src/package.json +0 -3
package/README.md CHANGED
@@ -41,8 +41,6 @@ _Check out all web3 utility libraries:_ [ETH](https://github.com/paulmillr/micro
41
41
 
42
42
  > `deno add jsr:@scure/btc-signer`
43
43
 
44
- > `deno doc jsr:@scure/btc-signer` # command-line documentation
45
-
46
44
  We support all major platforms and runtimes.
47
45
  For [Deno](https://deno.land), ensure to use [npm specifier](https://deno.land/manual@v1.28.0/node/npm_specifiers).
48
46
  For React Native, you may need a [polyfill for crypto.getRandomValues](https://github.com/LinusU/react-native-get-random-values).
@@ -89,8 +87,8 @@ BTC has several UTXO types:
89
87
 
90
88
  - P2PK: Legacy, from 2010
91
89
  - P2PKH, P2SH, P2MS: Classic
92
- - P2WPKH, P2WSH: classic, SegWit
93
- - P2TR: Taproot, recommended
90
+ - P2WPKH, P2WSH: SegWit (signature is removed from tx hash calculation)
91
+ - P2TR: Taproot (schnorr signatures instead of ECDSA)
94
92
 
95
93
  For test examples, the usage is as following:
96
94
 
@@ -158,7 +156,11 @@ deepStrictEqual(btc.p2sh(btc.p2wsh(btc.p2pkh(PubKey))), {
158
156
 
159
157
  ### P2WPKH (Witness Public Key Hash)
160
158
 
161
- SegWit V0 version of [P2PKH](#p2pkh-public-key-hash). Basic bech32 address. Can't be wrapped in [P2WSH](#p2wsh-witness-script-hash).
159
+ SegWit V0 version of [P2PKH](#p2pkh-public-key-hash).
160
+ In SegWit, signature is removed from tx hash calculation.
161
+
162
+ Uses bech32 address.
163
+ Can't be wrapped in [P2WSH](#p2wsh-witness-script-hash).
162
164
 
163
165
  ```ts
164
166
  const PubKey = hex.decode('030000000000000000000000000000000000000000000000000000000000000001');
@@ -196,6 +198,7 @@ deepStrictEqual(btc.p2sh(btc.p2pkh(PubKey)), {
196
198
  ### P2WSH (Witness Script Hash)
197
199
 
198
200
  SegWit V0 version of [P2SH](#p2sh-script-hash).
201
+ In SegWit, signature is removed from tx hash calculation.
199
202
 
200
203
  Required tx input fields to make it spendable: `witnessScript`
201
204
 
package/_type_test.js CHANGED
@@ -1,15 +1,13 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const secp256k1_1 = require("@noble/curves/secp256k1");
4
- const base_1 = require("@scure/base");
5
- const btc = require("./index.js");
6
- const privKey1 = base_1.hex.decode('0101010101010101010101010101010101010101010101010101010101010101');
7
- const P1 = secp256k1_1.secp256k1.getPublicKey(privKey1, true);
1
+ import { secp256k1 as secp } from '@noble/curves/secp256k1.js';
2
+ import { hex } from '@scure/base';
3
+ import * as btc from "./index.js";
4
+ const privKey1 = hex.decode('0101010101010101010101010101010101010101010101010101010101010101');
5
+ const P1 = secp.getPublicKey(privKey1, true);
8
6
  const wpkh = btc.p2wpkh(P1);
9
7
  const tx = new btc.Transaction();
10
8
  // Basic input test
11
9
  tx.addInput({
12
- txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
10
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
13
11
  index: 0,
14
12
  ...wpkh,
15
13
  finalScriptSig: Uint8Array.of(),
@@ -23,16 +21,16 @@ tx.updateInput(0, {
23
21
  sequence: 1,
24
22
  });
25
23
  const nonWitnessUtxo = '0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000';
26
- const nonWitnessUtxoB = base_1.hex.decode(nonWitnessUtxo);
24
+ const nonWitnessUtxoB = hex.decode(nonWitnessUtxo);
27
25
  tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxo });
28
26
  tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxoB });
29
27
  tx.addInput({
30
- txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
28
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
31
29
  index: 0,
32
30
  nonWitnessUtxo: nonWitnessUtxo,
33
31
  });
34
32
  tx.addInput({
35
- txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
33
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
36
34
  index: 0,
37
35
  nonWitnessUtxo: nonWitnessUtxoB,
38
36
  });
package/_type_test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"_type_test.js","sourceRoot":"","sources":["src/_type_test.ts"],"names":[],"mappings":";;AAAA,uDAA4D;AAC5D,sCAAkC;AAClC,kCAAkC;AAElC,MAAM,QAAQ,GAAG,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;AAChG,MAAM,EAAE,GAAG,qBAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAEjC,mBAAmB;AACnB,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,GAAG,IAAI;IACP,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE;IAC/B,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,4DAA4D;AAC5D,EAAE,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;IAChB,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,cAAc,GAClB,wXAAwX,CAAC;AAC3X,MAAM,eAAe,GAAG,UAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;AACtD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,cAAc;CAC/B,CAAC,CAAC;AAEH,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,eAAe;CAChC,CAAC,CAAC;AAEH,eAAe;AACf,sBAAsB;AACtB,uBAAuB;AACvB,MAAM;AACN,UAAU;AACV,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/B,cAAc;AACd,uCAAuC;AACvC,qCAAqC;AACrC,cAAc;AACd,mCAAmC;AACnC,iCAAiC;AAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;IACzC,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1C,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"_type_test.js","sourceRoot":"","sources":["src/_type_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAElC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;AAChG,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAEjC,mBAAmB;AACnB,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,GAAG,IAAI;IACP,cAAc,EAAE,UAAU,CAAC,EAAE,EAAE;IAC/B,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,4DAA4D;AAC5D,EAAE,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;IAChB,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,cAAc,GAClB,wXAAwX,CAAC;AAC3X,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;AACtD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,cAAc;CAC/B,CAAC,CAAC;AAEH,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,eAAe;CAChC,CAAC,CAAC;AAEH,eAAe;AACf,sBAAsB;AACtB,uBAAuB;AACvB,MAAM;AACN,UAAU;AACV,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/B,cAAc;AACd,uCAAuC;AACvC,qCAAqC;AACrC,cAAc;AACd,mCAAmC;AACnC,iCAAiC;AAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;IACzC,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1C,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
package/index.js CHANGED
@@ -1,66 +1,22 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._Estimator = exports._cmpBig = exports.SigHash = exports.PSBTCombine = exports.DEFAULT_SEQUENCE = exports.Decimal = exports.bip32Path = exports.TaprootControlBlock = exports._DebugPSBT = exports.WIF = exports.taprootListToTree = exports.sortedMultisig = exports.OutScript = exports.getAddress = exports.combinations = exports.Address = exports._sortPubkeys = exports.utils = exports.selectUTXO = exports.TEST_NETWORK = exports.TAPROOT_UNSPENDABLE_KEY = exports.NETWORK = exports.Transaction = exports.getInputType = exports.ScriptNum = exports.Script = exports.RawWitness = exports.RawTx = exports.OP = exports.MAX_SCRIPT_BYTE_LENGTH = exports.CompactSize = exports.p2wsh = exports.p2wpkh = exports.p2tr_pk = exports.p2tr_ns = exports.p2tr_ms = exports.p2tr = exports.p2sh = exports.p2pkh = exports.p2pk = exports.p2ms = exports.multisig = void 0;
4
1
  /*! scure-btc-signer - MIT License (c) 2022 Paul Miller (paulmillr.com) */
5
- const utils_ts_1 = require("./utils.js");
2
+ import { compareBytes, concatBytes, isBytes, pubSchnorr, randomPrivateKeyBytes, taprootTweakPubkey, } from "./utils.js";
6
3
  // should multisig be exported as classicMultisig?
7
4
  // prettier-ignore
8
- var payment_ts_1 = require("./payment.js");
9
- Object.defineProperty(exports, "multisig", { enumerable: true, get: function () { return payment_ts_1.multisig; } });
10
- Object.defineProperty(exports, "p2ms", { enumerable: true, get: function () { return payment_ts_1.p2ms; } });
11
- Object.defineProperty(exports, "p2pk", { enumerable: true, get: function () { return payment_ts_1.p2pk; } });
12
- Object.defineProperty(exports, "p2pkh", { enumerable: true, get: function () { return payment_ts_1.p2pkh; } });
13
- Object.defineProperty(exports, "p2sh", { enumerable: true, get: function () { return payment_ts_1.p2sh; } });
14
- Object.defineProperty(exports, "p2tr", { enumerable: true, get: function () { return payment_ts_1.p2tr; } });
15
- Object.defineProperty(exports, "p2tr_ms", { enumerable: true, get: function () { return payment_ts_1.p2tr_ms; } });
16
- Object.defineProperty(exports, "p2tr_ns", { enumerable: true, get: function () { return payment_ts_1.p2tr_ns; } });
17
- Object.defineProperty(exports, "p2tr_pk", { enumerable: true, get: function () { return payment_ts_1.p2tr_pk; } });
18
- Object.defineProperty(exports, "p2wpkh", { enumerable: true, get: function () { return payment_ts_1.p2wpkh; } });
19
- Object.defineProperty(exports, "p2wsh", { enumerable: true, get: function () { return payment_ts_1.p2wsh; } });
20
- var script_ts_1 = require("./script.js");
21
- Object.defineProperty(exports, "CompactSize", { enumerable: true, get: function () { return script_ts_1.CompactSize; } });
22
- Object.defineProperty(exports, "MAX_SCRIPT_BYTE_LENGTH", { enumerable: true, get: function () { return script_ts_1.MAX_SCRIPT_BYTE_LENGTH; } });
23
- Object.defineProperty(exports, "OP", { enumerable: true, get: function () { return script_ts_1.OP; } });
24
- Object.defineProperty(exports, "RawTx", { enumerable: true, get: function () { return script_ts_1.RawTx; } });
25
- Object.defineProperty(exports, "RawWitness", { enumerable: true, get: function () { return script_ts_1.RawWitness; } });
26
- Object.defineProperty(exports, "Script", { enumerable: true, get: function () { return script_ts_1.Script; } });
27
- Object.defineProperty(exports, "ScriptNum", { enumerable: true, get: function () { return script_ts_1.ScriptNum; } });
28
- var transaction_ts_1 = require("./transaction.js");
29
- Object.defineProperty(exports, "getInputType", { enumerable: true, get: function () { return transaction_ts_1.getInputType; } });
30
- Object.defineProperty(exports, "Transaction", { enumerable: true, get: function () { return transaction_ts_1.Transaction; } });
31
- var utils_ts_2 = require("./utils.js");
32
- Object.defineProperty(exports, "NETWORK", { enumerable: true, get: function () { return utils_ts_2.NETWORK; } });
33
- Object.defineProperty(exports, "TAPROOT_UNSPENDABLE_KEY", { enumerable: true, get: function () { return utils_ts_2.TAPROOT_UNSPENDABLE_KEY; } });
34
- Object.defineProperty(exports, "TEST_NETWORK", { enumerable: true, get: function () { return utils_ts_2.TEST_NETWORK; } });
35
- var utxo_ts_1 = require("./utxo.js");
36
- Object.defineProperty(exports, "selectUTXO", { enumerable: true, get: function () { return utxo_ts_1.selectUTXO; } });
37
- exports.utils = {
38
- isBytes: utils_ts_1.isBytes,
39
- concatBytes: utils_ts_1.concatBytes,
40
- compareBytes: utils_ts_1.compareBytes,
41
- pubSchnorr: utils_ts_1.pubSchnorr,
42
- randomPrivateKeyBytes: utils_ts_1.randomPrivateKeyBytes,
43
- taprootTweakPubkey: utils_ts_1.taprootTweakPubkey,
5
+ export { multisig, p2ms, p2pk, p2pkh, p2sh, p2tr, p2tr_ms, p2tr_ns, p2tr_pk, p2wpkh, p2wsh } from "./payment.js";
6
+ export { CompactSize, MAX_SCRIPT_BYTE_LENGTH, OP, RawTx, RawWitness, Script, ScriptNum, } from "./script.js";
7
+ export { getInputType, Transaction } from "./transaction.js";
8
+ export { NETWORK, TAPROOT_UNSPENDABLE_KEY, TEST_NETWORK } from "./utils.js";
9
+ export { selectUTXO } from "./utxo.js";
10
+ export const utils = {
11
+ isBytes,
12
+ concatBytes,
13
+ compareBytes,
14
+ pubSchnorr,
15
+ randomPrivateKeyBytes,
16
+ taprootTweakPubkey,
44
17
  };
45
- var payment_ts_2 = require("./payment.js"); // remove
46
- Object.defineProperty(exports, "_sortPubkeys", { enumerable: true, get: function () { return payment_ts_2._sortPubkeys; } });
47
- Object.defineProperty(exports, "Address", { enumerable: true, get: function () { return payment_ts_2.Address; } });
48
- Object.defineProperty(exports, "combinations", { enumerable: true, get: function () { return payment_ts_2.combinations; } });
49
- Object.defineProperty(exports, "getAddress", { enumerable: true, get: function () { return payment_ts_2.getAddress; } });
50
- Object.defineProperty(exports, "OutScript", { enumerable: true, get: function () { return payment_ts_2.OutScript; } });
51
- Object.defineProperty(exports, "sortedMultisig", { enumerable: true, get: function () { return payment_ts_2.sortedMultisig; } });
52
- Object.defineProperty(exports, "taprootListToTree", { enumerable: true, get: function () { return payment_ts_2.taprootListToTree; } });
53
- Object.defineProperty(exports, "WIF", { enumerable: true, get: function () { return payment_ts_2.WIF; } });
54
- var psbt_ts_1 = require("./psbt.js"); // remove
55
- Object.defineProperty(exports, "_DebugPSBT", { enumerable: true, get: function () { return psbt_ts_1._DebugPSBT; } });
56
- Object.defineProperty(exports, "TaprootControlBlock", { enumerable: true, get: function () { return psbt_ts_1.TaprootControlBlock; } });
57
- var transaction_ts_2 = require("./transaction.js"); // remove
58
- Object.defineProperty(exports, "bip32Path", { enumerable: true, get: function () { return transaction_ts_2.bip32Path; } });
59
- Object.defineProperty(exports, "Decimal", { enumerable: true, get: function () { return transaction_ts_2.Decimal; } });
60
- Object.defineProperty(exports, "DEFAULT_SEQUENCE", { enumerable: true, get: function () { return transaction_ts_2.DEFAULT_SEQUENCE; } });
61
- Object.defineProperty(exports, "PSBTCombine", { enumerable: true, get: function () { return transaction_ts_2.PSBTCombine; } });
62
- Object.defineProperty(exports, "SigHash", { enumerable: true, get: function () { return transaction_ts_2.SigHash; } });
63
- var utxo_ts_2 = require("./utxo.js");
64
- Object.defineProperty(exports, "_cmpBig", { enumerable: true, get: function () { return utxo_ts_2._cmpBig; } });
65
- Object.defineProperty(exports, "_Estimator", { enumerable: true, get: function () { return utxo_ts_2._Estimator; } });
18
+ export { _sortPubkeys, Address, combinations, getAddress, OutScript, sortedMultisig, taprootListToTree, WIF, } from "./payment.js"; // remove
19
+ export { _DebugPSBT, TaprootControlBlock } from "./psbt.js"; // remove
20
+ export { bip32Path, Decimal, DEFAULT_SEQUENCE, PSBTCombine, SigHash } from "./transaction.js"; // remove
21
+ export { _cmpBig, _Estimator } from "./utxo.js";
66
22
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":";;;AAAA,0EAA0E;AAC1E,yCAOoB;AACpB,kDAAkD;AAClD,kBAAkB;AAClB,2CAGsB;AAFpB,sGAAA,QAAQ,OAAA;AACR,kGAAA,IAAI,OAAA;AAAE,kGAAA,IAAI,OAAA;AAAE,mGAAA,KAAK,OAAA;AAAE,kGAAA,IAAI,OAAA;AAAE,kGAAA,IAAI,OAAA;AAAE,qGAAA,OAAO,OAAA;AAAE,qGAAA,OAAO,OAAA;AAAE,qGAAA,OAAO,OAAA;AAAE,oGAAA,MAAM,OAAA;AAAE,mGAAA,KAAK,OAAA;AAEzE,yCAQqB;AAPnB,wGAAA,WAAW,OAAA;AACX,mHAAA,sBAAsB,OAAA;AACtB,+FAAA,EAAE,OAAA;AACF,kGAAA,KAAK,OAAA;AACL,uGAAA,UAAU,OAAA;AACV,mGAAA,MAAM,OAAA;AACN,sGAAA,SAAS,OAAA;AAGX,mDAA6D;AAApD,8GAAA,YAAY,OAAA;AAAE,6GAAA,WAAW,OAAA;AAClC,uCAA4E;AAAnE,mGAAA,OAAO,OAAA;AAAE,mHAAA,uBAAuB,OAAA;AAAE,wGAAA,YAAY,OAAA;AACvD,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AAEN,QAAA,KAAK,GAAG;IACnB,OAAO,EAAP,kBAAO;IACP,WAAW,EAAX,sBAAW;IACX,YAAY,EAAZ,uBAAY;IACZ,UAAU,EAAV,qBAAU;IACV,qBAAqB,EAArB,gCAAqB;IACrB,kBAAkB,EAAlB,6BAAkB;CACnB,CAAC;AAEF,2CASsB,CAAC,SAAS;AAR9B,0GAAA,YAAY,OAAA;AACZ,qGAAA,OAAO,OAAA;AACP,0GAAA,YAAY,OAAA;AACZ,wGAAA,UAAU,OAAA;AACV,uGAAA,SAAS,OAAA;AACT,4GAAA,cAAc,OAAA;AACd,+GAAA,iBAAiB,OAAA;AACjB,iGAAA,GAAG,OAAA;AAIL,qCAA4D,CAAC,SAAS;AAA7D,qGAAA,UAAU,OAAA;AAAE,8GAAA,mBAAmB,OAAA;AACxC,mDAA8F,CAAC,SAAS;AAA/F,2GAAA,SAAS,OAAA;AAAE,yGAAA,OAAO,OAAA;AAAE,kHAAA,gBAAgB,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,yGAAA,OAAO,OAAA;AACnE,qCAAgD;AAAvC,kGAAA,OAAO,OAAA;AAAE,qGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EACL,YAAY,EACZ,WAAW,EACX,OAAO,EACP,UAAU,EACV,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,kDAAkD;AAClD,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EACxE,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,EAAE,EACF,KAAK,EACL,UAAU,EACV,MAAM,EACN,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,OAAO;IACP,WAAW;IACX,YAAY;IACZ,UAAU;IACV,qBAAqB;IACrB,kBAAkB;CACnB,CAAC;AAEF,OAAO,EACL,YAAY,EACZ,OAAO,EACP,YAAY,EACZ,UAAU,EACV,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,GAAG,GACJ,MAAM,cAAc,CAAC,CAAC,SAAS;AAGhC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC,CAAC,SAAS;AACtE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC,CAAC,SAAS;AACxG,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
package/musig2.d.ts CHANGED
@@ -38,7 +38,7 @@ export declare function sortKeys(publicKeys: Uint8Array[]): Uint8Array[];
38
38
  * @throws {InvalidContributionErr} If any of the public keys are invalid and cannot be processed.
39
39
  */
40
40
  export declare function keyAggregate(publicKeys: Uint8Array[], tweaks?: Uint8Array[], isXonly?: boolean[]): {
41
- aggPublicKey: import("@noble/curves/abstract/weierstrass").ProjPointType<bigint>;
41
+ aggPublicKey: import("@noble/curves/abstract/weierstrass.js").WeierstrassPoint<bigint>;
42
42
  gAcc: bigint;
43
43
  tweakAcc: bigint;
44
44
  };
@@ -47,7 +47,7 @@ export declare function keyAggregate(publicKeys: Uint8Array[], tweaks?: Uint8Arr
47
47
  * @param ctx The result of the keyAggregate function.
48
48
  * @returns The aggregate public key as a byte array.
49
49
  */
50
- export declare function keyAggExport(ctx: ReturnType<typeof keyAggregate>): Uint8Array<ArrayBufferLike>;
50
+ export declare function keyAggExport(ctx: ReturnType<typeof keyAggregate>): Uint8Array;
51
51
  /**
52
52
  * Generates a nonce pair (public and secret) for MuSig2 signing.
53
53
  * @param publicKey The individual public key of the signer (Uint8Array).
package/musig2.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"musig2.d.ts","sourceRoot":"","sources":["src/musig2.ts"],"names":[],"mappings":"AAyBA;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAChE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,WAAW,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAC3E;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;CAInC;AA8CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE/D;AASD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAG/D;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO;;;;EAgCxB;AACD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,+BAEhE;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,UAAU,EACrB,SAAS,CAAC,EAAE,UAAU,EACtB,YAAY,GAAE,UAA8B,EAC5C,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,GAAE,UAA8B,EACvC,IAAI,GAAE,UAA4B,GACjC,MAAM,CAmBR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,CAgBlE;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,CAAC,CAAS;IAClB,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,CAAC,CAAS;IAClB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,CAAC,CAAa;IACtB,OAAO,CAAC,SAAS,CAAa;IAC9B;;;;;;;;;;OAUG;gBAED,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,UAAU,EAAE,EACxB,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO;IAuBzB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,wBAAwB;IAmBhC;;;;;;;;OAQG;IACH,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,UAAQ,GAAG,UAAU;IAiC/E;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAerF;;;;;;OAMG;IACH,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU;CAarD;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,UAAU,EACzB,UAAU,EAAE,UAAU,EAAE,EACxB,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO,EACvB,IAAI,CAAC,EAAE,UAAU,EACjB,QAAQ,UAAQ,GACf,QAAQ,CAmBV"}
1
+ {"version":3,"file":"musig2.d.ts","sourceRoot":"","sources":["src/musig2.ts"],"names":[],"mappings":"AAkBA;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC;AAChE;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG;IAAE,WAAW,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAC3E;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBACT,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM;CAInC;AA6CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE/D;AASD;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAG/D;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EAAE,EACxB,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO;;;;EA+BxB;AACD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GAAG,UAAU,CAE7E;AA+BD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,UAAU,EACrB,SAAS,CAAC,EAAE,UAAU,EACtB,YAAY,GAAE,UAA8B,EAC5C,GAAG,CAAC,EAAE,UAAU,EAChB,OAAO,GAAE,UAA8B,EACvC,IAAI,GAAE,UAA4B,GACjC,MAAM,CAoBR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,UAAU,CAgBlE;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAAe;IACjC,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,CAAC,CAAS;IAClB,OAAO,CAAC,CAAC,CAAQ;IACjB,OAAO,CAAC,CAAC,CAAS;IAClB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,CAAC,CAAa;IACtB,OAAO,CAAC,SAAS,CAAa;IAC9B;;;;;;;;;;OAUG;gBAED,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,UAAU,EAAE,EACxB,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO;IAuBzB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,wBAAwB;IAmBhC;;;;;;;;OAQG;IACH,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,UAAQ,GAAG,UAAU;IAkC/E;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO;IAerF;;;;;;OAMG;IACH,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU;CAarD;AAmBD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,UAAU,EACzB,UAAU,EAAE,UAAU,EAAE,EACxB,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,UAAU,EAAO,EACzB,OAAO,GAAE,OAAO,EAAO,EACvB,IAAI,CAAC,EAAE,UAAU,EACjB,QAAQ,UAAQ,GACf,QAAQ,CAmBV"}
package/musig2.js CHANGED
@@ -1,56 +1,45 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Session = exports.InvalidContributionErr = void 0;
4
- exports.IndividualPubkey = IndividualPubkey;
5
- exports.sortKeys = sortKeys;
6
- exports.keyAggregate = keyAggregate;
7
- exports.keyAggExport = keyAggExport;
8
- exports.nonceGen = nonceGen;
9
- exports.nonceAggregate = nonceAggregate;
10
- exports.deterministicSign = deterministicSign;
11
- const modular_js_1 = require("@noble/curves/abstract/modular.js");
12
- const utils_js_1 = require("@noble/curves/abstract/utils.js");
13
- const secp256k1_js_1 = require("@noble/curves/secp256k1.js");
14
- const utils_js_2 = require("@noble/hashes/utils.js");
15
- const P = require("micro-packed");
16
- const utils_ts_1 = require("./utils.js");
1
+ import { schnorr, secp256k1 } from '@noble/curves/secp256k1.js';
2
+ import { aInRange, concatBytes, equalBytes, numberToBytesBE } from '@noble/curves/utils.js';
3
+ import { abytes, anumber, randomBytes } from '@noble/hashes/utils.js';
4
+ import * as P from 'micro-packed';
5
+ import { compareBytes, hasEven } from "./utils.js";
17
6
  /**
18
7
  * Represents an error indicating an invalid contribution from a signer.
19
8
  * This allows pointing out which participant is malicious and what specifically is wrong.
20
9
  */
21
- class InvalidContributionErr extends Error {
10
+ export class InvalidContributionErr extends Error {
11
+ idx; // Indice of participant
22
12
  constructor(idx, m) {
23
13
  super(m);
24
14
  this.idx = idx;
25
15
  }
26
16
  }
27
- exports.InvalidContributionErr = InvalidContributionErr;
28
17
  // Utils
29
- const { taggedHash, pointToBytes } = secp256k1_js_1.schnorr.utils;
30
- const Point = secp256k1_js_1.secp256k1.ProjectivePoint;
31
- const PUBKEY_LEN = 33;
18
+ const { taggedHash, pointToBytes } = schnorr.utils;
19
+ const Point = secp256k1.Point;
20
+ const Fn = Point.Fn;
21
+ const PUBKEY_LEN = secp256k1.lengths.publicKey;
32
22
  const ZERO = new Uint8Array(PUBKEY_LEN); // Compressed zero point
33
- const SECP_N = secp256k1_js_1.secp256k1.CURVE.n;
34
23
  // Encoding
35
24
  // TODO: re-use in PSBT?
36
25
  const compressed = P.apply(P.bytes(33), {
37
- decode: (p) => (isZero(p) ? ZERO : p.toRawBytes(true)),
38
- encode: (b) => ((0, utils_js_1.equalBytes)(b, ZERO) ? Point.ZERO : Point.fromHex(b)),
26
+ decode: (p) => (isZero(p) ? ZERO : p.toBytes(true)),
27
+ encode: (b) => (equalBytes(b, ZERO) ? Point.ZERO : Point.fromBytes(b)),
39
28
  });
40
29
  const scalar = P.validate(P.U256BE, (n) => {
41
- (0, utils_js_1.aInRange)('n', n, 1n, SECP_N);
30
+ aInRange('n', n, 1n, Fn.ORDER);
42
31
  return n;
43
32
  });
44
33
  const PubNonce = P.struct({ R1: compressed, R2: compressed });
45
34
  const SecretNonce = P.struct({ k1: scalar, k2: scalar, publicKey: P.bytes(PUBKEY_LEN) });
46
35
  function abytesOptional(b, ...lengths) {
47
36
  if (b !== undefined)
48
- (0, utils_js_2.abytes)(b, ...lengths);
37
+ abytes(b, ...lengths);
49
38
  }
50
39
  function abytesArray(lst, ...lengths) {
51
40
  if (!Array.isArray(lst))
52
41
  throw new Error('expected array');
53
- lst.forEach((i) => (0, utils_js_2.abytes)(i, ...lengths));
42
+ lst.forEach((i) => abytes(i, ...lengths));
54
43
  }
55
44
  function aXonly(lst) {
56
45
  if (!Array.isArray(lst))
@@ -60,12 +49,11 @@ function aXonly(lst) {
60
49
  throw new Error('expected boolean in xOnly array, got' + i + '(' + j + ')');
61
50
  });
62
51
  }
63
- const modN = (x) => (0, modular_js_1.mod)(x, SECP_N);
64
- const taggedInt = (tag, ...messages) => modN((0, utils_js_1.bytesToNumberBE)(taggedHash(tag, ...messages)));
65
- const evenScalar = (p, n) => (p.hasEvenY() ? n : modN(-n));
52
+ const taggedInt = (tag, ...messages) => Fn.create(Fn.fromBytes(taggedHash(tag, ...messages), true));
53
+ const evenScalar = (p, n) => (hasEven(p.y) ? n : Fn.neg(n));
66
54
  // Short utility for compat with reference implementation
67
- function IndividualPubkey(seckey) {
68
- return secp256k1_js_1.secp256k1.getPublicKey(seckey, true);
55
+ export function IndividualPubkey(seckey) {
56
+ return secp256k1.getPublicKey(seckey, true);
69
57
  }
70
58
  // Same, but returns Point
71
59
  function mulBase(n) {
@@ -80,15 +68,15 @@ function isZero(point) {
80
68
  * @returns A new array containing the sorted public keys.
81
69
  * @throws {Error} If the input is not an array or if any element is not a Uint8Array of the correct length.
82
70
  */
83
- function sortKeys(publicKeys) {
71
+ export function sortKeys(publicKeys) {
84
72
  abytesArray(publicKeys, PUBKEY_LEN);
85
- return publicKeys.sort(utils_ts_1.compareBytes);
73
+ return publicKeys.sort(compareBytes);
86
74
  }
87
75
  // Finds second distinct key (to make coefficient 1)
88
76
  function getSecondKey(publicKeys) {
89
77
  abytesArray(publicKeys, PUBKEY_LEN);
90
78
  for (let j = 1; j < publicKeys.length; j++)
91
- if (!(0, utils_js_1.equalBytes)(publicKeys[j], publicKeys[0]))
79
+ if (!equalBytes(publicKeys[j], publicKeys[0]))
92
80
  return publicKeys[j];
93
81
  return ZERO;
94
82
  }
@@ -97,9 +85,9 @@ function keyAggL(publicKeys) {
97
85
  return taggedHash('KeyAgg list', ...publicKeys);
98
86
  }
99
87
  function keyAggCoeffInternal(publicKey1, publicKey2, L) {
100
- (0, utils_js_2.abytes)(publicKey1, PUBKEY_LEN);
101
- (0, utils_js_2.abytes)(publicKey2, PUBKEY_LEN);
102
- if ((0, utils_js_1.equalBytes)(publicKey1, publicKey2))
88
+ abytes(publicKey1, PUBKEY_LEN);
89
+ abytes(publicKey2, PUBKEY_LEN);
90
+ if (equalBytes(publicKey1, publicKey2))
103
91
  return 1n;
104
92
  return taggedInt('KeyAgg coefficient', L, publicKey1);
105
93
  }
@@ -112,7 +100,7 @@ function keyAggCoeffInternal(publicKey1, publicKey2, L) {
112
100
  * @throws {Error} If the input is invalid, such as non array publicKeys, tweaks and isXonly array length not matching.
113
101
  * @throws {InvalidContributionErr} If any of the public keys are invalid and cannot be processed.
114
102
  */
115
- function keyAggregate(publicKeys, tweaks = [], isXonly = []) {
103
+ export function keyAggregate(publicKeys, tweaks = [], isXonly = []) {
116
104
  abytesArray(publicKeys, PUBKEY_LEN);
117
105
  abytesArray(tweaks, 32);
118
106
  if (tweaks.length !== isXonly.length)
@@ -124,25 +112,24 @@ function keyAggregate(publicKeys, tweaks = [], isXonly = []) {
124
112
  for (let i = 0; i < publicKeys.length; i++) {
125
113
  let Pi;
126
114
  try {
127
- Pi = Point.fromHex(publicKeys[i]);
115
+ Pi = Point.fromBytes(publicKeys[i]);
128
116
  }
129
117
  catch (error) {
130
118
  throw new InvalidContributionErr(i, 'pubkey');
131
119
  }
132
120
  aggPublicKey = aggPublicKey.add(Pi.multiply(keyAggCoeffInternal(publicKeys[i], pk2, L)));
133
121
  }
134
- let gAcc = 1n;
135
- let tweakAcc = 0n;
122
+ let gAcc = Fn.ONE;
123
+ let tweakAcc = Fn.ZERO;
136
124
  // Apply tweaks
137
125
  for (let i = 0; i < tweaks.length; i++) {
138
- const g = isXonly[i] && !aggPublicKey.hasEvenY() ? modN(-1n) : 1n;
139
- const t = (0, utils_js_1.bytesToNumberBE)(tweaks[i]);
140
- (0, utils_js_1.aInRange)('tweak', t, 0n, SECP_N);
126
+ const g = isXonly[i] && !hasEven(aggPublicKey.y) ? Fn.neg(Fn.ONE) : Fn.ONE;
127
+ const t = Fn.fromBytes(tweaks[i]);
141
128
  aggPublicKey = aggPublicKey.multiply(g).add(mulBase(t));
142
129
  if (isZero(aggPublicKey))
143
130
  throw new Error('The result of tweaking cannot be infinity');
144
- gAcc = modN(g * gAcc);
145
- tweakAcc = modN(t + g * tweakAcc);
131
+ gAcc = Fn.mul(g, gAcc);
132
+ tweakAcc = Fn.add(t, Fn.mul(g, tweakAcc));
146
133
  }
147
134
  return { aggPublicKey, gAcc, tweakAcc };
148
135
  }
@@ -151,7 +138,7 @@ function keyAggregate(publicKeys, tweaks = [], isXonly = []) {
151
138
  * @param ctx The result of the keyAggregate function.
152
139
  * @returns The aggregate public key as a byte array.
153
140
  */
154
- function keyAggExport(ctx) {
141
+ export function keyAggExport(ctx) {
155
142
  return pointToBytes(ctx.aggPublicKey);
156
143
  }
157
144
  function aux(secret, rand) {
@@ -163,7 +150,7 @@ function aux(secret, rand) {
163
150
  res[i] = secret[i] ^ rand2[i];
164
151
  return res;
165
152
  }
166
- const nonceHash = (rand, publicKey, aggPublicKey, i, msgPrefixed, extraIn) => taggedInt('MuSig/nonce', rand, new Uint8Array([publicKey.length]), publicKey, new Uint8Array([aggPublicKey.length]), aggPublicKey, msgPrefixed, (0, utils_js_1.numberToBytesBE)(extraIn.length, 4), extraIn, new Uint8Array([i]));
153
+ const nonceHash = (rand, publicKey, aggPublicKey, i, msgPrefixed, extraIn) => taggedInt('MuSig/nonce', rand, new Uint8Array([publicKey.length]), publicKey, new Uint8Array([aggPublicKey.length]), aggPublicKey, msgPrefixed, numberToBytesBE(extraIn.length, 4), extraIn, new Uint8Array([i]));
167
154
  /**
168
155
  * Generates a nonce pair (public and secret) for MuSig2 signing.
169
156
  * @param publicKey The individual public key of the signer (Uint8Array).
@@ -175,18 +162,20 @@ const nonceHash = (rand, publicKey, aggPublicKey, i, msgPrefixed, extraIn) => ta
175
162
  * @returns An object containing the public and secret nonces.
176
163
  * @throws {Error} If the input is invalid, such as non array publicKey, secretKey, aggPublicKey.
177
164
  */
178
- function nonceGen(publicKey, secretKey, aggPublicKey = new Uint8Array(0), msg, extraIn = new Uint8Array(0), rand = (0, utils_js_2.randomBytes)(32)) {
179
- (0, utils_js_2.abytes)(publicKey, PUBKEY_LEN);
165
+ export function nonceGen(publicKey, secretKey, aggPublicKey = new Uint8Array(0), msg, extraIn = new Uint8Array(0), rand = randomBytes(32)) {
166
+ abytes(publicKey, PUBKEY_LEN);
180
167
  abytesOptional(secretKey, 32);
181
- (0, utils_js_2.abytes)(aggPublicKey, 0, 32);
168
+ abytes(aggPublicKey);
169
+ if (![0, 32].includes(aggPublicKey.length))
170
+ throw new Error('wrong aggPublicKey');
182
171
  abytesOptional(msg);
183
- (0, utils_js_2.abytes)(extraIn);
184
- (0, utils_js_2.abytes)(rand, 32);
172
+ abytes(extraIn);
173
+ abytes(rand, 32);
185
174
  if (secretKey !== undefined)
186
175
  rand = aux(secretKey, rand);
187
176
  const msgPrefixed = msg !== undefined
188
- ? (0, utils_js_1.concatBytes)(new Uint8Array([1]), (0, utils_js_1.numberToBytesBE)(msg.length, 8), msg)
189
- : new Uint8Array([0]);
177
+ ? concatBytes(Uint8Array.of(1), numberToBytesBE(msg.length, 8), msg)
178
+ : Uint8Array.of(0);
190
179
  const k1 = nonceHash(rand, publicKey, aggPublicKey, 0, msgPrefixed, extraIn);
191
180
  const k2 = nonceHash(rand, publicKey, aggPublicKey, 1, msgPrefixed, extraIn);
192
181
  return {
@@ -201,7 +190,7 @@ function nonceGen(publicKey, secretKey, aggPublicKey = new Uint8Array(0), msg, e
201
190
  * @throws {Error} If the input is not an array or if any element is not a Uint8Array of the correct length.
202
191
  * @throws {InvalidContributionErr} If any of the public nonces are invalid and cannot be processed.
203
192
  */
204
- function nonceAggregate(pubNonces) {
193
+ export function nonceAggregate(pubNonces) {
205
194
  abytesArray(pubNonces, 66);
206
195
  let R1 = Point.ZERO;
207
196
  let R2 = Point.ZERO;
@@ -222,7 +211,18 @@ function nonceAggregate(pubNonces) {
222
211
  }
223
212
  // Class allows us re-use pre-computed stuff
224
213
  // NOTE: it would be nice to aggregate nonce in construdctor, but there is test that passes already aggregated nonce here.
225
- class Session {
214
+ export class Session {
215
+ publicKeys;
216
+ Q;
217
+ gAcc;
218
+ tweakAcc;
219
+ b;
220
+ R;
221
+ e;
222
+ tweaks;
223
+ isXonly;
224
+ L;
225
+ secondKey;
226
226
  /**
227
227
  * Constructor for the Session class.
228
228
  * It precomputes and stores values derived from the aggregate nonce, public keys,
@@ -238,7 +238,7 @@ class Session {
238
238
  abytesArray(publicKeys, 33);
239
239
  abytesArray(tweaks, 32);
240
240
  aXonly(isXonly);
241
- (0, utils_js_2.abytes)(msg);
241
+ abytes(msg);
242
242
  if (tweaks.length !== isXonly.length)
243
243
  throw new Error('The tweaks and isXonly arrays must have the same length');
244
244
  const { aggPublicKey, gAcc, tweakAcc } = keyAggregate(publicKeys, tweaks, isXonly);
@@ -265,25 +265,25 @@ class Session {
265
265
  */
266
266
  getSessionKeyAggCoeff(P) {
267
267
  const { publicKeys } = this;
268
- const pk = P.toRawBytes(true);
269
- const found = publicKeys.some((p) => (0, utils_js_1.equalBytes)(p, pk));
268
+ const pk = P.toBytes(true);
269
+ const found = publicKeys.some((p) => equalBytes(p, pk));
270
270
  if (!found)
271
271
  throw new Error("The signer's pubkey must be included in the list of pubkeys");
272
272
  return keyAggCoeffInternal(pk, this.secondKey, this.L);
273
273
  }
274
274
  partialSigVerifyInternal(partialSig, publicNonce, publicKey) {
275
275
  const { Q, gAcc, b, R, e } = this;
276
- const s = (0, utils_js_1.bytesToNumberBE)(partialSig);
277
- if (s >= SECP_N)
276
+ const s = Fn.fromBytes(partialSig, true);
277
+ if (!Fn.isValid(s))
278
278
  return false;
279
279
  const { R1, R2 } = PubNonce.decode(publicNonce);
280
280
  const Re_s_ = R1.add(R2.multiply(b));
281
- const Re_s = R.hasEvenY() ? Re_s_ : Re_s_.negate();
282
- const P = Point.fromHex(publicKey);
281
+ const Re_s = hasEven(R.y) ? Re_s_ : Re_s_.negate();
282
+ const P = Point.fromBytes(publicKey);
283
283
  const a = this.getSessionKeyAggCoeff(P);
284
- const g = modN(evenScalar(Q, 1n) * gAcc);
284
+ const g = Fn.mul(evenScalar(Q, 1n), gAcc);
285
285
  const left = mulBase(s);
286
- const right = Re_s.add(P.multiply(modN(e * a * g)));
286
+ const right = Re_s.add(P.multiply(Fn.mul(e, Fn.mul(a, g))));
287
287
  return left.equals(right);
288
288
  }
289
289
  /**
@@ -296,7 +296,7 @@ class Session {
296
296
  * @throws {Error} If the input is invalid, such as wrong array sizes, invalid nonce or secret key.
297
297
  */
298
298
  sign(secretNonce, secret, fastSign = false) {
299
- (0, utils_js_2.abytes)(secret, 32);
299
+ abytes(secret, 32);
300
300
  if (typeof fastSign !== 'boolean')
301
301
  throw new Error('expected boolean');
302
302
  const { Q, gAcc, b, R, e } = this;
@@ -304,21 +304,25 @@ class Session {
304
304
  // zero-out the first 64 bytes of secretNonce so it cannot be reused
305
305
  // TODO: this was in reference implementation, but feels very broken. Modifying input arguments is pretty bad.
306
306
  secretNonce.fill(0, 0, 64);
307
- (0, utils_js_1.aInRange)('k1', k1_, 0n, SECP_N);
308
- (0, utils_js_1.aInRange)('k2', k2_, 0n, SECP_N);
307
+ if (!Fn.isValid(k1_))
308
+ throw new Error('wrong k1');
309
+ if (!Fn.isValid(k2_))
310
+ throw new Error('wrong k1');
309
311
  const k1 = evenScalar(R, k1_);
310
312
  const k2 = evenScalar(R, k2_);
311
- const d_ = (0, utils_js_1.bytesToNumberBE)(secret);
312
- (0, utils_js_1.aInRange)('d_', d_, 1n, SECP_N);
313
+ const d_ = Fn.fromBytes(secret);
314
+ if (Fn.is0(d_))
315
+ throw new Error('wrong d_');
313
316
  const P = mulBase(d_);
314
- const pk = P.toRawBytes(true);
315
- if (!(0, utils_js_1.equalBytes)(pk, originalPk))
317
+ const pk = P.toBytes(true);
318
+ if (!equalBytes(pk, originalPk))
316
319
  throw new Error('Public key does not match nonceGen argument');
317
320
  const a = this.getSessionKeyAggCoeff(P);
318
321
  const g = evenScalar(Q, 1n);
319
- const d = modN(g * gAcc * d_);
320
- const s = modN(k1 + b * k2 + e * a * d);
321
- const partialSig = (0, utils_js_1.numberToBytesBE)(s, 32);
322
+ const d = Fn.mul(g, Fn.mul(gAcc, d_));
323
+ /// k1 + (b*k2) + (e*a*d)
324
+ const s = Fn.add(k1, Fn.add(Fn.mul(b, k2), Fn.mul(e, Fn.mul(a, d))));
325
+ const partialSig = Fn.toBytes(s);
322
326
  // Skip validation in fast-sign mode
323
327
  if (!fastSign) {
324
328
  const publicNonce = PubNonce.encode({
@@ -344,12 +348,12 @@ class Session {
344
348
  */
345
349
  partialSigVerify(partialSig, pubNonces, i) {
346
350
  const { publicKeys, tweaks, isXonly } = this;
347
- (0, utils_js_2.abytes)(partialSig, 32);
351
+ abytes(partialSig, 32);
348
352
  abytesArray(pubNonces, 66);
349
353
  abytesArray(publicKeys, PUBKEY_LEN);
350
354
  abytesArray(tweaks, 32);
351
355
  aXonly(isXonly);
352
- (0, utils_js_2.anumber)(i);
356
+ anumber(i);
353
357
  if (pubNonces.length !== publicKeys.length)
354
358
  throw new Error('The pubNonces and publicKeys arrays must have the same length');
355
359
  if (tweaks.length !== isXonly.length)
@@ -370,18 +374,17 @@ class Session {
370
374
  const { Q, tweakAcc, R, e } = this;
371
375
  let s = 0n;
372
376
  for (let i = 0; i < partialSigs.length; i++) {
373
- const si = (0, utils_js_1.bytesToNumberBE)(partialSigs[i]);
374
- if (si >= SECP_N)
377
+ const si = Fn.fromBytes(partialSigs[i], true);
378
+ if (!Fn.isValid(si))
375
379
  throw new InvalidContributionErr(i, 'psig');
376
- s = modN(s + si);
380
+ s = Fn.add(s, si);
377
381
  }
378
382
  const g = evenScalar(Q, 1n);
379
- s = modN(s + e * g * tweakAcc);
380
- return (0, utils_js_1.concatBytes)(pointToBytes(R), (0, utils_js_1.numberToBytesBE)(s, 32));
383
+ s = Fn.add(s, Fn.mul(e, Fn.mul(g, tweakAcc))); // s + e * g * tweakAcc
384
+ return concatBytes(pointToBytes(R), Fn.toBytes(s));
381
385
  }
382
386
  }
383
- exports.Session = Session;
384
- const deterministicNonceHash = (secret, aggOtherNonce, aggPublicKey, msg, i) => taggedInt('MuSig/deterministic/nonce', secret, aggOtherNonce, aggPublicKey, (0, utils_js_1.numberToBytesBE)(msg.length, 8), msg, new Uint8Array([i]));
387
+ const deterministicNonceHash = (secret, aggOtherNonce, aggPublicKey, msg, i) => taggedInt('MuSig/deterministic/nonce', secret, aggOtherNonce, aggPublicKey, numberToBytesBE(msg.length, 8), msg, new Uint8Array([i]));
385
388
  /**
386
389
  * Generates a nonce pair and partial signature deterministically for a single signer.
387
390
  * @param secret The secret key of the signer (Uint8Array).
@@ -393,12 +396,12 @@ const deterministicNonceHash = (secret, aggOtherNonce, aggPublicKey, msg, i) =>
393
396
  * @param rand Optional extra randomness (Uint8Array).
394
397
  * @returns An object containing the public nonce and partial signature.
395
398
  */
396
- function deterministicSign(secret, aggOtherNonce, publicKeys, msg, tweaks = [], isXonly = [], rand, fastSign = false) {
397
- (0, utils_js_2.abytes)(secret, 32);
398
- (0, utils_js_2.abytes)(aggOtherNonce, 66);
399
+ export function deterministicSign(secret, aggOtherNonce, publicKeys, msg, tweaks = [], isXonly = [], rand, fastSign = false) {
400
+ abytes(secret, 32);
401
+ abytes(aggOtherNonce, 66);
399
402
  abytesArray(publicKeys, PUBKEY_LEN);
400
403
  abytesArray(tweaks, 32);
401
- (0, utils_js_2.abytes)(msg);
404
+ abytes(msg);
402
405
  abytesOptional(rand);
403
406
  const sk = rand !== undefined ? aux(secret, rand) : secret;
404
407
  const aggPublicKey = keyAggExport(keyAggregate(publicKeys, tweaks, isXonly));