@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 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,430 @@
|
|
|
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 testData = __importStar(require("../../resources/sol"));
|
|
41
|
+
const getBuilderFactory_1 = require("../getBuilderFactory");
|
|
42
|
+
const src_1 = require("../../../src");
|
|
43
|
+
const constants_1 = require("../../../src/lib/constants");
|
|
44
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
45
|
+
describe('Sol Staking Activate Builder', () => {
|
|
46
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
47
|
+
const stakingBuilder = () => {
|
|
48
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
49
|
+
txBuilder.nonce(recentBlockHash);
|
|
50
|
+
txBuilder.sender(wallet.pub);
|
|
51
|
+
return txBuilder;
|
|
52
|
+
};
|
|
53
|
+
// not valid data
|
|
54
|
+
const invalidPubKey = testData.pubKeys.invalidPubKeys[0];
|
|
55
|
+
const wrongAccount = new src_1.KeyPair({ prv: testData.prvKeys.prvKey1.base58 }).getKeys();
|
|
56
|
+
// valid data
|
|
57
|
+
const wallet = new src_1.KeyPair(testData.authAccount).getKeys();
|
|
58
|
+
const stakeAccount = new src_1.KeyPair(testData.stakeAccount).getKeys();
|
|
59
|
+
const validator = testData.validator;
|
|
60
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
61
|
+
const amount = '300000';
|
|
62
|
+
const performTest = async ({ signBuilder, knownRawTx, makeUnsignedBuilder, verifyBuiltTransaction, }) => {
|
|
63
|
+
// Build transaction
|
|
64
|
+
const txBuilder = makeUnsignedBuilder();
|
|
65
|
+
const unsignedTx = await txBuilder.build();
|
|
66
|
+
const tx = signBuilder ? await signBuilder(txBuilder).build() : unsignedTx;
|
|
67
|
+
// Verify built transaction
|
|
68
|
+
verifyBuiltTransaction(tx);
|
|
69
|
+
// Verify raw transaction
|
|
70
|
+
const rawTx = tx.toBroadcastFormat();
|
|
71
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
72
|
+
should_1.default.equal(rawTx, knownRawTx);
|
|
73
|
+
// Rebuild transaction and verify
|
|
74
|
+
const builderFromRawTx = factory.from(rawTx);
|
|
75
|
+
const rebuiltTx = await builderFromRawTx.build();
|
|
76
|
+
should_1.default.equal(rebuiltTx.toBroadcastFormat(), unsignedTx.toBroadcastFormat());
|
|
77
|
+
should_1.default.equal(rebuiltTx.signablePayload.toString('hex'), unsignedTx.signablePayload.toString('hex'));
|
|
78
|
+
should_1.default.deepEqual(rebuiltTx.toJson().instructionsData, tx.toJson().instructionsData);
|
|
79
|
+
};
|
|
80
|
+
const makeUnsignedBuilderNative = (doMemo) => {
|
|
81
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
82
|
+
txBuilder
|
|
83
|
+
.amount(amount)
|
|
84
|
+
.sender(wallet.pub)
|
|
85
|
+
.stakingAddress(stakeAccount.pub)
|
|
86
|
+
.validator(validator.pub)
|
|
87
|
+
.nonce(recentBlockHash);
|
|
88
|
+
if (doMemo) {
|
|
89
|
+
txBuilder.memo('test memo');
|
|
90
|
+
}
|
|
91
|
+
return txBuilder;
|
|
92
|
+
};
|
|
93
|
+
const verifyBuiltTransactionNativeOrMarinade = (tx, doMemo, stakingType) => {
|
|
94
|
+
const txJson = tx.toJson();
|
|
95
|
+
txJson.instructionsData.should.deepEqual([
|
|
96
|
+
...(doMemo
|
|
97
|
+
? [
|
|
98
|
+
{
|
|
99
|
+
type: 'Memo',
|
|
100
|
+
params: {
|
|
101
|
+
memo: 'test memo',
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
]
|
|
105
|
+
: []),
|
|
106
|
+
{
|
|
107
|
+
type: 'Activate',
|
|
108
|
+
params: {
|
|
109
|
+
fromAddress: wallet.pub,
|
|
110
|
+
stakingAddress: stakeAccount.pub,
|
|
111
|
+
amount: amount,
|
|
112
|
+
validator: validator.pub,
|
|
113
|
+
stakingType,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
]);
|
|
117
|
+
tx.inputs.should.deepEqual([
|
|
118
|
+
{
|
|
119
|
+
address: wallet.pub,
|
|
120
|
+
value: amount,
|
|
121
|
+
coin: 'tsol',
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
tx.outputs.should.deepEqual([
|
|
125
|
+
{
|
|
126
|
+
address: stakeAccount.pub,
|
|
127
|
+
value: amount,
|
|
128
|
+
coin: 'tsol',
|
|
129
|
+
},
|
|
130
|
+
]);
|
|
131
|
+
};
|
|
132
|
+
const signBuilderNativeOrMarinade = (txBuilder) => {
|
|
133
|
+
txBuilder.sign({ key: wallet.prv });
|
|
134
|
+
txBuilder.sign({ key: stakeAccount.prv });
|
|
135
|
+
return txBuilder;
|
|
136
|
+
};
|
|
137
|
+
const makeUnsignedBuilderMarinade = (doMemo) => {
|
|
138
|
+
return makeUnsignedBuilderNative(doMemo).stakingType(public_types_1.SolStakingTypeEnum.MARINADE);
|
|
139
|
+
};
|
|
140
|
+
const makeUnsignedBuilderJito = (doMemo, doCreateATA) => {
|
|
141
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
142
|
+
txBuilder
|
|
143
|
+
.amount(amount)
|
|
144
|
+
.sender(wallet.pub)
|
|
145
|
+
.stakingAddress(constants_1.JITO_STAKE_POOL_ADDRESS)
|
|
146
|
+
.validator(constants_1.JITO_STAKE_POOL_ADDRESS)
|
|
147
|
+
.stakingType(public_types_1.SolStakingTypeEnum.JITO)
|
|
148
|
+
.extraParams({
|
|
149
|
+
stakePoolData: {
|
|
150
|
+
managerFeeAccount: testData.JITO_STAKE_POOL_DATA_PARSED.managerFeeAccount.toString(),
|
|
151
|
+
poolMint: testData.JITO_STAKE_POOL_DATA_PARSED.poolMint.toString(),
|
|
152
|
+
reserveStake: testData.JITO_STAKE_POOL_DATA_PARSED.reserveStake.toString(),
|
|
153
|
+
},
|
|
154
|
+
createAssociatedTokenAccount: doCreateATA,
|
|
155
|
+
})
|
|
156
|
+
.nonce(recentBlockHash);
|
|
157
|
+
if (doMemo) {
|
|
158
|
+
txBuilder.memo('test memo');
|
|
159
|
+
}
|
|
160
|
+
return txBuilder;
|
|
161
|
+
};
|
|
162
|
+
const signBuilderJito = (txBuilder) => {
|
|
163
|
+
txBuilder.sign({ key: wallet.prv });
|
|
164
|
+
return txBuilder;
|
|
165
|
+
};
|
|
166
|
+
const verifyBuiltTransactionJito = (tx, doMemo, doCreateATA) => {
|
|
167
|
+
const txJson = tx.toJson();
|
|
168
|
+
const expectedInstructions = [];
|
|
169
|
+
if (doCreateATA) {
|
|
170
|
+
expectedInstructions.push({
|
|
171
|
+
type: constants_1.InstructionBuilderTypes.CreateAssociatedTokenAccount,
|
|
172
|
+
params: {
|
|
173
|
+
ataAddress: '2vJrx2Bn7PifLZDRaSCpphE9WtZsx1k43SRyiQDhE1As',
|
|
174
|
+
mintAddress: constants_1.JITOSOL_MINT_ADDRESS,
|
|
175
|
+
ownerAddress: wallet.pub,
|
|
176
|
+
payerAddress: wallet.pub,
|
|
177
|
+
tokenName: 'sol:jitosol',
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
if (doMemo) {
|
|
182
|
+
expectedInstructions.push({
|
|
183
|
+
type: constants_1.InstructionBuilderTypes.Memo,
|
|
184
|
+
params: {
|
|
185
|
+
memo: 'test memo',
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
expectedInstructions.push({
|
|
190
|
+
type: constants_1.InstructionBuilderTypes.StakingActivate,
|
|
191
|
+
params: {
|
|
192
|
+
fromAddress: wallet.pub,
|
|
193
|
+
stakingAddress: constants_1.JITO_STAKE_POOL_ADDRESS,
|
|
194
|
+
amount: amount,
|
|
195
|
+
validator: constants_1.JITO_STAKE_POOL_ADDRESS,
|
|
196
|
+
stakingType: public_types_1.SolStakingTypeEnum.JITO,
|
|
197
|
+
extraParams: {
|
|
198
|
+
stakePoolData: {
|
|
199
|
+
managerFeeAccount: testData.JITO_STAKE_POOL_DATA_PARSED.managerFeeAccount.toString(),
|
|
200
|
+
poolMint: testData.JITO_STAKE_POOL_DATA_PARSED.poolMint.toString(),
|
|
201
|
+
reserveStake: testData.JITO_STAKE_POOL_DATA_PARSED.reserveStake.toString(),
|
|
202
|
+
},
|
|
203
|
+
createAssociatedTokenAccount: doCreateATA,
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
txJson.instructionsData.should.deepEqual(expectedInstructions);
|
|
208
|
+
tx.inputs.should.deepEqual([
|
|
209
|
+
{
|
|
210
|
+
address: wallet.pub,
|
|
211
|
+
value: amount,
|
|
212
|
+
coin: 'tsol',
|
|
213
|
+
},
|
|
214
|
+
]);
|
|
215
|
+
tx.outputs.should.deepEqual([]);
|
|
216
|
+
};
|
|
217
|
+
describe('Succeed', () => {
|
|
218
|
+
describe('Native staking tests', () => {
|
|
219
|
+
const performTestNative = async (doMemo, doSign, knownRawTx) => {
|
|
220
|
+
await performTest({
|
|
221
|
+
signBuilder: doSign ? signBuilderNativeOrMarinade : undefined,
|
|
222
|
+
knownRawTx,
|
|
223
|
+
makeUnsignedBuilder: () => makeUnsignedBuilderNative(doMemo),
|
|
224
|
+
verifyBuiltTransaction: (x) => verifyBuiltTransactionNativeOrMarinade(x, doMemo, public_types_1.SolStakingTypeEnum.NATIVE),
|
|
225
|
+
});
|
|
226
|
+
};
|
|
227
|
+
it('build a create and delegate staking signed tx', async () => performTestNative(false, true, testData.STAKING_ACTIVATE_SIGNED_TX));
|
|
228
|
+
it('build a create and delegate staking signed tx with memo', async () => performTestNative(true, true, testData.STAKING_ACTIVATE_SIGNED_TX_WITH_MEMO));
|
|
229
|
+
it('build a create and delegate staking unsigned tx', async () => performTestNative(false, false, testData.STAKING_ACTIVATE_UNSIGNED_TX));
|
|
230
|
+
it('build a create and delegate staking unsigned tx with memo', async () => performTestNative(true, false, testData.STAKING_ACTIVATE_UNSIGNED_TX_WITH_MEMO));
|
|
231
|
+
});
|
|
232
|
+
describe('Marinade staking tests', () => {
|
|
233
|
+
const performTestMarinade = async (doMemo, doSign, knownRawTx) => {
|
|
234
|
+
await performTest({
|
|
235
|
+
signBuilder: doSign ? signBuilderNativeOrMarinade : undefined,
|
|
236
|
+
knownRawTx,
|
|
237
|
+
makeUnsignedBuilder: () => makeUnsignedBuilderMarinade(doMemo),
|
|
238
|
+
verifyBuiltTransaction: (x) => verifyBuiltTransactionNativeOrMarinade(x, doMemo, public_types_1.SolStakingTypeEnum.MARINADE),
|
|
239
|
+
});
|
|
240
|
+
};
|
|
241
|
+
it('build a create staking signed tx', async () => performTestMarinade(false, true, testData.MARINADE_STAKING_ACTIVATE_SIGNED_TX));
|
|
242
|
+
it('build a create signed tx with memo', async () => performTestMarinade(true, true, testData.MARINADE_STAKING_ACTIVATE_SIGNED_TX_WITH_MEMO));
|
|
243
|
+
it('build a create unsigned tx', async () => performTestMarinade(false, false, testData.MARINADE_STAKING_ACTIVATE_UNSIGNED_TX));
|
|
244
|
+
it('build a create unsigned tx with memo', async () => performTestMarinade(true, false, testData.MARINADE_STAKING_ACTIVATE_UNSIGNED_TX_WITH_MEMO));
|
|
245
|
+
});
|
|
246
|
+
describe('Jito staking tests', () => {
|
|
247
|
+
const performTestJito = async (doMemo, doSign, doCreateATA, knownRawTx) => {
|
|
248
|
+
await performTest({
|
|
249
|
+
signBuilder: doSign ? signBuilderJito : undefined,
|
|
250
|
+
knownRawTx,
|
|
251
|
+
makeUnsignedBuilder: () => makeUnsignedBuilderJito(doMemo, doCreateATA),
|
|
252
|
+
verifyBuiltTransaction: (x) => verifyBuiltTransactionJito(x, doMemo, doCreateATA),
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
const MEMO = 1;
|
|
256
|
+
const SIGN = 2;
|
|
257
|
+
const ATA = 4;
|
|
258
|
+
const rawTxData = Array.from(new Array(8)).map(() => undefined);
|
|
259
|
+
rawTxData[0] = testData.JITO_STAKING_ACTIVATE_UNSIGNED_TX;
|
|
260
|
+
rawTxData[MEMO] = testData.JITO_STAKING_ACTIVATE_UNSIGNED_TX_WITH_MEMO;
|
|
261
|
+
rawTxData[SIGN] = testData.JITO_STAKING_ACTIVATE_SIGNED_TX;
|
|
262
|
+
rawTxData[MEMO + SIGN] = testData.JITO_STAKING_ACTIVATE_SIGNED_TX_WITH_MEMO;
|
|
263
|
+
rawTxData[ATA] = testData.JITO_STAKING_ACTIVATE_UNSIGNED_TX_WITH_ATA;
|
|
264
|
+
rawTxData[ATA + MEMO] = testData.JITO_STAKING_ACTIVATE_UNSIGNED_TX_WITH_MEMO_WITH_ATA;
|
|
265
|
+
rawTxData[ATA + SIGN] = testData.JITO_STAKING_ACTIVATE_SIGNED_TX_WITH_ATA;
|
|
266
|
+
rawTxData[ATA + MEMO + SIGN] = testData.JITO_STAKING_ACTIVATE_SIGNED_TX_WITH_MEMO_WITH_ATA;
|
|
267
|
+
for (const doMemo of [false, true]) {
|
|
268
|
+
for (const doSign of [false, true]) {
|
|
269
|
+
for (const doCreateATA of [false, true]) {
|
|
270
|
+
it(`build a tx with doMemo=${doMemo}, doSign=${doSign}, doCreateATA=${doCreateATA}`, async () => {
|
|
271
|
+
const data = rawTxData[(doMemo ? MEMO : 0) + (doSign ? SIGN : 0) + (doCreateATA ? ATA : 0)];
|
|
272
|
+
(0, should_1.default)(data).not.be.undefined();
|
|
273
|
+
await performTestJito(doMemo, doSign, doCreateATA, data ?? '');
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
describe('Fail', () => {
|
|
281
|
+
it('for invalid sender address', () => {
|
|
282
|
+
const txBuilder = stakingBuilder();
|
|
283
|
+
(0, should_1.default)(() => txBuilder.sender(invalidPubKey)).throwError('Invalid or missing sender, got: ' + invalidPubKey);
|
|
284
|
+
});
|
|
285
|
+
it('for invalid staking address', () => {
|
|
286
|
+
const txBuilder = stakingBuilder();
|
|
287
|
+
(0, should_1.default)(() => txBuilder.stakingAddress(invalidPubKey)).throwError('Invalid or missing stakingAddress, got: ' + invalidPubKey);
|
|
288
|
+
});
|
|
289
|
+
it('for invalid validator address', () => {
|
|
290
|
+
const txBuilder = stakingBuilder();
|
|
291
|
+
(0, should_1.default)(() => txBuilder.validator(invalidPubKey)).throwError('Invalid or missing validator, got: ' + invalidPubKey);
|
|
292
|
+
});
|
|
293
|
+
it('build a staking activate tx when amount is invalid', () => {
|
|
294
|
+
const txBuilder = stakingBuilder();
|
|
295
|
+
(0, should_1.default)(() => txBuilder.amount('randomstring')).throwError('Value cannot be zero or less');
|
|
296
|
+
});
|
|
297
|
+
it('build a staking activate tx when amount is less than zero', () => {
|
|
298
|
+
const txBuilder = stakingBuilder();
|
|
299
|
+
(0, should_1.default)(() => txBuilder.amount('-1')).throwError('Value cannot be zero or less');
|
|
300
|
+
});
|
|
301
|
+
it('build a staking activate tx when amount is equal to zero', () => {
|
|
302
|
+
const txBuilder = stakingBuilder();
|
|
303
|
+
(0, should_1.default)(() => txBuilder.amount('0')).throwError('Value cannot be zero or less');
|
|
304
|
+
});
|
|
305
|
+
it('build a staking activate tx and sign with an incorrect account', async () => {
|
|
306
|
+
const txBuilder = stakingBuilder();
|
|
307
|
+
txBuilder.sender(wallet.pub);
|
|
308
|
+
txBuilder.stakingAddress(stakeAccount.pub);
|
|
309
|
+
txBuilder.validator(validator.pub);
|
|
310
|
+
txBuilder.amount(amount);
|
|
311
|
+
txBuilder.sign({ key: wrongAccount.prv });
|
|
312
|
+
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
|
|
313
|
+
});
|
|
314
|
+
it('build a staking activate tx with the same sender and staking address', async () => {
|
|
315
|
+
const txBuilder = stakingBuilder();
|
|
316
|
+
txBuilder.sender(wallet.pub);
|
|
317
|
+
txBuilder.stakingAddress(wallet.pub);
|
|
318
|
+
txBuilder.validator(validator.pub);
|
|
319
|
+
txBuilder.amount(amount);
|
|
320
|
+
txBuilder.sign({ key: wrongAccount.prv });
|
|
321
|
+
await txBuilder.build().should.rejectedWith('Sender address cannot be the same as the Staking address');
|
|
322
|
+
});
|
|
323
|
+
it('build when nonce is not provided', async () => {
|
|
324
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
325
|
+
txBuilder.sender(wallet.pub);
|
|
326
|
+
txBuilder.stakingAddress(stakeAccount.pub);
|
|
327
|
+
txBuilder.amount(amount);
|
|
328
|
+
txBuilder.validator(validator.pub);
|
|
329
|
+
txBuilder.sign({ key: wallet.prv });
|
|
330
|
+
await txBuilder.build().should.rejectedWith('Invalid transaction: missing nonce blockhash');
|
|
331
|
+
});
|
|
332
|
+
it('build when sender is not provided', async () => {
|
|
333
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
334
|
+
txBuilder.stakingAddress(stakeAccount.pub);
|
|
335
|
+
txBuilder.amount(amount);
|
|
336
|
+
txBuilder.validator(validator.pub);
|
|
337
|
+
txBuilder.nonce(recentBlockHash);
|
|
338
|
+
txBuilder.sign({ key: wallet.prv });
|
|
339
|
+
await txBuilder.build().should.rejectedWith('Invalid transaction: missing sender');
|
|
340
|
+
});
|
|
341
|
+
it('build when stakingAddress is not provided', async () => {
|
|
342
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
343
|
+
txBuilder.sender(wallet.pub);
|
|
344
|
+
txBuilder.amount(amount);
|
|
345
|
+
txBuilder.validator(validator.pub);
|
|
346
|
+
txBuilder.nonce(recentBlockHash);
|
|
347
|
+
txBuilder.sign({ key: wallet.prv });
|
|
348
|
+
await txBuilder.build().should.rejectedWith('Staking Address must be set before building the transaction');
|
|
349
|
+
});
|
|
350
|
+
it('build when validator is not provided', async () => {
|
|
351
|
+
const txBuilder = factory.getStakingActivateBuilder();
|
|
352
|
+
txBuilder.stakingAddress(stakeAccount.pub);
|
|
353
|
+
txBuilder.sender(wallet.pub);
|
|
354
|
+
txBuilder.amount(amount);
|
|
355
|
+
txBuilder.nonce(recentBlockHash);
|
|
356
|
+
txBuilder.sign({ key: wallet.prv });
|
|
357
|
+
await txBuilder.build().should.rejectedWith('Validator must be set before building the transaction');
|
|
358
|
+
});
|
|
359
|
+
it('to sign twice with the same key', () => {
|
|
360
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_UNSIGNED_TX);
|
|
361
|
+
txBuilder.sign({ key: wallet.prv });
|
|
362
|
+
(0, should_1.default)(() => txBuilder.sign({ key: wallet.prv })).throwError('Duplicated signer: ' + wallet.prv?.toString());
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
describe('From and sign', () => {
|
|
366
|
+
describe('Succeed', () => {
|
|
367
|
+
it('build from an unsigned staking activate and sign it', async () => {
|
|
368
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_UNSIGNED_TX);
|
|
369
|
+
txBuilder.sign({ key: wallet.prv });
|
|
370
|
+
txBuilder.sign({ key: stakeAccount.prv });
|
|
371
|
+
const tx = await txBuilder.build();
|
|
372
|
+
tx.inputs.length.should.equal(1);
|
|
373
|
+
tx.inputs[0].should.deepEqual({
|
|
374
|
+
address: wallet.pub,
|
|
375
|
+
value: amount,
|
|
376
|
+
coin: 'tsol',
|
|
377
|
+
});
|
|
378
|
+
tx.outputs.length.should.equal(1);
|
|
379
|
+
const rawTx = tx.toBroadcastFormat();
|
|
380
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
381
|
+
should_1.default.equal(rawTx, testData.STAKING_ACTIVATE_SIGNED_TX);
|
|
382
|
+
});
|
|
383
|
+
it('Marinade: build from an unsigned staking activate and sign it', async () => {
|
|
384
|
+
const txBuilder = factory.from(testData.MARINADE_STAKING_ACTIVATE_UNSIGNED_TX);
|
|
385
|
+
txBuilder.sign({ key: wallet.prv });
|
|
386
|
+
txBuilder.sign({ key: stakeAccount.prv });
|
|
387
|
+
const tx = await txBuilder.build();
|
|
388
|
+
tx.inputs.length.should.equal(1);
|
|
389
|
+
tx.inputs[0].should.deepEqual({
|
|
390
|
+
address: wallet.pub,
|
|
391
|
+
value: amount,
|
|
392
|
+
coin: 'tsol',
|
|
393
|
+
});
|
|
394
|
+
tx.outputs.length.should.equal(1);
|
|
395
|
+
const rawTx = tx.toBroadcastFormat();
|
|
396
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
397
|
+
should_1.default.equal(rawTx, testData.MARINADE_STAKING_ACTIVATE_SIGNED_TX);
|
|
398
|
+
});
|
|
399
|
+
it('build from an unsigned staking activate with memo and sign it', async () => {
|
|
400
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_UNSIGNED_TX_WITH_MEMO);
|
|
401
|
+
txBuilder.sign({ key: wallet.prv });
|
|
402
|
+
txBuilder.sign({ key: stakeAccount.prv });
|
|
403
|
+
const tx = await txBuilder.build();
|
|
404
|
+
tx.inputs.length.should.equal(1);
|
|
405
|
+
tx.inputs[0].should.deepEqual({
|
|
406
|
+
address: wallet.pub,
|
|
407
|
+
value: amount,
|
|
408
|
+
coin: 'tsol',
|
|
409
|
+
});
|
|
410
|
+
tx.outputs.length.should.equal(1);
|
|
411
|
+
const rawTx = tx.toBroadcastFormat();
|
|
412
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
413
|
+
should_1.default.equal(rawTx, testData.STAKING_ACTIVATE_SIGNED_TX_WITH_MEMO);
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
describe('Fail', () => {
|
|
417
|
+
it('build from an unsigned staking activate and fail to sign it', async () => {
|
|
418
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_UNSIGNED_TX);
|
|
419
|
+
txBuilder.sign({ key: wrongAccount.prv });
|
|
420
|
+
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
|
|
421
|
+
});
|
|
422
|
+
it('build from a signed staking activate and fail to sign it', async () => {
|
|
423
|
+
const txBuilder = factory.from(testData.STAKING_ACTIVATE_SIGNED_TX);
|
|
424
|
+
txBuilder.sign({ key: wrongAccount.prv });
|
|
425
|
+
await txBuilder.build().should.rejectedWith('unknown signer: CP5Dpaa42RtJmMuKqCQsLwma5Yh3knuvKsYDFX85F41S');
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ0FjdGl2YXRlQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2FjdGlvbkJ1aWxkZXIvc3Rha2luZ0FjdGl2YXRlQnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw4REFBZ0Q7QUFDaEQsNERBQXlEO0FBQ3pELHNDQUFzRTtBQUN0RSwwREFBb0g7QUFDcEgsc0RBQXlEO0FBSXpELFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7SUFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUxQyxNQUFNLGNBQWMsR0FBRyxHQUFHLEVBQUU7UUFDMUIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDdEQsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFRixpQkFBaUI7SUFDakIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekQsTUFBTSxZQUFZLEdBQUcsSUFBSSxhQUFPLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUVyRixhQUFhO0lBQ2IsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLElBQUksYUFBTyxDQUFDLFFB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QUcsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztnQkFDdEUsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDMUMsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyw4REFBOEQsQ0FBQyxDQUFDO1lBQzlHLENBQUMsQ0FBQyxDQUFDO1lBQ0gsRUFBRSxDQUFDLDBEQUEwRCxFQUFFLEtBQUssSUFBSSxFQUFFO2dCQUN4RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2dCQUNwRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7WUFDOUcsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9zb2wnO1xuaW1wb3J0IHsgZ2V0QnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi9nZXRCdWlsZGVyRmFjdG9yeSc7XG5pbXBvcnQgeyBLZXlQYWlyLCBVdGlscywgU3Rha2luZ0FjdGl2YXRlQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvbkJ1aWxkZXJUeXBlcywgSklUT19TVEFLRV9QT09MX0FERFJFU1MsIEpJVE9TT0xfTUlOVF9BRERSRVNTIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU29sU3Rha2luZ1R5cGVFbnVtIH0gZnJvbSAnQGJpdGdvL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb24gfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBJbnN0cnVjdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuXG5kZXNjcmliZSgnU29sIFN0YWtpbmcgQWN0aXZhdGUgQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KCd0c29sJyk7XG5cbiAgY29uc3Qgc3Rha2luZ0J1aWxkZXIgPSAoKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXQucHViKTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIC8vIG5vdCB2YWxpZCBkYXRhXG4gIGNvbnN0IGludmFsaWRQdWJLZXkgPSB0ZXN0RGF0YS5wdWJLZXlzLmludmFsaWRQdWJLZXlzWzBdO1xuICBjb25zdCB3cm9uZ0FjY291bnQgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEucHJ2S2V5cy5wcnZLZXkxLmJhc2U1OCB9KS5nZXRLZXlzKCk7XG5cbiAgLy8gdmFsaWQgZGF0YVxuICBjb25zdCB3YWxsZXQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hdXRoQWNjb3VudCkuZ2V0S2V5cygpO1xuICBjb25zdCBzdGFrZUFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5zdGFrZUFjY291bnQpLmdldEtleXMoKTtcbiAgY29uc3QgdmFsaWRhdG9yID0gdGVzdERhdGEudmFsaWRhdG9yO1xuXG4gIGNvbnN0IHJlY2VudEJsb2NrSGFzaCA9ICdHSHRYUUJzb1pIVm5ORmE5WWV2QXpGcjE3REpqZ0hYazN5Y1RLRDV4RDNaaSc7XG4gIGNvbnN0IGFtb3VudCA9ICczMDAwMDAnO1xuXG4gIGNvbnN0IHBlcmZvcm1UZXN0ID0gYXN5bmMgKHtcbiAgICBzaWduQnVpbGRlcixcbiAgICBrbm93blJhd1R4LFxuICAgIG1ha2VVbnNpZ25lZEJ1aWxkZXIsXG4gICAgdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbixcbiAgfToge1xuICAgIHNpZ25CdWlsZGVyPzogdW5kZWZpbmVkIHwgKCh4OiBTdGFraW5nQWN0aXZhdGVCdWlsZGVyKSA9PiBTdGFraW5nQWN0aXZhdGVCdWlsZGVyKTtcbiAgICBrbm93blJhd1R4OiBzdHJpbmc7XG4gICAgbWFrZVVuc2lnbmVkQnVpbGRlcjogKCkgPT4gU3Rha2luZ0FjdGl2YXRlQnVpbGRlcjtcbiAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uOiAoeDogQmFzZVRyYW5zYWN0aW9uKSA9PiB2b2lkO1xuICB9KSA9PiB7XG4gICAgLy8gQnVpbGQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBtYWtlVW5zaWduZWRCdWlsZGVyKCk7XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4ID0gc2lnbkJ1aWxkZXIgPyBhd2FpdCBzaWduQnVpbGRlcih0eEJ1aWxkZXIpLmJ1aWxkKCkgOiB1bnNpZ25lZFR4O1xuXG4gICAgLy8gVmVyaWZ5IGJ1aWx0IHRyYW5zYWN0aW9uXG4gICAgdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbih0eCk7XG5cbiAgICAvLyBWZXJpZnkgcmF3IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICBzaG91bGQuZXF1YWwocmF3VHgsIGtub3duUmF3VHgpO1xuXG4gICAgLy8gUmVidWlsZCB0cmFuc2FjdGlvbiBhbmQgdmVyaWZ5XG4gICAgY29uc3QgYnVpbGRlckZyb21SYXdUeCA9IGZhY3RvcnkuZnJvbShyYXdUeCk7XG4gICAgY29uc3QgcmVidWlsdFR4ID0gYXdhaXQgYnVpbGRlckZyb21SYXdUeC5idWlsZCgpO1xuXG4gICAgc2hvdWxkLmVxdWFsKHJlYnVpbHRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpLCB1bnNpZ25lZFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkpO1xuICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSwgdW5zaWduZWRUeC5zaWduYWJsZVBheWxvYWQudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBzaG91bGQuZGVlcEVxdWFsKHJlYnVpbHRUeC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhLCB0eC50b0pzb24oKS5pbnN0cnVjdGlvbnNEYXRhKTtcbiAgfTtcblxuICBjb25zdCBtYWtlVW5zaWduZWRCdWlsZGVyTmF0aXZlID0gKGRvTWVtbzogYm9vbGVhbikgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlclxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgIC52YWxpZGF0b3IodmFsaWRhdG9yLnB1YilcbiAgICAgIC5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgIGlmIChkb01lbW8pIHtcbiAgICAgIHR4QnVpbGRlci5tZW1vKCd0ZXN0IG1lbW8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uTmF0aXZlT3JNYXJpbmFkZSA9IChcbiAgICB0eDogQmFzZVRyYW5zYWN0aW9uLFxuICAgIGRvTWVtbzogYm9vbGVhbixcbiAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRSB8IFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERVxuICApID0+IHtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5zaG91bGQuZGVlcEVxdWFsKFtcbiAgICAgIC4uLihkb01lbW9cbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHR5cGU6ICdNZW1vJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgbWVtbzogJ3Rlc3QgbWVtbycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF1cbiAgICAgICAgOiBbXSksXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdBY3RpdmF0ZScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzOiBzdGFrZUFjY291bnQucHViLFxuICAgICAgICAgIGFtb3VudDogYW1vdW50LFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yLnB1YixcbiAgICAgICAgICBzdGFraW5nVHlwZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgdHguaW5wdXRzLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHR4Lm91dHB1dHMuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHN0YWtlQWNjb3VudC5wdWIsXG4gICAgICAgIHZhbHVlOiBhbW91bnQsXG4gICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gIH07XG5cbiAgY29uc3Qgc2lnbkJ1aWxkZXJOYXRpdmVPck1hcmluYWRlID0gKHR4QnVpbGRlcjogU3Rha2luZ0FjdGl2YXRlQnVpbGRlcikgPT4ge1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXQucHJ2IH0pO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBzdGFrZUFjY291bnQucHJ2IH0pO1xuICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgbWFrZVVuc2lnbmVkQnVpbGRlck1hcmluYWRlID0gKGRvTWVtbzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBtYWtlVW5zaWduZWRCdWlsZGVyTmF0aXZlKGRvTWVtbykuc3Rha2luZ1R5cGUoU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFKTtcbiAgfTtcblxuICBjb25zdCBtYWtlVW5zaWduZWRCdWlsZGVySml0byA9IChkb01lbW86IGJvb2xlYW4sIGRvQ3JlYXRlQVRBOiBib29sZWFuKSA9PiB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgdHhCdWlsZGVyXG4gICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgIC5zdGFraW5nQWRkcmVzcyhKSVRPX1NUQUtFX1BPT0xfQUREUkVTUylcbiAgICAgIC52YWxpZGF0b3IoSklUT19TVEFLRV9QT09MX0FERFJFU1MpXG4gICAgICAuc3Rha2luZ1R5cGUoU29sU3Rha2luZ1R5cGVFbnVtLkpJVE8pXG4gICAgICAuZXh0cmFQYXJhbXMoe1xuICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgbWFuYWdlckZlZUFjY291bnQ6IHRlc3REYXRhLkpJVE9fU1RBS0VfUE9PTF9EQVRBX1BBUlNFRC5tYW5hZ2VyRmVlQWNjb3VudC50b1N0cmluZygpLFxuICAgICAgICAgIHBvb2xNaW50OiB0ZXN0RGF0YS5KSVRPX1NUQUtFX1BPT0xfREFUQV9QQVJTRUQucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICByZXNlcnZlU3Rha2U6IHRlc3REYXRhLkpJVE9fU1RBS0VfUE9PTF9EQVRBX1BBUlNFRC5yZXNlcnZlU3Rha2UudG9TdHJpbmcoKSxcbiAgICAgICAgfSxcbiAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDogZG9DcmVhdGVBVEEsXG4gICAgICB9KVxuICAgICAgLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgaWYgKGRvTWVtbykge1xuICAgICAgdHhCdWlsZGVyLm1lbW8oJ3Rlc3QgbWVtbycpO1xuICAgIH1cbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25CdWlsZGVySml0byA9ICh0eEJ1aWxkZXI6IFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIpID0+IHtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IHZlcmlmeUJ1aWx0VHJhbnNhY3Rpb25KaXRvID0gKHR4OiBCYXNlVHJhbnNhY3Rpb24sIGRvTWVtbzogYm9vbGVhbiwgZG9DcmVhdGVBVEE6IGJvb2xlYW4pID0+IHtcbiAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICBjb25zdCBleHBlY3RlZEluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25QYXJhbXNbXSA9IFtdO1xuXG4gICAgaWYgKGRvQ3JlYXRlQVRBKSB7XG4gICAgICBleHBlY3RlZEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuQ3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgYXRhQWRkcmVzczogJzJ2SnJ4MkJuN1BpZkxaRFJhU0NwcGhFOVd0WnN4MWs0M1NSeWlRRGhFMUFzJyxcbiAgICAgICAgICBtaW50QWRkcmVzczogSklUT1NPTF9NSU5UX0FERFJFU1MsXG4gICAgICAgICAgb3duZXJBZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICAgIHBheWVyQWRkcmVzczogd2FsbGV0LnB1YixcbiAgICAgICAgICB0b2tlbk5hbWU6ICdzb2w6aml0b3NvbCcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoZG9NZW1vKSB7XG4gICAgICBleHBlY3RlZEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgdHlwZTogSW5zdHJ1Y3Rpb25CdWlsZGVyVHlwZXMuTWVtbyxcbiAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgbWVtbzogJ3Rlc3QgbWVtbycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBleHBlY3RlZEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgIHR5cGU6IEluc3RydWN0aW9uQnVpbGRlclR5cGVzLlN0YWtpbmdBY3RpdmF0ZSxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBmcm9tQWRkcmVzczogd2FsbGV0LnB1YixcbiAgICAgICAgc3Rha2luZ0FkZHJlc3M6IEpJVE9fU1RBS0VfUE9PTF9BRERSRVNTLFxuICAgICAgICBhbW91bnQ6IGFtb3VudCxcbiAgICAgICAgdmFsaWRhdG9yOiBKSVRPX1NUQUtFX1BPT0xfQUREUkVTUyxcbiAgICAgICAgc3Rha2luZ1R5cGU6IFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPLFxuICAgICAgICBleHRyYVBhcmFtczoge1xuICAgICAgICAgIHN0YWtlUG9vbERhdGE6IHtcbiAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiB0ZXN0RGF0YS5KSVRPX1NUQUtFX1BPT0xfREFUQV9QQVJTRUQubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHBvb2xNaW50OiB0ZXN0RGF0YS5KSVRPX1NUQUtFX1BPT0xfREFUQV9QQVJTRUQucG9vbE1pbnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHJlc2VydmVTdGFrZTogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX0RBVEFfUEFSU0VELnJlc2VydmVTdGFrZS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY3JlYXRlQXNzb2NpYXRlZFRva2VuQWNjb3VudDogZG9DcmVhdGVBVEEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChleHBlY3RlZEluc3RydWN0aW9ucyk7XG4gICAgdHguaW5wdXRzLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHR4Lm91dHB1dHMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gIH07XG5cbiAgZGVzY3JpYmUoJ1N1Y2NlZWQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ05hdGl2ZSBzdGFraW5nIHRlc3RzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcGVyZm9ybVRlc3ROYXRpdmUgPSBhc3luYyAoZG9NZW1vOiBib29sZWFuLCBkb1NpZ246IGJvb2xlYW4sIGtub3duUmF3VHg6IHN0cmluZykgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdCh7XG4gICAgICAgICAgc2lnbkJ1aWxkZXI6IGRvU2lnbiA/IHNpZ25CdWlsZGVyTmF0aXZlT3JNYXJpbmFkZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBrbm93blJhd1R4LFxuICAgICAgICAgIG1ha2VVbnNpZ25lZEJ1aWxkZXI6ICgpID0+IG1ha2VVbnNpZ25lZEJ1aWxkZXJOYXRpdmUoZG9NZW1vKSxcbiAgICAgICAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uOiAoeCkgPT4gdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbk5hdGl2ZU9yTWFyaW5hZGUoeCwgZG9NZW1vLCBTb2xTdGFraW5nVHlwZUVudW0uTkFUSVZFKSxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBpdCgnYnVpbGQgYSBjcmVhdGUgYW5kIGRlbGVnYXRlIHN0YWtpbmcgc2lnbmVkIHR4JywgYXN5bmMgKCkgPT5cbiAgICAgICAgcGVyZm9ybVRlc3ROYXRpdmUoZmFsc2UsIHRydWUsIHRlc3REYXRhLlNUQUtJTkdfQUNUSVZBVEVfU0lHTkVEX1RYKSk7XG5cbiAgICAgIGl0KCdidWlsZCBhIGNyZWF0ZSBhbmQgZGVsZWdhdGUgc3Rha2luZyBzaWduZWQgdHggd2l0aCBtZW1vJywgYXN5bmMgKCkgPT5cbiAgICAgICAgcGVyZm9ybVRlc3ROYXRpdmUodHJ1ZSwgdHJ1ZSwgdGVzdERhdGEuU1RBS0lOR19BQ1RJVkFURV9TSUdORURfVFhfV0lUSF9NRU1PKSk7XG5cbiAgICAgIGl0KCdidWlsZCBhIGNyZWF0ZSBhbmQgZGVsZWdhdGUgc3Rha2luZyB1bnNpZ25lZCB0eCcsIGFzeW5jICgpID0+XG4gICAgICAgIHBlcmZvcm1UZXN0TmF0aXZlKGZhbHNlLCBmYWxzZSwgdGVzdERhdGEuU1RBS0lOR19BQ1RJVkFURV9VTlNJR05FRF9UWCkpO1xuXG4gICAgICBpdCgnYnVpbGQgYSBjcmVhdGUgYW5kIGRlbGVnYXRlIHN0YWtpbmcgdW5zaWduZWQgdHggd2l0aCBtZW1vJywgYXN5bmMgKCkgPT5cbiAgICAgICAgcGVyZm9ybVRlc3ROYXRpdmUodHJ1ZSwgZmFsc2UsIHRlc3REYXRhLlNUQUtJTkdfQUNUSVZBVEVfVU5TSUdORURfVFhfV0lUSF9NRU1PKSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnTWFyaW5hZGUgc3Rha2luZyB0ZXN0cycsICgpID0+IHtcbiAgICAgIGNvbnN0IHBlcmZvcm1UZXN0TWFyaW5hZGUgPSBhc3luYyAoZG9NZW1vOiBib29sZWFuLCBkb1NpZ246IGJvb2xlYW4sIGtub3duUmF3VHg6IHN0cmluZykgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdCh7XG4gICAgICAgICAgc2lnbkJ1aWxkZXI6IGRvU2lnbiA/IHNpZ25CdWlsZGVyTmF0aXZlT3JNYXJpbmFkZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBrbm93blJhd1R4LFxuICAgICAgICAgIG1ha2VVbnNpZ25lZEJ1aWxkZXI6ICgpID0+IG1ha2VVbnNpZ25lZEJ1aWxkZXJNYXJpbmFkZShkb01lbW8pLFxuICAgICAgICAgIHZlcmlmeUJ1aWx0VHJhbnNhY3Rpb246ICh4KSA9PiB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uTmF0aXZlT3JNYXJpbmFkZSh4LCBkb01lbW8sIFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERSksXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaXQoJ2J1aWxkIGEgY3JlYXRlIHN0YWtpbmcgc2lnbmVkIHR4JywgYXN5bmMgKCkgPT5cbiAgICAgICAgcGVyZm9ybVRlc3RNYXJpbmFkZShmYWxzZSwgdHJ1ZSwgdGVzdERhdGEuTUFSSU5BREVfU1RBS0lOR19BQ1RJVkFURV9TSUdORURfVFgpKTtcblxuICAgICAgaXQoJ2J1aWxkIGEgY3JlYXRlIHNpZ25lZCB0eCB3aXRoIG1lbW8nLCBhc3luYyAoKSA9PlxuICAgICAgICBwZXJmb3JtVGVzdE1hcmluYWRlKHRydWUsIHRydWUsIHRlc3REYXRhLk1BUklOQURFX1NUQUtJTkdfQUNUSVZBVEVfU0lHTkVEX1RYX1dJVEhfTUVNTykpO1xuXG4gICAgICBpdCgnYnVpbGQgYSBjcmVhdGUgdW5zaWduZWQgdHgnLCBhc3luYyAoKSA9PlxuICAgICAgICBwZXJmb3JtVGVzdE1hcmluYWRlKGZhbHNlLCBmYWxzZSwgdGVzdERhdGEuTUFSSU5BREVfU1RBS0lOR19BQ1RJVkFURV9VTlNJR05FRF9UWCkpO1xuXG4gICAgICBpdCgnYnVpbGQgYSBjcmVhdGUgdW5zaWduZWQgdHggd2l0aCBtZW1vJywgYXN5bmMgKCkgPT5cbiAgICAgICAgcGVyZm9ybVRlc3RNYXJpbmFkZSh0cnVlLCBmYWxzZSwgdGVzdERhdGEuTUFSSU5BREVfU1RBS0lOR19BQ1RJVkFURV9VTlNJR05FRF9UWF9XSVRIX01FTU8pKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdKaXRvIHN0YWtpbmcgdGVzdHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwZXJmb3JtVGVzdEppdG8gPSBhc3luYyAoZG9NZW1vOiBib29sZWFuLCBkb1NpZ246IGJvb2xlYW4sIGRvQ3JlYXRlQVRBOiBib29sZWFuLCBrbm93blJhd1R4OiBzdHJpbmcpID0+IHtcbiAgICAgICAgYXdhaXQgcGVyZm9ybVRlc3Qoe1xuICAgICAgICAgIHNpZ25CdWlsZGVyOiBkb1NpZ24gPyBzaWduQnVpbGRlckppdG8gOiB1bmRlZmluZWQsXG4gICAgICAgICAga25vd25SYXdUeCxcbiAgICAgICAgICBtYWtlVW5zaWduZWRCdWlsZGVyOiAoKSA9PiBtYWtlVW5zaWduZWRCdWlsZGVySml0byhkb01lbW8sIGRvQ3JlYXRlQVRBKSxcbiAgICAgICAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uOiAoeCkgPT4gdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbkppdG8oeCwgZG9NZW1vLCBkb0NyZWF0ZUFUQSksXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgTUVNTyA9IDE7XG4gICAgICBjb25zdCBTSUdOID0gMjtcbiAgICAgIGNvbnN0IEFUQSA9IDQ7XG4gICAgICBjb25zdCByYXdUeERhdGE6IChzdHJpbmcgfCB1bmRlZmluZWQpW10gPSBBcnJheS5mcm9tKG5ldyBBcnJheSg4KSkubWFwKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICByYXdUeERhdGFbMF0gPSB0ZXN0RGF0YS5KSVRPX1NUQUtJTkdfQUNUSVZBVEVfVU5TSUdORURfVFg7XG4gICAgICByYXdUeERhdGFbTUVNT10gPSB0ZXN0RGF0YS5KSVRPX1NUQUtJTkdfQUNUSVZBVEVfVU5TSUdORURfVFhfV0lUSF9NRU1PO1xuICAgICAgcmF3VHhEYXRhW1NJR05dID0gdGVzdERhdGEuSklUT19TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWDtcbiAgICAgIHJhd1R4RGF0YVtNRU1PICsgU0lHTl0gPSB0ZXN0RGF0YS5KSVRPX1NUQUtJTkdfQUNUSVZBVEVfU0lHTkVEX1RYX1dJVEhfTUVNTztcbiAgICAgIHJhd1R4RGF0YVtBVEFdID0gdGVzdERhdGEuSklUT19TVEFLSU5HX0FDVElWQVRFX1VOU0lHTkVEX1RYX1dJVEhfQVRBO1xuICAgICAgcmF3VHhEYXRhW0FUQSArIE1FTU9dID0gdGVzdERhdGEuSklUT19TVEFLSU5HX0FDVElWQVRFX1VOU0lHTkVEX1RYX1dJVEhfTUVNT19XSVRIX0FUQTtcbiAgICAgIHJhd1R4RGF0YVtBVEEgKyBTSUdOXSA9IHRlc3REYXRhLkpJVE9fU1RBS0lOR19BQ1RJVkFURV9TSUdORURfVFhfV0lUSF9BVEE7XG4gICAgICByYXdUeERhdGFbQVRBICsgTUVNTyArIFNJR05dID0gdGVzdERhdGEuSklUT19TVEFLSU5HX0FDVElWQVRFX1NJR05FRF9UWF9XSVRIX01FTU9fV0lUSF9BVEE7XG5cbiAgICAgIGZvciAoY29uc3QgZG9NZW1vIG9mIFtmYWxzZSwgdHJ1ZV0pIHtcbiAgICAgICAgZm9yIChjb25zdCBkb1NpZ24gb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgICAgIGZvciAoY29uc3QgZG9DcmVhdGVBVEEgb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgICAgICAgaXQoYGJ1aWxkIGEgdHggd2l0aCBkb01lbW89JHtkb01lbW99LCBkb1NpZ249JHtkb1NpZ259LCBkb0NyZWF0ZUFUQT0ke2RvQ3JlYXRlQVRBfWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJhd1R4RGF0YVsoZG9NZW1vID8gTUVNTyA6IDApICsgKGRvU2lnbiA/IFNJR04gOiAwKSArIChkb0NyZWF0ZUFUQSA/IEFUQSA6IDApXTtcbiAgICAgICAgICAgICAgc2hvdWxkKGRhdGEpLm5vdC5iZS51bmRlZmluZWQoKTtcbiAgICAgICAgICAgICAgYXdhaXQgcGVyZm9ybVRlc3RKaXRvKGRvTWVtbywgZG9TaWduLCBkb0NyZWF0ZUFUQSwgZGF0YSA/PyAnJyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0ZhaWwnLCAoKSA9PiB7XG4gICAgaXQoJ2ZvciBpbnZhbGlkIHNlbmRlciBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuc2VuZGVyKGludmFsaWRQdWJLZXkpKS50aHJvd0Vycm9yKCdJbnZhbGlkIG9yIG1pc3Npbmcgc2VuZGVyLCBnb3Q6ICcgKyBpbnZhbGlkUHViS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCBzdGFraW5nIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBzdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zdGFraW5nQWRkcmVzcyhpbnZhbGlkUHViS2V5KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyBzdGFraW5nQWRkcmVzcywgZ290OiAnICsgaW52YWxpZFB1YktleVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdmb3IgaW52YWxpZCB2YWxpZGF0b3IgYWRkcmVzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICBzaG91bGQoKCkgPT4gdHhCdWlsZGVyLnZhbGlkYXRvcihpbnZhbGlkUHViS2V5KSkudGhyb3dFcnJvcihcbiAgICAgICAgJ0ludmFsaWQgb3IgbWlzc2luZyB2YWxpZGF0b3IsIGdvdDogJyArIGludmFsaWRQdWJLZXlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBzdGFraW5nIGFjdGl2YXRlIHR4IHdoZW4gYW1vdW50IGlzIGludmFsaWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBzdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hbW91bnQoJ3JhbmRvbXN0cmluZycpKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgemVybyBvciBsZXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBzdGFraW5nIGFjdGl2YXRlIHR4IHdoZW4gYW1vdW50IGlzIGxlc3MgdGhhbiB6ZXJvJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHNob3VsZCgoKSA9PiB0eEJ1aWxkZXIuYW1vdW50KCctMScpKS50aHJvd0Vycm9yKCdWYWx1ZSBjYW5ub3QgYmUgemVybyBvciBsZXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgYSBzdGFraW5nIGFjdGl2YXRlIHR4IHdoZW4gYW1vdW50IGlzIGVxdWFsIHRvIHplcm8nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBzdGFraW5nQnVpbGRlcigpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5hbW91bnQoJzAnKSkudGhyb3dFcnJvcignVmFsdWUgY2Fubm90IGJlIHplcm8gb3IgbGVzcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkIGEgc3Rha2luZyBhY3RpdmF0ZSB0eCBhbmQgc2lnbiB3aXRoIGFuIGluY29ycmVjdCBhY2NvdW50JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gc3Rha2luZ0J1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdG9yKHZhbGlkYXRvci5wdWIpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdyb25nQWNjb3VudC5wcnYgfSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCBhIHN0YWtpbmcgYWN0aXZhdGUgdHggd2l0aCB0aGUgc2FtZSBzZW5kZXIgYW5kIHN0YWtpbmcgYWRkcmVzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IHN0YWtpbmdCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnN0YWtpbmdBZGRyZXNzKHdhbGxldC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLnZhbGlkYXRvcih2YWxpZGF0b3IucHViKTtcbiAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3cm9uZ0FjY291bnQucHJ2IH0pO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgnU2VuZGVyIGFkZHJlc3MgY2Fubm90IGJlIHRoZSBzYW1lIGFzIHRoZSBTdGFraW5nIGFkZHJlc3MnKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZCB3aGVuIG5vbmNlIGlzIG5vdCBwcm92aWRlZCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0FjdGl2YXRlQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXQucHViKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQWRkcmVzcyhzdGFrZUFjY291bnQucHViKTtcbiAgICAgIHR4QnVpbGRlci5hbW91bnQoYW1vdW50KTtcbiAgICAgIHR4QnVpbGRlci52YWxpZGF0b3IodmFsaWRhdG9yLnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgbm9uY2UgYmxvY2toYXNoJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgd2hlbiBzZW5kZXIgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdG9yKHZhbGlkYXRvci5wdWIpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3Npbmcgc2VuZGVyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgd2hlbiBzdGFraW5nQWRkcmVzcyBpcyBub3QgcHJvdmlkZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuYW1vdW50KGFtb3VudCk7XG4gICAgICB0eEJ1aWxkZXIudmFsaWRhdG9yKHZhbGlkYXRvci5wdWIpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ1N0YWtpbmcgQWRkcmVzcyBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGQgd2hlbiB2YWxpZGF0b3IgaXMgbm90IHByb3ZpZGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nQWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHdhbGxldC5wdWIpO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudChhbW91bnQpO1xuICAgICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ1ZhbGlkYXRvciBtdXN0IGJlIHNldCBiZWZvcmUgYnVpbGRpbmcgdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfSk7XG5cbiAgICBpdCgndG8gc2lnbiB0d2ljZSB3aXRoIHRoZSBzYW1lIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1VOU0lHTkVEX1RYKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXQucHJ2IH0pO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXQucHJ2IH0pKS50aHJvd0Vycm9yKCdEdXBsaWNhdGVkIHNpZ25lcjogJyArIHdhbGxldC5wcnY/LnRvU3RyaW5nKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRnJvbSBhbmQgc2lnbicsICgpID0+IHtcbiAgICBkZXNjcmliZSgnU3VjY2VlZCcsICgpID0+IHtcbiAgICAgIGl0KCdidWlsZCBmcm9tIGFuIHVuc2lnbmVkIHN0YWtpbmcgYWN0aXZhdGUgYW5kIHNpZ24gaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0RGF0YS5TVEFLSU5HX0FDVElWQVRFX1VOU0lHTkVEX1RYKTtcblxuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHN0YWtlQWNjb3VudC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIHR4LmlucHV0cy5sZW5ndGguc2hvdWxkLmVxdWFsKDEpO1xuICAgICAgICB0eC5pbnB1dHNbMF0uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgYWRkcmVzczogd2FsbGV0LnB1YixcbiAgICAgICAgICB2YWx1ZTogYW1vdW50LFxuICAgICAgICAgIGNvaW46ICd0c29sJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHR4Lm91dHB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwoVXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHJhd1R4KSwgdHJ1ZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuU1RBS0lOR19BQ1RJVkFURV9TSUdORURfVFgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdNYXJpbmFkZTogYnVpbGQgZnJvbSBhbiB1bnNpZ25lZCBzdGFraW5nIGFjdGl2YXRlIGFuZCBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuTUFSSU5BREVfU1RBS0lOR19BQ1RJVkFURV9VTlNJR05FRF9UWCk7XG5cbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBzdGFrZUFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIGFkZHJlc3M6IHdhbGxldC5wdWIsXG4gICAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLk1BUklOQURFX1NUQUtJTkdfQUNUSVZBVEVfU0lHTkVEX1RYKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGQgZnJvbSBhbiB1bnNpZ25lZCBzdGFraW5nIGFjdGl2YXRlIHdpdGggbWVtbyBhbmQgc2lnbiBpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNUQUtJTkdfQUNUSVZBVEVfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBzdGFrZUFjY291bnQucHJ2IH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICB0eC5pbnB1dHMubGVuZ3RoLnNob3VsZC5lcXVhbCgxKTtcbiAgICAgICAgdHguaW5wdXRzWzBdLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgIGFkZHJlc3M6IHdhbGxldC5wdWIsXG4gICAgICAgICAgdmFsdWU6IGFtb3VudCxcbiAgICAgICAgICBjb2luOiAndHNvbCcsXG4gICAgICAgIH0pO1xuICAgICAgICB0eC5vdXRwdXRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKFV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbihyYXdUeCksIHRydWUpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3REYXRhLlNUQUtJTkdfQUNUSVZBVEVfU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdGYWlsJywgKCkgPT4ge1xuICAgICAgaXQoJ2J1aWxkIGZyb20gYW4gdW5zaWduZWQgc3Rha2luZyBhY3RpdmF0ZSBhbmQgZmFpbCB0byBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19BQ1RJVkFURV9VTlNJR05FRF9UWCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3cm9uZ0FjY291bnQucHJ2IH0pO1xuICAgICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQucmVqZWN0ZWRXaXRoKCd1bmtub3duIHNpZ25lcjogQ1A1RHBhYTQyUnRKbU11S3FDUXNMd21hNVloM2tudXZLc1lERlg4NUY0MVMnKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ2J1aWxkIGZyb20gYSBzaWduZWQgc3Rha2luZyBhY3RpdmF0ZSBhbmQgZmFpbCB0byBzaWduIGl0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19BQ1RJVkFURV9TSUdORURfVFgpO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd3JvbmdBY2NvdW50LnBydiB9KTtcbiAgICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkuc2hvdWxkLnJlamVjdGVkV2l0aCgndW5rbm93biBzaWduZXI6IENQNURwYWE0MlJ0Sm1NdUtxQ1FzTHdtYTVZaDNrbnV2S3NZREZYODVGNDFTJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakingAuthorizeBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/stakingAuthorizeBuilder.ts"],"names":[],"mappings":""}
|