@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.
Files changed (142) hide show
  1. package/dist/src/bigint-buffer-guard.d.ts +1 -0
  2. package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
  3. package/dist/src/bigint-buffer-guard.js +29 -0
  4. package/dist/src/config/token2022StaticConfig.d.ts +3 -0
  5. package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
  6. package/dist/src/config/token2022StaticConfig.js +50 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/constants.d.ts +35 -2
  11. package/dist/src/lib/constants.d.ts.map +1 -1
  12. package/dist/src/lib/constants.js +41 -2
  13. package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
  14. package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/src/lib/iface.d.ts +79 -5
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +1 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +4 -2
  22. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  23. package/dist/src/lib/instructionParamsFactory.js +364 -78
  24. package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
  25. package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  26. package/dist/src/lib/jitoStakePoolOperations.js +200 -0
  27. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  28. package/dist/src/lib/solInstructionFactory.js +266 -69
  29. package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
  30. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.js +23 -10
  32. package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
  33. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
  35. package/dist/src/lib/token2022Config.d.ts +44 -0
  36. package/dist/src/lib/token2022Config.d.ts.map +1 -0
  37. package/dist/src/lib/token2022Config.js +27 -0
  38. package/dist/src/lib/tokenTransferBuilder.js +7 -7
  39. package/dist/src/lib/transaction.d.ts +31 -4
  40. package/dist/src/lib/transaction.d.ts.map +1 -1
  41. package/dist/src/lib/transaction.js +134 -46
  42. package/dist/src/lib/transactionBuilder.d.ts +18 -2
  43. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  44. package/dist/src/lib/transactionBuilder.js +78 -2
  45. package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
  46. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  47. package/dist/src/lib/transactionBuilderFactory.js +10 -1
  48. package/dist/src/lib/utils.d.ts +34 -1
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +88 -24
  51. package/dist/src/sol.d.ts +36 -13
  52. package/dist/src/sol.d.ts.map +1 -1
  53. package/dist/src/sol.js +230 -38
  54. package/dist/test/fixtures/sol.d.ts +1152 -0
  55. package/dist/test/fixtures/sol.d.ts.map +1 -0
  56. package/dist/test/fixtures/sol.js +1433 -0
  57. package/dist/test/resources/sol.d.ts +238 -0
  58. package/dist/test/resources/sol.d.ts.map +1 -0
  59. package/dist/test/resources/sol.js +320 -0
  60. package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
  61. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  62. package/dist/test/unit/fixtures/solBackupKey.js +8 -0
  63. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  64. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  65. package/dist/test/unit/getBuilderFactory.js +10 -0
  66. package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
  67. package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
  68. package/dist/test/unit/instructionParamsFactory.js +412 -0
  69. package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
  70. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  71. package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
  72. package/dist/test/unit/keyPair.d.ts +2 -0
  73. package/dist/test/unit/keyPair.d.ts.map +1 -0
  74. package/dist/test/unit/keyPair.js +177 -0
  75. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  76. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  77. package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
  78. package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
  79. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  80. package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
  81. package/dist/test/unit/sol.d.ts +2 -0
  82. package/dist/test/unit/sol.d.ts.map +1 -0
  83. package/dist/test/unit/sol.js +3108 -0
  84. package/dist/test/unit/solInstructionFactory.d.ts +2 -0
  85. package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
  86. package/dist/test/unit/solInstructionFactory.js +454 -0
  87. package/dist/test/unit/solToken.d.ts +2 -0
  88. package/dist/test/unit/solToken.d.ts.map +1 -0
  89. package/dist/test/unit/solToken.js +31 -0
  90. package/dist/test/unit/transaction.d.ts +2 -0
  91. package/dist/test/unit/transaction.d.ts.map +1 -0
  92. package/dist/test/unit/transaction.js +983 -0
  93. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  96. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  99. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  102. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  105. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  108. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  111. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  114. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  117. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  120. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  123. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
  126. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  129. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +505 -0
  135. package/dist/test/unit/versionedTransaction.d.ts +2 -0
  136. package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
  137. package/dist/test/unit/versionedTransaction.js +207 -0
  138. package/dist/tsconfig.tsbuildinfo +1 -0
  139. package/package.json +14 -9
  140. package/.eslintignore +0 -5
  141. package/.mocharc.yml +0 -8
  142. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stakingAuthorizeBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stakingAuthorizeBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/stakingAuthorizeBuilder.ts"],"names":[],"mappings":""}