@bitgo-beta/sdk-coin-sol 2.4.3-beta.999 → 7.6.3
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/src/bigint-buffer-guard.d.ts +1 -0
- package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
- package/dist/src/bigint-buffer-guard.js +29 -0
- package/dist/src/config/token2022StaticConfig.d.ts +3 -0
- package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
- package/dist/src/config/token2022StaticConfig.js +50 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/constants.d.ts +35 -2
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +41 -2
- package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
- package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/customInstructionBuilder.js +289 -0
- package/dist/src/lib/iface.d.ts +79 -5
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
- package/dist/src/lib/instructionParamsFactory.js +364 -78
- package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
- package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
- package/dist/src/lib/jitoStakePoolOperations.js +200 -0
- package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
- package/dist/src/lib/solInstructionFactory.js +266 -69
- package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingActivateBuilder.js +23 -10
- package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
- package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
- package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
- package/dist/src/lib/token2022Config.d.ts +44 -0
- package/dist/src/lib/token2022Config.d.ts.map +1 -0
- package/dist/src/lib/token2022Config.js +27 -0
- package/dist/src/lib/tokenTransferBuilder.js +7 -7
- package/dist/src/lib/transaction.d.ts +31 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +134 -46
- package/dist/src/lib/transactionBuilder.d.ts +18 -2
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +78 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +10 -1
- package/dist/src/lib/utils.d.ts +34 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +88 -24
- package/dist/src/sol.d.ts +36 -13
- package/dist/src/sol.d.ts.map +1 -1
- package/dist/src/sol.js +230 -38
- package/dist/test/fixtures/sol.d.ts +1152 -0
- package/dist/test/fixtures/sol.d.ts.map +1 -0
- package/dist/test/fixtures/sol.js +1433 -0
- package/dist/test/resources/sol.d.ts +238 -0
- package/dist/test/resources/sol.d.ts.map +1 -0
- package/dist/test/resources/sol.js +320 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
- package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
- package/dist/test/unit/fixtures/solBackupKey.js +8 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.js +412 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
- package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
- package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +177 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
- package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
- package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
- package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
- package/dist/test/unit/sol.d.ts +2 -0
- package/dist/test/unit/sol.d.ts.map +1 -0
- package/dist/test/unit/sol.js +3108 -0
- package/dist/test/unit/solInstructionFactory.d.ts +2 -0
- package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
- package/dist/test/unit/solInstructionFactory.js +454 -0
- package/dist/test/unit/solToken.d.ts +2 -0
- package/dist/test/unit/solToken.d.ts.map +1 -0
- package/dist/test/unit/solToken.js +31 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +983 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +505 -0
- package/dist/test/unit/versionedTransaction.d.ts +2 -0
- package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
- package/dist/test/unit/versionedTransaction.js +207 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +14 -9
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -1223
|
@@ -0,0 +1,413 @@
|
|
|
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 should_1 = __importDefault(require("should"));
|
|
40
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
41
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
42
|
+
const src_1 = require("../../../src");
|
|
43
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
44
|
+
const bs58_1 = __importDefault(require("bs58"));
|
|
45
|
+
describe('Sol Custom Instruction Builder', () => {
|
|
46
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
47
|
+
const customInstructionBuilder = () => {
|
|
48
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
49
|
+
txBuilder.nonce(recentBlockHash);
|
|
50
|
+
txBuilder.sender(authAccount.pub);
|
|
51
|
+
return txBuilder;
|
|
52
|
+
};
|
|
53
|
+
const authAccount = new src_1.KeyPair(testData.authAccount).getKeys();
|
|
54
|
+
const otherAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
55
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
56
|
+
const memo = 'test memo';
|
|
57
|
+
// Helper function to convert TransactionInstruction to the expected format
|
|
58
|
+
const convertInstructionToParams = (instruction) => ({
|
|
59
|
+
programId: instruction.programId.toString(),
|
|
60
|
+
keys: instruction.keys.map((key) => ({
|
|
61
|
+
pubkey: key.pubkey.toString(),
|
|
62
|
+
isSigner: key.isSigner,
|
|
63
|
+
isWritable: key.isWritable,
|
|
64
|
+
})),
|
|
65
|
+
data: instruction.data.toString('hex'),
|
|
66
|
+
});
|
|
67
|
+
describe('Succeed', () => {
|
|
68
|
+
it('build a transaction with a single custom instruction', async () => {
|
|
69
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
70
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
71
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
72
|
+
lamports: 1000000,
|
|
73
|
+
});
|
|
74
|
+
const txBuilder = customInstructionBuilder();
|
|
75
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
76
|
+
const tx = await txBuilder.build();
|
|
77
|
+
tx.inputs.length.should.equal(0);
|
|
78
|
+
const rawTx = tx.toBroadcastFormat();
|
|
79
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
80
|
+
});
|
|
81
|
+
it('build a transaction with multiple custom instructions', async () => {
|
|
82
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
83
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
84
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
85
|
+
lamports: 1000000,
|
|
86
|
+
});
|
|
87
|
+
const priorityFeeInstruction = web3_js_1.ComputeBudgetProgram.setComputeUnitPrice({
|
|
88
|
+
microLamports: 1000,
|
|
89
|
+
});
|
|
90
|
+
const txBuilder = customInstructionBuilder();
|
|
91
|
+
txBuilder.addCustomInstructions([
|
|
92
|
+
convertInstructionToParams(transferInstruction),
|
|
93
|
+
convertInstructionToParams(priorityFeeInstruction),
|
|
94
|
+
]);
|
|
95
|
+
const tx = await txBuilder.build();
|
|
96
|
+
tx.inputs.length.should.equal(0);
|
|
97
|
+
tx.outputs.length.should.equal(0);
|
|
98
|
+
const rawTx = tx.toBroadcastFormat();
|
|
99
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
100
|
+
// Should have 2 instructions
|
|
101
|
+
tx.solTransaction.instructions.should.have.length(2);
|
|
102
|
+
});
|
|
103
|
+
it('build a transaction with custom instruction and memo', async () => {
|
|
104
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
105
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
106
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
107
|
+
lamports: 1000000,
|
|
108
|
+
});
|
|
109
|
+
const txBuilder = customInstructionBuilder();
|
|
110
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
111
|
+
txBuilder.memo(memo);
|
|
112
|
+
const tx = await txBuilder.build();
|
|
113
|
+
const rawTx = tx.toBroadcastFormat();
|
|
114
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
115
|
+
// Should have instruction + memo
|
|
116
|
+
tx.solTransaction.instructions.should.have.length(2);
|
|
117
|
+
});
|
|
118
|
+
it('build a signed transaction with custom instruction', async () => {
|
|
119
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
120
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
121
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
122
|
+
lamports: 1000000,
|
|
123
|
+
});
|
|
124
|
+
const txBuilder = customInstructionBuilder();
|
|
125
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
126
|
+
txBuilder.sign({ key: authAccount.prv });
|
|
127
|
+
const tx = await txBuilder.build();
|
|
128
|
+
const rawTx = tx.toBroadcastFormat();
|
|
129
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
130
|
+
// Should be signed
|
|
131
|
+
tx.solTransaction.signatures.should.not.be.empty();
|
|
132
|
+
});
|
|
133
|
+
it('clear instructions from builder', async () => {
|
|
134
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
135
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
136
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
137
|
+
lamports: 1000000,
|
|
138
|
+
});
|
|
139
|
+
const txBuilder = customInstructionBuilder();
|
|
140
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
141
|
+
txBuilder.getInstructions().should.have.length(1);
|
|
142
|
+
txBuilder.clearInstructions();
|
|
143
|
+
txBuilder.getInstructions().should.have.length(0);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
describe('Fail', () => {
|
|
147
|
+
it('for null instruction', () => {
|
|
148
|
+
const txBuilder = customInstructionBuilder();
|
|
149
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
150
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(null)).throwError('Instruction cannot be null or undefined');
|
|
151
|
+
});
|
|
152
|
+
it('for undefined instruction', () => {
|
|
153
|
+
const txBuilder = customInstructionBuilder();
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
155
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(undefined)).throwError('Instruction cannot be null or undefined');
|
|
156
|
+
});
|
|
157
|
+
it('for instruction without programId', () => {
|
|
158
|
+
const txBuilder = customInstructionBuilder();
|
|
159
|
+
const invalidInstruction = {
|
|
160
|
+
keys: [],
|
|
161
|
+
data: '',
|
|
162
|
+
};
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Versioned instruction must have a valid programIdIndex number');
|
|
165
|
+
});
|
|
166
|
+
it('for instruction without keys', () => {
|
|
167
|
+
const txBuilder = customInstructionBuilder();
|
|
168
|
+
const invalidInstruction = {
|
|
169
|
+
programId: '11111111111111111111111111111112',
|
|
170
|
+
data: '',
|
|
171
|
+
};
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
173
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Instruction must have valid keys array');
|
|
174
|
+
});
|
|
175
|
+
it('for instruction without data', () => {
|
|
176
|
+
const txBuilder = customInstructionBuilder();
|
|
177
|
+
const invalidInstruction = {
|
|
178
|
+
programId: '11111111111111111111111111111112',
|
|
179
|
+
keys: [],
|
|
180
|
+
};
|
|
181
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
182
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(invalidInstruction)).throwError('Instruction must have valid data string');
|
|
183
|
+
});
|
|
184
|
+
it('for non-array in addCustomInstructions', () => {
|
|
185
|
+
const txBuilder = customInstructionBuilder();
|
|
186
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
187
|
+
(0, should_1.default)(() => txBuilder.addCustomInstructions('invalid')).throwError('Instructions must be an array');
|
|
188
|
+
});
|
|
189
|
+
it('when building without instructions', async () => {
|
|
190
|
+
const txBuilder = customInstructionBuilder();
|
|
191
|
+
await txBuilder.build().should.be.rejectedWith('At least one custom instruction must be specified');
|
|
192
|
+
});
|
|
193
|
+
it('when building without sender', async () => {
|
|
194
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
195
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
196
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
197
|
+
lamports: 1000000,
|
|
198
|
+
});
|
|
199
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
200
|
+
txBuilder.nonce(recentBlockHash);
|
|
201
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
202
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing sender');
|
|
203
|
+
});
|
|
204
|
+
it('when building without nonce', async () => {
|
|
205
|
+
const transferInstruction = web3_js_1.SystemProgram.transfer({
|
|
206
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
207
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
208
|
+
lamports: 1000000,
|
|
209
|
+
});
|
|
210
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
211
|
+
txBuilder.sender(authAccount.pub);
|
|
212
|
+
txBuilder.addCustomInstruction(convertInstructionToParams(transferInstruction));
|
|
213
|
+
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing nonce blockhash');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('SolVersionedInstruction Support', () => {
|
|
217
|
+
it('should accept and validate SolVersionedInstruction format', () => {
|
|
218
|
+
const compiledInstruction = {
|
|
219
|
+
programIdIndex: 1,
|
|
220
|
+
accountKeyIndexes: [0, 2, 3],
|
|
221
|
+
data: '3Bxs43ZMjSRQLs6o', // base58 encoded instruction data
|
|
222
|
+
};
|
|
223
|
+
const txBuilder = customInstructionBuilder();
|
|
224
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction(compiledInstruction)).not.throwError();
|
|
225
|
+
txBuilder.getInstructions().should.have.length(1);
|
|
226
|
+
const addedInstruction = txBuilder.getInstructions()[0];
|
|
227
|
+
addedInstruction.params.should.deepEqual(compiledInstruction);
|
|
228
|
+
});
|
|
229
|
+
it('should validate versioned instruction format', () => {
|
|
230
|
+
const txBuilder = customInstructionBuilder();
|
|
231
|
+
// Invalid programIdIndex
|
|
232
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
233
|
+
programIdIndex: -1,
|
|
234
|
+
accountKeyIndexes: [0],
|
|
235
|
+
data: '1', // base58 for 0x00
|
|
236
|
+
})).throwError('Versioned instruction must have a valid programIdIndex number');
|
|
237
|
+
// Invalid accountKeyIndexes
|
|
238
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
239
|
+
programIdIndex: 0,
|
|
240
|
+
accountKeyIndexes: [-1],
|
|
241
|
+
data: '1', // base58 for 0x00
|
|
242
|
+
})).throwError('Each accountKeyIndex must be a non-negative number');
|
|
243
|
+
// Missing data
|
|
244
|
+
(0, should_1.default)(() => txBuilder.addCustomInstruction({
|
|
245
|
+
programIdIndex: 0,
|
|
246
|
+
accountKeyIndexes: [0],
|
|
247
|
+
})).throwError('Versioned instruction must have valid data string');
|
|
248
|
+
});
|
|
249
|
+
it('should handle mixed SolInstruction and SolVersionedInstruction', () => {
|
|
250
|
+
const traditionalInstruction = convertInstructionToParams(web3_js_1.SystemProgram.transfer({
|
|
251
|
+
fromPubkey: new web3_js_1.PublicKey(authAccount.pub),
|
|
252
|
+
toPubkey: new web3_js_1.PublicKey(otherAccount.pub),
|
|
253
|
+
lamports: 1000000,
|
|
254
|
+
}));
|
|
255
|
+
const compiledInstruction = {
|
|
256
|
+
programIdIndex: 1,
|
|
257
|
+
accountKeyIndexes: [0, 2],
|
|
258
|
+
data: '4HSo5YVBrgChTZX5',
|
|
259
|
+
};
|
|
260
|
+
const txBuilder = customInstructionBuilder();
|
|
261
|
+
txBuilder.addCustomInstruction(traditionalInstruction);
|
|
262
|
+
txBuilder.addCustomInstruction(compiledInstruction);
|
|
263
|
+
txBuilder.getInstructions().should.have.length(2);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
describe('fromVersionedTransactionData', () => {
|
|
267
|
+
function extractVersionedTransactionData(base64Bytes) {
|
|
268
|
+
const buffer = Buffer.from(base64Bytes, 'base64');
|
|
269
|
+
const versionedTx = web3_js_1.VersionedTransaction.deserialize(buffer);
|
|
270
|
+
return {
|
|
271
|
+
versionedInstructions: versionedTx.message.compiledInstructions.map((ci) => ({
|
|
272
|
+
programIdIndex: ci.programIdIndex,
|
|
273
|
+
accountKeyIndexes: ci.accountKeyIndexes,
|
|
274
|
+
data: bs58_1.default.encode(ci.data),
|
|
275
|
+
})),
|
|
276
|
+
addressLookupTables: versionedTx.message.addressTableLookups.map((alt) => ({
|
|
277
|
+
accountKey: alt.accountKey.toString(),
|
|
278
|
+
writableIndexes: alt.writableIndexes,
|
|
279
|
+
readonlyIndexes: alt.readonlyIndexes,
|
|
280
|
+
})),
|
|
281
|
+
staticAccountKeys: versionedTx.message.staticAccountKeys.map((key) => key.toString()),
|
|
282
|
+
messageHeader: {
|
|
283
|
+
numRequiredSignatures: versionedTx.message.header.numRequiredSignatures,
|
|
284
|
+
numReadonlySignedAccounts: versionedTx.message.header.numReadonlySignedAccounts,
|
|
285
|
+
numReadonlyUnsignedAccounts: versionedTx.message.header.numReadonlyUnsignedAccounts,
|
|
286
|
+
},
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
it('should process VersionedTransactionData and extract instructions', () => {
|
|
290
|
+
const txBuilder = customInstructionBuilder();
|
|
291
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
292
|
+
// Should parse without throwing errors
|
|
293
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(versionedTxData)).not.throwError();
|
|
294
|
+
// Should have extracted instructions
|
|
295
|
+
const instructions = txBuilder.getInstructions();
|
|
296
|
+
instructions.length.should.be.greaterThan(0);
|
|
297
|
+
for (const instruction of instructions) {
|
|
298
|
+
instruction.type.should.equal('VersionedCustomInstruction');
|
|
299
|
+
instruction.params.should.have.property('programIdIndex');
|
|
300
|
+
instruction.params.should.have.property('accountKeyIndexes');
|
|
301
|
+
instruction.params.should.have.property('data');
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
it('should store VersionedTransactionData in underlying transaction', async () => {
|
|
305
|
+
const txBuilder = customInstructionBuilder();
|
|
306
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
307
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
308
|
+
const tx = txBuilder['_transaction'];
|
|
309
|
+
const storedData = tx.getVersionedTransactionData();
|
|
310
|
+
should_1.default.exist(storedData);
|
|
311
|
+
storedData.versionedInstructions.length.should.equal(versionedTxData.versionedInstructions.length);
|
|
312
|
+
storedData.addressLookupTables.length.should.equal(versionedTxData.addressLookupTables.length);
|
|
313
|
+
storedData.staticAccountKeys.length.should.equal(versionedTxData.staticAccountKeys.length);
|
|
314
|
+
});
|
|
315
|
+
it('should validate input data', () => {
|
|
316
|
+
const txBuilder = customInstructionBuilder();
|
|
317
|
+
// Invalid: null/undefined
|
|
318
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(null)).throwError(/must be a valid object/);
|
|
319
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData(undefined)).throwError(/must be a valid object/);
|
|
320
|
+
// Invalid: empty instructions
|
|
321
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
322
|
+
versionedInstructions: [],
|
|
323
|
+
addressLookupTables: [],
|
|
324
|
+
staticAccountKeys: ['test'],
|
|
325
|
+
messageHeader: { numRequiredSignatures: 1, numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0 },
|
|
326
|
+
})).throwError(/non-empty array/);
|
|
327
|
+
// Invalid: missing addressLookupTables
|
|
328
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
329
|
+
versionedInstructions: [{ programIdIndex: 0, accountKeyIndexes: [0], data: '1' }], // base58 for 0x00
|
|
330
|
+
staticAccountKeys: ['test'],
|
|
331
|
+
})).throwError(/must be an array/);
|
|
332
|
+
// Invalid: empty staticAccountKeys
|
|
333
|
+
(0, should_1.default)(() => txBuilder.fromVersionedTransactionData({
|
|
334
|
+
versionedInstructions: [{ programIdIndex: 0, accountKeyIndexes: [0], data: '1' }], // base58 for 0x00
|
|
335
|
+
addressLookupTables: [],
|
|
336
|
+
staticAccountKeys: [],
|
|
337
|
+
messageHeader: { numRequiredSignatures: 1, numReadonlySignedAccounts: 0, numReadonlyUnsignedAccounts: 0 },
|
|
338
|
+
})).throwError(/non-empty array/);
|
|
339
|
+
});
|
|
340
|
+
it('should work with the complete transaction building flow', async () => {
|
|
341
|
+
const txBuilder = customInstructionBuilder();
|
|
342
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
343
|
+
// Process the VersionedTransactionData
|
|
344
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
345
|
+
txBuilder.sender(versionedTxData.staticAccountKeys[0]); // Fee payer
|
|
346
|
+
txBuilder.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
347
|
+
const tx = await txBuilder.build();
|
|
348
|
+
// Verify transaction properties
|
|
349
|
+
tx.should.be.ok();
|
|
350
|
+
tx.type.should.equal(31); // TransactionType.CustomTx enum value
|
|
351
|
+
// Verify signable payload
|
|
352
|
+
const payload = tx.signablePayload;
|
|
353
|
+
payload.should.be.instanceOf(Buffer);
|
|
354
|
+
payload.length.should.be.greaterThan(0);
|
|
355
|
+
// Verify payload is deterministic - rebuilding with same params produces same payload
|
|
356
|
+
const txBuilder2 = customInstructionBuilder();
|
|
357
|
+
txBuilder2.fromVersionedTransactionData(versionedTxData);
|
|
358
|
+
txBuilder2.sender(versionedTxData.staticAccountKeys[0]);
|
|
359
|
+
txBuilder2.nonce(testData.blockHashes.validBlockHashes[0]);
|
|
360
|
+
const tx2 = await txBuilder2.build();
|
|
361
|
+
should_1.default.equal(tx2.signablePayload.toString('hex'), payload.toString('hex'));
|
|
362
|
+
});
|
|
363
|
+
it('should extract the correct number of instructions from Jupiter transaction', () => {
|
|
364
|
+
const txBuilder = customInstructionBuilder();
|
|
365
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
366
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
367
|
+
const instructions = txBuilder.getInstructions();
|
|
368
|
+
// Verify we extracted instructions
|
|
369
|
+
instructions.length.should.be.greaterThan(0);
|
|
370
|
+
instructions.length.should.equal(versionedTxData.versionedInstructions.length);
|
|
371
|
+
// Verify each instruction has valid compiled format
|
|
372
|
+
for (const instruction of instructions) {
|
|
373
|
+
const params = instruction.params;
|
|
374
|
+
(typeof params.programIdIndex).should.equal('number');
|
|
375
|
+
params.programIdIndex.should.be.greaterThanOrEqual(0);
|
|
376
|
+
Array.isArray(params.accountKeyIndexes).should.equal(true);
|
|
377
|
+
(typeof params.data).should.equal('string');
|
|
378
|
+
// Data should be valid base58 string (non-empty)
|
|
379
|
+
params.data.length.should.be.greaterThan(0);
|
|
380
|
+
// Verify it can be decoded
|
|
381
|
+
should_1.default.doesNotThrow(() => bs58_1.default.decode(params.data));
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
it('should clear instructions properly after using fromVersionedTransactionData', () => {
|
|
385
|
+
const txBuilder = customInstructionBuilder();
|
|
386
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
387
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
388
|
+
txBuilder.getInstructions().length.should.be.greaterThan(0);
|
|
389
|
+
// Clear should work
|
|
390
|
+
txBuilder.clearInstructions();
|
|
391
|
+
txBuilder.getInstructions().should.have.length(0);
|
|
392
|
+
});
|
|
393
|
+
it('should extract fee payer from staticAccountKeys', () => {
|
|
394
|
+
const txBuilder = factory.getCustomInstructionBuilder();
|
|
395
|
+
txBuilder.nonce(recentBlockHash);
|
|
396
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
397
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
398
|
+
const sender = txBuilder['_sender'];
|
|
399
|
+
should_1.default.exist(sender);
|
|
400
|
+
sender.should.equal(versionedTxData.staticAccountKeys[0]);
|
|
401
|
+
});
|
|
402
|
+
it('should not override existing sender', () => {
|
|
403
|
+
const txBuilder = customInstructionBuilder();
|
|
404
|
+
const versionedTxData = extractVersionedTransactionData(testData.JUPITER_VERSIONED_TX_BYTES);
|
|
405
|
+
const originalSender = txBuilder['_sender'];
|
|
406
|
+
txBuilder.fromVersionedTransactionData(versionedTxData);
|
|
407
|
+
const sender = txBuilder['_sender'];
|
|
408
|
+
sender.should.equal(originalSender);
|
|
409
|
+
sender.should.equal(authAccount.pub);
|
|
410
|
+
});
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNkNBTXlCO0FBQ3pCLDREQUF5RDtBQUN6RCxzQ0FBMkQ7QUFDM0QsOERBQWdEO0FBRWhELGdEQUEwQjtBQUUxQixRQUFRLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFO0lBQzlDLE1BQU0sT0FBTyxHQUFHLElBQUEscUNBQWlCLEVBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDeEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEUsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNyRixNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUM7SUFFekIsMkVBQTJFO0lBQzNFLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxXQUFtQyxFQUFFLEVBQUUs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QyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHtcbiAgU3lzdGVtUHJvZ3JhbSxcbiAgUHVibGljS2V5LFxuICBUcmFuc2FjdGlvbkluc3RydWN0aW9uLFxuICBDb21wdXRlQnVkZ2V0UHJvZ3JhbSxcbiAgVmVyc2lvbmVkVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFV0aWxzLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvc29sJztcbmltcG9ydCB7IFNvbFZlcnNpb25lZEluc3RydWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcblxuZGVzY3JpYmUoJ1NvbCBDdXN0b20gSW5zdHJ1Y3Rpb24gQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c29sJyk7XG5cbiAgY29uc3QgY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyID0gKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcihhdXRoQWNjb3VudC5wdWIpO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYXV0aEFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hdXRoQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBvdGhlckFjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gIGNvbnN0IG1lbW8gPSAndGVzdCBtZW1vJztcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHRvIHRoZSBleHBlY3RlZCBmb3JtYXRcbiAgY29uc3QgY29udmVydEluc3RydWN0aW9uVG9QYXJhbXMgPSAoaW5zdHJ1Y3Rpb246IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24pID0+ICh7XG4gICAgcHJvZ3JhbUlkOiBpbnN0cnVjdGlvbi5wcm9ncmFtSWQudG9TdHJpbmcoKSxcbiAgICBrZXlzOiBpbnN0cnVjdGlvbi5rZXlzLm1hcCgoa2V5KSA9PiAoe1xuICAgICAgcHVia2V5OiBrZXkucHVia2V5LnRvU3RyaW5nKCksXG4gICAgICBpc1NpZ25lcjoga2V5LmlzU2lnbmVyLFxuICAgICAgaXNXcml0YWJsZToga2V5LmlzV3JpdGFibGUsXG4gICAgfSkpLFxuICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGEudG9TdHJpbmcoJ2hleCcpLFxuICB9KTtcblxuICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICBpdCgnYnVpbGQgYSB0cmFuc2FjdGlvbiB3aXRoIGEgc2luZ2xlIGN1c3RvbSBpbnN0cnVjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggbXVsdGlwbGUgY3VzdG9tIGluc3RydWN0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcHJpb3JpdHlGZWVJbnN0cnVjdGlvbiA9IENvbXB1dGVCdWRnZXRQcm9ncmFtLnNldENvbXB1dGVVbml0UHJpY2Uoe1xuICAgICAgICBtaWNyb0xhbXBvcnRzOiAxMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9ucyhbXG4gICAgICAgIGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pLFxuICAgICAgICBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyhwcmlvcml0eUZlZUluc3RydWN0aW9uKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgdHguaW5wdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG4gICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgMiBpbnN0cnVjdGlvbnNcbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHRyYW5zYWN0aW9uIHdpdGggY3VzdG9tIGluc3RydWN0aW9uIGFuZCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vKTtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcblxuICAgICAgLy8gU2hvdWxkIGhhdmUgaW5zdHJ1Y3Rpb24gKyBtZW1vXG4gICAgICAodHggYXMgVHJhbnNhY3Rpb24pLnNvbFRyYW5zYWN0aW9uLmluc3RydWN0aW9ucy5zaG91bGQuaGF2ZS5sZW5ndGgoMik7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBzaWduZWQgdHJhbnNhY3Rpb24gd2l0aCBjdXN0b20gaW5zdHJ1Y3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zlckluc3RydWN0aW9uID0gU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aEFjY291bnQucHViKSxcbiAgICAgICAgdG9QdWJrZXk6IG5ldyBQdWJsaWNLZXkob3RoZXJBY2NvdW50LnB1YiksXG4gICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbnZlcnRJbnN0cnVjdGlvblRvUGFyYW1zKHRyYW5zZmVySW5zdHJ1Y3Rpb24pKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBhdXRoQWNjb3VudC5wcnYgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG5cbiAgICAgIC8vIFNob3VsZCBiZSBzaWduZWRcbiAgICAgICh0eCBhcyBUcmFuc2FjdGlvbikuc29sVHJhbnNhY3Rpb24uc2lnbmF0dXJlcy5zaG91bGQubm90LmJlLmVtcHR5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnY2xlYXIgaW5zdHJ1Y3Rpb25zIGZyb20gYnVpbGRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgxKTtcblxuICAgICAgdHhCdWlsZGVyLmNsZWFySW5zdHJ1Y3Rpb25zKCk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDApO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBUeXBlIGZvciB0ZXN0aW5nIGludmFsaWQgaW5zdHJ1Y3Rpb24gZm9ybWF0c1xuICBpbnRlcmZhY2UgSW52YWxpZEluc3RydWN0aW9uIHtcbiAgICBwcm9ncmFtSWQ/OiBzdHJpbmc7XG4gICAga2V5cz86IHVua25vd247XG4gICAgZGF0YT86IHVua25vd247XG4gIH1cblxuICBkZXNjcmliZSgnRmFpbCcsICgpID0+IHtcbiAgICBpdCgnZm9yIG51bGwgaW5zdHJ1Y3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKG51bGwgYXMgYW55KSkudGhyb3dFcnJvcignSW5zdHJ1Y3Rpb24gY2Fubm90IGJlIG51bGwgb3IgdW5kZWZpbmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIHVuZGVmaW5lZCBpbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24odW5kZWZpbmVkIGFzIGFueSkpLnRocm93RXJyb3IoXG4gICAgICAgICdJbnN0cnVjdGlvbiBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2ZvciBpbnN0cnVjdGlvbiB3aXRob3V0IHByb2dyYW1JZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgaW52YWxpZEluc3RydWN0aW9uOiBJbnZhbGlkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIGtleXM6IFtdLFxuICAgICAgICBkYXRhOiAnJyxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZEluZGV4IG51bWJlcidcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnZm9yIGluc3RydWN0aW9uIHdpdGhvdXQga2V5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgaW52YWxpZEluc3RydWN0aW9uOiBJbnZhbGlkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHByb2dyYW1JZDogJzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyJyxcbiAgICAgICAgZGF0YTogJycsXG4gICAgICB9O1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihpbnZhbGlkSW5zdHJ1Y3Rpb24gYXMgYW55KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0luc3RydWN0aW9uIG11c3QgaGF2ZSB2YWxpZCBrZXlzIGFycmF5J1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW5zdHJ1Y3Rpb24gd2l0aG91dCBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBjb25zdCBpbnZhbGlkSW5zdHJ1Y3Rpb246IEludmFsaWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkOiAnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTInLFxuICAgICAgICBrZXlzOiBbXSxcbiAgICAgIH07XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGludmFsaWRJbnN0cnVjdGlvbiBhcyBhbnkpKS50aHJvd0Vycm9yKFxuICAgICAgICAnSW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIHZhbGlkIGRhdGEgc3RyaW5nJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3Igbm9uLWFycmF5IGluIGFkZEN1c3RvbUluc3RydWN0aW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb25zKCdpbnZhbGlkJyBhcyBhbnkpKS50aHJvd0Vycm9yKCdJbnN0cnVjdGlvbnMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBpbnN0cnVjdGlvbnMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0F0IGxlYXN0IG9uZSBjdXN0b20gaW5zdHJ1Y3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCd3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc2VuZGVyJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJJbnN0cnVjdGlvbiA9IFN5c3RlbVByb2dyYW0udHJhbnNmZXIoe1xuICAgICAgICBmcm9tUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhBY2NvdW50LnB1YiksXG4gICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICBsYW1wb3J0czogMTAwMDAwMCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oY29udmVydEluc3RydWN0aW9uVG9QYXJhbXModHJhbnNmZXJJbnN0cnVjdGlvbikpO1xuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHNlbmRlcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3doZW4gYnVpbGRpbmcgd2l0aG91dCBub25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZmVySW5zdHJ1Y3Rpb24gPSBTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICB0b1B1YmtleTogbmV3IFB1YmxpY0tleShvdGhlckFjY291bnQucHViKSxcbiAgICAgICAgbGFtcG9ydHM6IDEwMDAwMDAsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRDdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIoYXV0aEFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyh0cmFuc2Zlckluc3RydWN0aW9uKSk7XG5cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiBTdXBwb3J0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYWNjZXB0IGFuZCB2YWxpZGF0ZSBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb21waWxlZEluc3RydWN0aW9uOiBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbiA9IHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IDEsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMCwgMiwgM10sXG4gICAgICAgIGRhdGE6ICczQnhzNDNaTWpTUlFMczZvJywgLy8gYmFzZTU4IGVuY29kZWQgaW5zdHJ1Y3Rpb24gZGF0YVxuICAgICAgfTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKGNvbXBpbGVkSW5zdHJ1Y3Rpb24pKS5ub3QudGhyb3dFcnJvcigpO1xuXG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgICAgY29uc3QgYWRkZWRJbnN0cnVjdGlvbiA9IHR4QnVpbGRlci5nZXRJbnN0cnVjdGlvbnMoKVswXTtcbiAgICAgIGFkZGVkSW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5kZWVwRXF1YWwoY29tcGlsZWRJbnN0cnVjdGlvbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZlcnNpb25lZCBpbnN0cnVjdGlvbiBmb3JtYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgLy8gSW52YWxpZCBwcm9ncmFtSWRJbmRleFxuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih7XG4gICAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IC0xLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMF0sXG4gICAgICAgICAgZGF0YTogJzEnLCAvLyBiYXNlNTggZm9yIDB4MDBcbiAgICAgICAgfSBhcyBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbilcbiAgICAgICkudGhyb3dFcnJvcignVmVyc2lvbmVkIGluc3RydWN0aW9uIG11c3QgaGF2ZSBhIHZhbGlkIHByb2dyYW1JZEluZGV4IG51bWJlcicpO1xuXG4gICAgICAvLyBJbnZhbGlkIGFjY291bnRLZXlJbmRleGVzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmFkZEN1c3RvbUluc3RydWN0aW9uKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogMCxcbiAgICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWy0xXSxcbiAgICAgICAgICBkYXRhOiAnMScsIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICB9IGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uKVxuICAgICAgKS50aHJvd0Vycm9yKCdFYWNoIGFjY291bnRLZXlJbmRleCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcicpO1xuXG4gICAgICAvLyBNaXNzaW5nIGRhdGFcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuYWRkQ3VzdG9tSW5zdHJ1Y3Rpb24oe1xuICAgICAgICAgIHByb2dyYW1JZEluZGV4OiAwLFxuICAgICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBbMF0sXG4gICAgICAgIH0gYXMgU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24pXG4gICAgICApLnRocm93RXJyb3IoJ1ZlcnNpb25lZCBpbnN0cnVjdGlvbiBtdXN0IGhhdmUgdmFsaWQgZGF0YSBzdHJpbmcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1peGVkIFNvbEluc3RydWN0aW9uIGFuZCBTb2xWZXJzaW9uZWRJbnN0cnVjdGlvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWRpdGlvbmFsSW5zdHJ1Y3Rpb24gPSBjb252ZXJ0SW5zdHJ1Y3Rpb25Ub1BhcmFtcyhcbiAgICAgICAgU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgICAgZnJvbVB1YmtleTogbmV3IFB1YmxpY0tleShhdXRoQWNjb3VudC5wdWIpLFxuICAgICAgICAgIHRvUHVia2V5OiBuZXcgUHVibGljS2V5KG90aGVyQWNjb3VudC5wdWIpLFxuICAgICAgICAgIGxhbXBvcnRzOiAxMDAwMDAwLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgY29tcGlsZWRJbnN0cnVjdGlvbjogU29sVmVyc2lvbmVkSW5zdHJ1Y3Rpb24gPSB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiAxLFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogWzAsIDJdLFxuICAgICAgICBkYXRhOiAnNEhTbzVZVkJyZ0NoVFpYNScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbih0cmFkaXRpb25hbEluc3RydWN0aW9uKTtcbiAgICAgIHR4QnVpbGRlci5hZGRDdXN0b21JbnN0cnVjdGlvbihjb21waWxlZEluc3RydWN0aW9uKTtcblxuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Zyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEnLCAoKSA9PiB7XG4gICAgZnVuY3Rpb24gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShiYXNlNjRCeXRlczogc3RyaW5nKSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjRCeXRlcywgJ2Jhc2U2NCcpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHggPSBWZXJzaW9uZWRUcmFuc2FjdGlvbi5kZXNlcmlhbGl6ZShidWZmZXIpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuY29tcGlsZWRJbnN0cnVjdGlvbnMubWFwKChjaSkgPT4gKHtcbiAgICAgICAgICBwcm9ncmFtSWRJbmRleDogY2kucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGNpLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICAgIGRhdGE6IGJhc2U1OC5lbmNvZGUoY2kuZGF0YSksXG4gICAgICAgIH0pKSxcbiAgICAgICAgYWRkcmVzc0xvb2t1cFRhYmxlczogdmVyc2lvbmVkVHgubWVzc2FnZS5hZGRyZXNzVGFibGVMb29rdXBzLm1hcCgoYWx0KSA9PiAoe1xuICAgICAgICAgIGFjY291bnRLZXk6IGFsdC5hY2NvdW50S2V5LnRvU3RyaW5nKCksXG4gICAgICAgICAgd3JpdGFibGVJbmRleGVzOiBhbHQud3JpdGFibGVJbmRleGVzLFxuICAgICAgICAgIHJlYWRvbmx5SW5kZXhlczogYWx0LnJlYWRvbmx5SW5kZXhlcyxcbiAgICAgICAgfSkpLFxuICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogdmVyc2lvbmVkVHgubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5tYXAoKGtleSkgPT4ga2V5LnRvU3RyaW5nKCkpLFxuICAgICAgICBtZXNzYWdlSGVhZGVyOiB7XG4gICAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB2ZXJzaW9uZWRUeC5tZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogdmVyc2lvbmVkVHgubWVzc2FnZS5oZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyxcbiAgICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IHZlcnNpb25lZFR4Lm1lc3NhZ2UuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCBwcm9jZXNzIFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSBhbmQgZXh0cmFjdCBpbnN0cnVjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICAvLyBTaG91bGQgcGFyc2Ugd2l0aG91dCB0aHJvd2luZyBlcnJvcnNcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpKS5ub3QudGhyb3dFcnJvcigpO1xuXG4gICAgICAvLyBTaG91bGQgaGF2ZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb25zXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCk7XG4gICAgICBpbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgaW5zdHJ1Y3Rpb24udHlwZS5zaG91bGQuZXF1YWwoJ1ZlcnNpb25lZEN1c3RvbUluc3RydWN0aW9uJyk7XG4gICAgICAgIGluc3RydWN0aW9uLnBhcmFtcy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncHJvZ3JhbUlkSW5kZXgnKTtcbiAgICAgICAgaW5zdHJ1Y3Rpb24ucGFyYW1zLnNob3VsZC5oYXZlLnByb3BlcnR5KCdhY2NvdW50S2V5SW5kZXhlcycpO1xuICAgICAgICBpbnN0cnVjdGlvbi5wYXJhbXMuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2RhdGEnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RvcmUgVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhIGluIHVuZGVybHlpbmcgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCB0eCA9IHR4QnVpbGRlclsnX3RyYW5zYWN0aW9uJ107XG4gICAgICBjb25zdCBzdG9yZWREYXRhID0gdHguZ2V0VmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKCk7XG4gICAgICBzaG91bGQuZXhpc3Qoc3RvcmVkRGF0YSk7XG4gICAgICBzdG9yZWREYXRhIS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5lcXVhbCh2ZXJzaW9uZWRUeERhdGEudmVyc2lvbmVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgICBzdG9yZWREYXRhIS5hZGRyZXNzTG9va3VwVGFibGVzLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLmFkZHJlc3NMb29rdXBUYWJsZXMubGVuZ3RoKTtcbiAgICAgIHN0b3JlZERhdGEhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aC5zaG91bGQuZXF1YWwodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGlucHV0IGRhdGEnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcblxuICAgICAgLy8gSW52YWxpZDogbnVsbC91bmRlZmluZWRcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YShudWxsIGFzIGFueSkpLnRocm93RXJyb3IoL211c3QgYmUgYSB2YWxpZCBvYmplY3QvKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh1bmRlZmluZWQgYXMgYW55KSkudGhyb3dFcnJvcigvbXVzdCBiZSBhIHZhbGlkIG9iamVjdC8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBlbXB0eSBpbnN0cnVjdGlvbnNcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh7XG4gICAgICAgICAgdmVyc2lvbmVkSW5zdHJ1Y3Rpb25zOiBbXSxcbiAgICAgICAgICBhZGRyZXNzTG9va3VwVGFibGVzOiBbXSxcbiAgICAgICAgICBzdGF0aWNBY2NvdW50S2V5czogWyd0ZXN0J10sXG4gICAgICAgICAgbWVzc2FnZUhlYWRlcjogeyBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IDEsIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IDAsIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50czogMCB9LFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKC9ub24tZW1wdHkgYXJyYXkvKTtcblxuICAgICAgLy8gSW52YWxpZDogbWlzc2luZyBhZGRyZXNzTG9va3VwVGFibGVzXG4gICAgICBzaG91bGQoKCkgPT5cbiAgICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEoe1xuICAgICAgICAgIHZlcnNpb25lZEluc3RydWN0aW9uczogW3sgcHJvZ3JhbUlkSW5kZXg6IDAsIGFjY291bnRLZXlJbmRleGVzOiBbMF0sIGRhdGE6ICcxJyB9XSwgLy8gYmFzZTU4IGZvciAweDAwXG4gICAgICAgICAgc3RhdGljQWNjb3VudEtleXM6IFsndGVzdCddLFxuICAgICAgICB9IGFzIGFueSlcbiAgICAgICkudGhyb3dFcnJvcigvbXVzdCBiZSBhbiBhcnJheS8pO1xuXG4gICAgICAvLyBJbnZhbGlkOiBlbXB0eSBzdGF0aWNBY2NvdW50S2V5c1xuICAgICAgc2hvdWxkKCgpID0+XG4gICAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHtcbiAgICAgICAgICB2ZXJzaW9uZWRJbnN0cnVjdGlvbnM6IFt7IHByb2dyYW1JZEluZGV4OiAwLCBhY2NvdW50S2V5SW5kZXhlczogWzBdLCBkYXRhOiAnMScgfV0sIC8vIGJhc2U1OCBmb3IgMHgwMFxuICAgICAgICAgIGFkZHJlc3NMb29rdXBUYWJsZXM6IFtdLFxuICAgICAgICAgIHN0YXRpY0FjY291bnRLZXlzOiBbXSxcbiAgICAgICAgICBtZXNzYWdlSGVhZGVyOiB7IG51bVJlcXVpcmVkU2lnbmF0dXJlczogMSwgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogMCwgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiAwIH0sXG4gICAgICAgIH0pXG4gICAgICApLnRocm93RXJyb3IoL25vbi1lbXB0eSBhcnJheS8pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIHRyYW5zYWN0aW9uIGJ1aWxkaW5nIGZsb3cnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICAvLyBQcm9jZXNzIHRoZSBWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGFcbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIHR4QnVpbGRlci5zZW5kZXIodmVyc2lvbmVkVHhEYXRhLnN0YXRpY0FjY291bnRLZXlzWzBdKTsgLy8gRmVlIHBheWVyXG4gICAgICB0eEJ1aWxkZXIubm9uY2UodGVzdERhdGEuYmxvY2tIYXNoZXMudmFsaWRCbG9ja0hhc2hlc1swXSk7XG5cbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB0cmFuc2FjdGlvbiBwcm9wZXJ0aWVzXG4gICAgICB0eC5zaG91bGQuYmUub2soKTtcbiAgICAgIHR4LnR5cGUuc2hvdWxkLmVxdWFsKDMxKTsgLy8gVHJhbnNhY3Rpb25UeXBlLkN1c3RvbVR4IGVudW0gdmFsdWVcblxuICAgICAgLy8gVmVyaWZ5IHNpZ25hYmxlIHBheWxvYWRcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB0eC5zaWduYWJsZVBheWxvYWQ7XG4gICAgICBwYXlsb2FkLnNob3VsZC5iZS5pbnN0YW5jZU9mKEJ1ZmZlcik7XG4gICAgICBwYXlsb2FkLmxlbmd0aC5zaG91bGQuYmUuZ3JlYXRlclRoYW4oMCk7XG5cbiAgICAgIC8vIFZlcmlmeSBwYXlsb2FkIGlzIGRldGVybWluaXN0aWMgLSByZWJ1aWxkaW5nIHdpdGggc2FtZSBwYXJhbXMgcHJvZHVjZXMgc2FtZSBwYXlsb2FkXG4gICAgICBjb25zdCB0eEJ1aWxkZXIyID0gY3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcbiAgICAgIHR4QnVpbGRlcjIuc2VuZGVyKHZlcnNpb25lZFR4RGF0YS5zdGF0aWNBY2NvdW50S2V5c1swXSk7XG4gICAgICB0eEJ1aWxkZXIyLm5vbmNlKHRlc3REYXRhLmJsb2NrSGFzaGVzLnZhbGlkQmxvY2tIYXNoZXNbMF0pO1xuICAgICAgY29uc3QgdHgyID0gYXdhaXQgdHhCdWlsZGVyMi5idWlsZCgpO1xuICAgICAgc2hvdWxkLmVxdWFsKHR4Mi5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpLCBwYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGV4dHJhY3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBmcm9tIEp1cGl0ZXIgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICB0eEJ1aWxkZXIuZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh2ZXJzaW9uZWRUeERhdGEpO1xuXG4gICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCk7XG5cbiAgICAgIC8vIFZlcmlmeSB3ZSBleHRyYWN0ZWQgaW5zdHJ1Y3Rpb25zXG4gICAgICBpbnN0cnVjdGlvbnMubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgIGluc3RydWN0aW9ucy5sZW5ndGguc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS52ZXJzaW9uZWRJbnN0cnVjdGlvbnMubGVuZ3RoKTtcblxuICAgICAgLy8gVmVyaWZ5IGVhY2ggaW5zdHJ1Y3Rpb24gaGFzIHZhbGlkIGNvbXBpbGVkIGZvcm1hdFxuICAgICAgZm9yIChjb25zdCBpbnN0cnVjdGlvbiBvZiBpbnN0cnVjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gaW5zdHJ1Y3Rpb24ucGFyYW1zIGFzIFNvbFZlcnNpb25lZEluc3RydWN0aW9uO1xuICAgICAgICAodHlwZW9mIHBhcmFtcy5wcm9ncmFtSWRJbmRleCkuc2hvdWxkLmVxdWFsKCdudW1iZXInKTtcbiAgICAgICAgcGFyYW1zLnByb2dyYW1JZEluZGV4LnNob3VsZC5iZS5ncmVhdGVyVGhhbk9yRXF1YWwoMCk7XG4gICAgICAgIEFycmF5LmlzQXJyYXkocGFyYW1zLmFjY291bnRLZXlJbmRleGVzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgICAgICh0eXBlb2YgcGFyYW1zLmRhdGEpLnNob3VsZC5lcXVhbCgnc3RyaW5nJyk7XG4gICAgICAgIC8vIERhdGEgc2hvdWxkIGJlIHZhbGlkIGJhc2U1OCBzdHJpbmcgKG5vbi1lbXB0eSlcbiAgICAgICAgcGFyYW1zLmRhdGEubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcbiAgICAgICAgLy8gVmVyaWZ5IGl0IGNhbiBiZSBkZWNvZGVkXG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gYmFzZTU4LmRlY29kZShwYXJhbXMuZGF0YSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjbGVhciBpbnN0cnVjdGlvbnMgcHJvcGVybHkgYWZ0ZXIgdXNpbmcgZnJvbVZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGN1c3RvbUluc3RydWN0aW9uQnVpbGRlcigpO1xuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG4gICAgICB0eEJ1aWxkZXIuZ2V0SW5zdHJ1Y3Rpb25zKCkubGVuZ3RoLnNob3VsZC5iZS5ncmVhdGVyVGhhbigwKTtcblxuICAgICAgLy8gQ2xlYXIgc2hvdWxkIHdvcmtcbiAgICAgIHR4QnVpbGRlci5jbGVhckluc3RydWN0aW9ucygpO1xuICAgICAgdHhCdWlsZGVyLmdldEluc3RydWN0aW9ucygpLnNob3VsZC5oYXZlLmxlbmd0aCgwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXh0cmFjdCBmZWUgcGF5ZXIgZnJvbSBzdGF0aWNBY2NvdW50S2V5cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0Q3VzdG9tSW5zdHJ1Y3Rpb25CdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcblxuICAgICAgY29uc3QgdmVyc2lvbmVkVHhEYXRhID0gZXh0cmFjdFZlcnNpb25lZFRyYW5zYWN0aW9uRGF0YSh0ZXN0RGF0YS5KVVBJVEVSX1ZFUlNJT05FRF9UWF9CWVRFUyk7XG5cbiAgICAgIHR4QnVpbGRlci5mcm9tVmVyc2lvbmVkVHJhbnNhY3Rpb25EYXRhKHZlcnNpb25lZFR4RGF0YSk7XG5cbiAgICAgIGNvbnN0IHNlbmRlciA9IHR4QnVpbGRlclsnX3NlbmRlciddO1xuICAgICAgc2hvdWxkLmV4aXN0KHNlbmRlcik7XG4gICAgICBzZW5kZXIuc2hvdWxkLmVxdWFsKHZlcnNpb25lZFR4RGF0YS5zdGF0aWNBY2NvdW50S2V5c1swXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBvdmVycmlkZSBleGlzdGluZyBzZW5kZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBjdXN0b21JbnN0cnVjdGlvbkJ1aWxkZXIoKTtcbiAgICAgIGNvbnN0IHZlcnNpb25lZFR4RGF0YSA9IGV4dHJhY3RWZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodGVzdERhdGEuSlVQSVRFUl9WRVJTSU9ORURfVFhfQllURVMpO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbFNlbmRlciA9IHR4QnVpbGRlclsnX3NlbmRlciddO1xuICAgICAgdHhCdWlsZGVyLmZyb21WZXJzaW9uZWRUcmFuc2FjdGlvbkRhdGEodmVyc2lvbmVkVHhEYXRhKTtcblxuICAgICAgY29uc3Qgc2VuZGVyID0gdHhCdWlsZGVyWydfc2VuZGVyJ107XG4gICAgICBzZW5kZXIuc2hvdWxkLmVxdWFsKG9yaWdpbmFsU2VuZGVyKTtcbiAgICAgIHNlbmRlci5zaG91bGQuZXF1YWwoYXV0aEFjY291bnQucHViKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakingActivateBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/stakingActivateBuilder.ts"],"names":[],"mappings":""}
|