@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,384 @@
|
|
|
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 getBuilderFactory_1 = require("../getBuilderFactory");
|
|
41
|
+
const src_1 = require("../../../src");
|
|
42
|
+
const testData = __importStar(require("../../resources/sol"));
|
|
43
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
44
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
45
|
+
const bs58 = __importStar(require("bs58"));
|
|
46
|
+
const constants_1 = require("../../../src/lib/constants");
|
|
47
|
+
describe('Sol Staking Deactivate Builder', () => {
|
|
48
|
+
const factory = (0, getBuilderFactory_1.getBuilderFactory)('tsol');
|
|
49
|
+
const walletKeyPair = new src_1.KeyPair(testData.authAccount);
|
|
50
|
+
const wallet = walletKeyPair.getKeys();
|
|
51
|
+
const stakeAccount = new src_1.KeyPair(testData.stakeAccount).getKeys();
|
|
52
|
+
const splitAccount = new src_1.KeyPair(testData.splitStakeAccount).getKeys();
|
|
53
|
+
const recentBlockHash = 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi';
|
|
54
|
+
const invalidPubKey = testData.pubKeys.invalidPubKeys[0];
|
|
55
|
+
const performTest = async ({ makeUnsignedBuilder, signBuilder, addSignatures, verifyBuiltTransaction, knownRawTx, }) => {
|
|
56
|
+
// Build transaction
|
|
57
|
+
const txBuilder = makeUnsignedBuilder();
|
|
58
|
+
const unsignedTx = await txBuilder.build();
|
|
59
|
+
const tx = signBuilder ? await signBuilder(txBuilder).build() : unsignedTx;
|
|
60
|
+
// Verify built transaction
|
|
61
|
+
verifyBuiltTransaction(tx);
|
|
62
|
+
// Verify raw transaction
|
|
63
|
+
const rawTx = tx.toBroadcastFormat();
|
|
64
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
65
|
+
if (knownRawTx !== undefined) {
|
|
66
|
+
should_1.default.equal(rawTx, knownRawTx);
|
|
67
|
+
}
|
|
68
|
+
// Rebuild transaction and verify
|
|
69
|
+
const builderFromRawTx = factory.from(rawTx);
|
|
70
|
+
const rebuiltTx = await builderFromRawTx.build();
|
|
71
|
+
should_1.default.equal(rebuiltTx.toBroadcastFormat(), unsignedTx.toBroadcastFormat());
|
|
72
|
+
should_1.default.equal(rebuiltTx.signablePayload.toString('hex'), unsignedTx.signablePayload.toString('hex'));
|
|
73
|
+
should_1.default.deepEqual(rebuiltTx.toJson().instructionsData, tx.toJson().instructionsData);
|
|
74
|
+
// Verify addSignature
|
|
75
|
+
if (addSignatures) {
|
|
76
|
+
const txBuilder2 = makeUnsignedBuilder();
|
|
77
|
+
addSignatures(txBuilder2, tx.signature);
|
|
78
|
+
const tx2 = await txBuilder2.build();
|
|
79
|
+
should_1.default.equal(tx2.type, sdk_core_1.TransactionType.StakingDeactivate);
|
|
80
|
+
const rawTx2 = tx2.toBroadcastFormat();
|
|
81
|
+
should_1.default.deepEqual(tx2.toJson().instructionsData, tx.toJson().instructionsData);
|
|
82
|
+
if (knownRawTx !== undefined) {
|
|
83
|
+
should_1.default.equal(rawTx2, knownRawTx);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
const makeUnsignedBuilderNativeGeneric = (doMemo, stakingAddress) => {
|
|
88
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
89
|
+
txBuilder.sender(wallet.pub);
|
|
90
|
+
if (typeof stakingAddress === 'string') {
|
|
91
|
+
txBuilder.stakingAddress(stakingAddress);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
txBuilder.stakingAddresses(stakingAddress);
|
|
95
|
+
}
|
|
96
|
+
txBuilder.nonce(recentBlockHash);
|
|
97
|
+
if (doMemo) {
|
|
98
|
+
txBuilder.memo('Test deactivate');
|
|
99
|
+
}
|
|
100
|
+
return txBuilder;
|
|
101
|
+
};
|
|
102
|
+
const signBuilderNative = (txBuilder) => {
|
|
103
|
+
txBuilder.sign({ key: wallet.prv });
|
|
104
|
+
return txBuilder;
|
|
105
|
+
};
|
|
106
|
+
const addSignaturesNative = (txBuilder, signature) => {
|
|
107
|
+
txBuilder.addSignature({ pub: wallet.pub }, Buffer.from(bs58.decode(signature[0])));
|
|
108
|
+
return txBuilder;
|
|
109
|
+
};
|
|
110
|
+
const verifyBuiltTransactionNativeGeneric = (tx, doMemo, stakingAddresses) => {
|
|
111
|
+
const txJson = tx.toJson();
|
|
112
|
+
txJson.instructionsData.should.deepEqual([
|
|
113
|
+
...(doMemo
|
|
114
|
+
? [
|
|
115
|
+
{
|
|
116
|
+
type: 'Memo',
|
|
117
|
+
params: {
|
|
118
|
+
memo: 'Test deactivate',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
]
|
|
122
|
+
: []),
|
|
123
|
+
...stakingAddresses.map((stakingAddress) => ({
|
|
124
|
+
type: 'Deactivate',
|
|
125
|
+
params: {
|
|
126
|
+
stakingAddress,
|
|
127
|
+
amount: undefined,
|
|
128
|
+
fromAddress: wallet.pub,
|
|
129
|
+
unstakingAddress: undefined,
|
|
130
|
+
stakingType: public_types_1.SolStakingTypeEnum.NATIVE,
|
|
131
|
+
},
|
|
132
|
+
})),
|
|
133
|
+
]);
|
|
134
|
+
};
|
|
135
|
+
describe('Should succeed', () => {
|
|
136
|
+
describe('Native staking deactivate', () => {
|
|
137
|
+
const performTestNative = async (doMemo, stakingAddress, doSign, knownRawTx) => {
|
|
138
|
+
const stakingAddresses = typeof stakingAddress === 'string' ? [stakingAddress] : stakingAddress;
|
|
139
|
+
await performTest({
|
|
140
|
+
makeUnsignedBuilder: () => makeUnsignedBuilderNativeGeneric(doMemo, stakingAddress),
|
|
141
|
+
signBuilder: doSign ? signBuilderNative : undefined,
|
|
142
|
+
addSignatures: doSign ? addSignaturesNative : undefined,
|
|
143
|
+
verifyBuiltTransaction: (tx) => verifyBuiltTransactionNativeGeneric(tx, doMemo, stakingAddresses),
|
|
144
|
+
knownRawTx,
|
|
145
|
+
});
|
|
146
|
+
};
|
|
147
|
+
it('building a staking deactivate tx', async () => {
|
|
148
|
+
await performTestNative(false, stakeAccount.pub, true, testData.STAKING_DEACTIVATE_SIGNED_TX);
|
|
149
|
+
});
|
|
150
|
+
it('building a staking multi deactivate tx', async () => {
|
|
151
|
+
await performTestNative(false, [stakeAccount.pub, splitAccount.pub], true, testData.STAKING_MULTI_DEACTIVATE_SIGNED_TX);
|
|
152
|
+
});
|
|
153
|
+
it('should build and sign a multi deactivate single', async function () {
|
|
154
|
+
await performTestNative(false, [stakeAccount.pub], true, testData.STAKING_MULTI_DEACTIVATE_SIGNED_TX_single);
|
|
155
|
+
});
|
|
156
|
+
it('should build and sign a deactivate single', async function () {
|
|
157
|
+
await performTestNative(false, stakeAccount.pub, true, testData.STAKING_DEACTIVATE_SIGNED_TX_single);
|
|
158
|
+
});
|
|
159
|
+
it('building a staking deactivate signed tx with memo', async () => {
|
|
160
|
+
await performTestNative(true, stakeAccount.pub, true, testData.STAKING_DEACTIVATE_SIGNED_TX_WITH_MEMO);
|
|
161
|
+
});
|
|
162
|
+
it('building a staking deactivate unsigned tx', async () => {
|
|
163
|
+
await performTestNative(false, stakeAccount.pub, false, testData.STAKING_DEACTIVATE_UNSIGNED_TX);
|
|
164
|
+
});
|
|
165
|
+
it('building a staking deactivate unsigned tx with memo', async () => {
|
|
166
|
+
await performTestNative(true, stakeAccount.pub, false, testData.STAKING_DEACTIVATE_UNSIGNED_TX_WITH_MEMO);
|
|
167
|
+
});
|
|
168
|
+
it('building a staking deactivate unsigned tx with memo', async () => {
|
|
169
|
+
await performTestNative(true, stakeAccount.pub, false, testData.STAKING_DEACTIVATE_UNSIGNED_TX_WITH_MEMO);
|
|
170
|
+
});
|
|
171
|
+
it('all combinations', async () => {
|
|
172
|
+
for (const doMemo of [false, true]) {
|
|
173
|
+
for (const stakingAddress of [stakeAccount.pub, [stakeAccount.pub], [stakeAccount.pub, splitAccount.pub]]) {
|
|
174
|
+
for (const doSign of [false, true]) {
|
|
175
|
+
await performTestNative(doMemo, stakingAddress, doSign, undefined);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
it('building an encoded signed transaction', async () => {
|
|
181
|
+
const txBuilder = factory.from(testData.STAKING_DEACTIVATE_SIGNED_TX_WITH_MEMO);
|
|
182
|
+
txBuilder.sign({ key: wallet.prv });
|
|
183
|
+
const tx = await txBuilder.build();
|
|
184
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.STAKING_DEACTIVATE_SIGNED_TX_WITH_MEMO);
|
|
185
|
+
});
|
|
186
|
+
it('building an encoded unsigned transaction and signing it', async () => {
|
|
187
|
+
const txBuilder = factory.from(testData.STAKING_DEACTIVATE_UNSIGNED_TX_WITH_MEMO);
|
|
188
|
+
txBuilder.sign({ key: wallet.prv });
|
|
189
|
+
const tx = await txBuilder.build();
|
|
190
|
+
should_1.default.equal(tx.toBroadcastFormat(), testData.STAKING_DEACTIVATE_SIGNED_TX_WITH_MEMO);
|
|
191
|
+
});
|
|
192
|
+
it('building a partial staking deactivate tx', async () => {
|
|
193
|
+
const txBuilder = factory
|
|
194
|
+
.getStakingDeactivateBuilder()
|
|
195
|
+
.sender(wallet.pub)
|
|
196
|
+
.stakingAddress(stakeAccount.pub)
|
|
197
|
+
.unstakingAddress(testData.splitStakeAccount.pub)
|
|
198
|
+
.amount('100000')
|
|
199
|
+
.nonce(recentBlockHash);
|
|
200
|
+
txBuilder.sign({ key: wallet.prv });
|
|
201
|
+
const tx = await txBuilder.build();
|
|
202
|
+
const txJson = tx.toJson();
|
|
203
|
+
const rawTx = tx.toBroadcastFormat();
|
|
204
|
+
should_1.default.equal(src_1.Utils.isValidRawTransaction(rawTx), true);
|
|
205
|
+
txJson.instructionsData.should.deepEqual([
|
|
206
|
+
{
|
|
207
|
+
type: 'Deactivate',
|
|
208
|
+
params: {
|
|
209
|
+
fromAddress: wallet.pub,
|
|
210
|
+
stakingAddress: stakeAccount.pub,
|
|
211
|
+
amount: '100000',
|
|
212
|
+
unstakingAddress: testData.splitStakeAccount.pub,
|
|
213
|
+
stakingType: public_types_1.SolStakingTypeEnum.NATIVE,
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
]);
|
|
217
|
+
should_1.default.equal(rawTx, testData.STAKING_PARTIAL_DEACTIVATE_SIGNED_TX);
|
|
218
|
+
const tx2 = await factory.from(testData.STAKING_PARTIAL_DEACTIVATE_SIGNED_TX).build();
|
|
219
|
+
const txJson2 = tx2.toJson();
|
|
220
|
+
tx2.toBroadcastFormat();
|
|
221
|
+
delete tx['_id'];
|
|
222
|
+
delete tx2['_id'];
|
|
223
|
+
// should.deepEqual(tx, tx2) // _useTokenAddressTokenName true for tx2
|
|
224
|
+
should_1.default.deepEqual(txJson2, txJson2);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe('Marinade staking deactivate', () => {
|
|
228
|
+
const marinadeRecipientsObject = [];
|
|
229
|
+
marinadeRecipientsObject.push({
|
|
230
|
+
address: 'opNS8ENpEMWdXcJUgJCsJTDp7arTXayoBEeBUg6UezP',
|
|
231
|
+
amount: '2300000',
|
|
232
|
+
});
|
|
233
|
+
const marinadeMemo = `{\\"PrepareForRevoke\\":{\\"user\\":\\"${wallet.pub}}\\",\\"amount\\":\\"500000000000\\"}`;
|
|
234
|
+
it('Marinade: build and sign a staking deactivate tx', async () => {
|
|
235
|
+
await performTest({
|
|
236
|
+
makeUnsignedBuilder: () => {
|
|
237
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
238
|
+
txBuilder
|
|
239
|
+
.sender(wallet.pub)
|
|
240
|
+
.stakingAddress(stakeAccount.pub)
|
|
241
|
+
.nonce(recentBlockHash)
|
|
242
|
+
.stakingType(public_types_1.SolStakingTypeEnum.MARINADE)
|
|
243
|
+
.memo(marinadeMemo)
|
|
244
|
+
.recipients(marinadeRecipientsObject);
|
|
245
|
+
return txBuilder;
|
|
246
|
+
},
|
|
247
|
+
signBuilder: signBuilderNative,
|
|
248
|
+
addSignatures: addSignaturesNative,
|
|
249
|
+
verifyBuiltTransaction: (tx) => {
|
|
250
|
+
const txJson = tx.toJson();
|
|
251
|
+
txJson.instructionsData.should.deepEqual([
|
|
252
|
+
{
|
|
253
|
+
params: {
|
|
254
|
+
memo: marinadeMemo,
|
|
255
|
+
},
|
|
256
|
+
type: 'Memo',
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
type: 'Deactivate',
|
|
260
|
+
params: {
|
|
261
|
+
fromAddress: '',
|
|
262
|
+
stakingAddress: '',
|
|
263
|
+
stakingType: public_types_1.SolStakingTypeEnum.MARINADE,
|
|
264
|
+
recipients: marinadeRecipientsObject,
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
]);
|
|
268
|
+
},
|
|
269
|
+
knownRawTx: testData.MARINADE_STAKING_DEACTIVATE_SIGNED_TX,
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
describe('Jito staking deactivate', () => {
|
|
274
|
+
it('Jito: build and sign a staking deactivate tx', async () => {
|
|
275
|
+
const transferAuthority = new src_1.KeyPair(testData.splitStakeAccount).getKeys();
|
|
276
|
+
await performTest({
|
|
277
|
+
makeUnsignedBuilder: () => {
|
|
278
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
279
|
+
txBuilder
|
|
280
|
+
.sender(wallet.pub)
|
|
281
|
+
.stakingAddress(constants_1.JITO_STAKE_POOL_ADDRESS)
|
|
282
|
+
.unstakingAddress(stakeAccount.pub)
|
|
283
|
+
.stakingType(public_types_1.SolStakingTypeEnum.JITO)
|
|
284
|
+
.extraParams({
|
|
285
|
+
validatorAddress: testData.JITO_STAKE_POOL_VALIDATOR_ADDRESS,
|
|
286
|
+
transferAuthorityAddress: transferAuthority.pub,
|
|
287
|
+
stakePoolData: {
|
|
288
|
+
managerFeeAccount: testData.JITO_STAKE_POOL_DATA_PARSED.managerFeeAccount.toString(),
|
|
289
|
+
poolMint: testData.JITO_STAKE_POOL_DATA_PARSED.poolMint.toString(),
|
|
290
|
+
validatorListAccount: testData.JITO_STAKE_POOL_DATA_PARSED.validatorList.toString(),
|
|
291
|
+
},
|
|
292
|
+
})
|
|
293
|
+
.amount('1000')
|
|
294
|
+
.nonce(recentBlockHash);
|
|
295
|
+
return txBuilder;
|
|
296
|
+
},
|
|
297
|
+
signBuilder: (txBuilder) => {
|
|
298
|
+
txBuilder.sign({ key: wallet.prv });
|
|
299
|
+
txBuilder.sign({ key: stakeAccount.prv });
|
|
300
|
+
txBuilder.sign({ key: transferAuthority.prv });
|
|
301
|
+
return txBuilder;
|
|
302
|
+
},
|
|
303
|
+
addSignatures: (txBuilder, signature) => {
|
|
304
|
+
txBuilder.addSignature({ pub: wallet.pub }, Buffer.from(bs58.decode(signature[0])));
|
|
305
|
+
txBuilder.addSignature({ pub: stakeAccount.pub }, Buffer.from(bs58.decode(signature[1])));
|
|
306
|
+
txBuilder.addSignature({ pub: transferAuthority.pub }, Buffer.from(bs58.decode(signature[2])));
|
|
307
|
+
return txBuilder;
|
|
308
|
+
},
|
|
309
|
+
verifyBuiltTransaction: (tx) => {
|
|
310
|
+
const txJson = tx.toJson();
|
|
311
|
+
txJson.instructionsData.should.deepEqual([
|
|
312
|
+
{
|
|
313
|
+
type: 'Deactivate',
|
|
314
|
+
params: {
|
|
315
|
+
fromAddress: wallet.pub,
|
|
316
|
+
stakingAddress: constants_1.JITO_STAKE_POOL_ADDRESS,
|
|
317
|
+
unstakingAddress: stakeAccount.pub,
|
|
318
|
+
amount: '1000',
|
|
319
|
+
stakingType: public_types_1.SolStakingTypeEnum.JITO,
|
|
320
|
+
extraParams: {
|
|
321
|
+
validatorAddress: testData.JITO_STAKE_POOL_VALIDATOR_ADDRESS,
|
|
322
|
+
transferAuthorityAddress: transferAuthority.pub,
|
|
323
|
+
stakePoolData: {
|
|
324
|
+
managerFeeAccount: testData.JITO_STAKE_POOL_DATA_PARSED.managerFeeAccount.toString(),
|
|
325
|
+
poolMint: testData.JITO_STAKE_POOL_DATA_PARSED.poolMint.toString(),
|
|
326
|
+
validatorListAccount: testData.JITO_STAKE_POOL_DATA_PARSED.validatorList.toString(),
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
},
|
|
330
|
+
},
|
|
331
|
+
]);
|
|
332
|
+
tx.inputs.should.deepEqual([]);
|
|
333
|
+
tx.outputs.should.deepEqual([]);
|
|
334
|
+
},
|
|
335
|
+
knownRawTx: testData.JITO_STAKING_DEACTIVATE_SIGNED_TX,
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('Should fail', () => {
|
|
341
|
+
it('building a staking deactivate tx without staking address', async () => {
|
|
342
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
343
|
+
txBuilder.sender(wallet.pub).nonce(recentBlockHash);
|
|
344
|
+
txBuilder.sign({ key: wallet.prv });
|
|
345
|
+
await txBuilder.build().should.be.rejectedWith('Staking address must be set before building the transaction');
|
|
346
|
+
});
|
|
347
|
+
it('building a staking deactivate tx with a wrong staking address', async () => {
|
|
348
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
349
|
+
txBuilder.sender(wallet.pub).nonce(recentBlockHash);
|
|
350
|
+
(0, should_1.default)(() => txBuilder.stakingAddress(invalidPubKey)).throwError(`Invalid or missing stakingAddress, got: ${invalidPubKey}`);
|
|
351
|
+
});
|
|
352
|
+
it('building a staking deactivate tx with the same address as sender and staking', async () => {
|
|
353
|
+
const txBuilder = factory.getStakingDeactivateBuilder();
|
|
354
|
+
txBuilder.sender(wallet.pub).nonce(recentBlockHash);
|
|
355
|
+
txBuilder.stakingAddress(wallet.pub);
|
|
356
|
+
await txBuilder.build().should.rejectedWith('Sender address cannot be the same as the Staking address');
|
|
357
|
+
});
|
|
358
|
+
it('building a partial staking deactivate tx without an amount', async () => {
|
|
359
|
+
const txBuilder = factory
|
|
360
|
+
.getStakingDeactivateBuilder()
|
|
361
|
+
.sender(wallet.pub)
|
|
362
|
+
.nonce(recentBlockHash)
|
|
363
|
+
.stakingAddress(testData.stakeAccount.pub)
|
|
364
|
+
.unstakingAddress(testData.splitStakeAccount.pub);
|
|
365
|
+
txBuilder.sign({ key: wallet.prv });
|
|
366
|
+
await txBuilder
|
|
367
|
+
.build()
|
|
368
|
+
.should.be.rejectedWith('If an unstaking address is given then a partial amount to unstake must also be set before building the transaction');
|
|
369
|
+
});
|
|
370
|
+
it('building a partial staking deactivate tx without an unstaking address', async () => {
|
|
371
|
+
const txBuilder = factory
|
|
372
|
+
.getStakingDeactivateBuilder()
|
|
373
|
+
.sender(wallet.pub)
|
|
374
|
+
.nonce(recentBlockHash)
|
|
375
|
+
.stakingAddress(testData.stakeAccount.pub)
|
|
376
|
+
.amount('10');
|
|
377
|
+
txBuilder.sign({ key: wallet.prv });
|
|
378
|
+
await txBuilder
|
|
379
|
+
.build()
|
|
380
|
+
.should.be.rejectedWith('When partially unstaking the unstaking address must be set before building the transaction');
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
});
|
|
384
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9zdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsNERBQXlEO0FBQ3pELHNDQUF3RTtBQUN4RSw4REFBZ0Q7QUFDaEQsc0RBQXlEO0FBQ3pELG1EQUFtRjtBQUNuRiwyQ0FBNkI7QUFDN0IsMERBQXFFO0FBRXJFLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7SUFDOUMsTUFBTSxPQUFPLEdBQUcsSUFBQSxxQ0FBaUIsRUFBQyxNQUFNLENBQUMsQ0FBQztJQUUxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDeEQsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUFHLElBQUksYUFBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRSxNQUFNLFlBQVksR0FBRyxJQUFJLGFBQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2RSxNQUFNLGVBQWUsR0FBRyw4Q0FBOEMsQ0FBQztJQUN2RSxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV6RCxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQUUsRUFDekIsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLFVBQVUsR0FPWCxFQUFFLEVBQUU7UUFDSCxvQkFBb0I7UUFDcEIsTUFBTSxTQUFTLEdBQUcs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QUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuXG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uL2dldEJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB7IEtleVBhaXIsIFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlciwgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBTb2xTdGFraW5nVHlwZUVudW0gfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyBiczU4IGZyb20gJ2JzNTgnO1xuaW1wb3J0IHsgSklUT19TVEFLRV9QT09MX0FERFJFU1MgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliL2NvbnN0YW50cyc7XG5cbmRlc2NyaWJlKCdTb2wgU3Rha2luZyBEZWFjdGl2YXRlIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndHNvbCcpO1xuXG4gIGNvbnN0IHdhbGxldEtleVBhaXIgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5hdXRoQWNjb3VudCk7XG4gIGNvbnN0IHdhbGxldCA9IHdhbGxldEtleVBhaXIuZ2V0S2V5cygpO1xuICBjb25zdCBzdGFrZUFjY291bnQgPSBuZXcgS2V5UGFpcih0ZXN0RGF0YS5zdGFrZUFjY291bnQpLmdldEtleXMoKTtcbiAgY29uc3Qgc3BsaXRBY2NvdW50ID0gbmV3IEtleVBhaXIodGVzdERhdGEuc3BsaXRTdGFrZUFjY291bnQpLmdldEtleXMoKTtcbiAgY29uc3QgcmVjZW50QmxvY2tIYXNoID0gJ0dIdFhRQnNvWkhWbk5GYTlZZXZBekZyMTdESmpnSFhrM3ljVEtENXhEM1ppJztcbiAgY29uc3QgaW52YWxpZFB1YktleSA9IHRlc3REYXRhLnB1YktleXMuaW52YWxpZFB1YktleXNbMF07XG5cbiAgY29uc3QgcGVyZm9ybVRlc3QgPSBhc3luYyAoe1xuICAgIG1ha2VVbnNpZ25lZEJ1aWxkZXIsXG4gICAgc2lnbkJ1aWxkZXIsXG4gICAgYWRkU2lnbmF0dXJlcyxcbiAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uLFxuICAgIGtub3duUmF3VHgsXG4gIH06IHtcbiAgICBtYWtlVW5zaWduZWRCdWlsZGVyOiAoKSA9PiBTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXI7XG4gICAgc2lnbkJ1aWxkZXI/OiB1bmRlZmluZWQgfCAoKHg6IFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcikgPT4gU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKTtcbiAgICBhZGRTaWduYXR1cmVzPzogdW5kZWZpbmVkIHwgKCh4OiBTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIsIHNpZ25hdHVyZTogc3RyaW5nW10pID0+IFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcik7XG4gICAgdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbjogKHg6IEJhc2VUcmFuc2FjdGlvbikgPT4gdm9pZDtcbiAgICBrbm93blJhd1R4Pzogc3RyaW5nO1xuICB9KSA9PiB7XG4gICAgLy8gQnVpbGQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBtYWtlVW5zaWduZWRCdWlsZGVyKCk7XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4ID0gc2lnbkJ1aWxkZXIgPyBhd2FpdCBzaWduQnVpbGRlcih0eEJ1aWxkZXIpLmJ1aWxkKCkgOiB1bnNpZ25lZFR4O1xuXG4gICAgLy8gVmVyaWZ5IGJ1aWx0IHRyYW5zYWN0aW9uXG4gICAgdmVyaWZ5QnVpbHRUcmFuc2FjdGlvbih0eCk7XG5cbiAgICAvLyBWZXJpZnkgcmF3IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICBpZiAoa25vd25SYXdUeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaG91bGQuZXF1YWwocmF3VHgsIGtub3duUmF3VHgpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgdHJhbnNhY3Rpb24gYW5kIHZlcmlmeVxuICAgIGNvbnN0IGJ1aWxkZXJGcm9tUmF3VHggPSBmYWN0b3J5LmZyb20ocmF3VHgpO1xuICAgIGNvbnN0IHJlYnVpbHRUeCA9IGF3YWl0IGJ1aWxkZXJGcm9tUmF3VHguYnVpbGQoKTtcblxuICAgIHNob3VsZC5lcXVhbChyZWJ1aWx0VHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgdW5zaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpKTtcbiAgICBzaG91bGQuZXF1YWwocmVidWlsdFR4LnNpZ25hYmxlUGF5bG9hZC50b1N0cmluZygnaGV4JyksIHVuc2lnbmVkVHguc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgc2hvdWxkLmRlZXBFcXVhbChyZWJ1aWx0VHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YSwgdHgudG9Kc29uKCkuaW5zdHJ1Y3Rpb25zRGF0YSk7XG5cbiAgICAvLyBWZXJpZnkgYWRkU2lnbmF0dXJlXG4gICAgaWYgKGFkZFNpZ25hdHVyZXMpIHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlcjIgPSBtYWtlVW5zaWduZWRCdWlsZGVyKCk7XG4gICAgICBhZGRTaWduYXR1cmVzKHR4QnVpbGRlcjIsIHR4LnNpZ25hdHVyZSk7XG4gICAgICBjb25zdCB0eDIgPSBhd2FpdCB0eEJ1aWxkZXIyLmJ1aWxkKCk7XG4gICAgICBzaG91bGQuZXF1YWwodHgyLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZSk7XG4gICAgICBjb25zdCByYXdUeDIgPSB0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgyLnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGEsIHR4LnRvSnNvbigpLmluc3RydWN0aW9uc0RhdGEpO1xuICAgICAgaWYgKGtub3duUmF3VHggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgyLCBrbm93blJhd1R4KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZVVuc2lnbmVkQnVpbGRlck5hdGl2ZUdlbmVyaWMgPSAoZG9NZW1vOiBib29sZWFuLCBzdGFraW5nQWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10pID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpO1xuICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0LnB1Yik7XG4gICAgaWYgKHR5cGVvZiBzdGFraW5nQWRkcmVzcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQWRkcmVzcyhzdGFraW5nQWRkcmVzcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQWRkcmVzc2VzKHN0YWtpbmdBZGRyZXNzKTtcbiAgICB9XG4gICAgdHhCdWlsZGVyLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgaWYgKGRvTWVtbykge1xuICAgICAgdHhCdWlsZGVyLm1lbW8oJ1Rlc3QgZGVhY3RpdmF0ZScpO1xuICAgIH1cbiAgICByZXR1cm4gdHhCdWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IHNpZ25CdWlsZGVyTmF0aXZlID0gKHR4QnVpbGRlcjogU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKSA9PiB7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhZGRTaWduYXR1cmVzTmF0aXZlID0gKHR4QnVpbGRlcjogU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyLCBzaWduYXR1cmU6IHN0cmluZ1tdKSA9PiB7XG4gICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1Yjogd2FsbGV0LnB1YiB9LCBCdWZmZXIuZnJvbShiczU4LmRlY29kZShzaWduYXR1cmVbMF0pKSk7XG4gICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uTmF0aXZlR2VuZXJpYyA9ICh0eDogQmFzZVRyYW5zYWN0aW9uLCBkb01lbW86IGJvb2xlYW4sIHN0YWtpbmdBZGRyZXNzZXM6IHN0cmluZ1tdKSA9PiB7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAuLi4oZG9NZW1vXG4gICAgICAgID8gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIG1lbW86ICdUZXN0IGRlYWN0aXZhdGUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdXG4gICAgICAgIDogW10pLFxuICAgICAgLi4uc3Rha2luZ0FkZHJlc3Nlcy5tYXAoKHN0YWtpbmdBZGRyZXNzKSA9PiAoe1xuICAgICAgICB0eXBlOiAnRGVhY3RpdmF0ZScsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHN0YWtpbmdBZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICAgIHVuc3Rha2luZ0FkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRSxcbiAgICAgICAgfSxcbiAgICAgIH0pKSxcbiAgICBdKTtcbiAgfTtcblxuICBkZXNjcmliZSgnU2hvdWxkIHN1Y2NlZWQnLCAoKSA9PiB7XG4gICAgZGVzY3JpYmUoJ05hdGl2ZSBzdGFraW5nIGRlYWN0aXZhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBwZXJmb3JtVGVzdE5hdGl2ZSA9IGFzeW5jIChcbiAgICAgICAgZG9NZW1vOiBib29sZWFuLFxuICAgICAgICBzdGFraW5nQWRkcmVzczogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgIGRvU2lnbjogYm9vbGVhbixcbiAgICAgICAga25vd25SYXdUeDogc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3Qgc3Rha2luZ0FkZHJlc3NlcyA9IHR5cGVvZiBzdGFraW5nQWRkcmVzcyA9PT0gJ3N0cmluZycgPyBbc3Rha2luZ0FkZHJlc3NdIDogc3Rha2luZ0FkZHJlc3M7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1UZXN0KHtcbiAgICAgICAgICBtYWtlVW5zaWduZWRCdWlsZGVyOiAoKSA9PiBtYWtlVW5zaWduZWRCdWlsZGVyTmF0aXZlR2VuZXJpYyhkb01lbW8sIHN0YWtpbmdBZGRyZXNzKSxcbiAgICAgICAgICBzaWduQnVpbGRlcjogZG9TaWduID8gc2lnbkJ1aWxkZXJOYXRpdmUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgYWRkU2lnbmF0dXJlczogZG9TaWduID8gYWRkU2lnbmF0dXJlc05hdGl2ZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uOiAodHgpID0+IHZlcmlmeUJ1aWx0VHJhbnNhY3Rpb25OYXRpdmVHZW5lcmljKHR4LCBkb01lbW8sIHN0YWtpbmdBZGRyZXNzZXMpLFxuICAgICAgICAgIGtub3duUmF3VHgsXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgaXQoJ2J1aWxkaW5nIGEgc3Rha2luZyBkZWFjdGl2YXRlIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShmYWxzZSwgc3Rha2VBY2NvdW50LnB1YiwgdHJ1ZSwgdGVzdERhdGEuU1RBS0lOR19ERUFDVElWQVRFX1NJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkaW5nIGEgc3Rha2luZyBtdWx0aSBkZWFjdGl2YXRlIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBbc3Rha2VBY2NvdW50LnB1Yiwgc3BsaXRBY2NvdW50LnB1Yl0sXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICB0ZXN0RGF0YS5TVEFLSU5HX01VTFRJX0RFQUNUSVZBVEVfU0lHTkVEX1RYXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIG11bHRpIGRlYWN0aXZhdGUgc2luZ2xlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShmYWxzZSwgW3N0YWtlQWNjb3VudC5wdWJdLCB0cnVlLCB0ZXN0RGF0YS5TVEFLSU5HX01VTFRJX0RFQUNUSVZBVEVfU0lHTkVEX1RYX3NpbmdsZSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhbmQgc2lnbiBhIGRlYWN0aXZhdGUgc2luZ2xlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShmYWxzZSwgc3Rha2VBY2NvdW50LnB1YiwgdHJ1ZSwgdGVzdERhdGEuU1RBS0lOR19ERUFDVElWQVRFX1NJR05FRF9UWF9zaW5nbGUpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZGluZyBhIHN0YWtpbmcgZGVhY3RpdmF0ZSBzaWduZWQgdHggd2l0aCBtZW1vJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZSh0cnVlLCBzdGFrZUFjY291bnQucHViLCB0cnVlLCB0ZXN0RGF0YS5TVEFLSU5HX0RFQUNUSVZBVEVfU0lHTkVEX1RYX1dJVEhfTUVNTyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkaW5nIGEgc3Rha2luZyBkZWFjdGl2YXRlIHVuc2lnbmVkIHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShmYWxzZSwgc3Rha2VBY2NvdW50LnB1YiwgZmFsc2UsIHRlc3REYXRhLlNUQUtJTkdfREVBQ1RJVkFURV9VTlNJR05FRF9UWCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkaW5nIGEgc3Rha2luZyBkZWFjdGl2YXRlIHVuc2lnbmVkIHR4IHdpdGggbWVtbycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgcGVyZm9ybVRlc3ROYXRpdmUodHJ1ZSwgc3Rha2VBY2NvdW50LnB1YiwgZmFsc2UsIHRlc3REYXRhLlNUQUtJTkdfREVBQ1RJVkFURV9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdidWlsZGluZyBhIHN0YWtpbmcgZGVhY3RpdmF0ZSB1bnNpZ25lZCB0eCB3aXRoIG1lbW8nLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHBlcmZvcm1UZXN0TmF0aXZlKHRydWUsIHN0YWtlQWNjb3VudC5wdWIsIGZhbHNlLCB0ZXN0RGF0YS5TVEFLSU5HX0RFQUNUSVZBVEVfVU5TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYWxsIGNvbWJpbmF0aW9ucycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBkb01lbW8gb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgICAgIGZvciAoY29uc3Qgc3Rha2luZ0FkZHJlc3Mgb2YgW3N0YWtlQWNjb3VudC5wdWIsIFtzdGFrZUFjY291bnQucHViXSwgW3N0YWtlQWNjb3VudC5wdWIsIHNwbGl0QWNjb3VudC5wdWJdXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb1NpZ24gb2YgW2ZhbHNlLCB0cnVlXSkge1xuICAgICAgICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdE5hdGl2ZShkb01lbW8sIHN0YWtpbmdBZGRyZXNzLCBkb1NpZ24sIHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2J1aWxkaW5nIGFuIGVuY29kZWQgc2lnbmVkIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19ERUFDVElWQVRFX1NJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNUQUtJTkdfREVBQ1RJVkFURV9TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGRpbmcgYW4gZW5jb2RlZCB1bnNpZ25lZCB0cmFuc2FjdGlvbiBhbmQgc2lnbmluZyBpdCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHRlc3REYXRhLlNUQUtJTkdfREVBQ1RJVkFURV9VTlNJR05FRF9UWF9XSVRIX01FTU8pO1xuICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHRlc3REYXRhLlNUQUtJTkdfREVBQ1RJVkFURV9TSUdORURfVFhfV0lUSF9NRU1PKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnYnVpbGRpbmcgYSBwYXJ0aWFsIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAgIC5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKVxuICAgICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgICAudW5zdGFraW5nQWRkcmVzcyh0ZXN0RGF0YS5zcGxpdFN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgICAgLmFtb3VudCgnMTAwMDAwJylcbiAgICAgICAgICAubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChVdGlscy5pc1ZhbGlkUmF3VHJhbnNhY3Rpb24ocmF3VHgpLCB0cnVlKTtcbiAgICAgICAgdHhKc29uLmluc3RydWN0aW9uc0RhdGEuc2hvdWxkLmRlZXBFcXVhbChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ0RlYWN0aXZhdGUnLFxuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICAgICAgICBzdGFraW5nQWRkcmVzczogc3Rha2VBY2NvdW50LnB1YixcbiAgICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwJyxcbiAgICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogdGVzdERhdGEuc3BsaXRTdGFrZUFjY291bnQucHViLFxuICAgICAgICAgICAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk5BVElWRSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdERhdGEuU1RBS0lOR19QQVJUSUFMX0RFQUNUSVZBVEVfU0lHTkVEX1RYKTtcblxuICAgICAgICBjb25zdCB0eDIgPSBhd2FpdCBmYWN0b3J5LmZyb20odGVzdERhdGEuU1RBS0lOR19QQVJUSUFMX0RFQUNUSVZBVEVfU0lHTkVEX1RYKS5idWlsZCgpO1xuICAgICAgICBjb25zdCB0eEpzb24yID0gdHgyLnRvSnNvbigpO1xuICAgICAgICB0eDIudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgICBkZWxldGUgdHhbJ19pZCddO1xuICAgICAgICBkZWxldGUgdHgyWydfaWQnXTtcblxuICAgICAgICAvLyBzaG91bGQuZGVlcEVxdWFsKHR4LCB0eDIpIC8vIF91c2VUb2tlbkFkZHJlc3NUb2tlbk5hbWUgdHJ1ZSBmb3IgdHgyXG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHhKc29uMiwgdHhKc29uMik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdNYXJpbmFkZSBzdGFraW5nIGRlYWN0aXZhdGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtYXJpbmFkZVJlY2lwaWVudHNPYmplY3Q6IFJlY2lwaWVudFtdID0gW107XG4gICAgICBtYXJpbmFkZVJlY2lwaWVudHNPYmplY3QucHVzaCh7XG4gICAgICAgIGFkZHJlc3M6ICdvcE5TOEVOcEVNV2RYY0pVZ0pDc0pURHA3YXJUWGF5b0JFZUJVZzZVZXpQJyxcbiAgICAgICAgYW1vdW50OiAnMjMwMDAwMCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbWFyaW5hZGVNZW1vID0gYHtcXFxcXCJQcmVwYXJlRm9yUmV2b2tlXFxcXFwiOntcXFxcXCJ1c2VyXFxcXFwiOlxcXFxcIiR7d2FsbGV0LnB1Yn19XFxcXFwiLFxcXFxcImFtb3VudFxcXFxcIjpcXFxcXCI1MDAwMDAwMDAwMDBcXFxcXCJ9YDtcblxuICAgICAgaXQoJ01hcmluYWRlOiBidWlsZCBhbmQgc2lnbiBhIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgcGVyZm9ybVRlc3Qoe1xuICAgICAgICAgIG1ha2VVbnNpZ25lZEJ1aWxkZXI6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0U3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKCk7XG4gICAgICAgICAgICB0eEJ1aWxkZXJcbiAgICAgICAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAgICAgICAuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgICAgICAgLm5vbmNlKHJlY2VudEJsb2NrSGFzaClcbiAgICAgICAgICAgICAgLnN0YWtpbmdUeXBlKFNvbFN0YWtpbmdUeXBlRW51bS5NQVJJTkFERSlcbiAgICAgICAgICAgICAgLm1lbW8obWFyaW5hZGVNZW1vKVxuICAgICAgICAgICAgICAucmVjaXBpZW50cyhtYXJpbmFkZVJlY2lwaWVudHNPYmplY3QpO1xuICAgICAgICAgICAgcmV0dXJuIHR4QnVpbGRlcjtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNpZ25CdWlsZGVyOiBzaWduQnVpbGRlck5hdGl2ZSxcbiAgICAgICAgICBhZGRTaWduYXR1cmVzOiBhZGRTaWduYXR1cmVzTmF0aXZlLFxuICAgICAgICAgIHZlcmlmeUJ1aWx0VHJhbnNhY3Rpb246ICh0eDogQmFzZVRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgICAgICAgIHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICBtZW1vOiBtYXJpbmFkZU1lbW8sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnTWVtbycsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVhY3RpdmF0ZScsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICBmcm9tQWRkcmVzczogJycsXG4gICAgICAgICAgICAgICAgICBzdGFraW5nQWRkcmVzczogJycsXG4gICAgICAgICAgICAgICAgICBzdGFraW5nVHlwZTogU29sU3Rha2luZ1R5cGVFbnVtLk1BUklOQURFLFxuICAgICAgICAgICAgICAgICAgcmVjaXBpZW50czogbWFyaW5hZGVSZWNpcGllbnRzT2JqZWN0LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGtub3duUmF3VHg6IHRlc3REYXRhLk1BUklOQURFX1NUQUtJTkdfREVBQ1RJVkFURV9TSUdORURfVFgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnSml0byBzdGFraW5nIGRlYWN0aXZhdGUnLCAoKSA9PiB7XG4gICAgICBpdCgnSml0bzogYnVpbGQgYW5kIHNpZ24gYSBzdGFraW5nIGRlYWN0aXZhdGUgdHgnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyQXV0aG9yaXR5ID0gbmV3IEtleVBhaXIodGVzdERhdGEuc3BsaXRTdGFrZUFjY291bnQpLmdldEtleXMoKTtcblxuICAgICAgICBhd2FpdCBwZXJmb3JtVGVzdCh7XG4gICAgICAgICAgbWFrZVVuc2lnbmVkQnVpbGRlcjogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICAgICAgICAgIHR4QnVpbGRlclxuICAgICAgICAgICAgICAuc2VuZGVyKHdhbGxldC5wdWIpXG4gICAgICAgICAgICAgIC5zdGFraW5nQWRkcmVzcyhKSVRPX1NUQUtFX1BPT0xfQUREUkVTUylcbiAgICAgICAgICAgICAgLnVuc3Rha2luZ0FkZHJlc3Moc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgICAgICAgLnN0YWtpbmdUeXBlKFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPKVxuICAgICAgICAgICAgICAuZXh0cmFQYXJhbXMoe1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvckFkZHJlc3M6IHRlc3REYXRhLkpJVE9fU1RBS0VfUE9PTF9WQUxJREFUT1JfQUREUkVTUyxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eUFkZHJlc3M6IHRyYW5zZmVyQXV0aG9yaXR5LnB1YixcbiAgICAgICAgICAgICAgICBzdGFrZVBvb2xEYXRhOiB7XG4gICAgICAgICAgICAgICAgICBtYW5hZ2VyRmVlQWNjb3VudDogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX0RBVEFfUEFSU0VELm1hbmFnZXJGZWVBY2NvdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICBwb29sTWludDogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX0RBVEFfUEFSU0VELnBvb2xNaW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0b3JMaXN0QWNjb3VudDogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX0RBVEFfUEFSU0VELnZhbGlkYXRvckxpc3QudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuYW1vdW50KCcxMDAwJylcbiAgICAgICAgICAgICAgLm5vbmNlKHJlY2VudEJsb2NrSGFzaCk7XG4gICAgICAgICAgICByZXR1cm4gdHhCdWlsZGVyO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2lnbkJ1aWxkZXI6ICh0eEJ1aWxkZXI6IFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcikgPT4ge1xuICAgICAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgICAgICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogc3Rha2VBY2NvdW50LnBydiB9KTtcbiAgICAgICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0cmFuc2ZlckF1dGhvcml0eS5wcnYgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHhCdWlsZGVyO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgYWRkU2lnbmF0dXJlczogKHR4QnVpbGRlcjogU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyLCBzaWduYXR1cmU6IHN0cmluZ1tdKSA9PiB7XG4gICAgICAgICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKHsgcHViOiB3YWxsZXQucHViIH0sIEJ1ZmZlci5mcm9tKGJzNTguZGVjb2RlKHNpZ25hdHVyZVswXSkpKTtcbiAgICAgICAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHN0YWtlQWNjb3VudC5wdWIgfSwgQnVmZmVyLmZyb20oYnM1OC5kZWNvZGUoc2lnbmF0dXJlWzFdKSkpO1xuICAgICAgICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdHJhbnNmZXJBdXRob3JpdHkucHViIH0sIEJ1ZmZlci5mcm9tKGJzNTguZGVjb2RlKHNpZ25hdHVyZVsyXSkpKTtcbiAgICAgICAgICAgIHJldHVybiB0eEJ1aWxkZXI7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZXJpZnlCdWlsdFRyYW5zYWN0aW9uOiAodHg6IEJhc2VUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG4gICAgICAgICAgICB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5zaG91bGQuZGVlcEVxdWFsKFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdEZWFjdGl2YXRlJyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgIGZyb21BZGRyZXNzOiB3YWxsZXQucHViLFxuICAgICAgICAgICAgICAgICAgc3Rha2luZ0FkZHJlc3M6IEpJVE9fU1RBS0VfUE9PTF9BRERSRVNTLFxuICAgICAgICAgICAgICAgICAgdW5zdGFraW5nQWRkcmVzczogc3Rha2VBY2NvdW50LnB1YixcbiAgICAgICAgICAgICAgICAgIGFtb3VudDogJzEwMDAnLFxuICAgICAgICAgICAgICAgICAgc3Rha2luZ1R5cGU6IFNvbFN0YWtpbmdUeXBlRW51bS5KSVRPLFxuICAgICAgICAgICAgICAgICAgZXh0cmFQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQWRkcmVzczogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX1ZBTElEQVRPUl9BRERSRVNTLFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckF1dGhvcml0eUFkZHJlc3M6IHRyYW5zZmVyQXV0aG9yaXR5LnB1YixcbiAgICAgICAgICAgICAgICAgICAgc3Rha2VQb29sRGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXJGZWVBY2NvdW50OiB0ZXN0RGF0YS5KSVRPX1NUQUtFX1BPT0xfREFUQV9QQVJTRUQubWFuYWdlckZlZUFjY291bnQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBwb29sTWludDogdGVzdERhdGEuSklUT19TVEFLRV9QT09MX0RBVEFfUEFSU0VELnBvb2xNaW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yTGlzdEFjY291bnQ6IHRlc3REYXRhLkpJVE9fU1RBS0VfUE9PTF9EQVRBX1BBUlNFRC52YWxpZGF0b3JMaXN0LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIHR4LmlucHV0cy5zaG91bGQuZGVlcEVxdWFsKFtdKTtcbiAgICAgICAgICAgIHR4Lm91dHB1dHMuc2hvdWxkLmRlZXBFcXVhbChbXSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBrbm93blJhd1R4OiB0ZXN0RGF0YS5KSVRPX1NUQUtJTkdfREVBQ1RJVkFURV9TSUdORURfVFgsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTaG91bGQgZmFpbCcsICgpID0+IHtcbiAgICBpdCgnYnVpbGRpbmcgYSBzdGFraW5nIGRlYWN0aXZhdGUgdHggd2l0aG91dCBzdGFraW5nIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXQucHViKS5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHdhbGxldC5wcnYgfSk7XG4gICAgICBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKS5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdTdGFraW5nIGFkZHJlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkaW5nIGEgc3Rha2luZyBkZWFjdGl2YXRlIHR4IHdpdGggYSB3cm9uZyBzdGFraW5nIGFkZHJlc3MnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmRlcih3YWxsZXQucHViKS5ub25jZShyZWNlbnRCbG9ja0hhc2gpO1xuICAgICAgc2hvdWxkKCgpID0+IHR4QnVpbGRlci5zdGFraW5nQWRkcmVzcyhpbnZhbGlkUHViS2V5KSkudGhyb3dFcnJvcihcbiAgICAgICAgYEludmFsaWQgb3IgbWlzc2luZyBzdGFraW5nQWRkcmVzcywgZ290OiAke2ludmFsaWRQdWJLZXl9YFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZGluZyBhIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eCB3aXRoIHRoZSBzYW1lIGFkZHJlc3MgYXMgc2VuZGVyIGFuZCBzdGFraW5nJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRTdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5zZW5kZXIod2FsbGV0LnB1Yikubm9uY2UocmVjZW50QmxvY2tIYXNoKTtcbiAgICAgIHR4QnVpbGRlci5zdGFraW5nQWRkcmVzcyh3YWxsZXQucHViKTtcbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5yZWplY3RlZFdpdGgoJ1NlbmRlciBhZGRyZXNzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgU3Rha2luZyBhZGRyZXNzJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRpbmcgYSBwYXJ0aWFsIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eCB3aXRob3V0IGFuIGFtb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnlcbiAgICAgICAgLmdldFN0YWtpbmdEZWFjdGl2YXRlQnVpbGRlcigpXG4gICAgICAgIC5zZW5kZXIod2FsbGV0LnB1YilcbiAgICAgICAgLm5vbmNlKHJlY2VudEJsb2NrSGFzaClcbiAgICAgICAgLnN0YWtpbmdBZGRyZXNzKHRlc3REYXRhLnN0YWtlQWNjb3VudC5wdWIpXG4gICAgICAgIC51bnN0YWtpbmdBZGRyZXNzKHRlc3REYXRhLnNwbGl0U3Rha2VBY2NvdW50LnB1Yik7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogd2FsbGV0LnBydiB9KTtcblxuICAgICAgYXdhaXQgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAgICdJZiBhbiB1bnN0YWtpbmcgYWRkcmVzcyBpcyBnaXZlbiB0aGVuIGEgcGFydGlhbCBhbW91bnQgdG8gdW5zdGFrZSBtdXN0IGFsc28gYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgdHJhbnNhY3Rpb24nXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRpbmcgYSBwYXJ0aWFsIHN0YWtpbmcgZGVhY3RpdmF0ZSB0eCB3aXRob3V0IGFuIHVuc3Rha2luZyBhZGRyZXNzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeVxuICAgICAgICAuZ2V0U3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyKClcbiAgICAgICAgLnNlbmRlcih3YWxsZXQucHViKVxuICAgICAgICAubm9uY2UocmVjZW50QmxvY2tIYXNoKVxuICAgICAgICAuc3Rha2luZ0FkZHJlc3ModGVzdERhdGEuc3Rha2VBY2NvdW50LnB1YilcbiAgICAgICAgLmFtb3VudCgnMTAnKTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB3YWxsZXQucHJ2IH0pO1xuXG4gICAgICBhd2FpdCB0eEJ1aWxkZXJcbiAgICAgICAgLmJ1aWxkKClcbiAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoXG4gICAgICAgICAgJ1doZW4gcGFydGlhbGx5IHVuc3Rha2luZyB0aGUgdW5zdGFraW5nIGFkZHJlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0cmFuc2FjdGlvbidcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stakingDelegateBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/stakingDelegateBuilder.ts"],"names":[],"mappings":""}
|