@bitgo-beta/sdk-coin-avaxp 3.5.10-beta.31 → 3.5.10-beta.310
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/CHANGELOG.md +347 -0
- package/dist/src/avaxp.d.ts +1 -2
- package/dist/src/avaxp.d.ts.map +1 -1
- package/dist/src/avaxp.js +23 -29
- package/dist/src/iface.d.ts +0 -4
- package/dist/src/iface.d.ts.map +1 -1
- package/dist/src/iface.js +1 -1
- package/dist/src/index.js +6 -2
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +1 -1
- package/dist/src/lib/atomicTransactionBuilder.d.ts +2 -2
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +5 -5
- package/dist/src/lib/delegatorTxBuilder.d.ts +6 -6
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/delegatorTxBuilder.js +7 -7
- package/dist/src/lib/deprecatedTransaction.d.ts +100 -0
- package/dist/src/lib/deprecatedTransaction.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransaction.js +345 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts +115 -0
- package/dist/src/lib/deprecatedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/deprecatedTransactionBuilder.js +210 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +8 -8
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +4 -4
- package/dist/src/lib/exportTxBuilder.d.ts +4 -4
- package/dist/src/lib/exportTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportTxBuilder.js +3 -3
- package/dist/src/lib/iface.d.ts +11 -8
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +4 -4
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importInCTxBuilder.js +6 -6
- package/dist/src/lib/importTxBuilder.d.ts +4 -4
- package/dist/src/lib/importTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/importTxBuilder.js +3 -3
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +11 -3
- package/dist/src/lib/keyPair.js +9 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +154 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +452 -0
- package/dist/src/lib/transaction.d.ts +19 -40
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +67 -166
- package/dist/src/lib/transactionBuilder.d.ts +31 -82
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +65 -151
- package/dist/src/lib/transactionBuilderFactory.d.ts +16 -8
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +78 -19
- package/dist/src/lib/utils.d.ts +22 -7
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +53 -11
- package/dist/src/lib/utxoEngine.d.ts +10 -1
- package/dist/src/lib/utxoEngine.d.ts.map +1 -1
- package/dist/src/lib/utxoEngine.js +27 -3
- package/dist/src/lib/validatorTxBuilder.d.ts +4 -4
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/validatorTxBuilder.js +2 -2
- package/dist/test/resources/avaxp.d.ts +80 -5
- package/dist/test/resources/avaxp.d.ts.map +1 -1
- package/dist/test/resources/avaxp.js +164 -31
- package/dist/test/resources/tx/importP.js +8 -8
- package/dist/test/unit/avaxp.js +90 -102
- package/dist/test/unit/lib/exportC2PTxBuilder.js +6 -2
- package/dist/test/unit/lib/exportP2CTxBuilder.js +10 -10
- package/dist/test/unit/lib/importC2PTxBuilder.js +8 -4
- package/dist/test/unit/lib/importP2CTxBuilder.js +8 -6
- package/dist/test/unit/lib/keyPair.js +6 -2
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/permissionlessValidatorTxBuilder.js +331 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +8 -4
- package/dist/test/unit/lib/utils.js +6 -2
- package/dist/test/unit/lib/utxoEngine.js +6 -6
- package/dist/test/unit/lib/validateTxBuilder.js +12 -13
- package/dist/tsconfig.tsbuildinfo +1 -12757
- package/package.json +9 -8
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PermissionlessValidatorTxBuilder = void 0;
|
|
7
|
+
const avalanchejs_1 = require("@bitgo/avalanchejs");
|
|
8
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
9
|
+
const avalanche_1 = require("avalanche");
|
|
10
|
+
const iface_1 = require("./iface");
|
|
11
|
+
const keyPair_1 = require("./keyPair");
|
|
12
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
13
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
14
|
+
const utxoEngine_1 = require("./utxoEngine");
|
|
15
|
+
class PermissionlessValidatorTxBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @param coinConfig
|
|
19
|
+
*/
|
|
20
|
+
constructor(coinConfig) {
|
|
21
|
+
super(coinConfig);
|
|
22
|
+
this._signer = [];
|
|
23
|
+
this.recoverSigner = false;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* get transaction type
|
|
27
|
+
* @protected
|
|
28
|
+
*/
|
|
29
|
+
get transactionType() {
|
|
30
|
+
return sdk_core_1.TransactionType.AddPermissionlessValidator;
|
|
31
|
+
}
|
|
32
|
+
// region Validators
|
|
33
|
+
/**
|
|
34
|
+
* Validates locktime
|
|
35
|
+
* @param locktime
|
|
36
|
+
*/
|
|
37
|
+
validateLocktime(locktime) {
|
|
38
|
+
if (locktime < BigInt(0)) {
|
|
39
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: locktime must be 0 or higher');
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Validate that the delegation fee is at least the minDelegationFee
|
|
44
|
+
* @param delegationFeeRate number
|
|
45
|
+
*/
|
|
46
|
+
validateDelegationFeeRate(delegationFeeRate) {
|
|
47
|
+
if (delegationFeeRate < Number(this.transaction._network.minDelegationFee)) {
|
|
48
|
+
throw new sdk_core_1.BuildTransactionError(`Delegation fee cannot be less than ${this.transaction._network.minDelegationFee}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check the UTXO has expected fields.
|
|
53
|
+
* @param UTXO
|
|
54
|
+
*/
|
|
55
|
+
validateUtxo(value) {
|
|
56
|
+
['outputID', 'amount', 'txid', 'outputidx'].forEach((field) => {
|
|
57
|
+
if (!value.hasOwnProperty(field))
|
|
58
|
+
throw new sdk_core_1.BuildTransactionError(`Utxos required ${field}`);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
// endregion
|
|
62
|
+
/**
|
|
63
|
+
* Addresses where reward should be deposit
|
|
64
|
+
* @param {string | string[]} address - single address or array of addresses to receive rewards
|
|
65
|
+
*/
|
|
66
|
+
rewardAddresses(address) {
|
|
67
|
+
const rewardAddresses = address instanceof Array ? address : [address];
|
|
68
|
+
this.transaction._rewardAddresses = rewardAddresses.map(utils_1.default.parseAddress);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
/** @inheritdoc */
|
|
72
|
+
fromImplementation(rawTransaction) {
|
|
73
|
+
const manager = avalanchejs_1.utils.getManagerForVM('PVM');
|
|
74
|
+
const [codec, rest] = manager.getCodecFromBuffer(avalanchejs_1.utils.hexToBuffer(rawTransaction));
|
|
75
|
+
const tx = codec.UnpackPrefix(rest)[0];
|
|
76
|
+
this.initBuilder(tx);
|
|
77
|
+
return this.transaction;
|
|
78
|
+
}
|
|
79
|
+
/** @inheritdoc */
|
|
80
|
+
async buildImplementation() {
|
|
81
|
+
this.buildAvaxTransaction();
|
|
82
|
+
this.transaction.setTransactionType(this.transactionType);
|
|
83
|
+
if (this.hasSigner()) {
|
|
84
|
+
for (const keyPair of this._signer) {
|
|
85
|
+
await this.transaction.sign(keyPair);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return this.transaction;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
*
|
|
92
|
+
* @param nodeID
|
|
93
|
+
*/
|
|
94
|
+
nodeID(nodeID) {
|
|
95
|
+
this.validateNodeID(nodeID);
|
|
96
|
+
this._nodeID = nodeID;
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @param blsPublicKey
|
|
102
|
+
*/
|
|
103
|
+
blsPublicKey(blsPublicKey) {
|
|
104
|
+
(0, sdk_core_1.isValidBLSPublicKey)(blsPublicKey);
|
|
105
|
+
this._blsPublicKey = blsPublicKey;
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
*
|
|
110
|
+
* @param blsSignature
|
|
111
|
+
*/
|
|
112
|
+
blsSignature(blsSignature) {
|
|
113
|
+
(0, sdk_core_1.isValidBLSSignature)(blsSignature);
|
|
114
|
+
this._blsSignature = blsSignature;
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Locktime is a long that contains the unix timestamp that this output can be spent after.
|
|
119
|
+
* The unix timestamp is specific to the second.
|
|
120
|
+
* @param value
|
|
121
|
+
*/
|
|
122
|
+
locktime(value) {
|
|
123
|
+
this.validateLocktime(BigInt(value));
|
|
124
|
+
this._transaction._locktime = BigInt(value);
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* set the delegationFeeRate
|
|
129
|
+
* @param value number
|
|
130
|
+
*/
|
|
131
|
+
delegationFeeRate(value) {
|
|
132
|
+
this.validateDelegationFeeRate(value);
|
|
133
|
+
this._delegationFeeRate = value;
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* start time of staking period
|
|
138
|
+
* @param value
|
|
139
|
+
*/
|
|
140
|
+
startTime(value) {
|
|
141
|
+
this._startTime = BigInt(value);
|
|
142
|
+
return this;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* end time of staking period
|
|
146
|
+
* @param value
|
|
147
|
+
*/
|
|
148
|
+
endTime(value) {
|
|
149
|
+
this._endTime = BigInt(value);
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
*
|
|
154
|
+
* @param value
|
|
155
|
+
*/
|
|
156
|
+
stakeAmount(value) {
|
|
157
|
+
const valueBigInt = typeof value === 'bigint' ? value : BigInt(value);
|
|
158
|
+
this.validateStakeAmount(valueBigInt);
|
|
159
|
+
this._stakeAmount = valueBigInt;
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
// region Validators
|
|
163
|
+
/**
|
|
164
|
+
* validates a correct NodeID is used
|
|
165
|
+
* @param nodeID
|
|
166
|
+
*/
|
|
167
|
+
validateNodeID(nodeID) {
|
|
168
|
+
if (!nodeID) {
|
|
169
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing nodeID');
|
|
170
|
+
}
|
|
171
|
+
if (nodeID.slice(0, 6) !== 'NodeID') {
|
|
172
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: invalid NodeID tag');
|
|
173
|
+
}
|
|
174
|
+
if (!(avalanchejs_1.utils.base58.decode(nodeID.slice(7)).length === 24)) {
|
|
175
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: NodeID is not in cb58 format');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Validate stake duration
|
|
180
|
+
* @param startTime
|
|
181
|
+
* @param endTime
|
|
182
|
+
*/
|
|
183
|
+
validateStakeDuration(startTime, endTime) {
|
|
184
|
+
if (endTime < startTime) {
|
|
185
|
+
throw new sdk_core_1.BuildTransactionError('End date cannot be less than start date');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Validate stake amount
|
|
190
|
+
* @param amount
|
|
191
|
+
*/
|
|
192
|
+
validateStakeAmount(amount) {
|
|
193
|
+
const minStake = BigInt(this.transaction._network.minStake);
|
|
194
|
+
if (amount < minStake) {
|
|
195
|
+
throw new sdk_core_1.BuildTransactionError('Minimum staking amount is ' + Number(minStake) / 1000000000 + ' AVAX.');
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// endregion
|
|
200
|
+
/** @inheritdoc */
|
|
201
|
+
initBuilder(tx) {
|
|
202
|
+
super.initBuilder(tx);
|
|
203
|
+
const permissionlessValidatorTx = tx.tx;
|
|
204
|
+
if (!this.verifyTxType(permissionlessValidatorTx)) {
|
|
205
|
+
throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
|
|
206
|
+
}
|
|
207
|
+
const outputs = permissionlessValidatorTx.baseTx.outputs;
|
|
208
|
+
if (outputs.length !== 1) {
|
|
209
|
+
throw new sdk_core_1.BuildTransactionError('Transaction can have one external output');
|
|
210
|
+
}
|
|
211
|
+
const output = outputs[0].output;
|
|
212
|
+
if (outputs[0].getAssetId() !== this.transaction._assetId) {
|
|
213
|
+
throw new Error('The Asset ID of the output does not match the transaction');
|
|
214
|
+
}
|
|
215
|
+
this.transaction._blsPublicKey = avalanchejs_1.utils.bufferToHex(permissionlessValidatorTx.signer.proof.publicKey);
|
|
216
|
+
this._blsPublicKey = this.transaction._blsPublicKey;
|
|
217
|
+
this.transaction._blsSignature = avalanchejs_1.utils.bufferToHex(permissionlessValidatorTx.signer.proof.signature);
|
|
218
|
+
this._blsSignature = this.transaction._blsSignature;
|
|
219
|
+
this.transaction._locktime = output.outputOwners.locktime.value();
|
|
220
|
+
this.transaction._threshold = output.outputOwners.threshold.value();
|
|
221
|
+
this.transaction._nodeID = permissionlessValidatorTx.subnetValidator.validator.nodeId.toString();
|
|
222
|
+
this._nodeID = this.transaction._nodeID;
|
|
223
|
+
this.transaction._startTime = permissionlessValidatorTx.subnetValidator.validator.startTime.value();
|
|
224
|
+
this._startTime = this.transaction._startTime;
|
|
225
|
+
this.transaction._endTime = permissionlessValidatorTx.subnetValidator.validator.endTime.value();
|
|
226
|
+
this._endTime = this.transaction._endTime;
|
|
227
|
+
this.transaction._fromAddresses = output.outputOwners.addrs.map((a) => a.toBytes());
|
|
228
|
+
this.transaction._stakeAmount = permissionlessValidatorTx.stake[0].output.amount();
|
|
229
|
+
this.stakeAmount(permissionlessValidatorTx.stake[0].output.amount());
|
|
230
|
+
this.transaction._utxos = (0, utxoEngine_1.recoverUtxos)(permissionlessValidatorTx.getInputs());
|
|
231
|
+
// TODO(CR-1073): remove log
|
|
232
|
+
console.log('utxos: ', this.transaction._utxos);
|
|
233
|
+
console.log('fromAddresses: ', this.transaction.fromAddresses);
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
static verifyTxType(type) {
|
|
237
|
+
return type === avalanchejs_1.TypeSymbols.AddPermissionlessValidatorTx;
|
|
238
|
+
}
|
|
239
|
+
verifyTxType(tx) {
|
|
240
|
+
return PermissionlessValidatorTxBuilder.verifyTxType(tx._type);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Since addresses in outputs get reordered, we need to make sure signatures
|
|
244
|
+
* are added in the correct position
|
|
245
|
+
* To find the position, we use the output's addresses to create the
|
|
246
|
+
* signatureIdx in the order needed (i.e. [user, bitgo, backup])
|
|
247
|
+
* @protected
|
|
248
|
+
*/
|
|
249
|
+
calculateUtxos() {
|
|
250
|
+
var _a, _b;
|
|
251
|
+
const inputs = [];
|
|
252
|
+
const stakeOutputs = [];
|
|
253
|
+
const changeOutputs = [];
|
|
254
|
+
const utxos = [];
|
|
255
|
+
let currentTotal = BigInt(0);
|
|
256
|
+
// delegating and validating have no fees
|
|
257
|
+
const totalTarget = this._stakeAmount.valueOf();
|
|
258
|
+
const credentials = (_a = this.transaction.credentials) !== null && _a !== void 0 ? _a : [];
|
|
259
|
+
// Convert fromAddresses to string
|
|
260
|
+
// The order of fromAddresses is determined by the source of the data
|
|
261
|
+
// When building from params, the order is [user, bitgo, backup]
|
|
262
|
+
// The order from tx hex is [bitgo, backup, user]
|
|
263
|
+
const bitgoAddresses = this.transaction._fromAddresses.map((b) => avalanchejs_1.utils.format(this.transaction._network.alias, this.transaction._network.hrp, b));
|
|
264
|
+
// TODO(CR-1073): remove log
|
|
265
|
+
console.log(`bitgoAddress: ${bitgoAddresses}`);
|
|
266
|
+
// if we are in OVC, none of the utxos will have addresses since they come from
|
|
267
|
+
// deserialized inputs (which don't have addresses), not the IMS
|
|
268
|
+
const buildOutputs = this.transaction._utxos[0].addresses.length !== 0 || ((_b = this.transaction._utxos[0].addressesIndex) === null || _b === void 0 ? void 0 : _b.length) !== 0;
|
|
269
|
+
const assetId = avalanchejs_1.Id.fromString(this.transaction._assetId);
|
|
270
|
+
this.transaction._utxos.forEach((utxo, index) => {
|
|
271
|
+
var _a;
|
|
272
|
+
// validate the utxos
|
|
273
|
+
if (!utxo) {
|
|
274
|
+
throw new sdk_core_1.BuildTransactionError('Utxo is undefined');
|
|
275
|
+
}
|
|
276
|
+
// addressesIndex should never have a mismatch
|
|
277
|
+
if ((_a = utxo.addressesIndex) === null || _a === void 0 ? void 0 : _a.includes(-1)) {
|
|
278
|
+
throw new sdk_core_1.BuildTransactionError('Addresses are inconsistent');
|
|
279
|
+
}
|
|
280
|
+
if (utxo.threshold < this.transaction._threshold) {
|
|
281
|
+
throw new sdk_core_1.BuildTransactionError('Threshold is inconsistent');
|
|
282
|
+
}
|
|
283
|
+
const bitgoIndexToOnChainIndex = new Map();
|
|
284
|
+
// in WP, output.addressesIndex is empty, so fill it
|
|
285
|
+
if (!utxo.addressesIndex || utxo.addressesIndex.length === 0) {
|
|
286
|
+
utxo.addressesIndex = bitgoAddresses.map((a) => utxo.addresses.indexOf(a));
|
|
287
|
+
}
|
|
288
|
+
// utxo.addresses is null when build from raw
|
|
289
|
+
// but utxo.addressesIndex has only 2 elements when build from raw
|
|
290
|
+
// so the bitgoIndexToOnChainIndex map will be empty
|
|
291
|
+
utxo.addresses.forEach((a) => {
|
|
292
|
+
bitgoIndexToOnChainIndex.set(bitgoAddresses.indexOf(a), utxo.addresses.indexOf(a));
|
|
293
|
+
});
|
|
294
|
+
// TODO(CR-1073): remove log
|
|
295
|
+
console.log(`utxo.addresses: ${utxo.addresses}`);
|
|
296
|
+
console.log(`bitgoIndexToOnChainIndex: ${Array.from(bitgoIndexToOnChainIndex)}`);
|
|
297
|
+
// in OVC, output.addressesIndex is defined correctly from the previous iteration
|
|
298
|
+
if (utxo.outputID === iface_1.SECP256K1_Transfer_Output) {
|
|
299
|
+
const utxoAmount = BigInt(utxo.amount);
|
|
300
|
+
// either user (0) or recovery (2)
|
|
301
|
+
// On regular mode: [user, bitgo] (i.e. [0, 1])
|
|
302
|
+
// On recovery mode: [backup, bitgo] (i.e. [2, 1])
|
|
303
|
+
const userOrBackupIndex = this.recoverSigner ? 2 : 0;
|
|
304
|
+
const bitgoIndex = 1;
|
|
305
|
+
currentTotal = currentTotal + utxoAmount;
|
|
306
|
+
const utxoId = avalanchejs_1.avaxSerial.UTXOID.fromNative(utxo.txid, Number(utxo.outputidx));
|
|
307
|
+
let addressesIndex = [];
|
|
308
|
+
if (utxo.addressesIndex && bitgoIndexToOnChainIndex.size === 0) {
|
|
309
|
+
addressesIndex = [...utxo.addressesIndex];
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
addressesIndex.push(bitgoIndexToOnChainIndex.get(userOrBackupIndex));
|
|
313
|
+
addressesIndex.push(bitgoIndexToOnChainIndex.get(bitgoIndex));
|
|
314
|
+
}
|
|
315
|
+
const transferInputs = new avalanchejs_1.TransferInput(new avalanchejs_1.BigIntPr(utxoAmount), new avalanchejs_1.Input([...addressesIndex].sort().map((num) => new avalanchejs_1.Int(num))));
|
|
316
|
+
// TODO(CR-1073): remove log
|
|
317
|
+
console.log(`using addressesIndex sorted: ${[...addressesIndex].sort()}`);
|
|
318
|
+
const input = new avalanchejs_1.avaxSerial.TransferableInput(utxoId, assetId, transferInputs);
|
|
319
|
+
utxos.push(new avalanchejs_1.Utxo(utxoId, assetId, transferInputs));
|
|
320
|
+
inputs.push(input);
|
|
321
|
+
if (!this.transaction.credentials || this.transaction.credentials.length == 0) {
|
|
322
|
+
if (buildOutputs) {
|
|
323
|
+
// For the bitgo signature we create an empty signature
|
|
324
|
+
// For the user/backup signature we store the address that matches the key
|
|
325
|
+
// if bitgo address comes before < user/backup address
|
|
326
|
+
// TODO(CR-1073): remove log
|
|
327
|
+
console.log(`bitgo index on chain: ${utxo.addressesIndex[bitgoIndex]}`);
|
|
328
|
+
console.log(`user Or Backup Index: ${utxo.addressesIndex[userOrBackupIndex]}`);
|
|
329
|
+
if (utxo.addressesIndex[bitgoIndex] < utxo.addressesIndex[userOrBackupIndex]) {
|
|
330
|
+
// TODO(CR-1073): remove log
|
|
331
|
+
console.log(`user or backup credentials after bitgo`);
|
|
332
|
+
credentials.push(new avalanchejs_1.Credential([
|
|
333
|
+
utils_1.default.createNewSig(avalanche_1.Buffer.from('').toString('hex')),
|
|
334
|
+
utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[userOrBackupIndex]).toString('hex')),
|
|
335
|
+
]));
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
// TODO(CR-1073): remove log
|
|
339
|
+
console.log(`user or backup credentials before bitgo`);
|
|
340
|
+
credentials.push(new avalanchejs_1.Credential([
|
|
341
|
+
utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[userOrBackupIndex]).toString('hex')),
|
|
342
|
+
utils_1.default.createNewSig(avalanche_1.Buffer.from('').toString('hex')),
|
|
343
|
+
]));
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// TODO(CR-1073): verify this else case for OVC
|
|
348
|
+
credentials.push(new avalanchejs_1.Credential(addressesIndex.map((i) => utils_1.default.createNewSig(avalanche_1.Buffer.from(this.transaction._fromAddresses[i]).toString('hex')))));
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
// TODO(CR-1073): remove log
|
|
353
|
+
console.log(`reusing credentials from transaction`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
if (buildOutputs) {
|
|
358
|
+
if (currentTotal < totalTarget) {
|
|
359
|
+
throw new sdk_core_1.BuildTransactionError(`Utxo outputs get ${currentTotal.toString()} and ${totalTarget.toString()} is required`);
|
|
360
|
+
}
|
|
361
|
+
else if (currentTotal >= totalTarget) {
|
|
362
|
+
const stakeOutput = new avalanchejs_1.avaxSerial.TransferableOutput(assetId, new avalanchejs_1.TransferOutput(new avalanchejs_1.BigIntPr(totalTarget), new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
|
|
363
|
+
.sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
|
|
364
|
+
.map((a) => avalanchejs_1.Address.fromBytes(a)[0]))));
|
|
365
|
+
stakeOutputs.push(stakeOutput);
|
|
366
|
+
if (currentTotal > totalTarget) {
|
|
367
|
+
const changeOutput = new avalanchejs_1.avaxSerial.TransferableOutput(assetId, new avalanchejs_1.TransferOutput(new avalanchejs_1.BigIntPr(currentTotal - totalTarget), new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
|
|
368
|
+
.sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
|
|
369
|
+
.map((a) => avalanchejs_1.Address.fromBytes(a)[0]))));
|
|
370
|
+
changeOutputs.push(changeOutput);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
inputs.sort((a, b) => {
|
|
375
|
+
if (avalanchejs_1.utils.bytesEqual(a.utxoID.txID.toBytes(), b.utxoID.txID.toBytes())) {
|
|
376
|
+
return a.utxoID.outputIdx.value() - b.utxoID.outputIdx.value();
|
|
377
|
+
}
|
|
378
|
+
return avalanchejs_1.utils.bytesCompare(a.utxoID.txID.toBytes(), b.utxoID.txID.toBytes());
|
|
379
|
+
});
|
|
380
|
+
return { inputs, stakeOutputs, changeOutputs, utxos, credentials };
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Build the add validator transaction
|
|
384
|
+
* @protected
|
|
385
|
+
*/
|
|
386
|
+
buildAvaxTransaction() {
|
|
387
|
+
this.validateStakeDuration(this.transaction._startTime, this.transaction._endTime);
|
|
388
|
+
const { inputs, stakeOutputs, changeOutputs, utxos, credentials } = this.calculateUtxos();
|
|
389
|
+
const baseTx = avalanchejs_1.avaxSerial.BaseTx.fromNative(this.transaction._networkID, this.transaction._blockchainID, changeOutputs, inputs, new Uint8Array() // default empty memo
|
|
390
|
+
);
|
|
391
|
+
const subnetValidator = avalanchejs_1.pvmSerial.SubnetValidator.fromNative(this._nodeID, this._startTime, this._endTime, this._stakeAmount, avalanchejs_1.networkIDs.PrimaryNetworkID);
|
|
392
|
+
const signer = new avalanchejs_1.pvmSerial.Signer(new avalanchejs_1.pvmSerial.ProofOfPossession(avalanchejs_1.utils.hexToBuffer(this._blsPublicKey), avalanchejs_1.utils.hexToBuffer(this._blsSignature)));
|
|
393
|
+
const outputOwners = new avalanchejs_1.OutputOwners(new avalanchejs_1.BigIntPr(this.transaction._locktime), new avalanchejs_1.Int(this.transaction._threshold), [...this.transaction._fromAddresses]
|
|
394
|
+
.sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
|
|
395
|
+
.map((a) => avalanchejs_1.Address.fromBytes(a)[0]));
|
|
396
|
+
// TODO(CR-1073): check this value
|
|
397
|
+
// Shares 10,000 times percentage of reward taken from delegators
|
|
398
|
+
// https://docs.avax.network/reference/avalanchego/p-chain/txn-format#unsigned-add-validator-tx
|
|
399
|
+
const shares = new avalanchejs_1.Int(1e4 * 2);
|
|
400
|
+
const addressMaps = [...this.transaction._fromAddresses]
|
|
401
|
+
.sort((a, b) => avalanchejs_1.utils.bytesCompare(a, b))
|
|
402
|
+
.map((address) => new avalanchejs_1.utils.AddressMap([[new avalanchejs_1.Address(address), 0]]));
|
|
403
|
+
this.transaction.setTransaction(new avalanchejs_1.UnsignedTx(new avalanchejs_1.pvmSerial.AddPermissionlessValidatorTx(baseTx, subnetValidator, signer, stakeOutputs, outputOwners, outputOwners, shares), utxos, new avalanchejs_1.utils.AddressMaps(addressMaps), credentials));
|
|
404
|
+
}
|
|
405
|
+
/** @inheritdoc */
|
|
406
|
+
signImplementation({ key }) {
|
|
407
|
+
this._signer.push(new keyPair_1.KeyPair({ prv: key }));
|
|
408
|
+
return this.transaction;
|
|
409
|
+
}
|
|
410
|
+
/** @inheritdoc */
|
|
411
|
+
validateAddress(address, addressFormat) {
|
|
412
|
+
if (!utils_1.default.isValidAddress(address.address)) {
|
|
413
|
+
throw new sdk_core_1.BuildTransactionError('Invalid address');
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/** @inheritdoc */
|
|
417
|
+
get transaction() {
|
|
418
|
+
return this._transaction;
|
|
419
|
+
}
|
|
420
|
+
set transaction(transaction) {
|
|
421
|
+
this._transaction = transaction;
|
|
422
|
+
}
|
|
423
|
+
hasSigner() {
|
|
424
|
+
return this._signer !== undefined && this._signer.length > 0;
|
|
425
|
+
}
|
|
426
|
+
/** @inheritdoc */
|
|
427
|
+
validateKey({ key }) {
|
|
428
|
+
if (!new keyPair_1.KeyPair({ prv: key })) {
|
|
429
|
+
throw new sdk_core_1.BuildTransactionError('Invalid key');
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Check the raw transaction has a valid format in the blockchain context, throw otherwise.
|
|
434
|
+
*
|
|
435
|
+
* @param rawTransaction Transaction in any format
|
|
436
|
+
*/
|
|
437
|
+
validateRawTransaction(rawTransaction) {
|
|
438
|
+
utils_1.default.validateRawTransaction(rawTransaction);
|
|
439
|
+
}
|
|
440
|
+
/** @inheritdoc */
|
|
441
|
+
validateTransaction(transaction) {
|
|
442
|
+
// throw new NotImplementedError('validateTransaction not implemented');
|
|
443
|
+
}
|
|
444
|
+
/** @inheritdoc */
|
|
445
|
+
validateValue(value) {
|
|
446
|
+
if (value.isLessThan(0)) {
|
|
447
|
+
throw new sdk_core_1.BuildTransactionError('Value cannot be less than zero');
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
exports.PermissionlessValidatorTxBuilder = PermissionlessValidatorTxBuilder;
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3Blcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQWtCNEI7QUFDNUIsbURBUThCO0FBRzlCLHlDQUFpRDtBQUVqRCxtQ0FBd0U7QUFDeEUsdUNBQW9DO0FBRXBDLDZEQUEwRDtBQUMxRCxvREFBNEI7QUFDNUIsNkNBQTRDO0FBRTVDLE1BQWEsZ0NBQWlDLFNBQVEsdUNBQWtCO0lBV3RFOzs7T0FHRztJQUNILFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBZmIsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQU9yQixrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQywwQkFBMEIsQ0FBQztJQUNwRCxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLFFBQWdCO1FBQy9CLElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMsbURBQW1ELENBQUMsQ0FBQztTQUN0RjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCx5QkFBeUIsQ0FBQyxpQkFBeUI7UUFDakQsSUFBSSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUMxRSxNQUFNLElBQUksZ0NBQXFCLENBQzdCLHNDQUFzQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxDQUNuRixDQUFDO1NBQ0g7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFD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QUM5QixNQUFNLElBQUksZ0NBQXFCLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDaEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHNCQUFzQixDQUFDLGNBQXNCO1FBQzNDLGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLG1CQUFtQixDQUFDLFdBQXlCO1FBQzNDLHdFQUF3RTtJQUMxRSxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGFBQWEsQ0FBQyxLQUFnQjtRQUM1QixJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDbkU7SUFDSCxDQUFDO0NBQ0Y7QUF2a0JELDRFQXVrQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZGRyZXNzLFxuICBhdmF4U2VyaWFsLFxuICB1dGlscyBhcyBBdmF4VXRpbHMsXG4gIEJpZ0ludFByLFxuICBDcmVkZW50aWFsLFxuICBJZCxcbiAgSW5wdXQsXG4gIEludCxcbiAgbmV0d29ya0lEcyxcbiAgT3V0cHV0T3duZXJzLFxuICBwdm1TZXJpYWwsXG4gIFRyYW5zZmVySW5wdXQsXG4gIFRyYW5zZmVyT3V0cHV0LFxuICBUeXBlU3ltYm9scyxcbiAgVW5zaWduZWRUeCxcbiAgVXR4byxcbiAgdXRpbHMgYXMgYXZheFV0aWxzLFxufSBmcm9tICdAYml0Z28vYXZhbGFuY2hlanMnO1xuaW1wb3J0IHtcbiAgQmFzZUFkZHJlc3MsXG4gIEJhc2VLZXksXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgaXNWYWxpZEJMU1B1YmxpY0tleSxcbiAgaXNWYWxpZEJMU1NpZ25hdHVyZSxcbiAgTm90U3VwcG9ydGVkLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIFR4IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyByZWNvdmVyVXR4b3MgfSBmcm9tICcuL3V0eG9FbmdpbmUnO1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeEJ1aWxkZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBwdWJsaWMgX3NpZ25lcjogS2V5UGFpcltdID0gW107XG4gIHByb3RlY3RlZCBfbm9kZUlEOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfYmxzUHVibGljS2V5OiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfYmxzU2lnbmF0dXJlOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBfc3RhcnRUaW1lOiBiaWdpbnQ7XG4gIHByb3RlY3RlZCBfZW5kVGltZTogYmlnaW50O1xuICBwcm90ZWN0ZWQgX3N0YWtlQW1vdW50OiBiaWdpbnQ7XG4gIHByb3RlY3RlZCByZWNvdmVyU2lnbmVyID0gZmFsc2U7XG4gIHByb3RlY3RlZCBfZGVsZWdhdGlvbkZlZVJhdGU6IG51bWJlcjtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvaW5Db25maWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRyYW5zYWN0aW9uIHR5cGVcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBsb2NrdGltZVxuICAgKiBAcGFyYW0gbG9ja3RpbWVcbiAgICovXG4gIHZhbGlkYXRlTG9ja3RpbWUobG9ja3RpbWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChsb2NrdGltZSA8IEJpZ0ludCgwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbG9ja3RpbWUgbXVzdCBiZSAwIG9yIGhpZ2hlcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGF0IHRoZSBkZWxlZ2F0aW9uIGZlZSBpcyBhdCBsZWFzdCB0aGUgbWluRGVsZWdhdGlvbkZlZVxuICAgKiBAcGFyYW0gZGVsZWdhdGlvbkZlZVJhdGUgbnVtYmVyXG4gICAqL1xuICB2YWxpZGF0ZURlbGVnYXRpb25GZWVSYXRlKGRlbGVnYXRpb25GZWVSYXRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGVsZWdhdGlvbkZlZVJhdGUgPCBOdW1iZXIodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5taW5EZWxlZ2F0aW9uRmVlKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYERlbGVnYXRpb24gZmVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gJHt0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLm1pbkRlbGVnYXRpb25GZWV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIFVUWE8gaGFzIGV4cGVjdGVkIGZpZWxkcy5cbiAgICogQHBhcmFtIFVUWE9cbiAgICovXG4gIHZhbGlkYXRlVXR4byh2YWx1ZTogRGVjb2RlZFV0eG9PYmopOiB2b2lkIHtcbiAgICBbJ291dHB1dElEJywgJ2Ftb3VudCcsICd0eGlkJywgJ291dHB1dGlkeCddLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlLmhhc093blByb3BlcnR5KGZpZWxkKSkgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgVXR4b3MgcmVxdWlyZWQgJHtmaWVsZH1gKTtcbiAgICB9KTtcbiAgfVxuICAvLyBlbmRyZWdpb25cblxuICAvKipcbiAgICogQWRkcmVzc2VzIHdoZXJlIHJld2FyZCBzaG91bGQgYmUgZGVwb3NpdFxuICAgKiBAcGFyYW0ge3N0cmluZyB8IHN0cmluZ1tdfSBhZGRyZXNzIC0gc2luZ2xlIGFkZHJlc3Mgb3IgYXJyYXkgb2YgYWRkcmVzc2VzIHRvIHJlY2VpdmUgcmV3YXJkc1xuICAgKi9cbiAgcmV3YXJkQWRkcmVzc2VzKGFkZHJlc3M6IHN0cmluZyB8IHN0cmluZ1tdKTogdGhpcyB7XG4gICAgY29uc3QgcmV3YXJkQWRkcmVzc2VzID0gYWRkcmVzcyBpbnN0YW5jZW9mIEFycmF5ID8gYWRkcmVzcyA6IFthZGRyZXNzXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9yZXdhcmRBZGRyZXNzZXMgPSByZXdhcmRBZGRyZXNzZXMubWFwKHV0aWxzLnBhcnNlQWRkcmVzcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBBdmF4VXRpbHMuZ2V0TWFuYWdlckZvclZNKCdQVk0nKTtcbiAgICBjb25zdCBbY29kZWMsIHJlc3RdID0gbWFuYWdlci5nZXRDb2RlY0Zyb21CdWZmZXIoQXZheFV0aWxzLmhleFRvQnVmZmVyKHJhd1RyYW5zYWN0aW9uKSk7XG4gICAgY29uc3QgdHggPSBjb2RlYy5VbnBhY2tQcmVmaXg8cHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHg+KHJlc3QpWzBdO1xuICAgIHRoaXMuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLmJ1aWxkQXZheFRyYW5zYWN0aW9uKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUodGhpcy50cmFuc2FjdGlvblR5cGUpO1xuICAgIGlmICh0aGlzLmhhc1NpZ25lcigpKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleVBhaXIgb2YgdGhpcy5fc2lnbmVyKSB7XG4gICAgICAgIGF3YWl0IHRoaXMudHJhbnNhY3Rpb24uc2lnbihrZXlQYWlyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG5vZGVJRFxuICAgKi9cbiAgbm9kZUlEKG5vZGVJRDogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZU5vZGVJRChub2RlSUQpO1xuICAgIHRoaXMuX25vZGVJRCA9IG5vZGVJRDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYmxzUHVibGljS2V5XG4gICAqL1xuICBibHNQdWJsaWNLZXkoYmxzUHVibGljS2V5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpc1ZhbGlkQkxTUHVibGljS2V5KGJsc1B1YmxpY0tleSk7XG4gICAgdGhpcy5fYmxzUHVibGljS2V5ID0gYmxzUHVibGljS2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBibHNTaWduYXR1cmVcbiAgICovXG4gIGJsc1NpZ25hdHVyZShibHNTaWduYXR1cmU6IHN0cmluZyk6IHRoaXMge1xuICAgIGlzVmFsaWRCTFNTaWduYXR1cmUoYmxzU2lnbmF0dXJlKTtcbiAgICB0aGlzLl9ibHNTaWduYXR1cmUgPSBibHNTaWduYXR1cmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3RpbWUgaXMgYSBsb25nIHRoYXQgY29udGFpbnMgdGhlIHVuaXggdGltZXN0YW1wIHRoYXQgdGhpcyBvdXRwdXQgY2FuIGJlIHNwZW50IGFmdGVyLlxuICAgKiBUaGUgdW5peCB0aW1lc3RhbXAgaXMgc3BlY2lmaWMgdG8gdGhlIHNlY29uZC5cbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBsb2NrdGltZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZUxvY2t0aW1lKEJpZ0ludCh2YWx1ZSkpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl9sb2NrdGltZSA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogc2V0IHRoZSBkZWxlZ2F0aW9uRmVlUmF0ZVxuICAgKiBAcGFyYW0gdmFsdWUgbnVtYmVyXG4gICAqL1xuICBkZWxlZ2F0aW9uRmVlUmF0ZSh2YWx1ZTogbnVtYmVyKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZURlbGVnYXRpb25GZWVSYXRlKHZhbHVlKTtcbiAgICB0aGlzLl9kZWxlZ2F0aW9uRmVlUmF0ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IHRpbWUgb2Ygc3Rha2luZyBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzdGFydFRpbWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IEJpZ0ludCh2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogZW5kIHRpbWUgb2Ygc3Rha2luZyBwZXJpb2RcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBlbmRUaW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLl9lbmRUaW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHN0YWtlQW1vdW50KHZhbHVlOiBiaWdpbnQgfCBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCB2YWx1ZUJpZ0ludCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgPyB2YWx1ZSA6IEJpZ0ludCh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0ZVN0YWtlQW1vdW50KHZhbHVlQmlnSW50KTtcbiAgICB0aGlzLl9zdGFrZUFtb3VudCA9IHZhbHVlQmlnSW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqXG4gICAqIHZhbGlkYXRlcyBhIGNvcnJlY3QgTm9kZUlEIGlzIHVzZWRcbiAgICogQHBhcmFtIG5vZGVJRFxuICAgKi9cbiAgdmFsaWRhdGVOb2RlSUQobm9kZUlEOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIW5vZGVJRCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBub2RlSUQnKTtcbiAgICB9XG4gICAgaWYgKG5vZGVJRC5zbGljZSgwLCA2KSAhPT0gJ05vZGVJRCcpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb246IGludmFsaWQgTm9kZUlEIHRhZycpO1xuICAgIH1cbiAgICBpZiAoIShBdmF4VXRpbHMuYmFzZTU4LmRlY29kZShub2RlSUQuc2xpY2UoNykpLmxlbmd0aCA9PT0gMjQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBOb2RlSUQgaXMgbm90IGluIGNiNTggZm9ybWF0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHN0YWtlIGR1cmF0aW9uXG4gICAqIEBwYXJhbSBzdGFydFRpbWVcbiAgICogQHBhcmFtIGVuZFRpbWVcbiAgICovXG4gIHZhbGlkYXRlU3Rha2VEdXJhdGlvbihzdGFydFRpbWU6IGJpZ2ludCwgZW5kVGltZTogYmlnaW50KTogdm9pZCB7XG4gICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0VuZCBkYXRlIGNhbm5vdCBiZSBsZXNzIHRoYW4gc3RhcnQgZGF0ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzdGFrZSBhbW91bnRcbiAgICogQHBhcmFtIGFtb3VudFxuICAgKi9cbiAgdmFsaWRhdGVTdGFrZUFtb3VudChhbW91bnQ6IGJpZ2ludCk6IHZvaWQge1xuICAgIGNvbnN0IG1pblN0YWtlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsubWluU3Rha2UpO1xuICAgIGlmIChhbW91bnQgPCBtaW5TdGFrZSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTWluaW11bSBzdGFraW5nIGFtb3VudCBpcyAnICsgTnVtYmVyKG1pblN0YWtlKSAvIDEwMDAwMDAwMDAgKyAnIEFWQVguJyk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHgpOiB0aGlzIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgcGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCA9ICh0eCBhcyBVbnNpZ25lZFR4KS50eCBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeDtcbiAgICBpZiAoIXRoaXMudmVyaWZ5VHhUeXBlKHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0cyA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguYmFzZVR4Lm91dHB1dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgZXh0ZXJuYWwgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXS5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgaWYgKG91dHB1dHNbMF0uZ2V0QXNzZXRJZCgpICE9PSB0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBBc3NldCBJRCBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IG1hdGNoIHRoZSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2Jsc1B1YmxpY0tleSA9IEF2YXhVdGlscy5idWZmZXJUb0hleChcbiAgICAgIChwZXJtaXNzaW9ubGVzc1ZhbGlkYXRvclR4LnNpZ25lciBhcyBwdm1TZXJpYWwuU2lnbmVyKS5wcm9vZi5wdWJsaWNLZXlcbiAgICApO1xuICAgIHRoaXMuX2Jsc1B1YmxpY0tleSA9IHRoaXMudHJhbnNhY3Rpb24uX2Jsc1B1YmxpY0tleTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibHNTaWduYXR1cmUgPSBBdmF4VXRpbHMuYnVmZmVyVG9IZXgoXG4gICAgICAocGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5zaWduZXIgYXMgcHZtU2VyaWFsLlNpZ25lcikucHJvb2Yuc2lnbmF0dXJlXG4gICAgKTtcbiAgICB0aGlzLl9ibHNTaWduYXR1cmUgPSB0aGlzLnRyYW5zYWN0aW9uLl9ibHNTaWduYXR1cmU7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSA9IG91dHB1dC5vdXRwdXRPd25lcnMubG9ja3RpbWUudmFsdWUoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBvdXRwdXQub3V0cHV0T3duZXJzLnRocmVzaG9sZC52YWx1ZSgpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX25vZGVJRCA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKTtcbiAgICB0aGlzLl9ub2RlSUQgPSB0aGlzLnRyYW5zYWN0aW9uLl9ub2RlSUQ7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fc3RhcnRUaW1lID0gcGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLnN0YXJ0VGltZS52YWx1ZSgpO1xuICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRoaXMudHJhbnNhY3Rpb24uX3N0YXJ0VGltZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9lbmRUaW1lID0gcGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5zdWJuZXRWYWxpZGF0b3IudmFsaWRhdG9yLmVuZFRpbWUudmFsdWUoKTtcbiAgICB0aGlzLl9lbmRUaW1lID0gdGhpcy50cmFuc2FjdGlvbi5fZW5kVGltZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gb3V0cHV0Lm91dHB1dE93bmVycy5hZGRycy5tYXAoKGEpID0+IGEudG9CeXRlcygpKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9zdGFrZUFtb3VudCA9IHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguc3Rha2VbMF0ub3V0cHV0LmFtb3VudCgpO1xuICAgIHRoaXMuc3Rha2VBbW91bnQocGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeC5zdGFrZVswXS5vdXRwdXQuYW1vdW50KCkpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gcmVjb3ZlclV0eG9zKHBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHguZ2V0SW5wdXRzKCkpO1xuICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICBjb25zb2xlLmxvZygndXR4b3M6ICcsIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zKTtcbiAgICBjb25zb2xlLmxvZygnZnJvbUFkZHJlc3NlczogJywgdGhpcy50cmFuc2FjdGlvbi5mcm9tQWRkcmVzc2VzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHlwZTogVHlwZVN5bWJvbHMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZSA9PT0gVHlwZVN5bWJvbHMuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeDtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eDogVHgpOiB0eCBpcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeCB7XG4gICAgcmV0dXJuIFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSgodHggYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHgpLl90eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5jZSBhZGRyZXNzZXMgaW4gb3V0cHV0cyBnZXQgcmVvcmRlcmVkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBzaWduYXR1cmVzXG4gICAqIGFyZSBhZGRlZCBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgKiBUbyBmaW5kIHRoZSBwb3NpdGlvbiwgd2UgdXNlIHRoZSBvdXRwdXQncyBhZGRyZXNzZXMgdG8gY3JlYXRlIHRoZVxuICAgKiBzaWduYXR1cmVJZHggaW4gdGhlIG9yZGVyIG5lZWRlZCAoaS5lLiBbdXNlciwgYml0Z28sIGJhY2t1cF0pXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVVdHhvcygpOiB7XG4gICAgaW5wdXRzOiBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgc3Rha2VPdXRwdXRzOiBhdmF4U2VyaWFsLlRyYW5zZmVyYWJsZU91dHB1dFtdO1xuICAgIGNoYW5nZU91dHB1dHM6IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgdXR4b3M6IFV0eG9bXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBjb25zdCBpbnB1dHM6IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IHN0YWtlT3V0cHV0czogYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNoYW5nZU91dHB1dHM6IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCB1dHhvczogVXR4b1tdID0gW107XG5cbiAgICBsZXQgY3VycmVudFRvdGFsID0gQmlnSW50KDApO1xuXG4gICAgLy8gZGVsZWdhdGluZyBhbmQgdmFsaWRhdGluZyBoYXZlIG5vIGZlZXNcbiAgICBjb25zdCB0b3RhbFRhcmdldCA9IHRoaXMuX3N0YWtlQW1vdW50LnZhbHVlT2YoKTtcblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWRlbnRpYWxzID8/IFtdO1xuICAgIC8vIENvbnZlcnQgZnJvbUFkZHJlc3NlcyB0byBzdHJpbmdcbiAgICAvLyBUaGUgb3JkZXIgb2YgZnJvbUFkZHJlc3NlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzb3VyY2Ugb2YgdGhlIGRhdGFcbiAgICAvLyBXaGVuIGJ1aWxkaW5nIGZyb20gcGFyYW1zLCB0aGUgb3JkZXIgaXMgW3VzZXIsIGJpdGdvLCBiYWNrdXBdXG4gICAgLy8gVGhlIG9yZGVyIGZyb20gdHggaGV4IGlzIFtiaXRnbywgYmFja3VwLCB1c2VyXVxuICAgIGNvbnN0IGJpdGdvQWRkcmVzc2VzID0gdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5tYXAoKGIpID0+XG4gICAgICBhdmF4VXRpbHMuZm9ybWF0KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuaHJwLCBiKVxuICAgICk7XG4gICAgLy8gVE9ETyhDUi0xMDczKTogcmVtb3ZlIGxvZ1xuICAgIGNvbnNvbGUubG9nKGBiaXRnb0FkZHJlc3M6ICR7Yml0Z29BZGRyZXNzZXN9YCk7XG5cbiAgICAvLyBpZiB3ZSBhcmUgaW4gT1ZDLCBub25lIG9mIHRoZSB1dHhvcyB3aWxsIGhhdmUgYWRkcmVzc2VzIHNpbmNlIHRoZXkgY29tZSBmcm9tXG4gICAgLy8gZGVzZXJpYWxpemVkIGlucHV0cyAod2hpY2ggZG9uJ3QgaGF2ZSBhZGRyZXNzZXMpLCBub3QgdGhlIElNU1xuICAgIGNvbnN0IGJ1aWxkT3V0cHV0cyA9XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvc1swXS5hZGRyZXNzZXMubGVuZ3RoICE9PSAwIHx8IHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zWzBdLmFkZHJlc3Nlc0luZGV4Py5sZW5ndGggIT09IDA7XG5cbiAgICBjb25zdCBhc3NldElkID0gSWQuZnJvbVN0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5mb3JFYWNoKCh1dHhvLCBpbmRleCkgPT4ge1xuICAgICAgLy8gdmFsaWRhdGUgdGhlIHV0eG9zXG4gICAgICBpZiAoIXV0eG8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVXR4byBpcyB1bmRlZmluZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGFkZHJlc3Nlc0luZGV4IHNob3VsZCBuZXZlciBoYXZlIGEgbWlzbWF0Y2hcbiAgICAgIGlmICh1dHhvLmFkZHJlc3Nlc0luZGV4Py5pbmNsdWRlcygtMSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQWRkcmVzc2VzIGFyZSBpbmNvbnNpc3RlbnQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh1dHhvLnRocmVzaG9sZCA8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUaHJlc2hvbGQgaXMgaW5jb25zaXN0ZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleCA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIGluIFdQLCBvdXRwdXQuYWRkcmVzc2VzSW5kZXggaXMgZW1wdHksIHNvIGZpbGwgaXRcbiAgICAgIGlmICghdXR4by5hZGRyZXNzZXNJbmRleCB8fCB1dHhvLmFkZHJlc3Nlc0luZGV4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB1dHhvLmFkZHJlc3Nlc0luZGV4ID0gYml0Z29BZGRyZXNzZXMubWFwKChhKSA9PiB1dHhvLmFkZHJlc3Nlcy5pbmRleE9mKGEpKTtcbiAgICAgIH1cbiAgICAgIC8vIHV0eG8uYWRkcmVzc2VzIGlzIG51bGwgd2hlbiBidWlsZCBmcm9tIHJhd1xuICAgICAgLy8gYnV0IHV0eG8uYWRkcmVzc2VzSW5kZXggaGFzIG9ubHkgMiBlbGVtZW50cyB3aGVuIGJ1aWxkIGZyb20gcmF3XG4gICAgICAvLyBzbyB0aGUgYml0Z29JbmRleFRvT25DaGFpbkluZGV4IG1hcCB3aWxsIGJlIGVtcHR5XG4gICAgICB1dHhvLmFkZHJlc3Nlcy5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgIGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleC5zZXQoYml0Z29BZGRyZXNzZXMuaW5kZXhPZihhKSwgdXR4by5hZGRyZXNzZXMuaW5kZXhPZihhKSk7XG4gICAgICB9KTtcbiAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgIGNvbnNvbGUubG9nKGB1dHhvLmFkZHJlc3NlczogJHt1dHhvLmFkZHJlc3Nlc31gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBiaXRnb0luZGV4VG9PbkNoYWluSW5kZXg6ICR7QXJyYXkuZnJvbShiaXRnb0luZGV4VG9PbkNoYWluSW5kZXgpfWApO1xuICAgICAgLy8gaW4gT1ZDLCBvdXRwdXQuYWRkcmVzc2VzSW5kZXggaXMgZGVmaW5lZCBjb3JyZWN0bHkgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0aW9uXG5cbiAgICAgIGlmICh1dHhvLm91dHB1dElEID09PSBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0KSB7XG4gICAgICAgIGNvbnN0IHV0eG9BbW91bnQgPSBCaWdJbnQodXR4by5hbW91bnQpO1xuICAgICAgICAvLyBlaXRoZXIgdXNlciAoMCkgb3IgcmVjb3ZlcnkgKDIpXG4gICAgICAgIC8vIE9uIHJlZ3VsYXIgbW9kZTogW3VzZXIsIGJpdGdvXSAoaS5lLiBbMCwgMV0pXG4gICAgICAgIC8vIE9uIHJlY292ZXJ5IG1vZGU6IFtiYWNrdXAsIGJpdGdvXSAoaS5lLiBbMiwgMV0pXG4gICAgICAgIGNvbnN0IHVzZXJPckJhY2t1cEluZGV4ID0gdGhpcy5yZWNvdmVyU2lnbmVyID8gMiA6IDA7XG4gICAgICAgIGNvbnN0IGJpdGdvSW5kZXggPSAxO1xuXG4gICAgICAgIGN1cnJlbnRUb3RhbCA9IGN1cnJlbnRUb3RhbCArIHV0eG9BbW91bnQ7XG5cbiAgICAgICAgY29uc3QgdXR4b0lkID0gYXZheFNlcmlhbC5VVFhPSUQuZnJvbU5hdGl2ZSh1dHhvLnR4aWQsIE51bWJlcih1dHhvLm91dHB1dGlkeCkpO1xuXG4gICAgICAgIGxldCBhZGRyZXNzZXNJbmRleDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgaWYgKHV0eG8uYWRkcmVzc2VzSW5kZXggJiYgYml0Z29JbmRleFRvT25DaGFpbkluZGV4LnNpemUgPT09IDApIHtcbiAgICAgICAgICBhZGRyZXNzZXNJbmRleCA9IFsuLi51dHhvLmFkZHJlc3Nlc0luZGV4XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhZGRyZXNzZXNJbmRleC5wdXNoKGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleC5nZXQodXNlck9yQmFja3VwSW5kZXgpKTtcbiAgICAgICAgICBhZGRyZXNzZXNJbmRleC5wdXNoKGJpdGdvSW5kZXhUb09uQ2hhaW5JbmRleC5nZXQoYml0Z29JbmRleCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdHJhbnNmZXJJbnB1dHMgPSBuZXcgVHJhbnNmZXJJbnB1dChcbiAgICAgICAgICBuZXcgQmlnSW50UHIodXR4b0Ftb3VudCksXG4gICAgICAgICAgbmV3IElucHV0KFsuLi5hZGRyZXNzZXNJbmRleF0uc29ydCgpLm1hcCgobnVtKSA9PiBuZXcgSW50KG51bSkpKVxuICAgICAgICApO1xuICAgICAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgICAgIGNvbnNvbGUubG9nKGB1c2luZyBhZGRyZXNzZXNJbmRleCBzb3J0ZWQ6ICR7Wy4uLmFkZHJlc3Nlc0luZGV4XS5zb3J0KCl9YCk7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgYXZheFNlcmlhbC5UcmFuc2ZlcmFibGVJbnB1dCh1dHhvSWQsIGFzc2V0SWQsIHRyYW5zZmVySW5wdXRzKTtcbiAgICAgICAgdXR4b3MucHVzaChuZXcgVXR4byh1dHhvSWQsIGFzc2V0SWQsIHRyYW5zZmVySW5wdXRzKSk7XG5cbiAgICAgICAgaW5wdXRzLnB1c2goaW5wdXQpO1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uY3JlZGVudGlhbHMgfHwgdGhpcy50cmFuc2FjdGlvbi5jcmVkZW50aWFscy5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGlmIChidWlsZE91dHB1dHMpIHtcbiAgICAgICAgICAgIC8vIEZvciB0aGUgYml0Z28gc2lnbmF0dXJlIHdlIGNyZWF0ZSBhbiBlbXB0eSBzaWduYXR1cmVcbiAgICAgICAgICAgIC8vIEZvciB0aGUgdXNlci9iYWNrdXAgc2lnbmF0dXJlIHdlIHN0b3JlIHRoZSBhZGRyZXNzIHRoYXQgbWF0Y2hlcyB0aGUga2V5XG4gICAgICAgICAgICAvLyBpZiBiaXRnbyBhZGRyZXNzIGNvbWVzIGJlZm9yZSAgPCB1c2VyL2JhY2t1cCBhZGRyZXNzXG5cbiAgICAgICAgICAgIC8vIFRPRE8oQ1ItMTA3Myk6IHJlbW92ZSBsb2dcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBiaXRnbyBpbmRleCBvbiBjaGFpbjogJHt1dHhvLmFkZHJlc3Nlc0luZGV4W2JpdGdvSW5kZXhdfWApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHVzZXIgT3IgQmFja3VwIEluZGV4OiAke3V0eG8uYWRkcmVzc2VzSW5kZXhbdXNlck9yQmFja3VwSW5kZXhdfWApO1xuICAgICAgICAgICAgaWYgKHV0eG8uYWRkcmVzc2VzSW5kZXhbYml0Z29JbmRleF0gPCB1dHhvLmFkZHJlc3Nlc0luZGV4W3VzZXJPckJhY2t1cEluZGV4XSkge1xuICAgICAgICAgICAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGB1c2VyIG9yIGJhY2t1cCBjcmVkZW50aWFscyBhZnRlciBiaXRnb2ApO1xuICAgICAgICAgICAgICBjcmVkZW50aWFscy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBDcmVkZW50aWFsKFtcbiAgICAgICAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZyhCdWZmZXJBdmF4LmZyb20oJycpLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoXG4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzW3VzZXJPckJhY2t1cEluZGV4XSkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGB1c2VyIG9yIGJhY2t1cCBjcmVkZW50aWFscyBiZWZvcmUgYml0Z29gKTtcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHMucHVzaChcbiAgICAgICAgICAgICAgICBuZXcgQ3JlZGVudGlhbChbXG4gICAgICAgICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoXG4gICAgICAgICAgICAgICAgICAgIEJ1ZmZlckF2YXguZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzW3VzZXJPckJhY2t1cEluZGV4XSkudG9TdHJpbmcoJ2hleCcpXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgdXRpbHMuY3JlYXRlTmV3U2lnKEJ1ZmZlckF2YXguZnJvbSgnJykudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPKENSLTEwNzMpOiB2ZXJpZnkgdGhpcyBlbHNlIGNhc2UgZm9yIE9WQ1xuICAgICAgICAgICAgY3JlZGVudGlhbHMucHVzaChcbiAgICAgICAgICAgICAgbmV3IENyZWRlbnRpYWwoXG4gICAgICAgICAgICAgICAgYWRkcmVzc2VzSW5kZXgubWFwKChpKSA9PlxuICAgICAgICAgICAgICAgICAgdXRpbHMuY3JlYXRlTmV3U2lnKEJ1ZmZlckF2YXguZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzW2ldKS50b1N0cmluZygnaGV4JykpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUT0RPKENSLTEwNzMpOiByZW1vdmUgbG9nXG4gICAgICAgICAgY29uc29sZS5sb2coYHJldXNpbmcgY3JlZGVudGlhbHMgZnJvbSB0cmFuc2FjdGlvbmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYnVpbGRPdXRwdXRzKSB7XG4gICAgICBpZiAoY3VycmVudFRvdGFsIDwgdG90YWxUYXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICBgVXR4byBvdXRwdXRzIGdldCAke2N1cnJlbnRUb3RhbC50b1N0cmluZygpfSBhbmQgJHt0b3RhbFRhcmdldC50b1N0cmluZygpfSBpcyByZXF1aXJlZGBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRvdGFsID49IHRvdGFsVGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHN0YWtlT3V0cHV0ID0gbmV3IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlT3V0cHV0KFxuICAgICAgICAgIGFzc2V0SWQsXG4gICAgICAgICAgbmV3IFRyYW5zZmVyT3V0cHV0KFxuICAgICAgICAgICAgbmV3IEJpZ0ludFByKHRvdGFsVGFyZ2V0KSxcbiAgICAgICAgICAgIG5ldyBPdXRwdXRPd25lcnMoXG4gICAgICAgICAgICAgIG5ldyBCaWdJbnRQcih0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSksXG4gICAgICAgICAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSxcbiAgICAgICAgICAgICAgWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGF2YXhVdGlscy5ieXRlc0NvbXBhcmUoYSwgYikpXG4gICAgICAgICAgICAgICAgLm1hcCgoYSkgPT4gQWRkcmVzcy5mcm9tQnl0ZXMoYSlbMF0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBzdGFrZU91dHB1dHMucHVzaChzdGFrZU91dHB1dCk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRUb3RhbCA+IHRvdGFsVGFyZ2V0KSB7XG4gICAgICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gbmV3IGF2YXhTZXJpYWwuVHJhbnNmZXJhYmxlT3V0cHV0KFxuICAgICAgICAgICAgYXNzZXRJZCxcbiAgICAgICAgICAgIG5ldyBUcmFuc2Zlck91dHB1dChcbiAgICAgICAgICAgICAgbmV3IEJpZ0ludFByKGN1cnJlbnRUb3RhbCAtIHRvdGFsVGFyZ2V0KSxcbiAgICAgICAgICAgICAgbmV3IE91dHB1dE93bmVycyhcbiAgICAgICAgICAgICAgICBuZXcgQmlnSW50UHIodGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUpLFxuICAgICAgICAgICAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSxcbiAgICAgICAgICAgICAgICBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc11cbiAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhdmF4VXRpbHMuYnl0ZXNDb21wYXJlKGEsIGIpKVxuICAgICAgICAgICAgICAgICAgLm1hcCgoYSkgPT4gQWRkcmVzcy5mcm9tQnl0ZXMoYSlbMF0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICAgIGNoYW5nZU91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlucHV0cy5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBpZiAoYXZheFV0aWxzLmJ5dGVzRXF1YWwoYS51dHhvSUQudHhJRC50b0J5dGVzKCksIGIudXR4b0lELnR4SUQudG9CeXRlcygpKSkge1xuICAgICAgICByZXR1cm4gYS51dHhvSUQub3V0cHV0SWR4LnZhbHVlKCkgLSBiLnV0eG9JRC5vdXRwdXRJZHgudmFsdWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdmF4VXRpbHMuYnl0ZXNDb21wYXJlKGEudXR4b0lELnR4SUQudG9CeXRlcygpLCBiLnV0eG9JRC50eElELnRvQnl0ZXMoKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgaW5wdXRzLCBzdGFrZU91dHB1dHMsIGNoYW5nZU91dHB1dHMsIHV0eG9zLCBjcmVkZW50aWFscyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBhZGQgdmFsaWRhdG9yIHRyYW5zYWN0aW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEF2YXhUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlU3Rha2VEdXJhdGlvbih0aGlzLnRyYW5zYWN0aW9uLl9zdGFydFRpbWUsIHRoaXMudHJhbnNhY3Rpb24uX2VuZFRpbWUpO1xuICAgIGNvbnN0IHsgaW5wdXRzLCBzdGFrZU91dHB1dHMsIGNoYW5nZU91dHB1dHMsIHV0eG9zLCBjcmVkZW50aWFscyB9ID0gdGhpcy5jYWxjdWxhdGVVdHhvcygpO1xuICAgIGNvbnN0IGJhc2VUeCA9IGF2YXhTZXJpYWwuQmFzZVR4LmZyb21OYXRpdmUoXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQsXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQsXG4gICAgICBjaGFuZ2VPdXRwdXRzLFxuICAgICAgaW5wdXRzLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoKSAvLyBkZWZhdWx0IGVtcHR5IG1lbW9cbiAgICApO1xuXG4gICAgY29uc3Qgc3VibmV0VmFsaWRhdG9yID0gcHZtU2VyaWFsLlN1Ym5ldFZhbGlkYXRvci5mcm9tTmF0aXZlKFxuICAgICAgdGhpcy5fbm9kZUlELFxuICAgICAgdGhpcy5fc3RhcnRUaW1lLFxuICAgICAgdGhpcy5fZW5kVGltZSxcbiAgICAgIHRoaXMuX3N0YWtlQW1vdW50LFxuICAgICAgbmV0d29ya0lEcy5QcmltYXJ5TmV0d29ya0lEXG4gICAgKTtcblxuICAgIGNvbnN0IHNpZ25lciA9IG5ldyBwdm1TZXJpYWwuU2lnbmVyKFxuICAgICAgbmV3IHB2bVNlcmlhbC5Qcm9vZk9mUG9zc2Vzc2lvbihcbiAgICAgICAgQXZheFV0aWxzLmhleFRvQnVmZmVyKHRoaXMuX2Jsc1B1YmxpY0tleSksXG4gICAgICAgIEF2YXhVdGlscy5oZXhUb0J1ZmZlcih0aGlzLl9ibHNTaWduYXR1cmUpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IG91dHB1dE93bmVycyA9IG5ldyBPdXRwdXRPd25lcnMoXG4gICAgICBuZXcgQmlnSW50UHIodGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUpLFxuICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpLFxuICAgICAgWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhdmF4VXRpbHMuYnl0ZXNDb21wYXJlKGEsIGIpKVxuICAgICAgICAubWFwKChhKSA9PiBBZGRyZXNzLmZyb21CeXRlcyhhKVswXSlcbiAgICApO1xuXG4gICAgLy8gVE9ETyhDUi0xMDczKTogY2hlY2sgdGhpcyB2YWx1ZVxuICAgIC8vICBTaGFyZXMgMTAsMDAwIHRpbWVzIHBlcmNlbnRhZ2Ugb2YgcmV3YXJkIHRha2VuIGZyb20gZGVsZWdhdG9yc1xuICAgIC8vICBodHRwczovL2RvY3MuYXZheC5uZXR3b3JrL3JlZmVyZW5jZS9hdmFsYW5jaGVnby9wLWNoYWluL3R4bi1mb3JtYXQjdW5zaWduZWQtYWRkLXZhbGlkYXRvci10eFxuICAgIGNvbnN0IHNoYXJlcyA9IG5ldyBJbnQoMWU0ICogMik7XG5cbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGF2YXhVdGlscy5ieXRlc0NvbXBhcmUoYSwgYikpXG4gICAgICAubWFwKChhZGRyZXNzKSA9PiBuZXcgQXZheFV0aWxzLkFkZHJlc3NNYXAoW1tuZXcgQWRkcmVzcyhhZGRyZXNzKSwgMF1dKSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKFxuICAgICAgbmV3IFVuc2lnbmVkVHgoXG4gICAgICAgIG5ldyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeChcbiAgICAgICAgICBiYXNlVHgsXG4gICAgICAgICAgc3VibmV0VmFsaWRhdG9yLFxuICAgICAgICAgIHNpZ25lcixcbiAgICAgICAgICBzdGFrZU91dHB1dHMsXG4gICAgICAgICAgb3V0cHV0T3duZXJzLFxuICAgICAgICAgIG91dHB1dE93bmVycyxcbiAgICAgICAgICBzaGFyZXNcbiAgICAgICAgKSxcbiAgICAgICAgdXR4b3MsXG4gICAgICAgIG5ldyBBdmF4VXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLFxuICAgICAgICBjcmVkZW50aWFsc1xuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbih7IGtleSB9OiBCYXNlS2V5KTogVHJhbnNhY3Rpb24ge1xuICAgIHRoaXMuX3NpZ25lci5wdXNoKG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSkpO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBCYXNlQWRkcmVzcywgYWRkcmVzc0Zvcm1hdD86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGhhc1NpZ25lcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmVyICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fc2lnbmVyLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVLZXkoeyBrZXkgfTogQmFzZUtleSk6IHZvaWQge1xuICAgIGlmICghbmV3IEtleVBhaXIoeyBwcnY6IGtleSB9KSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBrZXknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIHJhdyB0cmFuc2FjdGlvbiBoYXMgYSB2YWxpZCBmb3JtYXQgaW4gdGhlIGJsb2NrY2hhaW4gY29udGV4dCwgdGhyb3cgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb24gVHJhbnNhY3Rpb24gaW4gYW55IGZvcm1hdFxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdXRpbHMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbj86IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgLy8gdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ3ZhbGlkYXRlVHJhbnNhY3Rpb24gbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1ZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -1,43 +1,44 @@
|
|
|
1
|
-
/// <reference types="bn.js" />
|
|
2
1
|
/// <reference types="node" />
|
|
3
|
-
import {
|
|
2
|
+
import { avaxSerial, Credential } from '@bitgo/avalanchejs';
|
|
4
3
|
import { BaseKey, BaseTransaction, Entry, TransactionFee, TransactionType } from '@bitgo-beta/sdk-core';
|
|
4
|
+
import { AvalancheNetwork, BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
5
|
+
import { Buffer as BufferAvax } from 'avalanche';
|
|
6
|
+
import { Buffer } from 'buffer';
|
|
7
|
+
import { DecodedUtxoObj, TransactionExplanation, Tx, TxData } from './iface';
|
|
5
8
|
import { KeyPair } from './keyPair';
|
|
6
|
-
import { BaseTx, DecodedUtxoObj, TransactionExplanation, Tx, TxData } from './iface';
|
|
7
|
-
import { BN, Buffer as BufferAvax } from 'avalanche';
|
|
8
|
-
import { Credential } from 'avalanche/dist/common';
|
|
9
9
|
export declare class Transaction extends BaseTransaction {
|
|
10
10
|
protected _avaxTransaction: Tx;
|
|
11
11
|
_type: TransactionType;
|
|
12
12
|
_network: AvalancheNetwork;
|
|
13
13
|
_networkID: number;
|
|
14
|
-
_assetId:
|
|
15
|
-
_blockchainID:
|
|
16
|
-
|
|
14
|
+
_assetId: string;
|
|
15
|
+
_blockchainID: string;
|
|
16
|
+
_nodeID: string;
|
|
17
|
+
_startTime: bigint;
|
|
18
|
+
_endTime: bigint;
|
|
19
|
+
_stakeAmount: bigint;
|
|
17
20
|
_threshold: number;
|
|
18
|
-
_locktime:
|
|
19
|
-
_fromAddresses:
|
|
21
|
+
_locktime: bigint;
|
|
22
|
+
_fromAddresses: Uint8Array[];
|
|
20
23
|
_rewardAddresses: BufferAvax[];
|
|
21
24
|
_utxos: DecodedUtxoObj[];
|
|
22
25
|
_to: BufferAvax[];
|
|
23
26
|
_fee: Partial<TransactionFee>;
|
|
27
|
+
_blsPublicKey: string;
|
|
28
|
+
_blsSignature: string;
|
|
24
29
|
constructor(coinConfig: Readonly<CoinConfig>);
|
|
25
|
-
get avaxPTransaction(): BaseTx;
|
|
30
|
+
get avaxPTransaction(): avaxSerial.BaseTx;
|
|
26
31
|
get signature(): string[];
|
|
27
32
|
get credentials(): Credential[];
|
|
28
33
|
get hasCredentials(): boolean;
|
|
29
34
|
/** @inheritdoc */
|
|
30
35
|
canSign({ key }: BaseKey): boolean;
|
|
31
36
|
/**
|
|
32
|
-
* Sign
|
|
33
|
-
* validator, delegator, import, exports extend baseTx
|
|
34
|
-
* unsignedTx: UnsignedTx = new UnsignedTx(baseTx) (baseTx = addValidatorTx)
|
|
35
|
-
* const tx: Tx = unsignedTx.sign(keychain) (tx is type standard signed tx)
|
|
36
|
-
* get baseTx then create new unsignedTx then sign
|
|
37
|
-
*
|
|
37
|
+
* Sign an avaxp transaction and update the transaction hex
|
|
38
38
|
* @param {KeyPair} keyPair
|
|
39
39
|
*/
|
|
40
|
-
sign(keyPair: KeyPair): void
|
|
40
|
+
sign(keyPair: KeyPair): Promise<void>;
|
|
41
|
+
toHexString(byteArray: Uint8Array): string;
|
|
41
42
|
/** @inheritdoc */
|
|
42
43
|
/**
|
|
43
44
|
* should be of signedTx doing this with baseTx
|
|
@@ -63,9 +64,6 @@ export declare class Transaction extends BaseTransaction {
|
|
|
63
64
|
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
64
65
|
*/
|
|
65
66
|
get outputs(): Entry[];
|
|
66
|
-
/**
|
|
67
|
-
* Get a Transasction Fee.
|
|
68
|
-
*/
|
|
69
67
|
get fee(): TransactionFee;
|
|
70
68
|
get changeOutputs(): Entry[];
|
|
71
69
|
get inputs(): Entry[];
|
|
@@ -77,24 +75,5 @@ export declare class Transaction extends BaseTransaction {
|
|
|
77
75
|
createSignature(prv: Buffer): string;
|
|
78
76
|
/** @inheritdoc */
|
|
79
77
|
explainTransaction(): TransactionExplanation;
|
|
80
|
-
/**
|
|
81
|
-
* Check if this transaction is a P chain
|
|
82
|
-
*/
|
|
83
|
-
get isTransactionForCChain(): boolean;
|
|
84
|
-
/**
|
|
85
|
-
* get the source chain id or undefined if it's a cross chain transfer.
|
|
86
|
-
*/
|
|
87
|
-
get sourceChain(): string | undefined;
|
|
88
|
-
/**
|
|
89
|
-
* get the destinationChain or undefined if it's a cross chain transfer.
|
|
90
|
-
*/
|
|
91
|
-
get destinationChain(): string | undefined;
|
|
92
|
-
/**
|
|
93
|
-
* Convert a blockchainId buffer to string and return P or C alias if match of any of that chains.
|
|
94
|
-
* @param {BufferAvax} blockchainIDBuffer
|
|
95
|
-
* @return {string} blocchainID or alias if exists.
|
|
96
|
-
* @private
|
|
97
|
-
*/
|
|
98
|
-
private blockchainIDtoAlias;
|
|
99
78
|
}
|
|
100
79
|
//# sourceMappingURL=transaction.d.ts.map
|