@bitgo-beta/utxo-staking 1.1.1-beta.91 → 1.1.1-beta.910
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 +38 -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 +48 -0
- package/dist/cjs/src/babylon/descriptor.d.ts.map +1 -0
- package/dist/cjs/src/babylon/descriptor.js +97 -0
- package/dist/cjs/src/babylon/index.d.ts +8 -0
- package/dist/cjs/src/babylon/index.d.ts.map +1 -0
- package/dist/cjs/src/babylon/index.js +51 -0
- package/dist/cjs/src/babylon/network.d.ts +7 -0
- package/dist/cjs/src/babylon/network.d.ts.map +1 -0
- package/dist/cjs/src/babylon/network.js +66 -0
- package/dist/cjs/src/babylon/params.mainnet.json +152 -0
- package/dist/cjs/src/babylon/params.testnet.json +212 -0
- package/dist/cjs/src/babylon/parseDescriptor.d.ts +26 -0
- 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 +6 -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 +40 -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 +24 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.d.ts.map +1 -0
- package/dist/cjs/src/babylon/undelegation/UndelegationResponse.js +55 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts +3 -0
- package/dist/cjs/src/babylon/undelegation/index.d.ts.map +1 -0
- package/dist/{src → cjs/src/babylon/undelegation}/index.js +3 -4
- package/dist/cjs/src/babylon/undelegation/unbonding.d.ts +16 -0
- 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/{src → cjs/src}/coreDao/transaction.d.ts +16 -7
- 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 +3 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/cjs/src/index.js +39 -0
- 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.d.ts.map +1 -0
- package/dist/esm/babylon/delegationMessage.js +239 -0
- package/dist/esm/babylon/descriptor.d.ts +48 -0
- package/dist/esm/babylon/descriptor.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/esm/babylon/parseDescriptor.js +155 -0
- package/dist/esm/babylon/stakingManager.d.ts +6 -0
- package/dist/esm/babylon/stakingManager.d.ts.map +1 -0
- package/dist/esm/babylon/stakingManager.js +83 -0
- package/dist/esm/babylon/stakingParams.d.ts +40 -0
- package/dist/esm/babylon/stakingParams.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/esm/babylon/undelegation/unbonding.js +70 -0
- package/dist/esm/coreDao/descriptor.d.ts +18 -0
- package/dist/{src → esm}/coreDao/descriptor.d.ts.map +1 -1
- 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.d.ts.map +1 -0
- package/dist/esm/coreDao/transaction.js +30 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/{src → esm}/index.d.ts.map +1 -1
- package/dist/esm/index.js +3 -0
- package/package.json +42 -12
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -63
- package/dist/src/coreDao/descriptor.js +0 -37
- package/dist/src/coreDao/opReturn.js +0 -183
- package/dist/src/coreDao/transaction.d.ts.map +0 -1
- package/dist/src/coreDao/transaction.js +0 -26
- package/dist/src/index.d.ts +0 -3
- package/dist/src/transaction.d.ts +0 -32
- package/dist/src/transaction.d.ts.map +0 -1
- package/dist/src/transaction.js +0 -54
- /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 → esm}/coreDao/index.d.ts.map +0 -0
- /package/dist/{src → esm}/coreDao/opReturn.d.ts.map +0 -0
|
@@ -0,0 +1,338 @@
|
|
|
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
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const vendor = __importStar(require("@bitgo-beta/babylonlabs-io-btc-staking-ts"));
|
|
41
|
+
const bitcoinjslib = __importStar(require("bitcoinjs-lib"));
|
|
42
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
43
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
44
|
+
const descriptor_1 = require("@bitgo-beta/utxo-core/descriptor");
|
|
45
|
+
const testutil_1 = require("@bitgo-beta/utxo-core/testutil");
|
|
46
|
+
const babylonlabs_io_btc_staking_ts_1 = require("@bitgo-beta/babylonlabs-io-btc-staking-ts");
|
|
47
|
+
const babylon_1 = require("../../../src/babylon");
|
|
48
|
+
const parseDescriptor_1 = require("../../../src/babylon/parseDescriptor");
|
|
49
|
+
const fixtures_utils_1 = require("../fixtures.utils");
|
|
50
|
+
const key_utils_1 = require("./key.utils");
|
|
51
|
+
const vendor_utils_1 = require("./vendor.utils");
|
|
52
|
+
function getStakingTransactionTreeVendor(builder, amount, utxos, feeRateSatB, signers, descriptorBuilder) {
|
|
53
|
+
const staking = builder.createStakingTransaction(amount, utxos, feeRateSatB);
|
|
54
|
+
const stakingWithdraw = builder.createWithdrawStakingExpiredPsbt(staking.transaction, feeRateSatB);
|
|
55
|
+
const unbonding = builder.createUnbondingTransaction(staking.transaction);
|
|
56
|
+
const unbondingWithdraw = builder.createWithdrawEarlyUnbondedTransaction(unbonding.transaction, feeRateSatB);
|
|
57
|
+
const unbondingSlashing = builder.createUnbondingOutputSlashingPsbt(unbonding.transaction);
|
|
58
|
+
const signSequence = [signers.staker];
|
|
59
|
+
if ('finalityProvider' in signers) {
|
|
60
|
+
signSequence.push(signers.finalityProvider, ...signers.covenant);
|
|
61
|
+
}
|
|
62
|
+
const unbondingSlashingWithdraw = signSequence
|
|
63
|
+
? builder.createWithdrawSlashingPsbt((0, babylon_1.forceFinalizePsbt)((0, babylon_1.getSignedPsbt)(unbondingSlashing.psbt, descriptorBuilder.getUnbondingDescriptor(), signSequence, {
|
|
64
|
+
finalize: false,
|
|
65
|
+
}), builder.network).extractTransaction(), feeRateSatB)
|
|
66
|
+
: undefined;
|
|
67
|
+
const slashing = builder.createStakingOutputSlashingPsbt(staking.transaction);
|
|
68
|
+
const slashingSigned = signSequence
|
|
69
|
+
? (0, babylon_1.getSignedPsbt)(slashing.psbt, descriptorBuilder.getStakingDescriptor(), signSequence, {
|
|
70
|
+
finalize: false,
|
|
71
|
+
})
|
|
72
|
+
: undefined;
|
|
73
|
+
const slashingWithdraw = slashingSigned
|
|
74
|
+
? builder.createWithdrawSlashingPsbt((0, babylon_1.forceFinalizePsbt)(slashingSigned.toBuffer(), builder.network).extractTransaction(), feeRateSatB)
|
|
75
|
+
: undefined;
|
|
76
|
+
return {
|
|
77
|
+
staking,
|
|
78
|
+
stakingWithdraw,
|
|
79
|
+
unbonding,
|
|
80
|
+
unbondingWithdraw,
|
|
81
|
+
unbondingSlashing,
|
|
82
|
+
unbondingSlashingWithdraw,
|
|
83
|
+
slashing,
|
|
84
|
+
slashingSigned,
|
|
85
|
+
slashingSignedBase64: slashingSigned?.toBuffer().toString('base64'),
|
|
86
|
+
slashingWithdraw,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function spendStakingOutput(stakingTx, descriptorBuilder, type, changeAddress, { sequence }) {
|
|
90
|
+
const network = utxolib.networks.bitcoin;
|
|
91
|
+
const witnessUtxoNumber = stakingTx.transaction.outs[0];
|
|
92
|
+
const witnessUtxo = {
|
|
93
|
+
script: witnessUtxoNumber.script,
|
|
94
|
+
value: BigInt(witnessUtxoNumber.value),
|
|
95
|
+
};
|
|
96
|
+
const selectTapLeafScript = wasm_utxo_1.Miniscript.fromString(wasm_utxo_1.ast.formatNode(type === 'unstaking'
|
|
97
|
+
? descriptorBuilder.getStakingTimelockMiniscriptNode()
|
|
98
|
+
: descriptorBuilder.getUnbondingMiniscriptNode()), 'tap');
|
|
99
|
+
return (0, descriptor_1.createPsbt)({
|
|
100
|
+
network,
|
|
101
|
+
}, [
|
|
102
|
+
{
|
|
103
|
+
hash: stakingTx.transaction.getId(),
|
|
104
|
+
index: 0,
|
|
105
|
+
witnessUtxo,
|
|
106
|
+
descriptor: descriptorBuilder.getStakingDescriptor(),
|
|
107
|
+
selectTapLeafScript,
|
|
108
|
+
sequence,
|
|
109
|
+
},
|
|
110
|
+
], [
|
|
111
|
+
{
|
|
112
|
+
script: utxolib.address.toOutputScript(changeAddress, network),
|
|
113
|
+
value: BigInt(witnessUtxoNumber.value) - 1000n,
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
}
|
|
117
|
+
function getTestnetStakingParamsWithCovenant(params, covenantKeys) {
|
|
118
|
+
return {
|
|
119
|
+
...params,
|
|
120
|
+
covenantNoCoordPks: covenantKeys.map((pk) => (0, key_utils_1.getXOnlyPubkey)(pk).toString('hex')),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function wpkhDescriptor(key) {
|
|
124
|
+
return wasm_utxo_1.Descriptor.fromString(wasm_utxo_1.ast.formatNode({ wpkh: key.publicKey.toString('hex') }), 'definite');
|
|
125
|
+
}
|
|
126
|
+
function mockUtxo(descriptor) {
|
|
127
|
+
const scriptPubKey = Buffer.from(descriptor.scriptPubkey());
|
|
128
|
+
const witnessScript = Buffer.from(descriptor.encode());
|
|
129
|
+
return {
|
|
130
|
+
rawTxHex: undefined,
|
|
131
|
+
txid: Buffer.alloc(32).fill(0x11).toString('hex'),
|
|
132
|
+
value: 666666,
|
|
133
|
+
vout: 0,
|
|
134
|
+
redeemScript: undefined,
|
|
135
|
+
witnessScript: witnessScript.toString('hex'),
|
|
136
|
+
scriptPubKey: scriptPubKey.toString('hex'),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function parseScript(key, script) {
|
|
140
|
+
if (!Buffer.isBuffer(script)) {
|
|
141
|
+
throw new Error('script must be a buffer');
|
|
142
|
+
}
|
|
143
|
+
const ms = wasm_utxo_1.Miniscript.fromBitcoinScript(script, 'tap');
|
|
144
|
+
return {
|
|
145
|
+
script: script.toString('hex'),
|
|
146
|
+
miniscript: ms.toString(),
|
|
147
|
+
miniscriptAst: wasm_utxo_1.ast.fromMiniscript(ms),
|
|
148
|
+
scriptASM: utxolib.script.toASM(script).split(/\s+/),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function parseScripts(scripts) {
|
|
152
|
+
if (typeof scripts !== 'object' || scripts === null) {
|
|
153
|
+
throw new Error('scripts must be an object');
|
|
154
|
+
}
|
|
155
|
+
return Object.fromEntries(Object.entries(scripts).map(([key, value]) => [key, parseScript(key, value)]));
|
|
156
|
+
}
|
|
157
|
+
async function assertScriptsEqualFixture(fixtureName, builder, scripts) {
|
|
158
|
+
await (0, fixtures_utils_1.assertEqualsFixture)(fixtureName, {
|
|
159
|
+
builder: (0, testutil_1.toPlainObject)(builder),
|
|
160
|
+
scripts: parseScripts(scripts),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function assertEqualScripts(descriptorBuilder, builder) {
|
|
164
|
+
for (const [key, script] of Object.entries(builder)) {
|
|
165
|
+
switch (key) {
|
|
166
|
+
case 'timelockScript':
|
|
167
|
+
(0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getStakingTimelockMiniscriptNode());
|
|
168
|
+
break;
|
|
169
|
+
case 'unbondingScript':
|
|
170
|
+
(0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getUnbondingMiniscriptNode());
|
|
171
|
+
break;
|
|
172
|
+
case 'slashingScript':
|
|
173
|
+
(0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getSlashingMiniscriptNode());
|
|
174
|
+
break;
|
|
175
|
+
case 'unbondingTimelockScript':
|
|
176
|
+
(0, fixtures_utils_1.assertEqualsMiniscript)(script, descriptorBuilder.getUnbondingTimelockMiniscriptNode());
|
|
177
|
+
break;
|
|
178
|
+
default:
|
|
179
|
+
throw new Error(`unexpected script key: ${key}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function assertEqualOutputScript(outputInfo, descriptor) {
|
|
184
|
+
assert_1.default.strictEqual(outputInfo.scriptPubKey.toString('hex'), Buffer.from(descriptor.scriptPubkey()).toString('hex'));
|
|
185
|
+
}
|
|
186
|
+
function describeWithKeys(tag, finalityProviderKeys, covenantKeys, stakingParams, { signIntermediateTxs = false } = {}) {
|
|
187
|
+
const stakerKey = (0, key_utils_1.getECKey)('staker');
|
|
188
|
+
const covenantThreshold = stakingParams.covenantQuorum;
|
|
189
|
+
const stakingTimelock = stakingParams.minStakingTimeBlocks;
|
|
190
|
+
const unbondingTimelock = stakingParams.unbondingTime;
|
|
191
|
+
const vendorBuilder = new vendor.StakingScriptData((0, key_utils_1.getXOnlyPubkey)(stakerKey), finalityProviderKeys.map(key_utils_1.getXOnlyPubkey), covenantKeys.map(key_utils_1.getXOnlyPubkey), covenantThreshold, stakingTimelock, unbondingTimelock);
|
|
192
|
+
const descriptorBuilder = new babylon_1.BabylonDescriptorBuilder((0, key_utils_1.getXOnlyPubkey)(stakerKey), finalityProviderKeys.map(key_utils_1.getXOnlyPubkey), covenantKeys.map(key_utils_1.getXOnlyPubkey), covenantThreshold, stakingTimelock, unbondingTimelock);
|
|
193
|
+
describe(`Babylon Staking [${tag}]`, function () {
|
|
194
|
+
it('generates expected staking scripts', async function () {
|
|
195
|
+
await assertScriptsEqualFixture(`test/fixtures/babylon/scripts.${tag}.json`, vendorBuilder, vendorBuilder.buildScripts());
|
|
196
|
+
});
|
|
197
|
+
it('matches inner taproot scripts', function () {
|
|
198
|
+
assertEqualScripts(descriptorBuilder, vendorBuilder.buildScripts());
|
|
199
|
+
});
|
|
200
|
+
it('matches output scripts', function () {
|
|
201
|
+
assertEqualOutputScript(vendor.deriveStakingOutputInfo(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getStakingDescriptor());
|
|
202
|
+
assertEqualOutputScript(
|
|
203
|
+
/* I don't know why this is called deriveSlashingOutput */
|
|
204
|
+
vendor.deriveSlashingOutput(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getUnbondingTimelockDescriptor());
|
|
205
|
+
assertEqualOutputScript(vendor.deriveUnbondingOutputInfo(vendorBuilder.buildScripts(), bitcoinjslib.networks.bitcoin), descriptorBuilder.getUnbondingDescriptor());
|
|
206
|
+
});
|
|
207
|
+
it('round-trip parseStakingDescriptor', function () {
|
|
208
|
+
const descriptor = descriptorBuilder.getStakingDescriptor();
|
|
209
|
+
const parsed = (0, parseDescriptor_1.parseStakingDescriptor)(descriptor);
|
|
210
|
+
(0, assert_1.default)(parsed);
|
|
211
|
+
assert_1.default.deepStrictEqual(parsed.slashingMiniscriptNode, descriptorBuilder.getSlashingMiniscriptNode());
|
|
212
|
+
assert_1.default.deepStrictEqual(parsed.unbondingMiniscriptNode, descriptorBuilder.getUnbondingMiniscriptNode());
|
|
213
|
+
assert_1.default.deepStrictEqual(parsed.timelockMiniscriptNode, descriptorBuilder.getStakingTimelockMiniscriptNode());
|
|
214
|
+
assert_1.default.strictEqual((0, parseDescriptor_1.parseStakingDescriptor)(descriptorBuilder.getUnbondingDescriptor()), null);
|
|
215
|
+
assert_1.default.strictEqual((0, parseDescriptor_1.parseStakingDescriptor)(descriptorBuilder.getUnbondingTimelockDescriptor()), null);
|
|
216
|
+
});
|
|
217
|
+
it('round-trip parseUnbondingDescriptor', function () {
|
|
218
|
+
const descriptor = descriptorBuilder.getUnbondingDescriptor();
|
|
219
|
+
const parsed = (0, parseDescriptor_1.parseUnbondingDescriptor)(descriptor);
|
|
220
|
+
(0, assert_1.default)(parsed);
|
|
221
|
+
assert_1.default.deepStrictEqual(parsed.slashingMiniscriptNode, descriptorBuilder.getSlashingMiniscriptNode());
|
|
222
|
+
assert_1.default.deepStrictEqual(parsed.unbondingTimelockMiniscriptNode, descriptorBuilder.getUnbondingTimelockMiniscriptNode());
|
|
223
|
+
assert_1.default.deepStrictEqual(parsed.stakerKey, descriptorBuilder.stakerKey);
|
|
224
|
+
assert_1.default.deepStrictEqual((0, babylon_1.sortedKeys)(parsed.finalityProviderKeys), (0, babylon_1.sortedKeys)(descriptorBuilder.finalityProviderKeys));
|
|
225
|
+
assert_1.default.deepStrictEqual((0, babylon_1.sortedKeys)(parsed.covenantKeys), (0, babylon_1.sortedKeys)(descriptorBuilder.covenantKeys));
|
|
226
|
+
assert_1.default.strictEqual(parsed.covenantThreshold, descriptorBuilder.covenantThreshold);
|
|
227
|
+
assert_1.default.strictEqual(parsed.unbondingTimeLock, descriptorBuilder.unbondingTimeLock);
|
|
228
|
+
assert_1.default.strictEqual((0, parseDescriptor_1.parseUnbondingDescriptor)(descriptorBuilder.getStakingDescriptor()), null);
|
|
229
|
+
assert_1.default.strictEqual((0, parseDescriptor_1.parseUnbondingDescriptor)(descriptorBuilder.getUnbondingTimelockDescriptor()), null);
|
|
230
|
+
});
|
|
231
|
+
describe('Transaction Sets', async function () {
|
|
232
|
+
const stakerMainWalletKey = (0, key_utils_1.getECKey)('stakerMainWallet');
|
|
233
|
+
const mainWallet = wpkhDescriptor(stakerMainWalletKey);
|
|
234
|
+
const amount = 55555;
|
|
235
|
+
const changeAddress = (0, descriptor_1.createAddressFromDescriptor)(mainWallet, undefined, utxolib.networks.bitcoin);
|
|
236
|
+
const feeRateSatB = 2;
|
|
237
|
+
const utxo = mockUtxo(mainWallet);
|
|
238
|
+
let stakingTx;
|
|
239
|
+
before('setup stakingTx', function () {
|
|
240
|
+
stakingTx = vendor.stakingTransaction(vendorBuilder.buildScripts(), amount, changeAddress, [mockUtxo(mainWallet)], bitcoinjslib.networks.bitcoin, feeRateSatB);
|
|
241
|
+
});
|
|
242
|
+
it('has expected transactions', async function () {
|
|
243
|
+
await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/stakingTransaction.${tag}.json`, stakingTx);
|
|
244
|
+
// simply one staking output and one change output
|
|
245
|
+
// nothing special
|
|
246
|
+
assert_1.default.deepStrictEqual(stakingTx.transaction.outs, [
|
|
247
|
+
{
|
|
248
|
+
script: Buffer.from(descriptorBuilder.getStakingDescriptor().scriptPubkey()),
|
|
249
|
+
value: amount,
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
script: utxolib.address.toOutputScript(changeAddress, utxolib.networks.bitcoin),
|
|
253
|
+
value: utxo.value - amount - stakingTx.fee,
|
|
254
|
+
},
|
|
255
|
+
]);
|
|
256
|
+
});
|
|
257
|
+
if (finalityProviderKeys.length !== 1) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const finalityProvider = finalityProviderKeys[0];
|
|
261
|
+
it('has expected transactions (vendorStaking.Staking)', async function () {
|
|
262
|
+
const vendorStakingTxBuilder = new vendor.Staking(bitcoinjslib.networks.bitcoin, (0, babylon_1.toStakerInfo)(stakerKey, changeAddress), stakingParams, [(0, key_utils_1.getXOnlyPubkey)(finalityProvider).toString('hex')], stakingParams.minStakingTimeBlocks);
|
|
263
|
+
const txTree = getStakingTransactionTreeVendor(vendorStakingTxBuilder, amount, [utxo], feeRateSatB, signIntermediateTxs
|
|
264
|
+
? {
|
|
265
|
+
staker: stakerKey,
|
|
266
|
+
finalityProvider,
|
|
267
|
+
covenant: covenantKeys,
|
|
268
|
+
covenantThreshold: covenantThreshold,
|
|
269
|
+
}
|
|
270
|
+
: { staker: stakerKey }, descriptorBuilder);
|
|
271
|
+
await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/txTree.${tag}.json`, txTree);
|
|
272
|
+
});
|
|
273
|
+
it('creates MsgCreateBTCDelegation', async function () {
|
|
274
|
+
const fVendor = vendor_utils_1.getVendorMsgCreateBtcDelegation;
|
|
275
|
+
const fBitGo = vendor_utils_1.getBitGoUtxoStakingMsgCreateBtcDelegation;
|
|
276
|
+
for (const f of [fVendor, fBitGo]) {
|
|
277
|
+
await (0, fixtures_utils_1.assertEqualsFixture)(`test/fixtures/babylon/msgCreateBTCDelegation.${tag}.json`, await f(bitcoinjslib.networks.bitcoin, stakerKey, finalityProvider, descriptorBuilder, [{ ...stakingParams, version: 0, btcActivationHeight: 0 }], changeAddress, amount, utxo, feeRateSatB, 800000), fixtures_utils_1.normalize, (a, b) => {
|
|
278
|
+
// The vendor library serializes the signature as BIP322, while
|
|
279
|
+
// our implementation serializes it as ECDSA.
|
|
280
|
+
// Strip the pop field from the MsgCreateBTCDelegation.
|
|
281
|
+
function stripPop(v) {
|
|
282
|
+
const vAny = v;
|
|
283
|
+
delete vAny['unsignedDelegationMsg']['value']['pop'];
|
|
284
|
+
}
|
|
285
|
+
stripPop(a);
|
|
286
|
+
stripPop(b);
|
|
287
|
+
assert_1.default.deepStrictEqual(a, b);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
async function testCreateTransaction(type, params) {
|
|
292
|
+
const unstakingPsbt = spendStakingOutput(stakingTx, descriptorBuilder, type, changeAddress, params);
|
|
293
|
+
const wrappedPsbt = (0, descriptor_1.toWrappedPsbt)(unstakingPsbt);
|
|
294
|
+
params.signers.forEach((signer) => {
|
|
295
|
+
(0, assert_1.default)((0, descriptor_1.getNewSignatureCount)((0, descriptor_1.signWithKey)(wrappedPsbt, signer)) > 0);
|
|
296
|
+
});
|
|
297
|
+
if (!params.finalize) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
wrappedPsbt.finalize();
|
|
301
|
+
const tx = (0, descriptor_1.toUtxoPsbt)(wrappedPsbt, utxolib.networks.bitcoin).extractTransaction();
|
|
302
|
+
await (0, fixtures_utils_1.assertTransactionEqualsFixture)(`test/fixtures/babylon/${type}Transaction.${tag}.json`, {
|
|
303
|
+
psbt: unstakingPsbt,
|
|
304
|
+
transaction: tx,
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
it('creates unstaking transaction', async function () {
|
|
308
|
+
await testCreateTransaction('unstaking', {
|
|
309
|
+
sequence: stakingParams.minStakingTimeBlocks,
|
|
310
|
+
signers: [stakerKey],
|
|
311
|
+
finalize: true,
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
it('creates unbonding transaction', async function () {
|
|
315
|
+
await testCreateTransaction('unbonding', signIntermediateTxs
|
|
316
|
+
? {
|
|
317
|
+
signers: [stakerKey, ...covenantKeys],
|
|
318
|
+
finalize: true,
|
|
319
|
+
}
|
|
320
|
+
: {
|
|
321
|
+
signers: [stakerKey],
|
|
322
|
+
finalize: false,
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
function describeWithKeysFromStakingParams(tag, finalityProviderKeys, stakingParams) {
|
|
329
|
+
describeWithKeys(tag, finalityProviderKeys, stakingParams.covenantNoCoordPks.map((pk) => (0, key_utils_1.fromXOnlyPublicKey)(Buffer.from(pk, 'hex'))), stakingParams);
|
|
330
|
+
}
|
|
331
|
+
function describeWithMockKeys(tag, stakingParams, finalityProviderKeys, covenantKeys) {
|
|
332
|
+
describeWithKeys(tag, finalityProviderKeys, covenantKeys, getTestnetStakingParamsWithCovenant(stakingParams, covenantKeys), {
|
|
333
|
+
signIntermediateTxs: true,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
describeWithKeysFromStakingParams('testnet', [(0, key_utils_1.fromXOnlyPublicKey)(babylon_1.testnetFinalityProvider0)], (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByVersion)(5, (0, babylon_1.getStakingParams)('testnet')));
|
|
337
|
+
describeWithMockKeys('testnetMock', (0, babylonlabs_io_btc_staking_ts_1.getBabylonParamByVersion)(5, (0, babylon_1.getStakingParams)('testnet')), (0, key_utils_1.getECKeys)('finalityProvider', 1), (0, key_utils_1.getECKeys)('covenant', 9));
|
|
338
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24vdHJhbnNhY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBRTVCLGtGQUFvRTtBQUNwRSw0REFBOEM7QUFDOUMsOERBQWdEO0FBRWhELGdEQUErRDtBQUMvRCxpRUFPMEM7QUFDMUMsNkRBQStEO0FBQy9ELDZGQUFxRjtBQUVyRixrREFROEI7QUFDOUIsMEVBQXdHO0FBQ3hHLHNEQUsyQjtBQUUzQiwyQ0FBc0Y7QUFDdEYsaURBQTRHO0FBcUI1RyxTQUFTLCtCQUErQixDQUN0QyxPQUF1QixFQUN2QixNQUFjLEVBQ2QsS0FBb0IsRUFDcEIsV0FBbUIsRUFDbkIsT0FPK0IsRUFDL0IsaUJBQTJDO0lBRTNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ25HLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDMUUsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsc0NBQXNDLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RyxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDM0YsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxrQkFBa0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztR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QW1DLEVBQ25DLG9CQUF1QyxFQUN2QyxZQUErQjtJQUUvQixnQkFBZ0IsQ0FDZCxHQUFHLEVBQ0gsb0JBQW9CLEVBQ3BCLFlBQVksRUFDWixtQ0FBbUMsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLEVBQ2hFO1FBQ0UsbUJBQW1CLEVBQUUsSUFBSTtLQUMxQixDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQsaUNBQWlDLENBQy9CLFNBQVMsRUFDVCxDQUFDLElBQUEsOEJBQWtCLEVBQUMsa0NBQXdCLENBQUMsQ0FBQyxFQUM5QyxJQUFBLHdEQUF3QixFQUFDLENBQUMsRUFBRSxJQUFBLDBCQUFnQixFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQ3pELENBQUM7QUFDRixvQkFBb0IsQ0FDbEIsYUFBYSxFQUNiLElBQUEsd0RBQXdCLEVBQUMsQ0FBQyxFQUFFLElBQUEsMEJBQWdCLEVBQUMsU0FBUyxDQUFDLENBQUMsRUFDeEQsSUFBQSxxQkFBUyxFQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUNoQyxJQUFBLHFCQUFTLEVBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyB2ZW5kb3IgZnJvbSAnQGJpdGdvLWJldGEvYmFieWxvbmxhYnMtaW8tYnRjLXN0YWtpbmctdHMnO1xuaW1wb3J0ICogYXMgYml0Y29pbmpzbGliIGZyb20gJ2JpdGNvaW5qcy1saWInO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBFQ1BhaXJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5pbXBvcnQgeyBhc3QsIERlc2NyaXB0b3IsIE1pbmlzY3JpcHQgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7XG4gIGNyZWF0ZUFkZHJlc3NGcm9tRGVzY3JpcHRvcixcbiAgY3JlYXRlUHNidCxcbiAgZ2V0TmV3U2lnbmF0dXJlQ291bnQsXG4gIHNpZ25XaXRoS2V5LFxuICB0b1V0eG9Qc2J0LFxuICB0b1dyYXBwZWRQc2J0LFxufSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWNvcmUvZGVzY3JpcHRvcic7XG5pbXBvcnQgeyB0b1BsYWluT2JqZWN0IH0gZnJvbSAnQGJpdGdvLWJldGEvdXR4by1jb3JlL3Rlc3R1dGlsJztcbmltcG9ydCB7IGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbiB9IGZyb20gJ0BiaXRnby1iZXRhL2JhYnlsb25sYWJzLWlvLWJ0Yy1zdGFraW5nLXRzJztcblxuaW1wb3J0IHtcbiAgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyLFxuICB0ZXN0bmV0RmluYWxpdHlQcm92aWRlcjAsXG4gIGdldFNpZ25lZFBzYnQsXG4gIGdldFN0YWtpbmdQYXJhbXMsXG4gIHRvU3Rha2VySW5mbyxcbiAgZm9yY2VGaW5hbGl6ZVBzYnQsXG4gIHNvcnRlZEtleXMsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uJztcbmltcG9ydCB7IHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3IsIHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvciB9IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uL3BhcnNlRGVzY3JpcHRvcic7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIGFzc2VydEVxdWFsc0ZpeHR1cmUsXG4gIGFzc2VydEVxdWFsc01pbmlzY3JpcHQsXG4gIGFzc2VydFRyYW5zYWN0aW9uRXF1YWxzRml4dHVyZSxcbn0gZnJvbSAnLi4vZml4dHVyZXMudXRpbHMnO1xuXG5pbXBvcnQgeyBmcm9tWE9ubHlQdWJsaWNLZXksIGdldEVDS2V5LCBnZXRFQ0tleXMsIGdldFhPbmx5UHVia2V5IH0gZnJvbSAnLi9rZXkudXRpbHMnO1xuaW1wb3J0IHsgZ2V0Qml0R29VdHhvU3Rha2luZ01zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb24sIGdldFZlbmRvck1zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb24gfSBmcm9tICcuL3ZlbmRvci51dGlscyc7XG5cbnR5cGUgV2l0aEZlZTxUPiA9IFQgJiB7IGZlZTogbnVtYmVyIH07XG50eXBlIFRyYW5zYWN0aW9uV2l0aEZlZSA9IFdpdGhGZWU8eyB0cmFuc2FjdGlvbjogYml0Y29pbmpzbGliLlRyYW5zYWN0aW9uIH0+O1xudHlwZSBQc2J0V2l0aEZlZSA9IFdpdGhGZWU8eyBwc2J0OiBiaXRjb2luanNsaWIuUHNidCB9PjtcblxudHlwZSBUcmFuc2FjdGlvblRyZWUgPSB7XG4gIHN0YWtpbmc6IFRyYW5zYWN0aW9uV2l0aEZlZTtcbiAgc3Rha2luZ1dpdGhkcmF3OiBQc2J0V2l0aEZlZTtcblxuICB1bmJvbmRpbmc6IFRyYW5zYWN0aW9uV2l0aEZlZTtcbiAgdW5ib25kaW5nV2l0aGRyYXc6IFBzYnRXaXRoRmVlO1xuICB1bmJvbmRpbmdTbGFzaGluZzogUHNidFdpdGhGZWU7XG4gIHVuYm9uZGluZ1NsYXNoaW5nV2l0aGRyYXc6IFBzYnRXaXRoRmVlIHwgdW5kZWZpbmVkO1xuXG4gIHNsYXNoaW5nOiBQc2J0V2l0aEZlZTtcbiAgc2xhc2hpbmdXaXRoZHJhdzogUHNidFdpdGhGZWUgfCB1bmRlZmluZWQ7XG4gIHNsYXNoaW5nU2lnbmVkOiBiaXRjb2luanNsaWIuUHNidCB8IHVuZGVmaW5lZDtcbiAgc2xhc2hpbmdTaWduZWRCYXNlNjQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn07XG5cbmZ1bmN0aW9uIGdldFN0YWtpbmdUcmFuc2FjdGlvblRyZWVWZW5kb3IoXG4gIGJ1aWxkZXI6IHZlbmRvci5TdGFraW5nLFxuICBhbW91bnQ6IG51bWJlcixcbiAgdXR4b3M6IHZlbmRvci5VVFhPW10sXG4gIGZlZVJhdGVTYXRCOiBudW1iZXIsXG4gIHNpZ25lcnM6XG4gICAgfCB7XG4gICAgICAgIHN0YWtlcjogRUNQYWlySW50ZXJmYWNlO1xuICAgICAgICBmaW5hbGl0eVByb3ZpZGVyOiBFQ1BhaXJJbnRlcmZhY2U7XG4gICAgICAgIGNvdmVuYW50OiBFQ1BhaXJJbnRlcmZhY2VbXTtcbiAgICAgICAgY292ZW5hbnRUaHJlc2hvbGQ6IG51bWJlcjtcbiAgICAgIH1cbiAgICB8IHsgc3Rha2VyOiBFQ1BhaXJJbnRlcmZhY2UgfSxcbiAgZGVzY3JpcHRvckJ1aWxkZXI6IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlclxuKTogVHJhbnNhY3Rpb25UcmVlIHtcbiAgY29uc3Qgc3Rha2luZyA9IGJ1aWxkZXIuY3JlYXRlU3Rha2luZ1RyYW5zYWN0aW9uKGFtb3VudCwgdXR4b3MsIGZlZVJhdGVTYXRCKTtcbiAgY29uc3Qgc3Rha2luZ1dpdGhkcmF3ID0gYnVpbGRlci5jcmVhdGVXaXRoZHJhd1N0YWtpbmdFeHBpcmVkUHNidChzdGFraW5nLnRyYW5zYWN0aW9uLCBmZWVSYXRlU2F0Qik7XG4gIGNvbnN0IHVuYm9uZGluZyA9IGJ1aWxkZXIuY3JlYXRlVW5ib25kaW5nVHJhbnNhY3Rpb24oc3Rha2luZy50cmFuc2FjdGlvbik7XG4gIGNvbnN0IHVuYm9uZGluZ1dpdGhkcmF3ID0gYnVpbGRlci5jcmVhdGVXaXRoZHJhd0Vhcmx5VW5ib25kZWRUcmFuc2FjdGlvbih1bmJvbmRpbmcudHJhbnNhY3Rpb24sIGZlZVJhdGVTYXRCKTtcbiAgY29uc3QgdW5ib25kaW5nU2xhc2hpbmcgPSBidWlsZGVyLmNyZWF0ZVVuYm9uZGluZ091dHB1dFNsYXNoaW5nUHNidCh1bmJvbmRpbmcudHJhbnNhY3Rpb24pO1xuICBjb25zdCBzaWduU2VxdWVuY2UgPSBbc2lnbmVycy5zdGFrZXJdO1xuICBpZiAoJ2ZpbmFsaXR5UHJvdmlkZXInIGluIHNpZ25lcnMpIHtcbiAgICBzaWduU2VxdWVuY2UucHVzaChzaWduZXJzLmZpbmFsaXR5UHJvdmlkZXIsIC4uLnNpZ25lcnMuY292ZW5hbnQpO1xuICB9XG4gIGNvbnN0IHVuYm9uZGluZ1NsYXNoaW5nV2l0aGRyYXcgPSBzaWduU2VxdWVuY2VcbiAgICA/IGJ1aWxkZXIuY3JlYXRlV2l0aGRyYXdTbGFzaGluZ1BzYnQoXG4gICAgICAgIGZvcmNlRmluYWxpemVQc2J0KFxuICAgICAgICAgIGdldFNpZ25lZFBzYnQodW5ib25kaW5nU2xhc2hpbmcucHNidCwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpLCBzaWduU2VxdWVuY2UsIHtcbiAgICAgICAgICAgIGZpbmFsaXplOiBmYWxzZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBidWlsZGVyLm5ldHdvcmtcbiAgICAgICAgKS5leHRyYWN0VHJhbnNhY3Rpb24oKSxcbiAgICAgICAgZmVlUmF0ZVNhdEJcbiAgICAgIClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2xhc2hpbmcgPSBidWlsZGVyLmNyZWF0ZVN0YWtpbmdPdXRwdXRTbGFzaGluZ1BzYnQoc3Rha2luZy50cmFuc2FjdGlvbik7XG4gIGNvbnN0IHNsYXNoaW5nU2lnbmVkID0gc2lnblNlcXVlbmNlXG4gICAgPyBnZXRTaWduZWRQc2J0KHNsYXNoaW5nLnBzYnQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCksIHNpZ25TZXF1ZW5jZSwge1xuICAgICAgICBmaW5hbGl6ZTogZmFsc2UsXG4gICAgICB9KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzbGFzaGluZ1dpdGhkcmF3ID0gc2xhc2hpbmdTaWduZWRcbiAgICA/IGJ1aWxkZXIuY3JlYXRlV2l0aGRyYXdTbGFzaGluZ1BzYnQoXG4gICAgICAgIGZvcmNlRmluYWxpemVQc2J0KHNsYXNoaW5nU2lnbmVkLnRvQnVmZmVyKCksIGJ1aWxkZXIubmV0d29yaykuZXh0cmFjdFRyYW5zYWN0aW9uKCksXG4gICAgICAgIGZlZVJhdGVTYXRCXG4gICAgICApXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFraW5nLFxuICAgIHN0YWtpbmdXaXRoZHJhdyxcbiAgICB1bmJvbmRpbmcsXG4gICAgdW5ib25kaW5nV2l0aGRyYXcsXG4gICAgdW5ib25kaW5nU2xhc2hpbmcsXG4gICAgdW5ib25kaW5nU2xhc2hpbmdXaXRoZHJhdyxcbiAgICBzbGFzaGluZyxcbiAgICBzbGFzaGluZ1NpZ25lZCxcbiAgICBzbGFzaGluZ1NpZ25lZEJhc2U2NDogc2xhc2hpbmdTaWduZWQ/LnRvQnVmZmVyKCkudG9TdHJpbmcoJ2Jhc2U2NCcpLFxuICAgIHNsYXNoaW5nV2l0aGRyYXcsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNwZW5kU3Rha2luZ091dHB1dChcbiAgc3Rha2luZ1R4OiB2ZW5kb3IuVHJhbnNhY3Rpb25SZXN1bHQsXG4gIGRlc2NyaXB0b3JCdWlsZGVyOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIsXG4gIHR5cGU6ICd1bnN0YWtpbmcnIHwgJ3VuYm9uZGluZycsXG4gIGNoYW5nZUFkZHJlc3M6IHN0cmluZyxcbiAgeyBzZXF1ZW5jZSB9OiB7IHNlcXVlbmNlPzogbnVtYmVyIH1cbik6IHV0eG9saWIuUHNidCB7XG4gIGNvbnN0IG5ldHdvcmsgPSB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW47XG4gIGNvbnN0IHdpdG5lc3NVdHhvTnVtYmVyID0gc3Rha2luZ1R4LnRyYW5zYWN0aW9uLm91dHNbMF07XG4gIGNvbnN0IHdpdG5lc3NVdHhvID0ge1xuICAgIHNjcmlwdDogd2l0bmVzc1V0eG9OdW1iZXIuc2NyaXB0LFxuICAgIHZhbHVlOiBCaWdJbnQod2l0bmVzc1V0eG9OdW1iZXIudmFsdWUpLFxuICB9O1xuICBjb25zdCBzZWxlY3RUYXBMZWFmU2NyaXB0ID0gTWluaXNjcmlwdC5mcm9tU3RyaW5nKFxuICAgIGFzdC5mb3JtYXROb2RlKFxuICAgICAgdHlwZSA9PT0gJ3Vuc3Rha2luZydcbiAgICAgICAgPyBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpXG4gICAgICAgIDogZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKVxuICAgICksXG4gICAgJ3RhcCdcbiAgKTtcbiAgcmV0dXJuIGNyZWF0ZVBzYnQoXG4gICAge1xuICAgICAgbmV0d29yayxcbiAgICB9LFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaGFzaDogc3Rha2luZ1R4LnRyYW5zYWN0aW9uLmdldElkKCksXG4gICAgICAgIGluZGV4OiAwLFxuICAgICAgICB3aXRuZXNzVXR4byxcbiAgICAgICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSxcbiAgICAgICAgc2VsZWN0VGFwTGVhZlNjcmlwdCxcbiAgICAgICAgc2VxdWVuY2UsXG4gICAgICB9LFxuICAgIF0sXG4gICAgW1xuICAgICAge1xuICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChjaGFuZ2VBZGRyZXNzLCBuZXR3b3JrKSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCh3aXRuZXNzVXR4b051bWJlci52YWx1ZSkgLSAxMDAwbixcbiAgICAgIH0sXG4gICAgXVxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRUZXN0bmV0U3Rha2luZ1BhcmFtc1dpdGhDb3ZlbmFudChcbiAgcGFyYW1zOiB2ZW5kb3IuU3Rha2luZ1BhcmFtcyxcbiAgY292ZW5hbnRLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXVxuKTogdmVuZG9yLlN0YWtpbmdQYXJhbXMge1xuICByZXR1cm4ge1xuICAgIC4uLnBhcmFtcyxcbiAgICBjb3ZlbmFudE5vQ29vcmRQa3M6IGNvdmVuYW50S2V5cy5tYXAoKHBrKSA9PiBnZXRYT25seVB1YmtleShwaykudG9TdHJpbmcoJ2hleCcpKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd3BraERlc2NyaXB0b3Ioa2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZSk6IERlc2NyaXB0b3Ige1xuICByZXR1cm4gRGVzY3JpcHRvci5mcm9tU3RyaW5nKGFzdC5mb3JtYXROb2RlKHsgd3BraDoga2V5LnB1YmxpY0tleS50b1N0cmluZygnaGV4JykgfSksICdkZWZpbml0ZScpO1xufVxuXG5mdW5jdGlvbiBtb2NrVXR4byhkZXNjcmlwdG9yOiBEZXNjcmlwdG9yKTogdmVuZG9yLlVUWE8ge1xuICBjb25zdCBzY3JpcHRQdWJLZXkgPSBCdWZmZXIuZnJvbShkZXNjcmlwdG9yLnNjcmlwdFB1YmtleSgpKTtcbiAgY29uc3Qgd2l0bmVzc1NjcmlwdCA9IEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3IuZW5jb2RlKCkpO1xuICByZXR1cm4ge1xuICAgIHJhd1R4SGV4OiB1bmRlZmluZWQsXG4gICAgdHhpZDogQnVmZmVyLmFsbG9jKDMyKS5maWxsKDB4MTEpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICB2YWx1ZTogNjY2XzY2NixcbiAgICB2b3V0OiAwLFxuICAgIHJlZGVlbVNjcmlwdDogdW5kZWZpbmVkLFxuICAgIHdpdG5lc3NTY3JpcHQ6IHdpdG5lc3NTY3JpcHQudG9TdHJpbmcoJ2hleCcpLFxuICAgIHNjcmlwdFB1YktleTogc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTY3JpcHQoa2V5OiBzdHJpbmcsIHNjcmlwdDogdW5rbm93bikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihzY3JpcHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzY3JpcHQgbXVzdCBiZSBhIGJ1ZmZlcicpO1xuICB9XG4gIGNvbnN0IG1zID0gTWluaXNjcmlwdC5mcm9tQml0Y29pblNjcmlwdChzY3JpcHQsICd0YXAnKTtcbiAgcmV0dXJuIHtcbiAgICBzY3JpcHQ6IHNjcmlwdC50b1N0cmluZygnaGV4JyksXG4gICAgbWluaXNjcmlwdDogbXMudG9TdHJpbmcoKSxcbiAgICBtaW5pc2NyaXB0QXN0OiBhc3QuZnJvbU1pbmlzY3JpcHQobXMpLFxuICAgIHNjcmlwdEFTTTogdXR4b2xpYi5zY3JpcHQudG9BU00oc2NyaXB0KS5zcGxpdCgvXFxzKy8pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBwYXJzZVNjcmlwdHMoc2NyaXB0czogdW5rbm93bikge1xuICBpZiAodHlwZW9mIHNjcmlwdHMgIT09ICdvYmplY3QnIHx8IHNjcmlwdHMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NjcmlwdHMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgfVxuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHNjcmlwdHMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LCBwYXJzZVNjcmlwdChrZXksIHZhbHVlKV0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNzZXJ0U2NyaXB0c0VxdWFsRml4dHVyZShcbiAgZml4dHVyZU5hbWU6IHN0cmluZyxcbiAgYnVpbGRlcjogdmVuZG9yLlN0YWtpbmdTY3JpcHREYXRhLFxuICBzY3JpcHRzOiB1bmtub3duXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShmaXh0dXJlTmFtZSwge1xuICAgIGJ1aWxkZXI6IHRvUGxhaW5PYmplY3QoYnVpbGRlciksXG4gICAgc2NyaXB0czogcGFyc2VTY3JpcHRzKHNjcmlwdHMpLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0RXF1YWxTY3JpcHRzKGRlc2NyaXB0b3JCdWlsZGVyOiBCYWJ5bG9uRGVzY3JpcHRvckJ1aWxkZXIsIGJ1aWxkZXI6IHZlbmRvci5TdGFraW5nU2NyaXB0cykge1xuICBmb3IgKGNvbnN0IFtrZXksIHNjcmlwdF0gb2YgT2JqZWN0LmVudHJpZXMoYnVpbGRlcikgYXMgW2tleW9mIHZlbmRvci5TdGFraW5nU2NyaXB0cywgQnVmZmVyXVtdKSB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ3RpbWVsb2NrU2NyaXB0JzpcbiAgICAgICAgYXNzZXJ0RXF1YWxzTWluaXNjcmlwdChzY3JpcHQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdUaW1lbG9ja01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VuYm9uZGluZ1NjcmlwdCc6XG4gICAgICAgIGFzc2VydEVxdWFsc01pbmlzY3JpcHQoc2NyaXB0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSgpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzbGFzaGluZ1NjcmlwdCc6XG4gICAgICAgIGFzc2VydEVxdWFsc01pbmlzY3JpcHQoc2NyaXB0LCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VuYm9uZGluZ1RpbWVsb2NrU2NyaXB0JzpcbiAgICAgICAgYXNzZXJ0RXF1YWxzTWluaXNjcmlwdChzY3JpcHQsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmV4cGVjdGVkIHNjcmlwdCBrZXk6ICR7a2V5fWApO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRFcXVhbE91dHB1dFNjcmlwdChvdXRwdXRJbmZvOiB7IHNjcmlwdFB1YktleTogQnVmZmVyIH0sIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpIHtcbiAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dEluZm8uc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSwgQnVmZmVyLmZyb20oZGVzY3JpcHRvci5zY3JpcHRQdWJrZXkoKSkudG9TdHJpbmcoJ2hleCcpKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVXaXRoS2V5cyhcbiAgdGFnOiBzdHJpbmcsXG4gIGZpbmFsaXR5UHJvdmlkZXJLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXSxcbiAgY292ZW5hbnRLZXlzOiBFQ1BhaXJJbnRlcmZhY2VbXSxcbiAgc3Rha2luZ1BhcmFtczogdmVuZG9yLlN0YWtpbmdQYXJhbXMsXG4gIHsgc2lnbkludGVybWVkaWF0ZVR4cyA9IGZhbHNlIH0gPSB7fVxuKSB7XG4gIGNvbnN0IHN0YWtlcktleSA9IGdldEVDS2V5KCdzdGFrZXInKSBhcyBFQ1BhaXJJbnRlcmZhY2UgJiB7IHByaXZhdGVLZXk6IEJ1ZmZlciB9O1xuICBjb25zdCBjb3ZlbmFudFRocmVzaG9sZCA9IHN0YWtpbmdQYXJhbXMuY292ZW5hbnRRdW9ydW07XG4gIGNvbnN0IHN0YWtpbmdUaW1lbG9jayA9IHN0YWtpbmdQYXJhbXMubWluU3Rha2luZ1RpbWVCbG9ja3M7XG4gIGNvbnN0IHVuYm9uZGluZ1RpbWVsb2NrID0gc3Rha2luZ1BhcmFtcy51bmJvbmRpbmdUaW1lO1xuICBjb25zdCB2ZW5kb3JCdWlsZGVyID0gbmV3IHZlbmRvci5TdGFraW5nU2NyaXB0RGF0YShcbiAgICBnZXRYT25seVB1YmtleShzdGFrZXJLZXkpLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLm1hcChnZXRYT25seVB1YmtleSksXG4gICAgY292ZW5hbnRLZXlzLm1hcChnZXRYT25seVB1YmtleSksXG4gICAgY292ZW5hbnRUaHJlc2hvbGQsXG4gICAgc3Rha2luZ1RpbWVsb2NrLFxuICAgIHVuYm9uZGluZ1RpbWVsb2NrXG4gICk7XG5cbiAgY29uc3QgZGVzY3JpcHRvckJ1aWxkZXIgPSBuZXcgQmFieWxvbkRlc2NyaXB0b3JCdWlsZGVyKFxuICAgIGdldFhPbmx5UHVia2V5KHN0YWtlcktleSksXG4gICAgZmluYWxpdHlQcm92aWRlcktleXMubWFwKGdldFhPbmx5UHVia2V5KSxcbiAgICBjb3ZlbmFudEtleXMubWFwKGdldFhPbmx5UHVia2V5KSxcbiAgICBjb3ZlbmFudFRocmVzaG9sZCxcbiAgICBzdGFraW5nVGltZWxvY2ssXG4gICAgdW5ib25kaW5nVGltZWxvY2tcbiAgKTtcblxuICBkZXNjcmliZShgQmFieWxvbiBTdGFraW5nIFske3RhZ31dYCwgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdnZW5lcmF0ZXMgZXhwZWN0ZWQgc3Rha2luZyBzY3JpcHRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0U2NyaXB0c0VxdWFsRml4dHVyZShcbiAgICAgICAgYHRlc3QvZml4dHVyZXMvYmFieWxvbi9zY3JpcHRzLiR7dGFnfS5qc29uYCxcbiAgICAgICAgdmVuZG9yQnVpbGRlcixcbiAgICAgICAgdmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdtYXRjaGVzIGlubmVyIHRhcHJvb3Qgc2NyaXB0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydEVxdWFsU2NyaXB0cyhkZXNjcmlwdG9yQnVpbGRlciwgdmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnbWF0Y2hlcyBvdXRwdXQgc2NyaXB0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydEVxdWFsT3V0cHV0U2NyaXB0KFxuICAgICAgICB2ZW5kb3IuZGVyaXZlU3Rha2luZ091dHB1dEluZm8odmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSwgYml0Y29pbmpzbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpXG4gICAgICApO1xuICAgICAgYXNzZXJ0RXF1YWxPdXRwdXRTY3JpcHQoXG4gICAgICAgIC8qIEkgZG9uJ3Qga25vdyB3aHkgdGhpcyBpcyBjYWxsZWQgZGVyaXZlU2xhc2hpbmdPdXRwdXQgKi9cbiAgICAgICAgdmVuZG9yLmRlcml2ZVNsYXNoaW5nT3V0cHV0KHZlbmRvckJ1aWxkZXIuYnVpbGRTY3JpcHRzKCksIGJpdGNvaW5qc2xpYi5uZXR3b3Jrcy5iaXRjb2luKSxcbiAgICAgICAgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nVGltZWxvY2tEZXNjcmlwdG9yKClcbiAgICAgICk7XG4gICAgICBhc3NlcnRFcXVhbE91dHB1dFNjcmlwdChcbiAgICAgICAgdmVuZG9yLmRlcml2ZVVuYm9uZGluZ091dHB1dEluZm8odmVuZG9yQnVpbGRlci5idWlsZFNjcmlwdHMoKSwgYml0Y29pbmpzbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICBkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdEZXNjcmlwdG9yKClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncm91bmQtdHJpcCBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JCdWlsZGVyLmdldFN0YWtpbmdEZXNjcmlwdG9yKCk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yKGRlc2NyaXB0b3IpO1xuXG4gICAgICBhc3NlcnQocGFyc2VkKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnNsYXNoaW5nTWluaXNjcmlwdE5vZGUsIGRlc2NyaXB0b3JCdWlsZGVyLmdldFNsYXNoaW5nTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC51bmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSwgZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nTWluaXNjcmlwdE5vZGUoKSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC50aW1lbG9ja01pbmlzY3JpcHROb2RlLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nVGltZWxvY2tNaW5pc2NyaXB0Tm9kZSgpKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlU3Rha2luZ0Rlc2NyaXB0b3IoZGVzY3JpcHRvckJ1aWxkZXIuZ2V0VW5ib25kaW5nRGVzY3JpcHRvcigpKSwgbnVsbCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VTdGFraW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdUaW1lbG9ja0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JvdW5kLXRyaXAgcGFyc2VVbmJvbmRpbmdEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ0Rlc2NyaXB0b3IoKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yKTtcblxuICAgICAgYXNzZXJ0KHBhcnNlZCk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBhcnNlZC5zbGFzaGluZ01pbmlzY3JpcHROb2RlLCBkZXNjcmlwdG9yQnVpbGRlci5nZXRTbGFzaGluZ01pbmlzY3JpcHROb2RlKCkpO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChcbiAgICAgICAgcGFyc2VkLnVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUsXG4gICAgICAgIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ1RpbWVsb2NrTWluaXNjcmlwdE5vZGUoKVxuICAgICAgKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwocGFyc2VkLnN0YWtlcktleSwgZGVzY3JpcHRvckJ1aWxkZXIuc3Rha2VyS2V5KTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICAgIHNvcnRlZEtleXMocGFyc2VkLmZpbmFsaXR5UHJvdmlkZXJLZXlzKSxcbiAgICAgICAgc29ydGVkS2V5cyhkZXNjcmlwdG9yQnVpbGRlci5maW5hbGl0eVByb3ZpZGVyS2V5cylcbiAgICAgICk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHNvcnRlZEtleXMocGFyc2VkLmNvdmVuYW50S2V5cyksIHNvcnRlZEtleXMoZGVzY3JpcHRvckJ1aWxkZXIuY292ZW5hbnRLZXlzKSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLmNvdmVuYW50VGhyZXNob2xkLCBkZXNjcmlwdG9yQnVpbGRlci5jb3ZlbmFudFRocmVzaG9sZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocGFyc2VkLnVuYm9uZGluZ1RpbWVMb2NrLCBkZXNjcmlwdG9yQnVpbGRlci51bmJvbmRpbmdUaW1lTG9jayk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwYXJzZVVuYm9uZGluZ0Rlc2NyaXB0b3IoZGVzY3JpcHRvckJ1aWxkZXIuZ2V0U3Rha2luZ0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHBhcnNlVW5ib25kaW5nRGVzY3JpcHRvcihkZXNjcmlwdG9yQnVpbGRlci5nZXRVbmJvbmRpbmdUaW1lbG9ja0Rlc2NyaXB0b3IoKSksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1RyYW5zYWN0aW9uIFNldHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdGFrZXJNYWluV2FsbGV0S2V5ID0gZ2V0RUNLZXkoJ3N0YWtlck1haW5XYWxsZXQnKTtcbiAgICAgIGNvbnN0IG1haW5XYWxsZXQgPSB3cGtoRGVzY3JpcHRvcihzdGFrZXJNYWluV2FsbGV0S2V5KTtcbiAgICAgIGNvbnN0IGFtb3VudCA9IDU1XzU1NTtcbiAgICAgIGNvbnN0IGNoYW5nZUFkZHJlc3MgPSBjcmVhdGVBZGRyZXNzRnJvbURlc2NyaXB0b3IobWFpbldhbGxldCwgdW5kZWZpbmVkLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pO1xuICAgICAgY29uc3QgZmVlUmF0ZVNhdEIgPSAyO1xuICAgICAgY29uc3QgdXR4byA9IG1vY2tVdHhvKG1haW5XYWxsZXQpO1xuXG4gICAgICBsZXQgc3Rha2luZ1R4OiB2ZW5kb3IuVHJhbnNhY3Rpb25SZXN1bHQ7XG5cbiAgICAgIGJlZm9yZSgnc2V0dXAgc3Rha2luZ1R4JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzdGFraW5nVHggPSB2ZW5kb3Iuc3Rha2luZ1RyYW5zYWN0aW9uKFxuICAgICAgICAgIHZlbmRvckJ1aWxkZXIuYnVpbGRTY3JpcHRzKCksXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGNoYW5nZUFkZHJlc3MsXG4gICAgICAgICAgW21vY2tVdHhvKG1haW5XYWxsZXQpXSxcbiAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICBmZWVSYXRlU2F0QlxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgdHJhbnNhY3Rpb25zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi9zdGFraW5nVHJhbnNhY3Rpb24uJHt0YWd9Lmpzb25gLCBzdGFraW5nVHgpO1xuXG4gICAgICAgIC8vIHNpbXBseSBvbmUgc3Rha2luZyBvdXRwdXQgYW5kIG9uZSBjaGFuZ2Ugb3V0cHV0XG4gICAgICAgIC8vIG5vdGhpbmcgc3BlY2lhbFxuICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHN0YWtpbmdUeC50cmFuc2FjdGlvbi5vdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbShkZXNjcmlwdG9yQnVpbGRlci5nZXRTdGFraW5nRGVzY3JpcHRvcigpLnNjcmlwdFB1YmtleSgpKSxcbiAgICAgICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzY3JpcHQ6IHV0eG9saWIuYWRkcmVzcy50b091dHB1dFNjcmlwdChjaGFuZ2VBZGRyZXNzLCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLFxuICAgICAgICAgICAgdmFsdWU6IHV0eG8udmFsdWUgLSBhbW91bnQgLSBzdGFraW5nVHguZmVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChmaW5hbGl0eVByb3ZpZGVyS2V5cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaW5hbGl0eVByb3ZpZGVyID0gZmluYWxpdHlQcm92aWRlcktleXNbMF07XG5cbiAgICAgIGl0KCdoYXMgZXhwZWN0ZWQgdHJhbnNhY3Rpb25zICh2ZW5kb3JTdGFraW5nLlN0YWtpbmcpJywgYXN5bmMgZnVuY3Rpb24gKHRoaXM6IE1vY2hhLkNvbnRleHQpIHtcbiAgICAgICAgY29uc3QgdmVuZG9yU3Rha2luZ1R4QnVpbGRlciA9IG5ldyB2ZW5kb3IuU3Rha2luZyhcbiAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICB0b1N0YWtlckluZm8oc3Rha2VyS2V5LCBjaGFuZ2VBZGRyZXNzKSxcbiAgICAgICAgICBzdGFraW5nUGFyYW1zLFxuICAgICAgICAgIFtnZXRYT25seVB1YmtleShmaW5hbGl0eVByb3ZpZGVyKS50b1N0cmluZygnaGV4JyldLFxuICAgICAgICAgIHN0YWtpbmdQYXJhbXMubWluU3Rha2luZ1RpbWVCbG9ja3NcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0eFRyZWUgPSBnZXRTdGFraW5nVHJhbnNhY3Rpb25UcmVlVmVuZG9yKFxuICAgICAgICAgIHZlbmRvclN0YWtpbmdUeEJ1aWxkZXIsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIFt1dHhvXSxcbiAgICAgICAgICBmZWVSYXRlU2F0QixcbiAgICAgICAgICBzaWduSW50ZXJtZWRpYXRlVHhzXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzdGFrZXI6IHN0YWtlcktleSxcbiAgICAgICAgICAgICAgICBmaW5hbGl0eVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgIGNvdmVuYW50OiBjb3ZlbmFudEtleXMsXG4gICAgICAgICAgICAgICAgY292ZW5hbnRUaHJlc2hvbGQ6IGNvdmVuYW50VGhyZXNob2xkLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHsgc3Rha2VyOiBzdGFrZXJLZXkgfSxcbiAgICAgICAgICBkZXNjcmlwdG9yQnVpbGRlclxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi90eFRyZWUuJHt0YWd9Lmpzb25gLCB0eFRyZWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdjcmVhdGVzIE1zZ0NyZWF0ZUJUQ0RlbGVnYXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHR5cGUgRiA9IHR5cGVvZiBnZXRWZW5kb3JNc2dDcmVhdGVCdGNEZWxlZ2F0aW9uO1xuICAgICAgICBjb25zdCBmVmVuZG9yOiBGID0gZ2V0VmVuZG9yTXNnQ3JlYXRlQnRjRGVsZWdhdGlvbjtcbiAgICAgICAgY29uc3QgZkJpdEdvOiBGID0gZ2V0Qml0R29VdHhvU3Rha2luZ01zZ0NyZWF0ZUJ0Y0RlbGVnYXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBmIG9mIFtmVmVuZG9yLCBmQml0R29dKSB7XG4gICAgICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxzRml4dHVyZShcbiAgICAgICAgICAgIGB0ZXN0L2ZpeHR1cmVzL2JhYnlsb24vbXNnQ3JlYXRlQlRDRGVsZWdhdGlvbi4ke3RhZ30uanNvbmAsXG4gICAgICAgICAgICBhd2FpdCBmKFxuICAgICAgICAgICAgICBiaXRjb2luanNsaWIubmV0d29ya3MuYml0Y29pbixcbiAgICAgICAgICAgICAgc3Rha2VyS2V5LFxuICAgICAgICAgICAgICBmaW5hbGl0eVByb3ZpZGVyLFxuICAgICAgICAgICAgICBkZXNjcmlwdG9yQnVpbGRlcixcbiAgICAgICAgICAgICAgW3sgLi4uc3Rha2luZ1BhcmFtcywgdmVyc2lvbjogMCwgYnRjQWN0aXZhdGlvbkhlaWdodDogMCB9XSxcbiAgICAgICAgICAgICAgY2hhbmdlQWRkcmVzcyxcbiAgICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgICB1dHhvLFxuICAgICAgICAgICAgICBmZWVSYXRlU2F0QixcbiAgICAgICAgICAgICAgODAwXzAwMFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZSxcbiAgICAgICAgICAgIChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFRoZSB2ZW5kb3IgbGlicmFyeSBzZXJpYWxpemVzIHRoZSBzaWduYXR1cmUgYXMgQklQMzIyLCB3aGlsZVxuICAgICAgICAgICAgICAvLyBvdXIgaW1wbGVtZW50YXRpb24gc2VyaWFsaXplcyBpdCBhcyBFQ0RTQS5cbiAgICAgICAgICAgICAgLy8gU3RyaXAgdGhlIHBvcCBmaWVsZCBmcm9tIHRoZSBNc2dDcmVhdGVCVENEZWxlZ2F0aW9uLlxuICAgICAgICAgICAgICBmdW5jdGlvbiBzdHJpcFBvcCh2OiB1bmtub3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdkFueSA9IHYgYXMgYW55O1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB2QW55Wyd1bnNpZ25lZERlbGVnYXRpb25Nc2cnXVsndmFsdWUnXVsncG9wJ107XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RyaXBQb3AoYSk7XG4gICAgICAgICAgICAgIHN0cmlwUG9wKGIpO1xuICAgICAgICAgICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGEsIGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiB0ZXN0Q3JlYXRlVHJhbnNhY3Rpb24oXG4gICAgICAgIHR5cGU6ICd1bnN0YWtpbmcnIHwgJ3VuYm9uZGluZycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHNlcXVlbmNlPzogbnVtYmVyO1xuICAgICAgICAgIHNpZ25lcnM6IHV0eG9saWIuRUNQYWlySW50ZXJmYWNlW107XG4gICAgICAgICAgZmluYWxpemU6IGJvb2xlYW47XG4gICAgICAgIH1cbiAgICAgICkge1xuICAgICAgICBjb25zdCB1bnN0YWtpbmdQc2J0ID0gc3BlbmRTdGFraW5nT3V0cHV0KHN0YWtpbmdUeCwgZGVzY3JpcHRvckJ1aWxkZXIsIHR5cGUsIGNoYW5nZUFkZHJlc3MsIHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRQc2J0ID0gdG9XcmFwcGVkUHNidCh1bnN0YWtpbmdQc2J0KTtcbiAgICAgICAgcGFyYW1zLnNpZ25lcnMuZm9yRWFjaCgoc2lnbmVyKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0KGdldE5ld1NpZ25hdHVyZUNvdW50KHNpZ25XaXRoS2V5KHdyYXBwZWRQc2J0LCBzaWduZXIpKSA+IDApO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFwYXJhbXMuZmluYWxpemUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlZFBzYnQuZmluYWxpemUoKTtcbiAgICAgICAgY29uc3QgdHggPSB0b1V0eG9Qc2J0KHdyYXBwZWRQc2J0LCB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW4pLmV4dHJhY3RUcmFuc2FjdGlvbigpO1xuICAgICAgICBhd2FpdCBhc3NlcnRUcmFuc2FjdGlvbkVxdWFsc0ZpeHR1cmUoYHRlc3QvZml4dHVyZXMvYmFieWxvbi8ke3R5cGV9VHJhbnNhY3Rpb24uJHt0YWd9Lmpzb25gLCB7XG4gICAgICAgICAgcHNidDogdW5zdGFraW5nUHNidCxcbiAgICAgICAgICB0cmFuc2FjdGlvbjogdHgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpdCgnY3JlYXRlcyB1bnN0YWtpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRlc3RDcmVhdGVUcmFuc2FjdGlvbigndW5zdGFraW5nJywge1xuICAgICAgICAgIHNlcXVlbmNlOiBzdGFraW5nUGFyYW1zLm1pblN0YWtpbmdUaW1lQmxvY2tzLFxuICAgICAgICAgIHNpZ25lcnM6IFtzdGFrZXJLZXldLFxuICAgICAgICAgIGZpbmFsaXplOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnY3JlYXRlcyB1bmJvbmRpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHRlc3RDcmVhdGVUcmFuc2FjdGlvbihcbiAgICAgICAgICAndW5ib25kaW5nJyxcbiAgICAgICAgICBzaWduSW50ZXJtZWRpYXRlVHhzXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBbc3Rha2VyS2V5LCAuLi5jb3ZlbmFudEtleXNdLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBzaWduZXJzOiBbc3Rha2VyS2V5XSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZTogZmFsc2UsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVXaXRoS2V5c0Zyb21TdGFraW5nUGFyYW1zKFxuICB0YWc6IHN0cmluZyxcbiAgZmluYWxpdHlQcm92aWRlcktleXM6IEVDUGFpckludGVyZmFjZVtdLFxuICBzdGFraW5nUGFyYW1zOiB2ZW5kb3IuU3Rha2luZ1BhcmFtc1xuKSB7XG4gIGRlc2NyaWJlV2l0aEtleXMoXG4gICAgdGFnLFxuICAgIGZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgIHN0YWtpbmdQYXJhbXMuY292ZW5hbnROb0Nvb3JkUGtzLm1hcCgocGspID0+IGZyb21YT25seVB1YmxpY0tleShCdWZmZXIuZnJvbShwaywgJ2hleCcpKSksXG4gICAgc3Rha2luZ1BhcmFtc1xuICApO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVdpdGhNb2NrS2V5cyhcbiAgdGFnOiBzdHJpbmcsXG4gIHN0YWtpbmdQYXJhbXM6IHZlbmRvci5TdGFraW5nUGFyYW1zLFxuICBmaW5hbGl0eVByb3ZpZGVyS2V5czogRUNQYWlySW50ZXJmYWNlW10sXG4gIGNvdmVuYW50S2V5czogRUNQYWlySW50ZXJmYWNlW11cbikge1xuICBkZXNjcmliZVdpdGhLZXlzKFxuICAgIHRhZyxcbiAgICBmaW5hbGl0eVByb3ZpZGVyS2V5cyxcbiAgICBjb3ZlbmFudEtleXMsXG4gICAgZ2V0VGVzdG5ldFN0YWtpbmdQYXJhbXNXaXRoQ292ZW5hbnQoc3Rha2luZ1BhcmFtcywgY292ZW5hbnRLZXlzKSxcbiAgICB7XG4gICAgICBzaWduSW50ZXJtZWRpYXRlVHhzOiB0cnVlLFxuICAgIH1cbiAgKTtcbn1cblxuZGVzY3JpYmVXaXRoS2V5c0Zyb21TdGFraW5nUGFyYW1zKFxuICAndGVzdG5ldCcsXG4gIFtmcm9tWE9ubHlQdWJsaWNLZXkodGVzdG5ldEZpbmFsaXR5UHJvdmlkZXIwKV0sXG4gIGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbig1LCBnZXRTdGFraW5nUGFyYW1zKCd0ZXN0bmV0JykpXG4pO1xuZGVzY3JpYmVXaXRoTW9ja0tleXMoXG4gICd0ZXN0bmV0TW9jaycsXG4gIGdldEJhYnlsb25QYXJhbUJ5VmVyc2lvbig1LCBnZXRTdGFraW5nUGFyYW1zKCd0ZXN0bmV0JykpLFxuICBnZXRFQ0tleXMoJ2ZpbmFsaXR5UHJvdmlkZXInLCAxKSxcbiAgZ2V0RUNLZXlzKCdjb3ZlbmFudCcsIDkpXG4pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undelegation.d.ts","sourceRoot":"","sources":["../../../../../test/unit/babylon/undelegation.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
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
|
+
const assert_1 = __importDefault(require("assert"));
|
|
40
|
+
const fs_1 = require("fs");
|
|
41
|
+
const t = __importStar(require("io-ts"));
|
|
42
|
+
const PathReporter_1 = require("io-ts/lib/PathReporter");
|
|
43
|
+
const Either_1 = require("fp-ts/Either");
|
|
44
|
+
const utxolib = __importStar(require("@bitgo-beta/utxo-lib"));
|
|
45
|
+
const wasm_utxo_1 = require("@bitgo/wasm-utxo");
|
|
46
|
+
const babylon_1 = require("../../../src/babylon");
|
|
47
|
+
const undelegation_1 = require("../../../src/babylon/undelegation");
|
|
48
|
+
const parseDescriptor_1 = require("../../../src/babylon/parseDescriptor");
|
|
49
|
+
const fixtures_utils_1 = require("../fixtures.utils");
|
|
50
|
+
const BtcDelegation = t.type({
|
|
51
|
+
unbonding_time: t.number,
|
|
52
|
+
undelegation_response: undelegation_1.UndelegationResponse,
|
|
53
|
+
});
|
|
54
|
+
async function getFixture(txid) {
|
|
55
|
+
// As returned by https://babylon.nodes.guru/api#/Query/BTCDelegation
|
|
56
|
+
const BtcDelegationResponse = t.type({ btc_delegation: BtcDelegation }, 'BtcDelegationResponse');
|
|
57
|
+
const filename = __dirname + `/../../fixtures/babylon/rpc/btc_delegation/testnet.${txid}.json`;
|
|
58
|
+
const data = JSON.parse(await fs_1.promises.readFile(filename, 'utf8'));
|
|
59
|
+
const result = BtcDelegationResponse.decode(data);
|
|
60
|
+
if ((0, Either_1.isLeft)(result)) {
|
|
61
|
+
throw new Error(`Failed to decode fixture data for txid ${txid}: ${PathReporter_1.PathReporter.report(result).join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
return result.right.btc_delegation;
|
|
64
|
+
}
|
|
65
|
+
function toDescriptor(descriptor) {
|
|
66
|
+
return descriptor instanceof wasm_utxo_1.Descriptor
|
|
67
|
+
? descriptor
|
|
68
|
+
: wasm_utxo_1.Descriptor.fromStringDetectType(typeof descriptor === 'string' ? descriptor : wasm_utxo_1.ast.formatNode(descriptor));
|
|
69
|
+
}
|
|
70
|
+
function runTest(network, txid, descriptor) {
|
|
71
|
+
describe(`Unbonding transaction ${txid}`, function () {
|
|
72
|
+
let fixture;
|
|
73
|
+
let psbt;
|
|
74
|
+
let signatures;
|
|
75
|
+
before('should create a PSBT from the unbonding transaction', async function () {
|
|
76
|
+
fixture = await getFixture(txid);
|
|
77
|
+
const txBuffer = Buffer.from(fixture.undelegation_response.unbonding_tx_hex, 'hex');
|
|
78
|
+
const tx = utxolib.bitgo.createTransactionFromBuffer(txBuffer, network, {
|
|
79
|
+
amountType: 'bigint',
|
|
80
|
+
});
|
|
81
|
+
signatures = fixture.undelegation_response.covenant_unbonding_sig_list.map((sig) => (0, undelegation_1.toPartialSig)(sig));
|
|
82
|
+
psbt = (0, undelegation_1.toUnbondingPsbtWithSignatures)(tx, {
|
|
83
|
+
script: Buffer.from('5120b81e8691ab3c46bddf8ea43f776e4d64abf417a0fa5a4d09976c8aaadabbb6a0', 'hex'),
|
|
84
|
+
value: 100000n,
|
|
85
|
+
}, descriptor, signatures, utxolib.networks.testnet);
|
|
86
|
+
});
|
|
87
|
+
it('should have valid signatures', async function () {
|
|
88
|
+
(0, undelegation_1.assertValidSignatures)(psbt, 0, signatures);
|
|
89
|
+
});
|
|
90
|
+
it('should match the fixture', async function () {
|
|
91
|
+
await (0, fixtures_utils_1.assertTransactionEqualsFixture)('test/fixtures/babylon/unbonding.' + txid.substring(0, 4) + '.psbt.json', psbt);
|
|
92
|
+
});
|
|
93
|
+
it('can spend from unbonding output', async function () {
|
|
94
|
+
const parsed = (0, parseDescriptor_1.parseStakingDescriptor)(descriptor);
|
|
95
|
+
(0, assert_1.default)(parsed);
|
|
96
|
+
const descriptorBuilder = new babylon_1.BabylonDescriptorBuilder(parsed.stakerKey, parsed.finalityProviderKeys, parsed.covenantKeys, parsed.covenantThreshold, parsed.stakingTimeLock, fixture.unbonding_time);
|
|
97
|
+
assert_1.default.deepStrictEqual(descriptorBuilder.getUnbondingMiniscriptNode(), parsed.unbondingMiniscriptNode, 'Unbonding miniscript node does not match expected value');
|
|
98
|
+
(0, assert_1.default)(psbt.txOutputs.length === 1, 'Unbonding transaction should have exactly one output');
|
|
99
|
+
assert_1.default.deepStrictEqual(psbt.txOutputs[0].script, Buffer.from(descriptorBuilder.getUnbondingDescriptor().scriptPubkey()));
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
runTest(utxolib.networks.bitcoinPublicSignet, '5d277e1b29e5589074aea95ac8c8230fd911c2ec3c58774aafdef915619b772c', toDescriptor({
|
|
104
|
+
tr: [
|
|
105
|
+
'50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0',
|
|
106
|
+
[
|
|
107
|
+
{
|
|
108
|
+
and_v: [
|
|
109
|
+
{
|
|
110
|
+
and_v: [
|
|
111
|
+
{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' },
|
|
112
|
+
{ 'v:pk': 'd23c2c25e1fcf8fd1c21b9a402c19e2e309e531e45e92fb1e9805b6056b0cc76' },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
multi_a: [
|
|
117
|
+
6,
|
|
118
|
+
'0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25',
|
|
119
|
+
'113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0',
|
|
120
|
+
'17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4',
|
|
121
|
+
'3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c',
|
|
122
|
+
'40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df',
|
|
123
|
+
'79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0',
|
|
124
|
+
'd21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36',
|
|
125
|
+
'f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e',
|
|
126
|
+
'fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737',
|
|
127
|
+
],
|
|
128
|
+
},
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
[
|
|
132
|
+
{
|
|
133
|
+
and_v: [
|
|
134
|
+
{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' },
|
|
135
|
+
{
|
|
136
|
+
multi_a: [
|
|
137
|
+
6,
|
|
138
|
+
'0aee0509b16db71c999238a4827db945526859b13c95487ab46725357c9a9f25',
|
|
139
|
+
'113c3a32a9d320b72190a04a020a0db3976ef36972673258e9a38a364f3dc3b0',
|
|
140
|
+
'17921cf156ccb4e73d428f996ed11b245313e37e27c978ac4d2cc21eca4672e4',
|
|
141
|
+
'3bb93dfc8b61887d771f3630e9a63e97cbafcfcc78556a474df83a31a0ef899c',
|
|
142
|
+
'40afaf47c4ffa56de86410d8e47baa2bb6f04b604f4ea24323737ddc3fe092df',
|
|
143
|
+
'79a71ffd71c503ef2e2f91bccfc8fcda7946f4653cef0d9f3dde20795ef3b9f0',
|
|
144
|
+
'd21faf78c6751a0d38e6bd8028b907ff07e9a869a43fc837d6b3f8dff6119a36',
|
|
145
|
+
'f5199efae3f28bb82476163a7e458c7ad445d9bffb0682d10d3bdb2cb41f8e8e',
|
|
146
|
+
'fa9d882d45f4060bdb8042183828cd87544f1ea997380e586cab77d5fd698737',
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{ and_v: [{ 'v:pk': '1b443f34ddc1bbaef52a8c5162dfa5a84524636ec745292f949470369ee67391' }, { older: 10000 }] },
|
|
152
|
+
],
|
|
153
|
+
],
|
|
154
|
+
],
|
|
155
|
+
}));
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kZWxlZ2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L2JhYnlsb24vdW5kZWxlZ2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLDJCQUFvQztBQUVwQyx5Q0FBMkI7QUFDM0IseURBQXNEO0FBQ3RELHlDQUFzQztBQUN0Qyw4REFBZ0Q7QUFDaEQsZ0RBQW1EO0FBR25ELGtEQUFnRTtBQUNoRSxvRUFLMkM7QUFDM0MsMEVBQThFO0FBQzlFLHNEQUFtRTtBQUVuRSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzNCLGNBQWMsRUFBRSxDQUFDLENBQUMsTUFBTTtJQUN4QixxQkFBcUIsRUFBRSxtQ0FBb0I7Q0FDNUMsQ0FBQyxDQUFDO0FBSUgsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLHFFQUFxRTtJQUNyRSxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNqRyxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsc0RBQXNELElBQUksT0FBTyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxhQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxJQUFJLElBQUEsZUFBTSxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsSUFBSSxLQUFLLDJCQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElB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LEVBQUUsTUFBTSxFQUFFLGtFQUFrRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTthQUM5RztTQUNGO0tBQ0Y7Q0FDRixDQUFDLENBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IHByb21pc2VzIGFzIGZzIH0gZnJvbSAnZnMnO1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IFBhdGhSZXBvcnRlciB9IGZyb20gJ2lvLXRzL2xpYi9QYXRoUmVwb3J0ZXInO1xuaW1wb3J0IHsgaXNMZWZ0IH0gZnJvbSAnZnAtdHMvRWl0aGVyJztcbmltcG9ydCAqIGFzIHV0eG9saWIgZnJvbSAnQGJpdGdvLWJldGEvdXR4by1saWInO1xuaW1wb3J0IHsgYXN0LCBEZXNjcmlwdG9yIH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5pbXBvcnQgeyBQYXJ0aWFsU2lnIH0gZnJvbSAnYmlwMTc0L3NyYy9saWIvaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uJztcbmltcG9ydCB7XG4gIHRvUGFydGlhbFNpZyxcbiAgVW5kZWxlZ2F0aW9uUmVzcG9uc2UsXG4gIGFzc2VydFZhbGlkU2lnbmF0dXJlcyxcbiAgdG9VbmJvbmRpbmdQc2J0V2l0aFNpZ25hdHVyZXMsXG59IGZyb20gJy4uLy4uLy4uL3NyYy9iYWJ5bG9uL3VuZGVsZWdhdGlvbic7XG5pbXBvcnQgeyBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2JhYnlsb24vcGFyc2VEZXNjcmlwdG9yJztcbmltcG9ydCB7IGFzc2VydFRyYW5zYWN0aW9uRXF1YWxzRml4dHVyZSB9IGZyb20gJy4uL2ZpeHR1cmVzLnV0aWxzJztcblxuY29uc3QgQnRjRGVsZWdhdGlvbiA9IHQudHlwZSh7XG4gIHVuYm9uZGluZ190aW1lOiB0Lm51bWJlcixcbiAgdW5kZWxlZ2F0aW9uX3Jlc3BvbnNlOiBVbmRlbGVnYXRpb25SZXNwb25zZSxcbn0pO1xuXG50eXBlIEJ0Y0RlbGVnYXRpb24gPSB0LlR5cGVPZjx0eXBlb2YgQnRjRGVsZWdhdGlvbj47XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEZpeHR1cmUodHhpZDogc3RyaW5nKTogUHJvbWlzZTxCdGNEZWxlZ2F0aW9uPiB7XG4gIC8vIEFzIHJldHVybmVkIGJ5IGh0dHBzOi8vYmFieWxvbi5ub2Rlcy5ndXJ1L2FwaSMvUXVlcnkvQlRDRGVsZWdhdGlvblxuICBjb25zdCBCdGNEZWxlZ2F0aW9uUmVzcG9uc2UgPSB0LnR5cGUoeyBidGNfZGVsZWdhdGlvbjogQnRjRGVsZWdhdGlvbiB9LCAnQnRjRGVsZWdhdGlvblJlc3BvbnNlJyk7XG4gIGNvbnN0IGZpbGVuYW1lID0gX19kaXJuYW1lICsgYC8uLi8uLi9maXh0dXJlcy9iYWJ5bG9uL3JwYy9idGNfZGVsZWdhdGlvbi90ZXN0bmV0LiR7dHhpZH0uanNvbmA7XG4gIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVuYW1lLCAndXRmOCcpKTtcbiAgY29uc3QgcmVzdWx0ID0gQnRjRGVsZWdhdGlvblJlc3BvbnNlLmRlY29kZShkYXRhKTtcbiAgaWYgKGlzTGVmdChyZXN1bHQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZGVjb2RlIGZpeHR1cmUgZGF0YSBmb3IgdHhpZCAke3R4aWR9OiAke1BhdGhSZXBvcnRlci5yZXBvcnQocmVzdWx0KS5qb2luKCcsICcpfWApO1xuICB9XG4gIHJldHVybiByZXN1bHQucmlnaHQuYnRjX2RlbGVnYXRpb247XG59XG5cbnR5cGUgRGVzY3JpcHRvckxpa2UgPSBEZXNjcmlwdG9yIHwgYXN0LkRlc2NyaXB0b3JOb2RlIHwgc3RyaW5nO1xuXG5mdW5jdGlvbiB0b0Rlc2NyaXB0b3IoZGVzY3JpcHRvcjogRGVzY3JpcHRvckxpa2UpOiBEZXNjcmlwdG9yIHtcbiAgcmV0dXJuIGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yXG4gICAgPyBkZXNjcmlwdG9yXG4gICAgOiBEZXNjcmlwdG9yLmZyb21TdHJpbmdEZXRlY3RUeXBlKHR5cGVvZiBkZXNjcmlwdG9yID09PSAnc3RyaW5nJyA/IGRlc2NyaXB0b3IgOiBhc3QuZm9ybWF0Tm9kZShkZXNjcmlwdG9yKSk7XG59XG5cbmZ1bmN0aW9uIHJ1blRlc3QobmV0d29yazogdXR4b2xpYi5OZXR3b3JrLCB0eGlkOiBzdHJpbmcsIGRlc2NyaXB0b3I6IERlc2NyaXB0b3IpOiB2b2lkIHtcbiAgZGVzY3JpYmUoYFVuYm9uZGluZyB0cmFuc2FjdGlvbiAke3R4aWR9YCwgZnVuY3Rpb24gKCkge1xuICAgIGxldCBmaXh0dXJlOiBCdGNEZWxlZ2F0aW9uO1xuICAgIGxldCBwc2J0OiB1dHhvbGliLmJpdGdvLlV0eG9Qc2J0O1xuICAgIGxldCBzaWduYXR1cmVzOiBQYXJ0aWFsU2lnW107XG5cbiAgICBiZWZvcmUoJ3Nob3VsZCBjcmVhdGUgYSBQU0JUIGZyb20gdGhlIHVuYm9uZGluZyB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZpeHR1cmUgPSBhd2FpdCBnZXRGaXh0dXJlKHR4aWQpO1xuICAgICAgY29uc3QgdHhCdWZmZXIgPSBCdWZmZXIuZnJvbShmaXh0dXJlLnVuZGVsZWdhdGlvbl9yZXNwb25zZS51bmJvbmRpbmdfdHhfaGV4LCAnaGV4Jyk7XG4gICAgICBjb25zdCB0eCA9IHV0eG9saWIuYml0Z28uY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyKHR4QnVmZmVyLCBuZXR3b3JrLCB7XG4gICAgICAgIGFtb3VudFR5cGU6ICdiaWdpbnQnLFxuICAgICAgfSk7XG4gICAgICBzaWduYXR1cmVzID0gZml4dHVyZS51bmRlbGVnYXRpb25fcmVzcG9uc2UuY292ZW5hbnRfdW5ib25kaW5nX3NpZ19saXN0Lm1hcCgoc2lnKSA9PiB0b1BhcnRpYWxTaWcoc2lnKSk7XG5cbiAgICAgIHBzYnQgPSB0b1VuYm9uZGluZ1BzYnRXaXRoU2lnbmF0dXJlcyhcbiAgICAgICAgdHgsXG4gICAgICAgIHtcbiAgICAgICAgICBzY3JpcHQ6IEJ1ZmZlci5mcm9tKCc1MTIwYjgxZTg2OTFhYjNjNDZiZGRmOGVhNDNmNzc2ZTRkNjRhYmY0MTdhMGZhNWE0ZDA5OTc2YzhhYWFkYWJiYjZhMCcsICdoZXgnKSxcbiAgICAgICAgICB2YWx1ZTogMTAwXzAwMG4sXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0b3IsXG4gICAgICAgIHNpZ25hdHVyZXMsXG4gICAgICAgIHV0eG9saWIubmV0d29ya3MudGVzdG5ldFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB2YWxpZCBzaWduYXR1cmVzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0VmFsaWRTaWduYXR1cmVzKHBzYnQsIDAsIHNpZ25hdHVyZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXRjaCB0aGUgZml4dHVyZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IGFzc2VydFRyYW5zYWN0aW9uRXF1YWxzRml4dHVyZShcbiAgICAgICAgJ3Rlc3QvZml4dHVyZXMvYmFieWxvbi91bmJvbmRpbmcuJyArIHR4aWQuc3Vic3RyaW5nKDAsIDQpICsgJy5wc2J0Lmpzb24nLFxuICAgICAgICBwc2J0XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NhbiBzcGVuZCBmcm9tIHVuYm9uZGluZyBvdXRwdXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVN0YWtpbmdEZXNjcmlwdG9yKGRlc2NyaXB0b3IpO1xuICAgICAgYXNzZXJ0KHBhcnNlZCk7XG5cbiAgICAgIGNvbnN0IGRlc2NyaXB0b3JCdWlsZGVyID0gbmV3IEJhYnlsb25EZXNjcmlwdG9yQnVpbGRlcihcbiAgICAgICAgcGFyc2VkLnN0YWtlcktleSxcbiAgICAgICAgcGFyc2VkLmZpbmFsaXR5UHJvdmlkZXJLZXlzLFxuICAgICAgICBwYXJzZWQuY292ZW5hbnRLZXlzLFxuICAgICAgICBwYXJzZWQuY292ZW5hbnRUaHJlc2hvbGQsXG4gICAgICAgIHBhcnNlZC5zdGFraW5nVGltZUxvY2ssXG4gICAgICAgIGZpeHR1cmUudW5ib25kaW5nX3RpbWVcbiAgICAgICk7XG5cbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoXG4gICAgICAgIGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ01pbmlzY3JpcHROb2RlKCksXG4gICAgICAgIHBhcnNlZC51bmJvbmRpbmdNaW5pc2NyaXB0Tm9kZSxcbiAgICAgICAgJ1VuYm9uZGluZyBtaW5pc2NyaXB0IG5vZGUgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdmFsdWUnXG4gICAgICApO1xuXG4gICAgICBhc3NlcnQocHNidC50eE91dHB1dHMubGVuZ3RoID09PSAxLCAnVW5ib25kaW5nIHRyYW5zYWN0aW9uIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIG91dHB1dCcpO1xuXG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFxuICAgICAgICBwc2J0LnR4T3V0cHV0c1swXS5zY3JpcHQsXG4gICAgICAgIEJ1ZmZlci5mcm9tKGRlc2NyaXB0b3JCdWlsZGVyLmdldFVuYm9uZGluZ0Rlc2NyaXB0b3IoKS5zY3JpcHRQdWJrZXkoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5ydW5UZXN0KFxuICB1dHhvbGliLm5ldHdvcmtzLmJpdGNvaW5QdWJsaWNTaWduZXQsXG4gICc1ZDI3N2UxYjI5ZTU1ODkwNzRhZWE5NWFjOGM4MjMwZmQ5MTFjMmVjM2M1ODc3NGFhZmRlZjkxNTYxOWI3NzJjJyxcbiAgdG9EZXNjcmlwdG9yKHtcbiAgICB0cjogW1xuICAgICAgJzUwOTI5Yjc0YzFhMDQ5NTRiNzhiNGI2MDM1ZTk3YTVlMDc4YTVhMGYyOGVjOTZkNTQ3YmZlZTlhY2U4MDNhYzAnLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYW5kX3Y6IFtcbiAgICAgICAgICAgICAgICB7ICd2OnBrJzogJzFiNDQzZjM0ZGRjMWJiYWVmNTJhOGM1MTYyZGZhNWE4NDUyNDYzNmVjNzQ1MjkyZjk0OTQ3MDM2OWVlNjczOTEnIH0sXG4gICAgICAgICAgICAgICAgeyAndjpwayc6ICdkMjNjMmMyNWUxZmNmOGZkMWMyMWI5YTQwMmMxOWUyZTMwOWU1MzFlNDVlOTJmYjFlOTgwNWI2MDU2YjBjYzc2JyB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbXVsdGlfYTogW1xuICAgICAgICAgICAgICAgIDYsXG4gICAgICAgICAgICAgICAgJzBhZWUwNTA5YjE2ZGI3MWM5OTkyMzhhNDgyN2RiOTQ1NTI2ODU5YjEzYzk1NDg3YWI0NjcyNTM1N2M5YTlmMjUnLFxuICAgICAgICAgICAgICAgICcxMTNjM2EzMmE5ZDMyMGI3MjE5MGEwNGEwMjBhMGRiMzk3NmVmMzY5NzI2NzMyNThlOWEzOGEzNjRmM2RjM2IwJyxcbiAgICAgICAgICAgICAgICAnMTc5MjFjZjE1NmNjYjRlNzNkNDI4Zjk5NmVkMTFiMjQ1MzEzZTM3ZTI3Yzk3OGFjNGQyY2MyMWVjYTQ2NzJlNCcsXG4gICAgICAgICAgICAgICAgJzNiYjkzZGZjOGI2MTg4N2Q3NzFmMzYzMGU5YTYzZTk3Y2JhZmNmY2M3ODU1NmE0NzRkZjgzYTMxYTBlZjg5OWMnLFxuICAgICAgICAgICAgICAgICc0MGFmYWY0N2M0ZmZhNTZkZTg2NDEwZDhlNDdiYWEyYmI2ZjA0YjYwNGY0ZWEyNDMyMzczN2RkYzNmZTA5MmRmJyxcbiAgICAgICAgICAgICAgICAnNzlhNzFmZmQ3MWM1MDNlZjJlMmY5MWJjY2ZjOGZjZGE3OTQ2ZjQ2NTNjZWYwZDlmM2RkZTIwNzk1ZWYzYjlmMCcsXG4gICAgICAgICAgICAgICAgJ2QyMWZhZjc4YzY3NTFhMGQzOGU2YmQ4MDI4YjkwN2ZmMDdlOWE4NjlhNDNmYzgzN2Q2YjNmOGRmZjYxMTlhMzYnLFxuICAgICAgICAgICAgICAgICdmNTE5OWVmYWUzZjI4YmI4MjQ3NjE2M2E3ZTQ1OGM3YWQ0NDVkOWJmZmIwNjgyZDEwZDNiZGIyY2I0MWY4ZThlJyxcbiAgICAgICAgICAgICAgICAnZmE5ZDg4MmQ0NWY0MDYwYmRiODA0MjE4MzgyOGNkODc1NDRmMWVhOTk3MzgwZTU4NmNhYjc3ZDVmZDY5ODczNycsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbmRfdjogW1xuICAgICAgICAgICAgICB7ICd2OnBrJzogJzFiNDQzZjM0ZGRjMWJiYWVmNTJhOGM1MTYyZGZhNWE4NDUyNDYzNmVjNzQ1MjkyZjk0OTQ3MDM2OWVlNjczOTEnIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtdWx0aV9hOiBbXG4gICAgICAgICAgICAgICAgICA2LFxuICAgICAgICAgICAgICAgICAgJzBhZWUwNTA5YjE2ZGI3MWM5OTkyMzhhNDgyN2RiOTQ1NTI2ODU5YjEzYzk1NDg3YWI0NjcyNTM1N2M5YTlmMjUnLFxuICAgICAgICAgICAgICAgICAgJzExM2MzYTMyYTlkMzIwYjcyMTkwYTA0YTAyMGEwZGIzOTc2ZWYzNjk3MjY3MzI1OGU5YTM4YTM2NGYzZGMzYjAnLFxuICAgICAgICAgICAgICAgICAgJzE3OTIxY2YxNTZjY2I0ZTczZDQyOGY5OTZlZDExYjI0NTMxM2UzN2UyN2M5NzhhYzRkMmNjMjFlY2E0NjcyZTQnLFxuICAgICAgICAgICAgICAgICAgJzNiYjkzZGZjOGI2MTg4N2Q3NzFmMzYzMGU5YTYzZTk3Y2JhZmNmY2M3ODU1NmE0NzRkZjgzYTMxYTBlZjg5OWMnLFxuICAgICAgICAgICAgICAgICAgJzQwYWZhZjQ3YzRmZmE1NmRlODY0MTBkOGU0N2JhYTJiYjZmMDRiNjA0ZjRlYTI0MzIzNzM3ZGRjM2ZlMDkyZGYnLFxuICAgICAgICAgICAgICAgICAgJzc5YTcxZmZkNzFjNTAzZWYyZTJmOTFiY2NmYzhmY2RhNzk0NmY0NjUzY2VmMGQ5ZjNkZGUyMDc5NWVmM2I5ZjAnLFxuICAgICAgICAgICAgICAgICAgJ2QyMWZhZjc4YzY3NTFhMGQzOGU2YmQ4MDI4YjkwN2ZmMDdlOWE4NjlhNDNmYzgzN2Q2YjNmOGRmZjYxMTlhMzYnLFxuICAgICAgICAgICAgICAgICAgJ2Y1MTk5ZWZhZTNmMjhiYjgyNDc2MTYzYTdlNDU4YzdhZDQ0NWQ5YmZmYjA2ODJkMTBkM2JkYjJjYjQxZjhlOGUnLFxuICAgICAgICAgICAgICAgICAgJ2ZhOWQ4ODJkNDVmNDA2MGJkYjgwNDIxODM4MjhjZDg3NTQ0ZjFlYTk5NzM4MGU1ODZjYWI3N2Q1ZmQ2OTg3MzcnLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBhbmRfdjogW3sgJ3Y6cGsnOiAnMWI0NDNmMzRkZGMxYmJhZWY1MmE4YzUxNjJkZmE1YTg0NTI0NjM2ZWM3NDUyOTJmOTQ5NDcwMzY5ZWU2NzM5MScgfSwgeyBvbGRlcjogMTAwMDAgfV0gfSxcbiAgICAgICAgXSxcbiAgICAgIF0sXG4gICAgXSxcbiAgfSlcbik7XG4iXX0=
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as bitcoinjslib from 'bitcoinjs-lib';
|
|
2
|
+
import { ECPairInterface } from '@bitgo-beta/utxo-lib';
|
|
3
|
+
import * as vendor from '@bitgo-beta/babylonlabs-io-btc-staking-ts';
|
|
4
|
+
import * as babylonProtobuf from '@babylonlabs-io/babylon-proto-ts';
|
|
5
|
+
import { BabylonDescriptorBuilder, ValueWithTypeUrl } from '../../../src/babylon';
|
|
6
|
+
type Result = {
|
|
7
|
+
unsignedDelegationMsg: ValueWithTypeUrl<babylonProtobuf.btcstakingtx.MsgCreateBTCDelegation>;
|
|
8
|
+
stakingTx: bitcoinjslib.Transaction;
|
|
9
|
+
};
|
|
10
|
+
export declare function getBitGoUtxoStakingMsgCreateBtcDelegation(network: bitcoinjslib.Network, stakerKey: ECPairInterface, finalityProvider: ECPairInterface, descriptorBuilder: BabylonDescriptorBuilder, stakingParams: vendor.VersionedStakingParams[], changeAddress: string, amount: number, utxo: vendor.UTXO, feeRateSatB: number, blockHeight: number): Promise<Result>;
|
|
11
|
+
export declare function getVendorMsgCreateBtcDelegation(network: bitcoinjslib.Network, stakerKey: ECPairInterface, finalityProvider: ECPairInterface, descriptorBuilder: BabylonDescriptorBuilder, stakingParams: vendor.VersionedStakingParams[], changeAddress: string, amount: number, utxo: vendor.UTXO, feeRateSatB: number, blockHeight: number): Promise<Result>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=vendor.utils.d.ts.map
|