@bitgo-beta/utxo-staking 1.1.1-beta.825 → 1.1.1-beta.827

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.
Files changed (135) hide show
  1. package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
  2. package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
  3. package/dist/cjs/scripts/babylon-sync.js +126 -0
  4. package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
  5. package/dist/cjs/src/babylon/delegationMessage.js +285 -0
  6. package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
  7. package/dist/cjs/src/babylon/descriptor.js +97 -0
  8. package/dist/cjs/src/babylon/index.d.ts.map +1 -0
  9. package/dist/{src → cjs/src}/babylon/index.js +1 -1
  10. package/dist/cjs/src/babylon/network.d.ts.map +1 -0
  11. package/dist/{src → cjs/src}/babylon/network.js +1 -1
  12. package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
  13. package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
  14. package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
  15. package/dist/cjs/src/babylon/stakingManager.js +120 -0
  16. package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
  17. package/dist/cjs/src/babylon/stakingParams.js +132 -0
  18. package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
  19. package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
  20. package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
  21. package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
  22. package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
  23. package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
  24. package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
  25. package/dist/cjs/src/coreDao/descriptor.js +38 -0
  26. package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
  27. package/dist/{src → cjs/src}/coreDao/index.js +1 -1
  28. package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
  29. package/dist/cjs/src/coreDao/opReturn.js +183 -0
  30. package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
  31. package/dist/cjs/src/coreDao/transaction.js +34 -0
  32. package/dist/cjs/src/index.d.ts.map +1 -0
  33. package/dist/{src → cjs/src}/index.js +1 -1
  34. package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
  35. package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
  36. package/dist/cjs/test/unit/babylon/bug71.js +108 -0
  37. package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
  38. package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
  39. package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
  40. package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
  41. package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
  42. package/dist/cjs/test/unit/babylon/transactions.js +338 -0
  43. package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
  44. package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
  45. package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
  46. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
  47. package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
  48. package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
  49. package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
  50. package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
  51. package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
  52. package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
  53. package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
  54. package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
  55. package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
  56. package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
  57. package/dist/cjs/test/unit/coreDao/utils.js +54 -0
  58. package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
  59. package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
  60. package/dist/cjs/test/unit/fixtures.utils.js +91 -0
  61. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  62. package/dist/esm/babylon/delegationMessage.d.ts +38 -0
  63. package/dist/esm/babylon/delegationMessage.js +239 -0
  64. package/dist/esm/babylon/descriptor.d.ts +48 -0
  65. package/dist/esm/babylon/descriptor.js +91 -0
  66. package/dist/esm/babylon/index.d.ts +6 -0
  67. package/dist/esm/babylon/index.js +11 -0
  68. package/dist/esm/babylon/network.d.ts +7 -0
  69. package/dist/esm/babylon/network.js +29 -0
  70. package/dist/esm/babylon/params.mainnet.json +152 -0
  71. package/dist/esm/babylon/params.testnet.json +212 -0
  72. package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
  73. package/dist/esm/babylon/parseDescriptor.js +155 -0
  74. package/dist/esm/babylon/stakingManager.d.ts +6 -0
  75. package/dist/esm/babylon/stakingManager.js +83 -0
  76. package/dist/esm/babylon/stakingParams.d.ts +40 -0
  77. package/dist/esm/babylon/stakingParams.js +86 -0
  78. package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
  79. package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
  80. package/dist/esm/babylon/undelegation/index.d.ts +3 -0
  81. package/dist/esm/babylon/undelegation/index.js +3 -0
  82. package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
  83. package/dist/esm/babylon/undelegation/unbonding.js +70 -0
  84. package/dist/esm/coreDao/descriptor.d.ts +18 -0
  85. package/dist/esm/coreDao/descriptor.js +35 -0
  86. package/dist/esm/coreDao/index.d.ts +4 -0
  87. package/dist/esm/coreDao/index.js +4 -0
  88. package/dist/esm/coreDao/opReturn.d.ts +41 -0
  89. package/dist/esm/coreDao/opReturn.js +175 -0
  90. package/dist/esm/coreDao/transaction.d.ts +28 -0
  91. package/dist/esm/coreDao/transaction.js +30 -0
  92. package/dist/esm/index.d.ts +3 -0
  93. package/dist/esm/index.js +3 -0
  94. package/package.json +26 -10
  95. package/dist/src/babylon/delegationMessage.js +0 -285
  96. package/dist/src/babylon/descriptor.js +0 -97
  97. package/dist/src/babylon/parseDescriptor.js +0 -159
  98. package/dist/src/babylon/stakingManager.js +0 -120
  99. package/dist/src/babylon/stakingParams.js +0 -132
  100. package/dist/src/babylon/undelegation/unbonding.js +0 -111
  101. package/dist/src/coreDao/descriptor.js +0 -38
  102. package/dist/src/coreDao/opReturn.js +0 -183
  103. package/dist/src/coreDao/transaction.js +0 -34
  104. /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
  105. /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
  106. /package/dist/{src → cjs/src}/babylon/index.d.ts +0 -0
  107. /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
  108. /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
  109. /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
  110. /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
  111. /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
  112. /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
  113. /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
  114. /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
  115. /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
  116. /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
  117. /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
  118. /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
  119. /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
  120. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  121. /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
  122. /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
  123. /package/dist/{src → esm}/babylon/index.d.ts.map +0 -0
  124. /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
  125. /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
  126. /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
  127. /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
  128. /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
  129. /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
  130. /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
  131. /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
  132. /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
  133. /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
  134. /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
  135. /package/dist/{src → esm}/index.d.ts.map +0 -0
