@bitgo-beta/utxo-lib 8.0.3-beta.13 → 8.0.3-beta.1300
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -16
- package/dist/src/address.d.ts +0 -1
- package/dist/src/address.d.ts.map +1 -1
- package/dist/src/address.js +10 -10
- package/dist/src/addressFormat.d.ts +1 -2
- package/dist/src/addressFormat.d.ts.map +1 -1
- package/dist/src/addressFormat.js +21 -26
- package/dist/src/bitgo/Musig2.d.ts +5 -11
- package/dist/src/bitgo/Musig2.d.ts.map +1 -1
- package/dist/src/bitgo/Musig2.js +75 -100
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts +27 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.d.ts.map +1 -0
- package/dist/src/bitgo/ProprietaryKeyValUtils.js +74 -0
- package/dist/src/bitgo/PsbtUtil.d.ts +54 -0
- package/dist/src/bitgo/PsbtUtil.d.ts.map +1 -0
- package/dist/src/bitgo/PsbtUtil.js +131 -0
- package/dist/src/bitgo/Unspent.d.ts +2 -3
- package/dist/src/bitgo/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/Unspent.js +14 -15
- package/dist/src/bitgo/UtxoPsbt.d.ts +40 -43
- package/dist/src/bitgo/UtxoPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoPsbt.js +235 -209
- package/dist/src/bitgo/UtxoTransaction.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransaction.js +14 -14
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/UtxoTransactionBuilder.js +1 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts +0 -1
- package/dist/src/bitgo/bitcoincash/address.d.ts.map +1 -1
- package/dist/src/bitgo/bitcoincash/address.js +11 -12
- package/dist/src/bitgo/bitcoincash/index.js +6 -2
- package/dist/src/bitgo/dash/DashPsbt.d.ts +1 -1
- package/dist/src/bitgo/dash/DashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashPsbt.js +4 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransaction.js +3 -3
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/dash/DashTransactionBuilder.js +1 -1
- package/dist/src/bitgo/dash/index.js +6 -2
- package/dist/src/bitgo/index.d.ts +11 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +11 -3
- package/dist/src/bitgo/keyutil.d.ts +10 -2
- package/dist/src/bitgo/keyutil.d.ts.map +1 -1
- package/dist/src/bitgo/keyutil.js +27 -6
- package/dist/src/bitgo/legacysafe/index.d.ts +14 -0
- package/dist/src/bitgo/legacysafe/index.d.ts.map +1 -0
- package/dist/src/bitgo/legacysafe/index.js +60 -0
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinPsbt.js +4 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts +1 -2
- package/dist/src/bitgo/litecoin/LitecoinTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/litecoin/LitecoinTransaction.js +2 -2
- package/dist/src/bitgo/litecoin/index.js +6 -2
- package/dist/src/bitgo/nonStandardHalfSigned.js +4 -5
- package/dist/src/bitgo/outputScripts.d.ts +12 -8
- package/dist/src/bitgo/outputScripts.d.ts.map +1 -1
- package/dist/src/bitgo/outputScripts.js +68 -50
- package/dist/src/bitgo/parseInput.d.ts +7 -8
- package/dist/src/bitgo/parseInput.d.ts.map +1 -1
- package/dist/src/bitgo/parseInput.js +15 -16
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts +0 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/fromHalfSigned.js +7 -8
- package/dist/src/bitgo/psbt/scriptTypes.d.ts +0 -1
- package/dist/src/bitgo/psbt/scriptTypes.d.ts.map +1 -1
- package/dist/src/bitgo/psbt/scriptTypes.js +7 -8
- package/dist/src/bitgo/signature.d.ts +5 -6
- package/dist/src/bitgo/signature.d.ts.map +1 -1
- package/dist/src/bitgo/signature.js +37 -23
- package/dist/src/bitgo/tnumber.js +2 -3
- package/dist/src/bitgo/transaction.d.ts +31 -4
- package/dist/src/bitgo/transaction.d.ts.map +1 -1
- package/dist/src/bitgo/transaction.js +57 -27
- package/dist/src/bitgo/transactionAmounts.d.ts +9 -0
- package/dist/src/bitgo/transactionAmounts.d.ts.map +1 -0
- package/dist/src/bitgo/transactionAmounts.js +32 -0
- package/dist/src/bitgo/types.d.ts +8 -2
- package/dist/src/bitgo/types.d.ts.map +1 -1
- package/dist/src/bitgo/types.js +12 -4
- package/dist/src/bitgo/wallet/Psbt.d.ts +91 -27
- package/dist/src/bitgo/wallet/Psbt.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Psbt.js +246 -108
- package/dist/src/bitgo/wallet/ScriptId.d.ts +14 -0
- package/dist/src/bitgo/wallet/ScriptId.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/ScriptId.js +28 -0
- package/dist/src/bitgo/wallet/Unspent.d.ts +43 -10
- package/dist/src/bitgo/wallet/Unspent.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/Unspent.js +174 -81
- package/dist/src/bitgo/wallet/WalletKeys.d.ts +2 -3
- package/dist/src/bitgo/wallet/WalletKeys.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletKeys.js +3 -3
- package/dist/src/bitgo/wallet/WalletOutput.d.ts +70 -2
- package/dist/src/bitgo/wallet/WalletOutput.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletOutput.js +179 -43
- package/dist/src/bitgo/wallet/WalletScripts.js +4 -5
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts +1 -1
- package/dist/src/bitgo/wallet/WalletUnspentSigner.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/WalletUnspentSigner.js +7 -7
- package/dist/src/bitgo/wallet/chains.d.ts +3 -3
- package/dist/src/bitgo/wallet/chains.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/chains.js +10 -10
- package/dist/src/bitgo/wallet/index.d.ts +3 -0
- package/dist/src/bitgo/wallet/index.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/index.js +9 -2
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts +50 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/PsbtOutputs.js +85 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts +32 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.d.ts.map +1 -0
- package/dist/src/bitgo/wallet/psbt/RootNodes.js +122 -0
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts +1 -2
- package/dist/src/bitgo/zcash/ZcashBufferutils.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashBufferutils.js +15 -15
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts +2 -6
- package/dist/src/bitgo/zcash/ZcashPsbt.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashPsbt.js +15 -26
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts +5 -2
- package/dist/src/bitgo/zcash/ZcashTransaction.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransaction.js +48 -21
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts +0 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/ZcashTransactionBuilder.js +8 -4
- package/dist/src/bitgo/zcash/address.d.ts +0 -1
- package/dist/src/bitgo/zcash/address.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/address.js +7 -8
- package/dist/src/bitgo/zcash/hashZip0244.d.ts +1 -2
- package/dist/src/bitgo/zcash/hashZip0244.d.ts.map +1 -1
- package/dist/src/bitgo/zcash/hashZip0244.js +9 -10
- package/dist/src/bitgo/zcash/index.js +6 -2
- package/dist/src/classify.d.ts +0 -1
- package/dist/src/classify.d.ts.map +1 -1
- package/dist/src/classify.js +5 -5
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +12 -4
- package/dist/src/networks.d.ts +2 -2
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +67 -21
- package/dist/src/payments/p2tr.d.ts.map +1 -1
- package/dist/src/payments/p2tr.js +16 -28
- package/dist/src/payments/p2tr_ns.js +3 -5
- package/dist/src/taproot.d.ts +80 -6
- package/dist/src/taproot.d.ts.map +1 -1
- package/dist/src/taproot.js +132 -48
- package/dist/src/templates/multisig/input.d.ts +0 -1
- package/dist/src/templates/multisig/input.d.ts.map +1 -1
- package/dist/src/templates/multisig/input.js +2 -3
- package/dist/src/templates/multisig/output.d.ts +0 -1
- package/dist/src/templates/multisig/output.d.ts.map +1 -1
- package/dist/src/templates/multisig/output.js +2 -3
- package/dist/src/templates/nulldata.d.ts +0 -1
- package/dist/src/templates/nulldata.d.ts.map +1 -1
- package/dist/src/templates/nulldata.js +3 -3
- package/dist/src/templates/pubkey/input.d.ts +0 -1
- package/dist/src/templates/pubkey/input.d.ts.map +1 -1
- package/dist/src/templates/pubkey/input.js +2 -3
- package/dist/src/templates/pubkey/output.d.ts +0 -1
- package/dist/src/templates/pubkey/output.d.ts.map +1 -1
- package/dist/src/templates/pubkey/output.js +2 -3
- package/dist/src/templates/pubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/input.js +2 -3
- package/dist/src/templates/pubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/pubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/pubkeyhash/output.js +2 -3
- package/dist/src/templates/scripthash/input.d.ts +0 -1
- package/dist/src/templates/scripthash/input.d.ts.map +1 -1
- package/dist/src/templates/scripthash/input.js +2 -3
- package/dist/src/templates/scripthash/output.d.ts +0 -1
- package/dist/src/templates/scripthash/output.d.ts.map +1 -1
- package/dist/src/templates/scripthash/output.js +2 -3
- package/dist/src/templates/taproot/input.d.ts +0 -1
- package/dist/src/templates/taproot/input.d.ts.map +1 -1
- package/dist/src/templates/taproot/input.js +2 -3
- package/dist/src/templates/taproot/output.d.ts +0 -1
- package/dist/src/templates/taproot/output.d.ts.map +1 -1
- package/dist/src/templates/taproot/output.js +2 -3
- package/dist/src/templates/taprootnofn/input.d.ts +0 -1
- package/dist/src/templates/taprootnofn/input.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/input.js +2 -3
- package/dist/src/templates/taprootnofn/output.d.ts +0 -1
- package/dist/src/templates/taprootnofn/output.d.ts.map +1 -1
- package/dist/src/templates/taprootnofn/output.js +4 -5
- package/dist/src/templates/witnesscommitment/output.d.ts +0 -1
- package/dist/src/templates/witnesscommitment/output.d.ts.map +1 -1
- package/dist/src/templates/witnesscommitment/output.js +4 -5
- package/dist/src/templates/witnesspubkeyhash/input.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/input.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/input.js +2 -3
- package/dist/src/templates/witnesspubkeyhash/output.d.ts +0 -1
- package/dist/src/templates/witnesspubkeyhash/output.d.ts.map +1 -1
- package/dist/src/templates/witnesspubkeyhash/output.js +2 -3
- package/dist/src/templates/witnessscripthash/input.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/input.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/input.js +2 -3
- package/dist/src/templates/witnessscripthash/output.d.ts +0 -1
- package/dist/src/templates/witnessscripthash/output.d.ts.map +1 -1
- package/dist/src/templates/witnessscripthash/output.js +2 -3
- package/dist/src/testutil/index.d.ts +1 -0
- package/dist/src/testutil/index.d.ts.map +1 -1
- package/dist/src/testutil/index.js +7 -2
- package/dist/src/testutil/keys.d.ts +6 -4
- package/dist/src/testutil/keys.d.ts.map +1 -1
- package/dist/src/testutil/keys.js +25 -12
- package/dist/src/testutil/mock.d.ts +3 -4
- package/dist/src/testutil/mock.d.ts.map +1 -1
- package/dist/src/testutil/mock.js +37 -30
- package/dist/src/testutil/psbt.d.ts +41 -16
- package/dist/src/testutil/psbt.d.ts.map +1 -1
- package/dist/src/testutil/psbt.js +53 -41
- package/dist/src/testutil/transaction.d.ts +18 -7
- package/dist/src/testutil/transaction.d.ts.map +1 -1
- package/dist/src/testutil/transaction.js +35 -28
- package/dist/src/transaction_builder.d.ts +0 -1
- package/dist/src/transaction_builder.d.ts.map +1 -1
- package/dist/src/transaction_builder.js +27 -32
- package/package.json +10 -17
- package/dist/src/noble_ecc.d.ts +0 -28
- package/dist/src/noble_ecc.d.ts.map +0 -1
- package/dist/src/noble_ecc.js +0 -172
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getProprietaryKeyValuesFromUnknownKeyValues = getProprietaryKeyValuesFromUnknownKeyValues;
|
|
4
|
+
exports.deleteProprietaryKeyValuesFromUnknownKeyValues = deleteProprietaryKeyValuesFromUnknownKeyValues;
|
|
5
|
+
exports.updateProprietaryKeyValuesFromUnknownKeyValues = updateProprietaryKeyValuesFromUnknownKeyValues;
|
|
6
|
+
exports.addProprietaryKeyValuesFromUnknownKeyValues = addProprietaryKeyValuesFromUnknownKeyValues;
|
|
7
|
+
const proprietaryKeyVal_1 = require("bip174/src/lib/proprietaryKeyVal");
|
|
8
|
+
function getProprietaryKeyValuesFromUnknownKeyValues(psbtField, keySearch) {
|
|
9
|
+
if (!psbtField.unknownKeyVals?.length) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
if (keySearch && keySearch.subtype === undefined && Buffer.isBuffer(keySearch.keydata)) {
|
|
13
|
+
throw new Error('invalid proprietary key search filter combination. subtype is required');
|
|
14
|
+
}
|
|
15
|
+
const keyVals = psbtField.unknownKeyVals.map(({ key, value }, i) => {
|
|
16
|
+
return { key: (0, proprietaryKeyVal_1.decodeProprietaryKey)(key), value };
|
|
17
|
+
});
|
|
18
|
+
return keyVals.filter((keyVal) => {
|
|
19
|
+
return (keySearch === undefined ||
|
|
20
|
+
(keySearch.identifier === keyVal.key.identifier &&
|
|
21
|
+
(keySearch.subtype === undefined ||
|
|
22
|
+
(keySearch.subtype === keyVal.key.subtype &&
|
|
23
|
+
(!Buffer.isBuffer(keySearch.keydata) || keySearch.keydata.equals(keyVal.key.keydata))))));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function deleteProprietaryKeyValuesFromUnknownKeyValues(psbtField, keysToDelete) {
|
|
27
|
+
if (!psbtField.unknownKeyVals?.length) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (keysToDelete && keysToDelete.subtype === undefined && Buffer.isBuffer(keysToDelete.keydata)) {
|
|
31
|
+
throw new Error('invalid proprietary key search filter combination. subtype is required');
|
|
32
|
+
}
|
|
33
|
+
psbtField.unknownKeyVals = psbtField.unknownKeyVals.filter((keyValue, i) => {
|
|
34
|
+
const key = (0, proprietaryKeyVal_1.decodeProprietaryKey)(keyValue.key);
|
|
35
|
+
return !(keysToDelete === undefined ||
|
|
36
|
+
(keysToDelete.identifier === key.identifier &&
|
|
37
|
+
(keysToDelete.subtype === undefined ||
|
|
38
|
+
(keysToDelete.subtype === key.subtype &&
|
|
39
|
+
(!Buffer.isBuffer(keysToDelete.keydata) || keysToDelete.keydata.equals(key.keydata))))));
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function updateProprietaryKeyValuesFromUnknownKeyValues(keyValueData, psbtField) {
|
|
43
|
+
if (!psbtField.unknownKeyVals?.length) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const key = (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key);
|
|
47
|
+
const { value } = keyValueData;
|
|
48
|
+
const ukvIndex = psbtField.unknownKeyVals.findIndex((ukv) => ukv.key.equals(key));
|
|
49
|
+
if (ukvIndex <= -1) {
|
|
50
|
+
throw new Error(`The Key-Value pair does not exist within the PSBT.`);
|
|
51
|
+
}
|
|
52
|
+
psbtField.unknownKeyVals[ukvIndex] = { key, value };
|
|
53
|
+
}
|
|
54
|
+
function addProprietaryKeyValuesFromUnknownKeyValues(psbt, entry, index, keyValueData) {
|
|
55
|
+
if (index < 0) {
|
|
56
|
+
throw new Error('Not a valid index within the PSBT to add proprietary key value.');
|
|
57
|
+
}
|
|
58
|
+
if (entry === 'input') {
|
|
59
|
+
psbt.addUnknownKeyValToInput(index, {
|
|
60
|
+
key: (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key),
|
|
61
|
+
value: keyValueData.value,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
else if (entry === 'output') {
|
|
65
|
+
psbt.addUnknownKeyValToOutput(index, {
|
|
66
|
+
key: (0, proprietaryKeyVal_1.encodeProprietaryKey)(keyValueData.key),
|
|
67
|
+
value: keyValueData.value,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw new Error("Not a valid PSBT entry, only valid for 'input' or 'output'.");
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvcHJpZXRhcnlLZXlWYWxVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXRnby9Qcm9wcmlldGFyeUtleVZhbFV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0JBLGtHQXVCQztBQUVELHdHQXFCQztBQUVELHdHQWVDO0FBRUQsa0dBc0JDO0FBOUdELHdFQUE4RztBQXVCOUcsU0FBZ0IsMkNBQTJDLENBQ3pELFNBQWlDLEVBQ2pDLFNBQWdDO0lBRWhDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDdkYsTUFBTSxJQUFJLEtBQUssQ0FBQyx3RUFBd0UsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBQSx3Q0FBb0IsRUFBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQy9CLE9BQU8sQ0FDTCxTQUFTLEtBQUssU0FBUztZQUN2QixDQUFDLFNBQVMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVO2dCQUM3QyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEtBQUssU0FBUztvQkFDOUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxH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QUM7U0FBTSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFO1lBQ25DLEdBQUcsRUFBRSxJQUFBLHdDQUFvQixFQUFDLFlBQVksQ0FBQyxHQUFHLENBQUM7WUFDM0MsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUHNidElucHV0LCBQc2J0T3V0cHV0IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBkZWNvZGVQcm9wcmlldGFyeUtleSwgZW5jb2RlUHJvcHJpZXRhcnlLZXksIFByb3ByaWV0YXJ5S2V5IH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvcHJvcHJpZXRhcnlLZXlWYWwnO1xuaW1wb3J0IHsgUHNidCB9IGZyb20gJy4uLyc7XG5cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXlkYXRhIG9iamVjdCBzZWFyY2ggZmllbGRzLlxuICogPGNvbXBhY3Qgc2l6ZSB1aW50IGlkZW50aWZpZXIgbGVuZ3RoPiA8Ynl0ZXMgaWRlbnRpZmllcj4gPGNvbXBhY3Qgc2l6ZSB1aW50IHN1YnR5cGU+IDxieXRlcyBzdWJrZXlkYXRhPlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3ByaWV0YXJ5S2V5U2VhcmNoIHtcbiAgaWRlbnRpZmllcjogc3RyaW5nO1xuICBzdWJ0eXBlPzogbnVtYmVyO1xuICBrZXlkYXRhPzogQnVmZmVyO1xuICBpZGVudGlmaWVyRW5jb2Rpbmc/OiBCdWZmZXJFbmNvZGluZztcbn1cbi8qKlxuICogUHNidCBwcm9wcmlldGFyeSBrZXlkYXRhIG9iamVjdC5cbiAqIDxjb21wYWN0IHNpemUgdWludCBpZGVudGlmaWVyIGxlbmd0aD4gPGJ5dGVzIGlkZW50aWZpZXI+IDxjb21wYWN0IHNpemUgdWludCBzdWJ0eXBlPiA8Ynl0ZXMgc3Via2V5ZGF0YT5cbiAqID0+IDxieXRlcyB2YWx1ZWRhdGE+XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvcHJpZXRhcnlLZXlWYWx1ZSB7XG4gIGtleTogUHJvcHJpZXRhcnlLZXk7XG4gIHZhbHVlOiBCdWZmZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKFxuICBwc2J0RmllbGQ6IFBzYnRJbnB1dCB8IFBzYnRPdXRwdXQsXG4gIGtleVNlYXJjaD86IFByb3ByaWV0YXJ5S2V5U2VhcmNoXG4pOiBQcm9wcmlldGFyeUtleVZhbHVlW10ge1xuICBpZiAoIXBzYnRGaWVsZC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgaWYgKGtleVNlYXJjaCAmJiBrZXlTZWFyY2guc3VidHlwZSA9PT0gdW5kZWZpbmVkICYmIEJ1ZmZlci5pc0J1ZmZlcihrZXlTZWFyY2gua2V5ZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJvcHJpZXRhcnkga2V5IHNlYXJjaCBmaWx0ZXIgY29tYmluYXRpb24uIHN1YnR5cGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBjb25zdCBrZXlWYWxzID0gcHNidEZpZWxkLnVua25vd25LZXlWYWxzLm1hcCgoeyBrZXksIHZhbHVlIH0sIGkpID0+IHtcbiAgICByZXR1cm4geyBrZXk6IGRlY29kZVByb3ByaWV0YXJ5S2V5KGtleSksIHZhbHVlIH07XG4gIH0pO1xuICByZXR1cm4ga2V5VmFscy5maWx0ZXIoKGtleVZhbCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBrZXlTZWFyY2ggPT09IHVuZGVmaW5lZCB8fFxuICAgICAgKGtleVNlYXJjaC5pZGVudGlmaWVyID09PSBrZXlWYWwua2V5LmlkZW50aWZpZXIgJiZcbiAgICAgICAgKGtleVNlYXJjaC5zdWJ0eXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoa2V5U2VhcmNoLnN1YnR5cGUgPT09IGtleVZhbC5rZXkuc3VidHlwZSAmJlxuICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5U2VhcmNoLmtleWRhdGEpIHx8IGtleVNlYXJjaC5rZXlkYXRhLmVxdWFscyhrZXlWYWwua2V5LmtleWRhdGEpKSkpKVxuICAgICk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvcHJpZXRhcnlLZXlWYWx1ZXNGcm9tVW5rbm93bktleVZhbHVlcyhcbiAgcHNidEZpZWxkOiBQc2J0SW5wdXQgfCBQc2J0T3V0cHV0LFxuICBrZXlzVG9EZWxldGU/OiBQcm9wcmlldGFyeUtleVNlYXJjaFxuKTogdm9pZCB7XG4gIGlmICghcHNidEZpZWxkLnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoa2V5c1RvRGVsZXRlICYmIGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSB1bmRlZmluZWQgJiYgQnVmZmVyLmlzQnVmZmVyKGtleXNUb0RlbGV0ZS5rZXlkYXRhKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwcm9wcmlldGFyeSBrZXkgc2VhcmNoIGZpbHRlciBjb21iaW5hdGlvbi4gc3VidHlwZSBpcyByZXF1aXJlZCcpO1xuICB9XG4gIHBzYnRGaWVsZC51bmtub3duS2V5VmFscyA9IHBzYnRGaWVsZC51bmtub3duS2V5VmFscy5maWx0ZXIoKGtleVZhbHVlLCBpKSA9PiB7XG4gICAgY29uc3Qga2V5ID0gZGVjb2RlUHJvcHJpZXRhcnlLZXkoa2V5VmFsdWUua2V5KTtcbiAgICByZXR1cm4gIShcbiAgICAgIGtleXNUb0RlbGV0ZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAoa2V5c1RvRGVsZXRlLmlkZW50aWZpZXIgPT09IGtleS5pZGVudGlmaWVyICYmXG4gICAgICAgIChrZXlzVG9EZWxldGUuc3VidHlwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKGtleXNUb0RlbGV0ZS5zdWJ0eXBlID09PSBrZXkuc3VidHlwZSAmJlxuICAgICAgICAgICAgKCFCdWZmZXIuaXNCdWZmZXIoa2V5c1RvRGVsZXRlLmtleWRhdGEpIHx8IGtleXNUb0RlbGV0ZS5rZXlkYXRhLmVxdWFscyhrZXkua2V5ZGF0YSkpKSkpXG4gICAgKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKFxuICBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWUsXG4gIHBzYnRGaWVsZDogUHNidElucHV0IHwgUHNidE91dHB1dFxuKTogdm9pZCB7XG4gIGlmICghcHNidEZpZWxkLnVua25vd25LZXlWYWxzPy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBrZXkgPSBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KTtcbiAgY29uc3QgeyB2YWx1ZSB9ID0ga2V5VmFsdWVEYXRhO1xuICBjb25zdCB1a3ZJbmRleCA9IHBzYnRGaWVsZC51bmtub3duS2V5VmFscy5maW5kSW5kZXgoKHVrdikgPT4gdWt2LmtleS5lcXVhbHMoa2V5KSk7XG4gIGlmICh1a3ZJbmRleCA8PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIEtleS1WYWx1ZSBwYWlyIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgUFNCVC5gKTtcbiAgfVxuICBwc2J0RmllbGQudW5rbm93bktleVZhbHNbdWt2SW5kZXhdID0geyBrZXksIHZhbHVlIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKFxuICBwc2J0OiBQc2J0LFxuICBlbnRyeTogc3RyaW5nLFxuICBpbmRleDogbnVtYmVyLFxuICBrZXlWYWx1ZURhdGE6IFByb3ByaWV0YXJ5S2V5VmFsdWVcbik6IHZvaWQge1xuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBpbmRleCB3aXRoaW4gdGhlIFBTQlQgdG8gYWRkIHByb3ByaWV0YXJ5IGtleSB2YWx1ZS4nKTtcbiAgfVxuICBpZiAoZW50cnkgPT09ICdpbnB1dCcpIHtcbiAgICBwc2J0LmFkZFVua25vd25LZXlWYWxUb0lucHV0KGluZGV4LCB7XG4gICAgICBrZXk6IGVuY29kZVByb3ByaWV0YXJ5S2V5KGtleVZhbHVlRGF0YS5rZXkpLFxuICAgICAgdmFsdWU6IGtleVZhbHVlRGF0YS52YWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChlbnRyeSA9PT0gJ291dHB1dCcpIHtcbiAgICBwc2J0LmFkZFVua25vd25LZXlWYWxUb091dHB1dChpbmRleCwge1xuICAgICAga2V5OiBlbmNvZGVQcm9wcmlldGFyeUtleShrZXlWYWx1ZURhdGEua2V5KSxcbiAgICAgIHZhbHVlOiBrZXlWYWx1ZURhdGEudmFsdWUsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGEgdmFsaWQgUFNCVCBlbnRyeSwgb25seSB2YWxpZCBmb3IgJ2lucHV0JyBvciAnb3V0cHV0Jy5cIik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { PsbtInput, PsbtOutput } from 'bip174/src/lib/interfaces';
|
|
2
|
+
import { Psbt } from 'bitcoinjs-lib/src/psbt';
|
|
3
|
+
import { ProprietaryKeySearch, ProprietaryKeyValue } from './ProprietaryKeyValUtils';
|
|
4
|
+
/**
|
|
5
|
+
* bitgo proprietary key identifier
|
|
6
|
+
*/
|
|
7
|
+
export declare const PSBT_PROPRIETARY_IDENTIFIER = "BITGO";
|
|
8
|
+
/**
|
|
9
|
+
* subtype for proprietary keys that bitgo uses
|
|
10
|
+
*/
|
|
11
|
+
export declare enum ProprietaryKeySubtype {
|
|
12
|
+
ZEC_CONSENSUS_BRANCH_ID = 0,
|
|
13
|
+
MUSIG2_PARTICIPANT_PUB_KEYS = 1,
|
|
14
|
+
MUSIG2_PUB_NONCE = 2,
|
|
15
|
+
MUSIG2_PARTIAL_SIG = 3,
|
|
16
|
+
PAYGO_ADDRESS_ATTESTATION_PROOF = 4,
|
|
17
|
+
BIP322_MESSAGE = 5
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Search any data from psbt proprietary key value against keydata.
|
|
21
|
+
* Default identifierEncoding is utf-8 for identifier.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getPsbtInputProprietaryKeyVals(input: PsbtInput, keySearch?: ProprietaryKeySearch): ProprietaryKeyValue[];
|
|
24
|
+
export declare function getPsbtOutputProprietaryKeyVals(output: PsbtOutput, keySearch?: ProprietaryKeySearch): ProprietaryKeyValue[];
|
|
25
|
+
/**
|
|
26
|
+
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
|
|
27
|
+
*/
|
|
28
|
+
export declare function getPsbtInputSignatureCount(input: PsbtInput): number;
|
|
29
|
+
/**
|
|
30
|
+
* @return true iff PSBT input is finalized
|
|
31
|
+
*/
|
|
32
|
+
export declare function isPsbtInputFinalized(input: PsbtInput): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* @return true iff data starts with magic PSBT byte sequence
|
|
35
|
+
* @param data byte array or hex string
|
|
36
|
+
* */
|
|
37
|
+
export declare function isPsbt(data: Buffer | string): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* First checks if the input is already a buffer that starts with the magic PSBT byte sequence.
|
|
40
|
+
* If not, it checks if the input is a base64- or hex-encoded string that starts with PSBT header.
|
|
41
|
+
*
|
|
42
|
+
* This function is useful when reading a file that could be in any of the above formats or when
|
|
43
|
+
* dealing with a request that could contain a hex or base64 encoded PSBT.
|
|
44
|
+
*
|
|
45
|
+
* @param data
|
|
46
|
+
* @return buffer that starts with the magic PSBT byte sequence
|
|
47
|
+
* @throws Error when conversion is not possible
|
|
48
|
+
*/
|
|
49
|
+
export declare function toPsbtBuffer(data: Buffer | string): Buffer;
|
|
50
|
+
/**
|
|
51
|
+
* This function allows signing or validating a psbt with non-segwit inputs those do not contain nonWitnessUtxo.
|
|
52
|
+
*/
|
|
53
|
+
export declare function withUnsafeNonSegwit<T>(psbt: Psbt, fn: () => T, unsafe?: boolean): T;
|
|
54
|
+
//# sourceMappingURL=PsbtUtil.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PsbtUtil.d.ts","sourceRoot":"","sources":["../../../src/bitgo/PsbtUtil.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAEL,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,eAAO,MAAM,2BAA2B,UAAU,CAAC;AAEnD;;GAEG;AACH,oBAAY,qBAAqB;IAC/B,uBAAuB,IAAO;IAC9B,2BAA2B,IAAO;IAClC,gBAAgB,IAAO;IACvB,kBAAkB,IAAO;IACzB,+BAA+B,IAAO;IACtC,cAAc,IAAO;CACtB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS,EAChB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,mBAAmB,EAAE,CAKvB;AAED,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,UAAU,EAClB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,mBAAmB,EAAE,CAKvB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAYnE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAE9D;AAED;;;KAGK;AACL,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAUrD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CA6B1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,UAAO,GAAG,CAAC,CAWhF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProprietaryKeySubtype = exports.PSBT_PROPRIETARY_IDENTIFIER = void 0;
|
|
4
|
+
exports.getPsbtInputProprietaryKeyVals = getPsbtInputProprietaryKeyVals;
|
|
5
|
+
exports.getPsbtOutputProprietaryKeyVals = getPsbtOutputProprietaryKeyVals;
|
|
6
|
+
exports.getPsbtInputSignatureCount = getPsbtInputSignatureCount;
|
|
7
|
+
exports.isPsbtInputFinalized = isPsbtInputFinalized;
|
|
8
|
+
exports.isPsbt = isPsbt;
|
|
9
|
+
exports.toPsbtBuffer = toPsbtBuffer;
|
|
10
|
+
exports.withUnsafeNonSegwit = withUnsafeNonSegwit;
|
|
11
|
+
const ProprietaryKeyValUtils_1 = require("./ProprietaryKeyValUtils");
|
|
12
|
+
/**
|
|
13
|
+
* bitgo proprietary key identifier
|
|
14
|
+
*/
|
|
15
|
+
exports.PSBT_PROPRIETARY_IDENTIFIER = 'BITGO';
|
|
16
|
+
/**
|
|
17
|
+
* subtype for proprietary keys that bitgo uses
|
|
18
|
+
*/
|
|
19
|
+
var ProprietaryKeySubtype;
|
|
20
|
+
(function (ProprietaryKeySubtype) {
|
|
21
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["ZEC_CONSENSUS_BRANCH_ID"] = 0] = "ZEC_CONSENSUS_BRANCH_ID";
|
|
22
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTICIPANT_PUB_KEYS"] = 1] = "MUSIG2_PARTICIPANT_PUB_KEYS";
|
|
23
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PUB_NONCE"] = 2] = "MUSIG2_PUB_NONCE";
|
|
24
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["MUSIG2_PARTIAL_SIG"] = 3] = "MUSIG2_PARTIAL_SIG";
|
|
25
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["PAYGO_ADDRESS_ATTESTATION_PROOF"] = 4] = "PAYGO_ADDRESS_ATTESTATION_PROOF";
|
|
26
|
+
ProprietaryKeySubtype[ProprietaryKeySubtype["BIP322_MESSAGE"] = 5] = "BIP322_MESSAGE";
|
|
27
|
+
})(ProprietaryKeySubtype || (exports.ProprietaryKeySubtype = ProprietaryKeySubtype = {}));
|
|
28
|
+
/**
|
|
29
|
+
* Search any data from psbt proprietary key value against keydata.
|
|
30
|
+
* Default identifierEncoding is utf-8 for identifier.
|
|
31
|
+
*/
|
|
32
|
+
function getPsbtInputProprietaryKeyVals(input, keySearch) {
|
|
33
|
+
if (!input.unknownKeyVals?.length) {
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
return (0, ProprietaryKeyValUtils_1.getProprietaryKeyValuesFromUnknownKeyValues)(input, keySearch);
|
|
37
|
+
}
|
|
38
|
+
function getPsbtOutputProprietaryKeyVals(output, keySearch) {
|
|
39
|
+
if (!output.unknownKeyVals?.length) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
return (0, ProprietaryKeyValUtils_1.getProprietaryKeyValuesFromUnknownKeyValues)(output, keySearch);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* @return partialSig/tapScriptSig/MUSIG2_PARTIAL_SIG count iff input is not finalized
|
|
46
|
+
*/
|
|
47
|
+
function getPsbtInputSignatureCount(input) {
|
|
48
|
+
if (isPsbtInputFinalized(input)) {
|
|
49
|
+
throw new Error('Input is already finalized');
|
|
50
|
+
}
|
|
51
|
+
return Math.max(Array.isArray(input.partialSig) ? input.partialSig.length : 0, Array.isArray(input.tapScriptSig) ? input.tapScriptSig.length : 0, getPsbtInputProprietaryKeyVals(input, {
|
|
52
|
+
identifier: exports.PSBT_PROPRIETARY_IDENTIFIER,
|
|
53
|
+
subtype: ProprietaryKeySubtype.MUSIG2_PARTIAL_SIG,
|
|
54
|
+
}).length);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @return true iff PSBT input is finalized
|
|
58
|
+
*/
|
|
59
|
+
function isPsbtInputFinalized(input) {
|
|
60
|
+
return Buffer.isBuffer(input.finalScriptSig) || Buffer.isBuffer(input.finalScriptWitness);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @return true iff data starts with magic PSBT byte sequence
|
|
64
|
+
* @param data byte array or hex string
|
|
65
|
+
* */
|
|
66
|
+
function isPsbt(data) {
|
|
67
|
+
// https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki#specification
|
|
68
|
+
// 0x70736274 - ASCII for 'psbt'. 0xff - separator
|
|
69
|
+
if (typeof data === 'string') {
|
|
70
|
+
if (data.length < 10) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
data = Buffer.from(data.slice(0, 10), 'hex');
|
|
74
|
+
}
|
|
75
|
+
return 5 <= data.length && data.readUInt32BE(0) === 0x70736274 && data.readUInt8(4) === 0xff;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* First checks if the input is already a buffer that starts with the magic PSBT byte sequence.
|
|
79
|
+
* If not, it checks if the input is a base64- or hex-encoded string that starts with PSBT header.
|
|
80
|
+
*
|
|
81
|
+
* This function is useful when reading a file that could be in any of the above formats or when
|
|
82
|
+
* dealing with a request that could contain a hex or base64 encoded PSBT.
|
|
83
|
+
*
|
|
84
|
+
* @param data
|
|
85
|
+
* @return buffer that starts with the magic PSBT byte sequence
|
|
86
|
+
* @throws Error when conversion is not possible
|
|
87
|
+
*/
|
|
88
|
+
function toPsbtBuffer(data) {
|
|
89
|
+
if (Buffer.isBuffer(data)) {
|
|
90
|
+
// we are dealing with a buffer that looks like a psbt already
|
|
91
|
+
if (isPsbt(data)) {
|
|
92
|
+
return data;
|
|
93
|
+
}
|
|
94
|
+
// we could be dealing with a buffer that could be a hex or base64 encoded psbt
|
|
95
|
+
data = data.toString('ascii');
|
|
96
|
+
}
|
|
97
|
+
if (typeof data === 'string') {
|
|
98
|
+
const encodings = ['hex', 'base64'];
|
|
99
|
+
for (const encoding of encodings) {
|
|
100
|
+
let buffer;
|
|
101
|
+
try {
|
|
102
|
+
buffer = Buffer.from(data, encoding);
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (isPsbt(buffer)) {
|
|
108
|
+
return buffer;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
throw new Error(`data is not in any of the following formats: ${encodings.join(', ')}`);
|
|
112
|
+
}
|
|
113
|
+
throw new Error('data must be a buffer or a string');
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* This function allows signing or validating a psbt with non-segwit inputs those do not contain nonWitnessUtxo.
|
|
117
|
+
*/
|
|
118
|
+
function withUnsafeNonSegwit(psbt, fn, unsafe = true) {
|
|
119
|
+
const prevValue = psbt.__CACHE.__UNSAFE_SIGN_NONSEGWIT;
|
|
120
|
+
const prevValueWarn = psbt.__CACHE.__WARN_UNSAFE_SIGN_NONSEGWIT;
|
|
121
|
+
psbt.__CACHE.__UNSAFE_SIGN_NONSEGWIT = unsafe;
|
|
122
|
+
psbt.__CACHE.__WARN_UNSAFE_SIGN_NONSEGWIT = !unsafe;
|
|
123
|
+
try {
|
|
124
|
+
return fn();
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
psbt.__CACHE.__UNSAFE_SIGN_NONSEGWIT = prevValue;
|
|
128
|
+
psbt.__CACHE.__WARN_UNSAFE_SIGN_NONSEGWIT = prevValueWarn;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHNidFV0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYml0Z28vUHNidFV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBOEJBLHdFQVFDO0FBRUQsMEVBUUM7QUFLRCxnRUFZQztBQUtELG9EQUVDO0FBTUQsd0JBVUM7QUFhRCxvQ0E2QkM7QUFLRCxrREFXQztBQS9JRCxxRUFJa0M7QUFFbEM7O0dBRUc7QUFDVSxRQUFBLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztBQUVuRDs7R0FFRztBQUNILElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQix1R0FBOEIsQ0FBQTtJQUM5QiwrR0FBa0MsQ0FBQTtJQUNsQyx5RkFBdUIsQ0FBQTtJQUN2Qiw2RkFBeUIsQ0FBQTtJQUN6Qix1SEFBc0MsQ0FBQTtJQUN0QyxxRkFBcUIsQ0FBQTtBQUN2QixDQUFDLEVBUFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFPaEM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQiw4QkFBOEIsQ0FDNUMsS0FBZ0IsRUFDaEIsU0FBZ0M7SUFFaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDbEMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxJQUFBLG9FQUEyQyxFQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsU0FBZ0IsK0JBQStCLENBQzdDLE1BQWtCLEVBQ2xCLFNBQWdDO0lBRWhDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ25DLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sSUFBQSxvRUFBMkMsRUFBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsMEJBQTBCLENBQUMsS0FBZ0I7SUFDekQsSUFBSSxvQkFBb0IsQ0FB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O0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUksSUFBVSxFQUFFLEVBQVcsRUFBRSxNQUFNLEdBQUcsSUFBSTtJQUMzRSxNQUFNLFNBQVMsR0FBSSxJQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDO0lBQ2hFLE1BQU0sYUFBYSxHQUFJLElBQVksQ0FBQyxPQUFPLENBQUMsNEJBQTRCLENBQUM7SUFDeEUsSUFBWSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUM7SUFDdEQsSUFBWSxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUM3RCxJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsRUFBRSxDQUFDO0lBQ2QsQ0FBQztZQUFTLENBQUM7UUFDUixJQUFZLENBQUMsT0FBTyxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUN6RCxJQUFZLENBQUMsT0FBTyxDQUFDLDRCQUE0QixHQUFHLGFBQWEsQ0FBQztJQUNyRSxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBzYnRJbnB1dCwgUHNidE91dHB1dCB9IGZyb20gJ2JpcDE3NC9zcmMvbGliL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgUHNidCB9IGZyb20gJ2JpdGNvaW5qcy1saWIvc3JjL3BzYnQnO1xuXG5pbXBvcnQge1xuICBnZXRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzLFxuICBQcm9wcmlldGFyeUtleVNlYXJjaCxcbiAgUHJvcHJpZXRhcnlLZXlWYWx1ZSxcbn0gZnJvbSAnLi9Qcm9wcmlldGFyeUtleVZhbFV0aWxzJztcblxuLyoqXG4gKiBiaXRnbyBwcm9wcmlldGFyeSBrZXkgaWRlbnRpZmllclxuICovXG5leHBvcnQgY29uc3QgUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSID0gJ0JJVEdPJztcblxuLyoqXG4gKiBzdWJ0eXBlIGZvciBwcm9wcmlldGFyeSBrZXlzIHRoYXQgYml0Z28gdXNlc1xuICovXG5leHBvcnQgZW51bSBQcm9wcmlldGFyeUtleVN1YnR5cGUge1xuICBaRUNfQ09OU0VOU1VTX0JSQU5DSF9JRCA9IDB4MDAsXG4gIE1VU0lHMl9QQVJUSUNJUEFOVF9QVUJfS0VZUyA9IDB4MDEsXG4gIE1VU0lHMl9QVUJfTk9OQ0UgPSAweDAyLFxuICBNVVNJRzJfUEFSVElBTF9TSUcgPSAweDAzLFxuICBQQVlHT19BRERSRVNTX0FUVEVTVEFUSU9OX1BST09GID0gMHgwNCxcbiAgQklQMzIyX01FU1NBR0UgPSAweDA1LFxufVxuXG4vKipcbiAqIFNlYXJjaCBhbnkgZGF0YSBmcm9tIHBzYnQgcHJvcHJpZXRhcnkga2V5IHZhbHVlIGFnYWluc3Qga2V5ZGF0YS5cbiAqIERlZmF1bHQgaWRlbnRpZmllckVuY29kaW5nIGlzIHV0Zi04IGZvciBpZGVudGlmaWVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHNidElucHV0UHJvcHJpZXRhcnlLZXlWYWxzKFxuICBpbnB1dDogUHNidElucHV0LFxuICBrZXlTZWFyY2g/OiBQcm9wcmlldGFyeUtleVNlYXJjaFxuKTogUHJvcHJpZXRhcnlLZXlWYWx1ZVtdIHtcbiAgaWYgKCFpbnB1dC51bmtub3duS2V5VmFscz8ubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBnZXRQcm9wcmlldGFyeUtleVZhbHVlc0Zyb21Vbmtub3duS2V5VmFsdWVzKGlucHV0LCBrZXlTZWFyY2gpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHNidE91dHB1dFByb3ByaWV0YXJ5S2V5VmFscyhcbiAgb3V0cHV0OiBQc2J0T3V0cHV0LFxuICBrZXlTZWFyY2g/OiBQcm9wcmlldGFyeUtleVNlYXJjaFxuKTogUHJvcHJpZXRhcnlLZXlWYWx1ZVtdIHtcbiAgaWYgKCFvdXRwdXQudW5rbm93bktleVZhbHM/Lmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gZ2V0UHJvcHJpZXRhcnlLZXlWYWx1ZXNGcm9tVW5rbm93bktleVZhbHVlcyhvdXRwdXQsIGtleVNlYXJjaCk7XG59XG5cbi8qKlxuICogQHJldHVybiBwYXJ0aWFsU2lnL3RhcFNjcmlwdFNpZy9NVVNJRzJfUEFSVElBTF9TSUcgY291bnQgaWZmIGlucHV0IGlzIG5vdCBmaW5hbGl6ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBzYnRJbnB1dFNpZ25hdHVyZUNvdW50KGlucHV0OiBQc2J0SW5wdXQpOiBudW1iZXIge1xuICBpZiAoaXNQc2J0SW5wdXRGaW5hbGl6ZWQoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBpcyBhbHJlYWR5IGZpbmFsaXplZCcpO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChcbiAgICBBcnJheS5pc0FycmF5KGlucHV0LnBhcnRpYWxTaWcpID8gaW5wdXQucGFydGlhbFNpZy5sZW5ndGggOiAwLFxuICAgIEFycmF5LmlzQXJyYXkoaW5wdXQudGFwU2NyaXB0U2lnKSA/IGlucHV0LnRhcFNjcmlwdFNpZy5sZW5ndGggOiAwLFxuICAgIGdldFBzYnRJbnB1dFByb3ByaWV0YXJ5S2V5VmFscyhpbnB1dCwge1xuICAgICAgaWRlbnRpZmllcjogUFNCVF9QUk9QUklFVEFSWV9JREVOVElGSUVSLFxuICAgICAgc3VidHlwZTogUHJvcHJpZXRhcnlLZXlTdWJ0eXBlLk1VU0lHMl9QQVJUSUFMX1NJRyxcbiAgICB9KS5sZW5ndGhcbiAgKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIHRydWUgaWZmIFBTQlQgaW5wdXQgaXMgZmluYWxpemVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnRJbnB1dEZpbmFsaXplZChpbnB1dDogUHNidElucHV0KTogYm9vbGVhbiB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoaW5wdXQuZmluYWxTY3JpcHRTaWcpIHx8IEJ1ZmZlci5pc0J1ZmZlcihpbnB1dC5maW5hbFNjcmlwdFdpdG5lc3MpO1xufVxuXG4vKipcbiAqIEByZXR1cm4gdHJ1ZSBpZmYgZGF0YSBzdGFydHMgd2l0aCBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2VcbiAqIEBwYXJhbSBkYXRhIGJ5dGUgYXJyYXkgb3IgaGV4IHN0cmluZ1xuICogKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BzYnQoZGF0YTogQnVmZmVyIHwgc3RyaW5nKTogYm9vbGVhbiB7XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAxNzQubWVkaWF3aWtpI3NwZWNpZmljYXRpb25cbiAgLy8gMHg3MDczNjI3NCAtIEFTQ0lJIGZvciAncHNidCcuIDB4ZmYgLSBzZXBhcmF0b3JcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIGlmIChkYXRhLmxlbmd0aCA8IDEwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGRhdGEgPSBCdWZmZXIuZnJvbShkYXRhLnNsaWNlKDAsIDEwKSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiA1IDw9IGRhdGEubGVuZ3RoICYmIGRhdGEucmVhZFVJbnQzMkJFKDApID09PSAweDcwNzM2Mjc0ICYmIGRhdGEucmVhZFVJbnQ4KDQpID09PSAweGZmO1xufVxuXG4vKipcbiAqIEZpcnN0IGNoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBhIGJ1ZmZlciB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBtYWdpYyBQU0JUIGJ5dGUgc2VxdWVuY2UuXG4gKiBJZiBub3QsIGl0IGNoZWNrcyBpZiB0aGUgaW5wdXQgaXMgYSBiYXNlNjQtIG9yIGhleC1lbmNvZGVkIHN0cmluZyB0aGF0IHN0YXJ0cyB3aXRoIFBTQlQgaGVhZGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gcmVhZGluZyBhIGZpbGUgdGhhdCBjb3VsZCBiZSBpbiBhbnkgb2YgdGhlIGFib3ZlIGZvcm1hdHMgb3Igd2hlblxuICogZGVhbGluZyB3aXRoIGEgcmVxdWVzdCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBoZXggb3IgYmFzZTY0IGVuY29kZWQgUFNCVC5cbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybiBidWZmZXIgdGhhdCBzdGFydHMgd2l0aCB0aGUgbWFnaWMgUFNCVCBieXRlIHNlcXVlbmNlXG4gKiBAdGhyb3dzIEVycm9yIHdoZW4gY29udmVyc2lvbiBpcyBub3QgcG9zc2libGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHNidEJ1ZmZlcihkYXRhOiBCdWZmZXIgfCBzdHJpbmcpOiBCdWZmZXIge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgLy8gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJ1ZmZlciB0aGF0IGxvb2tzIGxpa2UgYSBwc2J0IGFscmVhZHlcbiAgICBpZiAoaXNQc2J0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyB3ZSBjb3VsZCBiZSBkZWFsaW5nIHdpdGggYSBidWZmZXIgdGhhdCBjb3VsZCBiZSBhIGhleCBvciBiYXNlNjQgZW5jb2RlZCBwc2J0XG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoJ2FzY2lpJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZW5jb2RpbmdzID0gWydoZXgnLCAnYmFzZTY0J10gYXMgY29uc3Q7XG4gICAgZm9yIChjb25zdCBlbmNvZGluZyBvZiBlbmNvZGluZ3MpIHtcbiAgICAgIGxldCBidWZmZXI6IEJ1ZmZlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGRhdGEsIGVuY29kaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoaXNQc2J0KGJ1ZmZlcikpIHtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRhdGEgaXMgbm90IGluIGFueSBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6ICR7ZW5jb2RpbmdzLmpvaW4oJywgJyl9YCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ2RhdGEgbXVzdCBiZSBhIGJ1ZmZlciBvciBhIHN0cmluZycpO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHNpZ25pbmcgb3IgdmFsaWRhdGluZyBhIHBzYnQgd2l0aCBub24tc2Vnd2l0IGlucHV0cyB0aG9zZSBkbyBub3QgY29udGFpbiBub25XaXRuZXNzVXR4by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhVbnNhZmVOb25TZWd3aXQ8VD4ocHNidDogUHNidCwgZm46ICgpID0+IFQsIHVuc2FmZSA9IHRydWUpOiBUIHtcbiAgY29uc3QgcHJldlZhbHVlID0gKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fVU5TQUZFX1NJR05fTk9OU0VHV0lUO1xuICBjb25zdCBwcmV2VmFsdWVXYXJuID0gKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fV0FSTl9VTlNBRkVfU0lHTl9OT05TRUdXSVQ7XG4gIChwc2J0IGFzIGFueSkuX19DQUNIRS5fX1VOU0FGRV9TSUdOX05PTlNFR1dJVCA9IHVuc2FmZTtcbiAgKHBzYnQgYXMgYW55KS5fX0NBQ0hFLl9fV0FSTl9VTlNBRkVfU0lHTl9OT05TRUdXSVQgPSAhdW5zYWZlO1xuICB0cnkge1xuICAgIHJldHVybiBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIChwc2J0IGFzIGFueSkuX19DQUNIRS5fX1VOU0FGRV9TSUdOX05PTlNFR1dJVCA9IHByZXZWYWx1ZTtcbiAgICAocHNidCBhcyBhbnkpLl9fQ0FDSEUuX19XQVJOX1VOU0FGRV9TSUdOX05PTlNFR1dJVCA9IHByZXZWYWx1ZVdhcm47XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
1
|
import { TxOutput } from 'bitcoinjs-lib';
|
|
3
2
|
import { Network } from '..';
|
|
4
3
|
import { UtxoTransactionBuilder } from './UtxoTransactionBuilder';
|
|
@@ -55,7 +54,7 @@ export declare function getOutputIdForInput(i: {
|
|
|
55
54
|
/**
|
|
56
55
|
* Reference to output of an existing transaction
|
|
57
56
|
*/
|
|
58
|
-
export
|
|
57
|
+
export type TxOutPoint = {
|
|
59
58
|
txid: string;
|
|
60
59
|
vout: number;
|
|
61
60
|
};
|
|
@@ -63,7 +62,7 @@ export declare type TxOutPoint = {
|
|
|
63
62
|
* Output reference and script data.
|
|
64
63
|
* Suitable for use for `txb.addInput()`
|
|
65
64
|
*/
|
|
66
|
-
export
|
|
65
|
+
export type PrevOutput<TNumber extends number | bigint = number> = TxOutPoint & TxOutput<TNumber> & {
|
|
67
66
|
prevTx?: Buffer;
|
|
68
67
|
};
|
|
69
68
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Unspent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Unspent.d.ts","sourceRoot":"","sources":["../../../src/bitgo/Unspent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.isUnspentWithPrevTx = isUnspentWithPrevTx;
|
|
4
|
+
exports.toOutput = toOutput;
|
|
5
|
+
exports.fromOutput = fromOutput;
|
|
6
|
+
exports.fromOutputWithPrevTx = fromOutputWithPrevTx;
|
|
7
|
+
exports.parseOutputId = parseOutputId;
|
|
8
|
+
exports.formatOutputId = formatOutputId;
|
|
9
|
+
exports.getOutputIdForInput = getOutputIdForInput;
|
|
10
|
+
exports.toPrevOutput = toPrevOutput;
|
|
11
|
+
exports.toPrevOutputWithPrevTx = toPrevOutputWithPrevTx;
|
|
12
|
+
exports.addToTransactionBuilder = addToTransactionBuilder;
|
|
13
|
+
exports.unspentSum = unspentSum;
|
|
4
14
|
const address_1 = require("../address");
|
|
5
15
|
function isUnspentWithPrevTx(u) {
|
|
6
16
|
return Buffer.isBuffer(u.prevTx);
|
|
7
17
|
}
|
|
8
|
-
exports.isUnspentWithPrevTx = isUnspentWithPrevTx;
|
|
9
18
|
/**
|
|
10
19
|
* @return TxOutput from Unspent
|
|
11
20
|
*/
|
|
12
21
|
function toOutput(u, network) {
|
|
13
22
|
return {
|
|
14
|
-
script: address_1.toOutputScript(u.address, network),
|
|
23
|
+
script: (0, address_1.toOutputScript)(u.address, network),
|
|
15
24
|
value: u.value,
|
|
16
25
|
};
|
|
17
26
|
}
|
|
18
|
-
exports.toOutput = toOutput;
|
|
19
27
|
/**
|
|
20
28
|
* @return Unspent from TxOutput
|
|
21
29
|
*/
|
|
@@ -26,18 +34,16 @@ function fromOutput(tx, vout) {
|
|
|
26
34
|
}
|
|
27
35
|
return {
|
|
28
36
|
id: formatOutputId({ txid: tx.getId(), vout }),
|
|
29
|
-
address: address_1.fromOutputScript(o.script, tx.network),
|
|
37
|
+
address: (0, address_1.fromOutputScript)(o.script, tx.network),
|
|
30
38
|
value: o.value,
|
|
31
39
|
};
|
|
32
40
|
}
|
|
33
|
-
exports.fromOutput = fromOutput;
|
|
34
41
|
function fromOutputWithPrevTx(tx, vout) {
|
|
35
42
|
return {
|
|
36
43
|
...fromOutput(tx, vout),
|
|
37
44
|
prevTx: tx.toBuffer(),
|
|
38
45
|
};
|
|
39
46
|
}
|
|
40
|
-
exports.fromOutputWithPrevTx = fromOutputWithPrevTx;
|
|
41
47
|
/**
|
|
42
48
|
* @param outputId
|
|
43
49
|
* @return TxOutPoint
|
|
@@ -57,7 +63,6 @@ function parseOutputId(outputId) {
|
|
|
57
63
|
}
|
|
58
64
|
return { txid, vout };
|
|
59
65
|
}
|
|
60
|
-
exports.parseOutputId = parseOutputId;
|
|
61
66
|
/**
|
|
62
67
|
* @param txid
|
|
63
68
|
* @param vout
|
|
@@ -66,14 +71,12 @@ exports.parseOutputId = parseOutputId;
|
|
|
66
71
|
function formatOutputId({ txid, vout }) {
|
|
67
72
|
return `${txid}:${vout}`;
|
|
68
73
|
}
|
|
69
|
-
exports.formatOutputId = formatOutputId;
|
|
70
74
|
function getOutputIdForInput(i) {
|
|
71
75
|
return {
|
|
72
76
|
txid: Buffer.from(i.hash).reverse().toString('hex'),
|
|
73
77
|
vout: i.index,
|
|
74
78
|
};
|
|
75
79
|
}
|
|
76
|
-
exports.getOutputIdForInput = getOutputIdForInput;
|
|
77
80
|
/**
|
|
78
81
|
* @return PrevOutput from Unspent
|
|
79
82
|
*/
|
|
@@ -83,7 +86,6 @@ function toPrevOutput(u, network) {
|
|
|
83
86
|
...toOutput(u, network),
|
|
84
87
|
};
|
|
85
88
|
}
|
|
86
|
-
exports.toPrevOutput = toPrevOutput;
|
|
87
89
|
/**
|
|
88
90
|
* @return PrevOutput with prevTx from Unspent
|
|
89
91
|
*/
|
|
@@ -104,7 +106,6 @@ function toPrevOutputWithPrevTx(u, network) {
|
|
|
104
106
|
prevTx,
|
|
105
107
|
};
|
|
106
108
|
}
|
|
107
|
-
exports.toPrevOutputWithPrevTx = toPrevOutputWithPrevTx;
|
|
108
109
|
/**
|
|
109
110
|
* @param txb
|
|
110
111
|
* @param u
|
|
@@ -114,7 +115,6 @@ function addToTransactionBuilder(txb, u, sequence) {
|
|
|
114
115
|
const { txid, vout, script, value } = toPrevOutput(u, txb.network);
|
|
115
116
|
txb.addInput(txid, vout, sequence, script, value);
|
|
116
117
|
}
|
|
117
|
-
exports.addToTransactionBuilder = addToTransactionBuilder;
|
|
118
118
|
/**
|
|
119
119
|
* Sum the values of the unspents.
|
|
120
120
|
* Throws error if sum is not a safe integer value, or if unspent amount types do not match `amountType`
|
|
@@ -134,5 +134,4 @@ function unspentSum(unspents, amountType = 'number') {
|
|
|
134
134
|
return sum;
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
|
-
exports.unspentSum = unspentSum;
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXRnby9VbnNwZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLHdDQUE4RDtBQTRCOUQsU0FBZ0IsbUJBQW1CLENBQ2pDLENBQW1CO0lBRW5CLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBRSxDQUFnQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFKRCxrREFJQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFrQyxDQUFtQixFQUFFLE9BQWdCO0lBQzdGLE9BQU87UUFDTCxNQUFNLEVBQUUsd0JBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztRQUMxQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUxELDRCQUtDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixVQUFVLENBQ3hCLEVBQTRCLEVBQzVCLElBQVk7SUFFWixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQ2pDO0lBQ0QsT0FBTztRQUNMLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSwwQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDL0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFiRCxnQ0FhQztBQUVELFNBQWdCLG9CQUFvQixDQUNsQyxFQUE0QixFQUM1QixJQUFZO0lBRVosT0FBTztRQUNMLEdBQUcsVUFBVSxDQUFDLEVBQUUsRUFBRSxJ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QUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBa0IsQ0FBQyxDQUFDO0lBQzlFLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFQRCwwREFPQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsUUFBOEIsRUFDOUIsYUFBa0MsUUFBUTtJQUUxQyxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDM0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFJLENBQUMsQ0FBQyxLQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBWSxDQUFDO0tBQ3JGO1NBQU07UUFDTCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFJLENBQUMsQ0FBQyxLQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUVBQWlFLENBQUMsQ0FBQztTQUNwRjtRQUNELE9BQU8sR0FBYyxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQWJELGdDQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHhPdXRwdXQgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBmcm9tT3V0cHV0U2NyaXB0LCB0b091dHB1dFNjcmlwdCB9IGZyb20gJy4uL2FkZHJlc3MnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vVXR4b1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuL1V0eG9UcmFuc2FjdGlvbic7XG5cbi8qKlxuICogUHVibGljIHVuc3BlbnQgZGF0YSBpbiBCaXRHby1zcGVjaWZpYyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqXG4gICAqIEZvcm1hdDogJHt0eGlkfToke3ZvdXR9LlxuICAgKiBVc2UgYHBhcnNlT3V0cHV0SWQoaWQpYCB0byBwYXJzZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yay1zcGVjaWZpYyBlbmNvZGVkIGFkZHJlc3MuXG4gICAqIFVzZSBgdG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yaylgIHRvIG9idGFpbiBzY3JpcHRQdWJLZXkuXG4gICAqL1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IGluIHNhdG9zaGkuXG4gICAqL1xuICB2YWx1ZTogVE51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbnNwZW50V2l0aFByZXZUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFVuc3BlbnQ8VE51bWJlcj4ge1xuICBwcmV2VHg6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCwgVFVuc3BlbnQgZXh0ZW5kcyBVbnNwZW50PFROdW1iZXI+PihcbiAgdTogVW5zcGVudDxUTnVtYmVyPlxuKTogdSBpcyBUVW5zcGVudCAmIHsgcHJldlR4OiBCdWZmZXIgfSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoKHUgYXMgVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlcj4pLnByZXZUeCk7XG59XG5cbi8qKlxuICogQHJldHVybiBUeE91dHB1dCBmcm9tIFVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHU6IFVuc3BlbnQ8VE51bWJlcj4sIG5ldHdvcms6IE5ldHdvcmspOiBUeE91dHB1dDxUTnVtYmVyPiB7XG4gIHJldHVybiB7XG4gICAgc2NyaXB0OiB0b091dHB1dFNjcmlwdCh1LmFkZHJlc3MsIG5ldHdvcmspLFxuICAgIHZhbHVlOiB1LnZhbHVlLFxuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4gVW5zcGVudCBmcm9tIFR4T3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICB2b3V0OiBudW1iZXJcbik6IFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjb25zdCBvID0gdHgub3V0c1t2b3V0XTtcbiAgaWYgKCFvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZvdXRgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiBmb3JtYXRPdXRwdXRJZCh7IHR4aWQ6IHR4LmdldElkKCksIHZvdXQgfSksXG4gICAgYWRkcmVzczogZnJvbU91dHB1dFNjcmlwdChvLnNjcmlwdCwgdHgubmV0d29yayksXG4gICAgdmFsdWU6IG8udmFsdWUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0V2l0aFByZXZUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdm91dDogbnVtYmVyXG4pOiBVbnNwZW50V2l0aFByZXZUeDxUTnVtYmVyPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZnJvbU91dHB1dCh0eCwgdm91dCksXG4gICAgcHJldlR4OiB0eC50b0J1ZmZlcigpLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBvdXRwdXRJZFxuICogQHJldHVybiBUeE91dFBvaW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU91dHB1dElkKG91dHB1dElkOiBzdHJpbmcpOiBUeE91dFBvaW50IHtcbiAgY29uc3QgcGFydHMgPSBvdXRwdXRJZC5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dElkLCBtdXN0IGhhdmUgZm9ybWF0IHR4aWQ6dm91dGApO1xuICB9XG4gIGNvbnN0IFt0eGlkLCB2b3V0U3RyXSA9IHBhcnRzO1xuICBjb25zdCB2b3V0ID0gTnVtYmVyKHZvdXRTdHIpO1xuICBpZiAodHhpZC5sZW5ndGggIT09IDY0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHR4aWQgJHt0eGlkfSAke3R4aWQubGVuZ3RofWApO1xuICB9XG4gIGlmIChOdW1iZXIuaXNOYU4odm91dCkgfHwgdm91dCA8IDAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZvdXQ6IG11c3QgYmUgaW50ZWdlciA+PSAwYCk7XG4gIH1cbiAgcmV0dXJuIHsgdHhpZCwgdm91dCB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB0eGlkXG4gKiBAcGFyYW0gdm91dFxuICogQHJldHVybiBvdXRwdXRJZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0T3V0cHV0SWQoeyB0eGlkLCB2b3V0IH06IFR4T3V0UG9pbnQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7dHhpZH06JHt2b3V0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRJZEZvcklucHV0KGk6IHsgaGFzaDogQnVmZmVyOyBpbmRleDogbnVtYmVyIH0pOiBUeE91dFBvaW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eGlkOiBCdWZmZXIuZnJvbShpLmhhc2gpLnJldmVyc2UoKS50b1N0cmluZygnaGV4JyksXG4gICAgdm91dDogaS5pbmRleCxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gb3V0cHV0IG9mIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFR4T3V0UG9pbnQgPSB7XG4gIHR4aWQ6IHN0cmluZztcbiAgdm91dDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgcmVmZXJlbmNlIGFuZCBzY3JpcHQgZGF0YS5cbiAqIFN1aXRhYmxlIGZvciB1c2UgZm9yIGB0eGIuYWRkSW5wdXQoKWBcbiAqL1xuZXhwb3J0IHR5cGUgUHJldk91dHB1dDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IFR4T3V0UG9pbnQgJlxuICBUeE91dHB1dDxUTnVtYmVyPiAmIHtcbiAgICBwcmV2VHg/OiBCdWZmZXI7XG4gIH07XG5cbi8qKlxuICogQHJldHVybiBQcmV2T3V0cHV0IGZyb20gVW5zcGVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QcmV2T3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB1OiBVbnNwZW50PFROdW1iZXI+LFxuICBuZXR3b3JrOiBOZXR3b3JrXG4pOiBQcmV2T3V0cHV0PFROdW1iZXI+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXJzZU91dHB1dElkKHUuaWQpLFxuICAgIC4uLnRvT3V0cHV0KHUsIG5ldHdvcmspLFxuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4gUHJldk91dHB1dCB3aXRoIHByZXZUeCBmcm9tIFVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJldk91dHB1dFdpdGhQcmV2VHg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHU6IFVuc3BlbnQ8VE51bWJlcj4gJiB7IHByZXZUeD86IHVua25vd24gfSxcbiAgbmV0d29yazogTmV0d29ya1xuKTogUHJldk91dHB1dDxUTnVtYmVyPiB7XG4gIGxldCBwcmV2VHg7XG4gIGlmICh0eXBlb2YgdS5wcmV2VHggPT09ICdzdHJpbmcnKSB7XG4gICAgcHJldlR4ID0gQnVmZmVyLmZyb20odS5wcmV2VHgsICdoZXgnKTtcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodS5wcmV2VHgpKSB7XG4gICAgcHJldlR4ID0gdS5wcmV2VHg7XG4gIH0gZWxzZSBpZiAodS5wcmV2VHggIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmV2VHggdHlwZSBmb3IgdW5zcGVudCAke3UucHJldlR4fWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4ucGFyc2VPdXRwdXRJZCh1LmlkKSxcbiAgICAuLi50b091dHB1dCh1LCBuZXR3b3JrKSxcbiAgICBwcmV2VHgsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHR4YlxuICogQHBhcmFtIHVcbiAqIEBwYXJhbSBzZXF1ZW5jZSAtIHNlcXVlbmNlSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eGI6IFV0eG9UcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4sXG4gIHU6IFVuc3BlbnQ8VE51bWJlcj4sXG4gIHNlcXVlbmNlPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB0eGlkLCB2b3V0LCBzY3JpcHQsIHZhbHVlIH0gPSB0b1ByZXZPdXRwdXQodSwgdHhiLm5ldHdvcmsgYXMgTmV0d29yayk7XG4gIHR4Yi5hZGRJbnB1dCh0eGlkLCB2b3V0LCBzZXF1ZW5jZSwgc2NyaXB0LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogU3VtIHRoZSB2YWx1ZXMgb2YgdGhlIHVuc3BlbnRzLlxuICogVGhyb3dzIGVycm9yIGlmIHN1bSBpcyBub3QgYSBzYWZlIGludGVnZXIgdmFsdWUsIG9yIGlmIHVuc3BlbnQgYW1vdW50IHR5cGVzIGRvIG5vdCBtYXRjaCBgYW1vdW50VHlwZWBcbiAqIEBwYXJhbSB1bnNwZW50cyAtIGFycmF5IG9mIHVuc3BlbnRzIHRvIHN1bVxuICogQHBhcmFtIGFtb3VudFR5cGUgLSBleHBlY3RlZCB2YWx1ZSB0eXBlIG9mIHVuc3BlbnRzXG4gKiBAcmV0dXJuIHVuc3BlbnRTdW0gLSB0eXBlIG1hdGNoZXMgYW1vdW50VHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zcGVudFN1bTxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdW5zcGVudHM6IHsgdmFsdWU6IFROdW1iZXIgfVtdLFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcidcbik6IFROdW1iZXIge1xuICBpZiAoYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gdW5zcGVudHMucmVkdWNlKChzdW0sIHUpID0+IHN1bSArICh1LnZhbHVlIGFzIGJpZ2ludCksIEJpZ0ludCgwKSkgYXMgVE51bWJlcjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzdW0gPSB1bnNwZW50cy5yZWR1Y2UoKHN1bSwgdSkgPT4gc3VtICsgKHUudmFsdWUgYXMgbnVtYmVyKSwgTnVtYmVyKDApKTtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHN1bSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5zcGVudCBzdW0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyIG51bWJlciwgY29uc2lkZXIgdXNpbmcgYmlnaW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBzdW0gYXMgVE51bWJlcjtcbiAgfVxufVxuIl19
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zcGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaXRnby9VbnNwZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBOEJBLGtEQUlDO0FBS0QsNEJBS0M7QUFLRCxnQ0FhQztBQUVELG9EQVFDO0FBTUQsc0NBY0M7QUFPRCx3Q0FFQztBQUVELGtEQUtDO0FBc0JELG9DQVFDO0FBS0Qsd0RBaUJDO0FBT0QsMERBT0M7QUFTRCxnQ0FhQztBQWxNRCx3Q0FBOEQ7QUE0QjlELFNBQWdCLG1CQUFtQixDQUNqQyxDQUFtQjtJQUVuQixPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUUsQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixRQUFRLENBQWtDLENBQW1CLEVBQUUsT0FBZ0I7SUFDN0YsT0FBTztRQUNMLE1BQU0sRUFBRSxJQUFBLHdCQUFjLEVBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDMUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsRUFBNEIsRUFDNUIsSUFBWTtJQUVaLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTztRQUNMLEVBQUUsRUFBRSxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxJQUFBLDBCQUFnQixFQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztRQUMvQyxLQUFLLEVBQUUsQ0FBQyxD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Q3ZCLE1BQU07S0FDUCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsR0FBb0MsRUFDcEMsQ0FBbUIsRUFDbkIsUUFBaUI7SUFFakIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQWtCLENBQUMsQ0FBQztJQUM5RSxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsVUFBVSxDQUN4QixRQUE4QixFQUM5QixhQUFrQyxRQUFRO0lBRTFDLElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBSSxDQUFDLENBQUMsS0FBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVksQ0FBQztJQUN0RixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUksQ0FBQyxDQUFDLEtBQWdCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNELE9BQU8sR0FBYyxDQUFDO0lBQ3hCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHhPdXRwdXQgfSBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCB7IE5ldHdvcmsgfSBmcm9tICcuLic7XG5pbXBvcnQgeyBmcm9tT3V0cHV0U2NyaXB0LCB0b091dHB1dFNjcmlwdCB9IGZyb20gJy4uL2FkZHJlc3MnO1xuaW1wb3J0IHsgVXR4b1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vVXR4b1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBVdHhvVHJhbnNhY3Rpb24gfSBmcm9tICcuL1V0eG9UcmFuc2FjdGlvbic7XG5cbi8qKlxuICogUHVibGljIHVuc3BlbnQgZGF0YSBpbiBCaXRHby1zcGVjaWZpYyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnNwZW50PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgLyoqXG4gICAqIEZvcm1hdDogJHt0eGlkfToke3ZvdXR9LlxuICAgKiBVc2UgYHBhcnNlT3V0cHV0SWQoaWQpYCB0byBwYXJzZS5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmV0d29yay1zcGVjaWZpYyBlbmNvZGVkIGFkZHJlc3MuXG4gICAqIFVzZSBgdG9PdXRwdXRTY3JpcHQoYWRkcmVzcywgbmV0d29yaylgIHRvIG9idGFpbiBzY3JpcHRQdWJLZXkuXG4gICAqL1xuICBhZGRyZXNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYW1vdW50IGluIHNhdG9zaGkuXG4gICAqL1xuICB2YWx1ZTogVE51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVbnNwZW50V2l0aFByZXZUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiBleHRlbmRzIFVuc3BlbnQ8VE51bWJlcj4ge1xuICBwcmV2VHg6IEJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludCwgVFVuc3BlbnQgZXh0ZW5kcyBVbnNwZW50PFROdW1iZXI+PihcbiAgdTogVW5zcGVudDxUTnVtYmVyPlxuKTogdSBpcyBUVW5zcGVudCAmIHsgcHJldlR4OiBCdWZmZXIgfSB7XG4gIHJldHVybiBCdWZmZXIuaXNCdWZmZXIoKHUgYXMgVW5zcGVudFdpdGhQcmV2VHg8VE51bWJlcj4pLnByZXZUeCk7XG59XG5cbi8qKlxuICogQHJldHVybiBUeE91dHB1dCBmcm9tIFVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KHU6IFVuc3BlbnQ8VE51bWJlcj4sIG5ldHdvcms6IE5ldHdvcmspOiBUeE91dHB1dDxUTnVtYmVyPiB7XG4gIHJldHVybiB7XG4gICAgc2NyaXB0OiB0b091dHB1dFNjcmlwdCh1LmFkZHJlc3MsIG5ldHdvcmspLFxuICAgIHZhbHVlOiB1LnZhbHVlLFxuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4gVW5zcGVudCBmcm9tIFR4T3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eDogVXR4b1RyYW5zYWN0aW9uPFROdW1iZXI+LFxuICB2b3V0OiBudW1iZXJcbik6IFVuc3BlbnQ8VE51bWJlcj4ge1xuICBjb25zdCBvID0gdHgub3V0c1t2b3V0XTtcbiAgaWYgKCFvKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZvdXRgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiBmb3JtYXRPdXRwdXRJZCh7IHR4aWQ6IHR4LmdldElkKCksIHZvdXQgfSksXG4gICAgYWRkcmVzczogZnJvbU91dHB1dFNjcmlwdChvLnNjcmlwdCwgdHgubmV0d29yayksXG4gICAgdmFsdWU6IG8udmFsdWUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tT3V0cHV0V2l0aFByZXZUeDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdHg6IFV0eG9UcmFuc2FjdGlvbjxUTnVtYmVyPixcbiAgdm91dDogbnVtYmVyXG4pOiBVbnNwZW50V2l0aFByZXZUeDxUTnVtYmVyPiB7XG4gIHJldHVybiB7XG4gICAgLi4uZnJvbU91dHB1dCh0eCwgdm91dCksXG4gICAgcHJldlR4OiB0eC50b0J1ZmZlcigpLFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSBvdXRwdXRJZFxuICogQHJldHVybiBUeE91dFBvaW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU91dHB1dElkKG91dHB1dElkOiBzdHJpbmcpOiBUeE91dFBvaW50IHtcbiAgY29uc3QgcGFydHMgPSBvdXRwdXRJZC5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIG91dHB1dElkLCBtdXN0IGhhdmUgZm9ybWF0IHR4aWQ6dm91dGApO1xuICB9XG4gIGNvbnN0IFt0eGlkLCB2b3V0U3RyXSA9IHBhcnRzO1xuICBjb25zdCB2b3V0ID0gTnVtYmVyKHZvdXRTdHIpO1xuICBpZiAodHhpZC5sZW5ndGggIT09IDY0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHR4aWQgJHt0eGlkfSAke3R4aWQubGVuZ3RofWApO1xuICB9XG4gIGlmIChOdW1iZXIuaXNOYU4odm91dCkgfHwgdm91dCA8IDAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZvdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHZvdXQ6IG11c3QgYmUgaW50ZWdlciA+PSAwYCk7XG4gIH1cbiAgcmV0dXJuIHsgdHhpZCwgdm91dCB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB0eGlkXG4gKiBAcGFyYW0gdm91dFxuICogQHJldHVybiBvdXRwdXRJZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0T3V0cHV0SWQoeyB0eGlkLCB2b3V0IH06IFR4T3V0UG9pbnQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7dHhpZH06JHt2b3V0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRJZEZvcklucHV0KGk6IHsgaGFzaDogQnVmZmVyOyBpbmRleDogbnVtYmVyIH0pOiBUeE91dFBvaW50IHtcbiAgcmV0dXJuIHtcbiAgICB0eGlkOiBCdWZmZXIuZnJvbShpLmhhc2gpLnJldmVyc2UoKS50b1N0cmluZygnaGV4JyksXG4gICAgdm91dDogaS5pbmRleCxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gb3V0cHV0IG9mIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCB0eXBlIFR4T3V0UG9pbnQgPSB7XG4gIHR4aWQ6IHN0cmluZztcbiAgdm91dDogbnVtYmVyO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgcmVmZXJlbmNlIGFuZCBzY3JpcHQgZGF0YS5cbiAqIFN1aXRhYmxlIGZvciB1c2UgZm9yIGB0eGIuYWRkSW5wdXQoKWBcbiAqL1xuZXhwb3J0IHR5cGUgUHJldk91dHB1dDxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiA9IFR4T3V0UG9pbnQgJlxuICBUeE91dHB1dDxUTnVtYmVyPiAmIHtcbiAgICBwcmV2VHg/OiBCdWZmZXI7XG4gIH07XG5cbi8qKlxuICogQHJldHVybiBQcmV2T3V0cHV0IGZyb20gVW5zcGVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QcmV2T3V0cHV0PFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB1OiBVbnNwZW50PFROdW1iZXI+LFxuICBuZXR3b3JrOiBOZXR3b3JrXG4pOiBQcmV2T3V0cHV0PFROdW1iZXI+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5wYXJzZU91dHB1dElkKHUuaWQpLFxuICAgIC4uLnRvT3V0cHV0KHUsIG5ldHdvcmspLFxuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4gUHJldk91dHB1dCB3aXRoIHByZXZUeCBmcm9tIFVuc3BlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJldk91dHB1dFdpdGhQcmV2VHg8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4oXG4gIHU6IFVuc3BlbnQ8VE51bWJlcj4gJiB7IHByZXZUeD86IHVua25vd24gfSxcbiAgbmV0d29yazogTmV0d29ya1xuKTogUHJldk91dHB1dDxUTnVtYmVyPiB7XG4gIGxldCBwcmV2VHg7XG4gIGlmICh0eXBlb2YgdS5wcmV2VHggPT09ICdzdHJpbmcnKSB7XG4gICAgcHJldlR4ID0gQnVmZmVyLmZyb20odS5wcmV2VHgsICdoZXgnKTtcbiAgfSBlbHNlIGlmIChCdWZmZXIuaXNCdWZmZXIodS5wcmV2VHgpKSB7XG4gICAgcHJldlR4ID0gdS5wcmV2VHg7XG4gIH0gZWxzZSBpZiAodS5wcmV2VHggIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcmV2VHggdHlwZSBmb3IgdW5zcGVudCAke3UucHJldlR4fWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4ucGFyc2VPdXRwdXRJZCh1LmlkKSxcbiAgICAuLi50b091dHB1dCh1LCBuZXR3b3JrKSxcbiAgICBwcmV2VHgsXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHR4YlxuICogQHBhcmFtIHVcbiAqIEBwYXJhbSBzZXF1ZW5jZSAtIHNlcXVlbmNlSWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvVHJhbnNhY3Rpb25CdWlsZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQ+KFxuICB0eGI6IFV0eG9UcmFuc2FjdGlvbkJ1aWxkZXI8VE51bWJlcj4sXG4gIHU6IFVuc3BlbnQ8VE51bWJlcj4sXG4gIHNlcXVlbmNlPzogbnVtYmVyXG4pOiB2b2lkIHtcbiAgY29uc3QgeyB0eGlkLCB2b3V0LCBzY3JpcHQsIHZhbHVlIH0gPSB0b1ByZXZPdXRwdXQodSwgdHhiLm5ldHdvcmsgYXMgTmV0d29yayk7XG4gIHR4Yi5hZGRJbnB1dCh0eGlkLCB2b3V0LCBzZXF1ZW5jZSwgc2NyaXB0LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogU3VtIHRoZSB2YWx1ZXMgb2YgdGhlIHVuc3BlbnRzLlxuICogVGhyb3dzIGVycm9yIGlmIHN1bSBpcyBub3QgYSBzYWZlIGludGVnZXIgdmFsdWUsIG9yIGlmIHVuc3BlbnQgYW1vdW50IHR5cGVzIGRvIG5vdCBtYXRjaCBgYW1vdW50VHlwZWBcbiAqIEBwYXJhbSB1bnNwZW50cyAtIGFycmF5IG9mIHVuc3BlbnRzIHRvIHN1bVxuICogQHBhcmFtIGFtb3VudFR5cGUgLSBleHBlY3RlZCB2YWx1ZSB0eXBlIG9mIHVuc3BlbnRzXG4gKiBAcmV0dXJuIHVuc3BlbnRTdW0gLSB0eXBlIG1hdGNoZXMgYW1vdW50VHlwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5zcGVudFN1bTxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50PihcbiAgdW5zcGVudHM6IHsgdmFsdWU6IFROdW1iZXIgfVtdLFxuICBhbW91bnRUeXBlOiAnbnVtYmVyJyB8ICdiaWdpbnQnID0gJ251bWJlcidcbik6IFROdW1iZXIge1xuICBpZiAoYW1vdW50VHlwZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gdW5zcGVudHMucmVkdWNlKChzdW0sIHUpID0+IHN1bSArICh1LnZhbHVlIGFzIGJpZ2ludCksIEJpZ0ludCgwKSkgYXMgVE51bWJlcjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBzdW0gPSB1bnNwZW50cy5yZWR1Y2UoKHN1bSwgdSkgPT4gc3VtICsgKHUudmFsdWUgYXMgbnVtYmVyKSwgTnVtYmVyKDApKTtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHN1bSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5zcGVudCBzdW0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyIG51bWJlciwgY29uc2lkZXIgdXNpbmcgYmlnaW50Jyk7XG4gICAgfVxuICAgIHJldHVybiBzdW0gYXMgVE51bWJlcjtcbiAgfVxufVxuIl19
|