utxo-lib 1.0.8 → 1.1.0
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.
- package/README.md +19 -16
- package/dist/src/address.d.ts.map +1 -1
- package/dist/src/address.js +11 -1
- package/dist/src/addressFormat.d.ts +1 -1
- package/dist/src/addressFormat.d.ts.map +1 -1
- package/dist/src/addressFormat.js +1 -1
- package/dist/src/base_crypto.d.ts +14 -0
- package/dist/src/base_crypto.d.ts.map +1 -0
- package/dist/src/base_crypto.js +215 -0
- package/dist/src/bitgo/Musig2.d.ts +115 -17
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +283 -101
- package/dist/src/bitgo/PsbtUtil.d.ts +59 -0
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
- package/dist/src/bitgo/PsbtUtil.js +91 -0
- package/dist/src/bitgo/UtxoPsbt.d.ts +180 -47
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +657 -121
- package/dist/src/bitgo/UtxoTransaction.js +2 -2
- package/dist/src/bitgo/bitcoincash/address.js +2 -2
- package/dist/src/bitgo/index.d.ts +11 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +6 -2
- package/dist/src/bitgo/legacysafe/index.d.ts +15 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +61 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +10 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.js +17 -0
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +16 -0
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -0
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +46 -0
- package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts +10 -0
- package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.d.ts.map +1 -0
- package/dist/src/bitgo/litecoin/LitecoinTransactionBuilder.js +15 -0
- package/dist/src/bitgo/litecoin/index.d.ts +4 -0
- package/dist/src/bitgo/litecoin/index.d.ts.map +1 -0
- package/dist/src/bitgo/litecoin/index.js +16 -0
- package/dist/src/bitgo/outputScripts.d.ts +3 -1
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +20 -12
- package/dist/src/bitgo/parseInput.d.ts +49 -20
- package/dist/src/bitgo/parseInput.d.ts.map +1 -1
- package/dist/src/bitgo/parseInput.js +110 -26
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +9 -6
- package/dist/src/bitgo/psbt/scriptTypes.js +3 -3
- package/dist/src/bitgo/signature.d.ts +3 -3
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +48 -16
- package/dist/src/bitgo/transaction.d.ts +18 -3
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +28 -15
- package/dist/src/bitgo/types.d.ts +2 -0
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +1 -1
- package/dist/src/bitgo/wallet/Psbt.d.ts +104 -12
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +285 -70
- package/dist/src/bitgo/wallet/Unspent.d.ts +28 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +172 -68
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +17 -1
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +64 -23
- package/dist/src/bitgo/wallet/chains.d.ts +2 -2
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/chains.js +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +7 -16
- package/dist/src/bitgo/zcash/ZcashTransaction.js +2 -2
- package/dist/src/musig.d.ts +390 -0
- package/dist/src/musig.d.ts.map +1 -0
- package/dist/src/musig.js +447 -0
- package/dist/src/networks.d.ts +1 -2
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +22 -29
- package/dist/src/noble_ecc.d.ts +1 -1
- package/dist/src/noble_ecc.d.ts.map +1 -1
- package/dist/src/noble_ecc.js +11 -7
- package/dist/src/payments/p2tr.d.ts.map +1 -1
- package/dist/src/payments/p2tr.js +21 -19
- package/dist/src/payments/p2tr_ns.js +2 -3
- package/dist/src/taproot.d.ts +16 -0
- package/dist/src/taproot.d.ts.map +1 -1
- package/dist/src/taproot.js +45 -4
- package/dist/src/testutil/index.d.ts +2 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +3 -1
- package/dist/src/testutil/keys.d.ts +3 -0
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +17 -2
- package/dist/src/testutil/mock.d.ts +1 -1
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +12 -4
- package/dist/src/testutil/psbt.d.ts +89 -0
- package/dist/src/testutil/psbt.d.ts.map +1 -0
- package/dist/src/testutil/psbt.js +150 -0
- package/dist/src/testutil/transaction.d.ts +70 -0
- package/dist/src/testutil/transaction.d.ts.map +1 -0
- package/dist/src/testutil/transaction.js +107 -0
- package/dist/src/transaction_builder.js +2 -2
- package/package.json +6 -7
package/README.md
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
This library is a wrapper around [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib) adding altcoin support.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
|
+
|
|
6
7
|
- Multicoin support: Configurable behaviour based on [network](https://github.com/BitGo/bitgo-utxo-lib/blob/master/src/networks.js) objects.
|
|
7
8
|
- Backed by [BitGo](https://www.bitgo.com/info/)
|
|
8
9
|
|
|
9
10
|
## Installation
|
|
10
11
|
|
|
11
|
-
```
|
|
12
|
+
```bash
|
|
12
13
|
# using npm
|
|
13
14
|
npm install @bitgo/utxo-lib
|
|
14
15
|
|
|
@@ -19,20 +20,22 @@ yarn add @bitgo/utxo-lib
|
|
|
19
20
|
## Setup
|
|
20
21
|
|
|
21
22
|
JavaScript (ESM)
|
|
22
|
-
|
|
23
|
-
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
import * as utxolib from '@bitgo/utxo-lib';
|
|
24
26
|
```
|
|
25
27
|
|
|
26
28
|
NodeJS (CJS)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
|
|
30
|
+
```javascript
|
|
31
|
+
const utxolib = require('@bitgo/utxo-lib');
|
|
29
32
|
```
|
|
30
33
|
|
|
31
34
|
## Usage
|
|
32
35
|
|
|
33
36
|
Support for parsing and building altcoin transactions is provided by the following methods
|
|
34
37
|
|
|
35
|
-
```
|
|
38
|
+
```typescript
|
|
36
39
|
utxolib.bitgo.createTransactionFromBuffer(buffer, network): UtxoTransaction
|
|
37
40
|
// (similarly `createTransactionFromHex(string, network)`)
|
|
38
41
|
|
|
@@ -45,15 +48,15 @@ The `UtxoTransaction(Builder)` classes have the same interface as the `Transacti
|
|
|
45
48
|
|
|
46
49
|
## Supported coins
|
|
47
50
|
|
|
48
|
-
|Network|Mainnet|Testnet|
|
|
49
|
-
|
|
50
|
-
|Bitcoin
|
|
51
|
-
|Bitcoin Cash
|
|
52
|
-
|Bitcoin Gold
|
|
53
|
-
|Bitcoin SV (Satoshi Vision)
|
|
54
|
-
|Dash
|
|
55
|
-
|eCash
|
|
56
|
-
|Litecoin
|
|
57
|
-
|Zcash
|
|
51
|
+
| Network | Mainnet | Testnet |
|
|
52
|
+
| --------------------------- | ------------------------------ | ------------------------------------- |
|
|
53
|
+
| Bitcoin | `utxolib.networks.bitcoin` | `utxolib.networks.testnet` |
|
|
54
|
+
| Bitcoin Cash | `utxolib.networks.bitcoincash` | `utxolib.networks.bitcoincashTestnet` |
|
|
55
|
+
| Bitcoin Gold | `utxolib.networks.bitcoingold` | `utxolib.networks.bitcoingoldTestnet` |
|
|
56
|
+
| Bitcoin SV (Satoshi Vision) | `utxolib.networks.bitcoinsv` | `utxolib.networks.bitcoinsvTestnet` |
|
|
57
|
+
| Dash | `utxolib.networks.dash` | `utxolib.networks.dash` |
|
|
58
|
+
| eCash | `utxolib.networks.ecash` | `utxolib.networks.ecashTestnet` |
|
|
59
|
+
| Litecoin | `utxolib.networks.litecoin` | `utxolib.networks.litecoinTest` |
|
|
60
|
+
| Zcash | `utxolib.networks.zcash` | `utxolib.networks.zcashTest` |
|
|
58
61
|
|
|
59
62
|
> [Bitcoin SV](https://blog.bitgo.com/bsv-deprecation-6b3fff4df34c) no longer supports sending funds to BitGo wallets. Existing customers with Bitcoin SV in BitGo wallets will still be able to access and sweep funds to an external Bitcoin SV wallet.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/address.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,SAAS,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG5E,OAAO,EAA2B,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/address.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,SAAS,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG5E,OAAO,EAA2B,OAAO,EAAE,MAAM,YAAY,CAAC;AAG9D,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAe/E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAKxE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAKrF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAKpF;AAED,eAAO,MAAQ,UAAU,uCAAE,QAAQ,mCAAsB,CAAC;AAE1D,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC"}
|
package/dist/src/address.js
CHANGED
|
@@ -5,10 +5,20 @@ exports.toBech32 = exports.fromBech32 = exports.fromBase58Check = exports.toBase
|
|
|
5
5
|
const bitcoinjs = require("bitcoinjs-lib");
|
|
6
6
|
const zcashAddress = require("../src/bitgo/zcash/address");
|
|
7
7
|
const networks_1 = require("./networks");
|
|
8
|
+
const index_1 = require("./index");
|
|
8
9
|
function fromOutputScript(outputScript, network) {
|
|
9
10
|
if (networks_1.isValidNetwork(network) && networks_1.isZcash(network)) {
|
|
10
11
|
return zcashAddress.fromOutputScript(outputScript, network);
|
|
11
12
|
}
|
|
13
|
+
// We added p2tr payments from our forked bitcoinjs-lib to utxo-lib instead. Our bitcoinjs fork will no longer have
|
|
14
|
+
// p2tr support so utxo-lib should take care of retrieving a p2tr address from outputScript and bitcoinjs-lib can
|
|
15
|
+
// handle the other type of payments.
|
|
16
|
+
try {
|
|
17
|
+
return index_1.p2trPayments.p2tr({ output: outputScript, network }).address;
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
// noop. try the bitcoinjs method
|
|
21
|
+
}
|
|
12
22
|
return bitcoinjs.address.fromOutputScript(outputScript, network);
|
|
13
23
|
}
|
|
14
24
|
exports.fromOutputScript = fromOutputScript;
|
|
@@ -34,4 +44,4 @@ function fromBase58Check(address, network) {
|
|
|
34
44
|
}
|
|
35
45
|
exports.fromBase58Check = fromBase58Check;
|
|
36
46
|
_a = bitcoinjs.address, exports.fromBech32 = _a.fromBech32, exports.toBech32 = _a.toBech32;
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQ0FBMkM7QUFHM0MsMkRBQTJEO0FBQzNELHlDQUE4RDtBQUM5RCxtQ0FBdUM7QUFFdkMsU0FBZ0IsZ0JBQWdCLENBQUMsWUFBb0IsRUFBRSxPQUFnQjtJQUNyRSxJQUFJLHlCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksa0JBQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMvQyxPQUFPLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxtSEFBbUg7SUFDbkgsaUhBQWlIO0lBQ2pILHFDQUFxQztJQUNyQyxJQUFJO1FBQ0YsT0FBTyxvQkFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFpQixDQUFDO0tBQy9FO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixpQ0FBaUM7S0FDbEM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLE9BQTRCLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBZkQsNENBZUM7QUFFRCxTQUFnQixjQUFjLENBQUMsT0FBZSxFQUFFLE9BQWdCO0lBQzlELElBQUkseUJBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxrQkFBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQy9DLE9BQU8sWUFBWSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUE0QixDQUFDLENBQUM7QUFDakYsQ0FBQztBQUxELHdDQUtDO0FBRUQsU0FBZ0IsYUFBYSxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsT0FBZ0I7SUFDM0UsSUFBSSx5QkFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGtCQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0MsT0FBTyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztLQUNsRDtJQUNELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFMRCxzQ0FLQztBQUVELFNBQWdCLGVBQWUsQ0FBQyxPQUFlLEVBQUUsT0FBZ0I7SUFDL0QsSUFBSSx5QkFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGtCQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0MsT0FBTyxZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlDO0lBQ0QsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBTEQsMENBS0M7QUFFWSxLQUEyQixTQUFTLENBQUMsT0FBTyxFQUExQyxrQkFBVSxrQkFBRSxnQkFBUSxlQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJpdGNvaW5qcyBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IEJhc2U1OENoZWNrUmVzdWx0LCBCZWNoMzJSZXN1bHQgfSBmcm9tICdiaXRjb2luanMtbGliL3NyYy9hZGRyZXNzJztcblxuaW1wb3J0ICogYXMgemNhc2hBZGRyZXNzIGZyb20gJy4uL3NyYy9iaXRnby96Y2FzaC9hZGRyZXNzJztcbmltcG9ydCB7IGlzVmFsaWROZXR3b3JrLCBpc1pjYXNoLCBOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3Jrcyc7XG5pbXBvcnQgeyBwMnRyUGF5bWVudHMgfSBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0OiBCdWZmZXIsIG5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICBpZiAoaXNWYWxpZE5ldHdvcmsobmV0d29yaykgJiYgaXNaY2FzaChuZXR3b3JrKSkge1xuICAgIHJldHVybiB6Y2FzaEFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIG5ldHdvcmspO1xuICB9XG5cbiAgLy8gV2UgYWRkZWQgcDJ0ciBwYXltZW50cyBmcm9tIG91ciBmb3JrZWQgYml0Y29pbmpzLWxpYiB0byB1dHhvLWxpYiBpbnN0ZWFkLiBPdXIgYml0Y29pbmpzIGZvcmsgd2lsbCBubyBsb25nZXIgaGF2ZVxuICAvLyBwMnRyIHN1cHBvcnQgc28gdXR4by1saWIgc2hvdWxkIHRha2UgY2FyZSBvZiByZXRyaWV2aW5nIGEgcDJ0ciBhZGRyZXNzIGZyb20gb3V0cHV0U2NyaXB0IGFuZCBiaXRjb2luanMtbGliIGNhblxuICAvLyBoYW5kbGUgdGhlIG90aGVyIHR5cGUgb2YgcGF5bWVudHMuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHAydHJQYXltZW50cy5wMnRyKHsgb3V0cHV0OiBvdXRwdXRTY3JpcHQsIG5ldHdvcmsgfSkuYWRkcmVzcyBhcyBzdHJpbmc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBub29wLiB0cnkgdGhlIGJpdGNvaW5qcyBtZXRob2RcbiAgfVxuXG4gIHJldHVybiBiaXRjb2luanMuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgbmV0d29yayBhcyBiaXRjb2luanMuTmV0d29yayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdChhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IE5ldHdvcmspOiBCdWZmZXIge1xuICBpZiAoaXNWYWxpZE5ldHdvcmsobmV0d29yaykgJiYgaXNaY2FzaChuZXR3b3JrKSkge1xuICAgIHJldHVybiB6Y2FzaEFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIH1cbiAgcmV0dXJuIGJpdGNvaW5qcy5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIG5ldHdvcmsgYXMgYml0Y29pbmpzLk5ldHdvcmspO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CYXNlNThDaGVjayhoYXNoOiBCdWZmZXIsIHZlcnNpb246IG51bWJlciwgbmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIGlmIChpc1ZhbGlkTmV0d29yayhuZXR3b3JrKSAmJiBpc1pjYXNoKG5ldHdvcmspKSB7XG4gICAgcmV0dXJuIHpjYXNoQWRkcmVzcy50b0Jhc2U1OENoZWNrKGhhc2gsIHZlcnNpb24pO1xuICB9XG4gIHJldHVybiBiaXRjb2luanMuYWRkcmVzcy50b0Jhc2U1OENoZWNrKGhhc2gsIHZlcnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUJhc2U1OENoZWNrKGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogTmV0d29yayk6IEJhc2U1OENoZWNrUmVzdWx0IHtcbiAgaWYgKGlzVmFsaWROZXR3b3JrKG5ldHdvcmspICYmIGlzWmNhc2gobmV0d29yaykpIHtcbiAgICByZXR1cm4gemNhc2hBZGRyZXNzLmZyb21CYXNlNThDaGVjayhhZGRyZXNzKTtcbiAgfVxuICByZXR1cm4gYml0Y29pbmpzLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKGFkZHJlc3MpO1xufVxuXG5leHBvcnQgY29uc3QgeyBmcm9tQmVjaDMyLCB0b0JlY2gzMiB9ID0gYml0Y29pbmpzLmFkZHJlc3M7XG5cbmV4cG9ydCB7IEJhc2U1OENoZWNrUmVzdWx0LCBCZWNoMzJSZXN1bHQgfTtcbiJdfQ==
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { Network } from './networks';
|
|
9
9
|
export declare const addressFormats: readonly ["default", "cashaddr"];
|
|
10
|
-
export declare type AddressFormat = typeof addressFormats[number];
|
|
10
|
+
export declare type AddressFormat = (typeof addressFormats)[number];
|
|
11
11
|
/**
|
|
12
12
|
* @param format
|
|
13
13
|
* @param network
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addressFormat.d.ts","sourceRoot":"","sources":["../../src/addressFormat.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAA8B,OAAO,EAAY,MAAM,YAAY,CAAC;AAK3E,eAAO,MAAM,cAAc,kCAAmC,CAAC;AAE/D,oBAAY,aAAa,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"addressFormat.d.ts","sourceRoot":"","sources":["../../src/addressFormat.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAA8B,OAAO,EAAY,MAAM,YAAY,CAAC;AAK3E,eAAO,MAAM,cAAc,kCAAmC,CAAC;AAE/D,oBAAY,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAQzF;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAYhH;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAYzG;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,aAAa,EAAE,GACxB,CAAC,aAAa,EAAE,MAAM,CAAC,CAczB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,MAAM,CAG7G;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3E"}
|
|
@@ -107,4 +107,4 @@ function toCanonicalFormat(address, network) {
|
|
|
107
107
|
return address_1.fromOutputScript(toOutputScriptTryFormats(address, network), network);
|
|
108
108
|
}
|
|
109
109
|
exports.toCanonicalFormat = toCanonicalFormat;
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGRyZXNzRm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ0gseUNBQTJFO0FBQzNFLHVDQUE2RDtBQUU3RCxtQ0FBdUM7QUFFMUIsUUFBQSxjQUFjLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFJL0Q7Ozs7R0FJRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE1BQXFCLEVBQUUsT0FBZ0I7SUFDOUUsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLFNBQVM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8sQ0FBQyxtQkFBUSxDQUFDLFdBQVcsRUFBRSxtQkFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDL0U7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFSRCw0REFRQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsWUFBb0IsRUFBRSxNQUFxQixFQUFFLE9BQWdCO0lBQ3RHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxnQkFBZ0IseUJBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDaEc7SUFFRCxRQUFRLHFCQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDM0IsS0FBSyxtQkFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQixLQUFLLG1CQUFRLENBQUMsS0FBSztZQUNqQixPQUFPLG9CQUFZLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRjtZQUNFLE9BQU8sMEJBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2xEO0FBQ0gsQ0FBQztBQVpELGdFQVlDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFlLEVBQUUsTUFBcUIsRUFBRSxPQUFnQjtJQUMvRixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLE1BQU0sZ0JBQWdCLHlCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hHO0lBRUQsUUFBUSxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLEtBQUssbUJBQVEsQ0FBQyxXQUFXLENBQUM7UUFDMUIsS0FBSyxtQkFBUSxDQUFDLEtBQUs7WUFDakIsT0FBTyxvQkFBWSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekU7WUFDRSxPQUFPLHdCQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQVpELDREQVlDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLE9BQWUsRUFDZixPQUFnQixFQUNoQixPQUF5QjtJQUV6QixJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ1osT0FBTyxHQUFHLHNCQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUM5RTtJQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1FBQzVCLElBQUk7WUFDRixPQUFPLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsV0FBVztTQUNaO0tBQ0Y7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFsQkQsMERBa0JDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsT0FBZSxFQUFFLE9BQWdCLEVBQUUsT0FBeUI7SUFDbkcsTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBSEQsNERBR0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBZSxFQUFFLE9BQWdCO0lBQ2pFLE9BQU8sMEJBQWdCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFGRCw4Q0FFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW1wbGVtZW50cyBtZXRob2RzIGZvciBub25zdGFuZGFyZCAobm9uLWNhbm9uaWNhbCkgYWRkcmVzcyBmb3JtYXRzLlxuICpcbiAqIFVzZSBgdG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKClgIGluc3RlYWQgb2YgYHRvT3V0cHV0U2NyaXB0KClgIHRvIHBhcnNlIGFkZHJlc3NlcyBpblxuICogbm9uLWNhbm9uaWNhbCBmb3JtYXRzXG4gKi9cbmltcG9ydCB7IGdldE1haW5uZXQsIGdldE5ldHdvcmtOYW1lLCBOZXR3b3JrLCBuZXR3b3JrcyB9IGZyb20gJy4vbmV0d29ya3MnO1xuaW1wb3J0IHsgZnJvbU91dHB1dFNjcmlwdCwgdG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuL2FkZHJlc3MnO1xuXG5pbXBvcnQgeyBiY2FzaEFkZHJlc3MgfSBmcm9tICcuL2JpdGdvJztcblxuZXhwb3J0IGNvbnN0IGFkZHJlc3NGb3JtYXRzID0gWydkZWZhdWx0JywgJ2Nhc2hhZGRyJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFkZHJlc3NGb3JtYXQgPSAodHlwZW9mIGFkZHJlc3NGb3JtYXRzKVtudW1iZXJdO1xuXG4vKipcbiAqIEBwYXJhbSBmb3JtYXRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIHRydWUgaWZmIGZvcm1hdCBpcyBzdXBwb3J0ZWQgZm9yIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VwcG9ydGVkQWRkcmVzc0Zvcm1hdChmb3JtYXQ6IEFkZHJlc3NGb3JtYXQsIG5ldHdvcms6IE5ldHdvcmspOiBib29sZWFuIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlICdkZWZhdWx0JzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ2Nhc2hhZGRyJzpcbiAgICAgIHJldHVybiBbbmV0d29ya3MuYml0Y29pbmNhc2gsIG5ldHdvcmtzLmVjYXNoXS5pbmNsdWRlcyhnZXRNYWlubmV0KG5ldHdvcmspKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gYWRkcmVzcyBmb3JtYXQgJHtmb3JtYXR9YCk7XG59XG5cbi8qKlxuICogQHBhcmFtIG91dHB1dFNjcmlwdFxuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4gYWRkcmVzcyBmb3JtYXR0ZWQgdXNpbmcgcHJvdmlkZWQgQWRkcmVzc0Zvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU91dHB1dFNjcmlwdFdpdGhGb3JtYXQob3V0cHV0U2NyaXB0OiBCdWZmZXIsIGZvcm1hdDogQWRkcmVzc0Zvcm1hdCwgbmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIGlmICghaXNTdXBwb3J0ZWRBZGRyZXNzRm9ybWF0KGZvcm1hdCwgbmV0d29yaykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGFkZHJlc3MgZm9ybWF0ICR7Zm9ybWF0fSBmb3IgbmV0d29yayAke2dldE5ldHdvcmtOYW1lKG5ldHdvcmspfWApO1xuICB9XG5cbiAgc3dpdGNoIChnZXRNYWlubmV0KG5ldHdvcmspKSB7XG4gICAgY2FzZSBuZXR3b3Jrcy5iaXRjb2luY2FzaDpcbiAgICBjYXNlIG5ldHdvcmtzLmVjYXNoOlxuICAgICAgcmV0dXJuIGJjYXNoQWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChvdXRwdXRTY3JpcHQsIGZvcm1hdCwgbmV0d29yayk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgbmV0d29yayk7XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0gYWRkcmVzc1xuICogQHBhcmFtIGZvcm1hdFxuICogQHBhcmFtIG5ldHdvcmtcbiAqIEByZXR1cm4gb3V0cHV0IHNjcmlwdCBwYXJzZWQgd2l0aCBwcm92aWRlZCBBZGRyZXNzRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdFdpdGhGb3JtYXQoYWRkcmVzczogc3RyaW5nLCBmb3JtYXQ6IEFkZHJlc3NGb3JtYXQsIG5ldHdvcms6IE5ldHdvcmspOiBCdWZmZXIge1xuICBpZiAoIWlzU3VwcG9ydGVkQWRkcmVzc0Zvcm1hdChmb3JtYXQsIG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhZGRyZXNzIGZvcm1hdCAke2Zvcm1hdH0gZm9yIG5ldHdvcmsgJHtnZXROZXR3b3JrTmFtZShuZXR3b3JrKX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAoZ2V0TWFpbm5ldChuZXR3b3JrKSkge1xuICAgIGNhc2UgbmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgY2FzZSBuZXR3b3Jrcy5lY2FzaDpcbiAgICAgIHJldHVybiBiY2FzaEFkZHJlc3MudG9PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KGFkZHJlc3MsIGZvcm1hdCwgbmV0d29yayk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0b091dHB1dFNjcmlwdChhZGRyZXNzLCBuZXR3b3JrKTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIHBhcnNlIGFkZHJlc3Mgd2l0aCBkaWZmZXJlbnQgYWRkcmVzcyBmb3JtYXRzLCByZXR1cm5zIGZpcnN0IGhpdC5cbiAqIEBwYXJhbSBhZGRyZXNzXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHBhcmFtIGZvcm1hdHMgLSBkZWZhdWx0cyB0byBhbGwgc3VwcG9ydGVkIGFkZHJlc3MgZm9ybWF0cyBmb3IgbmV0d29ya1xuICogQHJldHVybiB0dXBsZSB3aXRoIFtBZGRyZXNzRm9ybWF0LCBCdWZmZXJdIGNvbnRhaW5pbmcgZm9ybWF0IGFuZCBwYXJzZWQgb3V0cHV0IHNjcmlwdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXQoXG4gIGFkZHJlc3M6IHN0cmluZyxcbiAgbmV0d29yazogTmV0d29yayxcbiAgZm9ybWF0cz86IEFkZHJlc3NGb3JtYXRbXVxuKTogW0FkZHJlc3NGb3JtYXQsIEJ1ZmZlcl0ge1xuICBpZiAoIWZvcm1hdHMpIHtcbiAgICBmb3JtYXRzID0gYWRkcmVzc0Zvcm1hdHMuZmlsdGVyKChmKSA9PiBpc1N1cHBvcnRlZEFkZHJlc3NGb3JtYXQoZiwgbmV0d29yaykpO1xuICB9XG5cbiAgZm9yIChjb25zdCBmb3JtYXQgb2YgZm9ybWF0cykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gW2Zvcm1hdCwgdG9PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KGFkZHJlc3MsIGZvcm1hdCwgbmV0d29yayldO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHRyeSBuZXh0XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBjb3VsZCBub3QgcGFyc2Ugb3V0cHV0U2NyaXB0IFtmb3JtYXRzPSR7Zm9ybWF0c31dYCk7XG59XG5cbi8qKlxuICogU2FtZSBhcyBgdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXRgLCBvbmx5IHJldHVybmluZyBzY3JpcHRcbiAqIEBwYXJhbSBhZGRyZXNzIC0ge0BzZWUgdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXR9XG4gKiBAcGFyYW0gbmV0d29yayAtIHtAc2VlIHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0fVxuICogQHBhcmFtIGZvcm1hdHMgLSB7QHNlZSB0b091dHB1dFNjcmlwdEFuZEZvcm1hdH1cbiAqIEByZXR1cm4gcGFyc2VkIG91dHB1dCBzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cyhhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IE5ldHdvcmssIGZvcm1hdHM/OiBBZGRyZXNzRm9ybWF0W10pOiBCdWZmZXIge1xuICBjb25zdCBbLCBvdXRwdXRTY3JpcHRdID0gdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXQoYWRkcmVzcywgbmV0d29yaywgZm9ybWF0cyk7XG4gIHJldHVybiBvdXRwdXRTY3JpcHQ7XG59XG5cbi8qKlxuICogQHBhcmFtIGFkZHJlc3NcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIGFkZHJlc3MgaW4gY2Fub25pY2FsIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW5vbmljYWxGb3JtYXQoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBOZXR3b3JrKTogc3RyaW5nIHtcbiAgcmV0dXJuIGZyb21PdXRwdXRTY3JpcHQodG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGFkZHJlc3MsIG5ldHdvcmspLCBuZXR3b3JrKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare function readScalar(bytes: Uint8Array): bigint;
|
|
2
|
+
export declare function readSecret(bytes: Uint8Array): bigint;
|
|
3
|
+
export declare function isPoint(p: Uint8Array): boolean;
|
|
4
|
+
export declare function isXOnlyPoint(p: Uint8Array): boolean;
|
|
5
|
+
export declare function scalarAdd(a: Uint8Array, b: Uint8Array): Uint8Array;
|
|
6
|
+
export declare function scalarMultiply(a: Uint8Array, b: Uint8Array): Uint8Array;
|
|
7
|
+
export declare function scalarNegate(a: Uint8Array): Uint8Array;
|
|
8
|
+
export declare function scalarMod(a: Uint8Array): Uint8Array;
|
|
9
|
+
export declare function isScalar(t: Uint8Array): boolean;
|
|
10
|
+
export declare function isSecret(s: Uint8Array): boolean;
|
|
11
|
+
export declare function pointNegate(p: Uint8Array): Uint8Array;
|
|
12
|
+
export declare function pointX(p: Uint8Array): Uint8Array;
|
|
13
|
+
export declare function hasEvenY(p: Uint8Array): boolean;
|
|
14
|
+
//# sourceMappingURL=base_crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base_crypto.d.ts","sourceRoot":"","sources":["../../src/base_crypto.ts"],"names":[],"mappings":"AA4CA,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAkCD,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAqB9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAOnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKlE;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,GAAG,UAAU,CAKvE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAItD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAInD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAO/C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAcrD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAIhD;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG,OAAO,CAW/C"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// BigInt / Uint8Array versions of Crypto functions that do not require point
|
|
3
|
+
// math. If your JS interpreter has BigInt, you can use all of these. If not,
|
|
4
|
+
// you'll need to either shim it in or override more of these functions.
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.hasEvenY = exports.pointX = exports.pointNegate = exports.isSecret = exports.isScalar = exports.scalarMod = exports.scalarNegate = exports.scalarMultiply = exports.scalarAdd = exports.isXOnlyPoint = exports.isPoint = exports.readSecret = exports.readScalar = void 0;
|
|
7
|
+
// Idea from noble-secp256k1, be nice to bad JS parsers
|
|
8
|
+
const _0n = BigInt(0);
|
|
9
|
+
const _1n = BigInt(1);
|
|
10
|
+
const _2n = BigInt(2);
|
|
11
|
+
const _3n = BigInt(3);
|
|
12
|
+
const _5n = BigInt(5);
|
|
13
|
+
const _7n = BigInt(7);
|
|
14
|
+
const _64n = BigInt(64);
|
|
15
|
+
const _64mask = BigInt('0xFFFFFFFFFFFFFFFF');
|
|
16
|
+
const MAX_INT = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
|
|
17
|
+
const CURVE = {
|
|
18
|
+
b: BigInt(7),
|
|
19
|
+
P: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F'),
|
|
20
|
+
n: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'),
|
|
21
|
+
};
|
|
22
|
+
// Big Endian
|
|
23
|
+
function read32b(bytes) {
|
|
24
|
+
if (bytes.length !== 32)
|
|
25
|
+
throw new Error(`Expected 32-bytes, not ${bytes.length}`);
|
|
26
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
|
|
27
|
+
let b = view.getBigUint64(0);
|
|
28
|
+
for (let offs = 8; offs < bytes.length; offs += 8) {
|
|
29
|
+
b <<= _64n;
|
|
30
|
+
b += view.getBigUint64(offs);
|
|
31
|
+
}
|
|
32
|
+
return b;
|
|
33
|
+
}
|
|
34
|
+
function write32b(num, dest = new Uint8Array(32)) {
|
|
35
|
+
// All input values are modulo P or n, so no bounds checking needed
|
|
36
|
+
const view = new DataView(dest.buffer, dest.byteOffset, dest.length);
|
|
37
|
+
for (let offs = 24; offs >= 0; offs -= 8) {
|
|
38
|
+
view.setBigUint64(offs, num & _64mask);
|
|
39
|
+
num >>= _64n;
|
|
40
|
+
}
|
|
41
|
+
return dest;
|
|
42
|
+
}
|
|
43
|
+
function readScalar(bytes) {
|
|
44
|
+
const a = read32b(bytes);
|
|
45
|
+
if (a >= CURVE.n)
|
|
46
|
+
throw new Error('Expected value mod n');
|
|
47
|
+
return a;
|
|
48
|
+
}
|
|
49
|
+
exports.readScalar = readScalar;
|
|
50
|
+
function readSecret(bytes) {
|
|
51
|
+
const a = readScalar(bytes);
|
|
52
|
+
if (a === 0n)
|
|
53
|
+
throw new Error('Expected non-zero');
|
|
54
|
+
return a;
|
|
55
|
+
}
|
|
56
|
+
exports.readSecret = readSecret;
|
|
57
|
+
// The short Weierstrass form curve equation simplifes to y^2 = x^3 + 7.
|
|
58
|
+
function secp256k1Right(x) {
|
|
59
|
+
const x2 = (x * x) % CURVE.P;
|
|
60
|
+
const x3 = (x2 * x) % CURVE.P;
|
|
61
|
+
return (x3 + CURVE.b) % CURVE.P;
|
|
62
|
+
}
|
|
63
|
+
// For prime P, the Jacobi Symbol of 'a' is 1 if and only if 'a' is a quadratic
|
|
64
|
+
// residue mod P, ie. there exists a value 'x' for whom x^2 = a.
|
|
65
|
+
function jacobiSymbol(a) {
|
|
66
|
+
if (a === _0n)
|
|
67
|
+
return 0; // Vanishingly improbable
|
|
68
|
+
let p = CURVE.P;
|
|
69
|
+
let sign = 1;
|
|
70
|
+
// This algorithm is fairly heavily optimized, so don't simplify it w/o benchmarking
|
|
71
|
+
for (;;) {
|
|
72
|
+
let and3;
|
|
73
|
+
// Handle runs of zeros efficiently w/o flipping sign each time
|
|
74
|
+
for (and3 = a & _3n; and3 === _0n; a >>= _2n, and3 = a & _3n)
|
|
75
|
+
;
|
|
76
|
+
// If there's one more zero, shift it off and flip the sign
|
|
77
|
+
if (and3 === _2n) {
|
|
78
|
+
a >>= _1n;
|
|
79
|
+
const pand7 = p & _7n;
|
|
80
|
+
if (pand7 === _3n || pand7 === _5n)
|
|
81
|
+
sign = -sign;
|
|
82
|
+
}
|
|
83
|
+
if (a === _1n)
|
|
84
|
+
break;
|
|
85
|
+
if ((_3n & a) === _3n && (_3n & p) === _3n)
|
|
86
|
+
sign = -sign;
|
|
87
|
+
[a, p] = [p % a, a];
|
|
88
|
+
}
|
|
89
|
+
return sign > 0 ? 1 : -1;
|
|
90
|
+
}
|
|
91
|
+
function isPoint(p) {
|
|
92
|
+
if (p.length < 33)
|
|
93
|
+
return false;
|
|
94
|
+
const t = p[0];
|
|
95
|
+
if (p.length === 33) {
|
|
96
|
+
return (t === 0x02 || t === 0x03) && isXOnlyPoint(p.subarray(1));
|
|
97
|
+
}
|
|
98
|
+
if (t !== 0x04 || p.length !== 65)
|
|
99
|
+
return false;
|
|
100
|
+
const x = read32b(p.subarray(1, 33));
|
|
101
|
+
if (x === _0n)
|
|
102
|
+
return false;
|
|
103
|
+
if (x >= CURVE.P)
|
|
104
|
+
return false;
|
|
105
|
+
const y = read32b(p.subarray(33));
|
|
106
|
+
if (y === _0n)
|
|
107
|
+
return false;
|
|
108
|
+
if (y >= CURVE.P)
|
|
109
|
+
return false;
|
|
110
|
+
const left = (y * y) % CURVE.P;
|
|
111
|
+
const right = secp256k1Right(x);
|
|
112
|
+
return left === right;
|
|
113
|
+
}
|
|
114
|
+
exports.isPoint = isPoint;
|
|
115
|
+
function isXOnlyPoint(p) {
|
|
116
|
+
if (p.length !== 32)
|
|
117
|
+
return false;
|
|
118
|
+
const x = read32b(p);
|
|
119
|
+
if (x === _0n)
|
|
120
|
+
return false;
|
|
121
|
+
if (x >= CURVE.P)
|
|
122
|
+
return false;
|
|
123
|
+
const y2 = secp256k1Right(x);
|
|
124
|
+
return jacobiSymbol(y2) === 1; // If sqrt(y^2) exists, x is on the curve.
|
|
125
|
+
}
|
|
126
|
+
exports.isXOnlyPoint = isXOnlyPoint;
|
|
127
|
+
function scalarAdd(a, b) {
|
|
128
|
+
const aN = readScalar(a);
|
|
129
|
+
const bN = readScalar(b);
|
|
130
|
+
const sum = (aN + bN) % CURVE.n;
|
|
131
|
+
return write32b(sum);
|
|
132
|
+
}
|
|
133
|
+
exports.scalarAdd = scalarAdd;
|
|
134
|
+
function scalarMultiply(a, b) {
|
|
135
|
+
const aN = readScalar(a);
|
|
136
|
+
const bN = readScalar(b);
|
|
137
|
+
const product = (aN * bN) % CURVE.n;
|
|
138
|
+
return write32b(product);
|
|
139
|
+
}
|
|
140
|
+
exports.scalarMultiply = scalarMultiply;
|
|
141
|
+
function scalarNegate(a) {
|
|
142
|
+
const aN = readScalar(a);
|
|
143
|
+
const negated = aN === _0n ? _0n : CURVE.n - aN;
|
|
144
|
+
return write32b(negated);
|
|
145
|
+
}
|
|
146
|
+
exports.scalarNegate = scalarNegate;
|
|
147
|
+
function scalarMod(a) {
|
|
148
|
+
const aN = read32b(a);
|
|
149
|
+
const remainder = aN % CURVE.n;
|
|
150
|
+
return write32b(remainder);
|
|
151
|
+
}
|
|
152
|
+
exports.scalarMod = scalarMod;
|
|
153
|
+
function isScalar(t) {
|
|
154
|
+
try {
|
|
155
|
+
readScalar(t);
|
|
156
|
+
return true;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.isScalar = isScalar;
|
|
163
|
+
function isSecret(s) {
|
|
164
|
+
try {
|
|
165
|
+
readSecret(s);
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.isSecret = isSecret;
|
|
173
|
+
function pointNegate(p) {
|
|
174
|
+
// hasEvenY does basic structure check, so start there
|
|
175
|
+
const even = hasEvenY(p);
|
|
176
|
+
// `from` because node.Buffer.slice doesn't copy but looks like a Uint8Array
|
|
177
|
+
const negated = Uint8Array.from(p);
|
|
178
|
+
if (p.length === 33) {
|
|
179
|
+
negated[0] = even ? 3 : 2;
|
|
180
|
+
}
|
|
181
|
+
else if (p.length === 65) {
|
|
182
|
+
const y = read32b(p.subarray(33));
|
|
183
|
+
if (y >= CURVE.P)
|
|
184
|
+
throw new Error('Expected Y coordinate mod P');
|
|
185
|
+
const minusY = y === _0n ? _0n : CURVE.P - y;
|
|
186
|
+
write32b(minusY, negated.subarray(33));
|
|
187
|
+
}
|
|
188
|
+
return negated;
|
|
189
|
+
}
|
|
190
|
+
exports.pointNegate = pointNegate;
|
|
191
|
+
function pointX(p) {
|
|
192
|
+
if (p.length === 32)
|
|
193
|
+
return p;
|
|
194
|
+
hasEvenY(p); // hasEvenY throws if not well structured
|
|
195
|
+
return p.slice(1, 33);
|
|
196
|
+
}
|
|
197
|
+
exports.pointX = pointX;
|
|
198
|
+
function hasEvenY(p) {
|
|
199
|
+
if (p.length === 33) {
|
|
200
|
+
if (p[0] === 2)
|
|
201
|
+
return true;
|
|
202
|
+
else if (p[0] === 3)
|
|
203
|
+
return false;
|
|
204
|
+
else
|
|
205
|
+
throw new Error('Wrong first byte to be a point');
|
|
206
|
+
}
|
|
207
|
+
if (p.length === 65) {
|
|
208
|
+
if (p[0] !== 4)
|
|
209
|
+
throw new Error('Wrong first byte to be point');
|
|
210
|
+
return p[64] % 2 === 0;
|
|
211
|
+
}
|
|
212
|
+
throw new Error('Wrong length to be a point');
|
|
213
|
+
}
|
|
214
|
+
exports.hasEvenY = hasEvenY;
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jcnlwdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZV9jcnlwdG8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0Usd0VBQXdFOzs7QUFFeEUsdURBQXVEO0FBQ3ZELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN4QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUU3QyxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsb0VBQW9FLENBQUMsQ0FBQztBQUU3RixNQUFNLEtBQUssR0FBRztJQUNaLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQyxFQUFFLE1BQU0sQ0FBQyxvRUFBb0UsQ0FBQztJQUMvRSxDQUFDLEVBQUUsTUFBTSxDQUFDLG9FQUFvRSxDQUFDO0NBQ2hGLENBQUM7QUFFRixhQUFhO0FBQ2IsU0FBUyxPQUFPLENBQUMsS0FBaUI7SUFDaEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNuRixNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxL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SyxFQUFFO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUNBQXlDO0lBQ3RELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUpELHdCQUlDO0FBRUQsU0FBZ0IsUUFBUSxDQUFDLENBQWE7SUFDcEMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUNuQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7YUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDOztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ25CLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDaEUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN4QjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBWEQsNEJBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCaWdJbnQgLyBVaW50OEFycmF5IHZlcnNpb25zIG9mIENyeXB0byBmdW5jdGlvbnMgdGhhdCBkbyBub3QgcmVxdWlyZSBwb2ludFxuLy8gbWF0aC4gSWYgeW91ciBKUyBpbnRlcnByZXRlciBoYXMgQmlnSW50LCB5b3UgY2FuIHVzZSBhbGwgb2YgdGhlc2UuIElmIG5vdCxcbi8vIHlvdSdsbCBuZWVkIHRvIGVpdGhlciBzaGltIGl0IGluIG9yIG92ZXJyaWRlIG1vcmUgb2YgdGhlc2UgZnVuY3Rpb25zLlxuXG4vLyBJZGVhIGZyb20gbm9ibGUtc2VjcDI1NmsxLCBiZSBuaWNlIHRvIGJhZCBKUyBwYXJzZXJzXG5jb25zdCBfMG4gPSBCaWdJbnQoMCk7XG5jb25zdCBfMW4gPSBCaWdJbnQoMSk7XG5jb25zdCBfMm4gPSBCaWdJbnQoMik7XG5jb25zdCBfM24gPSBCaWdJbnQoMyk7XG5jb25zdCBfNW4gPSBCaWdJbnQoNSk7XG5jb25zdCBfN24gPSBCaWdJbnQoNyk7XG5jb25zdCBfNjRuID0gQmlnSW50KDY0KTtcbmNvbnN0IF82NG1hc2sgPSBCaWdJbnQoJzB4RkZGRkZGRkZGRkZGRkZGRicpO1xuXG5jb25zdCBNQVhfSU5UID0gQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYnKTtcblxuY29uc3QgQ1VSVkUgPSB7XG4gIGI6IEJpZ0ludCg3KSxcbiAgUDogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZDMkYnKSxcbiAgbjogQmlnSW50KCcweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFQkFBRURDRTZBRjQ4QTAzQkJGRDI1RThDRDAzNjQxNDEnKSxcbn07XG5cbi8vIEJpZyBFbmRpYW5cbmZ1bmN0aW9uIHJlYWQzMmIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBpZiAoYnl0ZXMubGVuZ3RoICE9PSAzMikgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMi1ieXRlcywgbm90ICR7Ynl0ZXMubGVuZ3RofWApO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgbGV0IGIgPSB2aWV3LmdldEJpZ1VpbnQ2NCgwKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDg7IG9mZnMgPCBieXRlcy5sZW5ndGg7IG9mZnMgKz0gOCkge1xuICAgIGIgPDw9IF82NG47XG4gICAgYiArPSB2aWV3LmdldEJpZ1VpbnQ2NChvZmZzKTtcbiAgfVxuICByZXR1cm4gYjtcbn1cblxuZnVuY3Rpb24gd3JpdGUzMmIobnVtOiBiaWdpbnQsIGRlc3Q6IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgzMikpOiBVaW50OEFycmF5IHtcbiAgLy8gQWxsIGlucHV0IHZhbHVlcyBhcmUgbW9kdWxvIFAgb3Igbiwgc28gbm8gYm91bmRzIGNoZWNraW5nIG5lZWRlZFxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGRlc3QuYnVmZmVyLCBkZXN0LmJ5dGVPZmZzZXQsIGRlc3QubGVuZ3RoKTtcbiAgZm9yIChsZXQgb2ZmcyA9IDI0OyBvZmZzID49IDA7IG9mZnMgLT0gOCkge1xuICAgIHZpZXcuc2V0QmlnVWludDY0KG9mZnMsIG51bSAmIF82NG1hc2spO1xuICAgIG51bSA+Pj0gXzY0bjtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTY2FsYXIoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBiaWdpbnQge1xuICBjb25zdCBhID0gcmVhZDMyYihieXRlcyk7XG4gIGlmIChhID49IENVUlZFLm4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFsdWUgbW9kIG4nKTtcbiAgcmV0dXJuIGE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFkU2VjcmV0KGJ5dGVzOiBVaW50OEFycmF5KTogYmlnaW50IHtcbiAgY29uc3QgYSA9IHJlYWRTY2FsYXIoYnl0ZXMpO1xuICBpZiAoYSA9PT0gMG4pIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgbm9uLXplcm8nKTtcbiAgcmV0dXJuIGE7XG59XG5cbi8vIFRoZSBzaG9ydCBXZWllcnN0cmFzcyBmb3JtIGN1cnZlIGVxdWF0aW9uIHNpbXBsaWZlcyB0byB5XjIgPSB4XjMgKyA3LlxuZnVuY3Rpb24gc2VjcDI1NmsxUmlnaHQoeDogYmlnaW50KTogYmlnaW50IHtcbiAgY29uc3QgeDIgPSAoeCAqIHgpICUgQ1VSVkUuUDtcbiAgY29uc3QgeDMgPSAoeDIgKiB4KSAlIENVUlZFLlA7XG4gIHJldHVybiAoeDMgKyBDVVJWRS5iKSAlIENVUlZFLlA7XG59XG5cbi8vIEZvciBwcmltZSBQLCB0aGUgSmFjb2JpIFN5bWJvbCBvZiAnYScgaXMgMSBpZiBhbmQgb25seSBpZiAnYScgaXMgYSBxdWFkcmF0aWNcbi8vIHJlc2lkdWUgbW9kIFAsIGllLiB0aGVyZSBleGlzdHMgYSB2YWx1ZSAneCcgZm9yIHdob20geF4yID0gYS5cbmZ1bmN0aW9uIGphY29iaVN5bWJvbChhOiBiaWdpbnQpOiAtMSB8IDAgfCAxIHtcbiAgaWYgKGEgPT09IF8wbikgcmV0dXJuIDA7IC8vIFZhbmlzaGluZ2x5IGltcHJvYmFibGVcblxuICBsZXQgcCA9IENVUlZFLlA7XG4gIGxldCBzaWduID0gMTtcbiAgLy8gVGhpcyBhbGdvcml0aG0gaXMgZmFpcmx5IGhlYXZpbHkgb3B0aW1pemVkLCBzbyBkb24ndCBzaW1wbGlmeSBpdCB3L28gYmVuY2htYXJraW5nXG4gIGZvciAoOzspIHtcbiAgICBsZXQgYW5kMztcbiAgICAvLyBIYW5kbGUgcnVucyBvZiB6ZXJvcyBlZmZpY2llbnRseSB3L28gZmxpcHBpbmcgc2lnbiBlYWNoIHRpbWVcbiAgICBmb3IgKGFuZDMgPSBhICYgXzNuOyBhbmQzID09PSBfMG47IGEgPj49IF8ybiwgYW5kMyA9IGEgJiBfM24pO1xuICAgIC8vIElmIHRoZXJlJ3Mgb25lIG1vcmUgemVybywgc2hpZnQgaXQgb2ZmIGFuZCBmbGlwIHRoZSBzaWduXG4gICAgaWYgKGFuZDMgPT09IF8ybikge1xuICAgICAgYSA+Pj0gXzFuO1xuICAgICAgY29uc3QgcGFuZDcgPSBwICYgXzduO1xuICAgICAgaWYgKHBhbmQ3ID09PSBfM24gfHwgcGFuZDcgPT09IF81bikgc2lnbiA9IC1zaWduO1xuICAgIH1cbiAgICBpZiAoYSA9PT0gXzFuKSBicmVhaztcbiAgICBpZiAoKF8zbiAmIGEpID09PSBfM24gJiYgKF8zbiAmIHApID09PSBfM24pIHNpZ24gPSAtc2lnbjtcbiAgICBbYSwgcF0gPSBbcCAlIGEsIGFdO1xuICB9XG4gIHJldHVybiBzaWduID4gMCA/IDEgOiAtMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUG9pbnQocDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICBpZiAocC5sZW5ndGggPCAzMykgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHQgPSBwWzBdO1xuICBpZiAocC5sZW5ndGggPT09IDMzKSB7XG4gICAgcmV0dXJuICh0ID09PSAweDAyIHx8IHQgPT09IDB4MDMpICYmIGlzWE9ubHlQb2ludChwLnN1YmFycmF5KDEpKTtcbiAgfVxuXG4gIGlmICh0ICE9PSAweDA0IHx8IHAubGVuZ3RoICE9PSA2NSkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IHggPSByZWFkMzJiKHAuc3ViYXJyYXkoMSwgMzMpKTtcbiAgaWYgKHggPT09IF8wbikgcmV0dXJuIGZhbHNlO1xuICBpZiAoeCA+PSBDVVJWRS5QKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgeSA9IHJlYWQzMmIocC5zdWJhcnJheSgzMykpO1xuICBpZiAoeSA9PT0gXzBuKSByZXR1cm4gZmFsc2U7XG4gIGlmICh5ID49IENVUlZFLlApIHJldHVybiBmYWxzZTtcblxuICBjb25zdCBsZWZ0ID0gKHkgKiB5KSAlIENVUlZFLlA7XG4gIGNvbnN0IHJpZ2h0ID0gc2VjcDI1NmsxUmlnaHQoeCk7XG4gIHJldHVybiBsZWZ0ID09PSByaWdodDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzWE9ubHlQb2ludChwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCAhPT0gMzIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgeCA9IHJlYWQzMmIocCk7XG4gIGlmICh4ID09PSBfMG4pIHJldHVybiBmYWxzZTtcbiAgaWYgKHggPj0gQ1VSVkUuUCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCB5MiA9IHNlY3AyNTZrMVJpZ2h0KHgpO1xuICByZXR1cm4gamFjb2JpU3ltYm9sKHkyKSA9PT0gMTsgLy8gSWYgc3FydCh5XjIpIGV4aXN0cywgeCBpcyBvbiB0aGUgY3VydmUuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJBZGQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICBjb25zdCBhTiA9IHJlYWRTY2FsYXIoYSk7XG4gIGNvbnN0IGJOID0gcmVhZFNjYWxhcihiKTtcbiAgY29uc3Qgc3VtID0gKGFOICsgYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHN1bSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsYXJNdWx0aXBseShhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gIGNvbnN0IGFOID0gcmVhZFNjYWxhcihhKTtcbiAgY29uc3QgYk4gPSByZWFkU2NhbGFyKGIpO1xuICBjb25zdCBwcm9kdWN0ID0gKGFOICogYk4pICUgQ1VSVkUubjtcbiAgcmV0dXJuIHdyaXRlMzJiKHByb2R1Y3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTmVnYXRlKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkU2NhbGFyKGEpO1xuICBjb25zdCBuZWdhdGVkID0gYU4gPT09IF8wbiA/IF8wbiA6IENVUlZFLm4gLSBhTjtcbiAgcmV0dXJuIHdyaXRlMzJiKG5lZ2F0ZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyTW9kKGE6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgY29uc3QgYU4gPSByZWFkMzJiKGEpO1xuICBjb25zdCByZW1haW5kZXIgPSBhTiAlIENVUlZFLm47XG4gIHJldHVybiB3cml0ZTMyYihyZW1haW5kZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXIodDogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTY2FsYXIodCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTZWNyZXQoczogVWludDhBcnJheSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJlYWRTZWNyZXQocyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnROZWdhdGUocDogVWludDhBcnJheSk6IFVpbnQ4QXJyYXkge1xuICAvLyBoYXNFdmVuWSBkb2VzIGJhc2ljIHN0cnVjdHVyZSBjaGVjaywgc28gc3RhcnQgdGhlcmVcbiAgY29uc3QgZXZlbiA9IGhhc0V2ZW5ZKHApO1xuICAvLyBgZnJvbWAgYmVjYXVzZSBub2RlLkJ1ZmZlci5zbGljZSBkb2Vzbid0IGNvcHkgYnV0IGxvb2tzIGxpa2UgYSBVaW50OEFycmF5XG4gIGNvbnN0IG5lZ2F0ZWQgPSBVaW50OEFycmF5LmZyb20ocCk7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBuZWdhdGVkWzBdID0gZXZlbiA/IDMgOiAyO1xuICB9IGVsc2UgaWYgKHAubGVuZ3RoID09PSA2NSkge1xuICAgIGNvbnN0IHkgPSByZWFkMzJiKHAuc3ViYXJyYXkoMzMpKTtcbiAgICBpZiAoeSA+PSBDVVJWRS5QKSB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIFkgY29vcmRpbmF0ZSBtb2QgUCcpO1xuICAgIGNvbnN0IG1pbnVzWSA9IHkgPT09IF8wbiA/IF8wbiA6IENVUlZFLlAgLSB5O1xuICAgIHdyaXRlMzJiKG1pbnVzWSwgbmVnYXRlZC5zdWJhcnJheSgzMykpO1xuICB9XG4gIHJldHVybiBuZWdhdGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRYKHA6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgaWYgKHAubGVuZ3RoID09PSAzMikgcmV0dXJuIHA7XG4gIGhhc0V2ZW5ZKHApOyAvLyBoYXNFdmVuWSB0aHJvd3MgaWYgbm90IHdlbGwgc3RydWN0dXJlZFxuICByZXR1cm4gcC5zbGljZSgxLCAzMyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNFdmVuWShwOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIGlmIChwLmxlbmd0aCA9PT0gMzMpIHtcbiAgICBpZiAocFswXSA9PT0gMikgcmV0dXJuIHRydWU7XG4gICAgZWxzZSBpZiAocFswXSA9PT0gMykgcmV0dXJuIGZhbHNlO1xuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBmaXJzdCBieXRlIHRvIGJlIGEgcG9pbnQnKTtcbiAgfVxuICBpZiAocC5sZW5ndGggPT09IDY1KSB7XG4gICAgaWYgKHBbMF0gIT09IDQpIHRocm93IG5ldyBFcnJvcignV3JvbmcgZmlyc3QgYnl0ZSB0byBiZSBwb2ludCcpO1xuICAgIHJldHVybiBwWzY0XSAlIDIgPT09IDA7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdXcm9uZyBsZW5ndGggdG8gYmUgYSBwb2ludCcpO1xufVxuIl19
|
|
@@ -1,51 +1,149 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
import {
|
|
3
|
-
import { BIP32Interface } from 'bip32';
|
|
2
|
+
import { SessionKey } from '@brandonblack/musig';
|
|
4
3
|
import { Tuple } from './types';
|
|
4
|
+
import { PsbtInput } from 'bip174/src/lib/interfaces';
|
|
5
|
+
import { ProprietaryKeyValue } from './PsbtUtil';
|
|
5
6
|
/**
|
|
6
7
|
* Participant key value object.
|
|
7
8
|
*/
|
|
8
|
-
export interface
|
|
9
|
+
export interface PsbtMusig2Participants {
|
|
9
10
|
tapOutputKey: Buffer;
|
|
10
11
|
tapInternalKey: Buffer;
|
|
11
12
|
participantPubKeys: Tuple<Buffer>;
|
|
12
13
|
}
|
|
14
|
+
export interface PsbtMusig2DeterministicParams {
|
|
15
|
+
privateKey: Buffer;
|
|
16
|
+
otherNonce: Buffer;
|
|
17
|
+
publicKeys: Tuple<Buffer>;
|
|
18
|
+
internalPubKey: Buffer;
|
|
19
|
+
tapTreeRoot: Buffer;
|
|
20
|
+
hash: Buffer;
|
|
21
|
+
}
|
|
13
22
|
/**
|
|
14
23
|
* Nonce key value object.
|
|
15
24
|
*/
|
|
16
|
-
export interface
|
|
25
|
+
export interface PsbtMusig2PubNonce {
|
|
17
26
|
participantPubKey: Buffer;
|
|
18
27
|
tapOutputKey: Buffer;
|
|
19
|
-
|
|
28
|
+
pubNonce: Buffer;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Partial signature key value object.
|
|
32
|
+
*/
|
|
33
|
+
export interface PsbtMusig2PartialSig {
|
|
34
|
+
participantPubKey: Buffer;
|
|
35
|
+
tapOutputKey: Buffer;
|
|
36
|
+
partialSig: Buffer;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Because musig uses reference-equal buffers to cache nonces, we wrap it here to allow using
|
|
40
|
+
* nonces that are byte-equal but not reference-equal.
|
|
41
|
+
*/
|
|
42
|
+
export declare class Musig2NonceStore {
|
|
43
|
+
private nonces;
|
|
44
|
+
/**
|
|
45
|
+
* Get original Buffer instance for nonce (which may be a copy).
|
|
46
|
+
* @return byte-equal buffer that is reference-equal to what was stored earlier in createMusig2Nonce
|
|
47
|
+
*/
|
|
48
|
+
getRef(nonce: Uint8Array): Uint8Array;
|
|
49
|
+
/**
|
|
50
|
+
* Creates musig2 nonce and stores buffer reference.
|
|
51
|
+
* tapInternalkey, tapMerkleRoot, tapBip32Derivation for rootWalletKey are required per p2trMusig2 key path input.
|
|
52
|
+
* Also participant keys are required from psbt proprietary key values.
|
|
53
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
54
|
+
* @param privateKey - signer private key
|
|
55
|
+
* @param publicKey - signer xy public key
|
|
56
|
+
* @param xOnlyPublicKey - tweaked aggregated key (tapOutputKey)
|
|
57
|
+
* @param sessionId Additional entropy. If provided it must either be a counter unique to this secret key,
|
|
58
|
+
* (converted to an array of 32 bytes), or 32 uniformly random bytes.
|
|
59
|
+
*/
|
|
60
|
+
createMusig2Nonce(privateKey: Uint8Array, publicKey: Uint8Array, xOnlyPublicKey: Uint8Array, txHash: Uint8Array, sessionId?: Buffer): Uint8Array;
|
|
20
61
|
}
|
|
21
62
|
/**
|
|
22
63
|
* Psbt proprietary key val util function for participants pub keys. SubType is 0x01
|
|
23
64
|
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
24
65
|
* @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
|
|
25
66
|
*/
|
|
26
|
-
export declare function
|
|
67
|
+
export declare function encodePsbtMusig2Participants(participants: PsbtMusig2Participants): ProprietaryKeyValue;
|
|
27
68
|
/**
|
|
28
69
|
* Psbt proprietary key val util function for pub nonce. SubType is 0x02
|
|
29
70
|
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
30
71
|
* @return plain-participantPubKey||x-only-tapOutputKey as sub keydata, 66 bytes of 2 pub nonces as valuedata
|
|
31
72
|
*/
|
|
32
|
-
export declare function
|
|
73
|
+
export declare function encodePsbtMusig2PubNonce(nonce: PsbtMusig2PubNonce): ProprietaryKeyValue;
|
|
74
|
+
export declare function encodePsbtMusig2PartialSig(partialSig: PsbtMusig2PartialSig): ProprietaryKeyValue;
|
|
33
75
|
/**
|
|
34
76
|
* Decodes proprietary key value data for participant pub keys
|
|
35
77
|
* @param kv
|
|
36
78
|
*/
|
|
37
|
-
export declare function
|
|
79
|
+
export declare function decodePsbtMusig2Participants(kv: ProprietaryKeyValue): PsbtMusig2Participants;
|
|
80
|
+
/**
|
|
81
|
+
* Decodes proprietary key value data for musig2 nonce
|
|
82
|
+
* @param kv
|
|
83
|
+
*/
|
|
84
|
+
export declare function decodePsbtMusig2Nonce(kv: ProprietaryKeyValue): PsbtMusig2PubNonce;
|
|
85
|
+
/**
|
|
86
|
+
* Decodes proprietary key value data for musig2 partial sig
|
|
87
|
+
* @param kv
|
|
88
|
+
*/
|
|
89
|
+
export declare function decodePsbtMusig2PartialSig(kv: ProprietaryKeyValue): PsbtMusig2PartialSig;
|
|
38
90
|
export declare function createTapInternalKey(plainPubKeys: Buffer[]): Buffer;
|
|
39
91
|
export declare function createTapOutputKey(internalPubKey: Buffer, tapTreeRoot: Buffer): Buffer;
|
|
92
|
+
export declare function createAggregateNonce(pubNonces: Tuple<Buffer>): Buffer;
|
|
93
|
+
export declare function createTapTweak(tapInternalKey: Buffer, tapMerkleRoot: Buffer): Buffer;
|
|
94
|
+
export declare function musig2PartialSign(privateKey: Buffer, publicNonce: Uint8Array, sessionKey: SessionKey, nonceStore: Musig2NonceStore): Buffer;
|
|
95
|
+
export declare function musig2PartialSigVerify(sig: Buffer, publicKey: Buffer, publicNonce: Buffer, sessionKey: SessionKey): boolean;
|
|
96
|
+
export declare function musig2AggregateSigs(sigs: Buffer[], sessionKey: SessionKey): Buffer;
|
|
97
|
+
/** @return session key that can be used to reference the session later */
|
|
98
|
+
export declare function createMusig2SigningSession(sessionArgs: {
|
|
99
|
+
pubNonces: Tuple<Buffer>;
|
|
100
|
+
txHash: Buffer;
|
|
101
|
+
pubKeys: Tuple<Buffer>;
|
|
102
|
+
internalPubKey: Buffer;
|
|
103
|
+
tapTreeRoot: Buffer;
|
|
104
|
+
}): SessionKey;
|
|
40
105
|
/**
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
* @
|
|
47
|
-
*
|
|
48
|
-
|
|
106
|
+
* @returns psbt proprietary key for musig2 participant key value data
|
|
107
|
+
* If no key value exists, undefined is returned.
|
|
108
|
+
*/
|
|
109
|
+
export declare function parsePsbtMusig2Participants(input: PsbtInput): PsbtMusig2Participants | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* @returns psbt proprietary key for musig2 public nonce key value data
|
|
112
|
+
* If no key value exists, undefined is returned.
|
|
113
|
+
*/
|
|
114
|
+
export declare function parsePsbtMusig2Nonces(input: PsbtInput): PsbtMusig2PubNonce[] | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* @returns psbt proprietary key for musig2 partial sig key value data
|
|
117
|
+
* If no key value exists, undefined is returned.
|
|
118
|
+
*/
|
|
119
|
+
export declare function parsePsbtMusig2PartialSigs(input: PsbtInput): PsbtMusig2PartialSig[] | undefined;
|
|
120
|
+
/**
|
|
121
|
+
* Assert musig2 participant key value data with tapInternalKey and tapMerkleRoot.
|
|
122
|
+
* <tapOutputKey><tapInputKey> => <participantKey1><participantKey2>
|
|
123
|
+
* Using tapMerkleRoot and 2 participant keys, the tapInputKey is validated and using tapMerkleRoot and tapInputKey,
|
|
124
|
+
* the tapOutputKey is validated.
|
|
125
|
+
*/
|
|
126
|
+
export declare function assertPsbtMusig2Participants(participantKeyValData: PsbtMusig2Participants, tapInternalKey: Buffer, tapMerkleRoot: Buffer): void;
|
|
127
|
+
/**
|
|
128
|
+
* Assert musig2 public nonce key value data with participant key value data
|
|
129
|
+
* (refer assertPsbtMusig2ParticipantsKeyValData).
|
|
130
|
+
* <participantKey1><tapOutputKey> => <pubNonce1>
|
|
131
|
+
* <participantKey2><tapOutputKey> => <pubNonce2>
|
|
132
|
+
* Checks against participant keys and tapOutputKey
|
|
133
|
+
*/
|
|
134
|
+
export declare function assertPsbtMusig2Nonces(noncesKeyValData: PsbtMusig2PubNonce[], participantKeyValData: PsbtMusig2Participants): void;
|
|
135
|
+
/**
|
|
136
|
+
* @returns Input object but sig hash type data is taken out from partialSig field.
|
|
137
|
+
* If sig hash type is not common for all sigs, error out, otherwise returns the modified object and single hash type.
|
|
49
138
|
*/
|
|
50
|
-
export declare function
|
|
139
|
+
export declare function getSigHashTypeFromSigs(partialSigs: PsbtMusig2PartialSig[]): {
|
|
140
|
+
partialSigs: PsbtMusig2PartialSig[];
|
|
141
|
+
sigHashType: number;
|
|
142
|
+
};
|
|
143
|
+
export declare function createMusig2DeterministicNonce(params: PsbtMusig2DeterministicParams): Buffer;
|
|
144
|
+
export declare function musig2DeterministicSign(params: PsbtMusig2DeterministicParams): {
|
|
145
|
+
sig: Buffer;
|
|
146
|
+
sessionKey: SessionKey;
|
|
147
|
+
publicNonce: Buffer;
|
|
148
|
+
};
|
|
51
149
|
//# sourceMappingURL=Musig2.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Musig2.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Musig2.ts"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Musig2.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Musig2.ts"],"names":[],"mappings":"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"}
|