@@ -1,285 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.getSignedPsbt = getSignedPsbt;
40
- exports.forceFinalizePsbt = forceFinalizePsbt;
41
- exports.getBtcProviderForECKey = getBtcProviderForECKey;
42
- exports.toStakerInfo = toStakerInfo;
43
- exports.createStaking = createStaking;
44
- exports.toStakingTransaction = toStakingTransaction;
45
- exports.createDelegationMessageWithTransaction = createDelegationMessageWithTransaction;
46
- exports.createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider = createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider;
47
- /**
48
- * https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/x/btcstaking/types/validate_parsed_message.go
49
- */
50
- const assert_1 = __importDefault(require("assert"));
51
- const bip322_js_1 = require("bip322-js");
52
- const vendor = __importStar(require("@bitgo-beta/babylonlabs-io-btc-staking-ts"));
53
- const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
54
- const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
55
- const utxo_core_1 = require("@bitgo-beta/utxo-core");
56
- const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
57
- const stakingManager_1 = require("./stakingManager");
58
- const stakingParams_1 = require("./stakingParams");
59
- const network_1 = require("./network");
60
- /**
61
- * Decode a hex or base64 encoded string and check if the length is valid.
62
- * @param v
63
- * @param encoding
64
- */
65
- function decodeCheck(v, encoding) {
66
- const result = Buffer.from(v, encoding);
67
- if (result.toString(encoding).length !== v.length) {
68
- throw new Error(`Invalid ${encoding} encoding`);
69
- }
70
- return result;
71
- }
72
- /**
73
- * Convert a Buffer or string to a base64 encoded string.
74
- * @param v
75
- */
76
- function toBase64(v) {
77
- if (typeof v === 'string') {
78
- for (const encoding of ['base64', 'hex']) {
79
- try {
80
- return toBase64(decodeCheck(v, encoding));
81
- }
82
- catch (e) {
83
- // try next
84
- }
85
- }
86
- throw new Error(`Invalid base64 or hex encoding: ${v}`);
87
- }
88
- return v.toString('base64');
89
- }
90
- function getSignedPsbt(psbt, descriptor, signers, { finalize = false }) {
91
- const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(psbt.toBuffer());
92
- const signedInputs = psbt.data.inputs.flatMap((input, i) => {
93
- (0, assert_1.default)(input.witnessUtxo);
94
- if (Buffer.from(descriptor.scriptPubkey()).equals(input.witnessUtxo.script)) {
95
- wrappedPsbt.updateInputWithDescriptor(i, descriptor);
96
- const signResults = signers.map((signer) => {
97
- (0, assert_1.default)(signer.privateKey);
98
- return wrappedPsbt.signWithPrv(signer.privateKey);
99
- });
100
- return [[i, signResults]];
101
- }
102
- return [];
103
- });
104
- (0, assert_1.default)(signedInputs.length > 0);
105
- if (finalize) {
106
- wrappedPsbt.finalize();
107
- }
108
- return bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize()));
109
- }
110
- /**
111
- * Utility method to work around a bug in btc-staking-ts
112
- * https://github.com/babylonlabs-io/btc-staking-ts/issues/71
113
- * @param v
114
- * @param network
115
- */
116
- function forceFinalizePsbt(v, network) {
117
- if (v instanceof utxolib.Psbt) {
118
- v = v.toBuffer();
119
- }
120
- if (v instanceof bitcoinjslib.Psbt) {
121
- v = v.toBuffer();
122
- }
123
- const psbt = bitcoinjslib.Psbt.fromBuffer(v, { network: (0, network_1.toBitcoinJsNetwork)(network) });
124
- // this only works with certain bitcoinjslib versions
125
- psbt.finalizeAllInputs();
126
- return psbt;
127
- }
128
- function getBtcProviderForECKey(descriptorBuilder, stakerKey) {
129
- function signWithDescriptor(psbt, descriptor, key) {
130
- psbt = getSignedPsbt(psbt, descriptor, [key], { finalize: false });
131
- // BUG: we need to blindly finalize here even though we have not fully signed
132
- psbt.finalizeAllInputs();
133
- return psbt;
134
- }
135
- function signBip322Simple(message) {
136
- // Get the script public key from the staking descriptor
137
- const scriptPubKey = Buffer.from(descriptorBuilder.getStakingDescriptor().scriptPubkey());
138
- const toSpendTx = bip322_js_1.BIP322.buildToSpendTx(message, scriptPubKey);
139
- // Get the to_spend txid
140
- const toSpendTxId = toSpendTx.getId();
141
- // Create PSBT object for constructing the transaction
142
- const toSignPsbt = new bitcoinjslib.Psbt();
143
- toSignPsbt.setVersion(2); // nVersion = 0
144
- toSignPsbt.setLocktime(0); // nLockTime = 0
145
- toSignPsbt.addInput({
146
- hash: toSpendTxId,
147
- index: 0,
148
- sequence: descriptorBuilder.stakingTimeLock,
149
- witnessUtxo: {
150
- script: scriptPubKey,
151
- value: 0,
152
- },
153
- });
154
- // Sign the PSBT with the staker key
155
- const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(toSignPsbt.toBuffer());
156
- wrappedPsbt.updateInputWithDescriptor(0, descriptorBuilder.getStakingDescriptor());
157
- (0, descriptor_1.signWithKey)(wrappedPsbt, stakerKey);
158
- wrappedPsbt.finalize();
159
- // Encode the witness data and return
160
- return bip322_js_1.BIP322.encodeWitness(bitcoinjslib.Psbt.fromBuffer(Buffer.from(wrappedPsbt.serialize())));
161
- }
162
- return {
163
- /**
164
- * @param message
165
- * @param type
166
- * @returns Base64 encoded string
167
- */
168
- async signMessage(message, type) {
169
- switch (type) {
170
- case 'ecdsa':
171
- return toBase64(stakerKey.sign(Buffer.from(message, 'hex')));
172
- case 'bip322-simple':
173
- return toBase64(signBip322Simple(message));
174
- default:
175
- throw new Error(`unexpected type: ${type}`);
176
- }
177
- },
178
- async signPsbt(psbtHex, options) {
179
- const psbt = bitcoinjslib.Psbt.fromHex(psbtHex);
180
- switch (options.action.name) {
181
- case 'sign-btc-slashing-transaction':
182
- return signWithDescriptor(psbt, descriptorBuilder.getStakingDescriptor(), stakerKey).toHex();
183
- case 'sign-btc-unbonding-slashing-transaction':
184
- return signWithDescriptor(psbt, descriptorBuilder.getUnbondingDescriptor(), stakerKey).toHex();
185
- default:
186
- throw new Error(`unexpected signing step: ${options.action.name}`);
187
- }
188
- },
189
- /**
190
- * This function is only used by btc-staking-ts to create a staking expansion registration
191
- * transaction, which we do not currently support.
192
- */
193
- async getTransactionHex(txid) {
194
- throw new Error(`Unsupported operation getTransactionHex (txid=${txid})`);
195
- },
196
- };
197
- }
198
- /**
199
- * @param stakingKey - this is the single-sig key that is used for co-signing the staking output
200
- * @param changeAddress - this is unrelated to the staking key and is used for the change output
201
- */
202
- function toStakerInfo(stakingKey, changeAddress) {
203
- if (typeof stakingKey === 'object' && 'publicKey' in stakingKey) {
204
- stakingKey = stakingKey.publicKey;
205
- }
206
- if (typeof stakingKey === 'string') {
207
- stakingKey = Buffer.from(stakingKey, 'hex');
208
- }
209
- return {
210
- publicKeyNoCoordHex: (0, utxo_core_1.toXOnlyPublicKey)(stakingKey).toString('hex'),
211
- address: changeAddress,
212
- };
213
- }
214
- function createStaking(network, blockHeight, stakerBtcInfo, stakingInput, versionedParams = (0, stakingParams_1.getStakingParams)(network)) {
215
- if (blockHeight === 0) {
216
- throw new Error('Babylon BTC tip height cannot be 0');
217
- }
218
- // Get the Babylon params based on the BTC tip height from Babylon chain
219
- const params = vendor.getBabylonParamByBtcHeight(blockHeight, versionedParams);
220
- return new vendor.Staking((0, network_1.toBitcoinJsNetwork)(network), stakerBtcInfo, params, stakingInput.finalityProviderPksNoCoordHex, stakingInput.stakingTimelock);
221
- }
222
- function toStakingTransactionFromPsbt(psbt) {
223
- if (!(psbt instanceof utxolib.bitgo.UtxoPsbt)) {
224
- psbt = utxolib.bitgo.createPsbtFromBuffer(psbt.toBuffer(), utxolib.networks.bitcoin);
225
- }
226
- if (psbt instanceof utxolib.bitgo.UtxoPsbt) {
227
- // only utxolib.bitgo.UtxoPsbt has the getUnsignedTx method
228
- return bitcoinjslib.Transaction.fromHex(psbt.getUnsignedTx().toHex());
229
- }
230
- throw new Error('illegal state');
231
- }
232
- function toStakingTransaction(tx) {
233
- if (tx instanceof bitcoinjslib.Psbt || tx instanceof utxolib.Psbt) {
234
- return toStakingTransactionFromPsbt(tx);
235
- }
236
- return bitcoinjslib.Transaction.fromHex(tx.toHex());
237
- }
238
- /**
239
- * As of babylonlabs-io/btc-staking-ts v1.5.7, the BTC delegation message creation functions support two message types:
240
- * - MsgCreateBTCDelegation
241
- * - MsgBtcStakeExpand
242
- *
243
- * BitGo still only supports MsgCreateBTCDelegation, so we need to check the message type here.
244
- *
245
- * @param msg - the message to check
246
- * @return `true` if the message is of type MsgCreateBTCDelegation
247
- */
248
- function isMsgBtcStakeExpand(msg) {
249
- return 'previousStakingTxHash' in msg;
250
- }
251
- /*
252
- * This is mostly lifted from
253
- * https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/staking/manager.ts#L100-L172
254
- *
255
- * The difference is that here we are returning an _unsigned_ delegation message.
256
- */
257
- async function createDelegationMessageWithTransaction(channel, manager, staking, stakingAmountSat, transaction, babylonAddress) {
258
- if (!vendor.isValidBabylonAddress(babylonAddress)) {
259
- throw new Error('Invalid Babylon address');
260
- }
261
- // Create delegation message without including inclusion proof
262
- const msg = await manager.createBtcDelegationMsg(channel, staking, {
263
- stakingTimelock: staking.stakingTimelock,
264
- finalityProviderPksNoCoordHex: staking.finalityProviderPksNoCoordHex,
265
- stakingAmountSat,
266
- }, toStakingTransaction(transaction), babylonAddress, staking.stakerInfo, staking.params);
267
- // It shouldn't be possible for us to create a MsgBtcStakeExpand here because that only gets created when
268
- // we pass channel = delegation:expand into createBtcDelegationMsg, which we cannot do.
269
- if (isMsgBtcStakeExpand(msg.value)) {
270
- throw new Error('MsgBtcStakeExpand is not supported');
271
- }
272
- return { ...msg, value: msg.value };
273
- }
274
- async function createUnsignedPreStakeRegistrationBabylonTransactionWithBtcProvider(btcProvider, network, stakerBtcInfo, stakingInput, babylonBtcTipHeight, inputUTXOs, feeRateSatB, babylonAddress, channel, stakingParams = (0, stakingParams_1.getStakingParams)(network)) {
275
- if (inputUTXOs.length === 0) {
276
- throw new Error('No input UTXOs provided');
277
- }
278
- const manager = (0, stakingManager_1.createStakingManager)(network, btcProvider, stakingParams);
279
- const staking = createStaking(network, babylonBtcTipHeight, stakerBtcInfo, stakingInput, stakingParams);
280
- // Create unsigned staking transaction
281
- const { transaction } = staking.createStakingTransaction(stakingInput.stakingAmountSat, inputUTXOs, feeRateSatB);
282
- const unsignedDelegationMsg = await createDelegationMessageWithTransaction(channel, manager, staking, stakingInput.stakingAmountSat, transaction, babylonAddress);
283
- return { unsignedDelegationMsg, stakingTx: transaction };
284
- }
285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGlvbk1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFieWxvbi9kZWxlZ2F0aW9uTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFEQSxzQ0F3QkM7QUFRRCw4Q0FjQztBQUVELHdEQW9GQztBQVVELG9DQWNDO0FBRUQsc0NBcUJDO0FBdUJELG9EQUtDO0FBd0JELHdGQWlDQztBQUVELGtKQTRCQztBQTNWRDs7R0FFRztBQUNILG9EQUE0QjtBQUU1Qix5Q0FBbUM7QUFDbkMsa0ZBQW9FO0FBRXBFLDREQUE4QztBQUM5Qyw4REFBZ0Q7QUFFaEQscURBQXlEO0FBQ3pELGlFQUE4RTtBQUc5RSxxREFBd0Q7QUFDeEQsbURBQW1EO0FBQ25ELHVDQUFtRTtBQUluRTs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsQ0FBUyxFQUFFLFFBQTBCO0lBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxRQUFRLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBa0I7SUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBVSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDO2dCQUNILE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUs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LEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQW9CLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDeEcsc0NBQXNDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sc0NBQXNDLENBQ3hFLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsV0FBVyxFQUNYLGNBQWMsQ0FDZixDQUFDO0lBQ0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL3YxLjk5LjAtc25hcHNob3QuMjUwMjExL3gvYnRjc3Rha2luZy90eXBlcy92YWxpZGF0ZV9wYXJzZWRfbWVzc2FnZS5nb1xuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEJJUDMyMiB9IGZyb20gJ2JpcDMyMi1qcyc7XG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0ICogYXMgYmFieWxvblByb3RvYnVmIGZyb20gJ0BiYWJ5bG9ubGFicy1pby9iYWJ5bG9uLXByb3RvLXRzJztcbmltcG9ydCAqIGFzIGJpdGNvaW5qc2xpYiBmcm9tICdiaXRjb2luanMtbGliJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgRGVzY3JpcHRvciB9IGZyb20gJ0BiaXRnby93YXNtLXV0eG8nO1xuaW1wb3J0IHsgdG9YT25seVB1YmxpY0tleSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBzaWduV2l0aEtleSwgdG9XcmFwcGVkUHNidCB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuaW1wb3J0IHsgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIH0gZnJvbSAnLi9kZXNjcmlwdG9yJztcbmltcG9ydCB7IGNyZWF0ZVN0YWtpbmdNYW5hZ2VyIH0gZnJvbSAnLi9zdGFraW5nTWFuYWdlcic7XG5pbXBvcnQgeyBnZXRTdGFraW5nUGFyYW1zIH0gZnJvbSAnLi9zdGFraW5nUGFyYW1zJztcbmltcG9ydCB7IEJhYnlsb25OZXR3b3JrTGlrZSwgdG9CaXRjb2luSnNOZXR3b3JrIH0gZnJvbSAnLi9uZXR3b3JrJztcblxuZXhwb3J0IHR5cGUgVmFsdWVXaXRoVHlwZVVybDxUPiA9IHsgdHlwZVVybDogc3RyaW5nOyB2YWx1ZTogVCB9O1xuXG4vKipcbiAqIERlY29kZSBhIGhleCBvciBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgYW5kIGNoZWNrIGlmIHRoZSBsZW5ndGggaXMgdmFsaWQuXG4gKiBAcGFyYW0gdlxuICogQHBhcmFtIGVuY29kaW5nXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUNoZWNrKHY6IHN0cmluZywgZW5jb2Rpbmc6ICdoZXgnIHwgJ2Jhc2U2NCcpIHtcbiAgY29uc3QgcmVzdWx0ID0gQnVmZmVyLmZyb20odiwgZW5jb2RpbmcpO1xuICBpZiAocmVzdWx0LnRvU3RyaW5nKGVuY29kaW5nKS5sZW5ndGggIT09IHYubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkICR7ZW5jb2Rpbmd9IGVuY29kaW5nYCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgQnVmZmVyIG9yIHN0cmluZyB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAqIEBwYXJhbSB2XG4gKi9cbmZ1bmN0aW9uIHRvQmFzZTY0KHY6IEJ1ZmZlciB8IHN0cmluZykge1xuICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgZm9yIChjb25zdCBlbmNvZGluZyBvZiBbJ2Jhc2U2NCcsICdoZXgnXSBhcyBjb25zdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRvQmFzZTY0KGRlY29kZUNoZWNrKHYsIGVuY29kaW5nKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIHRyeSBuZXh0XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXNlNjQgb3IgaGV4IGVuY29kaW5nOiAke3Z9YCk7XG4gIH1cblxuICByZXR1cm4gdi50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTaWduZWRQc2J0KFxuICBwc2J0OiBiaXRjb2luanNsaWIuUHNidCxcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvcixcbiAgc2lnbmVyczogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2VbXSxcbiAgeyBmaW5hbGl6ZSA9IGZhbHNlIH1cbik6IGJpdGNvaW5qc2xpYi5Qc2J0IHtcbiAgY29uc3Qgd3JhcHBlZFBzYnQgPSB0b1dyYXBwZWRQc2J0KHBzYnQudG9CdWZmZXIoKSk7XG4gIGNvbnN0IHNpZ25lZElucHV0cyA9IHBzYnQuZGF0YS5pbnB1dHMuZmxhdE1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBhc3NlcnQoaW5wdXQud2l0bmVzc1V0eG8pO1xuICAgIGlmIChCdWZmZXIuZnJvbShkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKS5lcXVhbHMoaW5wdXQud2l0bmVzc1V0eG8uc2NyaXB0KSkge1xuICAgICAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcihpLCBkZXNjcmlwdG9yKTtcbiAgICAgIGNvbnN0IHNpZ25SZXN1bHRzID0gc2lnbmVycy5tYXAoKHNpZ25lcikgPT4ge1xuICAgICAgICBhc3NlcnQoc2lnbmVyLnByaXZhdGVLZXkpO1xuICAgICAgICByZXR1cm4gd3JhcHBlZFBzYnQuc2lnbldpdGhQcnYoc2lnbmVyLnByaXZhdGVLZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gW1tpLCBzaWduUmVzdWx0c11dO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuICBhc3NlcnQoc2lnbmVkSW5wdXRzLmxlbmd0aCA+IDApO1xuICBpZiAoZmluYWxpemUpIHtcbiAgICB3cmFwcGVkUHNidC5maW5hbGl6ZSgpO1xuICB9XG4gIHJldHVybiBiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBtZXRob2QgdG8gd29yayBhcm91bmQgYSBidWcgaW4gYnRjLXN0YWtpbmctdHNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9idGMtc3Rha2luZy10cy9pc3N1ZXMvNzFcbiAqIEBwYXJhbSB2XG4gKiBAcGFyYW0gbmV0d29ya1xuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yY2VGaW5hbGl6ZVBzYnQoXG4gIHY6IEJ1ZmZlciB8IHV0eG9saWIuUHNidCB8IGJpdGNvaW5qc2xpYi5Qc2J0LFxuICBuZXR3b3JrOiBCYWJ5bG9uTmV0d29ya0xpa2Vcbik6IGJpdGNvaW5qc2xpYi5Qc2J0IHtcbiAgaWYgKHYgaW5zdGFuY2VvZiB1dHhvbGliLlBzYnQpIHtcbiAgICB2ID0gdi50b0J1ZmZlcigpO1xuICB9XG4gIGlmICh2IGluc3RhbmNlb2YgYml0Y29pbmpzbGliLlBzYnQpIHtcbiAgICB2ID0gdi50b0J1ZmZlcigpO1xuICB9XG4gIGNvbnN0IHBzYnQgPSBiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKHYsIHsgbmV0d29yazogdG9CaXRjb2luSnNOZXR3b3JrKG5ldHdvcmspIH0pO1xuICAvLyB0aGlzIG9ubHkgd29ya3Mgd2l0aCBjZXJ0YWluIGJpdGNvaW5qc2xpYiB2ZXJzaW9uc1xuICBwc2J0LmZpbmFsaXplQWxsSW5wdXRzKCk7XG4gIHJldHVybiBwc2J0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnRjUHJvdmlkZXJGb3JFQ0tleShcbiAgZGVzY3JpcHRvckJ1aWxkZXI6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcixcbiAgc3Rha2VyS2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZVxuKTogdmVuZG9yLkJ0Y1Byb3ZpZGVyIHtcbiAgZnVuY3Rpb24gc2lnbldpdGhEZXNjcmlwdG9yKFxuICAgIHBzYnQ6IGJpdGNvaW5qc2xpYi5Qc2J0LFxuICAgIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gICAga2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZVxuICApOiBiaXRjb2luanNsaWIuUHNidCB7XG4gICAgcHNidCA9IGdldFNpZ25lZFBzYnQocHNidCwgZGVzY3JpcHRvciwgW2tleV0sIHsgZmluYWxpemU6IGZhbHNlIH0pO1xuICAgIC8vIEJVRzogd2UgbmVlZCB0byBibGluZGx5IGZpbmFsaXplIGhlcmUgZXZlbiB0aG91Z2ggd2UgaGF2ZSBub3QgZnVsbHkgc2lnbmVkXG4gICAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICAgIHJldHVybiBwc2J0O1xuICB9XG5cbiAgZnVuY3Rpb24gc2lnbkJpcDMyMlNpbXBsZShtZXNzYWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIEdldCB0aGUgc2NyaXB0IHB1YmxpYyBrZXkgZnJvbSB0aGUgc3Rha2luZyBkZXNjcmlwdG9yXG4gICAgY29uc3Qgc2NyaXB0UHViS2V5ID0gQnVmZmVyLmZyb20oZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKS5zY3JpcHRQdWJrZXkoKSk7XG4gICAgY29uc3QgdG9TcGVuZFR4ID0gQklQMzIyLmJ1aWxkVG9TcGVuZFR4KG1lc3NhZ2UsIHNjcmlwdFB1YktleSk7XG5cbiAgICAvLyBHZXQgdGhlIHRvX3NwZW5kIHR4aWRcbiAgICBjb25zdCB0b1NwZW5kVHhJZCA9IHRvU3BlbmRUeC5nZXRJZCgpO1xuXG4gICAgLy8gQ3JlYXRlIFBTQlQgb2JqZWN0IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgY29uc3QgdG9TaWduUHNidCA9IG5ldyBiaXRjb2luanNsaWIuUHNidCgpO1xuICAgIHRvU2lnblBzYnQuc2V0VmVyc2lvbigyKTsgLy8gblZlcnNpb24gPSAwXG4gICAgdG9TaWduUHNidC5zZXRMb2NrdGltZSgwKTsgLy8gbkxvY2tUaW1lID0gMFxuICAgIHRvU2lnblBzYnQuYWRkSW5wdXQoe1xuICAgICAgaGFzaDogdG9TcGVuZFR4SWQsXG4gICAgICBpbmRleDogMCxcbiAgICAgIHNlcXVlbmNlOiBkZXNjcmlwdG9yQnVpbGRlci5zdGFraW5nVGltZUxvY2ssXG4gICAgICB3aXRuZXNzVXR4bzoge1xuICAgICAgICBzY3JpcHQ6IHNjcmlwdFB1YktleSxcbiAgICAgICAgdmFsdWU6IDAsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2lnbiB0aGUgUFNCVCB3aXRoIHRoZSBzdGFrZXIga2V5XG4gICAgY29uc3Qgd3JhcHBlZFBzYnQgPSB0b1dyYXBwZWRQc2J0KHRvU2lnblBzYnQudG9CdWZmZXIoKSk7XG4gICAgd3JhcHBlZFBzYnQudXBkYXRlSW5wdXRXaXRoRGVzY3JpcHRvcigwLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpKTtcbiAgICBzaWduV2l0aEtleSh3cmFwcGVkUHNidCwgc3Rha2VyS2V5KTtcbiAgICB3cmFwcGVkUHNidC5maW5hbGl6ZSgpO1xuXG4gICAgLy8gRW5jb2RlIHRoZSB3aXRuZXNzIGRhdGEgYW5kIHJldHVyblxuICAgIHJldHVybiBCSVAzMjIuZW5jb2RlV2l0bmVzcyhiaXRjb2luanNsaWIuUHNidC5mcm9tQnVmZmVyKEJ1ZmZlci5mcm9tKHdyYXBwZWRQc2J0LnNlcmlhbGl6ZSgpKSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICogQHJldHVybnMgQmFzZTY0IGVuY29kZWQgc3RyaW5nXG4gICAgICovXG4gICAgYXN5bmMgc2lnbk1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB0eXBlOiAnZWNkc2EnIHwgJ2JpcDMyMi1zaW1wbGUnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlICdlY2RzYSc6XG4gICAgICAgICAgcmV0dXJuIHRvQmFzZTY0KHN0YWtlcktleS5zaWduKEJ1ZmZlci5mcm9tKG1lc3NhZ2UsICdoZXgnKSkpO1xuICAgICAgICBjYXNlICdiaXAzMjItc2ltcGxlJzpcbiAgICAgICAgICByZXR1cm4gdG9CYXNlNjQoc2lnbkJpcDMyMlNpbXBsZShtZXNzYWdlKSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHR5cGU6ICR7dHlwZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgc2lnblBzYnQocHNidEhleDogc3RyaW5nLCBvcHRpb25zOiB2ZW5kb3IuU2lnblBzYnRPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IHBzYnQgPSBiaXRjb2luanNsaWIuUHNidC5mcm9tSGV4KHBzYnRIZXgpO1xuICAgICAgc3dpdGNoIChvcHRpb25zLmFjdGlvbi5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ3NpZ24tYnRjLXNsYXNoaW5nLXRyYW5zYWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gc2lnbldpdGhEZXNjcmlwdG9yKHBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCksIHN0YWtlcktleSkudG9IZXgoKTtcbiAgICAgICAgY2FzZSAnc2lnbi1idGMtdW5ib25kaW5nLXNsYXNoaW5nLXRyYW5zYWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gc2lnbldpdGhEZXNjcmlwdG9yKHBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ0Rlc2NyaXB0b3IoKSwgc3Rha2VyS2V5KS50b0hleCgpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBzaWduaW5nIHN0ZXA6ICR7b3B0aW9ucy5hY3Rpb24ubmFtZX1gKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgYnkgYnRjLXN0YWtpbmctdHMgdG8gY3JlYXRlIGEgc3Rha2luZyBleHBhbnNpb24gcmVnaXN0cmF0aW9uXG4gICAgICogdHJhbnNhY3Rpb24sIHdoaWNoIHdlIGRvIG5vdCBjdXJyZW50bHkgc3VwcG9ydC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRUcmFuc2FjdGlvbkhleCh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBvcGVyYXRpb24gZ2V0VHJhbnNhY3Rpb25IZXggKHR4aWQ9JHt0eGlkfSlgKTtcbiAgICB9LFxuICB9O1xufVxudHlwZSBSZXN1bHQgPSB7XG4gIHVuc2lnbmVkRGVsZWdhdGlvbk1zZzogVmFsdWVXaXRoVHlwZVVybDxiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24+O1xuICBzdGFraW5nVHg6IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbjtcbn07XG5cbi8qKlxuICogQHBhcmFtIHN0YWtpbmdLZXkgLSB0aGlzIGlzIHRoZSBzaW5nbGUtc2lnIGtleSB0aGF0IGlzIHVzZWQgZm9yIGNvLXNpZ25pbmcgdGhlIHN0YWtpbmcgb3V0cHV0XG4gKiBAcGFyYW0gY2hhbmdlQWRkcmVzcyAtIHRoaXMgaXMgdW5yZWxhdGVkIHRvIHRoZSBzdGFraW5nIGtleSBhbmQgaXMgdXNlZCBmb3IgdGhlIGNoYW5nZSBvdXRwdXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3Rha2VySW5mbyhcbiAgc3Rha2luZ0tleTogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2UgfCBCdWZmZXIgfCBzdHJpbmcsXG4gIGNoYW5nZUFkZHJlc3M6IHN0cmluZ1xuKTogdmVuZG9yLlN0YWtlckluZm8ge1xuICBpZiAodHlwZW9mIHN0YWtpbmdLZXkgPT09ICdvYmplY3QnICYmICdwdWJsaWNLZXknIGluIHN0YWtpbmdLZXkpIHtcbiAgICBzdGFraW5nS2V5ID0gc3Rha2luZ0tleS5wdWJsaWNLZXk7XG4gIH1cbiAgaWYgKHR5cGVvZiBzdGFraW5nS2V5ID09PSAnc3RyaW5nJykge1xuICAgIHN0YWtpbmdLZXkgPSBCdWZmZXIuZnJvbShzdGFraW5nS2V5LCAnaGV4Jyk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwdWJsaWNLZXlOb0Nvb3JkSGV4OiB0b1hPbmx5UHVibGljS2V5KHN0YWtpbmdLZXkpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICBhZGRyZXNzOiBjaGFuZ2VBZGRyZXNzLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3Rha2luZyhcbiAgbmV0d29yazogQmFieWxvbk5ldHdvcmtMaWtlLFxuICBibG9ja0hlaWdodDogbnVtYmVyLFxuICBzdGFrZXJCdGNJbmZvOiB2ZW5kb3IuU3Rha2VySW5mbyxcbiAgc3Rha2luZ0lucHV0OiB2ZW5kb3IuU3Rha2luZ0lucHV0cyxcbiAgdmVyc2lvbmVkUGFyYW1zOiB2ZW5kb3IuVmVyc2lvbmVkU3Rha2luZ1BhcmFtc1tdID0gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrKVxuKTogdmVuZG9yLlN0YWtpbmcge1xuICBpZiAoYmxvY2tIZWlnaHQgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhYnlsb24gQlRDIHRpcCBoZWlnaHQgY2Fubm90IGJlIDAnKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgQmFieWxvbiBwYXJhbXMgYmFzZWQgb24gdGhlIEJUQyB0aXAgaGVpZ2h0IGZyb20gQmFieWxvbiBjaGFpblxuICBjb25zdCBwYXJhbXMgPSB2ZW5kb3IuZ2V0QmFieWxvblBhcmFtQnlCdGNIZWlnaHQoYmxvY2tIZWlnaHQsIHZlcnNpb25lZFBhcmFtcyk7XG5cbiAgcmV0dXJuIG5ldyB2ZW5kb3IuU3Rha2luZyhcbiAgICB0b0JpdGNvaW5Kc05ldHdvcmsobmV0d29yayksXG4gICAgc3Rha2VyQnRjSW5mbyxcbiAgICBwYXJhbXMsXG4gICAgc3Rha2luZ0lucHV0LmZpbmFsaXR5UHJvdmlkZXJQa3NOb0Nvb3JkSGV4LFxuICAgIHN0YWtpbmdJbnB1dC5zdGFraW5nVGltZWxvY2tcbiAgKTtcbn1cblxudHlwZSBUcmFuc2FjdGlvbkxpa2UgPVxuICB8IGJpdGNvaW5qc2xpYi5Qc2J0XG4gIHwgYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uXG4gIHwgdXR4b2xpYi5UcmFuc2FjdGlvblxuICB8IHV0eG9saWIuYml0Z28uVXR4b1RyYW5zYWN0aW9uPGJpZ2ludCB8IG51bWJlcj5cbiAgfCB1dHhvbGliLlBzYnRcbiAgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuXG5mdW5jdGlvbiB0b1N0YWtpbmdUcmFuc2FjdGlvbkZyb21Qc2J0KFxuICBwc2J0OiBiaXRjb2luanNsaWIuUHNidCB8IHV0eG9saWIuUHNidCB8IHV0eG9saWIuYml0Z28uVXR4b1BzYnRcbik6IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbiB7XG4gIGlmICghKHBzYnQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSkge1xuICAgIHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGcm9tQnVmZmVyKHBzYnQudG9CdWZmZXIoKSwgdXR4b2xpYi5uZXR3b3Jrcy5iaXRjb2luKTtcbiAgfVxuICBpZiAocHNidCBpbnN0YW5jZW9mIHV0eG9saWIuYml0Z28uVXR4b1BzYnQpIHtcbiAgICAvLyBvbmx5IHV0eG9saWIuYml0Z28uVXR4b1BzYnQgaGFzIHRoZSBnZXRVbnNpZ25lZFR4IG1ldGhvZFxuICAgIHJldHVybiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24uZnJvbUhleChwc2J0LmdldFVuc2lnbmVkVHgoKS50b0hleCgpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2lsbGVnYWwgc3RhdGUnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU3Rha2luZ1RyYW5zYWN0aW9uKHR4OiBUcmFuc2FjdGlvbkxpa2UpOiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24ge1xuICBpZiAodHggaW5zdGFuY2VvZiBiaXRjb2luanNsaWIuUHNidCB8fCB0eCBpbnN0YW5jZW9mIHV0eG9saWIuUHNidCkge1xuICAgIHJldHVybiB0b1N0YWtpbmdUcmFuc2FjdGlvbkZyb21Qc2J0KHR4KTtcbiAgfVxuICByZXR1cm4gYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uLmZyb21IZXgodHgudG9IZXgoKSk7XG59XG5cbi8qKlxuICogQXMgb2YgYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMgdjEuNS43LCB0aGUgQlRDIGRlbGVnYXRpb24gbWVzc2FnZSBjcmVhdGlvbiBmdW5jdGlvbnMgc3VwcG9ydCB0d28gbWVzc2FnZSB0eXBlczpcbiAqIC0gTXNnQ3JlYXRlQlRDRGVsZWdhdGlvblxuICogLSBNc2dCdGNTdGFrZUV4cGFuZFxuICpcbiAqIEJpdEdvIHN0aWxsIG9ubHkgc3VwcG9ydHMgTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbiwgc28gd2UgbmVlZCB0byBjaGVjayB0aGUgbWVzc2FnZSB0eXBlIGhlcmUuXG4gKlxuICogQHBhcmFtIG1zZyAtIHRoZSBtZXNzYWdlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgbWVzc2FnZSBpcyBvZiB0eXBlIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb25cbiAqL1xuZnVuY3Rpb24gaXNNc2dCdGNTdGFrZUV4cGFuZChcbiAgbXNnOiBiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24gfCBiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0J0Y1N0YWtlRXhwYW5kXG4pIHtcbiAgcmV0dXJuICdwcmV2aW91c1N0YWtpbmdUeEhhc2gnIGluIG1zZztcbn1cblxuLypcbiAqIFRoaXMgaXMgbW9zdGx5IGxpZnRlZCBmcm9tXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMvYmxvYi92MC40LjAtcmMuMi9zcmMvc3Rha2luZy9tYW5hZ2VyLnRzI0wxMDAtTDE3MlxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaGVyZSB3ZSBhcmUgcmV0dXJuaW5nIGFuIF91bnNpZ25lZF8gZGVsZWdhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlRGVsZWdhdGlvbk1lc3NhZ2VXaXRoVHJhbnNhY3Rpb24oXG4gIGNoYW5uZWw6ICdkZWxlZ2F0aW9uOmNyZWF0ZScgfCAnZGVsZWdhdGlvbjpyZWdpc3RlcicsXG4gIG1hbmFnZXI6IHZlbmRvci5CYWJ5bG9uQnRjU3Rha2luZ01hbmFnZXIsXG4gIHN0YWtpbmc6IHZlbmRvci5TdGFraW5nLFxuICBzdGFraW5nQW1vdW50U2F0OiBudW1iZXIsXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkxpa2UsXG4gIGJhYnlsb25BZGRyZXNzOiBzdHJpbmdcbik6IFByb21pc2U8VmFsdWVXaXRoVHlwZVVybDxiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24+PiB7XG4gIGlmICghdmVuZG9yLmlzVmFsaWRCYWJ5bG9uQWRkcmVzcyhiYWJ5bG9uQWRkcmVzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQmFieWxvbiBhZGRyZXNzJyk7XG4gIH1cbiAgLy8gQ3JlYXRlIGRlbGVnYXRpb24gbWVzc2FnZSB3aXRob3V0IGluY2x1ZGluZyBpbmNsdXNpb24gcHJvb2ZcbiAgY29uc3QgbXNnID0gYXdhaXQgbWFuYWdlci5jcmVhdGVCdGNEZWxlZ2F0aW9uTXNnKFxuICAgIGNoYW5uZWwsXG4gICAgc3Rha2luZyxcbiAgICB7XG4gICAgICBzdGFraW5nVGltZWxvY2s6IHN0YWtpbmcuc3Rha2luZ1RpbWVsb2NrLFxuICAgICAgZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXg6IHN0YWtpbmcuZmluYWxpdHlQcm92aWRlclBrc05vQ29vcmRIZXgsXG4gICAgICBzdGFraW5nQW1vdW50U2F0LFxuICAgIH0sXG4gICAgdG9TdGFraW5nVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pLFxuICAgIGJhYnlsb25BZGRyZXNzLFxuICAgIHN0YWtpbmcuc3Rha2VySW5mbyxcbiAgICBzdGFraW5nLnBhcmFtc1xuICApO1xuXG4gIC8vIEl0IHNob3VsZG4ndCBiZSBwb3NzaWJsZSBmb3IgdXMgdG8gY3JlYXRlIGEgTXNnQnRjU3Rha2VFeHBhbmQgaGVyZSBiZWNhdXNlIHRoYXQgb25seSBnZXRzIGNyZWF0ZWQgd2hlblxuICAvLyB3ZSBwYXNzIGNoYW5uZWwgPSBkZWxlZ2F0aW9uOmV4cGFuZCBpbnRvIGNyZWF0ZUJ0Y0RlbGVnYXRpb25Nc2csIHdoaWNoIHdlIGNhbm5vdCBkby5cbiAgaWYgKGlzTXNnQnRjU3Rha2VFeHBhbmQobXNnLnZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTXNnQnRjU3Rha2VFeHBhbmQgaXMgbm90IHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHsgLi4ubXNnLCB2YWx1ZTogbXNnLnZhbHVlIGFzIGJhYnlsb25Qcm90b2J1Zi5idGNzdGFraW5ndHguTXNnQ3JlYXRlQlRDRGVsZWdhdGlvbiB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRQcmVTdGFrZVJlZ2lzdHJhdGlvbkJhYnlsb25UcmFuc2FjdGlvbldpdGhCdGNQcm92aWRlcihcbiAgYnRjUHJvdmlkZXI6IHZlbmRvci5CdGNQcm92aWRlcixcbiAgbmV0d29yazogYml0Y29pbmpzbGliLk5ldHdvcmssXG4gIHN0YWtlckJ0Y0luZm86IHZlbmRvci5TdGFrZXJJbmZvLFxuICBzdGFraW5nSW5wdXQ6IHZlbmRvci5TdGFraW5nSW5wdXRzLFxuICBiYWJ5bG9uQnRjVGlwSGVpZ2h0OiBudW1iZXIsXG4gIGlucHV0VVRYT3M6IHZlbmRvci5VVFhPW10sXG4gIGZlZVJhdGVTYXRCOiBudW1iZXIsXG4gIGJhYnlsb25BZGRyZXNzOiBzdHJpbmcsXG4gIGNoYW5uZWw6ICdkZWxlZ2F0aW9uOmNyZWF0ZScgfCAnZGVsZWdhdGlvbjpyZWdpc3RlcicsXG4gIHN0YWtpbmdQYXJhbXM6IHZlbmRvci5WZXJzaW9uZWRTdGFraW5nUGFyYW1zW10gPSBnZXRTdGFraW5nUGFyYW1zKG5ldHdvcmspXG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICBpZiAoaW5wdXRVVFhPcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGlucHV0IFVUWE9zIHByb3ZpZGVkJyk7XG4gIH1cbiAgY29uc3QgbWFuYWdlciA9IGNyZWF0ZVN0YWtpbmdNYW5hZ2VyKG5ldHdvcmssIGJ0Y1Byb3ZpZGVyLCBzdGFraW5nUGFyYW1zKTtcbiAgY29uc3Qgc3Rha2luZyA9IGNyZWF0ZVN0YWtpbmcobmV0d29yaywgYmFieWxvbkJ0Y1RpcEhlaWdodCwgc3Rha2VyQnRjSW5mbywgc3Rha2luZ0lucHV0LCBzdGFraW5nUGFyYW1zKTtcbiAgLy8gQ3JlYXRlIHVuc2lnbmVkIHN0YWtpbmcgdHJhbnNhY3Rpb25cbiAgY29uc3QgeyB0cmFuc2FjdGlvbiB9ID0gc3Rha2luZy5jcmVhdGVTdGFraW5nVHJhbnNhY3Rpb24oc3Rha2luZ0lucHV0LnN0YWtpbmdBbW91bnRTYXQsIGlucHV0VVRYT3MsIGZlZVJhdGVTYXRCKTtcbiAgY29uc3QgdW5zaWduZWREZWxlZ2F0aW9uTXNnID0gYXdhaXQgY3JlYXRlRGVsZWdhdGlvbk1lc3NhZ2VXaXRoVHJhbnNhY3Rpb24oXG4gICAgY2hhbm5lbCxcbiAgICBtYW5hZ2VyLFxuICAgIHN0YWtpbmcsXG4gICAgc3Rha2luZ0lucHV0LnN0YWtpbmdBbW91bnRTYXQsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgYmFieWxvbkFkZHJlc3NcbiAgKTtcbiAgcmV0dXJuIHsgdW5zaWduZWREZWxlZ2F0aW9uTXNnLCBzdGFraW5nVHg6IHRyYW5zYWN0aW9uIH07XG59XG4iXX0=
@@ -1,97 +0,0 @@
1
- "use strict";
2
- /**
3
- * https://github.com/babylonlabs-io/babylon/tree/main/docs
4
- * https://github.com/babylonlabs-io/babylon/blob/main/docs/staking-script.md
5
- * https://github.com/babylonlabs-io/babylon/blob/v1.99.0-snapshot.250211/btcstaking/staking.go
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.BabylonDescriptorBuilder = void 0;
9
- exports.getUnspendableKey = getUnspendableKey;
10
- exports.sortedKeys = sortedKeys;
11
- const wasm_utxo_1 = require("@bitgo/wasm-utxo");
12
- function getUnspendableKey() {
13
- // https://github.com/babylonlabs-io/btc-staking-ts/blob/v0.4.0-rc.2/src/constants/internalPubkey.ts
14
- return '50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0';
15
- }
16
- // Helper functions for creating miniscript nodes
17
- function pk(b) {
18
- return { 'v:pk': b.toString('hex') };
19
- }
20
- function sortedKeys(keys) {
21
- return [...keys].sort((a, b) => a.compare(b));
22
- }
23
- function multiArgs(threshold, keys) {
24
- return [threshold, ...sortedKeys(keys).map((k) => k.toString('hex'))];
25
- }
26
- function taprootScriptOnlyFromAst(n) {
27
- return wasm_utxo_1.Descriptor.fromString(wasm_utxo_1.ast.formatNode({ tr: [getUnspendableKey(), n] }), 'definite');
28
- }
29
- class BabylonDescriptorBuilder {
30
- constructor(stakerKey, finalityProviderKeys, covenantKeys, covenantThreshold, stakingTimeLock, unbondingTimeLock) {
31
- this.stakerKey = stakerKey;
32
- this.finalityProviderKeys = finalityProviderKeys;
33
- this.covenantKeys = covenantKeys;
34
- this.covenantThreshold = covenantThreshold;
35
- this.stakingTimeLock = stakingTimeLock;
36
- this.unbondingTimeLock = unbondingTimeLock;
37
- }
38
- static fromParams(params) {
39
- return new BabylonDescriptorBuilder(params.stakerKey, params.finalityProviderKeys, params.covenantNoCoordPks.map((k) => Buffer.from(k, 'hex')), params.covenantQuorum, params.minStakingTimeBlocks, params.unbondingTime);
40
- }
41
- /** Spend path with the staker key and the staking timelock */
42
- getStakingTimelockMiniscriptNode() {
43
- return { and_v: [pk(this.stakerKey), { older: this.stakingTimeLock }] };
44
- }
45
- /** Spend path with the staker key and the unbonding timelock */
46
- getUnbondingTimelockMiniscriptNode() {
47
- return { and_v: [pk(this.stakerKey), { older: this.unbondingTimeLock }] };
48
- }
49
- /** Spend path with the staker key and the covenant keys */
50
- getUnbondingMiniscriptNode() {
51
- return { and_v: [pk(this.stakerKey), { multi_a: multiArgs(this.covenantThreshold, this.covenantKeys) }] };
52
- }
53
- /** Spend path with the finality provider keys and the covenant keys */
54
- getSlashingMiniscriptNode() {
55
- return {
56
- and_v: [
57
- {
58
- and_v: [
59
- pk(this.stakerKey),
60
- this.finalityProviderKeys.length === 1
61
- ? { 'v:pk': this.finalityProviderKeys[0].toString('hex') }
62
- : { 'v:multi_a': multiArgs(1, this.finalityProviderKeys) },
63
- ],
64
- },
65
- { multi_a: multiArgs(this.covenantThreshold, this.covenantKeys) },
66
- ],
67
- };
68
- }
69
- /**
70
- * Creates a descriptor for a staking output.
71
- *
72
- * Three spend paths:
73
- * - the slashing script,
74
- * - the unbonding script,
75
- * - the timelocked unstaking script.
76
- */
77
- getStakingDescriptor() {
78
- return taprootScriptOnlyFromAst([
79
- this.getSlashingMiniscriptNode(),
80
- [this.getUnbondingMiniscriptNode(), this.getStakingTimelockMiniscriptNode()],
81
- ]);
82
- }
83
- /**
84
- * Creates a descriptor for the timelocked unbonding script.
85
- */
86
- getUnbondingTimelockDescriptor() {
87
- return taprootScriptOnlyFromAst(this.getUnbondingTimelockMiniscriptNode());
88
- }
89
- /**
90
- * Creates a descriptor with two script paths: the slashing script and the timelocked unbonding script.
91
- */
92
- getUnbondingDescriptor() {
93
- return taprootScriptOnlyFromAst([this.getSlashingMiniscriptNode(), this.getUnbondingTimelockMiniscriptNode()]);
94
- }
95
- }
96
- exports.BabylonDescriptorBuilder = BabylonDescriptorBuilder;
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWJ5bG9uL2Rlc2NyaXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUtILDhDQUdDO0FBT0QsZ0NBRUM7QUFmRCxnREFBbUQ7QUFHbkQsU0FBZ0IsaUJBQWlCO0lBQy9CLG9HQUFvRztJQUNwRyxPQUFPLGtFQUFrRSxDQUFDO0FBQzVFLENBQUM7QUFFRCxpREFBaUQ7QUFDakQsU0FBUyxFQUFFLENBQUMsQ0FBUztJQUNuQixPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLElBQWM7SUFDdkMsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxTQUFpQixFQUFFLElBQWM7SUFDbEQsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLENBQWtCO0lBQ2xELE9BQU8sc0JBQVUsQ0FBQyxVQUFVLENBQUMsZUFBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzdGLENBQUM7QUFFRCxNQUFhLHdCQUF3QjtJQUNuQyxZQUNTLFNBQWlCLEVB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QixFQUFFLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FDRjtBQXRGRCw0REFzRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9iYWJ5bG9uL3RyZWUvbWFpbi9kb2NzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL21haW4vZG9jcy9zdGFraW5nLXNjcmlwdC5tZFxuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2JhYnlsb24vYmxvYi92MS45OS4wLXNuYXBzaG90LjI1MDIxMS9idGNzdGFraW5nL3N0YWtpbmcuZ29cbiAqL1xuXG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFN0YWtpbmdQYXJhbXMgfSBmcm9tICdAYml0Z28tYmV0YS9iYWJ5bG9ubGFicy1pby1idGMtc3Rha2luZy10cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnNwZW5kYWJsZUtleSgpOiBzdHJpbmcge1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMvYmxvYi92MC40LjAtcmMuMi9zcmMvY29uc3RhbnRzL2ludGVybmFsUHVia2V5LnRzXG4gIHJldHVybiAnNTA5MjliNzRjMWEwNDk1NGI3OGI0YjYwMzVlOTdhNWUwNzhhNWEwZjI4ZWM5NmQ1NDdiZmVlOWFjZTgwM2FjMCc7XG59XG5cbi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIG1pbmlzY3JpcHQgbm9kZXNcbmZ1bmN0aW9uIHBrKGI6IEJ1ZmZlcik6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gIHJldHVybiB7ICd2OnBrJzogYi50b1N0cmluZygnaGV4JykgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRlZEtleXMoa2V5czogQnVmZmVyW10pOiBCdWZmZXJbXSB7XG4gIHJldHVybiBbLi4ua2V5c10uc29ydCgoYSwgYikgPT4gYS5jb21wYXJlKGIpKTtcbn1cblxuZnVuY3Rpb24gbXVsdGlBcmdzKHRocmVzaG9sZDogbnVtYmVyLCBrZXlzOiBCdWZmZXJbXSk6IFtudW1iZXIsIC4uLnN0cmluZ1tdXSB7XG4gIHJldHVybiBbdGhyZXNob2xkLCAuLi5zb3J0ZWRLZXlzKGtleXMpLm1hcCgoaykgPT4gay50b1N0cmluZygnaGV4JykpXTtcbn1cblxuZnVuY3Rpb24gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KG46IGFzdC5UYXBUcmVlTm9kZSk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHsgdHI6IFtnZXRVbnNwZW5kYWJsZUtleSgpLCBuXSB9KSwgJ2RlZmluaXRlJyk7XG59XG5cbmV4cG9ydCBjbGFzcyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc3Rha2VyS2V5OiBCdWZmZXIsXG4gICAgcHVibGljIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXSxcbiAgICBwdWJsaWMgY292ZW5hbnRLZXlzOiBCdWZmZXJbXSxcbiAgICBwdWJsaWMgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcixcbiAgICBwdWJsaWMgc3Rha2luZ1RpbWVMb2NrOiBudW1iZXIsXG4gICAgcHVibGljIHVuYm9uZGluZ1RpbWVMb2NrOiBudW1iZXJcbiAgKSB7fVxuXG4gIHN0YXRpYyBmcm9tUGFyYW1zKFxuICAgIHBhcmFtczoge1xuICAgICAgc3Rha2VyS2V5OiBCdWZmZXI7XG4gICAgICBmaW5hbGl0eVByb3ZpZGVyS2V5czogQnVmZmVyW107XG4gICAgfSAmIFN0YWtpbmdQYXJhbXNcbiAgKTogQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcihcbiAgICAgIHBhcmFtcy5zdGFrZXJLZXksXG4gICAgICBwYXJhbXMuZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgICBwYXJhbXMuY292ZW5hbnROb0Nvb3JkUGtzLm1hcCgoaykgPT4gQnVmZmVyLmZyb20oaywgJ2hleCcpKSxcbiAgICAgIHBhcmFtcy5jb3ZlbmFudFF1b3J1bSxcbiAgICAgIHBhcmFtcy5taW5TdGFraW5nVGltZUJsb2NrcyxcbiAgICAgIHBhcmFtcy51bmJvbmRpbmdUaW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBTcGVuZCBwYXRoIHdpdGggdGhlIHN0YWtlciBrZXkgYW5kIHRoZSBzdGFraW5nIHRpbWVsb2NrICovXG4gIGdldFN0YWtpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHsgYW5kX3Y6IFtwayh0aGlzLnN0YWtlcktleSksIHsgb2xkZXI6IHRoaXMuc3Rha2luZ1RpbWVMb2NrIH1dIH07XG4gIH1cblxuICAvKiogU3BlbmQgcGF0aCB3aXRoIHRoZSBzdGFrZXIga2V5IGFuZCB0aGUgdW5ib25kaW5nIHRpbWVsb2NrICovXG4gIGdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKTogYXN0Lk1pbmlzY3JpcHROb2RlIHtcbiAgICByZXR1cm4geyBhbmRfdjogW3BrKHRoaXMuc3Rha2VyS2V5KSwgeyBvbGRlcjogdGhpcy51bmJvbmRpbmdUaW1lTG9jayB9XSB9O1xuICB9XG5cbiAgLyoqIFNwZW5kIHBhdGggd2l0aCB0aGUgc3Rha2VyIGtleSBhbmQgdGhlIGNvdmVuYW50IGtleXMgKi9cbiAgZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKTogYXN0Lk1pbmlzY3JpcHROb2RlIHtcbiAgICByZXR1cm4geyBhbmRfdjogW3BrKHRoaXMuc3Rha2VyS2V5KSwgeyBtdWx0aV9hOiBtdWx0aUFyZ3ModGhpcy5jb3ZlbmFudFRocmVzaG9sZCwgdGhpcy5jb3ZlbmFudEtleXMpIH1dIH07XG4gIH1cblxuICAvKiogU3BlbmQgcGF0aCB3aXRoIHRoZSBmaW5hbGl0eSBwcm92aWRlciBrZXlzIGFuZCB0aGUgY292ZW5hbnQga2V5cyAqL1xuICBnZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuZF92OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhbmRfdjogW1xuICAgICAgICAgICAgcGsodGhpcy5zdGFrZXJLZXkpLFxuICAgICAgICAgICAgdGhpcy5maW5hbGl0eVByb3ZpZGVyS2V5cy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyB7ICd2OnBrJzogdGhpcy5maW5hbGl0eVByb3ZpZGVyS2V5c1swXS50b1N0cmluZygnaGV4JykgfVxuICAgICAgICAgICAgICA6IHsgJ3Y6bXVsdGlfYSc6IG11bHRpQXJncygxLCB0aGlzLmZpbmFsaXR5UHJvdmlkZXJLZXlzKSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgbXVsdGlfYTogbXVsdGlBcmdzKHRoaXMuY292ZW5hbnRUaHJlc2hvbGQsIHRoaXMuY292ZW5hbnRLZXlzKSB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBkZXNjcmlwdG9yIGZvciBhIHN0YWtpbmcgb3V0cHV0LlxuICAgKlxuICAgKiBUaHJlZSBzcGVuZCBwYXRoczpcbiAgICogLSB0aGUgc2xhc2hpbmcgc2NyaXB0LFxuICAgKiAtIHRoZSB1bmJvbmRpbmcgc2NyaXB0LFxuICAgKiAtIHRoZSB0aW1lbG9ja2VkIHVuc3Rha2luZyBzY3JpcHQuXG4gICAqL1xuICBnZXRTdGFraW5nRGVzY3JpcHRvcigpOiBEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KFtcbiAgICAgIHRoaXMuZ2V0U2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSgpLFxuICAgICAgW3RoaXMuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKSwgdGhpcy5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpXSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgdGhlIHRpbWVsb2NrZWQgdW5ib25kaW5nIHNjcmlwdC5cbiAgICovXG4gIGdldFVuYm9uZGluZ1RpbWVsb2NrRGVzY3JpcHRvcigpOiBEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KHRoaXMuZ2V0VW5ib25kaW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRvciB3aXRoIHR3byBzY3JpcHQgcGF0aHM6IHRoZSBzbGFzaGluZyBzY3JpcHQgYW5kIHRoZSB0aW1lbG9ja2VkIHVuYm9uZGluZyBzY3JpcHQuXG4gICAqL1xuICBnZXRVbmJvbmRpbmdEZXNjcmlwdG9yKCk6IERlc2NyaXB0b3Ige1xuICAgIHJldHVybiB0YXByb290U2NyaXB0T25seUZyb21Bc3QoW3RoaXMuZ2V0U2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSgpLCB0aGlzLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKV0pO1xuICB9XG59XG4iXX0=
@@ -1,159 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseStakingDescriptor = parseStakingDescriptor;
4
- exports.parseUnbondingDescriptor = parseUnbondingDescriptor;
5
- const wasm_utxo_1 = require("@bitgo/wasm-utxo");
6
- const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
7
- const descriptor_2 = require("./descriptor");
8
- function parseMulti(multi) {
9
- if (!Array.isArray(multi) || multi.length < 1) {
10
- throw new Error('Invalid multi structure: not an array or empty');
11
- }
12
- const [threshold, ...keys] = multi;
13
- if (typeof threshold !== 'number') {
14
- throw new Error('Invalid multi structure: threshold is not a number');
15
- }
16
- if (!keys.every((k) => typeof k === 'string')) {
17
- throw new Error('Invalid multi structure: not all keys are strings');
18
- }
19
- return [threshold, keys];
20
- }
21
- function parseUnilateralTimelock(node, matcher) {
22
- const pattern = {
23
- and_v: [{ 'v:pk': { $var: 'key' } }, { older: { $var: 'timelock' } }],
24
- };
25
- const match = matcher.match(node, pattern);
26
- if (!match) {
27
- return null;
28
- }
29
- if (typeof match.key !== 'string') {
30
- throw new Error('key must be a string');
31
- }
32
- if (typeof match.timelock !== 'number') {
33
- throw new Error('timelock must be a number');
34
- }
35
- return { key: match.key, timelock: match.timelock };
36
- }
37
- function parseSlashingNode(slashingNode, matcher) {
38
- const slashingPattern = {
39
- and_v: [
40
- {
41
- and_v: [{ 'v:pk': { $var: 'stakerKey' } }, { $var: 'finalityProviderKeyOrMulti' }],
42
- },
43
- { multi_a: { $var: 'covenantMulti' } },
44
- ],
45
- };
46
- const slashingMatch = matcher.match(slashingNode, slashingPattern);
47
- if (!slashingMatch) {
48
- throw new Error('Slashing node does not match expected pattern');
49
- }
50
- if (typeof slashingMatch.stakerKey !== 'string') {
51
- throw new Error('stakerKey must be a string');
52
- }
53
- const [covenantThreshold, covenantKeyStrings] = parseMulti(slashingMatch.covenantMulti);
54
- const covenantKeys = covenantKeyStrings.map((k) => Buffer.from(k, 'hex'));
55
- let finalityProviderKeys;
56
- const fpKeyOrMulti = slashingMatch.finalityProviderKeyOrMulti;
57
- if ('v:pk' in fpKeyOrMulti) {
58
- finalityProviderKeys = [Buffer.from(fpKeyOrMulti['v:pk'], 'hex')];
59
- }
60
- else if ('v:multi_a' in fpKeyOrMulti) {
61
- const [threshold, keyStrings] = parseMulti(fpKeyOrMulti['v:multi_a']);
62
- if (threshold !== 1) {
63
- throw new Error('Finality provider multi threshold must be 1');
64
- }
65
- finalityProviderKeys = keyStrings.map((k) => Buffer.from(k, 'hex'));
66
- }
67
- else {
68
- throw new Error('Invalid finality provider key structure');
69
- }
70
- return {
71
- stakerKey: slashingMatch.stakerKey,
72
- finalityProviderKeys,
73
- covenantKeys,
74
- covenantThreshold,
75
- };
76
- }
77
- /**
78
- * @return parsed staking descriptor components or null if the descriptor does not match the expected staking pattern.
79
- */
80
- function parseStakingDescriptor(descriptor) {
81
- const pattern = {
82
- tr: [
83
- (0, descriptor_2.getUnspendableKey)(),
84
- [{ $var: 'slashingMiniscriptNode' }, [{ $var: 'unbondingMiniscriptNode' }, { $var: 'timelockMiniscriptNode' }]],
85
- ],
86
- };
87
- const matcher = new descriptor_1.PatternMatcher();
88
- const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
89
- const result = matcher.match(descriptorNode, pattern);
90
- if (!result) {
91
- return null;
92
- }
93
- const slashingNode = result.slashingMiniscriptNode;
94
- const unbondingNode = result.unbondingMiniscriptNode;
95
- const timelockNode = result.timelockMiniscriptNode;
96
- // Verify slashing node shape: and_v([and_v([pk, pk/multi_a]), multi_a])
97
- const { stakerKey: stakerKey1, finalityProviderKeys, covenantKeys, covenantThreshold, } = parseSlashingNode(slashingNode, matcher);
98
- // Verify unbonding node shape: and_v([pk, multi_a])
99
- const unbondingPattern = {
100
- and_v: [{ 'v:pk': { $var: 'stakerKey2' } }, { multi_a: { $var: 'covenantMulti2' } }],
101
- };
102
- const unbondingMatch = matcher.match(unbondingNode, unbondingPattern);
103
- if (!unbondingMatch) {
104
- throw new Error('Unbonding node does not match expected pattern');
105
- }
106
- // Verify unbonding timelock node shape: and_v([pk, older])
107
- const unilateralTimelock = parseUnilateralTimelock(timelockNode, matcher);
108
- if (!unilateralTimelock) {
109
- return null;
110
- }
111
- const { key: stakerKey3, timelock: stakingTimeLock } = unilateralTimelock;
112
- // Verify all staker keys are the same
113
- if (stakerKey1 !== unbondingMatch.stakerKey2 || unbondingMatch.stakerKey2 !== stakerKey3) {
114
- throw new Error('Staker keys must be identical across all nodes');
115
- }
116
- const stakerKey = Buffer.from(stakerKey1, 'hex');
117
- return {
118
- stakerKey,
119
- finalityProviderKeys,
120
- covenantKeys,
121
- covenantThreshold,
122
- stakingTimeLock,
123
- slashingMiniscriptNode: slashingNode,
124
- unbondingMiniscriptNode: unbondingNode,
125
- timelockMiniscriptNode: timelockNode,
126
- };
127
- }
128
- function parseUnbondingDescriptor(descriptor) {
129
- const pattern = {
130
- tr: [(0, descriptor_2.getUnspendableKey)(), [{ $var: 'slashingMiniscriptNode' }, { $var: 'unbondingTimelockMiniscriptNode' }]],
131
- };
132
- const matcher = new descriptor_1.PatternMatcher();
133
- const descriptorNode = descriptor instanceof wasm_utxo_1.Descriptor ? wasm_utxo_1.ast.fromDescriptor(descriptor) : descriptor;
134
- const result = matcher.match(descriptorNode, pattern);
135
- if (!result) {
136
- return null;
137
- }
138
- const slashingNode = result.slashingMiniscriptNode;
139
- const unbondingTimelockNode = result.unbondingTimelockMiniscriptNode;
140
- const { stakerKey: stakerKey1, finalityProviderKeys, covenantKeys, covenantThreshold, } = parseSlashingNode(slashingNode, matcher);
141
- const unilateralTimelock = parseUnilateralTimelock(unbondingTimelockNode, matcher);
142
- if (!unilateralTimelock) {
143
- return null;
144
- }
145
- const { key: stakerKey2, timelock: unbondingTimeLock } = unilateralTimelock;
146
- if (stakerKey1 !== stakerKey2) {
147
- throw new Error('Staker keys must be identical across all nodes');
148
- }
149
- return {
150
- stakerKey: Buffer.from(stakerKey1, 'hex'),
151
- finalityProviderKeys,
152
- covenantKeys,
153
- covenantThreshold,
154
- unbondingTimeLock,
155
- slashingMiniscriptNode: slashingNode,
156
- unbondingTimelockMiniscriptNode: unbondingTimelockNode,
157
- };
158
- }
159
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhYnlsb24vcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUdBLHdEQStEQztBQVlELDREQTZDQztBQWpPRCxnREFBbUQ7QUFDbkQsaUVBQTJFO0FBRTNFLDZDQUFpRDtBQWFqRCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLElBQXdCLEVBQ3hCLE9BQXVCO0lBRXZCLE1BQU0sT0FBTyxHQUFZO1FBQ3ZCLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQztL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QztRQUN6QyxvQkFBb0I7UUFDcEIsWUFBWTtRQUNaLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsc0JBQXNCLEVBQUUsWUFBWTtRQUNwQywrQkFBK0IsRUFBRSxxQkFBcUI7S0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm5NYXRjaGVyLCBQYXR0ZXJuIH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL2Rlc2NyaXB0b3InO1xuXG5pbXBvcnQgeyBnZXRVbnNwZW5kYWJsZUtleSB9IGZyb20gJy4vZGVzY3JpcHRvcic7XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFN0YWtpbmdEZXNjcmlwdG9yID0ge1xuICBzdGFrZXJLZXk6IEJ1ZmZlcjtcbiAgZmluYWxpdHlQcm92aWRlcktleXM6IEJ1ZmZlcltdO1xuICBjb3ZlbmFudEtleXM6IEJ1ZmZlcltdO1xuICBjb3ZlbmFudFRocmVzaG9sZDogbnVtYmVyO1xuICBzdGFraW5nVGltZUxvY2s6IG51bWJlcjtcbiAgc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xuICB1bmJvbmRpbmdNaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xuICB0aW1lbG9ja01pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG59O1xuXG5mdW5jdGlvbiBwYXJzZU11bHRpKG11bHRpOiB1bmtub3duKTogW251bWJlciwgc3RyaW5nW11dIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KG11bHRpKSB8fCBtdWx0aS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG11bHRpIHN0cnVjdHVyZTogbm90IGFuIGFycmF5IG9yIGVtcHR5Jyk7XG4gIH1cbiAgY29uc3QgW3RocmVzaG9sZCwgLi4ua2V5c10gPSBtdWx0aTtcbiAgaWYgKHR5cGVvZiB0aHJlc2hvbGQgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG11bHRpIHN0cnVjdHVyZTogdGhyZXNob2xkIGlzIG5vdCBhIG51bWJlcicpO1xuICB9XG4gIGlmICgha2V5cy5ldmVyeSgoaykgPT4gdHlwZW9mIGsgPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aSBzdHJ1Y3R1cmU6IG5vdCBhbGwga2V5cyBhcmUgc3RyaW5ncycpO1xuICB9XG4gIHJldHVybiBbdGhyZXNob2xkLCBrZXlzXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlsYXRlcmFsVGltZWxvY2soXG4gIG5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZSxcbiAgbWF0Y2hlcjogUGF0dGVybk1hdGNoZXJcbik6IHsga2V5OiBzdHJpbmc7IHRpbWVsb2NrOiBudW1iZXIgfSB8IG51bGwge1xuICBjb25zdCBwYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAndjpwayc6IHsgJHZhcjogJ2tleScgfSB9LCB7IG9sZGVyOiB7ICR2YXI6ICd0aW1lbG9jaycgfSB9XSxcbiAgfTtcbiAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKG5vZGUsIHBhdHRlcm4pO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBtYXRjaC5rZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdrZXkgbXVzdCBiZSBhIHN0cmluZycpO1xuICB9XG4gIGlmICh0eXBlb2YgbWF0Y2gudGltZWxvY2sgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0aW1lbG9jayBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gIH1cbiAgcmV0dXJuIHsga2V5OiBtYXRjaC5rZXksIHRpbWVsb2NrOiBtYXRjaC50aW1lbG9jayB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNsYXNoaW5nTm9kZShcbiAgc2xhc2hpbmdOb2RlOiBhc3QuTWluaXNjcmlwdE5vZGUsXG4gIG1hdGNoZXI6IFBhdHRlcm5NYXRjaGVyXG4pOiB7XG4gIHN0YWtlcktleTogc3RyaW5nO1xuICBmaW5hbGl0eVByb3ZpZGVyS2V5czogQnVmZmVyW107XG4gIGNvdmVuYW50S2V5czogQnVmZmVyW107XG4gIGNvdmVuYW50VGhyZXNob2xkOiBudW1iZXI7XG59IHtcbiAgY29uc3Qgc2xhc2hpbmdQYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbXG4gICAgICB7XG4gICAgICAgIGFuZF92OiBbeyAndjpwayc6IHsgJHZhcjogJ3N0YWtlcktleScgfSB9LCB7ICR2YXI6ICdmaW5hbGl0eVByb3ZpZGVyS2V5T3JNdWx0aScgfV0sXG4gICAgICB9LFxuICAgICAgeyBtdWx0aV9hOiB7ICR2YXI6ICdjb3ZlbmFudE11bHRpJyB9IH0sXG4gICAgXSxcbiAgfTtcblxuICBjb25zdCBzbGFzaGluZ01hdGNoID0gbWF0Y2hlci5tYXRjaChzbGFzaGluZ05vZGUsIHNsYXNoaW5nUGF0dGVybik7XG4gIGlmICghc2xhc2hpbmdNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2xhc2hpbmcgbm9kZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIHNsYXNoaW5nTWF0Y2guc3Rha2VyS2V5ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignc3Rha2VyS2V5IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIGNvbnN0IFtjb3ZlbmFudFRocmVzaG9sZCwgY292ZW5hbnRLZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkoc2xhc2hpbmdNYXRjaC5jb3ZlbmFudE11bHRpKTtcbiAgY29uc3QgY292ZW5hbnRLZXlzID0gY292ZW5hbnRLZXlTdHJpbmdzLm1hcCgoaykgPT4gQnVmZmVyLmZyb20oaywgJ2hleCcpKTtcblxuICBsZXQgZmluYWxpdHlQcm92aWRlcktleXM6IEJ1ZmZlcltdO1xuICBjb25zdCBmcEtleU9yTXVsdGkgPSBzbGFzaGluZ01hdGNoLmZpbmFsaXR5UHJvdmlkZXJLZXlPck11bHRpIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgaWYgKCd2OnBrJyBpbiBmcEtleU9yTXVsdGkpIHtcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyA9IFtCdWZmZXIuZnJvbShmcEtleU9yTXVsdGlbJ3Y6cGsnXSwgJ2hleCcpXTtcbiAgfSBlbHNlIGlmICgndjptdWx0aV9hJyBpbiBmcEtleU9yTXVsdGkpIHtcbiAgICBjb25zdCBbdGhyZXNob2xkLCBrZXlTdHJpbmdzXSA9IHBhcnNlTXVsdGkoZnBLZXlPck11bHRpWyd2Om11bHRpX2EnXSk7XG4gICAgaWYgKHRocmVzaG9sZCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaW5hbGl0eSBwcm92aWRlciBtdWx0aSB0aHJlc2hvbGQgbXVzdCBiZSAxJyk7XG4gICAgfVxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzID0ga2V5U3RyaW5ncy5tYXAoKGspID0+IEJ1ZmZlci5mcm9tKGssICdoZXgnKSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGZpbmFsaXR5IHByb3ZpZGVyIGtleSBzdHJ1Y3R1cmUnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3Rha2VyS2V5OiBzbGFzaGluZ01hdGNoLnN0YWtlcktleSxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gIH07XG59XG5cbi8qKlxuICogQHJldHVybiBwYXJzZWQgc3Rha2luZyBkZXNjcmlwdG9yIGNvbXBvbmVudHMgb3IgbnVsbCBpZiB0aGUgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgc3Rha2luZyBwYXR0ZXJuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGFraW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlKTogUGFyc2VkU3Rha2luZ0Rlc2NyaXB0b3IgfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICB0cjogW1xuICAgICAgZ2V0VW5zcGVuZGFibGVLZXkoKSxcbiAgICAgIFt7ICR2YXI6ICdzbGFzaGluZ01pbmlzY3JpcHROb2RlJyB9LCBbeyAkdmFyOiAndW5ib25kaW5nTWluaXNjcmlwdE5vZGUnIH0sIHsgJHZhcjogJ3RpbWVsb2NrTWluaXNjcmlwdE5vZGUnIH1dXSxcbiAgICBdLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzbGFzaGluZ05vZGUgPSByZXN1bHQuc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHVuYm9uZGluZ05vZGUgPSByZXN1bHQudW5ib25kaW5nTWluaXNjcmlwdE5vZGUgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBjb25zdCB0aW1lbG9ja05vZGUgPSByZXN1bHQudGltZWxvY2tNaW5pc2NyaXB0Tm9kZSBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbiAgLy8gVmVyaWZ5IHNsYXNoaW5nIG5vZGUgc2hhcGU6IGFuZF92KFthbmRfdihbcGssIHBrL211bHRpX2FdKSwgbXVsdGlfYV0pXG4gIGNvbnN0IHtcbiAgICBzdGFrZXJLZXk6IHN0YWtlcktleTEsXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgY292ZW5hbnRLZXlzLFxuICAgIGNvdmVuYW50VGhyZXNob2xkLFxuICB9ID0gcGFyc2VTbGFzaGluZ05vZGUoc2xhc2hpbmdOb2RlLCBtYXRjaGVyKTtcblxuICAvLyBWZXJpZnkgdW5ib25kaW5nIG5vZGUgc2hhcGU6IGFuZF92KFtwaywgbXVsdGlfYV0pXG4gIGNvbnN0IHVuYm9uZGluZ1BhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgYW5kX3Y6IFt7ICd2OnBrJzogeyAkdmFyOiAnc3Rha2VyS2V5MicgfSB9LCB7IG11bHRpX2E6IHsgJHZhcjogJ2NvdmVuYW50TXVsdGkyJyB9IH1dLFxuICB9O1xuXG4gIGNvbnN0IHVuYm9uZGluZ01hdGNoID0gbWF0Y2hlci5tYXRjaCh1bmJvbmRpbmdOb2RlLCB1bmJvbmRpbmdQYXR0ZXJuKTtcbiAgaWYgKCF1bmJvbmRpbmdNYXRjaCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5ib25kaW5nIG5vZGUgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgcGF0dGVybicpO1xuICB9XG5cbiAgLy8gVmVyaWZ5IHVuYm9uZGluZyB0aW1lbG9jayBub2RlIHNoYXBlOiBhbmRfdihbcGssIG9sZGVyXSlcbiAgY29uc3QgdW5pbGF0ZXJhbFRpbWVsb2NrID0gcGFyc2VVbmlsYXRlcmFsVGltZWxvY2sodGltZWxvY2tOb2RlLCBtYXRjaGVyKTtcbiAgaWYgKCF1bmlsYXRlcmFsVGltZWxvY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsga2V5OiBzdGFrZXJLZXkzLCB0aW1lbG9jazogc3Rha2luZ1RpbWVMb2NrIH0gPSB1bmlsYXRlcmFsVGltZWxvY2s7XG5cbiAgLy8gVmVyaWZ5IGFsbCBzdGFrZXIga2V5cyBhcmUgdGhlIHNhbWVcbiAgaWYgKHN0YWtlcktleTEgIT09IHVuYm9uZGluZ01hdGNoLnN0YWtlcktleTIgfHwgdW5ib25kaW5nTWF0Y2guc3Rha2VyS2V5MiAhPT0gc3Rha2VyS2V5Mykge1xuICAgIHRocm93IG5ldyBFcnJvcignU3Rha2VyIGtleXMgbXVzdCBiZSBpZGVudGljYWwgYWNyb3NzIGFsbCBub2RlcycpO1xuICB9XG5cbiAgY29uc3Qgc3Rha2VyS2V5ID0gQnVmZmVyLmZyb20oc3Rha2VyS2V5MSwgJ2hleCcpO1xuXG4gIHJldHVybiB7XG4gICAgc3Rha2VyS2V5LFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgIGNvdmVuYW50S2V5cyxcbiAgICBjb3ZlbmFudFRocmVzaG9sZCxcbiAgICBzdGFraW5nVGltZUxvY2ssXG4gICAgc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZTogc2xhc2hpbmdOb2RlLFxuICAgIHVuYm9uZGluZ01pbmlzY3JpcHROb2RlOiB1bmJvbmRpbmdOb2RlLFxuICAgIHRpbWVsb2NrTWluaXNjcmlwdE5vZGU6IHRpbWVsb2NrTm9kZSxcbiAgfTtcbn1cblxuZXhwb3J0IHR5cGUgUGFyc2VkVW5ib25kaW5nRGVzY3JpcHRvciA9IHtcbiAgc3Rha2VyS2V5OiBCdWZmZXI7XG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXTtcbiAgY292ZW5hbnRLZXlzOiBCdWZmZXJbXTtcbiAgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcjtcbiAgdW5ib25kaW5nVGltZUxvY2s6IG51bWJlcjtcbiAgc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xuICB1bmJvbmRpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlOiBhc3QuTWluaXNjcmlwdE5vZGU7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbmJvbmRpbmdEZXNjcmlwdG9yKFxuICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlXG4pOiBQYXJzZWRVbmJvbmRpbmdEZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgdHI6IFtnZXRVbnNwZW5kYWJsZUtleSgpLCBbeyAkdmFyOiAnc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZScgfSwgeyAkdmFyOiAndW5ib25kaW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZScgfV1dLFxuICB9O1xuXG4gIGNvbnN0IG1hdGNoZXIgPSBuZXcgUGF0dGVybk1hdGNoZXIoKTtcbiAgY29uc3QgZGVzY3JpcHRvck5vZGUgPSBkZXNjcmlwdG9yIGluc3RhbmNlb2YgRGVzY3JpcHRvciA/IGFzdC5mcm9tRGVzY3JpcHRvcihkZXNjcmlwdG9yKSA6IGRlc2NyaXB0b3I7XG4gIGNvbnN0IHJlc3VsdCA9IG1hdGNoZXIubWF0Y2goZGVzY3JpcHRvck5vZGUsIHBhdHRlcm4pO1xuXG4gIGlmICghcmVzdWx0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzbGFzaGluZ05vZGUgPSByZXN1bHQuc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGNvbnN0IHVuYm9uZGluZ1RpbWVsb2NrTm9kZSA9IHJlc3VsdC51bmJvbmRpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcblxuICBjb25zdCB7XG4gICAgc3Rha2VyS2V5OiBzdGFrZXJLZXkxLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgIGNvdmVuYW50S2V5cyxcbiAgICBjb3ZlbmFudFRocmVzaG9sZCxcbiAgfSA9IHBhcnNlU2xhc2hpbmdOb2RlKHNsYXNoaW5nTm9kZSwgbWF0Y2hlcik7XG5cbiAgY29uc3QgdW5pbGF0ZXJhbFRpbWVsb2NrID0gcGFyc2VVbmlsYXRlcmFsVGltZWxvY2sodW5ib25kaW5nVGltZWxvY2tOb2RlLCBtYXRjaGVyKTtcbiAgaWYgKCF1bmlsYXRlcmFsVGltZWxvY2spIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsga2V5OiBzdGFrZXJLZXkyLCB0aW1lbG9jazogdW5ib25kaW5nVGltZUxvY2sgfSA9IHVuaWxhdGVyYWxUaW1lbG9jaztcblxuICBpZiAoc3Rha2VyS2V5MSAhPT0gc3Rha2VyS2V5Mikge1xuICAgIHRocm93IG5ldyBFcnJvcignU3Rha2VyIGtleXMgbXVzdCBiZSBpZGVudGljYWwgYWNyb3NzIGFsbCBub2RlcycpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFrZXJLZXk6IEJ1ZmZlci5mcm9tKHN0YWtlcktleTEsICdoZXgnKSxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gICAgdW5ib25kaW5nVGltZUxvY2ssXG4gICAgc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZTogc2xhc2hpbmdOb2RlLFxuICAgIHVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGU6IHVuYm9uZGluZ1RpbWVsb2NrTm9kZSxcbiAgfTtcbn1cbiJdfQ==