@bitgo-beta/sdk-coin-dot 1.3.3-alpha.474 → 1.3.3-alpha.476

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.
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * WASM Parser Explanation Tests
4
+ *
5
+ * Tests for explainDotTransaction, specifically verifying batch transaction
6
+ * handling with proxy deposit costs matches legacy account-lib behavior.
7
+ *
8
+ * Uses WASM-built transactions (not legacy rawTx fixtures) since the WASM
9
+ * parser requires metadata-compatible signed extension encoding.
10
+ *
11
+ * Note: wasm-dot@1.3.0 uses high-level business intents. Batch transactions
12
+ * are produced automatically from the intent (e.g., unstake with stopStaking
13
+ * produces batchAll(removeProxy, chill, unbond)).
14
+ */
15
+ var __importDefault = (this && this.__importDefault) || function (mod) {
16
+ return (mod && mod.__esModule) ? mod : { "default": mod };
17
+ };
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ const assert_1 = __importDefault(require("assert"));
20
+ const statics_1 = require("@bitgo-beta/statics");
21
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
22
+ const wasmParser_1 = require("../../src/lib/wasmParser");
23
+ const wasm_dot_1 = require("@bitgo/wasm-dot");
24
+ const fixtures_1 = require("../fixtures");
25
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
26
+ describe('WASM Parser Explanation', function () {
27
+ const coin = statics_1.coins.get('tdot');
28
+ // utils.getMaterial returns the iface Material shape; cast to WasmMaterial for buildTransaction
29
+ const material = utils_1.default.getMaterial(coin);
30
+ function createWasmContext(overrides = {}) {
31
+ return {
32
+ sender: fixtures_1.accounts.account1.address,
33
+ nonce: 0,
34
+ tip: 0n,
35
+ material,
36
+ validity: {
37
+ firstValid: fixtures_1.westendBlock.blockNumber,
38
+ maxDuration: 2400,
39
+ },
40
+ referenceBlock: fixtures_1.westendBlock.hash,
41
+ ...overrides,
42
+ };
43
+ }
44
+ describe('Batch unstake (removeProxy + chill + unbond)', function () {
45
+ it('should explain batch unstake with proxy deposit cost', function () {
46
+ const unbondAmount = 5000000000000n; // 5 DOT
47
+ const proxyDelegate = fixtures_1.accounts.account2.address;
48
+ // Build a full unstake: produces batchAll(removeProxy, chill, unbond)
49
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({
50
+ type: 'unstake',
51
+ amount: unbondAmount,
52
+ stopStaking: true,
53
+ proxyAddress: proxyDelegate,
54
+ }, createWasmContext());
55
+ const txHex = wasmTx.toBroadcastFormat();
56
+ const explanation = (0, wasmParser_1.explainDotTransaction)({
57
+ txHex,
58
+ material,
59
+ senderAddress: fixtures_1.accounts.account1.address,
60
+ });
61
+ // Should be Batch type
62
+ assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Batch);
63
+ assert_1.default.ok(explanation.methodName.includes('batchAll'), `Expected batchAll, got ${explanation.methodName}`);
64
+ // Outputs should contain proxy deposit cost, NOT the unbond amount
65
+ assert_1.default.strictEqual(explanation.outputs.length, 1, 'Should have exactly one output (proxy deposit cost)');
66
+ const output = explanation.outputs[0];
67
+ assert_1.default.strictEqual(output.address, fixtures_1.accounts.account1.address, 'Output should go to sender (deposit refund)');
68
+ const proxyDepositCost = BigInt(output.amount);
69
+ assert_1.default.ok(proxyDepositCost > 0n, 'Proxy deposit cost should be positive');
70
+ // The proxy deposit cost should NOT equal the unbond amount
71
+ assert_1.default.notStrictEqual(proxyDepositCost, unbondAmount, 'Should use proxy deposit cost, not unbond amount');
72
+ // Input should come from the proxy delegate address
73
+ assert_1.default.strictEqual(explanation.inputs.length, 1, 'Should have exactly one input');
74
+ assert_1.default.strictEqual(explanation.inputs[0].address, proxyDelegate, 'Input should come from proxy delegate');
75
+ assert_1.default.strictEqual(explanation.inputs[0].valueString, output.amount, 'Input value should equal proxy deposit cost');
76
+ });
77
+ it('proxy deposit cost should be consistent across calls', function () {
78
+ const proxyDelegate = fixtures_1.accounts.account2.address;
79
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({
80
+ type: 'unstake',
81
+ amount: 1000000000000n,
82
+ stopStaking: true,
83
+ proxyAddress: proxyDelegate,
84
+ }, createWasmContext());
85
+ const txHex = wasmTx.toBroadcastFormat();
86
+ const explanation1 = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
87
+ const explanation2 = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
88
+ assert_1.default.strictEqual(explanation1.outputs[0].amount, explanation2.outputs[0].amount);
89
+ });
90
+ });
91
+ describe('Batch stake (bond + addProxy)', function () {
92
+ it('should explain batch stake with bond amount and proxy deposit cost', function () {
93
+ const bondAmount = 10000000000000n; // 10 DOT
94
+ const proxyDelegate = fixtures_1.accounts.account2.address;
95
+ // Build a new stake with proxy: produces batchAll(bond, addProxy)
96
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({
97
+ type: 'stake',
98
+ amount: bondAmount,
99
+ proxyAddress: proxyDelegate,
100
+ payee: { type: 'staked' },
101
+ }, createWasmContext());
102
+ const txHex = wasmTx.toBroadcastFormat();
103
+ const explanation = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
104
+ assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Batch);
105
+ // Should have two outputs: bond amount (to STAKING_DESTINATION sentinel) + proxy deposit cost (to proxy delegate)
106
+ assert_1.default.strictEqual(explanation.outputs.length, 2, 'Should have bond + proxy deposit outputs');
107
+ const stakingOutput = explanation.outputs.find((o) => o.address === '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM');
108
+ assert_1.default.ok(stakingOutput, 'Should have STAKING_DESTINATION sentinel output for bond amount');
109
+ assert_1.default.strictEqual(BigInt(stakingOutput.amount), bondAmount, 'Bond amount should match');
110
+ const proxyOutput = explanation.outputs.find((o) => o.address !== '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM');
111
+ assert_1.default.ok(proxyOutput, 'Should have proxy deposit output');
112
+ assert_1.default.strictEqual(proxyOutput.address, proxyDelegate);
113
+ assert_1.default.ok(BigInt(proxyOutput.amount) > 0n, 'Proxy deposit cost should be positive');
114
+ // All inputs should come from sender
115
+ assert_1.default.strictEqual(explanation.inputs.length, 2);
116
+ for (const input of explanation.inputs) {
117
+ assert_1.default.strictEqual(input.address, fixtures_1.accounts.account1.address);
118
+ }
119
+ });
120
+ });
121
+ describe('Non-batch transactions (should not be affected)', function () {
122
+ it('should explain transfer normally', function () {
123
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true }, createWasmContext());
124
+ const explanation = (0, wasmParser_1.explainDotTransaction)({
125
+ txHex: wasmTx.toBroadcastFormat(),
126
+ material,
127
+ senderAddress: fixtures_1.accounts.account1.address,
128
+ });
129
+ assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Send);
130
+ assert_1.default.strictEqual(explanation.outputs.length, 1);
131
+ assert_1.default.strictEqual(explanation.outputs[0].address, fixtures_1.accounts.account2.address);
132
+ assert_1.default.strictEqual(explanation.outputs[0].amount, '1000000000000');
133
+ });
134
+ it('should explain single unstake (unbond) normally', function () {
135
+ const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'unstake', amount: 5000000000000n }, createWasmContext());
136
+ const explanation = (0, wasmParser_1.explainDotTransaction)({
137
+ txHex: wasmTx.toBroadcastFormat(),
138
+ material,
139
+ senderAddress: fixtures_1.accounts.account1.address,
140
+ });
141
+ assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.StakingUnlock);
142
+ assert_1.default.strictEqual(explanation.outputs.length, 1);
143
+ // STAKING_DESTINATION sentinel: unbond doesn't transfer to an external address
144
+ assert_1.default.strictEqual(explanation.outputs[0].address, '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM');
145
+ assert_1.default.strictEqual(explanation.outputs[0].amount, '5000000000000');
146
+ });
147
+ });
148
+ });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbVBhcnNlckV4cGxhbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3dhc21QYXJzZXJFeHBsYW5hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7OztHQVlHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMsbURBQXVEO0FBQ3ZELHlEQUFpRTtBQUNqRSw4Q0FBcUc7QUFFckcsMENBQXFEO0FBQ3JELGdFQUF3QztBQUV4QyxRQUFRLENBQUMseUJBQXlCLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixnR0FBZ0c7SUFDaEcsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQTRCLENBQUM7SUFFcEUsU0FBUyxpQkFBaUIsQ0FBQyxZQUFtQyxFQUFFO1FBQzlELE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxLQUFLLEVBQUUsQ0FBQztZQUNSLEdBQUcsRUFBRSxFQUFFO1lBQ1AsUUFBUTtZQUNSLFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsdUJBQVksQ0FBQyxXQUFXO2dCQUNwQyxXQUFXLEVBQUUsSUFBSTthQUNsQjtZQUNELGNBQWMsRUFBRSx1QkFBWSxDQUFDLElBQUk7WUFDakMsR0FBRyxTQUFTO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsOENBQThDLEVBQUU7UUFDdkQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFO1lBQ3pELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDLFFBQVE7WUFDN0MsTUFBTSxhQUFhLEdBQUcsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBRWhELHNFQUFzRTtZQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUM3QjtnQkFDRSxJ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LElBQUksRUFBRSwwQkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BFLGdCQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2xELCtFQUErRTtZQUMvRSxnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxrREFBa0QsQ0FBQyxDQUFDO1lBQ3ZHLGdCQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV0FTTSBQYXJzZXIgRXhwbGFuYXRpb24gVGVzdHNcbiAqXG4gKiBUZXN0cyBmb3IgZXhwbGFpbkRvdFRyYW5zYWN0aW9uLCBzcGVjaWZpY2FsbHkgdmVyaWZ5aW5nIGJhdGNoIHRyYW5zYWN0aW9uXG4gKiBoYW5kbGluZyB3aXRoIHByb3h5IGRlcG9zaXQgY29zdHMgbWF0Y2hlcyBsZWdhY3kgYWNjb3VudC1saWIgYmVoYXZpb3IuXG4gKlxuICogVXNlcyBXQVNNLWJ1aWx0IHRyYW5zYWN0aW9ucyAobm90IGxlZ2FjeSByYXdUeCBmaXh0dXJlcykgc2luY2UgdGhlIFdBU01cbiAqIHBhcnNlciByZXF1aXJlcyBtZXRhZGF0YS1jb21wYXRpYmxlIHNpZ25lZCBleHRlbnNpb24gZW5jb2RpbmcuXG4gKlxuICogTm90ZTogd2FzbS1kb3RAMS4zLjAgdXNlcyBoaWdoLWxldmVsIGJ1c2luZXNzIGludGVudHMuIEJhdGNoIHRyYW5zYWN0aW9uc1xuICogYXJlIHByb2R1Y2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgaW50ZW50IChlLmcuLCB1bnN0YWtlIHdpdGggc3RvcFN0YWtpbmdcbiAqIHByb2R1Y2VzIGJhdGNoQWxsKHJlbW92ZVByb3h5LCBjaGlsbCwgdW5ib25kKSkuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvd2FzbVBhcnNlcic7XG5pbXBvcnQgeyBidWlsZFRyYW5zYWN0aW9uLCB0eXBlIEJ1aWxkQ29udGV4dCwgdHlwZSBNYXRlcmlhbCBhcyBXYXNtTWF0ZXJpYWwgfSBmcm9tICdAYml0Z28vd2FzbS1kb3QnO1xuaW1wb3J0IHR5cGUgeyBNYXRlcmlhbCB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuaW1wb3J0IHsgYWNjb3VudHMsIHdlc3RlbmRCbG9jayB9IGZyb20gJy4uL2ZpeHR1cmVzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1dBU00gUGFyc2VyIEV4cGxhbmF0aW9uJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luID0gY29pbnMuZ2V0KCd0ZG90Jyk7XG4gIC8vIHV0aWxzLmdldE1hdGVyaWFsIHJldHVybnMgdGhlIGlmYWNlIE1hdGVyaWFsIHNoYXBlOyBjYXN0IHRvIFdhc21NYXRlcmlhbCBmb3IgYnVpbGRUcmFuc2FjdGlvblxuICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW4pIGFzIE1hdGVyaWFsICYgV2FzbU1hdGVyaWFsO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhc21Db250ZXh0KG92ZXJyaWRlczogUGFydGlhbDxCdWlsZENvbnRleHQ+ID0ge30pOiBCdWlsZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICBub25jZTogMCxcbiAgICAgIHRpcDogMG4sXG4gICAgICBtYXRlcmlhbCxcbiAgICAgIHZhbGlkaXR5OiB7XG4gICAgICAgIGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlcixcbiAgICAgICAgbWF4RHVyYXRpb246IDI0MDAsXG4gICAgICB9LFxuICAgICAgcmVmZXJlbmNlQmxvY2s6IHdlc3RlbmRCbG9jay5oYXNoLFxuICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgIH07XG4gIH1cblxuICBkZXNjcmliZSgnQmF0Y2ggdW5zdGFrZSAocmVtb3ZlUHJveHkgKyBjaGlsbCArIHVuYm9uZCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGJhdGNoIHVuc3Rha2Ugd2l0aCBwcm94eSBkZXBvc2l0IGNvc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB1bmJvbmRBbW91bnQgPSA1MDAwMDAwMDAwMDAwbjsgLy8gNSBET1RcbiAgICAgIGNvbnN0IHByb3h5RGVsZWdhdGUgPSBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzO1xuXG4gICAgICAvLyBCdWlsZCBhIGZ1bGwgdW5zdGFrZTogcHJvZHVjZXMgYmF0Y2hBbGwocmVtb3ZlUHJveHksIGNoaWxsLCB1bmJvbmQpXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3Vuc3Rha2UnLFxuICAgICAgICAgIGFtb3VudDogdW5ib25kQW1vdW50LFxuICAgICAgICAgIHN0b3BTdGFraW5nOiB0cnVlLFxuICAgICAgICAgIHByb3h5QWRkcmVzczogcHJveHlEZWxlZ2F0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZXhwbGFpbkRvdFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXgsXG4gICAgICAgIG1hdGVyaWFsLFxuICAgICAgICBzZW5kZXJBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBCYXRjaCB0eXBlXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24udHlwZSwgVHJhbnNhY3Rpb25UeXBlLkJhdGNoKTtcbiAgICAgIGFzc2VydC5vayhleHBsYW5hdGlvbi5tZXRob2ROYW1lLmluY2x1ZGVzKCdiYXRjaEFsbCcpLCBgRXhwZWN0ZWQgYmF0Y2hBbGwsIGdvdCAke2V4cGxhbmF0aW9uLm1ldGhvZE5hbWV9YCk7XG5cbiAgICAgIC8vIE91dHB1dHMgc2hvdWxkIGNvbnRhaW4gcHJveHkgZGVwb3NpdCBjb3N0LCBOT1QgdGhlIHVuYm9uZCBhbW91bnRcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMSwgJ1Nob3VsZCBoYXZlIGV4YWN0bHkgb25lIG91dHB1dCAocHJveHkgZGVwb3NpdCBjb3N0KScpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZXhwbGFuYXRpb24ub3V0cHV0c1swXTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChvdXRwdXQuYWRkcmVzcywgYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcywgJ091dHB1dCBzaG91bGQgZ28gdG8gc2VuZGVyIChkZXBvc2l0IHJlZnVuZCknKTtcbiAgICAgIGNvbnN0IHByb3h5RGVwb3NpdENvc3QgPSBCaWdJbnQob3V0cHV0LmFtb3VudCk7XG4gICAgICBhc3NlcnQub2socHJveHlEZXBvc2l0Q29zdCA+IDBuLCAnUHJveHkgZGVwb3NpdCBjb3N0IHNob3VsZCBiZSBwb3NpdGl2ZScpO1xuICAgICAgLy8gVGhlIHByb3h5IGRlcG9zaXQgY29zdCBzaG91bGQgTk9UIGVxdWFsIHRoZSB1bmJvbmQgYW1vdW50XG4gICAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwocHJveHlEZXBvc2l0Q29zdCwgdW5ib25kQW1vdW50LCAnU2hvdWxkIHVzZSBwcm94eSBkZXBvc2l0IGNvc3QsIG5vdCB1bmJvbmQgYW1vdW50Jyk7XG5cbiAgICAgIC8vIElucHV0IHNob3VsZCBjb21lIGZyb20gdGhlIHByb3h5IGRlbGVnYXRlIGFkZHJlc3NcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAxLCAnU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgaW5wdXQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5pbnB1dHNbMF0uYWRkcmVzcywgcHJveHlEZWxlZ2F0ZSwgJ0lucHV0IHNob3VsZCBjb21lIGZyb20gcHJveHkgZGVsZWdhdGUnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChcbiAgICAgICAgZXhwbGFuYXRpb24uaW5wdXRzWzBdLnZhbHVlU3RyaW5nLFxuICAgICAgICBvdXRwdXQuYW1vdW50LFxuICAgICAgICAnSW5wdXQgdmFsdWUgc2hvdWxkIGVxdWFsIHByb3h5IGRlcG9zaXQgY29zdCdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJveHkgZGVwb3NpdCBjb3N0IHNob3VsZCBiZSBjb25zaXN0ZW50IGFjcm9zcyBjYWxscycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHByb3h5RGVsZWdhdGUgPSBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzO1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd1bnN0YWtlJyxcbiAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLFxuICAgICAgICAgIHN0b3BTdGFraW5nOiB0cnVlLFxuICAgICAgICAgIHByb3h5QWRkcmVzczogcHJveHlEZWxlZ2F0ZSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uMSA9IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbih7IHR4SGV4LCBtYXRlcmlhbCwgc2VuZGVyQWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uMiA9IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbih7IHR4SGV4LCBtYXRlcmlhbCwgc2VuZGVyQWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uMS5vdXRwdXRzWzBdLmFtb3VudCwgZXhwbGFuYXRpb24yLm91dHB1dHNbMF0uYW1vdW50KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0JhdGNoIHN0YWtlIChib25kICsgYWRkUHJveHkpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBiYXRjaCBzdGFrZSB3aXRoIGJvbmQgYW1vdW50IGFuZCBwcm94eSBkZXBvc2l0IGNvc3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBib25kQW1vdW50ID0gMTAwMDAwMDAwMDAwMDBuOyAvLyAxMCBET1RcbiAgICAgIGNvbnN0IHByb3h5RGVsZWdhdGUgPSBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzO1xuXG4gICAgICAvLyBCdWlsZCBhIG5ldyBzdGFrZSB3aXRoIHByb3h5OiBwcm9kdWNlcyBiYXRjaEFsbChib25kLCBhZGRQcm94eSlcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc3Rha2UnLFxuICAgICAgICAgIGFtb3VudDogYm9uZEFtb3VudCxcbiAgICAgICAgICBwcm94eUFkZHJlc3M6IHByb3h5RGVsZWdhdGUsXG4gICAgICAgICAgcGF5ZWU6IHsgdHlwZTogJ3N0YWtlZCcgfSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHhIZXggPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZXhwbGFpbkRvdFRyYW5zYWN0aW9uKHsgdHhIZXgsIG1hdGVyaWFsLCBzZW5kZXJBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24udHlwZSwgVHJhbnNhY3Rpb25UeXBlLkJhdGNoKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgdHdvIG91dHB1dHM6IGJvbmQgYW1vdW50ICh0byBTVEFLSU5HX0RFU1RJTkFUSU9OIHNlbnRpbmVsKSArIHByb3h5IGRlcG9zaXQgY29zdCAodG8gcHJveHkgZGVsZWdhdGUpXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDIsICdTaG91bGQgaGF2ZSBib25kICsgcHJveHkgZGVwb3NpdCBvdXRwdXRzJyk7XG5cbiAgICAgIGNvbnN0IHN0YWtpbmdPdXRwdXQgPSBleHBsYW5hdGlvbi5vdXRwdXRzLmZpbmQoXG4gICAgICAgIChvKSA9PiBvLmFkZHJlc3MgPT09ICc1QzRocmZqdzlEalhaVHpWM013enJyQXI5UDFNSmhTcnZXR1dxaTFlU3V5VXBuaE0nXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKHN0YWtpbmdPdXRwdXQsICdTaG91bGQgaGF2ZSBTVEFLSU5HX0RFU1RJTkFUSU9OIHNlbnRpbmVsIG91dHB1dCBmb3IgYm9uZCBhbW91bnQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChCaWdJbnQoc3Rha2luZ091dHB1dCEuYW1vdW50KSwgYm9uZEFtb3VudCwgJ0JvbmQgYW1vdW50IHNob3VsZCBtYXRjaCcpO1xuXG4gICAgICBjb25zdCBwcm94eU91dHB1dCA9IGV4cGxhbmF0aW9uLm91dHB1dHMuZmluZChcbiAgICAgICAgKG8pID0+IG8uYWRkcmVzcyAhPT0gJzVDNGhyZmp3OURqWFpUelYzTXd6cnJBcjlQMU1KaFNydldHV3FpMWVTdXlVcG5oTSdcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2socHJveHlPdXRwdXQsICdTaG91bGQgaGF2ZSBwcm94eSBkZXBvc2l0IG91dHB1dCcpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHByb3h5T3V0cHV0IS5hZGRyZXNzLCBwcm94eURlbGVnYXRlKTtcbiAgICAgIGFzc2VydC5vayhCaWdJbnQocHJveHlPdXRwdXQhLmFtb3VudCkgPiAwbiwgJ1Byb3h5IGRlcG9zaXQgY29zdCBzaG91bGQgYmUgcG9zaXRpdmUnKTtcblxuICAgICAgLy8gQWxsIGlucHV0cyBzaG91bGQgY29tZSBmcm9tIHNlbmRlclxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLmlucHV0cy5sZW5ndGgsIDIpO1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiBleHBsYW5hdGlvbi5pbnB1dHMpIHtcbiAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGlucHV0LmFkZHJlc3MsIGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTm9uLWJhdGNoIHRyYW5zYWN0aW9ucyAoc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHRyYW5zZmVyIG5vcm1hbGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAncGF5bWVudCcsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBleHBsYWluRG90VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogd2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIG1hdGVyaWFsLFxuICAgICAgICBzZW5kZXJBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYWRkcmVzcywgYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsICcxMDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gc2luZ2xlIHVuc3Rha2UgKHVuYm9uZCkgbm9ybWFsbHknLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKHsgdHlwZTogJ3Vuc3Rha2UnLCBhbW91bnQ6IDUwMDAwMDAwMDAwMDBuIH0sIGNyZWF0ZVdhc21Db250ZXh0KCkpO1xuXG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgbWF0ZXJpYWwsXG4gICAgICAgIHNlbmRlckFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nVW5sb2NrKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMSk7XG4gICAgICAvLyBTVEFLSU5HX0RFU1RJTkFUSU9OIHNlbnRpbmVsOiB1bmJvbmQgZG9lc24ndCB0cmFuc2ZlciB0byBhbiBleHRlcm5hbCBhZGRyZXNzXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hZGRyZXNzLCAnNUM0aHJmanc5RGpYWlR6VjNNd3pyckFyOVAxTUpoU3J2V0dXcWkxZVN1eVVwbmhNJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0c1swXS5hbW91bnQsICc1MDAwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=