utxo-lib 1.0.8 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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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"}
|