@bitgo-beta/abstract-utxo 1.6.1-alpha.451 → 1.6.1-alpha.453
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/dist/cjs/src/abstractUtxoCoin.d.ts +10 -8
- package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/cjs/src/abstractUtxoCoin.js +8 -12
- package/dist/cjs/src/impl/bch/bch.d.ts +4 -2
- package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -1
- package/dist/cjs/src/impl/bch/bch.js +4 -3
- package/dist/cjs/src/impl/bch/tbch.d.ts +2 -0
- package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -1
- package/dist/cjs/src/impl/bch/tbch.js +3 -36
- package/dist/cjs/src/impl/bcha/bcha.d.ts +3 -2
- package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -1
- package/dist/cjs/src/impl/bcha/bcha.js +4 -37
- package/dist/cjs/src/impl/bcha/tbcha.d.ts +2 -0
- package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -1
- package/dist/cjs/src/impl/bcha/tbcha.js +3 -36
- package/dist/cjs/src/impl/bsv/bsv.d.ts +3 -2
- package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -1
- package/dist/cjs/src/impl/bsv/bsv.js +4 -37
- package/dist/cjs/src/impl/bsv/tbsv.d.ts +2 -0
- package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -1
- package/dist/cjs/src/impl/bsv/tbsv.js +3 -36
- package/dist/cjs/src/impl/btc/btc.d.ts +4 -2
- package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/btc.js +4 -37
- package/dist/cjs/src/impl/btc/tbtc.d.ts +2 -0
- package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/tbtc.js +3 -36
- package/dist/cjs/src/impl/btc/tbtc4.d.ts +2 -0
- package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/tbtc4.js +3 -36
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +2 -0
- package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/tbtcbgsig.js +3 -36
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts +2 -0
- package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -1
- package/dist/cjs/src/impl/btc/tbtcsig.js +3 -36
- package/dist/cjs/src/impl/btg/btg.d.ts +4 -2
- package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -1
- package/dist/cjs/src/impl/btg/btg.js +4 -37
- package/dist/cjs/src/impl/dash/dash.d.ts +4 -2
- package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -1
- package/dist/cjs/src/impl/dash/dash.js +4 -37
- package/dist/cjs/src/impl/dash/tdash.d.ts +2 -0
- package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -1
- package/dist/cjs/src/impl/dash/tdash.js +3 -36
- package/dist/cjs/src/impl/doge/doge.d.ts +4 -2
- package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -1
- package/dist/cjs/src/impl/doge/doge.js +4 -4
- package/dist/cjs/src/impl/doge/tdoge.d.ts +2 -0
- package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -1
- package/dist/cjs/src/impl/doge/tdoge.js +3 -36
- package/dist/cjs/src/impl/ltc/ltc.d.ts +4 -2
- package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/ltc.js +4 -3
- package/dist/cjs/src/impl/ltc/tltc.d.ts +2 -0
- package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/cjs/src/impl/ltc/tltc.js +3 -2
- package/dist/cjs/src/impl/zec/tzec.d.ts +2 -0
- package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/tzec.js +3 -36
- package/dist/cjs/src/impl/zec/zec.d.ts +4 -2
- package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -1
- package/dist/cjs/src/impl/zec/zec.js +4 -37
- package/dist/cjs/src/names.d.ts +12 -4
- package/dist/cjs/src/names.d.ts.map +1 -1
- package/dist/cjs/src/names.js +66 -57
- package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/backupKeyRecovery.js +32 -17
- package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/cjs/src/recovery/crossChainRecovery.js +25 -18
- package/dist/cjs/src/recovery/psbt.d.ts +6 -6
- package/dist/cjs/src/recovery/psbt.d.ts.map +1 -1
- package/dist/cjs/src/recovery/psbt.js +50 -36
- package/dist/cjs/src/tnumber.d.ts +4 -0
- package/dist/cjs/src/tnumber.d.ts.map +1 -0
- package/dist/cjs/src/tnumber.js +12 -0
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +1 -1
- package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/SigningError.js +1 -1
- package/dist/cjs/src/transaction/fixedScript/{signPsbt.d.ts → signPsbtUtxolib.d.ts} +4 -13
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +157 -0
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +2 -7
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +3 -17
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +7 -0
- package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/cjs/src/transaction/fixedScript/signTransaction.js +25 -6
- package/dist/cjs/src/wallet.js +2 -2
- package/dist/cjs/test/unit/coins.js +18 -1
- package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +2 -2
- package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +4 -6
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/abstractUtxoCoin.d.ts +10 -8
- package/dist/esm/abstractUtxoCoin.d.ts.map +1 -1
- package/dist/esm/abstractUtxoCoin.js +9 -13
- package/dist/esm/impl/bch/bch.d.ts +4 -2
- package/dist/esm/impl/bch/bch.d.ts.map +1 -1
- package/dist/esm/impl/bch/bch.js +4 -3
- package/dist/esm/impl/bch/tbch.d.ts +2 -0
- package/dist/esm/impl/bch/tbch.d.ts.map +1 -1
- package/dist/esm/impl/bch/tbch.js +3 -3
- package/dist/esm/impl/bcha/bcha.d.ts +3 -2
- package/dist/esm/impl/bcha/bcha.d.ts.map +1 -1
- package/dist/esm/impl/bcha/bcha.js +4 -4
- package/dist/esm/impl/bcha/tbcha.d.ts +2 -0
- package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -1
- package/dist/esm/impl/bcha/tbcha.js +3 -3
- package/dist/esm/impl/bsv/bsv.d.ts +3 -2
- package/dist/esm/impl/bsv/bsv.d.ts.map +1 -1
- package/dist/esm/impl/bsv/bsv.js +4 -4
- package/dist/esm/impl/bsv/tbsv.d.ts +2 -0
- package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -1
- package/dist/esm/impl/bsv/tbsv.js +3 -3
- package/dist/esm/impl/btc/btc.d.ts +4 -2
- package/dist/esm/impl/btc/btc.d.ts.map +1 -1
- package/dist/esm/impl/btc/btc.js +4 -4
- package/dist/esm/impl/btc/tbtc.d.ts +2 -0
- package/dist/esm/impl/btc/tbtc.d.ts.map +1 -1
- package/dist/esm/impl/btc/tbtc.js +3 -3
- package/dist/esm/impl/btc/tbtc4.d.ts +2 -0
- package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -1
- package/dist/esm/impl/btc/tbtc4.js +3 -3
- package/dist/esm/impl/btc/tbtcbgsig.d.ts +2 -0
- package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -1
- package/dist/esm/impl/btc/tbtcbgsig.js +3 -3
- package/dist/esm/impl/btc/tbtcsig.d.ts +2 -0
- package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -1
- package/dist/esm/impl/btc/tbtcsig.js +3 -3
- package/dist/esm/impl/btg/btg.d.ts +4 -2
- package/dist/esm/impl/btg/btg.d.ts.map +1 -1
- package/dist/esm/impl/btg/btg.js +4 -4
- package/dist/esm/impl/dash/dash.d.ts +4 -2
- package/dist/esm/impl/dash/dash.d.ts.map +1 -1
- package/dist/esm/impl/dash/dash.js +4 -4
- package/dist/esm/impl/dash/tdash.d.ts +2 -0
- package/dist/esm/impl/dash/tdash.d.ts.map +1 -1
- package/dist/esm/impl/dash/tdash.js +3 -3
- package/dist/esm/impl/doge/doge.d.ts +4 -2
- package/dist/esm/impl/doge/doge.d.ts.map +1 -1
- package/dist/esm/impl/doge/doge.js +4 -4
- package/dist/esm/impl/doge/tdoge.d.ts +2 -0
- package/dist/esm/impl/doge/tdoge.d.ts.map +1 -1
- package/dist/esm/impl/doge/tdoge.js +3 -3
- package/dist/esm/impl/ltc/ltc.d.ts +4 -2
- package/dist/esm/impl/ltc/ltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/ltc.js +4 -3
- package/dist/esm/impl/ltc/tltc.d.ts +2 -0
- package/dist/esm/impl/ltc/tltc.d.ts.map +1 -1
- package/dist/esm/impl/ltc/tltc.js +3 -2
- package/dist/esm/impl/zec/tzec.d.ts +2 -0
- package/dist/esm/impl/zec/tzec.d.ts.map +1 -1
- package/dist/esm/impl/zec/tzec.js +3 -3
- package/dist/esm/impl/zec/zec.d.ts +4 -2
- package/dist/esm/impl/zec/zec.d.ts.map +1 -1
- package/dist/esm/impl/zec/zec.js +4 -4
- package/dist/esm/names.d.ts +12 -4
- package/dist/esm/names.d.ts.map +1 -1
- package/dist/esm/names.js +61 -54
- package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/backupKeyRecovery.js +33 -18
- package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -1
- package/dist/esm/recovery/crossChainRecovery.js +26 -19
- package/dist/esm/recovery/psbt.d.ts +6 -6
- package/dist/esm/recovery/psbt.d.ts.map +1 -1
- package/dist/esm/recovery/psbt.js +50 -36
- package/dist/esm/tnumber.d.ts +4 -0
- package/dist/esm/tnumber.d.ts.map +1 -0
- package/dist/esm/tnumber.js +9 -0
- package/dist/esm/transaction/fixedScript/SigningError.d.ts +1 -1
- package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/SigningError.js +1 -1
- package/dist/esm/transaction/fixedScript/{signPsbt.d.ts → signPsbtUtxolib.d.ts} +4 -13
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
- package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +117 -0
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +2 -7
- package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signPsbtWasm.js +3 -17
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts +7 -0
- package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -1
- package/dist/esm/transaction/fixedScript/signTransaction.js +25 -7
- package/dist/esm/wallet.js +2 -2
- package/package.json +11 -11
- package/dist/cjs/src/transaction/fixedScript/signPsbt.d.ts.map +0 -1
- package/dist/cjs/src/transaction/fixedScript/signPsbt.js +0 -174
- package/dist/esm/transaction/fixedScript/signPsbt.d.ts.map +0 -1
- package/dist/esm/transaction/fixedScript/signPsbt.js +0 -134
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
-
import { fixedScriptWallet, utxolibCompat } from '@bitgo/wasm-utxo';
|
|
2
|
+
import { CoinName, fixedScriptWallet, utxolibCompat } from '@bitgo/wasm-utxo';
|
|
3
3
|
type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
|
|
4
4
|
type WalletUnspent<TNumber extends number | bigint> = utxolib.bitgo.WalletUnspent<TNumber>;
|
|
5
5
|
type ChainCode = utxolib.bitgo.ChainCode;
|
|
@@ -41,7 +41,7 @@ export interface CreateEmptyWasmPsbtOptions {
|
|
|
41
41
|
* @param options - Optional settings (e.g., blockHeight for Zcash)
|
|
42
42
|
* @returns A wasm-utxo BitGoPsbt instance
|
|
43
43
|
*/
|
|
44
|
-
export declare function createEmptyWasmPsbt(
|
|
44
|
+
export declare function createEmptyWasmPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, options?: CreateEmptyWasmPsbtOptions): fixedScriptWallet.BitGoPsbt;
|
|
45
45
|
/**
|
|
46
46
|
* Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
|
|
47
47
|
* Handles taproot inputs by setting the appropriate signPath.
|
|
@@ -60,7 +60,7 @@ export declare function addWalletInputsToWasmPsbt(wasmPsbt: fixedScriptWallet.Bi
|
|
|
60
60
|
* @param network - The network (used to convert address to script)
|
|
61
61
|
* @returns The output index
|
|
62
62
|
*/
|
|
63
|
-
export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint,
|
|
63
|
+
export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt, address: string, value: bigint, coinName: CoinName): number;
|
|
64
64
|
/**
|
|
65
65
|
* Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
|
|
66
66
|
*
|
|
@@ -68,7 +68,7 @@ export declare function addOutputToWasmPsbt(wasmPsbt: fixedScriptWallet.BitGoPsb
|
|
|
68
68
|
* @param network - The network
|
|
69
69
|
* @returns A utxolib UtxoPsbt
|
|
70
70
|
*/
|
|
71
|
-
export declare function
|
|
71
|
+
export declare function toPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoPsbt | utxolib.bitgo.UtxoPsbt, coinName: CoinName): utxolib.bitgo.UtxoPsbt;
|
|
72
72
|
/**
|
|
73
73
|
* Create a backup key recovery PSBT.
|
|
74
74
|
*
|
|
@@ -78,7 +78,7 @@ export declare function wasmPsbtToUtxolibPsbt(wasmPsbt: fixedScriptWallet.BitGoP
|
|
|
78
78
|
* @param options - Options for creating the PSBT
|
|
79
79
|
* @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
|
|
80
80
|
*/
|
|
81
|
-
export declare function createBackupKeyRecoveryPsbt(
|
|
82
|
-
export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt, address: string): bigint;
|
|
81
|
+
export declare function createBackupKeyRecoveryPsbt(coinName: CoinName, rootWalletKeys: RootWalletKeys, unspents: WalletUnspent<bigint>[], options: CreateBackupKeyRecoveryPsbtOptions, backend?: PsbtBackend): utxolib.bitgo.UtxoPsbt | fixedScriptWallet.BitGoPsbt;
|
|
82
|
+
export declare function getRecoveryAmount(psbt: utxolib.bitgo.UtxoPsbt | fixedScriptWallet.BitGoPsbt, walletKeys: RootWalletKeys, address: string): bigint;
|
|
83
83
|
export {};
|
|
84
84
|
//# sourceMappingURL=psbt.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"psbt.d.ts","sourceRoot":"","sources":["../../../src/recovery/psbt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAA0B,MAAM,kBAAkB,CAAC;AAItG,KAAK,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC;AACnD,KAAK,aAAa,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;AAI3F,KAAK,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;AAElD;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAIxD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,aAAa,CAAC,WAAW,CAMjF;AAmBD,UAAU,kCAAkC;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,4BAA4B,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAqED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,OAAO,CAAC,EAAE,0BAA0B,GACnC,iBAAiB,CAAC,SAAS,CAU7B;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,cAAc,EAAE,cAAc,GAC7B,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,EACrC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GACjB,MAAM,CAGR;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,CAAC,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC9D,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAMxB;AA6CD;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,EACjC,OAAO,EAAE,kCAAkC,EAC3C,OAAO,GAAE,WAAyB,GACjC,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAUtD;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,iBAAiB,CAAC,SAAS,EAC1D,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,MAAM,GACd,MAAM,CAkBR"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
2
|
import { Dimensions } from '@bitgo-beta/unspents';
|
|
3
|
-
import { fixedScriptWallet } from '@bitgo/wasm-utxo';
|
|
3
|
+
import { fixedScriptWallet, address as wasmAddress } from '@bitgo/wasm-utxo';
|
|
4
|
+
import { getNetworkFromCoinName } from '../names';
|
|
4
5
|
const { chainCodesP2tr, chainCodesP2trMusig2 } = utxolib.bitgo;
|
|
5
6
|
/**
|
|
6
7
|
* Check if a chain code is for a taproot script type
|
|
@@ -34,7 +35,8 @@ class InsufficientFundsError extends Error {
|
|
|
34
35
|
/**
|
|
35
36
|
* Create a backup key recovery PSBT using utxolib (legacy implementation)
|
|
36
37
|
*/
|
|
37
|
-
function createBackupKeyRecoveryPsbtUtxolib(
|
|
38
|
+
function createBackupKeyRecoveryPsbtUtxolib(coinName, rootWalletKeys, unspents, options) {
|
|
39
|
+
const network = getNetworkFromCoinName(coinName);
|
|
38
40
|
const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
|
|
39
41
|
const psbt = utxolib.bitgo.createPsbtForNetwork({ network });
|
|
40
42
|
utxolib.bitgo.addXpubsToPsbt(psbt, rootWalletKeys);
|
|
@@ -65,8 +67,8 @@ function createBackupKeyRecoveryPsbtUtxolib(network, rootWalletKeys, unspents, o
|
|
|
65
67
|
/**
|
|
66
68
|
* Check if the network is a Zcash network
|
|
67
69
|
*/
|
|
68
|
-
function
|
|
69
|
-
return
|
|
70
|
+
function isZcash(coinName) {
|
|
71
|
+
return coinName === 'zec' || coinName === 'tzec';
|
|
70
72
|
}
|
|
71
73
|
/**
|
|
72
74
|
* Default block heights for Zcash networks if not provided.
|
|
@@ -74,8 +76,8 @@ function isZcashNetwork(networkName) {
|
|
|
74
76
|
* TODO(BTC-2901): get the height from blockchair API instead of hardcoding.
|
|
75
77
|
*/
|
|
76
78
|
const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
zec: 3146400,
|
|
80
|
+
tzec: 3536500,
|
|
79
81
|
};
|
|
80
82
|
/**
|
|
81
83
|
* Create an empty wasm-utxo BitGoPsbt for a given network.
|
|
@@ -86,16 +88,15 @@ const ZCASH_DEFAULT_BLOCK_HEIGHTS = {
|
|
|
86
88
|
* @param options - Optional settings (e.g., blockHeight for Zcash)
|
|
87
89
|
* @returns A wasm-utxo BitGoPsbt instance
|
|
88
90
|
*/
|
|
89
|
-
export function createEmptyWasmPsbt(
|
|
90
|
-
|
|
91
|
-
if (isZcashNetwork(networkName)) {
|
|
91
|
+
export function createEmptyWasmPsbt(coinName, rootWalletKeys, options) {
|
|
92
|
+
if (isZcash(coinName)) {
|
|
92
93
|
// For Zcash, use ZcashBitGoPsbt which requires block height to determine consensus branch ID
|
|
93
|
-
const blockHeight = options?.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[
|
|
94
|
-
return fixedScriptWallet.ZcashBitGoPsbt.createEmpty(
|
|
94
|
+
const blockHeight = options?.blockHeight ?? ZCASH_DEFAULT_BLOCK_HEIGHTS[coinName];
|
|
95
|
+
return fixedScriptWallet.ZcashBitGoPsbt.createEmpty(coinName, rootWalletKeys, {
|
|
95
96
|
blockHeight,
|
|
96
97
|
});
|
|
97
98
|
}
|
|
98
|
-
return fixedScriptWallet.BitGoPsbt.createEmpty(
|
|
99
|
+
return fixedScriptWallet.BitGoPsbt.createEmpty(coinName, rootWalletKeys);
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
102
|
* Add wallet inputs from unspents to a wasm-utxo BitGoPsbt.
|
|
@@ -133,9 +134,9 @@ export function addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys) {
|
|
|
133
134
|
* @param network - The network (used to convert address to script)
|
|
134
135
|
* @returns The output index
|
|
135
136
|
*/
|
|
136
|
-
export function addOutputToWasmPsbt(wasmPsbt, address, value,
|
|
137
|
-
const script =
|
|
138
|
-
return wasmPsbt.addOutput({ script
|
|
137
|
+
export function addOutputToWasmPsbt(wasmPsbt, address, value, coinName) {
|
|
138
|
+
const script = wasmAddress.toOutputScriptWithCoin(address, coinName);
|
|
139
|
+
return wasmPsbt.addOutput({ script, value });
|
|
139
140
|
}
|
|
140
141
|
/**
|
|
141
142
|
* Convert a wasm-utxo BitGoPsbt to a utxolib UtxoPsbt.
|
|
@@ -144,23 +145,25 @@ export function addOutputToWasmPsbt(wasmPsbt, address, value, network) {
|
|
|
144
145
|
* @param network - The network
|
|
145
146
|
* @returns A utxolib UtxoPsbt
|
|
146
147
|
*/
|
|
147
|
-
export function
|
|
148
|
-
|
|
148
|
+
export function toPsbtToUtxolibPsbt(wasmPsbt, coinName) {
|
|
149
|
+
if (wasmPsbt instanceof fixedScriptWallet.BitGoPsbt) {
|
|
150
|
+
const network = getNetworkFromCoinName(coinName);
|
|
151
|
+
return utxolib.bitgo.createPsbtFromBuffer(Buffer.from(wasmPsbt.serialize()), network);
|
|
152
|
+
}
|
|
153
|
+
return wasmPsbt;
|
|
149
154
|
}
|
|
150
155
|
/**
|
|
151
156
|
* Create a backup key recovery PSBT using wasm-utxo
|
|
152
157
|
*/
|
|
153
|
-
function createBackupKeyRecoveryPsbtWasm(
|
|
158
|
+
function createBackupKeyRecoveryPsbtWasm(coinName, rootWalletKeys, unspents, options) {
|
|
154
159
|
const { feeRateSatVB, recoveryDestination, keyRecoveryServiceFee, keyRecoveryServiceFeeAddress } = options;
|
|
155
160
|
// Create PSBT with wasm-utxo and add wallet inputs using shared utilities
|
|
156
|
-
const wasmPsbt = createEmptyWasmPsbt(
|
|
161
|
+
const wasmPsbt = createEmptyWasmPsbt(coinName, rootWalletKeys, { blockHeight: options.blockHeight });
|
|
157
162
|
addWalletInputsToWasmPsbt(wasmPsbt, unspents, rootWalletKeys);
|
|
158
163
|
// Calculate dimensions using wasm-utxo Dimensions
|
|
159
|
-
|
|
160
|
-
let dimensions = fixedScriptWallet.Dimensions.fromPsbt(wasmPsbt).plus(fixedScriptWallet.Dimensions.fromOutput(new Uint8Array(recoveryOutputScript)));
|
|
164
|
+
let dimensions = fixedScriptWallet.Dimensions.fromPsbt(wasmPsbt).plus(fixedScriptWallet.Dimensions.fromOutput(recoveryDestination, coinName));
|
|
161
165
|
if (keyRecoveryServiceFeeAddress) {
|
|
162
|
-
|
|
163
|
-
dimensions = dimensions.plus(fixedScriptWallet.Dimensions.fromOutput(new Uint8Array(krsOutputScript)));
|
|
166
|
+
dimensions = dimensions.plus(fixedScriptWallet.Dimensions.fromOutput(keyRecoveryServiceFeeAddress, coinName));
|
|
164
167
|
}
|
|
165
168
|
const approximateFee = BigInt(dimensions.getVSize() * feeRateSatVB);
|
|
166
169
|
const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
|
|
@@ -169,12 +172,12 @@ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, opti
|
|
|
169
172
|
throw new InsufficientFundsError(totalInputAmount, approximateFee, keyRecoveryServiceFee, recoveryAmount);
|
|
170
173
|
}
|
|
171
174
|
// Add outputs to wasm PSBT
|
|
172
|
-
addOutputToWasmPsbt(wasmPsbt, recoveryDestination, recoveryAmount,
|
|
175
|
+
addOutputToWasmPsbt(wasmPsbt, recoveryDestination, recoveryAmount, coinName);
|
|
173
176
|
if (keyRecoveryServiceFeeAddress) {
|
|
174
|
-
addOutputToWasmPsbt(wasmPsbt, keyRecoveryServiceFeeAddress, keyRecoveryServiceFee,
|
|
177
|
+
addOutputToWasmPsbt(wasmPsbt, keyRecoveryServiceFeeAddress, keyRecoveryServiceFee, coinName);
|
|
175
178
|
}
|
|
176
179
|
// Convert to utxolib PSBT for signing and return
|
|
177
|
-
return
|
|
180
|
+
return wasmPsbt;
|
|
178
181
|
}
|
|
179
182
|
/**
|
|
180
183
|
* Create a backup key recovery PSBT.
|
|
@@ -185,23 +188,34 @@ function createBackupKeyRecoveryPsbtWasm(network, rootWalletKeys, unspents, opti
|
|
|
185
188
|
* @param options - Options for creating the PSBT
|
|
186
189
|
* @param backend - Which backend to use for PSBT creation (default: 'wasm-utxo')
|
|
187
190
|
*/
|
|
188
|
-
export function createBackupKeyRecoveryPsbt(
|
|
191
|
+
export function createBackupKeyRecoveryPsbt(coinName, rootWalletKeys, unspents, options, backend = 'wasm-utxo') {
|
|
189
192
|
if (options.keyRecoveryServiceFee > 0 && !options.keyRecoveryServiceFeeAddress) {
|
|
190
193
|
throw new Error('keyRecoveryServiceFeeAddress is required when keyRecoveryServiceFee is provided');
|
|
191
194
|
}
|
|
192
195
|
if (backend === 'wasm-utxo') {
|
|
193
|
-
return createBackupKeyRecoveryPsbtWasm(
|
|
196
|
+
return createBackupKeyRecoveryPsbtWasm(coinName, rootWalletKeys, unspents, options);
|
|
194
197
|
}
|
|
195
198
|
else {
|
|
196
|
-
return createBackupKeyRecoveryPsbtUtxolib(
|
|
199
|
+
return createBackupKeyRecoveryPsbtUtxolib(coinName, rootWalletKeys, unspents, options);
|
|
197
200
|
}
|
|
198
201
|
}
|
|
199
|
-
export function getRecoveryAmount(psbt, address) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
export function getRecoveryAmount(psbt, walletKeys, address) {
|
|
203
|
+
if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
|
|
204
|
+
const recoveryOutputScript = utxolib.address.toOutputScript(address, psbt.network);
|
|
205
|
+
const output = psbt.txOutputs.find((o) => o.script.equals(recoveryOutputScript));
|
|
206
|
+
if (!output) {
|
|
207
|
+
throw new Error(`Recovery destination output not found in PSBT: ${address}`);
|
|
208
|
+
}
|
|
209
|
+
return output.value;
|
|
210
|
+
}
|
|
211
|
+
if (psbt instanceof fixedScriptWallet.BitGoPsbt) {
|
|
212
|
+
const parsedOutputs = psbt.parseOutputsWithWalletKeys(walletKeys);
|
|
213
|
+
const recoveryOutput = parsedOutputs.find((o) => o.address === address);
|
|
214
|
+
if (!recoveryOutput) {
|
|
215
|
+
throw new Error(`Recovery destination output not found in PSBT: ${address}`);
|
|
216
|
+
}
|
|
217
|
+
return recoveryOutput.value;
|
|
204
218
|
}
|
|
205
|
-
|
|
219
|
+
throw new Error('Invalid PSBT type');
|
|
206
220
|
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQztBQUtwRSxNQUFNLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVcvRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZ0I7SUFDN0MsT0FBTyxDQUNKLGNBQW9DLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFLLG9CQUEwQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDckgsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBd0I7SUFDcEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxzQkFBdUIsU0FBUSxLQUFLO0lBQ3hDLFlBQ1MsZ0JBQXdCLEVBQ3hCLGNBQXNCLEVBQ3RCLE1BQWMsRUFDZCxjQUFzQjtRQUU3QixLQUFLLENBQ0gsaUZBQWlGO1lBQy9FLCtCQUErQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUM5RCx1REFBdUQsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2xGLG1CQUFtQixNQUFNLENBQUMsUUFBUSxFQUFFLElBQUk7WUFDeEMsMkRBQTJELGNBQWMs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TSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFDakYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IERpbWVuc2lvbnMgfSBmcm9tICdAYml0Z28tYmV0YS91bnNwZW50cyc7XG5pbXBvcnQgeyBmaXhlZFNjcmlwdFdhbGxldCwgdXR4b2xpYkNvbXBhdCB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcblxuY29uc3QgeyBjaGFpbkNvZGVzUDJ0ciwgY2hhaW5Db2Rlc1AydHJNdXNpZzIgfSA9IHV0eG9saWIuYml0Z287XG5cbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG5cbi8qKlxuICogQmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24uXG4gKiAtICd3YXNtLXV0eG8nOiBVc2Ugd2FzbS11dHhvIGZvciBQU0JUIGNyZWF0aW9uIChkZWZhdWx0KVxuICogLSAndXR4b2xpYic6IFVzZSB1dHhvbGliIGZvciBQU0JUIGNyZWF0aW9uIChsZWdhY3kpXG4gKi9cbmV4cG9ydCB0eXBlIFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bycgfCAndXR4b2xpYic7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjaGFpbiBjb2RlIGlzIGZvciBhIHRhcHJvb3Qgc2NyaXB0IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFwcm9vdENoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhaW5Db2Rlc1AydHIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKSB8fCAoY2hhaW5Db2Rlc1AydHJNdXNpZzIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdXR4b2xpYiBOZXR3b3JrIHRvIHdhc20tdXR4byBuZXR3b3JrIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTmV0d29ya05hbWUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogdXR4b2xpYkNvbXBhdC5VdHhvbGliTmFtZSB7XG4gIGNvbnN0IG5ldHdvcmtOYW1lID0gdXR4b2xpYi5nZXROZXR3b3JrTmFtZShuZXR3b3JrKTtcbiAgaWYgKCFuZXR3b3JrTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXR3b3JrYCk7XG4gIH1cbiAgcmV0dXJuIG5ldHdvcmtOYW1lO1xufVxuXG5jbGFzcyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdG90YWxJbnB1dEFtb3VudDogYmlnaW50LFxuICAgIHB1YmxpYyBhcHByb3hpbWF0ZUZlZTogYmlnaW50LFxuICAgIHB1YmxpYyBrcnNGZWU6IGJpZ2ludCxcbiAgICBwdWJsaWMgcmVjb3ZlcnlBbW91bnQ6IGJpZ2ludFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGBUaGlzIHdhbGxldCdzIGJhbGFuY2UgaXMgdG9vIGxvdyB0byBwYXkgdGhlIGZlZXMgc3BlY2lmaWVkIGJ5IHRoZSBLUlMgcHJvdmlkZXIuYCArXG4gICAgICAgIGBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBgICtcbiAgICAgICAgYEVzdGltYXRlZCBuZXR3b3JrIGZlZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uOiAke2FwcHJveGltYXRlRmVlLnRvU3RyaW5nKCl9YCArXG4gICAgICAgIGBLUlMgZmVlIHRvIHBheTogJHtrcnNGZWUudG9TdHJpbmcoKX0uIGAgK1xuICAgICAgICBgQWZ0ZXIgZGVkdWN0aW5nIGZlZXMsIHlvdXIgdG90YWwgcmVjb3ZlcmFibGUgYmFsYW5jZSBpcyAke3JlY292ZXJ5QW1vdW50LnRvU3RyaW5nKCl9YFxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMge1xuICBmZWVSYXRlU2F0VkI6IG51bWJlcjtcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrZXlSZWNvdmVyeVNlcnZpY2VGZWU6IGJpZ2ludDtcbiAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogQmxvY2sgaGVpZ2h0IGZvciBaY2FzaCBuZXR3b3JrcyAocmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSUQpICovXG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVCB1c2luZyB1dHhvbGliIChsZWdhY3kgaW1wbGVtZW50YXRpb24pXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFV0eG9saWIoXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCByb290V2FsbGV0S2V5cyk7XG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgcm9vdFdhbGxldEtleXMsICd1c2VyJywgJ2JhY2t1cCcpO1xuICB9KTtcblxuICBsZXQgZGltZW5zaW9ucyA9IERpbWVuc2lvbnMuZnJvbVBzYnQocHNidCkucGx1cyhcbiAgICBEaW1lbnNpb25zLmZyb21PdXRwdXQoeyBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNvdmVyeURlc3RpbmF0aW9uLCBuZXR3b3JrKSB9KVxuICApO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMucGx1cyhcbiAgICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7XG4gICAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoZGltZW5zaW9ucy5nZXRWU2l6ZSgpICogZmVlUmF0ZVNhdFZCKTtcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtleVJlY292ZXJ5U2VydmljZUZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgSW5zdWZmaWNpZW50RnVuZHNFcnJvcih0b3RhbElucHV0QW1vdW50LCBhcHByb3hpbWF0ZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCByZWNvdmVyeUFtb3VudCk7XG4gIH1cblxuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspLCB2YWx1ZTogcmVjb3ZlcnlBbW91bnQgfSk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBwc2J0LmFkZE91dHB1dCh7XG4gICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgIHZhbHVlOiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcHNidDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmV0d29yayBpcyBhIFpjYXNoIG5ldHdvcmtcbiAqL1xuZnVuY3Rpb24gaXNaY2FzaE5ldHdvcmsobmV0d29ya05hbWU6IHV0eG9saWJDb21wYXQuVXR4b2xpYk5hbWUpOiBib29sZWFuIHtcbiAgcmV0dXJuIG5ldHdvcmtOYW1lID09PSAnemNhc2gnIHx8IG5ldHdvcmtOYW1lID09PSAnemNhc2hUZXN0Jztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGJsb2NrIGhlaWdodHMgZm9yIFpjYXNoIG5ldHdvcmtzIGlmIG5vdCBwcm92aWRlZC5cbiAqIFRoZXNlIHNob3VsZCBiZSBzZXQgdG8gYSBoZWlnaHQgYWZ0ZXIgdGhlIGxhdGVzdCBuZXR3b3JrIHVwZ3JhZGUuXG4gKiBUT0RPKEJUQy0yOTAxKTogZ2V0IHRoZSBoZWlnaHQgZnJvbSBibG9ja2NoYWlyIEFQSSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcuXG4gKi9cbmNvbnN0IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUUzogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgemNhc2g6IDMxNDY0MDAsXG4gIHpjYXNoVGVzdDogMzUzNjUwMCxcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gZW1wdHkgd2FzbS11dHhvIFBTQlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9ucyB7XG4gIC8qKiBCbG9jayBoZWlnaHQgZm9yIFpjYXNoIG5ldHdvcmtzIChyZXF1aXJlZCB0byBkZXRlcm1pbmUgY29uc2Vuc3VzIGJyYW5jaCBJRCkgKi9cbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVtcHR5IHdhc20tdXR4byBCaXRHb1BzYnQgZm9yIGEgZ2l2ZW4gbmV0d29yay5cbiAqIEhhbmRsZXMgWmNhc2ggbmV0d29ya3Mgc3BlY2lhbGx5IGJ5IHVzaW5nIFpjYXNoQml0R29Qc2J0LlxuICpcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgZm9yIHRoZSBQU0JUXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgKGUuZy4sIGJsb2NrSGVpZ2h0IGZvciBaY2FzaClcbiAqIEByZXR1cm5zIEEgd2FzbS11dHhvIEJpdEdvUHNidCBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1wdHlXYXNtUHNidChcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIG9wdGlvbnM/OiBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9uc1xuKTogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgY29uc3QgbmV0d29ya05hbWUgPSB0b05ldHdvcmtOYW1lKG5ldHdvcmspO1xuXG4gIGlmIChpc1pjYXNoTmV0d29yayhuZXR3b3JrTmFtZSkpIHtcbiAgICAvLyBGb3IgWmNhc2gsIHVzZSBaY2FzaEJpdEdvUHNidCB3aGljaCByZXF1aXJlcyBibG9jayBoZWlnaHQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSURcbiAgICBjb25zdCBibG9ja0hlaWdodCA9IG9wdGlvbnM/LmJsb2NrSGVpZ2h0ID8/IFpDQVNIX0RFRkFVTFRfQkxPQ0tfSEVJR0hUU1tuZXR3b3JrTmFtZV07XG4gICAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LlpjYXNoQml0R29Qc2J0LmNyZWF0ZUVtcHR5KG5ldHdvcmtOYW1lIGFzICd6Y2FzaCcgfCAnemNhc2hUZXN0Jywgcm9vdFdhbGxldEtleXMsIHtcbiAgICAgIGJsb2NrSGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidC5jcmVhdGVFbXB0eShuZXR3b3JrTmFtZSwgcm9vdFdhbGxldEtleXMpO1xufVxuXG4vKipcbiAqIEFkZCB3YWxsZXQgaW5wdXRzIGZyb20gdW5zcGVudHMgdG8gYSB3YXNtLXV0eG8gQml0R29Qc2J0LlxuICogSGFuZGxlcyB0YXByb290IGlucHV0cyBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBzaWduUGF0aC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBhZGQgaW5wdXRzIHRvXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgd2FsbGV0IHVuc3BlbnRzIHRvIGFkZCBhcyBpbnB1dHNcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5cyAtIFRoZSB3YWxsZXQga2V5c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IHZvaWQge1xuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlT3V0cHV0SWQodW5zcGVudC5pZCk7XG4gICAgY29uc3Qgc2lnblBhdGg6IGZpeGVkU2NyaXB0V2FsbGV0LlNpZ25QYXRoIHwgdW5kZWZpbmVkID0gaXNUYXByb290Q2hhaW4odW5zcGVudC5jaGFpbilcbiAgICAgID8geyBzaWduZXI6ICd1c2VyJywgY29zaWduZXI6ICdiYWNrdXAnIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gcHJldlR4IG1heSBiZSBhZGRlZCBkeW5hbWljYWxseSBpbiBiYWNrdXBLZXlSZWNvdmVyeSBmb3Igbm9uLXNlZ3dpdCBpbnB1dHNcbiAgICBjb25zdCBwcmV2VHggPSAodW5zcGVudCBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD4gJiB7IHByZXZUeD86IEJ1ZmZlciB9KS5wcmV2VHg7XG5cbiAgICB3YXNtUHNidC5hZGRXYWxsZXRJbnB1dChcbiAgICAgIHtcbiAgICAgICAgdHhpZCxcbiAgICAgICAgdm91dCxcbiAgICAgICAgdmFsdWU6IHVuc3BlbnQudmFsdWUsXG4gICAgICAgIHByZXZUeDogcHJldlR4LFxuICAgICAgfSxcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAge1xuICAgICAgICBzY3JpcHRJZDogeyBjaGFpbjogdW5zcGVudC5jaGFpbiwgaW5kZXg6IHVuc3BlbnQuaW5kZXggfSxcbiAgICAgICAgc2lnblBhdGgsXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkIGFuIG91dHB1dCB0byBhIHdhc20tdXR4byBCaXRHb1BzYnQuXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYWRkIHRoZSBvdXRwdXQgdG9cbiAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvdXRwdXQgdmFsdWUgaW4gc2F0b3NoaXNcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgKHVzZWQgdG8gY29udmVydCBhZGRyZXNzIHRvIHNjcmlwdClcbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE91dHB1dFRvV2FzbVBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIGFkZHJlc3M6IHN0cmluZyxcbiAgdmFsdWU6IGJpZ2ludCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiBudW1iZXIge1xuICBjb25zdCBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yayk7XG4gIHJldHVybiB3YXNtUHNidC5hZGRPdXRwdXQoeyBzY3JpcHQ6IG5ldyBVaW50OEFycmF5KHNjcmlwdCksIHZhbHVlIH0pO1xufVxuXG4vKipcbiAqIENvbnZlcnQgYSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGEgdXR4b2xpYiBVdHhvUHNidC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBjb252ZXJ0XG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrXG4gKiBAcmV0dXJucyBBIHV0eG9saWIgVXR4b1BzYnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhc21Qc2J0VG9VdHhvbGliUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgcmV0dXJuIHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZyb21CdWZmZXIoQnVmZmVyLmZyb20od2FzbVBzYnQuc2VyaWFsaXplKCkpLCBuZXR3b3JrKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgd2FzbS11dHhvXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFdhc20oXG4gIG5ldHdvcms6IHV0eG9saWIuTmV0d29yayxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCB7IGZlZVJhdGVTYXRWQiwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzIH0gPSBvcHRpb25zO1xuXG4gIC8vIENyZWF0ZSBQU0JUIHdpdGggd2FzbS11dHhvIGFuZCBhZGQgd2FsbGV0IGlucHV0cyB1c2luZyBzaGFyZWQgdXRpbGl0aWVzXG4gIGNvbnN0IHdhc21Qc2J0ID0gY3JlYXRlRW1wdHlXYXNtUHNidChuZXR3b3JrLCByb290V2FsbGV0S2V5cywgeyBibG9ja0hlaWdodDogb3B0aW9ucy5ibG9ja0hlaWdodCB9KTtcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCh3YXNtUHNidCwgdW5zcGVudHMsIHJvb3RXYWxsZXRLZXlzKTtcblxuICAvLyBDYWxjdWxhdGUgZGltZW5zaW9ucyB1c2luZyB3YXNtLXV0eG8gRGltZW5zaW9uc1xuICBjb25zdCByZWNvdmVyeU91dHB1dFNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChyZWNvdmVyeURlc3RpbmF0aW9uLCBuZXR3b3JrKTtcbiAgbGV0IGRpbWVuc2lvbnMgPSBmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21Qc2J0KHdhc21Qc2J0KS5wbHVzKFxuICAgIGZpeGVkU2NyaXB0V2FsbGV0LkRpbWVuc2lvbnMuZnJvbU91dHB1dChuZXcgVWludDhBcnJheShyZWNvdmVyeU91dHB1dFNjcmlwdCkpXG4gICk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBjb25zdCBrcnNPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayk7XG4gICAgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMucGx1cyhmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21PdXRwdXQobmV3IFVpbnQ4QXJyYXkoa3JzT3V0cHV0U2NyaXB0KSkpO1xuICB9XG5cbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoZGltZW5zaW9ucy5nZXRWU2l6ZSgpICogZmVlUmF0ZVNhdFZCKTtcbiAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHV0eG9saWIuYml0Z28udW5zcGVudFN1bSh1bnNwZW50cywgJ2JpZ2ludCcpO1xuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtleVJlY292ZXJ5U2VydmljZUZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgSW5zdWZmaWNpZW50RnVuZHNFcnJvcih0b3RhbElucHV0QW1vdW50LCBhcHByb3hpbWF0ZUZlZSwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCByZWNvdmVyeUFtb3VudCk7XG4gIH1cblxuICAvLyBBZGQgb3V0cHV0cyB0byB3YXNtIFBTQlRcbiAgYWRkT3V0cHV0VG9XYXNtUHNidCh3YXNtUHNidCwgcmVjb3ZlcnlEZXN0aW5hdGlvbiwgcmVjb3ZlcnlBbW91bnQsIG5ldHdvcmspO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgYWRkT3V0cHV0VG9XYXNtUHNidCh3YXNtUHNidCwga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlLCBuZXR3b3JrKTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdG8gdXR4b2xpYiBQU0JUIGZvciBzaWduaW5nIGFuZCByZXR1cm5cbiAgcmV0dXJuIHdhc21Qc2J0VG9VdHhvbGliUHNidCh3YXNtUHNidCwgbmV0d29yayk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYmFja3VwIGtleSByZWNvdmVyeSBQU0JULlxuICpcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgZm9yIHRoZSBQU0JUXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqIEBwYXJhbSB1bnNwZW50cyAtIFRoZSB1bnNwZW50cyB0byBpbmNsdWRlIGluIHRoZSBQU0JUXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBQU0JUXG4gKiBAcGFyYW0gYmFja2VuZCAtIFdoaWNoIGJhY2tlbmQgdG8gdXNlIGZvciBQU0JUIGNyZWF0aW9uIChkZWZhdWx0OiAnd2FzbS11dHhvJylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidChcbiAgbmV0d29yazogdXR4b2xpYi5OZXR3b3JrLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIHVuc3BlbnRzOiBXYWxsZXRVbnNwZW50PGJpZ2ludD5bXSxcbiAgb3B0aW9uczogQ3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0T3B0aW9ucyxcbiAgYmFja2VuZDogUHNidEJhY2tlbmQgPSAnd2FzbS11dHhvJ1xuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGlmIChvcHRpb25zLmtleVJlY292ZXJ5U2VydmljZUZlZSA+IDAgJiYgIW9wdGlvbnMua2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIHRocm93IG5ldyBFcnJvcigna2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcyBpcyByZXF1aXJlZCB3aGVuIGtleVJlY292ZXJ5U2VydmljZUZlZSBpcyBwcm92aWRlZCcpO1xuICB9XG5cbiAgaWYgKGJhY2tlbmQgPT09ICd3YXNtLXV0eG8nKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFdhc20obmV0d29yaywgcm9vdFdhbGxldEtleXMsIHVuc3BlbnRzLCBvcHRpb25zKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlQmFja3VwS2V5UmVjb3ZlcnlQc2J0VXR4b2xpYihuZXR3b3JrLCByb290V2FsbGV0S2V5cywgdW5zcGVudHMsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWNvdmVyeUFtb3VudChwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0LCBhZGRyZXNzOiBzdHJpbmcpOiBiaWdpbnQge1xuICBjb25zdCByZWNvdmVyeU91dHB1dFNjcmlwdCA9IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChhZGRyZXNzLCBwc2J0Lm5ldHdvcmspO1xuICBjb25zdCBvdXRwdXQgPSBwc2J0LnR4T3V0cHV0cy5maW5kKChvKSA9PiBvLnNjcmlwdC5lcXVhbHMocmVjb3ZlcnlPdXRwdXRTY3JpcHQpKTtcbiAgaWYgKCFvdXRwdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlY292ZXJ5IGRlc3RpbmF0aW9uIG91dHB1dCBub3QgZm91bmQgaW4gUFNCVDogJHthZGRyZXNzfWApO1xuICB9XG4gIHJldHVybiBvdXRwdXQudmFsdWU7XG59XG4iXX0=
|
|
221
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHNidC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9wc2J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sc0JBQXNCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBWSxpQkFBaUIsRUFBaUIsT0FBTyxJQUFJLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUtsRCxNQUFNLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQVcvRDs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBZ0I7SUFDN0MsT0FBTyxDQUNKLGNBQW9DLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFLLG9CQUEwQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FDckgsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBd0I7SUFDcEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsTUFBTSxzQkFBdUIsU0FBUSxLQUFLO0lBQ3hDLFlBQ1MsZ0JBQXdCLEVBQ3hCLGNBQXNCLEVBQ3RCLE1BQWMsRUFDZCxjQUFzQjtRQUU3QixLQUFLLENBQ0gsaUZBQWlGO1lBQy9FLCtCQUErQixnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSTtZQUM5RCx1REFBdUQsY0FBYyxDQUFDLFFBQVEsRUFB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Q0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLElBQUksWUFBWSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsMEJBQTBCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby1iZXRhL3Vuc3BlbnRzJztcbmltcG9ydCB7IENvaW5OYW1lLCBmaXhlZFNjcmlwdFdhbGxldCwgdXR4b2xpYkNvbXBhdCwgYWRkcmVzcyBhcyB3YXNtQWRkcmVzcyB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuXG5pbXBvcnQgeyBnZXROZXR3b3JrRnJvbUNvaW5OYW1lIH0gZnJvbSAnLi4vbmFtZXMnO1xuXG50eXBlIFJvb3RXYWxsZXRLZXlzID0gdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cztcbnR5cGUgV2FsbGV0VW5zcGVudDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PiA9IHV0eG9saWIuYml0Z28uV2FsbGV0VW5zcGVudDxUTnVtYmVyPjtcblxuY29uc3QgeyBjaGFpbkNvZGVzUDJ0ciwgY2hhaW5Db2Rlc1AydHJNdXNpZzIgfSA9IHV0eG9saWIuYml0Z287XG5cbnR5cGUgQ2hhaW5Db2RlID0gdXR4b2xpYi5iaXRnby5DaGFpbkNvZGU7XG5cbi8qKlxuICogQmFja2VuZCB0byB1c2UgZm9yIFBTQlQgY3JlYXRpb24uXG4gKiAtICd3YXNtLXV0eG8nOiBVc2Ugd2FzbS11dHhvIGZvciBQU0JUIGNyZWF0aW9uIChkZWZhdWx0KVxuICogLSAndXR4b2xpYic6IFVzZSB1dHhvbGliIGZvciBQU0JUIGNyZWF0aW9uIChsZWdhY3kpXG4gKi9cbmV4cG9ydCB0eXBlIFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bycgfCAndXR4b2xpYic7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBjaGFpbiBjb2RlIGlzIGZvciBhIHRhcHJvb3Qgc2NyaXB0IHR5cGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVGFwcm9vdENoYWluKGNoYWluOiBDaGFpbkNvZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAoY2hhaW5Db2Rlc1AydHIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKSB8fCAoY2hhaW5Db2Rlc1AydHJNdXNpZzIgYXMgcmVhZG9ubHkgbnVtYmVyW10pLmluY2x1ZGVzKGNoYWluKVxuICApO1xufVxuXG4vKipcbiAqIENvbnZlcnQgdXR4b2xpYiBOZXR3b3JrIHRvIHdhc20tdXR4byBuZXR3b3JrIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTmV0d29ya05hbWUobmV0d29yazogdXR4b2xpYi5OZXR3b3JrKTogdXR4b2xpYkNvbXBhdC5VdHhvbGliTmFtZSB7XG4gIGNvbnN0IG5ldHdvcmtOYW1lID0gdXR4b2xpYi5nZXROZXR3b3JrTmFtZShuZXR3b3JrKTtcbiAgaWYgKCFuZXR3b3JrTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXR3b3JrYCk7XG4gIH1cbiAgcmV0dXJuIG5ldHdvcmtOYW1lO1xufVxuXG5jbGFzcyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgdG90YWxJbnB1dEFtb3VudDogYmlnaW50LFxuICAgIHB1YmxpYyBhcHByb3hpbWF0ZUZlZTogYmlnaW50LFxuICAgIHB1YmxpYyBrcnNGZWU6IGJpZ2ludCxcbiAgICBwdWJsaWMgcmVjb3ZlcnlBbW91bnQ6IGJpZ2ludFxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGBUaGlzIHdhbGxldCdzIGJhbGFuY2UgaXMgdG9vIGxvdyB0byBwYXkgdGhlIGZlZXMgc3BlY2lmaWVkIGJ5IHRoZSBLUlMgcHJvdmlkZXIuYCArXG4gICAgICAgIGBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBgICtcbiAgICAgICAgYEVzdGltYXRlZCBuZXR3b3JrIGZlZSBmb3IgdGhlIHJlY292ZXJ5IHRyYW5zYWN0aW9uOiAke2FwcHJveGltYXRlRmVlLnRvU3RyaW5nKCl9YCArXG4gICAgICAgIGBLUlMgZmVlIHRvIHBheTogJHtrcnNGZWUudG9TdHJpbmcoKX0uIGAgK1xuICAgICAgICBgQWZ0ZXIgZGVkdWN0aW5nIGZlZXMsIHlvdXIgdG90YWwgcmVjb3ZlcmFibGUgYmFsYW5jZSBpcyAke3JlY292ZXJ5QW1vdW50LnRvU3RyaW5nKCl9YFxuICAgICk7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMge1xuICBmZWVSYXRlU2F0VkI6IG51bWJlcjtcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICBrZXlSZWNvdmVyeVNlcnZpY2VGZWU6IGJpZ2ludDtcbiAga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAvKiogQmxvY2sgaGVpZ2h0IGZvciBaY2FzaCBuZXR3b3JrcyAocmVxdWlyZWQgdG8gZGV0ZXJtaW5lIGNvbnNlbnN1cyBicmFuY2ggSUQpICovXG4gIGJsb2NrSGVpZ2h0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVCB1c2luZyB1dHhvbGliIChsZWdhY3kgaW1wbGVtZW50YXRpb24pXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFV0eG9saWIoXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQge1xuICBjb25zdCBuZXR3b3JrID0gZ2V0TmV0d29ya0Zyb21Db2luTmFtZShjb2luTmFtZSk7XG4gIGNvbnN0IHsgZmVlUmF0ZVNhdFZCLCByZWNvdmVyeURlc3RpbmF0aW9uLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgcHNidCA9IHV0eG9saWIuYml0Z28uY3JlYXRlUHNidEZvck5ldHdvcmsoeyBuZXR3b3JrIH0pO1xuICB1dHhvbGliLmJpdGdvLmFkZFhwdWJzVG9Qc2J0KHBzYnQsIHJvb3RXYWxsZXRLZXlzKTtcbiAgdW5zcGVudHMuZm9yRWFjaCgodW5zcGVudCkgPT4ge1xuICAgIHV0eG9saWIuYml0Z28uYWRkV2FsbGV0VW5zcGVudFRvUHNidChwc2J0LCB1bnNwZW50LCByb290V2FsbGV0S2V5cywgJ3VzZXInLCAnYmFja3VwJyk7XG4gIH0pO1xuXG4gIGxldCBkaW1lbnNpb25zID0gRGltZW5zaW9ucy5mcm9tUHNidChwc2J0KS5wbHVzKFxuICAgIERpbWVuc2lvbnMuZnJvbU91dHB1dCh7IHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHJlY292ZXJ5RGVzdGluYXRpb24sIG5ldHdvcmspIH0pXG4gICk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBkaW1lbnNpb25zID0gZGltZW5zaW9ucy5wbHVzKFxuICAgICAgRGltZW5zaW9ucy5mcm9tT3V0cHV0KHtcbiAgICAgICAgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgbmV0d29yayksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBjb25zdCBhcHByb3hpbWF0ZUZlZSA9IEJpZ0ludChkaW1lbnNpb25zLmdldFZTaXplKCkgKiBmZWVSYXRlU2F0VkIpO1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGNvbnN0IHJlY292ZXJ5QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGFwcHJveGltYXRlRmVlIC0ga2V5UmVjb3ZlcnlTZXJ2aWNlRmVlO1xuXG4gIGlmIChyZWNvdmVyeUFtb3VudCA8IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBJbnN1ZmZpY2llbnRGdW5kc0Vycm9yKHRvdGFsSW5wdXRBbW91bnQsIGFwcHJveGltYXRlRmVlLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIHJlY292ZXJ5QW1vdW50KTtcbiAgfVxuXG4gIHBzYnQuYWRkT3V0cHV0KHsgc2NyaXB0OiB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQocmVjb3ZlcnlEZXN0aW5hdGlvbiwgbmV0d29yayksIHZhbHVlOiByZWNvdmVyeUFtb3VudCB9KTtcblxuICBpZiAoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcykge1xuICAgIHBzYnQuYWRkT3V0cHV0KHtcbiAgICAgIHNjcmlwdDogdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MsIG5ldHdvcmspLFxuICAgICAgdmFsdWU6IGtleVJlY292ZXJ5U2VydmljZUZlZSxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSBuZXR3b3JrIGlzIGEgWmNhc2ggbmV0d29ya1xuICovXG5mdW5jdGlvbiBpc1pjYXNoKGNvaW5OYW1lOiBDb2luTmFtZSk6IGNvaW5OYW1lIGlzICd6ZWMnIHwgJ3R6ZWMnIHtcbiAgcmV0dXJuIGNvaW5OYW1lID09PSAnemVjJyB8fCBjb2luTmFtZSA9PT0gJ3R6ZWMnO1xufVxuXG4vKipcbiAqIERlZmF1bHQgYmxvY2sgaGVpZ2h0cyBmb3IgWmNhc2ggbmV0d29ya3MgaWYgbm90IHByb3ZpZGVkLlxuICogVGhlc2Ugc2hvdWxkIGJlIHNldCB0byBhIGhlaWdodCBhZnRlciB0aGUgbGF0ZXN0IG5ldHdvcmsgdXBncmFkZS5cbiAqIFRPRE8oQlRDLTI5MDEpOiBnZXQgdGhlIGhlaWdodCBmcm9tIGJsb2NrY2hhaXIgQVBJIGluc3RlYWQgb2YgaGFyZGNvZGluZy5cbiAqL1xuY29uc3QgWkNBU0hfREVGQVVMVF9CTE9DS19IRUlHSFRTOiBSZWNvcmQ8J3plYycgfCAndHplYycsIG51bWJlcj4gPSB7XG4gIHplYzogMzE0NjQwMCxcbiAgdHplYzogMzUzNjUwMCxcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYW4gZW1wdHkgd2FzbS11dHhvIFBTQlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9ucyB7XG4gIC8qKiBCbG9jayBoZWlnaHQgZm9yIFpjYXNoIG5ldHdvcmtzIChyZXF1aXJlZCB0byBkZXRlcm1pbmUgY29uc2Vuc3VzIGJyYW5jaCBJRCkgKi9cbiAgYmxvY2tIZWlnaHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVtcHR5IHdhc20tdXR4byBCaXRHb1BzYnQgZm9yIGEgZ2l2ZW4gbmV0d29yay5cbiAqIEhhbmRsZXMgWmNhc2ggbmV0d29ya3Mgc3BlY2lhbGx5IGJ5IHVzaW5nIFpjYXNoQml0R29Qc2J0LlxuICpcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgZm9yIHRoZSBQU0JUXG4gKiBAcGFyYW0gcm9vdFdhbGxldEtleXMgLSBUaGUgd2FsbGV0IGtleXNcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgc2V0dGluZ3MgKGUuZy4sIGJsb2NrSGVpZ2h0IGZvciBaY2FzaClcbiAqIEByZXR1cm5zIEEgd2FzbS11dHhvIEJpdEdvUHNidCBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW1wdHlXYXNtUHNidChcbiAgY29pbk5hbWU6IENvaW5OYW1lLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIG9wdGlvbnM/OiBDcmVhdGVFbXB0eVdhc21Qc2J0T3B0aW9uc1xuKTogZml4ZWRTY3JpcHRXYWxsZXQuQml0R29Qc2J0IHtcbiAgaWYgKGlzWmNhc2goY29pbk5hbWUpKSB7XG4gICAgLy8gRm9yIFpjYXNoLCB1c2UgWmNhc2hCaXRHb1BzYnQgd2hpY2ggcmVxdWlyZXMgYmxvY2sgaGVpZ2h0IHRvIGRldGVybWluZSBjb25zZW5zdXMgYnJhbmNoIElEXG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBvcHRpb25zPy5ibG9ja0hlaWdodCA/PyBaQ0FTSF9ERUZBVUxUX0JMT0NLX0hFSUdIVFNbY29pbk5hbWVdO1xuICAgIHJldHVybiBmaXhlZFNjcmlwdFdhbGxldC5aY2FzaEJpdEdvUHNidC5jcmVhdGVFbXB0eShjb2luTmFtZSwgcm9vdFdhbGxldEtleXMsIHtcbiAgICAgIGJsb2NrSGVpZ2h0LFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidC5jcmVhdGVFbXB0eShjb2luTmFtZSwgcm9vdFdhbGxldEtleXMpO1xufVxuXG4vKipcbiAqIEFkZCB3YWxsZXQgaW5wdXRzIGZyb20gdW5zcGVudHMgdG8gYSB3YXNtLXV0eG8gQml0R29Qc2J0LlxuICogSGFuZGxlcyB0YXByb290IGlucHV0cyBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBzaWduUGF0aC5cbiAqXG4gKiBAcGFyYW0gd2FzbVBzYnQgLSBUaGUgd2FzbS11dHhvIEJpdEdvUHNidCB0byBhZGQgaW5wdXRzIHRvXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgd2FsbGV0IHVuc3BlbnRzIHRvIGFkZCBhcyBpbnB1dHNcbiAqIEBwYXJhbSByb290V2FsbGV0S2V5cyAtIFRoZSB3YWxsZXQga2V5c1xuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdLFxuICByb290V2FsbGV0S2V5czogUm9vdFdhbGxldEtleXNcbik6IHZvaWQge1xuICB1bnNwZW50cy5mb3JFYWNoKCh1bnNwZW50KSA9PiB7XG4gICAgY29uc3QgeyB0eGlkLCB2b3V0IH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlT3V0cHV0SWQodW5zcGVudC5pZCk7XG4gICAgY29uc3Qgc2lnblBhdGg6IGZpeGVkU2NyaXB0V2FsbGV0LlNpZ25QYXRoIHwgdW5kZWZpbmVkID0gaXNUYXByb290Q2hhaW4odW5zcGVudC5jaGFpbilcbiAgICAgID8geyBzaWduZXI6ICd1c2VyJywgY29zaWduZXI6ICdiYWNrdXAnIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gcHJldlR4IG1heSBiZSBhZGRlZCBkeW5hbWljYWxseSBpbiBiYWNrdXBLZXlSZWNvdmVyeSBmb3Igbm9uLXNlZ3dpdCBpbnB1dHNcbiAgICBjb25zdCBwcmV2VHggPSAodW5zcGVudCBhcyBXYWxsZXRVbnNwZW50PGJpZ2ludD4gJiB7IHByZXZUeD86IEJ1ZmZlciB9KS5wcmV2VHg7XG5cbiAgICB3YXNtUHNidC5hZGRXYWxsZXRJbnB1dChcbiAgICAgIHtcbiAgICAgICAgdHhpZCxcbiAgICAgICAgdm91dCxcbiAgICAgICAgdmFsdWU6IHVuc3BlbnQudmFsdWUsXG4gICAgICAgIHByZXZUeDogcHJldlR4LFxuICAgICAgfSxcbiAgICAgIHJvb3RXYWxsZXRLZXlzLFxuICAgICAge1xuICAgICAgICBzY3JpcHRJZDogeyBjaGFpbjogdW5zcGVudC5jaGFpbiwgaW5kZXg6IHVuc3BlbnQuaW5kZXggfSxcbiAgICAgICAgc2lnblBhdGgsXG4gICAgICB9XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQWRkIGFuIG91dHB1dCB0byBhIHdhc20tdXR4byBCaXRHb1BzYnQuXG4gKlxuICogQHBhcmFtIHdhc21Qc2J0IC0gVGhlIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYWRkIHRoZSBvdXRwdXQgdG9cbiAqIEBwYXJhbSBhZGRyZXNzIC0gVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3NcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvdXRwdXQgdmFsdWUgaW4gc2F0b3NoaXNcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmsgKHVzZWQgdG8gY29udmVydCBhZGRyZXNzIHRvIHNjcmlwdClcbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgaW5kZXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZE91dHB1dFRvV2FzbVBzYnQoXG4gIHdhc21Qc2J0OiBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQsXG4gIGFkZHJlc3M6IHN0cmluZyxcbiAgdmFsdWU6IGJpZ2ludCxcbiAgY29pbk5hbWU6IENvaW5OYW1lXG4pOiBudW1iZXIge1xuICBjb25zdCBzY3JpcHQgPSB3YXNtQWRkcmVzcy50b091dHB1dFNjcmlwdFdpdGhDb2luKGFkZHJlc3MsIGNvaW5OYW1lKTtcbiAgcmV0dXJuIHdhc21Qc2J0LmFkZE91dHB1dCh7IHNjcmlwdCwgdmFsdWUgfSk7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHdhc20tdXR4byBCaXRHb1BzYnQgdG8gYSB1dHhvbGliIFV0eG9Qc2J0LlxuICpcbiAqIEBwYXJhbSB3YXNtUHNidCAtIFRoZSB3YXNtLXV0eG8gQml0R29Qc2J0IHRvIGNvbnZlcnRcbiAqIEBwYXJhbSBuZXR3b3JrIC0gVGhlIG5ldHdvcmtcbiAqIEByZXR1cm5zIEEgdXR4b2xpYiBVdHhvUHNidFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Qc2J0VG9VdHhvbGliUHNidChcbiAgd2FzbVBzYnQ6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gIGNvaW5OYW1lOiBDb2luTmFtZVxuKTogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB7XG4gIGlmICh3YXNtUHNidCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCkge1xuICAgIGNvbnN0IG5ldHdvcmsgPSBnZXROZXR3b3JrRnJvbUNvaW5OYW1lKGNvaW5OYW1lKTtcbiAgICByZXR1cm4gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3YXNtUHNidC5zZXJpYWxpemUoKSksIG5ldHdvcmspO1xuICB9XG4gIHJldHVybiB3YXNtUHNidDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBiYWNrdXAga2V5IHJlY292ZXJ5IFBTQlQgdXNpbmcgd2FzbS11dHhvXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidFdhc20oXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnNcbik6IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCB7XG4gIGNvbnN0IHsgZmVlUmF0ZVNhdFZCLCByZWNvdmVyeURlc3RpbmF0aW9uLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgfSA9IG9wdGlvbnM7XG5cbiAgLy8gQ3JlYXRlIFBTQlQgd2l0aCB3YXNtLXV0eG8gYW5kIGFkZCB3YWxsZXQgaW5wdXRzIHVzaW5nIHNoYXJlZCB1dGlsaXRpZXNcbiAgY29uc3Qgd2FzbVBzYnQgPSBjcmVhdGVFbXB0eVdhc21Qc2J0KGNvaW5OYW1lLCByb290V2FsbGV0S2V5cywgeyBibG9ja0hlaWdodDogb3B0aW9ucy5ibG9ja0hlaWdodCB9KTtcbiAgYWRkV2FsbGV0SW5wdXRzVG9XYXNtUHNidCh3YXNtUHNidCwgdW5zcGVudHMsIHJvb3RXYWxsZXRLZXlzKTtcblxuICAvLyBDYWxjdWxhdGUgZGltZW5zaW9ucyB1c2luZyB3YXNtLXV0eG8gRGltZW5zaW9uc1xuICBsZXQgZGltZW5zaW9ucyA9IGZpeGVkU2NyaXB0V2FsbGV0LkRpbWVuc2lvbnMuZnJvbVBzYnQod2FzbVBzYnQpLnBsdXMoXG4gICAgZml4ZWRTY3JpcHRXYWxsZXQuRGltZW5zaW9ucy5mcm9tT3V0cHV0KHJlY292ZXJ5RGVzdGluYXRpb24sIGNvaW5OYW1lKVxuICApO1xuXG4gIGlmIChrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzKSB7XG4gICAgZGltZW5zaW9ucyA9IGRpbWVuc2lvbnMucGx1cyhmaXhlZFNjcmlwdFdhbGxldC5EaW1lbnNpb25zLmZyb21PdXRwdXQoa2V5UmVjb3ZlcnlTZXJ2aWNlRmVlQWRkcmVzcywgY29pbk5hbWUpKTtcbiAgfVxuXG4gIGNvbnN0IGFwcHJveGltYXRlRmVlID0gQmlnSW50KGRpbWVuc2lvbnMuZ2V0VlNpemUoKSAqIGZlZVJhdGVTYXRWQik7XG4gIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSB1dHhvbGliLmJpdGdvLnVuc3BlbnRTdW0odW5zcGVudHMsICdiaWdpbnQnKTtcbiAgY29uc3QgcmVjb3ZlcnlBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gYXBwcm94aW1hdGVGZWUgLSBrZXlSZWNvdmVyeVNlcnZpY2VGZWU7XG5cbiAgaWYgKHJlY292ZXJ5QW1vdW50IDwgQmlnSW50KDApKSB7XG4gICAgdGhyb3cgbmV3IEluc3VmZmljaWVudEZ1bmRzRXJyb3IodG90YWxJbnB1dEFtb3VudCwgYXBwcm94aW1hdGVGZWUsIGtleVJlY292ZXJ5U2VydmljZUZlZSwgcmVjb3ZlcnlBbW91bnQpO1xuICB9XG5cbiAgLy8gQWRkIG91dHB1dHMgdG8gd2FzbSBQU0JUXG4gIGFkZE91dHB1dFRvV2FzbVBzYnQod2FzbVBzYnQsIHJlY292ZXJ5RGVzdGluYXRpb24sIHJlY292ZXJ5QW1vdW50LCBjb2luTmFtZSk7XG5cbiAgaWYgKGtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICBhZGRPdXRwdXRUb1dhc21Qc2J0KHdhc21Qc2J0LCBrZXlSZWNvdmVyeVNlcnZpY2VGZWVBZGRyZXNzLCBrZXlSZWNvdmVyeVNlcnZpY2VGZWUsIGNvaW5OYW1lKTtcbiAgfVxuXG4gIC8vIENvbnZlcnQgdG8gdXR4b2xpYiBQU0JUIGZvciBzaWduaW5nIGFuZCByZXR1cm5cbiAgcmV0dXJuIHdhc21Qc2J0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhY2t1cCBrZXkgcmVjb3ZlcnkgUFNCVC5cbiAqXG4gKiBAcGFyYW0gbmV0d29yayAtIFRoZSBuZXR3b3JrIGZvciB0aGUgUFNCVFxuICogQHBhcmFtIHJvb3RXYWxsZXRLZXlzIC0gVGhlIHdhbGxldCBrZXlzXG4gKiBAcGFyYW0gdW5zcGVudHMgLSBUaGUgdW5zcGVudHMgdG8gaW5jbHVkZSBpbiB0aGUgUFNCVFxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgUFNCVFxuICogQHBhcmFtIGJhY2tlbmQgLSBXaGljaCBiYWNrZW5kIHRvIHVzZSBmb3IgUFNCVCBjcmVhdGlvbiAoZGVmYXVsdDogJ3dhc20tdXR4bycpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnQoXG4gIGNvaW5OYW1lOiBDb2luTmFtZSxcbiAgcm9vdFdhbGxldEtleXM6IFJvb3RXYWxsZXRLZXlzLFxuICB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10sXG4gIG9wdGlvbnM6IENyZWF0ZUJhY2t1cEtleVJlY292ZXJ5UHNidE9wdGlvbnMsXG4gIGJhY2tlbmQ6IFBzYnRCYWNrZW5kID0gJ3dhc20tdXR4bydcbik6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgfCBmaXhlZFNjcmlwdFdhbGxldC5CaXRHb1BzYnQge1xuICBpZiAob3B0aW9ucy5rZXlSZWNvdmVyeVNlcnZpY2VGZWUgPiAwICYmICFvcHRpb25zLmtleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleVJlY292ZXJ5U2VydmljZUZlZUFkZHJlc3MgaXMgcmVxdWlyZWQgd2hlbiBrZXlSZWNvdmVyeVNlcnZpY2VGZWUgaXMgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGlmIChiYWNrZW5kID09PSAnd2FzbS11dHhvJykge1xuICAgIHJldHVybiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRXYXNtKGNvaW5OYW1lLCByb290V2FsbGV0S2V5cywgdW5zcGVudHMsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjcmVhdGVCYWNrdXBLZXlSZWNvdmVyeVBzYnRVdHhvbGliKGNvaW5OYW1lLCByb290V2FsbGV0S2V5cywgdW5zcGVudHMsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWNvdmVyeUFtb3VudChcbiAgcHNidDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCB8IGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGFkZHJlc3M6IHN0cmluZ1xuKTogYmlnaW50IHtcbiAgaWYgKHBzYnQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgY29uc3QgcmVjb3ZlcnlPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgcHNidC5uZXR3b3JrKTtcbiAgICBjb25zdCBvdXRwdXQgPSBwc2J0LnR4T3V0cHV0cy5maW5kKChvKSA9PiBvLnNjcmlwdC5lcXVhbHMocmVjb3ZlcnlPdXRwdXRTY3JpcHQpKTtcbiAgICBpZiAoIW91dHB1dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNvdmVyeSBkZXN0aW5hdGlvbiBvdXRwdXQgbm90IGZvdW5kIGluIFBTQlQ6ICR7YWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC52YWx1ZTtcbiAgfVxuICBpZiAocHNidCBpbnN0YW5jZW9mIGZpeGVkU2NyaXB0V2FsbGV0LkJpdEdvUHNidCkge1xuICAgIGNvbnN0IHBhcnNlZE91dHB1dHMgPSBwc2J0LnBhcnNlT3V0cHV0c1dpdGhXYWxsZXRLZXlzKHdhbGxldEtleXMpO1xuICAgIGNvbnN0IHJlY292ZXJ5T3V0cHV0ID0gcGFyc2VkT3V0cHV0cy5maW5kKChvKSA9PiBvLmFkZHJlc3MgPT09IGFkZHJlc3MpO1xuICAgIGlmICghcmVjb3ZlcnlPdXRwdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjb3ZlcnkgZGVzdGluYXRpb24gb3V0cHV0IG5vdCBmb3VuZCBpbiBQU0JUOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHJldHVybiByZWNvdmVyeU91dHB1dC52YWx1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUFNCVCB0eXBlJyk7XG59XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function toTNumber(value: number | bigint, amountType: 'number'): number;
|
|
2
|
+
export declare function toTNumber(value: number | bigint, amountType: 'bigint'): bigint;
|
|
3
|
+
export declare function toTNumber(value: number | bigint, amountType: 'number' | 'bigint'): number | bigint;
|
|
4
|
+
//# sourceMappingURL=tnumber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tnumber.d.ts","sourceRoot":"","sources":["../../src/tnumber.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,MAAM,CAAC;AAChF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function toTNumber(value, amountType) {
|
|
2
|
+
switch (amountType) {
|
|
3
|
+
case 'number':
|
|
4
|
+
return Number(value);
|
|
5
|
+
case 'bigint':
|
|
6
|
+
return BigInt(value);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90bnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBc0IsRUFBRSxVQUErQjtJQUMvRSxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ25CLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLEtBQUssUUFBUTtZQUNYLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIHRvVE51bWJlcih2YWx1ZTogbnVtYmVyIHwgYmlnaW50LCBhbW91bnRUeXBlOiAnbnVtYmVyJyk6IG51bWJlcjtcbmV4cG9ydCBmdW5jdGlvbiB0b1ROdW1iZXIodmFsdWU6IG51bWJlciB8IGJpZ2ludCwgYW1vdW50VHlwZTogJ2JpZ2ludCcpOiBiaWdpbnQ7XG5leHBvcnQgZnVuY3Rpb24gdG9UTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBiaWdpbnQsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcpOiBudW1iZXIgfCBiaWdpbnQ7XG5leHBvcnQgZnVuY3Rpb24gdG9UTnVtYmVyKHZhbHVlOiBudW1iZXIgfCBiaWdpbnQsIGFtb3VudFR5cGU6ICdudW1iZXInIHwgJ2JpZ2ludCcpOiBudW1iZXIgfCBiaWdpbnQge1xuICBzd2l0Y2ggKGFtb3VudFR5cGUpIHtcbiAgICBjYXNlICdudW1iZXInOlxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIHJldHVybiBCaWdJbnQodmFsdWUpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
2
|
-
import type { PsbtParsedScriptType } from './
|
|
2
|
+
import type { PsbtParsedScriptType } from './signPsbtUtxolib';
|
|
3
3
|
type Unspent<TNumber extends number | bigint = number> = utxolib.bitgo.Unspent<TNumber>;
|
|
4
4
|
export declare class InputSigningError<TNumber extends number | bigint = number> extends Error {
|
|
5
5
|
inputIndex: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SigningError.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/SigningError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"SigningError.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/SigningError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAEhD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,KAAK,OAAO,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAExF,qBAAa,iBAAiB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;IAe3E,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI;IACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE;IAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;IAjB/B,MAAM,CAAC,qBAAqB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAC1D,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GACzC,iBAAiB,CAAC,OAAO,CAAC;gBAUpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,oBAAoB,GAAG,IAAI,EAAE,qCAAqC;IAC7E,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,EAC1C,MAAM,EAAE,KAAK,GAAG,MAAM;CAIhC;AAED,qBAAa,uBAAuB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,CAAE,SAAQ,KAAK;gBAC9E,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,EAAE;CAMhG"}
|
|
@@ -18,4 +18,4 @@ export class TransactionSigningError extends Error {
|
|
|
18
18
|
`verify errors at inputs: [${verifyError.join(',')}], see log for details`);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbmluZ0Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L1NpZ25pbmdFcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxNQUFNLE9BQU8saUJBQTRELFNBQVEsS0FBSztJQUNwRixNQUFNLENBQUMscUJBQXFCLENBQzFCLFVBQWtCLEVBQ2xCLFNBQXNDLEVBQUUscUNBQXFDO0lBQzdFLE9BQTBDO1FBRTFDLE9BQU8sSUFBSSxpQkFBaUIsQ0FDMUIsVUFBVSxFQUNWLFNBQVMsRUFDVCxPQUFPLEVBQ1AsdURBQXVELENBQ3hELENBQUM7SUFDSixDQUFDO0lBRUQsWUFDUyxVQUFrQixFQUNsQixTQUFzQyxFQUFFLHFDQUFxQztJQUM3RSxPQUEwQyxFQUMxQyxNQUFzQjtRQUU3QixLQUFLLENBQUMsMEJBQTBCLFVBQVUsVUFBVSxTQUFTLGNBQWMsT0FBTyxDQUFDLEVBQUUsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBTDdGLGVBQVUsR0FBVixVQUFVLENBQVE7UUFDbEIsY0FBUyxHQUFULFNBQVMsQ0FBNkI7UUFDdEMsWUFBTyxHQUFQLE9BQU8sQ0FBbUM7UUFDMUMsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7SUFHL0IsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHVCQUFrRSxTQUFRLEtBQUs7SUFDMUYsWUFBWSxVQUF3QyxFQUFFLFdBQXlDO1FBQzdGLEtBQUssQ0FDSCwyQkFBMkIsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSztZQUNsRCw2QkFBNkIsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQzdFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcblxuaW1wb3J0IHR5cGUgeyBQc2J0UGFyc2VkU2NyaXB0VHlwZSB9IGZyb20gJy4vc2lnblBzYnRVdHhvbGliJztcblxudHlwZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+ID0gdXR4b2xpYi5iaXRnby5VbnNwZW50PFROdW1iZXI+O1xuXG5leHBvcnQgY2xhc3MgSW5wdXRTaWduaW5nRXJyb3I8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCA9IG51bWJlcj4gZXh0ZW5kcyBFcnJvciB7XG4gIHN0YXRpYyBleHBlY3RlZFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gICAgaW5wdXRJbmRleDogbnVtYmVyLFxuICAgIGlucHV0VHlwZTogUHNidFBhcnNlZFNjcmlwdFR5cGUgfCBudWxsLCAvLyBudWxsIGZvciBsZWdhY3kgdHJhbnNhY3Rpb24gZm9ybWF0XG4gICAgdW5zcGVudDogVW5zcGVudDxUTnVtYmVyPiB8IHsgaWQ6IHN0cmluZyB9XG4gICk6IElucHV0U2lnbmluZ0Vycm9yPFROdW1iZXI+IHtcbiAgICByZXR1cm4gbmV3IElucHV0U2lnbmluZ0Vycm9yKFxuICAgICAgaW5wdXRJbmRleCxcbiAgICAgIGlucHV0VHlwZSxcbiAgICAgIHVuc3BlbnQsXG4gICAgICBgbm90IGEgd2FsbGV0IHVuc3BlbnQsIG5vdCBhIHJlcGxheSBwcm90ZWN0aW9uIHVuc3BlbnRgXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBpbnB1dEluZGV4OiBudW1iZXIsXG4gICAgcHVibGljIGlucHV0VHlwZTogUHNidFBhcnNlZFNjcmlwdFR5cGUgfCBudWxsLCAvLyBudWxsIGZvciBsZWdhY3kgdHJhbnNhY3Rpb24gZm9ybWF0XG4gICAgcHVibGljIHVuc3BlbnQ6IFVuc3BlbnQ8VE51bWJlcj4gfCB7IGlkOiBzdHJpbmcgfSxcbiAgICBwdWJsaWMgcmVhc29uOiBFcnJvciB8IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihgc2lnbmluZyBlcnJvciBhdCBpbnB1dCAke2lucHV0SW5kZXh9OiB0eXBlPSR7aW5wdXRUeXBlfSB1bnNwZW50SWQ9JHt1bnNwZW50LmlkfTogJHtyZWFzb259YCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uU2lnbmluZ0Vycm9yPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihzaWduRXJyb3JzOiBJbnB1dFNpZ25pbmdFcnJvcjxUTnVtYmVyPltdLCB2ZXJpZnlFcnJvcjogSW5wdXRTaWduaW5nRXJyb3I8VE51bWJlcj5bXSkge1xuICAgIHN1cGVyKFxuICAgICAgYHNpZ24gZXJyb3JzIGF0IGlucHV0czogWyR7c2lnbkVycm9ycy5qb2luKCcsJyl9XSwgYCArXG4gICAgICAgIGB2ZXJpZnkgZXJyb3JzIGF0IGlucHV0czogWyR7dmVyaWZ5RXJyb3Iuam9pbignLCcpfV0sIHNlZSBsb2cgZm9yIGRldGFpbHNgXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -7,24 +7,15 @@ export type PsbtParsedScriptType = 'p2sh' | 'p2wsh' | 'p2shP2wsh' | 'p2shP2pk' |
|
|
|
7
7
|
* Collects and logs signing errors and verification errors, throws error in the end if any of them
|
|
8
8
|
* failed.
|
|
9
9
|
*
|
|
10
|
-
* If it is the last signature, finalize and extract the transaction from the psbt.
|
|
11
|
-
*
|
|
12
10
|
* This function mirrors signAndVerifyWalletTransaction, but is used for signing PSBTs instead of
|
|
13
11
|
* using TransactionBuilder
|
|
14
12
|
*
|
|
15
13
|
* @param psbt
|
|
16
14
|
* @param signerKeychain
|
|
17
|
-
* @param isLastSignature
|
|
18
15
|
*/
|
|
19
|
-
export declare function signAndVerifyPsbt(psbt: utxolib.bitgo.UtxoPsbt, signerKeychain: utxolib.BIP32Interface
|
|
20
|
-
|
|
21
|
-
allowNonSegwitSigningWithoutPrevTx, }: {
|
|
22
|
-
isLastSignature: boolean;
|
|
23
|
-
allowNonSegwitSigningWithoutPrevTx?: boolean;
|
|
24
|
-
}): utxolib.bitgo.UtxoPsbt | utxolib.bitgo.UtxoTransaction<bigint>;
|
|
25
|
-
export declare function signPsbtWithMusig2Participant(coin: Musig2Participant<utxolib.bitgo.UtxoPsbt>, tx: utxolib.bitgo.UtxoPsbt, signerKeychain: BIP32Interface | undefined, params: {
|
|
26
|
-
isLastSignature: boolean;
|
|
16
|
+
export declare function signAndVerifyPsbt(psbt: utxolib.bitgo.UtxoPsbt, signerKeychain: utxolib.BIP32Interface): utxolib.bitgo.UtxoPsbt;
|
|
17
|
+
export declare function signPsbtWithMusig2ParticipantUtxolib(coin: Musig2Participant<utxolib.bitgo.UtxoPsbt>, tx: utxolib.bitgo.UtxoPsbt, signerKeychain: BIP32Interface | undefined, params: {
|
|
27
18
|
signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
|
|
28
19
|
walletId: string | undefined;
|
|
29
|
-
}): Promise<utxolib.bitgo.UtxoPsbt
|
|
30
|
-
//# sourceMappingURL=
|
|
20
|
+
}): Promise<utxolib.bitgo.UtxoPsbt>;
|
|
21
|
+
//# sourceMappingURL=signPsbtUtxolib.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signPsbtUtxolib.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/signPsbtUtxolib.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAI7C,MAAM,MAAM,oBAAoB,GAC5B,MAAM,GACN,OAAO,GACP,WAAW,GACX,UAAU,GACV,qBAAqB,GACrB,wBAAwB,GAExB,YAAY,GACZ,sBAAsB,GACtB,mBAAmB,CAAC;AAExB;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC5B,cAAc,EAAE,OAAO,CAAC,cAAc,GACrC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAwDxB;AAYD,wBAAsB,oCAAoC,CACxD,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAC/C,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,EAC1B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,MAAM,EAAE;IACN,WAAW,EAAE,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GACA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CA6CjC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import * as utxolib from '@bitgo-beta/utxo-lib';
|
|
3
|
+
import { bitgo } from '@bitgo-beta/utxo-lib';
|
|
4
|
+
import debugLib from 'debug';
|
|
5
|
+
import { InputSigningError, TransactionSigningError } from './SigningError';
|
|
6
|
+
const debug = debugLib('bitgo:v2:utxo');
|
|
7
|
+
/**
|
|
8
|
+
* Sign all inputs of a psbt and verify signatures after signing.
|
|
9
|
+
* Collects and logs signing errors and verification errors, throws error in the end if any of them
|
|
10
|
+
* failed.
|
|
11
|
+
*
|
|
12
|
+
* This function mirrors signAndVerifyWalletTransaction, but is used for signing PSBTs instead of
|
|
13
|
+
* using TransactionBuilder
|
|
14
|
+
*
|
|
15
|
+
* @param psbt
|
|
16
|
+
* @param signerKeychain
|
|
17
|
+
*/
|
|
18
|
+
export function signAndVerifyPsbt(psbt, signerKeychain) {
|
|
19
|
+
const txInputs = psbt.txInputs;
|
|
20
|
+
const outputIds = [];
|
|
21
|
+
const scriptTypes = [];
|
|
22
|
+
const signErrors = psbt.data.inputs
|
|
23
|
+
.map((input, inputIndex) => {
|
|
24
|
+
const outputId = utxolib.bitgo.formatOutputId(utxolib.bitgo.getOutputIdForInput(txInputs[inputIndex]));
|
|
25
|
+
outputIds.push(outputId);
|
|
26
|
+
const { scriptType } = utxolib.bitgo.parsePsbtInput(input);
|
|
27
|
+
scriptTypes.push(scriptType);
|
|
28
|
+
if (scriptType === 'p2shP2pk') {
|
|
29
|
+
debug('Skipping signature for input %d of %d (RP input?)', inputIndex + 1, psbt.data.inputs.length);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
psbt.signInputHD(inputIndex, signerKeychain);
|
|
34
|
+
debug('Successfully signed input %d of %d', inputIndex + 1, psbt.data.inputs.length);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
return new InputSigningError(inputIndex, scriptType, { id: outputId }, e);
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
.filter((e) => e !== undefined);
|
|
41
|
+
const verifyErrors = psbt.data.inputs
|
|
42
|
+
.map((input, inputIndex) => {
|
|
43
|
+
const scriptType = scriptTypes[inputIndex];
|
|
44
|
+
if (scriptType === 'p2shP2pk') {
|
|
45
|
+
debug('Skipping input signature %d of %d (unspent from replay protection address which is platform signed only)', inputIndex + 1, psbt.data.inputs.length);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const outputId = outputIds[inputIndex];
|
|
49
|
+
try {
|
|
50
|
+
if (!psbt.validateSignaturesOfInputHD(inputIndex, signerKeychain)) {
|
|
51
|
+
return new InputSigningError(inputIndex, scriptType, { id: outputId }, new Error(`invalid signature`));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
debug('Invalid signature');
|
|
56
|
+
return new InputSigningError(inputIndex, scriptType, { id: outputId }, e);
|
|
57
|
+
}
|
|
58
|
+
})
|
|
59
|
+
.filter((e) => e !== undefined);
|
|
60
|
+
if (signErrors.length || verifyErrors.length) {
|
|
61
|
+
throw new TransactionSigningError(signErrors, verifyErrors);
|
|
62
|
+
}
|
|
63
|
+
return psbt;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Key Value: Unsigned tx id => PSBT
|
|
67
|
+
* It is used to cache PSBTs with taproot key path (MuSig2) inputs during external express signer is activated.
|
|
68
|
+
* Reason: MuSig2 signer secure nonce is cached in the UtxoPsbt object. It will be required during the signing step.
|
|
69
|
+
* For more info, check SignTransactionOptions.signingStep
|
|
70
|
+
*
|
|
71
|
+
* TODO BTC-276: This cache may need to be done with LRU like memory safe caching if memory issues comes up.
|
|
72
|
+
*/
|
|
73
|
+
const PSBT_CACHE = new Map();
|
|
74
|
+
export async function signPsbtWithMusig2ParticipantUtxolib(coin, tx, signerKeychain, params) {
|
|
75
|
+
if (bitgo.isTransactionWithKeyPathSpendInput(tx)) {
|
|
76
|
+
switch (params.signingStep) {
|
|
77
|
+
case 'signerNonce':
|
|
78
|
+
assert(signerKeychain);
|
|
79
|
+
tx.setAllInputsMusig2NonceHD(signerKeychain);
|
|
80
|
+
PSBT_CACHE.set(tx.getUnsignedTx().getId(), tx);
|
|
81
|
+
return tx;
|
|
82
|
+
case 'cosignerNonce':
|
|
83
|
+
assert(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
|
|
84
|
+
return await coin.getMusig2Nonces(tx, params.walletId);
|
|
85
|
+
case 'signerSignature':
|
|
86
|
+
const txId = tx.getUnsignedTx().getId();
|
|
87
|
+
const psbt = PSBT_CACHE.get(txId);
|
|
88
|
+
assert(psbt, `Psbt is missing from txCache (cache size ${PSBT_CACHE.size}).
|
|
89
|
+
This may be due to the request being routed to a different BitGo-Express instance that for signing step 'signerNonce'.`);
|
|
90
|
+
PSBT_CACHE.delete(txId);
|
|
91
|
+
tx = psbt.combine(tx);
|
|
92
|
+
break;
|
|
93
|
+
default:
|
|
94
|
+
// this instance is not an external signer
|
|
95
|
+
assert(params.walletId, 'walletId is required for MuSig2 bitgo nonce');
|
|
96
|
+
assert(signerKeychain);
|
|
97
|
+
tx.setAllInputsMusig2NonceHD(signerKeychain);
|
|
98
|
+
const response = await coin.getMusig2Nonces(tx, params.walletId);
|
|
99
|
+
tx = tx.combine(response);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
switch (params.signingStep) {
|
|
105
|
+
case 'signerNonce':
|
|
106
|
+
case 'cosignerNonce':
|
|
107
|
+
/**
|
|
108
|
+
* In certain cases, the caller of this method may not know whether the txHex contains a psbt with taproot key path spend input(s).
|
|
109
|
+
* Instead of throwing error, no-op and return the txHex. So that the caller can call this method in the same sequence.
|
|
110
|
+
*/
|
|
111
|
+
return tx;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
assert(signerKeychain);
|
|
115
|
+
return signAndVerifyPsbt(tx, signerKeychain);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnblBzYnRVdHhvbGliLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RyYW5zYWN0aW9uL2ZpeGVkU2NyaXB0L3NpZ25Qc2J0VXR4b2xpYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxLQUFLLE9BQU8sTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0MsT0FBTyxRQUFRLE1BQU0sT0FBTyxDQUFDO0FBRTdCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRzVFLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQWN4Qzs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixJQUE0QixFQUM1QixjQUFzQztJQUV0QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9CLE1BQU0sU0FBUyxHQUFhLEVBQUUsQ0FBQztJQUMvQixNQUFNLFdBQVcsR0FBMkIsRUFBRSxDQUFDO0lBRS9DLE1BQU0sVUFBVSxHQUFnQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07U0FDN0QsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQWtCLEVBQUUsRUFBRTtRQUNqQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkcsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV6QixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFD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QU0sQ0FBQztRQUNOLFFBQVEsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQzNCLEtBQUssYUFBYSxDQUFDO1lBQ25CLEtBQUssZUFBZTtnQkFDbEI7OzttQkFHRztnQkFDSCxPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8saUJBQWlCLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgYml0Z28gfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgZGVidWdMaWIgZnJvbSAnZGVidWcnO1xuXG5pbXBvcnQgeyBJbnB1dFNpZ25pbmdFcnJvciwgVHJhbnNhY3Rpb25TaWduaW5nRXJyb3IgfSBmcm9tICcuL1NpZ25pbmdFcnJvcic7XG5pbXBvcnQgeyBNdXNpZzJQYXJ0aWNpcGFudCB9IGZyb20gJy4vbXVzaWcyJztcblxuY29uc3QgZGVidWcgPSBkZWJ1Z0xpYignYml0Z286djI6dXR4bycpO1xuXG5leHBvcnQgdHlwZSBQc2J0UGFyc2VkU2NyaXB0VHlwZSA9XG4gIHwgJ3Ayc2gnXG4gIHwgJ3Ayd3NoJ1xuICB8ICdwMnNoUDJ3c2gnXG4gIHwgJ3Ayc2hQMnBrJ1xuICB8ICd0YXByb290S2V5UGF0aFNwZW5kJ1xuICB8ICd0YXByb290U2NyaXB0UGF0aFNwZW5kJ1xuICAvLyB3YXNtLXV0eG8gdHlwZXNcbiAgfCAncDJ0ckxlZ2FjeSdcbiAgfCAncDJ0ck11c2lnMlNjcmlwdFBhdGgnXG4gIHwgJ3AydHJNdXNpZzJLZXlQYXRoJztcblxuLyoqXG4gKiBTaWduIGFsbCBpbnB1dHMgb2YgYSBwc2J0IGFuZCB2ZXJpZnkgc2lnbmF0dXJlcyBhZnRlciBzaWduaW5nLlxuICogQ29sbGVjdHMgYW5kIGxvZ3Mgc2lnbmluZyBlcnJvcnMgYW5kIHZlcmlmaWNhdGlvbiBlcnJvcnMsIHRocm93cyBlcnJvciBpbiB0aGUgZW5kIGlmIGFueSBvZiB0aGVtXG4gKiBmYWlsZWQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBtaXJyb3JzIHNpZ25BbmRWZXJpZnlXYWxsZXRUcmFuc2FjdGlvbiwgYnV0IGlzIHVzZWQgZm9yIHNpZ25pbmcgUFNCVHMgaW5zdGVhZCBvZlxuICogdXNpbmcgVHJhbnNhY3Rpb25CdWlsZGVyXG4gKlxuICogQHBhcmFtIHBzYnRcbiAqIEBwYXJhbSBzaWduZXJLZXljaGFpblxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkFuZFZlcmlmeVBzYnQoXG4gIHBzYnQ6IHV0eG9saWIuYml0Z28uVXR4b1BzYnQsXG4gIHNpZ25lcktleWNoYWluOiB1dHhvbGliLkJJUDMySW50ZXJmYWNlXG4pOiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IHtcbiAgY29uc3QgdHhJbnB1dHMgPSBwc2J0LnR4SW5wdXRzO1xuICBjb25zdCBvdXRwdXRJZHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNjcmlwdFR5cGVzOiBQc2J0UGFyc2VkU2NyaXB0VHlwZVtdID0gW107XG5cbiAgY29uc3Qgc2lnbkVycm9yczogSW5wdXRTaWduaW5nRXJyb3I8YmlnaW50PltdID0gcHNidC5kYXRhLmlucHV0c1xuICAgIC5tYXAoKGlucHV0LCBpbnB1dEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IG91dHB1dElkID0gdXR4b2xpYi5iaXRnby5mb3JtYXRPdXRwdXRJZCh1dHhvbGliLmJpdGdvLmdldE91dHB1dElkRm9ySW5wdXQodHhJbnB1dHNbaW5wdXRJbmRleF0pKTtcbiAgICAgIG91dHB1dElkcy5wdXNoKG91dHB1dElkKTtcblxuICAgICAgY29uc3QgeyBzY3JpcHRUeXBlIH0gPSB1dHhvbGliLmJpdGdvLnBhcnNlUHNidElucHV0KGlucHV0KTtcbiAgICAgIHNjcmlwdFR5cGVzLnB1c2goc2NyaXB0VHlwZSk7XG5cbiAgICAgIGlmIChzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgICAgIGRlYnVnKCdTa2lwcGluZyBzaWduYXR1cmUgZm9yIGlucHV0ICVkIG9mICVkIChSUCBpbnB1dD8pJywgaW5wdXRJbmRleCArIDEsIHBzYnQuZGF0YS5pbnB1dHMubGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBwc2J0LnNpZ25JbnB1dEhEKGlucHV0SW5kZXgsIHNpZ25lcktleWNoYWluKTtcbiAgICAgICAgZGVidWcoJ1N1Y2Nlc3NmdWxseSBzaWduZWQgaW5wdXQgJWQgb2YgJWQnLCBpbnB1dEluZGV4ICsgMSwgcHNidC5kYXRhLmlucHV0cy5sZW5ndGgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gbmV3IElucHV0U2lnbmluZ0Vycm9yPGJpZ2ludD4oaW5wdXRJbmRleCwgc2NyaXB0VHlwZSwgeyBpZDogb3V0cHV0SWQgfSwgZSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKChlKTogZSBpcyBJbnB1dFNpZ25pbmdFcnJvcjxiaWdpbnQ+ID0+IGUgIT09IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgdmVyaWZ5RXJyb3JzOiBJbnB1dFNpZ25pbmdFcnJvcjxiaWdpbnQ+W10gPSBwc2J0LmRhdGEuaW5wdXRzXG4gICAgLm1hcCgoaW5wdXQsIGlucHV0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHNjcmlwdFR5cGUgPSBzY3JpcHRUeXBlc1tpbnB1dEluZGV4XTtcbiAgICAgIGlmIChzY3JpcHRUeXBlID09PSAncDJzaFAycGsnKSB7XG4gICAgICAgIGRlYnVnKFxuICAgICAgICAgICdTa2lwcGluZyBpbnB1dCBzaWduYXR1cmUgJWQgb2YgJWQgKHVuc3BlbnQgZnJvbSByZXBsYXkgcHJvdGVjdGlvbiBhZGRyZXNzIHdoaWNoIGlzIHBsYXRmb3JtIHNpZ25lZCBvbmx5KScsXG4gICAgICAgICAgaW5wdXRJbmRleCArIDEsXG4gICAgICAgICAgcHNidC5kYXRhLmlucHV0cy5sZW5ndGhcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvdXRwdXRJZCA9IG91dHB1dElkc1tpbnB1dEluZGV4XTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghcHNidC52YWxpZGF0ZVNpZ25hdHVyZXNPZklucHV0SEQoaW5wdXRJbmRleCwgc2lnbmVyS2V5Y2hhaW4pKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNpZ25pbmdFcnJvcihpbnB1dEluZGV4LCBzY3JpcHRUeXBlLCB7IGlkOiBvdXRwdXRJZCB9LCBuZXcgRXJyb3IoYGludmFsaWQgc2lnbmF0dXJlYCkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGRlYnVnKCdJbnZhbGlkIHNpZ25hdHVyZScpO1xuICAgICAgICByZXR1cm4gbmV3IElucHV0U2lnbmluZ0Vycm9yPGJpZ2ludD4oaW5wdXRJbmRleCwgc2NyaXB0VHlwZSwgeyBpZDogb3V0cHV0SWQgfSwgZSk7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKChlKTogZSBpcyBJbnB1dFNpZ25pbmdFcnJvcjxiaWdpbnQ+ID0+IGUgIT09IHVuZGVmaW5lZCk7XG5cbiAgaWYgKHNpZ25FcnJvcnMubGVuZ3RoIHx8IHZlcmlmeUVycm9ycy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVHJhbnNhY3Rpb25TaWduaW5nRXJyb3Ioc2lnbkVycm9ycywgdmVyaWZ5RXJyb3JzKTtcbiAgfVxuXG4gIHJldHVybiBwc2J0O1xufVxuXG4vKipcbiAqIEtleSBWYWx1ZTogVW5zaWduZWQgdHggaWQgPT4gUFNCVFxuICogSXQgaXMgdXNlZCB0byBjYWNoZSBQU0JUcyB3aXRoIHRhcHJvb3Qga2V5IHBhdGggKE11U2lnMikgaW5wdXRzIGR1cmluZyBleHRlcm5hbCBleHByZXNzIHNpZ25lciBpcyBhY3RpdmF0ZWQuXG4gKiBSZWFzb246IE11U2lnMiBzaWduZXIgc2VjdXJlIG5vbmNlIGlzIGNhY2hlZCBpbiB0aGUgVXR4b1BzYnQgb2JqZWN0LiBJdCB3aWxsIGJlIHJlcXVpcmVkIGR1cmluZyB0aGUgc2lnbmluZyBzdGVwLlxuICogRm9yIG1vcmUgaW5mbywgY2hlY2sgU2lnblRyYW5zYWN0aW9uT3B0aW9ucy5zaWduaW5nU3RlcFxuICpcbiAqIFRPRE8gQlRDLTI3NjogVGhpcyBjYWNoZSBtYXkgbmVlZCB0byBiZSBkb25lIHdpdGggTFJVIGxpa2UgbWVtb3J5IHNhZmUgY2FjaGluZyBpZiBtZW1vcnkgaXNzdWVzIGNvbWVzIHVwLlxuICovXG5jb25zdCBQU0JUX0NBQ0hFID0gbmV3IE1hcDxzdHJpbmcsIHV0eG9saWIuYml0Z28uVXR4b1BzYnQ+KCk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduUHNidFdpdGhNdXNpZzJQYXJ0aWNpcGFudFV0eG9saWIoXG4gIGNvaW46IE11c2lnMlBhcnRpY2lwYW50PHV0eG9saWIuYml0Z28uVXR4b1BzYnQ+LFxuICB0eDogdXR4b2xpYi5iaXRnby5VdHhvUHNidCxcbiAgc2lnbmVyS2V5Y2hhaW46IEJJUDMySW50ZXJmYWNlIHwgdW5kZWZpbmVkLFxuICBwYXJhbXM6IHtcbiAgICBzaWduaW5nU3RlcDogJ3NpZ25lck5vbmNlJyB8ICdjb3NpZ25lck5vbmNlJyB8ICdzaWduZXJTaWduYXR1cmUnIHwgdW5kZWZpbmVkO1xuICAgIHdhbGxldElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH1cbik6IFByb21pc2U8dXR4b2xpYi5iaXRnby5VdHhvUHNidD4ge1xuICBpZiAoYml0Z28uaXNUcmFuc2FjdGlvbldpdGhLZXlQYXRoU3BlbmRJbnB1dCh0eCkpIHtcbiAgICBzd2l0Y2ggKHBhcmFtcy5zaWduaW5nU3RlcCkge1xuICAgICAgY2FzZSAnc2lnbmVyTm9uY2UnOlxuICAgICAgICBhc3NlcnQoc2lnbmVyS2V5Y2hhaW4pO1xuICAgICAgICB0eC5zZXRBbGxJbnB1dHNNdXNpZzJOb25jZUhEKHNpZ25lcktleWNoYWluKTtcbiAgICAgICAgUFNCVF9DQUNIRS5zZXQodHguZ2V0VW5zaWduZWRUeCgpLmdldElkKCksIHR4KTtcbiAgICAgICAgcmV0dXJuIHR4O1xuICAgICAgY2FzZSAnY29zaWduZXJOb25jZSc6XG4gICAgICAgIGFzc2VydChwYXJhbXMud2FsbGV0SWQsICd3YWxsZXRJZCBpcyByZXF1aXJlZCBmb3IgTXVTaWcyIGJpdGdvIG5vbmNlJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCBjb2luLmdldE11c2lnMk5vbmNlcyh0eCwgcGFyYW1zLndhbGxldElkKTtcbiAgICAgIGNhc2UgJ3NpZ25lclNpZ25hdHVyZSc6XG4gICAgICAgIGNvbnN0IHR4SWQgPSB0eC5nZXRVbnNpZ25lZFR4KCkuZ2V0SWQoKTtcbiAgICAgICAgY29uc3QgcHNidCA9IFBTQlRfQ0FDSEUuZ2V0KHR4SWQpO1xuICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgcHNidCxcbiAgICAgICAgICBgUHNidCBpcyBtaXNzaW5nIGZyb20gdHhDYWNoZSAoY2FjaGUgc2l6ZSAke1BTQlRfQ0FDSEUuc2l6ZX0pLlxuICAgICAgICAgICAgVGhpcyBtYXkgYmUgZHVlIHRvIHRoZSByZXF1ZXN0IGJlaW5nIHJvdXRlZCB0byBhIGRpZmZlcmVudCBCaXRHby1FeHByZXNzIGluc3RhbmNlIHRoYXQgZm9yIHNpZ25pbmcgc3RlcCAnc2lnbmVyTm9uY2UnLmBcbiAgICAgICAgKTtcbiAgICAgICAgUFNCVF9DQUNIRS5kZWxldGUodHhJZCk7XG4gICAgICAgIHR4ID0gcHNidC5jb21iaW5lKHR4KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB0aGlzIGluc3RhbmNlIGlzIG5vdCBhbiBleHRlcm5hbCBzaWduZXJcbiAgICAgICAgYXNzZXJ0KHBhcmFtcy53YWxsZXRJZCwgJ3dhbGxldElkIGlzIHJlcXVpcmVkIGZvciBNdVNpZzIgYml0Z28gbm9uY2UnKTtcbiAgICAgICAgYXNzZXJ0KHNpZ25lcktleWNoYWluKTtcbiAgICAgICAgdHguc2V0QWxsSW5wdXRzTXVzaWcyTm9uY2VIRChzaWduZXJLZXljaGFpbik7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY29pbi5nZXRNdXNpZzJOb25jZXModHgsIHBhcmFtcy53YWxsZXRJZCk7XG4gICAgICAgIHR4ID0gdHguY29tYmluZShyZXNwb25zZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHBhcmFtcy5zaWduaW5nU3RlcCkge1xuICAgICAgY2FzZSAnc2lnbmVyTm9uY2UnOlxuICAgICAgY2FzZSAnY29zaWduZXJOb25jZSc6XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kIG1heSBub3Qga25vdyB3aGV0aGVyIHRoZSB0eEhleCBjb250YWlucyBhIHBzYnQgd2l0aCB0YXByb290IGtleSBwYXRoIHNwZW5kIGlucHV0KHMpLlxuICAgICAgICAgKiBJbnN0ZWFkIG9mIHRocm93aW5nIGVycm9yLCBuby1vcCBhbmQgcmV0dXJuIHRoZSB0eEhleC4gU28gdGhhdCB0aGUgY2FsbGVyIGNhbiBjYWxsIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIHNlcXVlbmNlLlxuICAgICAgICAgKi9cbiAgICAgICAgcmV0dXJuIHR4O1xuICAgIH1cbiAgfVxuXG4gIGFzc2VydChzaWduZXJLZXljaGFpbik7XG4gIHJldHVybiBzaWduQW5kVmVyaWZ5UHNidCh0eCwgc2lnbmVyS2V5Y2hhaW4pO1xufVxuIl19
|
|
@@ -7,16 +7,11 @@ export type ReplayProtectionKeys = {
|
|
|
7
7
|
/**
|
|
8
8
|
* Sign all inputs of a PSBT and verify signatures after signing.
|
|
9
9
|
* Collects and logs signing errors and verification errors, throws error in the end if any of them failed.
|
|
10
|
-
*
|
|
11
|
-
* If it is the last signature, finalize and extract the transaction from the psbt.
|
|
12
10
|
*/
|
|
13
|
-
export declare function signAndVerifyPsbtWasm(tx: fixedScriptWallet.BitGoPsbt, signerKeychain: BIP32Interface, rootWalletKeys: fixedScriptWallet.RootWalletKeys, replayProtection: ReplayProtectionKeys
|
|
14
|
-
isLastSignature: boolean;
|
|
15
|
-
}): fixedScriptWallet.BitGoPsbt | Buffer;
|
|
11
|
+
export declare function signAndVerifyPsbtWasm(tx: fixedScriptWallet.BitGoPsbt, signerKeychain: BIP32Interface, rootWalletKeys: fixedScriptWallet.RootWalletKeys, replayProtection: ReplayProtectionKeys): fixedScriptWallet.BitGoPsbt;
|
|
16
12
|
export declare function signPsbtWithMusig2ParticipantWasm(coin: Musig2Participant<fixedScriptWallet.BitGoPsbt>, tx: fixedScriptWallet.BitGoPsbt, signerKeychain: BIP32Interface | undefined, rootWalletKeys: fixedScriptWallet.RootWalletKeys, params: {
|
|
17
13
|
replayProtection: ReplayProtectionKeys;
|
|
18
|
-
isLastSignature: boolean;
|
|
19
14
|
signingStep: 'signerNonce' | 'cosignerNonce' | 'signerSignature' | undefined;
|
|
20
15
|
walletId: string | undefined;
|
|
21
|
-
}): Promise<fixedScriptWallet.BitGoPsbt
|
|
16
|
+
}): Promise<fixedScriptWallet.BitGoPsbt>;
|
|
22
17
|
//# sourceMappingURL=signPsbtWasm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signPsbtWasm.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/signPsbtWasm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAS,MAAM,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;CACrC,CAAC;AAmBF
|
|
1
|
+
{"version":3,"file":"signPsbtWasm.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/signPsbtWasm.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAS,MAAM,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,CAAC,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;CACrC,CAAC;AAmBF;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,iBAAiB,CAAC,SAAS,EAC/B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAChD,gBAAgB,EAAE,oBAAoB,GACrC,iBAAiB,CAAC,SAAS,CA6C7B;AAOD,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EACpD,EAAE,EAAE,iBAAiB,CAAC,SAAS,EAC/B,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,cAAc,EAAE,iBAAiB,CAAC,cAAc,EAChD,MAAM,EAAE;IACN,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,WAAW,EAAE,aAAa,GAAG,eAAe,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC7E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B,GACA,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAiDtC"}
|