@bitgo/utxo-staking 1.25.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/scripts/babylon-sync.d.ts +2 -0
- package/dist/cjs/scripts/babylon-sync.d.ts.map +1 -0
- package/dist/cjs/scripts/babylon-sync.js +126 -0
- package/dist/cjs/src/babylon/delegationMessage.d.ts.map +1 -0
- package/dist/cjs/src/babylon/delegationMessage.js +285 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/{src → cjs/src}/babylon/index.d.ts +2 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/index.js +3 -1
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/network.js +1 -1
- package/dist/cjs/src/babylon/parseDescriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/parseDescriptor.js +159 -0
- package/dist/cjs/src/babylon/stakingManager.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingManager.js +120 -0
- package/dist/cjs/src/babylon/stakingParams.d.ts.map +1 -0
- package/dist/cjs/src/babylon/stakingParams.js +132 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.js +1 -1
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/babylon/undelegation/index.js +1 -1
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/unbonding.js +111 -0
- package/dist/cjs/src/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/descriptor.js +38 -0
- package/dist/cjs/src/coreDao/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/coreDao/index.js +1 -1
- package/dist/cjs/src/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/opReturn.js +183 -0
- package/dist/cjs/src/coreDao/transaction.d.ts.map +1 -0
- package/dist/cjs/src/coreDao/transaction.js +34 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +1 -1
- package/dist/cjs/test/unit/babylon/bug71.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/bug71.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/bug71.js +108 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts +6 -0
- package/dist/cjs/test/unit/babylon/key.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/key.utils.js +68 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/transactions.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/transactions.js +338 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts +2 -0
- package/dist/cjs/test/unit/babylon/undelegation.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/undelegation.js +156 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts +13 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/babylon/vendor.utils.js +78 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/descriptor.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/descriptor.js +144 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts +2 -0
- package/dist/cjs/test/unit/coreDao/opReturn.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/opReturn.js +275 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts +5 -0
- package/dist/cjs/test/unit/coreDao/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/coreDao/utils.js +54 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts +9 -0
- package/dist/cjs/test/unit/fixtures.utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/fixtures.utils.js +91 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/babylon/delegationMessage.d.ts +38 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.js +91 -0
- package/dist/esm/babylon/index.d.ts +8 -0
- package/dist/esm/babylon/index.d.ts.map +1 -0
- package/dist/esm/babylon/index.js +13 -0
- package/dist/esm/babylon/network.d.ts +7 -0
- package/dist/esm/babylon/network.js +29 -0
- package/dist/esm/babylon/params.mainnet.json +152 -0
- package/dist/esm/babylon/params.testnet.json +212 -0
- package/dist/esm/babylon/parseDescriptor.d.ts +26 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.js +86 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.d.ts +24 -0
- package/dist/esm/babylon/undelegation/UndelegationResponse.js +18 -0
- package/dist/esm/babylon/undelegation/index.d.ts +3 -0
- package/dist/esm/babylon/undelegation/index.js +3 -0
- package/dist/esm/babylon/undelegation/unbonding.d.ts +16 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/esm/coreDao/descriptor.js +35 -0
- package/dist/esm/coreDao/index.d.ts +4 -0
- package/dist/esm/coreDao/index.js +4 -0
- package/dist/esm/coreDao/opReturn.d.ts +41 -0
- package/dist/esm/coreDao/opReturn.js +175 -0
- package/dist/esm/coreDao/transaction.d.ts +28 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/package.json +26 -10
- package/dist/src/babylon/delegationMessage.js +0 -285
- package/dist/src/babylon/descriptor.js +0 -97
- package/dist/src/babylon/index.d.ts.map +0 -1
- package/dist/src/babylon/parseDescriptor.js +0 -159
- package/dist/src/babylon/stakingManager.js +0 -120
- package/dist/src/babylon/stakingParams.js +0 -132
- package/dist/src/babylon/undelegation/unbonding.js +0 -111
- package/dist/src/coreDao/descriptor.js +0 -38
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.js +0 -34
- /package/dist/{src → cjs/src}/babylon/delegationMessage.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/network.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/params.mainnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/params.testnet.json +0 -0
- /package/dist/{src → cjs/src}/babylon/parseDescriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingManager.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/stakingParams.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/UndelegationResponse.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/babylon/undelegation/unbonding.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/descriptor.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/opReturn.d.ts +0 -0
- /package/dist/{src → cjs/src}/coreDao/transaction.d.ts +0 -0
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → esm}/babylon/delegationMessage.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/network.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/parseDescriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingManager.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/stakingParams.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/UndelegationResponse.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/index.d.ts.map +0 -0
- /package/dist/{src → esm}/babylon/undelegation/unbonding.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/descriptor.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/transaction.d.ts.map +0 -0
- /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/babylonlabs-io-btc-staking-ts"));
|
|
53
|
-
const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
|
|
54
|
-
const utxolib = __importStar(require("@bitgo/utxo-lib"));
|
|
55
|
-
const utxo_core_1 = require("@bitgo/utxo-core");
|
|
56
|
-
const descriptor_1 = require("@bitgo/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGlvbk1lc3NhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYmFieWxvbi9kZWxlZ2F0aW9uTWVzc2FnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFEQSxzQ0F3QkM7QUFRRCw4Q0FjQztBQUVELHdEQW9GQztBQVVELG9DQWNDO0FBRUQsc0NBcUJDO0FBdUJELG9EQUtDO0FBd0JELHdGQWlDQztBQUVELGtKQTRCQztBQTNWRDs7R0FFRztBQUNILG9EQUE0QjtBQUU1Qix5Q0FBbUM7QUFDbkMsNkVBQStEO0FBRS9ELDREQUE4QztBQUM5Qyx5REFBMkM7QUFFM0MsZ0RBQW9EO0FBQ3BELDREQUF5RTtBQUd6RSxxREFBd0Q7QUFDeEQsbURBQW1EO0FBQ25ELHVDQUFtRTtBQUluRTs7OztHQUlHO0FBQ0gsU0FBUyxXQUFXLENBQUMsQ0FBUyxFQUFFLFFBQTBCO0lBQ3hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xELE1BQU0sSUFBSSxLQUFLLENBQUMsV0FBVyxRQUFRLFdBQVcsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBa0I7SUFDbEMsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixLQUFLLE1BQU0sUUFBUSxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBVSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDO2dCQUNILE9BQU8sUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUs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LEVBQUUsQ0FBQztRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQW9CLEVBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUMxRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDeEcsc0NBQXNDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUMsd0JBQXdCLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNqSCxNQUFNLHFCQUFxQixHQUFHLE1BQU0sc0NBQXNDLENBQ3hFLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFlBQVksQ0FBQyxnQkFBZ0IsRUFDN0IsV0FBVyxFQUNYLGNBQWMsQ0FDZixDQUFDO0lBQ0YsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL3YxLjk5LjAtc25hcHNob3QuMjUwMjExL3gvYnRjc3Rha2luZy90eXBlcy92YWxpZGF0ZV9wYXJzZWRfbWVzc2FnZS5nb1xuICovXG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCB7IEJJUDMyMiB9IGZyb20gJ2JpcDMyMi1qcyc7XG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvL2JhYnlsb25sYWJzLWlvLWJ0Yy1zdGFraW5nLXRzJztcbmltcG9ydCAqIGFzIGJhYnlsb25Qcm90b2J1ZiBmcm9tICdAYmFieWxvbmxhYnMtaW8vYmFieWxvbi1wcm90by10cyc7XG5pbXBvcnQgKiBhcyBiaXRjb2luanNsaWIgZnJvbSAnYml0Y29pbmpzLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyB0b1hPbmx5UHVibGljS2V5IH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZSc7XG5pbXBvcnQgeyBzaWduV2l0aEtleSwgdG9XcmFwcGVkUHNidCB9IGZyb20gJ0BiaXRnby91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5cbmltcG9ydCB7IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB9IGZyb20gJy4vZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBjcmVhdGVTdGFraW5nTWFuYWdlciB9IGZyb20gJy4vc3Rha2luZ01hbmFnZXInO1xuaW1wb3J0IHsgZ2V0U3Rha2luZ1BhcmFtcyB9IGZyb20gJy4vc3Rha2luZ1BhcmFtcyc7XG5pbXBvcnQgeyBCYWJ5bG9uTmV0d29ya0xpa2UsIHRvQml0Y29pbkpzTmV0d29yayB9IGZyb20gJy4vbmV0d29yayc7XG5cbmV4cG9ydCB0eXBlIFZhbHVlV2l0aFR5cGVVcmw8VD4gPSB7IHR5cGVVcmw6IHN0cmluZzsgdmFsdWU6IFQgfTtcblxuLyoqXG4gKiBEZWNvZGUgYSBoZXggb3IgYmFzZTY0IGVuY29kZWQgc3RyaW5nIGFuZCBjaGVjayBpZiB0aGUgbGVuZ3RoIGlzIHZhbGlkLlxuICogQHBhcmFtIHZcbiAqIEBwYXJhbSBlbmNvZGluZ1xuICovXG5mdW5jdGlvbiBkZWNvZGVDaGVjayh2OiBzdHJpbmcsIGVuY29kaW5nOiAnaGV4JyB8ICdiYXNlNjQnKSB7XG4gIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5mcm9tKHYsIGVuY29kaW5nKTtcbiAgaWYgKHJlc3VsdC50b1N0cmluZyhlbmNvZGluZykubGVuZ3RoICE9PSB2Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCAke2VuY29kaW5nfSBlbmNvZGluZ2ApO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQ29udmVydCBhIEJ1ZmZlciBvciBzdHJpbmcgdG8gYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXG4gKiBAcGFyYW0gdlxuICovXG5mdW5jdGlvbiB0b0Jhc2U2NCh2OiBCdWZmZXIgfCBzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJykge1xuICAgIGZvciAoY29uc3QgZW5jb2Rpbmcgb2YgWydiYXNlNjQnLCAnaGV4J10gYXMgY29uc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0b0Jhc2U2NChkZWNvZGVDaGVjayh2LCBlbmNvZGluZykpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB0cnkgbmV4dFxuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYmFzZTY0IG9yIGhleCBlbmNvZGluZzogJHt2fWApO1xuICB9XG5cbiAgcmV0dXJuIHYudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2lnbmVkUHNidChcbiAgcHNidDogYml0Y29pbmpzbGliLlBzYnQsXG4gIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IsXG4gIHNpZ25lcnM6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlW10sXG4gIHsgZmluYWxpemUgPSBmYWxzZSB9XG4pOiBiaXRjb2luanNsaWIuUHNidCB7XG4gIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidChwc2J0LnRvQnVmZmVyKCkpO1xuICBjb25zdCBzaWduZWRJbnB1dHMgPSBwc2J0LmRhdGEuaW5wdXRzLmZsYXRNYXAoKGlucHV0LCBpKSA9PiB7XG4gICAgYXNzZXJ0KGlucHV0LndpdG5lc3NVdHhvKTtcbiAgICBpZiAoQnVmZmVyLmZyb20oZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSkuZXF1YWxzKGlucHV0LndpdG5lc3NVdHhvLnNjcmlwdCkpIHtcbiAgICAgIHdyYXBwZWRQc2J0LnVwZGF0ZUlucHV0V2l0aERlc2NyaXB0b3IoaSwgZGVzY3JpcHRvcik7XG4gICAgICBjb25zdCBzaWduUmVzdWx0cyA9IHNpZ25lcnMubWFwKChzaWduZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHNpZ25lci5wcml2YXRlS2V5KTtcbiAgICAgICAgcmV0dXJuIHdyYXBwZWRQc2J0LnNpZ25XaXRoUHJ2KHNpZ25lci5wcml2YXRlS2V5KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFtbaSwgc2lnblJlc3VsdHNdXTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9KTtcbiAgYXNzZXJ0KHNpZ25lZElucHV0cy5sZW5ndGggPiAwKTtcbiAgaWYgKGZpbmFsaXplKSB7XG4gICAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcbiAgfVxuICByZXR1cm4gYml0Y29pbmpzbGliLlBzYnQuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3cmFwcGVkUHNidC5zZXJpYWxpemUoKSkpO1xufVxuXG4vKipcbiAqIFV0aWxpdHkgbWV0aG9kIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIGJ0Yy1zdGFraW5nLXRzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYnRjLXN0YWtpbmctdHMvaXNzdWVzLzcxXG4gKiBAcGFyYW0gdlxuICogQHBhcmFtIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcmNlRmluYWxpemVQc2J0KFxuICB2OiBCdWZmZXIgfCB1dHhvbGliLlBzYnQgfCBiaXRjb2luanNsaWIuUHNidCxcbiAgbmV0d29yazogQmFieWxvbk5ldHdvcmtMaWtlXG4pOiBiaXRjb2luanNsaWIuUHNidCB7XG4gIGlmICh2IGluc3RhbmNlb2YgdXR4b2xpYi5Qc2J0KSB7XG4gICAgdiA9IHYudG9CdWZmZXIoKTtcbiAgfVxuICBpZiAodiBpbnN0YW5jZW9mIGJpdGNvaW5qc2xpYi5Qc2J0KSB7XG4gICAgdiA9IHYudG9CdWZmZXIoKTtcbiAgfVxuICBjb25zdCBwc2J0ID0gYml0Y29pbmpzbGliLlBzYnQuZnJvbUJ1ZmZlcih2LCB7IG5ldHdvcms6IHRvQml0Y29pbkpzTmV0d29yayhuZXR3b3JrKSB9KTtcbiAgLy8gdGhpcyBvbmx5IHdvcmtzIHdpdGggY2VydGFpbiBiaXRjb2luanNsaWIgdmVyc2lvbnNcbiAgcHNidC5maW5hbGl6ZUFsbElucHV0cygpO1xuICByZXR1cm4gcHNidDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ0Y1Byb3ZpZGVyRm9yRUNLZXkoXG4gIGRlc2NyaXB0b3JCdWlsZGVyOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIsXG4gIHN0YWtlcktleTogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2Vcbik6IHZlbmRvci5CdGNQcm92aWRlciB7XG4gIGZ1bmN0aW9uIHNpZ25XaXRoRGVzY3JpcHRvcihcbiAgICBwc2J0OiBiaXRjb2luanNsaWIuUHNidCxcbiAgICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yLFxuICAgIGtleTogdXR4b2xpYi5FQ1BhaXJJbnRlcmZhY2VcbiAgKTogYml0Y29pbmpzbGliLlBzYnQge1xuICAgIHBzYnQgPSBnZXRTaWduZWRQc2J0KHBzYnQsIGRlc2NyaXB0b3IsIFtrZXldLCB7IGZpbmFsaXplOiBmYWxzZSB9KTtcbiAgICAvLyBCVUc6IHdlIG5lZWQgdG8gYmxpbmRseSBmaW5hbGl6ZSBoZXJlIGV2ZW4gdGhvdWdoIHdlIGhhdmUgbm90IGZ1bGx5IHNpZ25lZFxuICAgIHBzYnQuZmluYWxpemVBbGxJbnB1dHMoKTtcbiAgICByZXR1cm4gcHNidDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNpZ25CaXAzMjJTaW1wbGUobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBHZXQgdGhlIHNjcmlwdCBwdWJsaWMga2V5IGZyb20gdGhlIHN0YWtpbmcgZGVzY3JpcHRvclxuICAgIGNvbnN0IHNjcmlwdFB1YktleSA9IEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCkuc2NyaXB0UHVia2V5KCkpO1xuICAgIGNvbnN0IHRvU3BlbmRUeCA9IEJJUDMyMi5idWlsZFRvU3BlbmRUeChtZXNzYWdlLCBzY3JpcHRQdWJLZXkpO1xuXG4gICAgLy8gR2V0IHRoZSB0b19zcGVuZCB0eGlkXG4gICAgY29uc3QgdG9TcGVuZFR4SWQgPSB0b1NwZW5kVHguZ2V0SWQoKTtcblxuICAgIC8vIENyZWF0ZSBQU0JUIG9iamVjdCBmb3IgY29uc3RydWN0aW5nIHRoZSB0cmFuc2FjdGlvblxuICAgIGNvbnN0IHRvU2lnblBzYnQgPSBuZXcgYml0Y29pbmpzbGliLlBzYnQoKTtcbiAgICB0b1NpZ25Qc2J0LnNldFZlcnNpb24oMik7IC8vIG5WZXJzaW9uID0gMFxuICAgIHRvU2lnblBzYnQuc2V0TG9ja3RpbWUoMCk7IC8vIG5Mb2NrVGltZSA9IDBcbiAgICB0b1NpZ25Qc2J0LmFkZElucHV0KHtcbiAgICAgIGhhc2g6IHRvU3BlbmRUeElkLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBzZXF1ZW5jZTogZGVzY3JpcHRvckJ1aWxkZXIuc3Rha2luZ1RpbWVMb2NrLFxuICAgICAgd2l0bmVzc1V0eG86IHtcbiAgICAgICAgc2NyaXB0OiBzY3JpcHRQdWJLZXksXG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFNpZ24gdGhlIFBTQlQgd2l0aCB0aGUgc3Rha2VyIGtleVxuICAgIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidCh0b1NpZ25Qc2J0LnRvQnVmZmVyKCkpO1xuICAgIHdyYXBwZWRQc2J0LnVwZGF0ZUlucHV0V2l0aERlc2NyaXB0b3IoMCwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSk7XG4gICAgc2lnbldpdGhLZXkod3JhcHBlZFBzYnQsIHN0YWtlcktleSk7XG4gICAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcblxuICAgIC8vIEVuY29kZSB0aGUgd2l0bmVzcyBkYXRhIGFuZCByZXR1cm5cbiAgICByZXR1cm4gQklQMzIyLmVuY29kZVdpdG5lc3MoYml0Y29pbmpzbGliLlBzYnQuZnJvbUJ1ZmZlcihCdWZmZXIuZnJvbSh3cmFwcGVkUHNidC5zZXJpYWxpemUoKSkpKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gdHlwZVxuICAgICAqIEByZXR1cm5zIEJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgICAqL1xuICAgIGFzeW5jIHNpZ25NZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgdHlwZTogJ2VjZHNhJyB8ICdiaXAzMjItc2ltcGxlJyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSAnZWNkc2EnOlxuICAgICAgICAgIHJldHVybiB0b0Jhc2U2NChzdGFrZXJLZXkuc2lnbihCdWZmZXIuZnJvbShtZXNzYWdlLCAnaGV4JykpKTtcbiAgICAgICAgY2FzZSAnYmlwMzIyLXNpbXBsZSc6XG4gICAgICAgICAgcmV0dXJuIHRvQmFzZTY0KHNpZ25CaXAzMjJTaW1wbGUobWVzc2FnZSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCB0eXBlOiAke3R5cGV9YCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIHNpZ25Qc2J0KHBzYnRIZXg6IHN0cmluZywgb3B0aW9uczogdmVuZG9yLlNpZ25Qc2J0T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCBwc2J0ID0gYml0Y29pbmpzbGliLlBzYnQuZnJvbUhleChwc2J0SGV4KTtcbiAgICAgIHN3aXRjaCAob3B0aW9ucy5hY3Rpb24ubmFtZSkge1xuICAgICAgICBjYXNlICdzaWduLWJ0Yy1zbGFzaGluZy10cmFuc2FjdGlvbic6XG4gICAgICAgICAgcmV0dXJuIHNpZ25XaXRoRGVzY3JpcHRvcihwc2J0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpLCBzdGFrZXJLZXkpLnRvSGV4KCk7XG4gICAgICAgIGNhc2UgJ3NpZ24tYnRjLXVuYm9uZGluZy1zbGFzaGluZy10cmFuc2FjdGlvbic6XG4gICAgICAgICAgcmV0dXJuIHNpZ25XaXRoRGVzY3JpcHRvcihwc2J0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdEZXNjcmlwdG9yKCksIHN0YWtlcktleSkudG9IZXgoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgc2lnbmluZyBzdGVwOiAke29wdGlvbnMuYWN0aW9uLm5hbWV9YCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IGJ0Yy1zdGFraW5nLXRzIHRvIGNyZWF0ZSBhIHN0YWtpbmcgZXhwYW5zaW9uIHJlZ2lzdHJhdGlvblxuICAgICAqIHRyYW5zYWN0aW9uLCB3aGljaCB3ZSBkbyBub3QgY3VycmVudGx5IHN1cHBvcnQuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0VHJhbnNhY3Rpb25IZXgodHhpZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGdldFRyYW5zYWN0aW9uSGV4ICh0eGlkPSR7dHhpZH0pYCk7XG4gICAgfSxcbiAgfTtcbn1cbnR5cGUgUmVzdWx0ID0ge1xuICB1bnNpZ25lZERlbGVnYXRpb25Nc2c6IFZhbHVlV2l0aFR5cGVVcmw8YmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uPjtcbiAgc3Rha2luZ1R4OiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb247XG59O1xuXG4vKipcbiAqIEBwYXJhbSBzdGFraW5nS2V5IC0gdGhpcyBpcyB0aGUgc2luZ2xlLXNpZyBrZXkgdGhhdCBpcyB1c2VkIGZvciBjby1zaWduaW5nIHRoZSBzdGFraW5nIG91dHB1dFxuICogQHBhcmFtIGNoYW5nZUFkZHJlc3MgLSB0aGlzIGlzIHVucmVsYXRlZCB0byB0aGUgc3Rha2luZyBrZXkgYW5kIGlzIHVzZWQgZm9yIHRoZSBjaGFuZ2Ugb3V0cHV0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0YWtlckluZm8oXG4gIHN0YWtpbmdLZXk6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlIHwgQnVmZmVyIHwgc3RyaW5nLFxuICBjaGFuZ2VBZGRyZXNzOiBzdHJpbmdcbik6IHZlbmRvci5TdGFrZXJJbmZvIHtcbiAgaWYgKHR5cGVvZiBzdGFraW5nS2V5ID09PSAnb2JqZWN0JyAmJiAncHVibGljS2V5JyBpbiBzdGFraW5nS2V5KSB7XG4gICAgc3Rha2luZ0tleSA9IHN0YWtpbmdLZXkucHVibGljS2V5O1xuICB9XG4gIGlmICh0eXBlb2Ygc3Rha2luZ0tleSA9PT0gJ3N0cmluZycpIHtcbiAgICBzdGFraW5nS2V5ID0gQnVmZmVyLmZyb20oc3Rha2luZ0tleSwgJ2hleCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHVibGljS2V5Tm9Db29yZEhleDogdG9YT25seVB1YmxpY0tleShzdGFraW5nS2V5KS50b1N0cmluZygnaGV4JyksXG4gICAgYWRkcmVzczogY2hhbmdlQWRkcmVzcyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWtpbmcoXG4gIG5ldHdvcms6IEJhYnlsb25OZXR3b3JrTGlrZSxcbiAgYmxvY2tIZWlnaHQ6IG51bWJlcixcbiAgc3Rha2VyQnRjSW5mbzogdmVuZG9yLlN0YWtlckluZm8sXG4gIHN0YWtpbmdJbnB1dDogdmVuZG9yLlN0YWtpbmdJbnB1dHMsXG4gIHZlcnNpb25lZFBhcmFtczogdmVuZG9yLlZlcnNpb25lZFN0YWtpbmdQYXJhbXNbXSA9IGdldFN0YWtpbmdQYXJhbXMobmV0d29yaylcbik6IHZlbmRvci5TdGFraW5nIHtcbiAgaWYgKGJsb2NrSGVpZ2h0ID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCYWJ5bG9uIEJUQyB0aXAgaGVpZ2h0IGNhbm5vdCBiZSAwJyk7XG4gIH1cblxuICAvLyBHZXQgdGhlIEJhYnlsb24gcGFyYW1zIGJhc2VkIG9uIHRoZSBCVEMgdGlwIGhlaWdodCBmcm9tIEJhYnlsb24gY2hhaW5cbiAgY29uc3QgcGFyYW1zID0gdmVuZG9yLmdldEJhYnlsb25QYXJhbUJ5QnRjSGVpZ2h0KGJsb2NrSGVpZ2h0LCB2ZXJzaW9uZWRQYXJhbXMpO1xuXG4gIHJldHVybiBuZXcgdmVuZG9yLlN0YWtpbmcoXG4gICAgdG9CaXRjb2luSnNOZXR3b3JrKG5ldHdvcmspLFxuICAgIHN0YWtlckJ0Y0luZm8sXG4gICAgcGFyYW1zLFxuICAgIHN0YWtpbmdJbnB1dC5maW5hbGl0eVByb3ZpZGVyUGtzTm9Db29yZEhleCxcbiAgICBzdGFraW5nSW5wdXQuc3Rha2luZ1RpbWVsb2NrXG4gICk7XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25MaWtlID1cbiAgfCBiaXRjb2luanNsaWIuUHNidFxuICB8IGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvblxuICB8IHV0eG9saWIuVHJhbnNhY3Rpb25cbiAgfCB1dHhvbGliLmJpdGdvLlV0eG9UcmFuc2FjdGlvbjxiaWdpbnQgfCBudW1iZXI+XG4gIHwgdXR4b2xpYi5Qc2J0XG4gIHwgdXR4b2xpYi5iaXRnby5VdHhvUHNidDtcblxuZnVuY3Rpb24gdG9TdGFraW5nVHJhbnNhY3Rpb25Gcm9tUHNidChcbiAgcHNidDogYml0Y29pbmpzbGliLlBzYnQgfCB1dHhvbGliLlBzYnQgfCB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0XG4pOiBiaXRjb2luanNsaWIuVHJhbnNhY3Rpb24ge1xuICBpZiAoIShwc2J0IGluc3RhbmNlb2YgdXR4b2xpYi5iaXRnby5VdHhvUHNidCkpIHtcbiAgICBwc2J0ID0gdXR4b2xpYi5iaXRnby5jcmVhdGVQc2J0RnJvbUJ1ZmZlcihwc2J0LnRvQnVmZmVyKCksIHV0eG9saWIubmV0d29ya3MuYml0Y29pbik7XG4gIH1cbiAgaWYgKHBzYnQgaW5zdGFuY2VvZiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0KSB7XG4gICAgLy8gb25seSB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0IGhhcyB0aGUgZ2V0VW5zaWduZWRUeCBtZXRob2RcbiAgICByZXR1cm4gYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uLmZyb21IZXgocHNidC5nZXRVbnNpZ25lZFR4KCkudG9IZXgoKSk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdpbGxlZ2FsIHN0YXRlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1N0YWtpbmdUcmFuc2FjdGlvbih0eDogVHJhbnNhY3Rpb25MaWtlKTogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uIHtcbiAgaWYgKHR4IGluc3RhbmNlb2YgYml0Y29pbmpzbGliLlBzYnQgfHwgdHggaW5zdGFuY2VvZiB1dHhvbGliLlBzYnQpIHtcbiAgICByZXR1cm4gdG9TdGFraW5nVHJhbnNhY3Rpb25Gcm9tUHNidCh0eCk7XG4gIH1cbiAgcmV0dXJuIGJpdGNvaW5qc2xpYi5UcmFuc2FjdGlvbi5mcm9tSGV4KHR4LnRvSGV4KCkpO1xufVxuXG4vKipcbiAqIEFzIG9mIGJhYnlsb25sYWJzLWlvL2J0Yy1zdGFraW5nLXRzIHYxLjUuNywgdGhlIEJUQyBkZWxlZ2F0aW9uIG1lc3NhZ2UgY3JlYXRpb24gZnVuY3Rpb25zIHN1cHBvcnQgdHdvIG1lc3NhZ2UgdHlwZXM6XG4gKiAtIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb25cbiAqIC0gTXNnQnRjU3Rha2VFeHBhbmRcbiAqXG4gKiBCaXRHbyBzdGlsbCBvbmx5IHN1cHBvcnRzIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24sIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG1lc3NhZ2UgdHlwZSBoZXJlLlxuICpcbiAqIEBwYXJhbSBtc2cgLSB0aGUgbWVzc2FnZSB0byBjaGVja1xuICogQHJldHVybiBgdHJ1ZWAgaWYgdGhlIG1lc3NhZ2UgaXMgb2YgdHlwZSBNc2dDcmVhdGVCVENEZWxlZ2F0aW9uXG4gKi9cbmZ1bmN0aW9uIGlzTXNnQnRjU3Rha2VFeHBhbmQoXG4gIG1zZzogYmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uIHwgYmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dCdGNTdGFrZUV4cGFuZFxuKSB7XG4gIHJldHVybiAncHJldmlvdXNTdGFraW5nVHhIYXNoJyBpbiBtc2c7XG59XG5cbi8qXG4gKiBUaGlzIGlzIG1vc3RseSBsaWZ0ZWQgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2J0Yy1zdGFraW5nLXRzL2Jsb2IvdjAuNC4wLXJjLjIvc3JjL3N0YWtpbmcvbWFuYWdlci50cyNMMTAwLUwxNzJcbiAqXG4gKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IGhlcmUgd2UgYXJlIHJldHVybmluZyBhbiBfdW5zaWduZWRfIGRlbGVnYXRpb24gbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlbGVnYXRpb25NZXNzYWdlV2l0aFRyYW5zYWN0aW9uKFxuICBjaGFubmVsOiAnZGVsZWdhdGlvbjpjcmVhdGUnIHwgJ2RlbGVnYXRpb246cmVnaXN0ZXInLFxuICBtYW5hZ2VyOiB2ZW5kb3IuQmFieWxvbkJ0Y1N0YWtpbmdNYW5hZ2VyLFxuICBzdGFraW5nOiB2ZW5kb3IuU3Rha2luZyxcbiAgc3Rha2luZ0Ftb3VudFNhdDogbnVtYmVyLFxuICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25MaWtlLFxuICBiYWJ5bG9uQWRkcmVzczogc3RyaW5nXG4pOiBQcm9taXNlPFZhbHVlV2l0aFR5cGVVcmw8YmFieWxvblByb3RvYnVmLmJ0Y3N0YWtpbmd0eC5Nc2dDcmVhdGVCVENEZWxlZ2F0aW9uPj4ge1xuICBpZiAoIXZlbmRvci5pc1ZhbGlkQmFieWxvbkFkZHJlc3MoYmFieWxvbkFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEJhYnlsb24gYWRkcmVzcycpO1xuICB9XG4gIC8vIENyZWF0ZSBkZWxlZ2F0aW9uIG1lc3NhZ2Ugd2l0aG91dCBpbmNsdWRpbmcgaW5jbHVzaW9uIHByb29mXG4gIGNvbnN0IG1zZyA9IGF3YWl0IG1hbmFnZXIuY3JlYXRlQnRjRGVsZWdhdGlvbk1zZyhcbiAgICBjaGFubmVsLFxuICAgIHN0YWtpbmcsXG4gICAge1xuICAgICAgc3Rha2luZ1RpbWVsb2NrOiBzdGFraW5nLnN0YWtpbmdUaW1lbG9jayxcbiAgICAgIGZpbmFsaXR5UHJvdmlkZXJQa3NOb0Nvb3JkSGV4OiBzdGFraW5nLmZpbmFsaXR5UHJvdmlkZXJQa3NOb0Nvb3JkSGV4LFxuICAgICAgc3Rha2luZ0Ftb3VudFNhdCxcbiAgICB9LFxuICAgIHRvU3Rha2luZ1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSxcbiAgICBiYWJ5bG9uQWRkcmVzcyxcbiAgICBzdGFraW5nLnN0YWtlckluZm8sXG4gICAgc3Rha2luZy5wYXJhbXNcbiAgKTtcblxuICAvLyBJdCBzaG91bGRuJ3QgYmUgcG9zc2libGUgZm9yIHVzIHRvIGNyZWF0ZSBhIE1zZ0J0Y1N0YWtlRXhwYW5kIGhlcmUgYmVjYXVzZSB0aGF0IG9ubHkgZ2V0cyBjcmVhdGVkIHdoZW5cbiAgLy8gd2UgcGFzcyBjaGFubmVsID0gZGVsZWdhdGlvbjpleHBhbmQgaW50byBjcmVhdGVCdGNEZWxlZ2F0aW9uTXNnLCB3aGljaCB3ZSBjYW5ub3QgZG8uXG4gIGlmIChpc01zZ0J0Y1N0YWtlRXhwYW5kKG1zZy52YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01zZ0J0Y1N0YWtlRXhwYW5kIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLm1zZywgdmFsdWU6IG1zZy52YWx1ZSBhcyBiYWJ5bG9uUHJvdG9idWYuYnRjc3Rha2luZ3R4Lk1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24gfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVVuc2lnbmVkUHJlU3Rha2VSZWdpc3RyYXRpb25CYWJ5bG9uVHJhbnNhY3Rpb25XaXRoQnRjUHJvdmlkZXIoXG4gIGJ0Y1Byb3ZpZGVyOiB2ZW5kb3IuQnRjUHJvdmlkZXIsXG4gIG5ldHdvcms6IGJpdGNvaW5qc2xpYi5OZXR3b3JrLFxuICBzdGFrZXJCdGNJbmZvOiB2ZW5kb3IuU3Rha2VySW5mbyxcbiAgc3Rha2luZ0lucHV0OiB2ZW5kb3IuU3Rha2luZ0lucHV0cyxcbiAgYmFieWxvbkJ0Y1RpcEhlaWdodDogbnVtYmVyLFxuICBpbnB1dFVUWE9zOiB2ZW5kb3IuVVRYT1tdLFxuICBmZWVSYXRlU2F0QjogbnVtYmVyLFxuICBiYWJ5bG9uQWRkcmVzczogc3RyaW5nLFxuICBjaGFubmVsOiAnZGVsZWdhdGlvbjpjcmVhdGUnIHwgJ2RlbGVnYXRpb246cmVnaXN0ZXInLFxuICBzdGFraW5nUGFyYW1zOiB2ZW5kb3IuVmVyc2lvbmVkU3Rha2luZ1BhcmFtc1tdID0gZ2V0U3Rha2luZ1BhcmFtcyhuZXR3b3JrKVxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgaWYgKGlucHV0VVRYT3MubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbnB1dCBVVFhPcyBwcm92aWRlZCcpO1xuICB9XG4gIGNvbnN0IG1hbmFnZXIgPSBjcmVhdGVTdGFraW5nTWFuYWdlcihuZXR3b3JrLCBidGNQcm92aWRlciwgc3Rha2luZ1BhcmFtcyk7XG4gIGNvbnN0IHN0YWtpbmcgPSBjcmVhdGVTdGFraW5nKG5ldHdvcmssIGJhYnlsb25CdGNUaXBIZWlnaHQsIHN0YWtlckJ0Y0luZm8sIHN0YWtpbmdJbnB1dCwgc3Rha2luZ1BhcmFtcyk7XG4gIC8vIENyZWF0ZSB1bnNpZ25lZCBzdGFraW5nIHRyYW5zYWN0aW9uXG4gIGNvbnN0IHsgdHJhbnNhY3Rpb24gfSA9IHN0YWtpbmcuY3JlYXRlU3Rha2luZ1RyYW5zYWN0aW9uKHN0YWtpbmdJbnB1dC5zdGFraW5nQW1vdW50U2F0LCBpbnB1dFVUWE9zLCBmZWVSYXRlU2F0Qik7XG4gIGNvbnN0IHVuc2lnbmVkRGVsZWdhdGlvbk1zZyA9IGF3YWl0IGNyZWF0ZURlbGVnYXRpb25NZXNzYWdlV2l0aFRyYW5zYWN0aW9uKFxuICAgIGNoYW5uZWwsXG4gICAgbWFuYWdlcixcbiAgICBzdGFraW5nLFxuICAgIHN0YWtpbmdJbnB1dC5zdGFraW5nQW1vdW50U2F0LFxuICAgIHRyYW5zYWN0aW9uLFxuICAgIGJhYnlsb25BZGRyZXNzXG4gICk7XG4gIHJldHVybiB7IHVuc2lnbmVkRGVsZWdhdGlvbk1zZywgc3Rha2luZ1R4OiB0cmFuc2FjdGlvbiB9O1xufVxuIl19
|
|
@@ -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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QixFQUFFLEVBQUUsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pILENBQUM7Q0FDRjtBQXRGRCw0REFzRkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9iYWJ5bG9ubGFicy1pby9iYWJ5bG9uL3RyZWUvbWFpbi9kb2NzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmFieWxvbmxhYnMtaW8vYmFieWxvbi9ibG9iL21haW4vZG9jcy9zdGFraW5nLXNjcmlwdC5tZFxuICogaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2JhYnlsb24vYmxvYi92MS45OS4wLXNuYXBzaG90LjI1MDIxMS9idGNzdGFraW5nL3N0YWtpbmcuZ29cbiAqL1xuXG5pbXBvcnQgeyBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFN0YWtpbmdQYXJhbXMgfSBmcm9tICdAYml0Z28vYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VW5zcGVuZGFibGVLZXkoKTogc3RyaW5nIHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2JhYnlsb25sYWJzLWlvL2J0Yy1zdGFraW5nLXRzL2Jsb2IvdjAuNC4wLXJjLjIvc3JjL2NvbnN0YW50cy9pbnRlcm5hbFB1YmtleS50c1xuICByZXR1cm4gJzUwOTI5Yjc0YzFhMDQ5NTRiNzhiNGI2MDM1ZTk3YTVlMDc4YTVhMGYyOGVjOTZkNTQ3YmZlZTlhY2U4MDNhYzAnO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBtaW5pc2NyaXB0IG5vZGVzXG5mdW5jdGlvbiBwayhiOiBCdWZmZXIpOiBhc3QuTWluaXNjcmlwdE5vZGUge1xuICByZXR1cm4geyAndjpwayc6IGIudG9TdHJpbmcoJ2hleCcpIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0ZWRLZXlzKGtleXM6IEJ1ZmZlcltdKTogQnVmZmVyW10ge1xuICByZXR1cm4gWy4uLmtleXNdLnNvcnQoKGEsIGIpID0+IGEuY29tcGFyZShiKSk7XG59XG5cbmZ1bmN0aW9uIG11bHRpQXJncyh0aHJlc2hvbGQ6IG51bWJlciwga2V5czogQnVmZmVyW10pOiBbbnVtYmVyLCAuLi5zdHJpbmdbXV0ge1xuICByZXR1cm4gW3RocmVzaG9sZCwgLi4uc29ydGVkS2V5cyhrZXlzKS5tYXAoKGspID0+IGsudG9TdHJpbmcoJ2hleCcpKV07XG59XG5cbmZ1bmN0aW9uIHRhcHJvb3RTY3JpcHRPbmx5RnJvbUFzdChuOiBhc3QuVGFwVHJlZU5vZGUpOiBEZXNjcmlwdG9yIHtcbiAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbVN0cmluZyhhc3QuZm9ybWF0Tm9kZSh7IHRyOiBbZ2V0VW5zcGVuZGFibGVLZXkoKSwgbl0gfSksICdkZWZpbml0ZScpO1xufVxuXG5leHBvcnQgY2xhc3MgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHN0YWtlcktleTogQnVmZmVyLFxuICAgIHB1YmxpYyBmaW5hbGl0eVByb3ZpZGVyS2V5czogQnVmZmVyW10sXG4gICAgcHVibGljIGNvdmVuYW50S2V5czogQnVmZmVyW10sXG4gICAgcHVibGljIGNvdmVuYW50VGhyZXNob2xkOiBudW1iZXIsXG4gICAgcHVibGljIHN0YWtpbmdUaW1lTG9jazogbnVtYmVyLFxuICAgIHB1YmxpYyB1bmJvbmRpbmdUaW1lTG9jazogbnVtYmVyXG4gICkge31cblxuICBzdGF0aWMgZnJvbVBhcmFtcyhcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YWtlcktleTogQnVmZmVyO1xuICAgICAgZmluYWxpdHlQcm92aWRlcktleXM6IEJ1ZmZlcltdO1xuICAgIH0gJiBTdGFraW5nUGFyYW1zXG4gICk6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIoXG4gICAgICBwYXJhbXMuc3Rha2VyS2V5LFxuICAgICAgcGFyYW1zLmZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgICAgcGFyYW1zLmNvdmVuYW50Tm9Db29yZFBrcy5tYXAoKGspID0+IEJ1ZmZlci5mcm9tKGssICdoZXgnKSksXG4gICAgICBwYXJhbXMuY292ZW5hbnRRdW9ydW0sXG4gICAgICBwYXJhbXMubWluU3Rha2luZ1RpbWVCbG9ja3MsXG4gICAgICBwYXJhbXMudW5ib25kaW5nVGltZVxuICAgICk7XG4gIH1cblxuICAvKiogU3BlbmQgcGF0aCB3aXRoIHRoZSBzdGFrZXIga2V5IGFuZCB0aGUgc3Rha2luZyB0aW1lbG9jayAqL1xuICBnZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpOiBhc3QuTWluaXNjcmlwdE5vZGUge1xuICAgIHJldHVybiB7IGFuZF92OiBbcGsodGhpcy5zdGFrZXJLZXkpLCB7IG9sZGVyOiB0aGlzLnN0YWtpbmdUaW1lTG9jayB9XSB9O1xuICB9XG5cbiAgLyoqIFNwZW5kIHBhdGggd2l0aCB0aGUgc3Rha2VyIGtleSBhbmQgdGhlIHVuYm9uZGluZyB0aW1lbG9jayAqL1xuICBnZXRVbmJvbmRpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHsgYW5kX3Y6IFtwayh0aGlzLnN0YWtlcktleSksIHsgb2xkZXI6IHRoaXMudW5ib25kaW5nVGltZUxvY2sgfV0gfTtcbiAgfVxuXG4gIC8qKiBTcGVuZCBwYXRoIHdpdGggdGhlIHN0YWtlciBrZXkgYW5kIHRoZSBjb3ZlbmFudCBrZXlzICovXG4gIGdldFVuYm9uZGluZ01pbmlzY3JpcHROb2RlKCk6IGFzdC5NaW5pc2NyaXB0Tm9kZSB7XG4gICAgcmV0dXJuIHsgYW5kX3Y6IFtwayh0aGlzLnN0YWtlcktleSksIHsgbXVsdGlfYTogbXVsdGlBcmdzKHRoaXMuY292ZW5hbnRUaHJlc2hvbGQsIHRoaXMuY292ZW5hbnRLZXlzKSB9XSB9O1xuICB9XG5cbiAgLyoqIFNwZW5kIHBhdGggd2l0aCB0aGUgZmluYWxpdHkgcHJvdmlkZXIga2V5cyBhbmQgdGhlIGNvdmVuYW50IGtleXMgKi9cbiAgZ2V0U2xhc2hpbmdNaW5pc2NyaXB0Tm9kZSgpOiBhc3QuTWluaXNjcmlwdE5vZGUge1xuICAgIHJldHVybiB7XG4gICAgICBhbmRfdjogW1xuICAgICAgICB7XG4gICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgIHBrKHRoaXMuc3Rha2VyS2V5KSxcbiAgICAgICAgICAgIHRoaXMuZmluYWxpdHlQcm92aWRlcktleXMubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgID8geyAndjpwayc6IHRoaXMuZmluYWxpdHlQcm92aWRlcktleXNbMF0udG9TdHJpbmcoJ2hleCcpIH1cbiAgICAgICAgICAgICAgOiB7ICd2Om11bHRpX2EnOiBtdWx0aUFyZ3MoMSwgdGhpcy5maW5hbGl0eVByb3ZpZGVyS2V5cykgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7IG11bHRpX2E6IG11bHRpQXJncyh0aGlzLmNvdmVuYW50VGhyZXNob2xkLCB0aGlzLmNvdmVuYW50S2V5cykgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgYSBzdGFraW5nIG91dHB1dC5cbiAgICpcbiAgICogVGhyZWUgc3BlbmQgcGF0aHM6XG4gICAqIC0gdGhlIHNsYXNoaW5nIHNjcmlwdCxcbiAgICogLSB0aGUgdW5ib25kaW5nIHNjcmlwdCxcbiAgICogLSB0aGUgdGltZWxvY2tlZCB1bnN0YWtpbmcgc2NyaXB0LlxuICAgKi9cbiAgZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKTogRGVzY3JpcHRvciB7XG4gICAgcmV0dXJuIHRhcHJvb3RTY3JpcHRPbmx5RnJvbUFzdChbXG4gICAgICB0aGlzLmdldFNsYXNoaW5nTWluaXNjcmlwdE5vZGUoKSxcbiAgICAgIFt0aGlzLmdldFVuYm9uZGluZ01pbmlzY3JpcHROb2RlKCksIHRoaXMuZ2V0U3Rha2luZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKV0sXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGRlc2NyaXB0b3IgZm9yIHRoZSB0aW1lbG9ja2VkIHVuYm9uZGluZyBzY3JpcHQuXG4gICAqL1xuICBnZXRVbmJvbmRpbmdUaW1lbG9ja0Rlc2NyaXB0b3IoKTogRGVzY3JpcHRvciB7XG4gICAgcmV0dXJuIHRhcHJvb3RTY3JpcHRPbmx5RnJvbUFzdCh0aGlzLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGRlc2NyaXB0b3Igd2l0aCB0d28gc2NyaXB0IHBhdGhzOiB0aGUgc2xhc2hpbmcgc2NyaXB0IGFuZCB0aGUgdGltZWxvY2tlZCB1bmJvbmRpbmcgc2NyaXB0LlxuICAgKi9cbiAgZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpOiBEZXNjcmlwdG9yIHtcbiAgICByZXR1cm4gdGFwcm9vdFNjcmlwdE9ubHlGcm9tQXN0KFt0aGlzLmdldFNsYXNoaW5nTWluaXNjcmlwdE5vZGUoKSwgdGhpcy5nZXRVbmJvbmRpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCldKTtcbiAgfVxufVxuIl19
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/babylon/index.ts"],"names":[],"mappings":"AAOA,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
|
@@ -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/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VEZXNjcmlwdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2JhYnlsb24vcGFyc2VEZXNjcmlwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBeUdBLHdEQStEQztBQVlELDREQTZDQztBQWpPRCxnREFBbUQ7QUFDbkQsNERBQXNFO0FBRXRFLDZDQUFpRDtBQWFqRCxTQUFTLFVBQVUsQ0FBQyxLQUFjO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDRCxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ25DLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUNELE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQVMsdUJBQXVCLENBQzlCLElBQXdCLEVBQ3hCLE9BQXVCO0lBRXZCLE1BQU0sT0FBTyxHQUFZO1FBQ3ZCLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQztL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QztRQUN6QyxvQkFBb0I7UUFDcEIsWUFBWTtRQUNaLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFDakIsc0JBQXNCLEVBQUUsWUFBWTtRQUNwQywrQkFBK0IsRUFBRSxxQkFBcUI7S0FDdkQsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXNjcmlwdG9yLCBhc3QgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFBhdHRlcm5NYXRjaGVyLCBQYXR0ZXJuIH0gZnJvbSAnQGJpdGdvL3V0eG8tY29yZS9kZXNjcmlwdG9yJztcblxuaW1wb3J0IHsgZ2V0VW5zcGVuZGFibGVLZXkgfSBmcm9tICcuL2Rlc2NyaXB0b3InO1xuXG5leHBvcnQgdHlwZSBQYXJzZWRTdGFraW5nRGVzY3JpcHRvciA9IHtcbiAgc3Rha2VyS2V5OiBCdWZmZXI7XG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXTtcbiAgY292ZW5hbnRLZXlzOiBCdWZmZXJbXTtcbiAgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc3Rha2luZ1RpbWVMb2NrOiBudW1iZXI7XG4gIHNsYXNoaW5nTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgdW5ib25kaW5nTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgdGltZWxvY2tNaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xufTtcblxuZnVuY3Rpb24gcGFyc2VNdWx0aShtdWx0aTogdW5rbm93bik6IFtudW1iZXIsIHN0cmluZ1tdXSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShtdWx0aSkgfHwgbXVsdGkubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aSBzdHJ1Y3R1cmU6IG5vdCBhbiBhcnJheSBvciBlbXB0eScpO1xuICB9XG4gIGNvbnN0IFt0aHJlc2hvbGQsIC4uLmtleXNdID0gbXVsdGk7XG4gIGlmICh0eXBlb2YgdGhyZXNob2xkICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtdWx0aSBzdHJ1Y3R1cmU6IHRocmVzaG9sZCBpcyBub3QgYSBudW1iZXInKTtcbiAgfVxuICBpZiAoIWtleXMuZXZlcnkoKGspID0+IHR5cGVvZiBrID09PSAnc3RyaW5nJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbXVsdGkgc3RydWN0dXJlOiBub3QgYWxsIGtleXMgYXJlIHN0cmluZ3MnKTtcbiAgfVxuICByZXR1cm4gW3RocmVzaG9sZCwga2V5c107XG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pbGF0ZXJhbFRpbWVsb2NrKFxuICBub2RlOiBhc3QuTWluaXNjcmlwdE5vZGUsXG4gIG1hdGNoZXI6IFBhdHRlcm5NYXRjaGVyXG4pOiB7IGtleTogc3RyaW5nOyB0aW1lbG9jazogbnVtYmVyIH0gfCBudWxsIHtcbiAgY29uc3QgcGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW3sgJ3Y6cGsnOiB7ICR2YXI6ICdrZXknIH0gfSwgeyBvbGRlcjogeyAkdmFyOiAndGltZWxvY2snIH0gfV0sXG4gIH07XG4gIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5tYXRjaChub2RlLCBwYXR0ZXJuKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgbWF0Y2gua2V5ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcigna2V5IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuICBpZiAodHlwZW9mIG1hdGNoLnRpbWVsb2NrICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcigndGltZWxvY2sgbXVzdCBiZSBhIG51bWJlcicpO1xuICB9XG4gIHJldHVybiB7IGtleTogbWF0Y2gua2V5LCB0aW1lbG9jazogbWF0Y2gudGltZWxvY2sgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTbGFzaGluZ05vZGUoXG4gIHNsYXNoaW5nTm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlLFxuICBtYXRjaGVyOiBQYXR0ZXJuTWF0Y2hlclxuKToge1xuICBzdGFrZXJLZXk6IHN0cmluZztcbiAgZmluYWxpdHlQcm92aWRlcktleXM6IEJ1ZmZlcltdO1xuICBjb3ZlbmFudEtleXM6IEJ1ZmZlcltdO1xuICBjb3ZlbmFudFRocmVzaG9sZDogbnVtYmVyO1xufSB7XG4gIGNvbnN0IHNsYXNoaW5nUGF0dGVybjogUGF0dGVybiA9IHtcbiAgICBhbmRfdjogW1xuICAgICAge1xuICAgICAgICBhbmRfdjogW3sgJ3Y6cGsnOiB7ICR2YXI6ICdzdGFrZXJLZXknIH0gfSwgeyAkdmFyOiAnZmluYWxpdHlQcm92aWRlcktleU9yTXVsdGknIH1dLFxuICAgICAgfSxcbiAgICAgIHsgbXVsdGlfYTogeyAkdmFyOiAnY292ZW5hbnRNdWx0aScgfSB9LFxuICAgIF0sXG4gIH07XG5cbiAgY29uc3Qgc2xhc2hpbmdNYXRjaCA9IG1hdGNoZXIubWF0Y2goc2xhc2hpbmdOb2RlLCBzbGFzaGluZ1BhdHRlcm4pO1xuICBpZiAoIXNsYXNoaW5nTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsYXNoaW5nIG5vZGUgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgcGF0dGVybicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzbGFzaGluZ01hdGNoLnN0YWtlcktleSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YWtlcktleSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICBjb25zdCBbY292ZW5hbnRUaHJlc2hvbGQsIGNvdmVuYW50S2V5U3RyaW5nc10gPSBwYXJzZU11bHRpKHNsYXNoaW5nTWF0Y2guY292ZW5hbnRNdWx0aSk7XG4gIGNvbnN0IGNvdmVuYW50S2V5cyA9IGNvdmVuYW50S2V5U3RyaW5ncy5tYXAoKGspID0+IEJ1ZmZlci5mcm9tKGssICdoZXgnKSk7XG5cbiAgbGV0IGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBCdWZmZXJbXTtcbiAgY29uc3QgZnBLZXlPck11bHRpID0gc2xhc2hpbmdNYXRjaC5maW5hbGl0eVByb3ZpZGVyS2V5T3JNdWx0aSBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG4gIGlmICgndjpwaycgaW4gZnBLZXlPck11bHRpKSB7XG4gICAgZmluYWxpdHlQcm92aWRlcktleXMgPSBbQnVmZmVyLmZyb20oZnBLZXlPck11bHRpWyd2OnBrJ10sICdoZXgnKV07XG4gIH0gZWxzZSBpZiAoJ3Y6bXVsdGlfYScgaW4gZnBLZXlPck11bHRpKSB7XG4gICAgY29uc3QgW3RocmVzaG9sZCwga2V5U3RyaW5nc10gPSBwYXJzZU11bHRpKGZwS2V5T3JNdWx0aVsndjptdWx0aV9hJ10pO1xuICAgIGlmICh0aHJlc2hvbGQgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmluYWxpdHkgcHJvdmlkZXIgbXVsdGkgdGhyZXNob2xkIG11c3QgYmUgMScpO1xuICAgIH1cbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyA9IGtleVN0cmluZ3MubWFwKChrKSA9PiBCdWZmZXIuZnJvbShrLCAnaGV4JykpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBmaW5hbGl0eSBwcm92aWRlciBrZXkgc3RydWN0dXJlJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0YWtlcktleTogc2xhc2hpbmdNYXRjaC5zdGFrZXJLZXksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgY292ZW5hbnRLZXlzLFxuICAgIGNvdmVuYW50VGhyZXNob2xkLFxuICB9O1xufVxuXG4vKipcbiAqIEByZXR1cm4gcGFyc2VkIHN0YWtpbmcgZGVzY3JpcHRvciBjb21wb25lbnRzIG9yIG51bGwgaWYgdGhlIGRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHN0YWtpbmcgcGF0dGVybi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZSk6IFBhcnNlZFN0YWtpbmdEZXNjcmlwdG9yIHwgbnVsbCB7XG4gIGNvbnN0IHBhdHRlcm46IFBhdHRlcm4gPSB7XG4gICAgdHI6IFtcbiAgICAgIGdldFVuc3BlbmRhYmxlS2V5KCksXG4gICAgICBbeyAkdmFyOiAnc2xhc2hpbmdNaW5pc2NyaXB0Tm9kZScgfSwgW3sgJHZhcjogJ3VuYm9uZGluZ01pbmlzY3JpcHROb2RlJyB9LCB7ICR2YXI6ICd0aW1lbG9ja01pbmlzY3JpcHROb2RlJyB9XV0sXG4gICAgXSxcbiAgfTtcblxuICBjb25zdCBtYXRjaGVyID0gbmV3IFBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCBwYXR0ZXJuKTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2xhc2hpbmdOb2RlID0gcmVzdWx0LnNsYXNoaW5nTWluaXNjcmlwdE5vZGUgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBjb25zdCB1bmJvbmRpbmdOb2RlID0gcmVzdWx0LnVuYm9uZGluZ01pbmlzY3JpcHROb2RlIGFzIGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgY29uc3QgdGltZWxvY2tOb2RlID0gcmVzdWx0LnRpbWVsb2NrTWluaXNjcmlwdE5vZGUgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuXG4gIC8vIFZlcmlmeSBzbGFzaGluZyBub2RlIHNoYXBlOiBhbmRfdihbYW5kX3YoW3BrLCBway9tdWx0aV9hXSksIG11bHRpX2FdKVxuICBjb25zdCB7XG4gICAgc3Rha2VyS2V5OiBzdGFrZXJLZXkxLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgIGNvdmVuYW50S2V5cyxcbiAgICBjb3ZlbmFudFRocmVzaG9sZCxcbiAgfSA9IHBhcnNlU2xhc2hpbmdOb2RlKHNsYXNoaW5nTm9kZSwgbWF0Y2hlcik7XG5cbiAgLy8gVmVyaWZ5IHVuYm9uZGluZyBub2RlIHNoYXBlOiBhbmRfdihbcGssIG11bHRpX2FdKVxuICBjb25zdCB1bmJvbmRpbmdQYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIGFuZF92OiBbeyAndjpwayc6IHsgJHZhcjogJ3N0YWtlcktleTInIH0gfSwgeyBtdWx0aV9hOiB7ICR2YXI6ICdjb3ZlbmFudE11bHRpMicgfSB9XSxcbiAgfTtcblxuICBjb25zdCB1bmJvbmRpbmdNYXRjaCA9IG1hdGNoZXIubWF0Y2godW5ib25kaW5nTm9kZSwgdW5ib25kaW5nUGF0dGVybik7XG4gIGlmICghdW5ib25kaW5nTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYm9uZGluZyBub2RlIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm4nKTtcbiAgfVxuXG4gIC8vIFZlcmlmeSB1bmJvbmRpbmcgdGltZWxvY2sgbm9kZSBzaGFwZTogYW5kX3YoW3BrLCBvbGRlcl0pXG4gIGNvbnN0IHVuaWxhdGVyYWxUaW1lbG9jayA9IHBhcnNlVW5pbGF0ZXJhbFRpbWVsb2NrKHRpbWVsb2NrTm9kZSwgbWF0Y2hlcik7XG4gIGlmICghdW5pbGF0ZXJhbFRpbWVsb2NrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGtleTogc3Rha2VyS2V5MywgdGltZWxvY2s6IHN0YWtpbmdUaW1lTG9jayB9ID0gdW5pbGF0ZXJhbFRpbWVsb2NrO1xuXG4gIC8vIFZlcmlmeSBhbGwgc3Rha2VyIGtleXMgYXJlIHRoZSBzYW1lXG4gIGlmIChzdGFrZXJLZXkxICE9PSB1bmJvbmRpbmdNYXRjaC5zdGFrZXJLZXkyIHx8IHVuYm9uZGluZ01hdGNoLnN0YWtlcktleTIgIT09IHN0YWtlcktleTMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWtlciBrZXlzIG11c3QgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwgbm9kZXMnKTtcbiAgfVxuXG4gIGNvbnN0IHN0YWtlcktleSA9IEJ1ZmZlci5mcm9tKHN0YWtlcktleTEsICdoZXgnKTtcblxuICByZXR1cm4ge1xuICAgIHN0YWtlcktleSxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gICAgc3Rha2luZ1RpbWVMb2NrLFxuICAgIHNsYXNoaW5nTWluaXNjcmlwdE5vZGU6IHNsYXNoaW5nTm9kZSxcbiAgICB1bmJvbmRpbmdNaW5pc2NyaXB0Tm9kZTogdW5ib25kaW5nTm9kZSxcbiAgICB0aW1lbG9ja01pbmlzY3JpcHROb2RlOiB0aW1lbG9ja05vZGUsXG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIFBhcnNlZFVuYm9uZGluZ0Rlc2NyaXB0b3IgPSB7XG4gIHN0YWtlcktleTogQnVmZmVyO1xuICBmaW5hbGl0eVByb3ZpZGVyS2V5czogQnVmZmVyW107XG4gIGNvdmVuYW50S2V5czogQnVmZmVyW107XG4gIGNvdmVuYW50VGhyZXNob2xkOiBudW1iZXI7XG4gIHVuYm9uZGluZ1RpbWVMb2NrOiBudW1iZXI7XG4gIHNsYXNoaW5nTWluaXNjcmlwdE5vZGU6IGFzdC5NaW5pc2NyaXB0Tm9kZTtcbiAgdW5ib25kaW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZTogYXN0Lk1pbmlzY3JpcHROb2RlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvcihcbiAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciB8IGFzdC5EZXNjcmlwdG9yTm9kZVxuKTogUGFyc2VkVW5ib25kaW5nRGVzY3JpcHRvciB8IG51bGwge1xuICBjb25zdCBwYXR0ZXJuOiBQYXR0ZXJuID0ge1xuICAgIHRyOiBbZ2V0VW5zcGVuZGFibGVLZXkoKSwgW3sgJHZhcjogJ3NsYXNoaW5nTWluaXNjcmlwdE5vZGUnIH0sIHsgJHZhcjogJ3VuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUnIH1dXSxcbiAgfTtcblxuICBjb25zdCBtYXRjaGVyID0gbmV3IFBhdHRlcm5NYXRjaGVyKCk7XG4gIGNvbnN0IGRlc2NyaXB0b3JOb2RlID0gZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IgPyBhc3QuZnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvcikgOiBkZXNjcmlwdG9yO1xuICBjb25zdCByZXN1bHQgPSBtYXRjaGVyLm1hdGNoKGRlc2NyaXB0b3JOb2RlLCBwYXR0ZXJuKTtcblxuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc2xhc2hpbmdOb2RlID0gcmVzdWx0LnNsYXNoaW5nTWluaXNjcmlwdE5vZGUgYXMgYXN0Lk1pbmlzY3JpcHROb2RlO1xuICBjb25zdCB1bmJvbmRpbmdUaW1lbG9ja05vZGUgPSByZXN1bHQudW5ib25kaW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSBhcyBhc3QuTWluaXNjcmlwdE5vZGU7XG5cbiAgY29uc3Qge1xuICAgIHN0YWtlcktleTogc3Rha2VyS2V5MSxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gIH0gPSBwYXJzZVNsYXNoaW5nTm9kZShzbGFzaGluZ05vZGUsIG1hdGNoZXIpO1xuXG4gIGNvbnN0IHVuaWxhdGVyYWxUaW1lbG9jayA9IHBhcnNlVW5pbGF0ZXJhbFRpbWVsb2NrKHVuYm9uZGluZ1RpbWVsb2NrTm9kZSwgbWF0Y2hlcik7XG4gIGlmICghdW5pbGF0ZXJhbFRpbWVsb2NrKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGtleTogc3Rha2VyS2V5MiwgdGltZWxvY2s6IHVuYm9uZGluZ1RpbWVMb2NrIH0gPSB1bmlsYXRlcmFsVGltZWxvY2s7XG5cbiAgaWYgKHN0YWtlcktleTEgIT09IHN0YWtlcktleTIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YWtlciBrZXlzIG11c3QgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwgbm9kZXMnKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3Rha2VyS2V5OiBCdWZmZXIuZnJvbShzdGFrZXJLZXkxLCAnaGV4JyksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMsXG4gICAgY292ZW5hbnRLZXlzLFxuICAgIGNvdmVuYW50VGhyZXNob2xkLFxuICAgIHVuYm9uZGluZ1RpbWVMb2NrLFxuICAgIHNsYXNoaW5nTWluaXNjcmlwdE5vZGU6IHNsYXNoaW5nTm9kZSxcbiAgICB1bmJvbmRpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlOiB1bmJvbmRpbmdUaW1lbG9ja05vZGUsXG4gIH07XG59XG4iXX0=
|