utxo-lib 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/dist/src/address.d.ts +11 -0
- package/dist/src/address.d.ts.map +1 -0
- package/dist/src/address.js +37 -0
- package/dist/src/addressFormat.d.ts +53 -0
- package/dist/src/addressFormat.d.ts.map +1 -0
- package/dist/src/addressFormat.js +110 -0
- package/dist/src/bitgo/Musig2.d.ts +51 -0
- package/dist/src/bitgo/Musig2.d.ts.map +1 -0
- package/dist/src/bitgo/Musig2.js +175 -0
- package/dist/src/bitgo/Unspent.d.ts +95 -0
- package/dist/src/bitgo/Unspent.d.ts.map +1 -0
- package/dist/src/bitgo/Unspent.js +138 -0
- package/dist/src/bitgo/UtxoPsbt.d.ts +132 -0
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -0
- package/dist/src/bitgo/UtxoPsbt.js +469 -0
- package/dist/src/bitgo/UtxoTransaction.d.ts +22 -0
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -0
- package/dist/src/bitgo/UtxoTransaction.js +97 -0
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +26 -0
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -0
- package/dist/src/bitgo/UtxoTransactionBuilder.js +67 -0
- package/dist/src/bitgo/bbc/DashPsbt.d.ts +12 -0
- package/dist/src/bitgo/bbc/DashPsbt.d.ts.map +1 -0
- package/dist/src/bitgo/bbc/DashPsbt.js +27 -0
- package/dist/src/bitgo/bbc/DashTransaction.d.ts +39 -0
- package/dist/src/bitgo/bbc/DashTransaction.d.ts.map +1 -0
- package/dist/src/bitgo/bbc/DashTransaction.js +109 -0
- package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts +14 -0
- package/dist/src/bitgo/bbc/DashTransactionBuilder.d.ts.map +1 -0
- package/dist/src/bitgo/bbc/DashTransactionBuilder.js +28 -0
- package/dist/src/bitgo/bbc/index.d.ts +4 -0
- package/dist/src/bitgo/bbc/index.d.ts.map +1 -0
- package/dist/src/bitgo/bbc/index.js +16 -0
- package/dist/src/bitgo/bitcoincash/address.d.ts +35 -0
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -0
- package/dist/src/bitgo/bitcoincash/address.js +151 -0
- package/dist/src/bitgo/bitcoincash/index.d.ts +2 -0
- package/dist/src/bitgo/bitcoincash/index.d.ts.map +1 -0
- package/dist/src/bitgo/bitcoincash/index.js +14 -0
- package/dist/src/bitgo/dash/DashPsbt.d.ts +12 -0
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -0
- package/dist/src/bitgo/dash/DashPsbt.js +27 -0
- package/dist/src/bitgo/dash/DashTransaction.d.ts +39 -0
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -0
- package/dist/src/bitgo/dash/DashTransaction.js +109 -0
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +14 -0
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -0
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +28 -0
- package/dist/src/bitgo/dash/index.d.ts +4 -0
- package/dist/src/bitgo/dash/index.d.ts.map +1 -0
- package/dist/src/bitgo/dash/index.js +16 -0
- package/dist/src/bitgo/index.d.ts +17 -0
- package/dist/src/bitgo/index.d.ts.map +1 -0
- package/dist/src/bitgo/index.js +30 -0
- package/dist/src/bitgo/keyutil.d.ts +17 -0
- package/dist/src/bitgo/keyutil.d.ts.map +1 -0
- package/dist/src/bitgo/keyutil.js +37 -0
- package/dist/src/bitgo/nonStandardHalfSigned.d.ts +7 -0
- package/dist/src/bitgo/nonStandardHalfSigned.d.ts.map +1 -0
- package/dist/src/bitgo/nonStandardHalfSigned.js +56 -0
- package/dist/src/bitgo/outputScripts.d.ts +84 -0
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -0
- package/dist/src/bitgo/outputScripts.js +297 -0
- package/dist/src/bitgo/parseInput.d.ts +92 -0
- package/dist/src/bitgo/parseInput.d.ts.map +1 -0
- package/dist/src/bitgo/parseInput.js +344 -0
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +24 -0
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -0
- package/dist/src/bitgo/psbt/fromHalfSigned.js +91 -0
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +6 -0
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -0
- package/dist/src/bitgo/psbt/scriptTypes.js +23 -0
- package/dist/src/bitgo/signature.d.ts +84 -0
- package/dist/src/bitgo/signature.d.ts.map +1 -0
- package/dist/src/bitgo/signature.js +222 -0
- package/dist/src/bitgo/tnumber.d.ts +9 -0
- package/dist/src/bitgo/tnumber.d.ts.map +1 -0
- package/dist/src/bitgo/tnumber.js +31 -0
- package/dist/src/bitgo/transaction.d.ts +29 -0
- package/dist/src/bitgo/transaction.d.ts.map +1 -0
- package/dist/src/bitgo/transaction.js +247 -0
- package/dist/src/bitgo/types.d.ts +5 -0
- package/dist/src/bitgo/types.d.ts.map +1 -0
- package/dist/src/bitgo/types.js +12 -0
- package/dist/src/bitgo/wallet/Psbt.d.ts +47 -0
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/Psbt.js +232 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts +47 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/Unspent.js +154 -0
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +72 -0
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/WalletKeys.js +104 -0
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +18 -0
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/WalletOutput.js +69 -0
- package/dist/src/bitgo/wallet/WalletScripts.d.ts +7 -0
- package/dist/src/bitgo/wallet/WalletScripts.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/WalletScripts.js +15 -0
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +19 -0
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +47 -0
- package/dist/src/bitgo/wallet/chains.d.ts +57 -0
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/chains.js +106 -0
- package/dist/src/bitgo/wallet/index.d.ts +8 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/index.js +20 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +26 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +157 -0
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +36 -0
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/ZcashPsbt.js +146 -0
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +61 -0
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/ZcashTransaction.js +341 -0
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +21 -0
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +105 -0
- package/dist/src/bitgo/zcash/address.d.ts +8 -0
- package/dist/src/bitgo/zcash/address.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/address.js +57 -0
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +27 -0
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/hashZip0244.js +184 -0
- package/dist/src/bitgo/zcash/index.d.ts +4 -0
- package/dist/src/bitgo/zcash/index.d.ts.map +1 -0
- package/dist/src/bitgo/zcash/index.js +16 -0
- package/dist/src/classify.d.ts +19 -0
- package/dist/src/classify.d.ts.map +1 -0
- package/dist/src/classify.js +89 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +36 -0
- package/dist/src/networks.d.ts +119 -0
- package/dist/src/networks.d.ts.map +1 -0
- package/dist/src/networks.js +477 -0
- package/dist/src/noble_ecc.d.ts +28 -0
- package/dist/src/noble_ecc.d.ts.map +1 -0
- package/dist/src/noble_ecc.js +168 -0
- package/dist/src/payments/index.d.ts +4 -0
- package/dist/src/payments/index.d.ts.map +1 -0
- package/dist/src/payments/index.js +8 -0
- package/dist/src/payments/p2tr.d.ts +3 -0
- package/dist/src/payments/p2tr.d.ts.map +1 -0
- package/dist/src/payments/p2tr.js +348 -0
- package/dist/src/payments/p2tr_ns.d.ts +3 -0
- package/dist/src/payments/p2tr_ns.d.ts.map +1 -0
- package/dist/src/payments/p2tr_ns.js +134 -0
- package/dist/src/taproot.d.ts +141 -0
- package/dist/src/taproot.d.ts.map +1 -0
- package/dist/src/taproot.js +384 -0
- package/dist/src/templates/multisig/index.d.ts +4 -0
- package/dist/src/templates/multisig/index.d.ts.map +1 -0
- package/dist/src/templates/multisig/index.js +8 -0
- package/dist/src/templates/multisig/input.d.ts +7 -0
- package/dist/src/templates/multisig/input.d.ts.map +1 -0
- package/dist/src/templates/multisig/input.js +25 -0
- package/dist/src/templates/multisig/output.d.ts +7 -0
- package/dist/src/templates/multisig/output.d.ts.map +1 -0
- package/dist/src/templates/multisig/output.js +38 -0
- package/dist/src/templates/nulldata.d.ts +10 -0
- package/dist/src/templates/nulldata.d.ts.map +1 -0
- package/dist/src/templates/nulldata.js +17 -0
- package/dist/src/templates/pubkey/index.d.ts +4 -0
- package/dist/src/templates/pubkey/index.d.ts.map +1 -0
- package/dist/src/templates/pubkey/index.js +8 -0
- package/dist/src/templates/pubkey/input.d.ts +7 -0
- package/dist/src/templates/pubkey/input.d.ts.map +1 -0
- package/dist/src/templates/pubkey/input.js +14 -0
- package/dist/src/templates/pubkey/output.d.ts +7 -0
- package/dist/src/templates/pubkey/output.d.ts.map +1 -0
- package/dist/src/templates/pubkey/output.js +15 -0
- package/dist/src/templates/pubkeyhash/index.d.ts +4 -0
- package/dist/src/templates/pubkeyhash/index.d.ts.map +1 -0
- package/dist/src/templates/pubkeyhash/index.js +8 -0
- package/dist/src/templates/pubkeyhash/input.d.ts +7 -0
- package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -0
- package/dist/src/templates/pubkeyhash/input.js +16 -0
- package/dist/src/templates/pubkeyhash/output.d.ts +6 -0
- package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -0
- package/dist/src/templates/pubkeyhash/output.js +20 -0
- package/dist/src/templates/scripthash/index.d.ts +4 -0
- package/dist/src/templates/scripthash/index.d.ts.map +1 -0
- package/dist/src/templates/scripthash/index.js +8 -0
- package/dist/src/templates/scripthash/input.d.ts +6 -0
- package/dist/src/templates/scripthash/input.d.ts.map +1 -0
- package/dist/src/templates/scripthash/input.js +43 -0
- package/dist/src/templates/scripthash/output.d.ts +6 -0
- package/dist/src/templates/scripthash/output.d.ts.map +1 -0
- package/dist/src/templates/scripthash/output.js +15 -0
- package/dist/src/templates/taproot/index.d.ts +4 -0
- package/dist/src/templates/taproot/index.d.ts.map +1 -0
- package/dist/src/templates/taproot/index.js +8 -0
- package/dist/src/templates/taproot/input.d.ts +6 -0
- package/dist/src/templates/taproot/input.d.ts.map +1 -0
- package/dist/src/templates/taproot/input.js +23 -0
- package/dist/src/templates/taproot/output.d.ts +6 -0
- package/dist/src/templates/taproot/output.d.ts.map +1 -0
- package/dist/src/templates/taproot/output.js +15 -0
- package/dist/src/templates/taprootnofn/index.d.ts +4 -0
- package/dist/src/templates/taprootnofn/index.d.ts.map +1 -0
- package/dist/src/templates/taprootnofn/index.js +8 -0
- package/dist/src/templates/taprootnofn/input.d.ts +7 -0
- package/dist/src/templates/taprootnofn/input.d.ts.map +1 -0
- package/dist/src/templates/taprootnofn/input.js +24 -0
- package/dist/src/templates/taprootnofn/output.d.ts +7 -0
- package/dist/src/templates/taprootnofn/output.d.ts.map +1 -0
- package/dist/src/templates/taprootnofn/output.js +28 -0
- package/dist/src/templates/witnesscommitment/index.d.ts +3 -0
- package/dist/src/templates/witnesscommitment/index.d.ts.map +1 -0
- package/dist/src/templates/witnesscommitment/index.js +6 -0
- package/dist/src/templates/witnesscommitment/output.d.ts +8 -0
- package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -0
- package/dist/src/templates/witnesscommitment/output.js +31 -0
- package/dist/src/templates/witnesspubkeyhash/index.d.ts +4 -0
- package/dist/src/templates/witnesspubkeyhash/index.d.ts.map +1 -0
- package/dist/src/templates/witnesspubkeyhash/index.js +8 -0
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +7 -0
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -0
- package/dist/src/templates/witnesspubkeyhash/input.js +19 -0
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +6 -0
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -0
- package/dist/src/templates/witnesspubkeyhash/output.js +15 -0
- package/dist/src/templates/witnessscripthash/index.d.ts +4 -0
- package/dist/src/templates/witnessscripthash/index.d.ts.map +1 -0
- package/dist/src/templates/witnessscripthash/index.js +8 -0
- package/dist/src/templates/witnessscripthash/input.d.ts +6 -0
- package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -0
- package/dist/src/templates/witnessscripthash/input.js +35 -0
- package/dist/src/templates/witnessscripthash/output.d.ts +6 -0
- package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -0
- package/dist/src/templates/witnessscripthash/output.js +15 -0
- package/dist/src/testutil/index.d.ts +3 -0
- package/dist/src/testutil/index.d.ts.map +1 -0
- package/dist/src/testutil/index.js +15 -0
- package/dist/src/testutil/keys.d.ts +10 -0
- package/dist/src/testutil/keys.d.ts.map +1 -0
- package/dist/src/testutil/keys.js +40 -0
- package/dist/src/testutil/mock.d.ts +21 -0
- package/dist/src/testutil/mock.d.ts.map +1 -0
- package/dist/src/testutil/mock.js +86 -0
- package/dist/src/transaction_builder.d.ts +47 -0
- package/dist/src/transaction_builder.d.ts.map +1 -0
- package/dist/src/transaction_builder.js +1084 -0
- package/package.json +87 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2011-2017 bitcoinjs-lib contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# BitGo UTXO library
|
|
2
|
+
|
|
3
|
+
This library is a wrapper around [bitcoinjs-lib](https://github.com/bitcoinjs/bitcoinjs-lib) adding altcoin support.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
- Multicoin support: Configurable behaviour based on [network](https://github.com/BitGo/bitgo-utxo-lib/blob/master/src/networks.js) objects.
|
|
7
|
+
- Backed by [BitGo](https://www.bitgo.com/info/)
|
|
8
|
+
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
``` bash
|
|
12
|
+
# using npm
|
|
13
|
+
npm install @bitgo/utxo-lib
|
|
14
|
+
|
|
15
|
+
# using yarn
|
|
16
|
+
yarn add @bitgo/utxo-lib
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Setup
|
|
20
|
+
|
|
21
|
+
JavaScript (ESM)
|
|
22
|
+
``` javascript
|
|
23
|
+
import * as utxolib from '@bitgo/utxo-lib'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
NodeJS (CJS)
|
|
27
|
+
``` javascript
|
|
28
|
+
const utxolib = require('@bitgo/utxo-lib')
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
Support for parsing and building altcoin transactions is provided by the following methods
|
|
34
|
+
|
|
35
|
+
``` typescript
|
|
36
|
+
utxolib.bitgo.createTransactionFromBuffer(buffer, network): UtxoTransaction
|
|
37
|
+
// (similarly `createTransactionFromHex(string, network)`)
|
|
38
|
+
|
|
39
|
+
utxolib.bitgo.createTransactionBuilderForNetwork(network): UtxoTransactionBuilder
|
|
40
|
+
|
|
41
|
+
utxolib.bitgo.createTransactionBuilderFromTransaction(tx): UtxoTransactionBuilder
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The `UtxoTransaction(Builder)` classes have the same interface as the `Transaction` type in `bitcoinjs-lib` .
|
|
45
|
+
|
|
46
|
+
## Supported coins
|
|
47
|
+
|
|
48
|
+
|Network|Mainnet|Testnet|
|
|
49
|
+
|---|---|---|
|
|
50
|
+
|Bitcoin|`utxolib.networks.bitcoin`|`utxolib.networks.testnet`|
|
|
51
|
+
|Bitcoin Cash|`utxolib.networks.bitcoincash`|`utxolib.networks.bitcoincashTestnet`|
|
|
52
|
+
|Bitcoin Gold|`utxolib.networks.bitcoingold`|`utxolib.networks.bitcoingoldTestnet`|
|
|
53
|
+
|Bitcoin SV (Satoshi Vision)|`utxolib.networks.bitcoinsv`|`utxolib.networks.bitcoinsvTestnet`|
|
|
54
|
+
|Dash|`utxolib.networks.dash`|`utxolib.networks.dash`|
|
|
55
|
+
|eCash|`utxolib.networks.ecash`|`utxolib.networks.ecashTestnet`|
|
|
56
|
+
|Litecoin|`utxolib.networks.litecoin`|`utxolib.networks.litecoinTest`|
|
|
57
|
+
|Zcash|`utxolib.networks.zcash`|`utxolib.networks.zcashTest`|
|
|
58
|
+
|
|
59
|
+
> [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.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import * as bitcoinjs from 'bitcoinjs-lib';
|
|
3
|
+
import { Base58CheckResult, Bech32Result } from 'bitcoinjs-lib/src/address';
|
|
4
|
+
import { Network } from './networks';
|
|
5
|
+
export declare function fromOutputScript(outputScript: Buffer, network: Network): string;
|
|
6
|
+
export declare function toOutputScript(address: string, network: Network): Buffer;
|
|
7
|
+
export declare function toBase58Check(hash: Buffer, version: number, network: Network): string;
|
|
8
|
+
export declare function fromBase58Check(address: string, network: Network): Base58CheckResult;
|
|
9
|
+
export declare const fromBech32: typeof bitcoinjs.address.fromBech32, toBech32: typeof bitcoinjs.address.toBech32;
|
|
10
|
+
export { Base58CheckResult, Bech32Result };
|
|
11
|
+
//# sourceMappingURL=address.d.ts.map
|
|
@@ -0,0 +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;AAE9D,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK/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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.toBech32 = exports.fromBech32 = exports.fromBase58Check = exports.toBase58Check = exports.toOutputScript = exports.fromOutputScript = void 0;
|
|
5
|
+
const bitcoinjs = require("bitcoinjs-lib");
|
|
6
|
+
const zcashAddress = require("../src/bitgo/zcash/address");
|
|
7
|
+
const networks_1 = require("./networks");
|
|
8
|
+
function fromOutputScript(outputScript, network) {
|
|
9
|
+
if (networks_1.isValidNetwork(network) && networks_1.isZcash(network)) {
|
|
10
|
+
return zcashAddress.fromOutputScript(outputScript, network);
|
|
11
|
+
}
|
|
12
|
+
return bitcoinjs.address.fromOutputScript(outputScript, network);
|
|
13
|
+
}
|
|
14
|
+
exports.fromOutputScript = fromOutputScript;
|
|
15
|
+
function toOutputScript(address, network) {
|
|
16
|
+
if (networks_1.isValidNetwork(network) && networks_1.isZcash(network)) {
|
|
17
|
+
return zcashAddress.toOutputScript(address, network);
|
|
18
|
+
}
|
|
19
|
+
return bitcoinjs.address.toOutputScript(address, network);
|
|
20
|
+
}
|
|
21
|
+
exports.toOutputScript = toOutputScript;
|
|
22
|
+
function toBase58Check(hash, version, network) {
|
|
23
|
+
if (networks_1.isValidNetwork(network) && networks_1.isZcash(network)) {
|
|
24
|
+
return zcashAddress.toBase58Check(hash, version);
|
|
25
|
+
}
|
|
26
|
+
return bitcoinjs.address.toBase58Check(hash, version);
|
|
27
|
+
}
|
|
28
|
+
exports.toBase58Check = toBase58Check;
|
|
29
|
+
function fromBase58Check(address, network) {
|
|
30
|
+
if (networks_1.isValidNetwork(network) && networks_1.isZcash(network)) {
|
|
31
|
+
return zcashAddress.fromBase58Check(address);
|
|
32
|
+
}
|
|
33
|
+
return bitcoinjs.address.fromBase58Check(address);
|
|
34
|
+
}
|
|
35
|
+
exports.fromBase58Check = fromBase58Check;
|
|
36
|
+
_a = bitcoinjs.address, exports.fromBech32 = _a.fromBech32, exports.toBech32 = _a.toBech32;
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQ0FBMkM7QUFHM0MsMkRBQTJEO0FBQzNELHlDQUE4RDtBQUU5RCxTQUFnQixnQkFBZ0IsQ0FBQyxZQUFvQixFQUFFLE9BQWdCO0lBQ3JFLElBQUkseUJBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxrQkFBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQy9DLE9BQU8sWUFBWSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztLQUM3RDtJQUNELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsT0FBNEIsQ0FBQyxDQUFDO0FBQ3hGLENBQUM7QUFMRCw0Q0FLQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxPQUFlLEVBQUUsT0FBZ0I7SUFDOUQsSUFBSSx5QkFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLGtCQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDL0MsT0FBTyxZQUFZLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztLQUN0RDtJQUNELE9BQU8sU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE9BQTRCLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBTEQsd0NBS0M7QUFFRCxTQUFnQixhQUFhLENBQUMsSUFBWSxFQUFFLE9BQWUsRUFBRSxPQUFnQjtJQUMzRSxJQUFJLHlCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksa0JBQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMvQyxPQUFPLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsT0FBTyxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUxELHNDQUtDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE9BQWUsRUFBRSxPQUFnQjtJQUMvRCxJQUFJLHlCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksa0JBQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMvQyxPQUFPLFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDOUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFMRCwwQ0FLQztBQUVZLEtBQTJCLFNBQVMsQ0FBQyxPQUFPLEVBQTFDLGtCQUFVLGtCQUFFLGdCQUFRLGVBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYml0Y29pbmpzIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0IHsgQmFzZTU4Q2hlY2tSZXN1bHQsIEJlY2gzMlJlc3VsdCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL2FkZHJlc3MnO1xuXG5pbXBvcnQgKiBhcyB6Y2FzaEFkZHJlc3MgZnJvbSAnLi4vc3JjL2JpdGdvL3pjYXNoL2FkZHJlc3MnO1xuaW1wb3J0IHsgaXNWYWxpZE5ldHdvcmssIGlzWmNhc2gsIE5ldHdvcmsgfSBmcm9tICcuL25ldHdvcmtzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21PdXRwdXRTY3JpcHQob3V0cHV0U2NyaXB0OiBCdWZmZXIsIG5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICBpZiAoaXNWYWxpZE5ldHdvcmsobmV0d29yaykgJiYgaXNaY2FzaChuZXR3b3JrKSkge1xuICAgIHJldHVybiB6Y2FzaEFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIG5ldHdvcmspO1xuICB9XG4gIHJldHVybiBiaXRjb2luanMuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KG91dHB1dFNjcmlwdCwgbmV0d29yayBhcyBiaXRjb2luanMuTmV0d29yayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdChhZGRyZXNzOiBzdHJpbmcsIG5ldHdvcms6IE5ldHdvcmspOiBCdWZmZXIge1xuICBpZiAoaXNWYWxpZE5ldHdvcmsobmV0d29yaykgJiYgaXNaY2FzaChuZXR3b3JrKSkge1xuICAgIHJldHVybiB6Y2FzaEFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIH1cbiAgcmV0dXJuIGJpdGNvaW5qcy5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGFkZHJlc3MsIG5ldHdvcmsgYXMgYml0Y29pbmpzLk5ldHdvcmspO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9CYXNlNThDaGVjayhoYXNoOiBCdWZmZXIsIHZlcnNpb246IG51bWJlciwgbmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIGlmIChpc1ZhbGlkTmV0d29yayhuZXR3b3JrKSAmJiBpc1pjYXNoKG5ldHdvcmspKSB7XG4gICAgcmV0dXJuIHpjYXNoQWRkcmVzcy50b0Jhc2U1OENoZWNrKGhhc2gsIHZlcnNpb24pO1xuICB9XG4gIHJldHVybiBiaXRjb2luanMuYWRkcmVzcy50b0Jhc2U1OENoZWNrKGhhc2gsIHZlcnNpb24pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbUJhc2U1OENoZWNrKGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogTmV0d29yayk6IEJhc2U1OENoZWNrUmVzdWx0IHtcbiAgaWYgKGlzVmFsaWROZXR3b3JrKG5ldHdvcmspICYmIGlzWmNhc2gobmV0d29yaykpIHtcbiAgICByZXR1cm4gemNhc2hBZGRyZXNzLmZyb21CYXNlNThDaGVjayhhZGRyZXNzKTtcbiAgfVxuICByZXR1cm4gYml0Y29pbmpzLmFkZHJlc3MuZnJvbUJhc2U1OENoZWNrKGFkZHJlc3MpO1xufVxuXG5leHBvcnQgY29uc3QgeyBmcm9tQmVjaDMyLCB0b0JlY2gzMiB9ID0gYml0Y29pbmpzLmFkZHJlc3M7XG5cbmV4cG9ydCB7IEJhc2U1OENoZWNrUmVzdWx0LCBCZWNoMzJSZXN1bHQgfTtcbiJdfQ==
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/**
|
|
3
|
+
* Implements methods for nonstandard (non-canonical) address formats.
|
|
4
|
+
*
|
|
5
|
+
* Use `toOutputScriptTryFormats()` instead of `toOutputScript()` to parse addresses in
|
|
6
|
+
* non-canonical formats
|
|
7
|
+
*/
|
|
8
|
+
import { Network } from './networks';
|
|
9
|
+
export declare const addressFormats: readonly ["default", "cashaddr"];
|
|
10
|
+
export declare type AddressFormat = typeof addressFormats[number];
|
|
11
|
+
/**
|
|
12
|
+
* @param format
|
|
13
|
+
* @param network
|
|
14
|
+
* @return true iff format is supported for network
|
|
15
|
+
*/
|
|
16
|
+
export declare function isSupportedAddressFormat(format: AddressFormat, network: Network): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* @param outputScript
|
|
19
|
+
* @param format
|
|
20
|
+
* @param network
|
|
21
|
+
* @return address formatted using provided AddressFormat
|
|
22
|
+
*/
|
|
23
|
+
export declare function fromOutputScriptWithFormat(outputScript: Buffer, format: AddressFormat, network: Network): string;
|
|
24
|
+
/**
|
|
25
|
+
* @param address
|
|
26
|
+
* @param format
|
|
27
|
+
* @param network
|
|
28
|
+
* @return output script parsed with provided AddressFormat
|
|
29
|
+
*/
|
|
30
|
+
export declare function toOutputScriptWithFormat(address: string, format: AddressFormat, network: Network): Buffer;
|
|
31
|
+
/**
|
|
32
|
+
* Attempts to parse address with different address formats, returns first hit.
|
|
33
|
+
* @param address
|
|
34
|
+
* @param network
|
|
35
|
+
* @param formats - defaults to all supported address formats for network
|
|
36
|
+
* @return tuple with [AddressFormat, Buffer] containing format and parsed output script
|
|
37
|
+
*/
|
|
38
|
+
export declare function toOutputScriptAndFormat(address: string, network: Network, formats?: AddressFormat[]): [AddressFormat, Buffer];
|
|
39
|
+
/**
|
|
40
|
+
* Same as `toOutputScriptAndFormat`, only returning script
|
|
41
|
+
* @param address - {@see toOutputScriptAndFormat}
|
|
42
|
+
* @param network - {@see toOutputScriptAndFormat}
|
|
43
|
+
* @param formats - {@see toOutputScriptAndFormat}
|
|
44
|
+
* @return parsed output script
|
|
45
|
+
*/
|
|
46
|
+
export declare function toOutputScriptTryFormats(address: string, network: Network, formats?: AddressFormat[]): Buffer;
|
|
47
|
+
/**
|
|
48
|
+
* @param address
|
|
49
|
+
* @param network
|
|
50
|
+
* @return address in canonical format
|
|
51
|
+
*/
|
|
52
|
+
export declare function toCanonicalFormat(address: string, network: Network): string;
|
|
53
|
+
//# sourceMappingURL=addressFormat.d.ts.map
|
|
@@ -0,0 +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;AAE1D;;;;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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toCanonicalFormat = exports.toOutputScriptTryFormats = exports.toOutputScriptAndFormat = exports.toOutputScriptWithFormat = exports.fromOutputScriptWithFormat = exports.isSupportedAddressFormat = exports.addressFormats = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Implements methods for nonstandard (non-canonical) address formats.
|
|
6
|
+
*
|
|
7
|
+
* Use `toOutputScriptTryFormats()` instead of `toOutputScript()` to parse addresses in
|
|
8
|
+
* non-canonical formats
|
|
9
|
+
*/
|
|
10
|
+
const networks_1 = require("./networks");
|
|
11
|
+
const address_1 = require("./address");
|
|
12
|
+
const bitgo_1 = require("./bitgo");
|
|
13
|
+
exports.addressFormats = ['default', 'cashaddr'];
|
|
14
|
+
/**
|
|
15
|
+
* @param format
|
|
16
|
+
* @param network
|
|
17
|
+
* @return true iff format is supported for network
|
|
18
|
+
*/
|
|
19
|
+
function isSupportedAddressFormat(format, network) {
|
|
20
|
+
switch (format) {
|
|
21
|
+
case 'default':
|
|
22
|
+
return true;
|
|
23
|
+
case 'cashaddr':
|
|
24
|
+
return [networks_1.networks.bitcoincash, networks_1.networks.ecash].includes(networks_1.getMainnet(network));
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`unknown address format ${format}`);
|
|
27
|
+
}
|
|
28
|
+
exports.isSupportedAddressFormat = isSupportedAddressFormat;
|
|
29
|
+
/**
|
|
30
|
+
* @param outputScript
|
|
31
|
+
* @param format
|
|
32
|
+
* @param network
|
|
33
|
+
* @return address formatted using provided AddressFormat
|
|
34
|
+
*/
|
|
35
|
+
function fromOutputScriptWithFormat(outputScript, format, network) {
|
|
36
|
+
if (!isSupportedAddressFormat(format, network)) {
|
|
37
|
+
throw new Error(`unsupported address format ${format} for network ${networks_1.getNetworkName(network)}`);
|
|
38
|
+
}
|
|
39
|
+
switch (networks_1.getMainnet(network)) {
|
|
40
|
+
case networks_1.networks.bitcoincash:
|
|
41
|
+
case networks_1.networks.ecash:
|
|
42
|
+
return bitgo_1.bcashAddress.fromOutputScriptWithFormat(outputScript, format, network);
|
|
43
|
+
default:
|
|
44
|
+
return address_1.fromOutputScript(outputScript, network);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.fromOutputScriptWithFormat = fromOutputScriptWithFormat;
|
|
48
|
+
/**
|
|
49
|
+
* @param address
|
|
50
|
+
* @param format
|
|
51
|
+
* @param network
|
|
52
|
+
* @return output script parsed with provided AddressFormat
|
|
53
|
+
*/
|
|
54
|
+
function toOutputScriptWithFormat(address, format, network) {
|
|
55
|
+
if (!isSupportedAddressFormat(format, network)) {
|
|
56
|
+
throw new Error(`unsupported address format ${format} for network ${networks_1.getNetworkName(network)}`);
|
|
57
|
+
}
|
|
58
|
+
switch (networks_1.getMainnet(network)) {
|
|
59
|
+
case networks_1.networks.bitcoincash:
|
|
60
|
+
case networks_1.networks.ecash:
|
|
61
|
+
return bitgo_1.bcashAddress.toOutputScriptWithFormat(address, format, network);
|
|
62
|
+
default:
|
|
63
|
+
return address_1.toOutputScript(address, network);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.toOutputScriptWithFormat = toOutputScriptWithFormat;
|
|
67
|
+
/**
|
|
68
|
+
* Attempts to parse address with different address formats, returns first hit.
|
|
69
|
+
* @param address
|
|
70
|
+
* @param network
|
|
71
|
+
* @param formats - defaults to all supported address formats for network
|
|
72
|
+
* @return tuple with [AddressFormat, Buffer] containing format and parsed output script
|
|
73
|
+
*/
|
|
74
|
+
function toOutputScriptAndFormat(address, network, formats) {
|
|
75
|
+
if (!formats) {
|
|
76
|
+
formats = exports.addressFormats.filter((f) => isSupportedAddressFormat(f, network));
|
|
77
|
+
}
|
|
78
|
+
for (const format of formats) {
|
|
79
|
+
try {
|
|
80
|
+
return [format, toOutputScriptWithFormat(address, format, network)];
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
// try next
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`could not parse outputScript [formats=${formats}]`);
|
|
87
|
+
}
|
|
88
|
+
exports.toOutputScriptAndFormat = toOutputScriptAndFormat;
|
|
89
|
+
/**
|
|
90
|
+
* Same as `toOutputScriptAndFormat`, only returning script
|
|
91
|
+
* @param address - {@see toOutputScriptAndFormat}
|
|
92
|
+
* @param network - {@see toOutputScriptAndFormat}
|
|
93
|
+
* @param formats - {@see toOutputScriptAndFormat}
|
|
94
|
+
* @return parsed output script
|
|
95
|
+
*/
|
|
96
|
+
function toOutputScriptTryFormats(address, network, formats) {
|
|
97
|
+
const [, outputScript] = toOutputScriptAndFormat(address, network, formats);
|
|
98
|
+
return outputScript;
|
|
99
|
+
}
|
|
100
|
+
exports.toOutputScriptTryFormats = toOutputScriptTryFormats;
|
|
101
|
+
/**
|
|
102
|
+
* @param address
|
|
103
|
+
* @param network
|
|
104
|
+
* @return address in canonical format
|
|
105
|
+
*/
|
|
106
|
+
function toCanonicalFormat(address, network) {
|
|
107
|
+
return address_1.fromOutputScript(toOutputScriptTryFormats(address, network), network);
|
|
108
|
+
}
|
|
109
|
+
exports.toCanonicalFormat = toCanonicalFormat;
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzc0Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGRyZXNzRm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOzs7OztHQUtHO0FBQ0gseUNBQTJFO0FBQzNFLHVDQUE2RDtBQUU3RCxtQ0FBdUM7QUFFMUIsUUFBQSxjQUFjLEdBQUcsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFVLENBQUM7QUFJL0Q7Ozs7R0FJRztBQUNILFNBQWdCLHdCQUF3QixDQUFDLE1BQXFCLEVBQUUsT0FBZ0I7SUFDOUUsUUFBUSxNQUFNLEVBQUU7UUFDZCxLQUFLLFNBQVM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssVUFBVTtZQUNiLE9BQU8sQ0FBQyxtQkFBUSxDQUFDLFdBQVcsRUFBRSxtQkFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7S0FDL0U7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFSRCw0REFRQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsWUFBb0IsRUFBRSxNQUFxQixFQUFFLE9BQWdCO0lBQ3RHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxnQkFBZ0IseUJBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDaEc7SUFFRCxRQUFRLHFCQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDM0IsS0FBSyxtQkFBUSxDQUFDLFdBQVcsQ0FBQztRQUMxQixLQUFLLG1CQUFRLENBQUMsS0FBSztZQUNqQixPQUFPLG9CQUFZLENBQUMsMEJBQTBCLENBQUMsWUFBWSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoRjtZQUNFLE9BQU8sMEJBQWdCLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ2xEO0FBQ0gsQ0FBQztBQVpELGdFQVlDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix3QkFBd0IsQ0FBQyxPQUFlLEVBQUUsTUFBcUIsRUFBRSxPQUFnQjtJQUMvRixJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLE1BQU0sZ0JBQWdCLHlCQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ2hHO0lBRUQsUUFBUSxxQkFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzNCLEtBQUssbUJBQVEsQ0FBQyxXQUFXLENBQUM7UUFDMUIsS0FBSyxtQkFBUSxDQUFDLEtBQUs7WUFDakIsT0FBTyxvQkFBWSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekU7WUFDRSxPQUFPLHdCQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQVpELDREQVlDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLE9BQWUsRUFDZixPQUFnQixFQUNoQixPQUF5QjtJQUV6QixJQUFJLENBQUMsT0FBTyxFQUFFO1FBQ1osT0FBTyxHQUFHLHNCQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUM5RTtJQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO1FBQzVCLElBQUk7WUFDRixPQUFPLENBQUMsTUFBTSxFQUFFLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsV0FBVztTQUNaO0tBQ0Y7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFsQkQsMERBa0JDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsT0FBZSxFQUFFLE9BQWdCLEVBQUUsT0FBeUI7SUFDbkcsTUFBTSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RSxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBSEQsNERBR0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsaUJBQWlCLENBQUMsT0FBZSxFQUFFLE9BQWdCO0lBQ2pFLE9BQU8sMEJBQWdCLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFGRCw4Q0FFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW1wbGVtZW50cyBtZXRob2RzIGZvciBub25zdGFuZGFyZCAobm9uLWNhbm9uaWNhbCkgYWRkcmVzcyBmb3JtYXRzLlxuICpcbiAqIFVzZSBgdG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKClgIGluc3RlYWQgb2YgYHRvT3V0cHV0U2NyaXB0KClgIHRvIHBhcnNlIGFkZHJlc3NlcyBpblxuICogbm9uLWNhbm9uaWNhbCBmb3JtYXRzXG4gKi9cbmltcG9ydCB7IGdldE1haW5uZXQsIGdldE5ldHdvcmtOYW1lLCBOZXR3b3JrLCBuZXR3b3JrcyB9IGZyb20gJy4vbmV0d29ya3MnO1xuaW1wb3J0IHsgZnJvbU91dHB1dFNjcmlwdCwgdG9PdXRwdXRTY3JpcHQgfSBmcm9tICcuL2FkZHJlc3MnO1xuXG5pbXBvcnQgeyBiY2FzaEFkZHJlc3MgfSBmcm9tICcuL2JpdGdvJztcblxuZXhwb3J0IGNvbnN0IGFkZHJlc3NGb3JtYXRzID0gWydkZWZhdWx0JywgJ2Nhc2hhZGRyJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIEFkZHJlc3NGb3JtYXQgPSB0eXBlb2YgYWRkcmVzc0Zvcm1hdHNbbnVtYmVyXTtcblxuLyoqXG4gKiBAcGFyYW0gZm9ybWF0XG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiB0cnVlIGlmZiBmb3JtYXQgaXMgc3VwcG9ydGVkIGZvciBuZXR3b3JrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1cHBvcnRlZEFkZHJlc3NGb3JtYXQoZm9ybWF0OiBBZGRyZXNzRm9ybWF0LCBuZXR3b3JrOiBOZXR3b3JrKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnZGVmYXVsdCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdjYXNoYWRkcic6XG4gICAgICByZXR1cm4gW25ldHdvcmtzLmJpdGNvaW5jYXNoLCBuZXR3b3Jrcy5lY2FzaF0uaW5jbHVkZXMoZ2V0TWFpbm5ldChuZXR3b3JrKSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIGFkZHJlc3MgZm9ybWF0ICR7Zm9ybWF0fWApO1xufVxuXG4vKipcbiAqIEBwYXJhbSBvdXRwdXRTY3JpcHRcbiAqIEBwYXJhbSBmb3JtYXRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIGFkZHJlc3MgZm9ybWF0dGVkIHVzaW5nIHByb3ZpZGVkIEFkZHJlc3NGb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KG91dHB1dFNjcmlwdDogQnVmZmVyLCBmb3JtYXQ6IEFkZHJlc3NGb3JtYXQsIG5ldHdvcms6IE5ldHdvcmspOiBzdHJpbmcge1xuICBpZiAoIWlzU3VwcG9ydGVkQWRkcmVzc0Zvcm1hdChmb3JtYXQsIG5ldHdvcmspKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB1bnN1cHBvcnRlZCBhZGRyZXNzIGZvcm1hdCAke2Zvcm1hdH0gZm9yIG5ldHdvcmsgJHtnZXROZXR3b3JrTmFtZShuZXR3b3JrKX1gKTtcbiAgfVxuXG4gIHN3aXRjaCAoZ2V0TWFpbm5ldChuZXR3b3JrKSkge1xuICAgIGNhc2UgbmV0d29ya3MuYml0Y29pbmNhc2g6XG4gICAgY2FzZSBuZXR3b3Jrcy5lY2FzaDpcbiAgICAgIHJldHVybiBiY2FzaEFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdFdpdGhGb3JtYXQob3V0cHV0U2NyaXB0LCBmb3JtYXQsIG5ldHdvcmspO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQsIG5ldHdvcmspO1xuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIGFkZHJlc3NcbiAqIEBwYXJhbSBmb3JtYXRcbiAqIEBwYXJhbSBuZXR3b3JrXG4gKiBAcmV0dXJuIG91dHB1dCBzY3JpcHQgcGFyc2VkIHdpdGggcHJvdmlkZWQgQWRkcmVzc0Zvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9PdXRwdXRTY3JpcHRXaXRoRm9ybWF0KGFkZHJlc3M6IHN0cmluZywgZm9ybWF0OiBBZGRyZXNzRm9ybWF0LCBuZXR3b3JrOiBOZXR3b3JrKTogQnVmZmVyIHtcbiAgaWYgKCFpc1N1cHBvcnRlZEFkZHJlc3NGb3JtYXQoZm9ybWF0LCBuZXR3b3JrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYWRkcmVzcyBmb3JtYXQgJHtmb3JtYXR9IGZvciBuZXR3b3JrICR7Z2V0TmV0d29ya05hbWUobmV0d29yayl9YCk7XG4gIH1cblxuICBzd2l0Y2ggKGdldE1haW5uZXQobmV0d29yaykpIHtcbiAgICBjYXNlIG5ldHdvcmtzLmJpdGNvaW5jYXNoOlxuICAgIGNhc2UgbmV0d29ya3MuZWNhc2g6XG4gICAgICByZXR1cm4gYmNhc2hBZGRyZXNzLnRvT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChhZGRyZXNzLCBmb3JtYXQsIG5ldHdvcmspO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBwYXJzZSBhZGRyZXNzIHdpdGggZGlmZmVyZW50IGFkZHJlc3MgZm9ybWF0cywgcmV0dXJucyBmaXJzdCBoaXQuXG4gKiBAcGFyYW0gYWRkcmVzc1xuICogQHBhcmFtIG5ldHdvcmtcbiAqIEBwYXJhbSBmb3JtYXRzIC0gZGVmYXVsdHMgdG8gYWxsIHN1cHBvcnRlZCBhZGRyZXNzIGZvcm1hdHMgZm9yIG5ldHdvcmtcbiAqIEByZXR1cm4gdHVwbGUgd2l0aCBbQWRkcmVzc0Zvcm1hdCwgQnVmZmVyXSBjb250YWluaW5nIGZvcm1hdCBhbmQgcGFyc2VkIG91dHB1dCBzY3JpcHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0KFxuICBhZGRyZXNzOiBzdHJpbmcsXG4gIG5ldHdvcms6IE5ldHdvcmssXG4gIGZvcm1hdHM/OiBBZGRyZXNzRm9ybWF0W11cbik6IFtBZGRyZXNzRm9ybWF0LCBCdWZmZXJdIHtcbiAgaWYgKCFmb3JtYXRzKSB7XG4gICAgZm9ybWF0cyA9IGFkZHJlc3NGb3JtYXRzLmZpbHRlcigoZikgPT4gaXNTdXBwb3J0ZWRBZGRyZXNzRm9ybWF0KGYsIG5ldHdvcmspKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgZm9ybWF0IG9mIGZvcm1hdHMpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIFtmb3JtYXQsIHRvT3V0cHV0U2NyaXB0V2l0aEZvcm1hdChhZGRyZXNzLCBmb3JtYXQsIG5ldHdvcmspXTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyB0cnkgbmV4dFxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgY291bGQgbm90IHBhcnNlIG91dHB1dFNjcmlwdCBbZm9ybWF0cz0ke2Zvcm1hdHN9XWApO1xufVxuXG4vKipcbiAqIFNhbWUgYXMgYHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0YCwgb25seSByZXR1cm5pbmcgc2NyaXB0XG4gKiBAcGFyYW0gYWRkcmVzcyAtIHtAc2VlIHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0fVxuICogQHBhcmFtIG5ldHdvcmsgLSB7QHNlZSB0b091dHB1dFNjcmlwdEFuZEZvcm1hdH1cbiAqIEBwYXJhbSBmb3JtYXRzIC0ge0BzZWUgdG9PdXRwdXRTY3JpcHRBbmRGb3JtYXR9XG4gKiBAcmV0dXJuIHBhcnNlZCBvdXRwdXQgc2NyaXB0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b091dHB1dFNjcmlwdFRyeUZvcm1hdHMoYWRkcmVzczogc3RyaW5nLCBuZXR3b3JrOiBOZXR3b3JrLCBmb3JtYXRzPzogQWRkcmVzc0Zvcm1hdFtdKTogQnVmZmVyIHtcbiAgY29uc3QgWywgb3V0cHV0U2NyaXB0XSA9IHRvT3V0cHV0U2NyaXB0QW5kRm9ybWF0KGFkZHJlc3MsIG5ldHdvcmssIGZvcm1hdHMpO1xuICByZXR1cm4gb3V0cHV0U2NyaXB0O1xufVxuXG4vKipcbiAqIEBwYXJhbSBhZGRyZXNzXG4gKiBAcGFyYW0gbmV0d29ya1xuICogQHJldHVybiBhZGRyZXNzIGluIGNhbm9uaWNhbCBmb3JtYXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2Fub25pY2FsRm9ybWF0KGFkZHJlc3M6IHN0cmluZywgbmV0d29yazogTmV0d29yayk6IHN0cmluZyB7XG4gIHJldHVybiBmcm9tT3V0cHV0U2NyaXB0KHRvT3V0cHV0U2NyaXB0VHJ5Rm9ybWF0cyhhZGRyZXNzLCBuZXR3b3JrKSwgbmV0d29yayk7XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { ProprietaryKeyValueData, UtxoPsbt } from './UtxoPsbt';
|
|
3
|
+
import { BIP32Interface } from 'bip32';
|
|
4
|
+
import { Tuple } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Participant key value object.
|
|
7
|
+
*/
|
|
8
|
+
export interface PsbtMusig2ParticipantsKeyValueData {
|
|
9
|
+
tapOutputKey: Buffer;
|
|
10
|
+
tapInternalKey: Buffer;
|
|
11
|
+
participantPubKeys: Tuple<Buffer>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Nonce key value object.
|
|
15
|
+
*/
|
|
16
|
+
export interface PsbtMusig2NoncesKeyValueData {
|
|
17
|
+
participantPubKey: Buffer;
|
|
18
|
+
tapOutputKey: Buffer;
|
|
19
|
+
pubNonces: Buffer;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Psbt proprietary key val util function for participants pub keys. SubType is 0x01
|
|
23
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
24
|
+
* @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
|
|
25
|
+
*/
|
|
26
|
+
export declare function encodePsbtMusig2ParticipantsKeyValData(participantsKeyValData: PsbtMusig2ParticipantsKeyValueData): ProprietaryKeyValueData;
|
|
27
|
+
/**
|
|
28
|
+
* Psbt proprietary key val util function for pub nonce. SubType is 0x02
|
|
29
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
30
|
+
* @return plain-participantPubKey||x-only-tapOutputKey as sub keydata, 66 bytes of 2 pub nonces as valuedata
|
|
31
|
+
*/
|
|
32
|
+
export declare function encodePsbtMusig2PubNonceKeyValData(noncesKeyValueData: PsbtMusig2NoncesKeyValueData): ProprietaryKeyValueData;
|
|
33
|
+
/**
|
|
34
|
+
* Decodes proprietary key value data for participant pub keys
|
|
35
|
+
* @param kv
|
|
36
|
+
*/
|
|
37
|
+
export declare function decodePsbtMusig2ParticipantsKeyValData(kv: ProprietaryKeyValueData): PsbtMusig2ParticipantsKeyValueData;
|
|
38
|
+
export declare function createTapInternalKey(plainPubKeys: Buffer[]): Buffer;
|
|
39
|
+
export declare function createTapOutputKey(internalPubKey: Buffer, tapTreeRoot: Buffer): Buffer;
|
|
40
|
+
/**
|
|
41
|
+
* Generates and sets Musig2 nonces to p2trMusig2 key path spending inputs.
|
|
42
|
+
* tapInternalkey, tapMerkleRoot, tapBip32Derivation for rootWalletKey are required per p2trMusig2 key path input.
|
|
43
|
+
* Also participant keys are required from psbt proprietary key values.
|
|
44
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
45
|
+
* @param psbt
|
|
46
|
+
* @param rootWalletKey
|
|
47
|
+
* @param sessionId If provided it must either be a counter unique to this secret key,
|
|
48
|
+
* (converted to an array of 32 bytes), or 32 uniformly random bytes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function setMusig2Nonces(psbt: UtxoPsbt, rootWalletKey: BIP32Interface, sessionId?: Buffer): void;
|
|
51
|
+
//# sourceMappingURL=Musig2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Musig2.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Musig2.ts"],"names":[],"mappings":";AAAA,OAAO,EAA+B,uBAAuB,EAAE,QAAQ,EAAyB,MAAM,YAAY,CAAC;AAEnH,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAKhC;;GAEG;AACH,MAAM,WAAW,kCAAkC;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,sCAAsC,CACpD,sBAAsB,EAAE,kCAAkC,GACzD,uBAAuB,CAWzB;AAED;;;;GAIG;AACH,wBAAgB,kCAAkC,CAChD,kBAAkB,EAAE,4BAA4B,GAC/C,uBAAuB,CAczB;AAED;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,EAAE,EAAE,uBAAuB,GAC1B,kCAAkC,CAuBpC;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAGnE;AAED,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKtF;AA6FD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAavG"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setMusig2Nonces = exports.createTapOutputKey = exports.createTapInternalKey = exports.decodePsbtMusig2ParticipantsKeyValData = exports.encodePsbtMusig2PubNonceKeyValData = exports.encodePsbtMusig2ParticipantsKeyValData = void 0;
|
|
4
|
+
const UtxoPsbt_1 = require("./UtxoPsbt");
|
|
5
|
+
const outputScripts_1 = require("./outputScripts");
|
|
6
|
+
const noble_ecc_1 = require("../noble_ecc");
|
|
7
|
+
const taproot_1 = require("../taproot");
|
|
8
|
+
const utils_1 = require("bip174/src/lib/utils");
|
|
9
|
+
/**
|
|
10
|
+
* Psbt proprietary key val util function for participants pub keys. SubType is 0x01
|
|
11
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
12
|
+
* @return x-only tapOutputKey||tapInternalKey as sub keydata, plain sigining participant keys as valuedata
|
|
13
|
+
*/
|
|
14
|
+
function encodePsbtMusig2ParticipantsKeyValData(participantsKeyValData) {
|
|
15
|
+
const keydata = [participantsKeyValData.tapOutputKey, participantsKeyValData.tapInternalKey].map((pubkey) => outputScripts_1.checkXOnlyPublicKey(pubkey));
|
|
16
|
+
const value = participantsKeyValData.participantPubKeys.map((pubkey) => outputScripts_1.checkPlainPublicKey(pubkey));
|
|
17
|
+
const key = {
|
|
18
|
+
identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
19
|
+
subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
20
|
+
keydata: Buffer.concat(keydata),
|
|
21
|
+
};
|
|
22
|
+
return { key, value: Buffer.concat(value) };
|
|
23
|
+
}
|
|
24
|
+
exports.encodePsbtMusig2ParticipantsKeyValData = encodePsbtMusig2ParticipantsKeyValData;
|
|
25
|
+
/**
|
|
26
|
+
* Psbt proprietary key val util function for pub nonce. SubType is 0x02
|
|
27
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
28
|
+
* @return plain-participantPubKey||x-only-tapOutputKey as sub keydata, 66 bytes of 2 pub nonces as valuedata
|
|
29
|
+
*/
|
|
30
|
+
function encodePsbtMusig2PubNonceKeyValData(noncesKeyValueData) {
|
|
31
|
+
if (noncesKeyValueData.pubNonces.length !== 66) {
|
|
32
|
+
throw new Error(`Invalid pubNonces length ${noncesKeyValueData.pubNonces.length}`);
|
|
33
|
+
}
|
|
34
|
+
const keydata = Buffer.concat([
|
|
35
|
+
outputScripts_1.checkPlainPublicKey(noncesKeyValueData.participantPubKey),
|
|
36
|
+
outputScripts_1.checkXOnlyPublicKey(noncesKeyValueData.tapOutputKey),
|
|
37
|
+
]);
|
|
38
|
+
const key = {
|
|
39
|
+
identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
40
|
+
subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PUB_NONCE,
|
|
41
|
+
keydata,
|
|
42
|
+
};
|
|
43
|
+
return { key, value: noncesKeyValueData.pubNonces };
|
|
44
|
+
}
|
|
45
|
+
exports.encodePsbtMusig2PubNonceKeyValData = encodePsbtMusig2PubNonceKeyValData;
|
|
46
|
+
/**
|
|
47
|
+
* Decodes proprietary key value data for participant pub keys
|
|
48
|
+
* @param kv
|
|
49
|
+
*/
|
|
50
|
+
function decodePsbtMusig2ParticipantsKeyValData(kv) {
|
|
51
|
+
if (kv.key.identifier !== UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER ||
|
|
52
|
+
kv.key.subtype !== UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS) {
|
|
53
|
+
throw new Error(`Invalid identifier ${kv.key.identifier} or subtype ${kv.key.subtype} for participants pub keys`);
|
|
54
|
+
}
|
|
55
|
+
const key = kv.key.keydata;
|
|
56
|
+
if (key.length !== 64) {
|
|
57
|
+
throw new Error(`Invalid keydata size ${key.length} for participant pub keys`);
|
|
58
|
+
}
|
|
59
|
+
const value = kv.value;
|
|
60
|
+
if (value.length !== 66) {
|
|
61
|
+
throw new Error(`Invalid valuedata size ${value.length} for participant pub keys`);
|
|
62
|
+
}
|
|
63
|
+
const participantPubKeys = [value.subarray(0, 33), value.subarray(33)];
|
|
64
|
+
if (participantPubKeys[0].equals(participantPubKeys[1])) {
|
|
65
|
+
throw new Error(`Duplicate participant pub keys found`);
|
|
66
|
+
}
|
|
67
|
+
return { tapOutputKey: key.subarray(0, 32), tapInternalKey: key.subarray(32), participantPubKeys };
|
|
68
|
+
}
|
|
69
|
+
exports.decodePsbtMusig2ParticipantsKeyValData = decodePsbtMusig2ParticipantsKeyValData;
|
|
70
|
+
function createTapInternalKey(plainPubKeys) {
|
|
71
|
+
plainPubKeys.forEach((pubKey) => outputScripts_1.checkPlainPublicKey(pubKey));
|
|
72
|
+
return Buffer.from(noble_ecc_1.musig.getXOnlyPubkey(noble_ecc_1.musig.keyAgg(noble_ecc_1.musig.keySort(plainPubKeys))));
|
|
73
|
+
}
|
|
74
|
+
exports.createTapInternalKey = createTapInternalKey;
|
|
75
|
+
function createTapOutputKey(internalPubKey, tapTreeRoot) {
|
|
76
|
+
if (tapTreeRoot.length !== 32) {
|
|
77
|
+
throw new Error(`Invalid tapTreeRoot size ${tapTreeRoot.length}`);
|
|
78
|
+
}
|
|
79
|
+
return Buffer.from(taproot_1.tapTweakPubkey(noble_ecc_1.ecc, outputScripts_1.toXOnlyPublicKey(internalPubKey), tapTreeRoot).xOnlyPubkey);
|
|
80
|
+
}
|
|
81
|
+
exports.createTapOutputKey = createTapOutputKey;
|
|
82
|
+
function deriveWalletPubKey(tapBip32Derivations, rootWalletKey) {
|
|
83
|
+
const myDerivations = tapBip32Derivations.filter((bipDv) => {
|
|
84
|
+
return bipDv.masterFingerprint.equals(rootWalletKey.fingerprint);
|
|
85
|
+
});
|
|
86
|
+
if (!myDerivations.length) {
|
|
87
|
+
throw new Error('Need one tapBip32Derivation masterFingerprint to match the rootWalletKey fingerprint');
|
|
88
|
+
}
|
|
89
|
+
const myDerivation = myDerivations.filter((bipDv) => {
|
|
90
|
+
const publicKey = rootWalletKey.derivePath(bipDv.path).publicKey;
|
|
91
|
+
return bipDv.pubkey.equals(outputScripts_1.toXOnlyPublicKey(publicKey));
|
|
92
|
+
});
|
|
93
|
+
if (myDerivation.length !== 1) {
|
|
94
|
+
throw new Error('root wallet key should derive one tapBip32Derivation');
|
|
95
|
+
}
|
|
96
|
+
return rootWalletKey.derivePath(myDerivation[0].path).publicKey;
|
|
97
|
+
}
|
|
98
|
+
function getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId) {
|
|
99
|
+
var _a;
|
|
100
|
+
const input = utils_1.checkForInput(psbt.data.inputs, inputIndex);
|
|
101
|
+
if (!input.tapInternalKey) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!input.tapMerkleRoot) {
|
|
105
|
+
throw new Error('tapMerkleRoot is required to generate nonce');
|
|
106
|
+
}
|
|
107
|
+
if (!((_a = input.tapBip32Derivation) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
108
|
+
throw new Error('tapBip32Derivation is required to generate nonce');
|
|
109
|
+
}
|
|
110
|
+
const participantsKeyVals = psbt.getProprietaryKeyVals(inputIndex, {
|
|
111
|
+
identifier: UtxoPsbt_1.PSBT_PROPRIETARY_IDENTIFIER,
|
|
112
|
+
subtype: UtxoPsbt_1.ProprietaryKeySubtype.MUSIG2_PARTICIPANT_PUB_KEYS,
|
|
113
|
+
});
|
|
114
|
+
if (participantsKeyVals.length !== 1) {
|
|
115
|
+
throw new Error(`Found ${participantsKeyVals.length} matching participant key value instead of 1`);
|
|
116
|
+
}
|
|
117
|
+
const participantKeyValData = decodePsbtMusig2ParticipantsKeyValData(participantsKeyVals[0]);
|
|
118
|
+
const participantPubKeys = participantKeyValData.participantPubKeys;
|
|
119
|
+
const tapInternalKey = createTapInternalKey(participantPubKeys);
|
|
120
|
+
if (!tapInternalKey.equals(participantKeyValData.tapInternalKey)) {
|
|
121
|
+
throw new Error('Invalid participants keyata tapInternalKey');
|
|
122
|
+
}
|
|
123
|
+
const tapOutputKey = createTapOutputKey(tapInternalKey, input.tapMerkleRoot);
|
|
124
|
+
if (!tapOutputKey.equals(participantKeyValData.tapOutputKey)) {
|
|
125
|
+
throw new Error('Invalid participants keyata tapOutputKey');
|
|
126
|
+
}
|
|
127
|
+
if (!tapInternalKey.equals(input.tapInternalKey)) {
|
|
128
|
+
throw new Error('tapInternalKey and aggregated participant pub keys does not match');
|
|
129
|
+
}
|
|
130
|
+
const derivedPubKey = deriveWalletPubKey(input.tapBip32Derivation, rootWalletKey);
|
|
131
|
+
const participantPubKey = participantPubKeys.find((pubKey) => pubKey.equals(derivedPubKey));
|
|
132
|
+
if (!Buffer.isBuffer(participantPubKey)) {
|
|
133
|
+
throw new Error('participant plain pub key should match one tapBip32Derivation plain pub key');
|
|
134
|
+
}
|
|
135
|
+
const { hash } = psbt.getTaprootHashForSigChecked(inputIndex);
|
|
136
|
+
const nonceGenArgs = {
|
|
137
|
+
sessionId,
|
|
138
|
+
publicKey: participantPubKey,
|
|
139
|
+
xOnlyPublicKey: tapOutputKey,
|
|
140
|
+
msg: hash,
|
|
141
|
+
secretKey: rootWalletKey.privateKey,
|
|
142
|
+
};
|
|
143
|
+
const pubNonces = Buffer.from(noble_ecc_1.musig.nonceGen(nonceGenArgs));
|
|
144
|
+
return encodePsbtMusig2PubNonceKeyValData({
|
|
145
|
+
participantPubKey,
|
|
146
|
+
tapOutputKey,
|
|
147
|
+
pubNonces,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Generates and sets Musig2 nonces to p2trMusig2 key path spending inputs.
|
|
152
|
+
* tapInternalkey, tapMerkleRoot, tapBip32Derivation for rootWalletKey are required per p2trMusig2 key path input.
|
|
153
|
+
* Also participant keys are required from psbt proprietary key values.
|
|
154
|
+
* Ref: https://gist.github.com/sanket1729/4b525c6049f4d9e034d27368c49f28a6
|
|
155
|
+
* @param psbt
|
|
156
|
+
* @param rootWalletKey
|
|
157
|
+
* @param sessionId If provided it must either be a counter unique to this secret key,
|
|
158
|
+
* (converted to an array of 32 bytes), or 32 uniformly random bytes.
|
|
159
|
+
*/
|
|
160
|
+
function setMusig2Nonces(psbt, rootWalletKey, sessionId) {
|
|
161
|
+
if (rootWalletKey.isNeutered()) {
|
|
162
|
+
throw new Error('private key is required to generate nonce');
|
|
163
|
+
}
|
|
164
|
+
if (Buffer.isBuffer(sessionId) && sessionId.length !== 32) {
|
|
165
|
+
throw new Error(`Invalid sessionId size ${sessionId.length}`);
|
|
166
|
+
}
|
|
167
|
+
psbt.data.inputs.forEach((input, inputIndex) => {
|
|
168
|
+
const noncesKeyValueData = getMusig2NonceKeyValueData(psbt, inputIndex, rootWalletKey, sessionId);
|
|
169
|
+
if (noncesKeyValueData) {
|
|
170
|
+
psbt.addProprietaryKeyValToInput(inputIndex, noncesKeyValueData);
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
exports.setMusig2Nonces = setMusig2Nonces;
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVzaWcyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JpdGdvL011c2lnMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUg7QUFDbkgsbURBQTZGO0FBRTdGLDRDQUEwQztBQUUxQyx3Q0FBNEM7QUFFNUMsZ0RBQXFEO0FBb0JyRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0NBQXNDLENBQ3BELHNCQUEwRDtJQUUxRCxNQUFNLE9BQU8sR0FBRyxDQUFDLHNCQUFzQixDQUFDLFlBQVksRUFBRSxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUMxRyxtQ0FBbUIsQ0FBQyxNQUFNLENBQUMsQ0FDNUIsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsbUNBQW1CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyRyxNQUFNLEdBQUcsR0FBRztRQUNWLFVBQVUsRUFBRSxzQ0FBMkI7UUFDdkMsT0FBTyxFQUFFLGdDQUFxQixDQUFDLDJCQUEyQjtRQUMxRCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7S0FDaEMsQ0FBQztJQUNGLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUM5QyxDQUFDO0FBYkQsd0ZBYUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isa0NBQWtDLENBQ2hELGtCQUFnRDtJQUVoRCxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ3BGO0lBQ0QsTUFB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OUQ7SUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxFQUFFLEVBQUU7UUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7S0FDL0Q7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7UUFDN0MsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRyxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztTQUNsRTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQWJELDBDQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLCBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSwgVXR4b1BzYnQsIFByb3ByaWV0YXJ5S2V5U3VidHlwZSB9IGZyb20gJy4vVXR4b1BzYnQnO1xuaW1wb3J0IHsgY2hlY2tQbGFpblB1YmxpY0tleSwgY2hlY2tYT25seVB1YmxpY0tleSwgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJy4vb3V0cHV0U2NyaXB0cyc7XG5pbXBvcnQgeyBCSVAzMkludGVyZmFjZSB9IGZyb20gJ2JpcDMyJztcbmltcG9ydCB7IGVjYywgbXVzaWcgfSBmcm9tICcuLi9ub2JsZV9lY2MnO1xuaW1wb3J0IHsgVHVwbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHRhcFR3ZWFrUHVia2V5IH0gZnJvbSAnLi4vdGFwcm9vdCc7XG5pbXBvcnQgeyBUYXBCaXAzMkRlcml2YXRpb24gfSBmcm9tICdiaXAxNzQvc3JjL2xpYi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoZWNrRm9ySW5wdXQgfSBmcm9tICdiaXAxNzQvc3JjL2xpYi91dGlscyc7XG5cbi8qKlxuICogIFBhcnRpY2lwYW50IGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbHVlRGF0YSB7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICB0YXBJbnRlcm5hbEtleTogQnVmZmVyO1xuICBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj47XG59XG5cbi8qKlxuICogIE5vbmNlIGtleSB2YWx1ZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHNidE11c2lnMk5vbmNlc0tleVZhbHVlRGF0YSB7XG4gIHBhcnRpY2lwYW50UHViS2V5OiBCdWZmZXI7XG4gIHRhcE91dHB1dEtleTogQnVmZmVyO1xuICBwdWJOb25jZXM6IEJ1ZmZlcjtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcGFydGljaXBhbnRzIHB1YiBrZXlzLiBTdWJUeXBlIGlzIDB4MDFcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiB4LW9ubHkgdGFwT3V0cHV0S2V5fHx0YXBJbnRlcm5hbEtleSBhcyBzdWIga2V5ZGF0YSwgcGxhaW4gc2lnaW5pbmcgcGFydGljaXBhbnQga2V5cyBhcyB2YWx1ZWRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBwYXJ0aWNpcGFudHNLZXlWYWxEYXRhOiBQc2J0TXVzaWcyUGFydGljaXBhbnRzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGNvbnN0IGtleWRhdGEgPSBbcGFydGljaXBhbnRzS2V5VmFsRGF0YS50YXBPdXRwdXRLZXksIHBhcnRpY2lwYW50c0tleVZhbERhdGEudGFwSW50ZXJuYWxLZXldLm1hcCgocHVia2V5KSA9PlxuICAgIGNoZWNrWE9ubHlQdWJsaWNLZXkocHVia2V5KVxuICApO1xuICBjb25zdCB2YWx1ZSA9IHBhcnRpY2lwYW50c0tleVZhbERhdGEucGFydGljaXBhbnRQdWJLZXlzLm1hcCgocHVia2V5KSA9PiBjaGVja1BsYWluUHVibGljS2V5KHB1YmtleSkpO1xuICBjb25zdCBrZXkgPSB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gICAga2V5ZGF0YTogQnVmZmVyLmNvbmNhdChrZXlkYXRhKSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogQnVmZmVyLmNvbmNhdCh2YWx1ZSkgfTtcbn1cblxuLyoqXG4gKiBQc2J0IHByb3ByaWV0YXJ5IGtleSB2YWwgdXRpbCBmdW5jdGlvbiBmb3IgcHViIG5vbmNlLiBTdWJUeXBlIGlzIDB4MDJcbiAqIFJlZjogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2Fua2V0MTcyOS80YjUyNWM2MDQ5ZjRkOWUwMzRkMjczNjhjNDlmMjhhNlxuICogQHJldHVybiBwbGFpbi1wYXJ0aWNpcGFudFB1YktleXx8eC1vbmx5LXRhcE91dHB1dEtleSBhcyBzdWIga2V5ZGF0YSwgNjYgYnl0ZXMgb2YgMiBwdWIgbm9uY2VzIGFzIHZhbHVlZGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YShcbiAgbm9uY2VzS2V5VmFsdWVEYXRhOiBQc2J0TXVzaWcyTm9uY2VzS2V5VmFsdWVEYXRhXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlRGF0YSB7XG4gIGlmIChub25jZXNLZXlWYWx1ZURhdGEucHViTm9uY2VzLmxlbmd0aCAhPT0gNjYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHViTm9uY2VzIGxlbmd0aCAke25vbmNlc0tleVZhbHVlRGF0YS5wdWJOb25jZXMubGVuZ3RofWApO1xuICB9XG4gIGNvbnN0IGtleWRhdGEgPSBCdWZmZXIuY29uY2F0KFtcbiAgICBjaGVja1BsYWluUHVibGljS2V5KG5vbmNlc0tleVZhbHVlRGF0YS5wYXJ0aWNpcGFudFB1YktleSksXG4gICAgY2hlY2tYT25seVB1YmxpY0tleShub25jZXNLZXlWYWx1ZURhdGEudGFwT3V0cHV0S2V5KSxcbiAgXSk7XG4gIGNvbnN0IGtleSA9IHtcbiAgICBpZGVudGlmaWVyOiBQU0JUX1BST1BSSUVUQVJZX0lERU5USUZJRVIsXG4gICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QVUJfTk9OQ0UsXG4gICAga2V5ZGF0YSxcbiAgfTtcbiAgcmV0dXJuIHsga2V5LCB2YWx1ZTogbm9uY2VzS2V5VmFsdWVEYXRhLnB1Yk5vbmNlcyB9O1xufVxuXG4vKipcbiAqIERlY29kZXMgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGRhdGEgZm9yIHBhcnRpY2lwYW50IHB1YiBrZXlzXG4gKiBAcGFyYW0ga3ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWxEYXRhKFxuICBrdjogUHJvcHJpZXRhcnlLZXlWYWx1ZURhdGFcbik6IFBzYnRNdXNpZzJQYXJ0aWNpcGFudHNLZXlWYWx1ZURhdGEge1xuICBpZiAoXG4gICAga3Yua2V5LmlkZW50aWZpZXIgIT09IFBTQlRfUFJPUFJJRVRBUllfSURFTlRJRklFUiB8fFxuICAgIGt2LmtleS5zdWJ0eXBlICE9PSBQcm9wcmlldGFyeUtleVN1YnR5cGUuTVVTSUcyX1BBUlRJQ0lQQU5UX1BVQl9LRVlTXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpZGVudGlmaWVyICR7a3Yua2V5LmlkZW50aWZpZXJ9IG9yIHN1YnR5cGUgJHtrdi5rZXkuc3VidHlwZX0gZm9yIHBhcnRpY2lwYW50cyBwdWIga2V5c2ApO1xuICB9XG5cbiAgY29uc3Qga2V5ID0ga3Yua2V5LmtleWRhdGE7XG4gIGlmIChrZXkubGVuZ3RoICE9PSA2NCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBrZXlkYXRhIHNpemUgJHtrZXkubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0ga3YudmFsdWU7XG4gIGlmICh2YWx1ZS5sZW5ndGggIT09IDY2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlZGF0YSBzaXplICR7dmFsdWUubGVuZ3RofSBmb3IgcGFydGljaXBhbnQgcHViIGtleXNgKTtcbiAgfVxuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleXM6IFR1cGxlPEJ1ZmZlcj4gPSBbdmFsdWUuc3ViYXJyYXkoMCwgMzMpLCB2YWx1ZS5zdWJhcnJheSgzMyldO1xuICBpZiAocGFydGljaXBhbnRQdWJLZXlzWzBdLmVxdWFscyhwYXJ0aWNpcGFudFB1YktleXNbMV0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgcGFydGljaXBhbnQgcHViIGtleXMgZm91bmRgKTtcbiAgfVxuXG4gIHJldHVybiB7IHRhcE91dHB1dEtleToga2V5LnN1YmFycmF5KDAsIDMyKSwgdGFwSW50ZXJuYWxLZXk6IGtleS5zdWJhcnJheSgzMiksIHBhcnRpY2lwYW50UHViS2V5cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwSW50ZXJuYWxLZXkocGxhaW5QdWJLZXlzOiBCdWZmZXJbXSk6IEJ1ZmZlciB7XG4gIHBsYWluUHViS2V5cy5mb3JFYWNoKChwdWJLZXkpID0+IGNoZWNrUGxhaW5QdWJsaWNLZXkocHViS2V5KSk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShtdXNpZy5nZXRYT25seVB1YmtleShtdXNpZy5rZXlBZ2cobXVzaWcua2V5U29ydChwbGFpblB1YktleXMpKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGFwT3V0cHV0S2V5KGludGVybmFsUHViS2V5OiBCdWZmZXIsIHRhcFRyZWVSb290OiBCdWZmZXIpOiBCdWZmZXIge1xuICBpZiAodGFwVHJlZVJvb3QubGVuZ3RoICE9PSAzMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0YXBUcmVlUm9vdCBzaXplICR7dGFwVHJlZVJvb3QubGVuZ3RofWApO1xuICB9XG4gIHJldHVybiBCdWZmZXIuZnJvbSh0YXBUd2Vha1B1YmtleShlY2MsIHRvWE9ubHlQdWJsaWNLZXkoaW50ZXJuYWxQdWJLZXkpLCB0YXBUcmVlUm9vdCkueE9ubHlQdWJrZXkpO1xufVxuXG5mdW5jdGlvbiBkZXJpdmVXYWxsZXRQdWJLZXkodGFwQmlwMzJEZXJpdmF0aW9uczogVGFwQmlwMzJEZXJpdmF0aW9uW10sIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlKTogQnVmZmVyIHtcbiAgY29uc3QgbXlEZXJpdmF0aW9ucyA9IHRhcEJpcDMyRGVyaXZhdGlvbnMuZmlsdGVyKChiaXBEdikgPT4ge1xuICAgIHJldHVybiBiaXBEdi5tYXN0ZXJGaW5nZXJwcmludC5lcXVhbHMocm9vdFdhbGxldEtleS5maW5nZXJwcmludCk7XG4gIH0pO1xuXG4gIGlmICghbXlEZXJpdmF0aW9ucy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZWQgb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBtYXN0ZXJGaW5nZXJwcmludCB0byBtYXRjaCB0aGUgcm9vdFdhbGxldEtleSBmaW5nZXJwcmludCcpO1xuICB9XG5cbiAgY29uc3QgbXlEZXJpdmF0aW9uID0gbXlEZXJpdmF0aW9ucy5maWx0ZXIoKGJpcER2KSA9PiB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gcm9vdFdhbGxldEtleS5kZXJpdmVQYXRoKGJpcER2LnBhdGgpLnB1YmxpY0tleTtcbiAgICByZXR1cm4gYmlwRHYucHVia2V5LmVxdWFscyh0b1hPbmx5UHVibGljS2V5KHB1YmxpY0tleSkpO1xuICB9KTtcblxuICBpZiAobXlEZXJpdmF0aW9uLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCB3YWxsZXQga2V5IHNob3VsZCBkZXJpdmUgb25lIHRhcEJpcDMyRGVyaXZhdGlvbicpO1xuICB9XG4gIHJldHVybiByb290V2FsbGV0S2V5LmRlcml2ZVBhdGgobXlEZXJpdmF0aW9uWzBdLnBhdGgpLnB1YmxpY0tleTtcbn1cblxuZnVuY3Rpb24gZ2V0TXVzaWcyTm9uY2VLZXlWYWx1ZURhdGEoXG4gIHBzYnQ6IFV0eG9Qc2J0LFxuICBpbnB1dEluZGV4OiBudW1iZXIsXG4gIHJvb3RXYWxsZXRLZXk6IEJJUDMySW50ZXJmYWNlLFxuICBzZXNzaW9uSWQ/OiBCdWZmZXJcbik6IFByb3ByaWV0YXJ5S2V5VmFsdWVEYXRhIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgaW5wdXQgPSBjaGVja0ZvcklucHV0KHBzYnQuZGF0YS5pbnB1dHMsIGlucHV0SW5kZXgpO1xuICBpZiAoIWlucHV0LnRhcEludGVybmFsS2V5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFpbnB1dC50YXBNZXJrbGVSb290KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBNZXJrbGVSb290IGlzIHJlcXVpcmVkIHRvIGdlbmVyYXRlIG5vbmNlJyk7XG4gIH1cblxuICBpZiAoIWlucHV0LnRhcEJpcDMyRGVyaXZhdGlvbj8ubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBCaXAzMkRlcml2YXRpb24gaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRpY2lwYW50c0tleVZhbHMgPSBwc2J0LmdldFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dEluZGV4LCB7XG4gICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgIHN1YnR5cGU6IFByb3ByaWV0YXJ5S2V5U3VidHlwZS5NVVNJRzJfUEFSVElDSVBBTlRfUFVCX0tFWVMsXG4gIH0pO1xuXG4gIGlmIChwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgJHtwYXJ0aWNpcGFudHNLZXlWYWxzLmxlbmd0aH0gbWF0Y2hpbmcgcGFydGljaXBhbnQga2V5IHZhbHVlIGluc3RlYWQgb2YgMWApO1xuICB9XG5cbiAgY29uc3QgcGFydGljaXBhbnRLZXlWYWxEYXRhID0gZGVjb2RlUHNidE11c2lnMlBhcnRpY2lwYW50c0tleVZhbERhdGEocGFydGljaXBhbnRzS2V5VmFsc1swXSk7XG4gIGNvbnN0IHBhcnRpY2lwYW50UHViS2V5cyA9IHBhcnRpY2lwYW50S2V5VmFsRGF0YS5wYXJ0aWNpcGFudFB1YktleXM7XG5cbiAgY29uc3QgdGFwSW50ZXJuYWxLZXkgPSBjcmVhdGVUYXBJbnRlcm5hbEtleShwYXJ0aWNpcGFudFB1YktleXMpO1xuICBpZiAoIXRhcEludGVybmFsS2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHBhcnRpY2lwYW50cyBrZXlhdGEgdGFwSW50ZXJuYWxLZXknKTtcbiAgfVxuXG4gIGNvbnN0IHRhcE91dHB1dEtleSA9IGNyZWF0ZVRhcE91dHB1dEtleSh0YXBJbnRlcm5hbEtleSwgaW5wdXQudGFwTWVya2xlUm9vdCk7XG4gIGlmICghdGFwT3V0cHV0S2V5LmVxdWFscyhwYXJ0aWNpcGFudEtleVZhbERhdGEudGFwT3V0cHV0S2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwYXJ0aWNpcGFudHMga2V5YXRhIHRhcE91dHB1dEtleScpO1xuICB9XG5cbiAgaWYgKCF0YXBJbnRlcm5hbEtleS5lcXVhbHMoaW5wdXQudGFwSW50ZXJuYWxLZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXBJbnRlcm5hbEtleSBhbmQgYWdncmVnYXRlZCBwYXJ0aWNpcGFudCBwdWIga2V5cyBkb2VzIG5vdCBtYXRjaCcpO1xuICB9XG5cbiAgY29uc3QgZGVyaXZlZFB1YktleSA9IGRlcml2ZVdhbGxldFB1YktleShpbnB1dC50YXBCaXAzMkRlcml2YXRpb24sIHJvb3RXYWxsZXRLZXkpO1xuICBjb25zdCBwYXJ0aWNpcGFudFB1YktleSA9IHBhcnRpY2lwYW50UHViS2V5cy5maW5kKChwdWJLZXkpID0+IHB1YktleS5lcXVhbHMoZGVyaXZlZFB1YktleSkpO1xuXG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHBhcnRpY2lwYW50UHViS2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFydGljaXBhbnQgcGxhaW4gcHViIGtleSBzaG91bGQgbWF0Y2ggb25lIHRhcEJpcDMyRGVyaXZhdGlvbiBwbGFpbiBwdWIga2V5Jyk7XG4gIH1cblxuICBjb25zdCB7IGhhc2ggfSA9IHBzYnQuZ2V0VGFwcm9vdEhhc2hGb3JTaWdDaGVja2VkKGlucHV0SW5kZXgpO1xuXG4gIGNvbnN0IG5vbmNlR2VuQXJncyA9IHtcbiAgICBzZXNzaW9uSWQsXG4gICAgcHVibGljS2V5OiBwYXJ0aWNpcGFudFB1YktleSxcbiAgICB4T25seVB1YmxpY0tleTogdGFwT3V0cHV0S2V5LFxuICAgIG1zZzogaGFzaCxcbiAgICBzZWNyZXRLZXk6IHJvb3RXYWxsZXRLZXkucHJpdmF0ZUtleSxcbiAgfTtcblxuICBjb25zdCBwdWJOb25jZXMgPSBCdWZmZXIuZnJvbShtdXNpZy5ub25jZUdlbihub25jZUdlbkFyZ3MpKTtcblxuICByZXR1cm4gZW5jb2RlUHNidE11c2lnMlB1Yk5vbmNlS2V5VmFsRGF0YSh7XG4gICAgcGFydGljaXBhbnRQdWJLZXksXG4gICAgdGFwT3V0cHV0S2V5LFxuICAgIHB1Yk5vbmNlcyxcbiAgfSk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGFuZCBzZXRzIE11c2lnMiBub25jZXMgdG8gcDJ0ck11c2lnMiBrZXkgcGF0aCBzcGVuZGluZyBpbnB1dHMuXG4gKiB0YXBJbnRlcm5hbGtleSwgdGFwTWVya2xlUm9vdCwgdGFwQmlwMzJEZXJpdmF0aW9uIGZvciByb290V2FsbGV0S2V5IGFyZSByZXF1aXJlZCBwZXIgcDJ0ck11c2lnMiBrZXkgcGF0aCBpbnB1dC5cbiAqIEFsc28gcGFydGljaXBhbnQga2V5cyBhcmUgcmVxdWlyZWQgZnJvbSBwc2J0IHByb3ByaWV0YXJ5IGtleSB2YWx1ZXMuXG4gKiBSZWY6IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NhbmtldDE3MjkvNGI1MjVjNjA0OWY0ZDllMDM0ZDI3MzY4YzQ5ZjI4YTZcbiAqIEBwYXJhbSBwc2J0XG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleVxuICogQHBhcmFtIHNlc3Npb25JZCBJZiBwcm92aWRlZCBpdCBtdXN0IGVpdGhlciBiZSBhIGNvdW50ZXIgdW5pcXVlIHRvIHRoaXMgc2VjcmV0IGtleSxcbiAqIChjb252ZXJ0ZWQgdG8gYW4gYXJyYXkgb2YgMzIgYnl0ZXMpLCBvciAzMiB1bmlmb3JtbHkgcmFuZG9tIGJ5dGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TXVzaWcyTm9uY2VzKHBzYnQ6IFV0eG9Qc2J0LCByb290V2FsbGV0S2V5OiBCSVAzMkludGVyZmFjZSwgc2Vzc2lvbklkPzogQnVmZmVyKTogdm9pZCB7XG4gIGlmIChyb290V2FsbGV0S2V5LmlzTmV1dGVyZWQoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJpdmF0ZSBrZXkgaXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgbm9uY2UnKTtcbiAgfVxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHNlc3Npb25JZCkgJiYgc2Vzc2lvbklkLmxlbmd0aCAhPT0gMzIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2Vzc2lvbklkIHNpemUgJHtzZXNzaW9uSWQubGVuZ3RofWApO1xuICB9XG4gIHBzYnQuZGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQsIGlucHV0SW5kZXgpID0+IHtcbiAgICBjb25zdCBub25jZXNLZXlWYWx1ZURhdGEgPSBnZXRNdXNpZzJOb25jZUtleVZhbHVlRGF0YShwc2J0LCBpbnB1dEluZGV4LCByb290V2FsbGV0S2V5LCBzZXNzaW9uSWQpO1xuICAgIGlmIChub25jZXNLZXlWYWx1ZURhdGEpIHtcbiAgICAgIHBzYnQuYWRkUHJvcHJpZXRhcnlLZXlWYWxUb0lucHV0KGlucHV0SW5kZXgsIG5vbmNlc0tleVZhbHVlRGF0YSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|