@bitgo/sdk-coin-cspr 1.0.1-rc.0
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/.eslintignore +4 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +8 -0
- package/LICENSE +191 -0
- package/README.md +39 -0
- package/dist/src/cspr.d.ts +101 -0
- package/dist/src/cspr.d.ts.map +1 -0
- package/dist/src/cspr.js +293 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +29 -0
- package/dist/src/lib/constants.d.ts +19 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +28 -0
- package/dist/src/lib/delegateBuilder.d.ts +49 -0
- package/dist/src/lib/delegateBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegateBuilder.js +111 -0
- package/dist/src/lib/ifaces.d.ts +69 -0
- package/dist/src/lib/ifaces.d.ts.map +1 -0
- package/dist/src/lib/ifaces.js +3 -0
- package/dist/src/lib/index.d.ts +6 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +31 -0
- package/dist/src/lib/keyPair.d.ts +18 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +75 -0
- package/dist/src/lib/transaction.d.ts +55 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +227 -0
- package/dist/src/lib/transactionBuilder.d.ts +124 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +312 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +46 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +98 -0
- package/dist/src/lib/transferBuilder.d.ts +39 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +106 -0
- package/dist/src/lib/undelegateBuilder.d.ts +49 -0
- package/dist/src/lib/undelegateBuilder.d.ts.map +1 -0
- package/dist/src/lib/undelegateBuilder.js +111 -0
- package/dist/src/lib/utils.d.ts +188 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +477 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts +27 -0
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
- package/dist/src/lib/walletInitializationBuilder.js +95 -0
- package/dist/src/tcspr.d.ts +11 -0
- package/dist/src/tcspr.d.ts.map +1 -0
- package/dist/src/tcspr.js +24 -0
- package/package.json +62 -0
package/dist/src/cspr.js
ADDED
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.Cspr = void 0;
|
|
26
|
+
/**
|
|
27
|
+
* @prettier
|
|
28
|
+
*/
|
|
29
|
+
const CsprLib = __importStar(require("./lib"));
|
|
30
|
+
const utxo_lib_1 = require("@bitgo/utxo-lib");
|
|
31
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
32
|
+
const statics_1 = require("@bitgo/statics");
|
|
33
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
34
|
+
class Cspr extends sdk_core_1.BaseCoin {
|
|
35
|
+
constructor(bitgo, staticsCoin) {
|
|
36
|
+
super(bitgo);
|
|
37
|
+
if (!staticsCoin) {
|
|
38
|
+
throw new Error('missing required constructor parameter staticsCoin');
|
|
39
|
+
}
|
|
40
|
+
this._staticsCoin = staticsCoin;
|
|
41
|
+
}
|
|
42
|
+
static createInstance(bitgo, staticsCoin) {
|
|
43
|
+
return new Cspr(bitgo, staticsCoin);
|
|
44
|
+
}
|
|
45
|
+
getChain() {
|
|
46
|
+
return this._staticsCoin.name;
|
|
47
|
+
}
|
|
48
|
+
getFamily() {
|
|
49
|
+
return this._staticsCoin.family;
|
|
50
|
+
}
|
|
51
|
+
getFullName() {
|
|
52
|
+
return this._staticsCoin.fullName;
|
|
53
|
+
}
|
|
54
|
+
getBaseFactor() {
|
|
55
|
+
return Math.pow(10, this._staticsCoin.decimalPlaces);
|
|
56
|
+
}
|
|
57
|
+
async verifyTransaction(params) {
|
|
58
|
+
// TODO: Implement when available on the SDK.
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if address is valid, then make sure it matches the root address.
|
|
63
|
+
*
|
|
64
|
+
* @param {VerifyAddressOptions} params address and rootAddress to verify
|
|
65
|
+
*/
|
|
66
|
+
isWalletAddress(params) {
|
|
67
|
+
const { address, keychains } = params;
|
|
68
|
+
if (!this.isValidAddress(address)) {
|
|
69
|
+
throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
|
|
70
|
+
}
|
|
71
|
+
if (!keychains || keychains.length !== 3) {
|
|
72
|
+
throw new Error('Invalid keychains');
|
|
73
|
+
}
|
|
74
|
+
const userPubKey = keychains[sdk_core_1.KeyIndices.USER].pub;
|
|
75
|
+
const rootAddress = new CsprLib.KeyPair({ pub: userPubKey }).getAddress();
|
|
76
|
+
const addressDetails = CsprLib.Utils.getAddressDetails(address);
|
|
77
|
+
if (addressDetails.address.toLowerCase() !== rootAddress.toLowerCase()) {
|
|
78
|
+
throw new sdk_core_1.UnexpectedAddressError(`address validation failure: ${addressDetails.address} vs ${rootAddress}`);
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Generate Casper key pair - BitGo xpub format
|
|
84
|
+
*
|
|
85
|
+
* @param {Buffer} seed - Seed from which the new keypair should be generated, otherwise a random seed is used
|
|
86
|
+
* @returns {Object} object with generated xpub and xprv
|
|
87
|
+
*/
|
|
88
|
+
generateKeyPair(seed) {
|
|
89
|
+
const keyPair = seed ? new CsprLib.KeyPair({ seed }) : new CsprLib.KeyPair();
|
|
90
|
+
const keys = keyPair.getExtendedKeys();
|
|
91
|
+
if (!keys.xprv) {
|
|
92
|
+
throw new Error('Missing xprv in key generation.');
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
pub: keys.xpub,
|
|
96
|
+
prv: keys.xprv,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
isValidPub(pub) {
|
|
100
|
+
// TODO(STLX-1344): Validate using account-lib when available
|
|
101
|
+
// return accountLib.Cspr.Utils.isValidPublicKey(pub);
|
|
102
|
+
try {
|
|
103
|
+
new CsprLib.KeyPair({ pub });
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Return boolean indicating whether input is valid private key for the coin
|
|
112
|
+
*
|
|
113
|
+
* @param prv the prv to be checked
|
|
114
|
+
* @returns is it valid?
|
|
115
|
+
*/
|
|
116
|
+
isValidPrv(prv) {
|
|
117
|
+
// TODO(STLX-1345): Validate using account-lib when available
|
|
118
|
+
// return accountLib.Cspr.Utils.isValidPrivateKey(prv);
|
|
119
|
+
try {
|
|
120
|
+
new CsprLib.KeyPair({ prv });
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Return boolean indicating whether input is valid CSPR address
|
|
129
|
+
*
|
|
130
|
+
* @param address the pub to be checked
|
|
131
|
+
* @returns true if the address is valid
|
|
132
|
+
*/
|
|
133
|
+
isValidAddress(address) {
|
|
134
|
+
try {
|
|
135
|
+
const addressDetails = CsprLib.Utils.getAddressDetails(address);
|
|
136
|
+
return address === CsprLib.Utils.normalizeAddress(addressDetails);
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Assemble keychain and half-sign prebuilt transaction
|
|
144
|
+
*
|
|
145
|
+
* @param {SignTransactionOptions} params data required to rebuild and sign the transaction
|
|
146
|
+
* @param {TransactionPrebuild} params.txPrebuild prebuild object returned by platform
|
|
147
|
+
* @param {String} params.prv user prv used to sign the transaction
|
|
148
|
+
* @returns Bluebird<SignedTransaction>
|
|
149
|
+
*/
|
|
150
|
+
async signTransaction(params) {
|
|
151
|
+
const txBuilder = this.getBuilder().from(params.txPrebuild.txHex);
|
|
152
|
+
const key = params.prv;
|
|
153
|
+
txBuilder.sign({ key });
|
|
154
|
+
const transaction = await txBuilder.build();
|
|
155
|
+
if (!transaction) {
|
|
156
|
+
throw new sdk_core_1.InvalidTransactionError('Error while trying to build transaction');
|
|
157
|
+
}
|
|
158
|
+
const response = {
|
|
159
|
+
txHex: transaction.toBroadcastFormat(),
|
|
160
|
+
};
|
|
161
|
+
return transaction.signature.length >= 2 ? response : { halfSigned: response };
|
|
162
|
+
}
|
|
163
|
+
async parseTransaction(params) {
|
|
164
|
+
return {};
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Extend walletParams with extra params required for generating a Casper wallet
|
|
168
|
+
*
|
|
169
|
+
* Casper wallets have three three keys, user, backup and bitgo.
|
|
170
|
+
* Initially, we need a root prv to generate the account, which must be distinct from all three keychains on the wallet.
|
|
171
|
+
* If a root private key is not provided, a random one is generated.
|
|
172
|
+
* The root public key is the basis for the wallet root address.
|
|
173
|
+
*/
|
|
174
|
+
async supplementGenerateWallet(walletParams) {
|
|
175
|
+
if (walletParams.rootPrivateKey) {
|
|
176
|
+
if (!this.isValidPrv(walletParams.rootPrivateKey) || walletParams.rootPrivateKey.length !== 64) {
|
|
177
|
+
throw new Error('rootPrivateKey needs to be a hexadecimal private key string');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
const keyPair = utxo_lib_1.ECPair.makeRandom();
|
|
182
|
+
if (!keyPair.privateKey) {
|
|
183
|
+
throw new Error('no privateKey');
|
|
184
|
+
}
|
|
185
|
+
walletParams.rootPrivateKey = keyPair.privateKey.toString('hex');
|
|
186
|
+
}
|
|
187
|
+
return walletParams;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Sign message with private key
|
|
191
|
+
*
|
|
192
|
+
* @param key
|
|
193
|
+
* @param message
|
|
194
|
+
*/
|
|
195
|
+
async signMessage(key, message) {
|
|
196
|
+
const keyPair = new CsprLib.KeyPair({ prv: key.prv });
|
|
197
|
+
const messageHex = message instanceof Buffer ? message.toString('hex') : message;
|
|
198
|
+
const signatureData = CsprLib.Utils.signMessage(keyPair, messageHex);
|
|
199
|
+
return Buffer.from(signatureData.signature);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Explain a Casper transaction from Raw Tx
|
|
203
|
+
*
|
|
204
|
+
* @param {ExplainTransactionOptions} params given explain transaction params
|
|
205
|
+
* @param {String} params.txHex raw transaction
|
|
206
|
+
* @param {String} params.halfSigned.txHex raw half signed transaction
|
|
207
|
+
* @param {TransactionFee} fee fee information
|
|
208
|
+
* @returns Bluebird<TransactionExplanation>
|
|
209
|
+
*/
|
|
210
|
+
async explainTransaction(params) {
|
|
211
|
+
const txHex = params.txHex || (params.halfSigned && params.halfSigned.txHex);
|
|
212
|
+
if (!txHex || !params.feeInfo) {
|
|
213
|
+
throw new Error('missing explain tx parameters');
|
|
214
|
+
}
|
|
215
|
+
const txBuilder = this.getBuilder().from(txHex);
|
|
216
|
+
const tx = await txBuilder.build();
|
|
217
|
+
if (!tx) {
|
|
218
|
+
throw new sdk_core_1.InvalidTransactionError('Error while trying to build transaction');
|
|
219
|
+
}
|
|
220
|
+
const id = Buffer.from(tx.casperTx.hash).toString('hex');
|
|
221
|
+
const amount = CsprLib.Utils.getTransferAmount(tx.casperTx.session);
|
|
222
|
+
let transferId;
|
|
223
|
+
const outputs = [];
|
|
224
|
+
const operations = [];
|
|
225
|
+
switch (tx.type) {
|
|
226
|
+
case sdk_core_1.TransactionType.Send: {
|
|
227
|
+
transferId = CsprLib.Utils.getTransferId(tx.casperTx.session);
|
|
228
|
+
const toAddress = CsprLib.Utils.getTransferDestinationAddress(tx._deploy.session);
|
|
229
|
+
outputs.push({
|
|
230
|
+
address: toAddress,
|
|
231
|
+
amount,
|
|
232
|
+
coin: this.getChain(),
|
|
233
|
+
});
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
case sdk_core_1.TransactionType.StakingLock: {
|
|
237
|
+
const validator = CsprLib.Utils.getValidatorAddress(tx._deploy.session);
|
|
238
|
+
operations.push({
|
|
239
|
+
type: sdk_core_1.TransactionType.StakingLock,
|
|
240
|
+
amount,
|
|
241
|
+
coin: this.getChain(),
|
|
242
|
+
validator: validator,
|
|
243
|
+
});
|
|
244
|
+
break;
|
|
245
|
+
}
|
|
246
|
+
case sdk_core_1.TransactionType.StakingUnlock: {
|
|
247
|
+
const validator = CsprLib.Utils.getValidatorAddress(tx._deploy.session);
|
|
248
|
+
operations.push({
|
|
249
|
+
type: sdk_core_1.TransactionType.StakingUnlock,
|
|
250
|
+
amount,
|
|
251
|
+
coin: this.getChain(),
|
|
252
|
+
validator: validator,
|
|
253
|
+
});
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
default: {
|
|
257
|
+
throw new sdk_core_1.InvalidTransactionError('Error while trying to get transaction type');
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const outputAmount = outputs
|
|
261
|
+
.reduce((acumulator, output) => {
|
|
262
|
+
const currentValue = new bignumber_js_1.default(output.amount);
|
|
263
|
+
return acumulator.plus(currentValue);
|
|
264
|
+
}, new bignumber_js_1.default(0))
|
|
265
|
+
.toFixed(0);
|
|
266
|
+
const displayOrder = [
|
|
267
|
+
'id',
|
|
268
|
+
'outputAmount',
|
|
269
|
+
'changeAmount',
|
|
270
|
+
'outputs',
|
|
271
|
+
'changeOutputs',
|
|
272
|
+
'transferId',
|
|
273
|
+
'fee',
|
|
274
|
+
'operations',
|
|
275
|
+
];
|
|
276
|
+
return {
|
|
277
|
+
displayOrder,
|
|
278
|
+
id,
|
|
279
|
+
outputs,
|
|
280
|
+
outputAmount,
|
|
281
|
+
changeOutputs: [],
|
|
282
|
+
changeAmount: '0',
|
|
283
|
+
transferId,
|
|
284
|
+
fee: params.feeInfo,
|
|
285
|
+
operations,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
getBuilder() {
|
|
289
|
+
return new CsprLib.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
exports.Cspr = Cspr;
|
|
293
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Nwci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jc3ByLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILCtDQUFpQztBQUNqQyw4Q0FBeUM7QUFDekMsZ0VBQXFDO0FBRXJDLDRDQUFnRjtBQUNoRiw4Q0FpQnlCO0FBeUN6QixNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBQ0QsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUNELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBZ0M7UUFDdEQsNkNBQTZDO1FBQzdDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsTUFB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WUFDVixHQUFHLEVBQUUsTUFBTSxDQUFDLE9BQU87WUFDbkIsVUFBVTtTQUNKLENBQUM7SUFDWCxDQUFDO0lBRU8sVUFBVTtRQUNoQixPQUFPLElBQUksT0FBTyxDQUFDLHlCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0Y7QUEzUkQsb0JBMlJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0ICogYXMgQ3NwckxpYiBmcm9tICcuL2xpYic7XG5pbXBvcnQgeyBFQ1BhaXIgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIENvaW5GYW1pbHksIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgQmFzZUNvaW4sXG4gIEJpdEdvQmFzZSxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIEtleUluZGljZXMsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgYXMgQmFzZVNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQgYXMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuaW50ZXJmYWNlIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMgZXh0ZW5kcyBCYXNlU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uUHJlYnVpbGQgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCB7XG4gIHR4SGV4OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25GZWUge1xuICBnYXNMaW1pdDogc3RyaW5nO1xuICBnYXNQcmljZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleD86IHN0cmluZztcbiAgaGFsZlNpZ25lZD86IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xuICBmZWVJbmZvOiBUcmFuc2FjdGlvbkZlZTtcbn1cblxuaW50ZXJmYWNlIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMge1xuICByb290UHJpdmF0ZUtleT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRyYW5zYWN0aW9uT3V0cHV0IHtcbiAgYWRkcmVzczogc3RyaW5nO1xuICBhbW91bnQ6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHJhbnNhY3Rpb25PcGVyYXRpb24ge1xuICB0eXBlOiBudW1iZXI7XG4gIGFtb3VudDogc3RyaW5nO1xuICBjb2luOiBzdHJpbmc7XG4gIHZhbGlkYXRvcjogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ3NwciBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdGF0aWNzQ29pbjogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBDc3ByKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG4gIGdldEZhbWlseSgpOiBDb2luRmFtaWx5IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGljc0NvaW4uZmFtaWx5O1xuICB9XG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG4gIGdldEJhc2VGYWN0b3IoKTogc3RyaW5nIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgd2hlbiBhdmFpbGFibGUgb24gdGhlIFNESy5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhZGRyZXNzIGlzIHZhbGlkLCB0aGVuIG1ha2Ugc3VyZSBpdCBtYXRjaGVzIHRoZSByb290IGFkZHJlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB7VmVyaWZ5QWRkcmVzc09wdGlvbnN9IHBhcmFtcyBhZGRyZXNzIGFuZCByb290QWRkcmVzcyB0byB2ZXJpZnlcbiAgICovXG4gIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBrZXljaGFpbnMgfSA9IHBhcmFtcztcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgICB9XG4gICAgaWYgKCFrZXljaGFpbnMgfHwga2V5Y2hhaW5zLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleWNoYWlucycpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJQdWJLZXkgPSBrZXljaGFpbnNbS2V5SW5kaWNlcy5VU0VSXS5wdWI7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3MgPSBuZXcgQ3NwckxpYi5LZXlQYWlyKHsgcHViOiB1c2VyUHViS2V5IH0pLmdldEFkZHJlc3MoKTtcblxuICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gQ3NwckxpYi5VdGlscy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICBpZiAoYWRkcmVzc0RldGFpbHMuYWRkcmVzcy50b0xvd2VyQ2FzZSgpICE9PSByb290QWRkcmVzcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICR7YWRkcmVzc0RldGFpbHMuYWRkcmVzc30gdnMgJHtyb290QWRkcmVzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgQ2FzcGVyIGtleSBwYWlyIC0gQml0R28geHB1YiBmb3JtYXRcbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNlZWQgLSBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICogQHJldHVybnMge09iamVjdH0gb2JqZWN0IHdpdGggZ2VuZXJhdGVkIHhwdWIgYW5kIHhwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgQ3NwckxpYi5LZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBDc3ByTGliLktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcblxuICAgIGlmICgha2V5cy54cHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgeHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnhwdWIsXG4gICAgICBwcnY6IGtleXMueHBydixcbiAgICB9O1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE8oU1RMWC0xMzQ0KTogVmFsaWRhdGUgdXNpbmcgYWNjb3VudC1saWIgd2hlbiBhdmFpbGFibGVcbiAgICAvLyAgcmV0dXJuIGFjY291bnRMaWIuQ3Nwci5VdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBDc3ByTGliLktleVBhaXIoeyBwdWIgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwcml2YXRlIGtleSBmb3IgdGhlIGNvaW5cbiAgICpcbiAgICogQHBhcmFtIHBydiB0aGUgcHJ2IHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMgaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBpc1ZhbGlkUHJ2KHBydjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhTVExYLTEzNDUpOiBWYWxpZGF0ZSB1c2luZyBhY2NvdW50LWxpYiB3aGVuIGF2YWlsYWJsZVxuICAgIC8vICByZXR1cm4gYWNjb3VudExpYi5Dc3ByLlV0aWxzLmlzVmFsaWRQcml2YXRlS2V5KHBydik7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBDc3ByTGliLktleVBhaXIoeyBwcnYgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBDU1BSIGFkZHJlc3NcbiAgICpcbiAgICogQHBhcmFtIGFkZHJlc3MgdGhlIHB1YiB0byBiZSBjaGVja2VkXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGFkZHJlc3MgaXMgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IENzcHJMaWIuVXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcyk7XG4gICAgICByZXR1cm4gYWRkcmVzcyA9PT0gQ3NwckxpYi5VdGlscy5ub3JtYWxpemVBZGRyZXNzKGFkZHJlc3NEZXRhaWxzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtTaWduVHJhbnNhY3Rpb25PcHRpb25zfSBwYXJhbXMgZGF0YSByZXF1aXJlZCB0byByZWJ1aWxkIGFuZCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uUHJlYnVpbGR9IHBhcmFtcy50eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLnBydiB1c2VyIHBydiB1c2VkIHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm5zIEJsdWViaXJkPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHBhcmFtcy50eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCBrZXkgPSBwYXJhbXMucHJ2O1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5IH0pO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IGFueSA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGJ1aWxkIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgdHhIZXg6IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgfTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA+PSAyID8gcmVzcG9uc2UgOiB7IGhhbGZTaWduZWQ6IHJlc3BvbnNlIH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dGVuZCB3YWxsZXRQYXJhbXMgd2l0aCBleHRyYSBwYXJhbXMgcmVxdWlyZWQgZm9yIGdlbmVyYXRpbmcgYSBDYXNwZXIgd2FsbGV0XG4gICAqXG4gICAqIENhc3BlciB3YWxsZXRzIGhhdmUgdGhyZWUgdGhyZWUga2V5cywgdXNlciwgYmFja3VwIGFuZCBiaXRnby5cbiAgICogSW5pdGlhbGx5LCB3ZSBuZWVkIGEgcm9vdCBwcnYgdG8gZ2VuZXJhdGUgdGhlIGFjY291bnQsIHdoaWNoIG11c3QgYmUgZGlzdGluY3QgZnJvbSBhbGwgdGhyZWUga2V5Y2hhaW5zIG9uIHRoZSB3YWxsZXQuXG4gICAqIElmIGEgcm9vdCBwcml2YXRlIGtleSBpcyBub3QgcHJvdmlkZWQsIGEgcmFuZG9tIG9uZSBpcyBnZW5lcmF0ZWQuXG4gICAqIFRoZSByb290IHB1YmxpYyBrZXkgaXMgdGhlIGJhc2lzIGZvciB0aGUgd2FsbGV0IHJvb3QgYWRkcmVzcy5cbiAgICovXG4gIGFzeW5jIHN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldChcbiAgICB3YWxsZXRQYXJhbXM6IFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnNcbiAgKTogUHJvbWlzZTxTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zPiB7XG4gICAgaWYgKHdhbGxldFBhcmFtcy5yb290UHJpdmF0ZUtleSkge1xuICAgICAgaWYgKCF0aGlzLmlzVmFsaWRQcnYod2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5KSB8fCB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkubGVuZ3RoICE9PSA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3RQcml2YXRlS2V5IG5lZWRzIHRvIGJlIGEgaGV4YWRlY2ltYWwgcHJpdmF0ZSBrZXkgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBFQ1BhaXIubWFrZVJhbmRvbSgpO1xuICAgICAgaWYgKCFrZXlQYWlyLnByaXZhdGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5Jyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBrZXlQYWlyLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgIH1cbiAgICByZXR1cm4gd2FsbGV0UGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gbWVzc2FnZSB3aXRoIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogS2V5UGFpciwgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IENzcHJMaWIuS2V5UGFpcih7IHBydjoga2V5LnBydiB9KTtcbiAgICBjb25zdCBtZXNzYWdlSGV4ID0gbWVzc2FnZSBpbnN0YW5jZW9mIEJ1ZmZlciA/IG1lc3NhZ2UudG9TdHJpbmcoJ2hleCcpIDogbWVzc2FnZTtcbiAgICBjb25zdCBzaWduYXR1cmVEYXRhID0gQ3NwckxpYi5VdGlscy5zaWduTWVzc2FnZShrZXlQYWlyLCBtZXNzYWdlSGV4KTtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oc2lnbmF0dXJlRGF0YS5zaWduYXR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW4gYSBDYXNwZXIgdHJhbnNhY3Rpb24gZnJvbSBSYXcgVHhcbiAgICpcbiAgICogQHBhcmFtIHtFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zfSBwYXJhbXMgZ2l2ZW4gZXhwbGFpbiB0cmFuc2FjdGlvbiBwYXJhbXNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy50eEhleCByYXcgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtTdHJpbmd9IHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4IHJhdyBoYWxmIHNpZ25lZCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uRmVlfSBmZWUgZmVlIGluZm9ybWF0aW9uXG4gICAqIEByZXR1cm5zIEJsdWViaXJkPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+XG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgdHhIZXggPSBwYXJhbXMudHhIZXggfHwgKHBhcmFtcy5oYWxmU2lnbmVkICYmIHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4KTtcbiAgICBpZiAoIXR4SGV4IHx8ICFwYXJhbXMuZmVlSW5mbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICAgIH1cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXIoKS5mcm9tKHR4SGV4KTtcblxuICAgIGNvbnN0IHR4OiBhbnkgPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0Vycm9yIHdoaWxlIHRyeWluZyB0byBidWlsZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IEJ1ZmZlci5mcm9tKHR4LmNhc3BlclR4Lmhhc2gpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBhbW91bnQgPSBDc3ByTGliLlV0aWxzLmdldFRyYW5zZmVyQW1vdW50KHR4LmNhc3BlclR4LnNlc3Npb24pO1xuICAgIGxldCB0cmFuc2ZlcklkO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCBvcGVyYXRpb25zOiBUcmFuc2FjdGlvbk9wZXJhdGlvbltdID0gW107XG5cbiAgICBzd2l0Y2ggKHR4LnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6IHtcbiAgICAgICAgdHJhbnNmZXJJZCA9IENzcHJMaWIuVXRpbHMuZ2V0VHJhbnNmZXJJZCh0eC5jYXNwZXJUeC5zZXNzaW9uKTtcbiAgICAgICAgY29uc3QgdG9BZGRyZXNzID0gQ3NwckxpYi5VdGlscy5nZXRUcmFuc2ZlckRlc3RpbmF0aW9uQWRkcmVzcyh0eC5fZGVwbG95LnNlc3Npb24pO1xuICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgIGFkZHJlc3M6IHRvQWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nTG9jazoge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBDc3ByTGliLlV0aWxzLmdldFZhbGlkYXRvckFkZHJlc3ModHguX2RlcGxveS5zZXNzaW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2ssXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkYXRvcixcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jazoge1xuICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBDc3ByTGliLlV0aWxzLmdldFZhbGlkYXRvckFkZHJlc3ModHguX2RlcGxveS5zZXNzaW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayxcbiAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICAgIHZhbGlkYXRvcjogdmFsaWRhdG9yLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gb3V0cHV0c1xuICAgICAgLnJlZHVjZSgoYWN1bXVsYXRvciwgb3V0cHV0KSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IG5ldyBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCk7XG4gICAgICAgIHJldHVybiBhY3VtdWxhdG9yLnBsdXMoY3VycmVudFZhbHVlKTtcbiAgICAgIH0sIG5ldyBCaWdOdW1iZXIoMCkpXG4gICAgICAudG9GaXhlZCgwKTtcblxuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICdpZCcsXG4gICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgJ291dHB1dHMnLFxuICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgJ3RyYW5zZmVySWQnLFxuICAgICAgJ2ZlZScsXG4gICAgICAnb3BlcmF0aW9ucycsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSwgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCB1c2UgY2hhbmdlIG91dHB1dHNcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLCAvLyBhY2NvdW50IGJhc2UgZG9lcyBub3QgbWFrZSBjaGFuZ2VcbiAgICAgIHRyYW5zZmVySWQsXG4gICAgICBmZWU6IHBhcmFtcy5mZWVJbmZvLFxuICAgICAgb3BlcmF0aW9ucyxcbiAgICB9IGFzIGFueTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlcigpOiBDc3ByTGliLlRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgQ3NwckxpYi5UcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,OAAO,KAAK,OAAO,MAAM,OAAO,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
15
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
16
|
+
};
|
|
17
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
18
|
+
if (mod && mod.__esModule) return mod;
|
|
19
|
+
var result = {};
|
|
20
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
21
|
+
__setModuleDefault(result, mod);
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.CsprLib = void 0;
|
|
26
|
+
__exportStar(require("./cspr"), exports);
|
|
27
|
+
__exportStar(require("./tcspr"), exports);
|
|
28
|
+
exports.CsprLib = __importStar(require("./lib"));
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlDQUF1QjtBQUN2QiwwQ0FBd0I7QUFDeEIsaURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9jc3ByJztcbmV4cG9ydCAqIGZyb20gJy4vdGNzcHInO1xuZXhwb3J0ICogYXMgQ3NwckxpYiBmcm9tICcuL2xpYic7XG4iXX0=
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const SECP256K1_PREFIX = "02";
|
|
2
|
+
export declare const ED25519_PREFIX = "01";
|
|
3
|
+
export declare const DEFAULT_CHAIN_NAMES: {
|
|
4
|
+
testnet: string;
|
|
5
|
+
mainnet: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const TRANSACTION_EXPIRATION = 86400000;
|
|
8
|
+
export declare const DELEGATE_VALIDATOR_ACCOUNT = "0100cd28cec3dd6d29b959ae7b36a8201c92fe6af75fa44d5fa84b7d2e417ca940";
|
|
9
|
+
export declare const MODULE_BYTES_ACTION = "action";
|
|
10
|
+
export declare const WALLET_INITIALIZATION_CONTRACT_ACTION = "set_all";
|
|
11
|
+
export declare const DELEGATE_CONTRACT_ACTION = "delegate";
|
|
12
|
+
export declare const UNDELEGATE_CONTRACT_ACTION = "undelegate";
|
|
13
|
+
export declare const OWNER_PREFIX = "owner_";
|
|
14
|
+
export declare const TRANSFER_TO_ADDRESS = "to_address";
|
|
15
|
+
export declare const DELEGATE_FROM_ADDRESS = "from_address";
|
|
16
|
+
export declare const TRANSACTION_TYPE = "deploy_type";
|
|
17
|
+
export declare const DELEGATE_VALIDATOR = "validator";
|
|
18
|
+
export declare const STAKING_TYPE = "staking_type";
|
|
19
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,cAAc,OAAO,CAAC;AACnC,eAAO,MAAM,mBAAmB;;;CAG/B,CAAC;AACF,eAAO,MAAM,sBAAsB,WAAW,CAAC;AAC/C,eAAO,MAAM,0BAA0B,uEAAuE,CAAC;AAG/G,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAI5C,eAAO,MAAM,qCAAqC,YAAY,CAAC;AAC/D,eAAO,MAAM,wBAAwB,aAAa,CAAC;AACnD,eAAO,MAAM,0BAA0B,eAAe,CAAC;AAIvD,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,mBAAmB,eAAe,CAAC;AAChD,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,gBAAgB,gBAAgB,CAAC;AAC9C,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,YAAY,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.STAKING_TYPE = exports.DELEGATE_VALIDATOR = exports.TRANSACTION_TYPE = exports.DELEGATE_FROM_ADDRESS = exports.TRANSFER_TO_ADDRESS = exports.OWNER_PREFIX = exports.UNDELEGATE_CONTRACT_ACTION = exports.DELEGATE_CONTRACT_ACTION = exports.WALLET_INITIALIZATION_CONTRACT_ACTION = exports.MODULE_BYTES_ACTION = exports.DELEGATE_VALIDATOR_ACCOUNT = exports.TRANSACTION_EXPIRATION = exports.DEFAULT_CHAIN_NAMES = exports.ED25519_PREFIX = exports.SECP256K1_PREFIX = void 0;
|
|
4
|
+
exports.SECP256K1_PREFIX = '02';
|
|
5
|
+
exports.ED25519_PREFIX = '01';
|
|
6
|
+
exports.DEFAULT_CHAIN_NAMES = {
|
|
7
|
+
testnet: 'integration-test',
|
|
8
|
+
mainnet: 'casper',
|
|
9
|
+
};
|
|
10
|
+
exports.TRANSACTION_EXPIRATION = 86400000; // 1 day
|
|
11
|
+
exports.DELEGATE_VALIDATOR_ACCOUNT = '0100cd28cec3dd6d29b959ae7b36a8201c92fe6af75fa44d5fa84b7d2e417ca940';
|
|
12
|
+
// #region contract arguments
|
|
13
|
+
exports.MODULE_BYTES_ACTION = 'action';
|
|
14
|
+
// #endregion
|
|
15
|
+
// #region contract actions
|
|
16
|
+
exports.WALLET_INITIALIZATION_CONTRACT_ACTION = 'set_all';
|
|
17
|
+
exports.DELEGATE_CONTRACT_ACTION = 'delegate';
|
|
18
|
+
exports.UNDELEGATE_CONTRACT_ACTION = 'undelegate';
|
|
19
|
+
// #endregion
|
|
20
|
+
// #region extra deploy arguments
|
|
21
|
+
exports.OWNER_PREFIX = 'owner_';
|
|
22
|
+
exports.TRANSFER_TO_ADDRESS = 'to_address';
|
|
23
|
+
exports.DELEGATE_FROM_ADDRESS = 'from_address';
|
|
24
|
+
exports.TRANSACTION_TYPE = 'deploy_type';
|
|
25
|
+
exports.DELEGATE_VALIDATOR = 'validator';
|
|
26
|
+
exports.STAKING_TYPE = 'staking_type';
|
|
27
|
+
// #endregion
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQWEsUUFBQSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDeEIsUUFBQSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQ3RCLFFBQUEsbUJBQW1CLEdBQUc7SUFDakMsT0FBTyxFQUFFLGtCQUFrQjtJQUMzQixPQUFPLEVBQUUsUUFBUTtDQUNsQixDQUFDO0FBQ1csUUFBQSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsQ0FBQyxRQUFRO0FBQzNDLFFBQUEsMEJBQTBCLEdBQUcsb0VBQW9FLENBQUM7QUFFL0csNkJBQTZCO0FBQ2hCLFFBQUEsbUJBQW1CLEdBQUcsUUFBUSxDQUFDO0FBQzVDLGFBQWE7QUFFYiwyQkFBMkI7QUFDZCxRQUFBLHFDQUFxQyxHQUFHLFNBQVMsQ0FBQztBQUNsRCxRQUFBLHdCQUF3QixHQUFHLFVBQVUsQ0FBQztBQUN0QyxRQUFBLDBCQUEwQixHQUFHLFlBQVksQ0FBQztBQUN2RCxhQUFhO0FBRWIsaUNBQWlDO0FBQ3BCLFFBQUEsWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUN4QixRQUFBLG1CQUFtQixHQUFHLFlBQVksQ0FBQztBQUNuQyxRQUFBLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUN2QyxRQUFBLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUNqQyxRQUFBLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztBQUNqQyxRQUFBLFlBQVksR0FBRyxjQUFjLENBQUM7QUFDM0MsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTRUNQMjU2SzFfUFJFRklYID0gJzAyJztcbmV4cG9ydCBjb25zdCBFRDI1NTE5X1BSRUZJWCA9ICcwMSc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9DSEFJTl9OQU1FUyA9IHtcbiAgdGVzdG5ldDogJ2ludGVncmF0aW9uLXRlc3QnLFxuICBtYWlubmV0OiAnY2FzcGVyJyxcbn07XG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05fRVhQSVJBVElPTiA9IDg2NDAwMDAwOyAvLyAxIGRheVxuZXhwb3J0IGNvbnN0IERFTEVHQVRFX1ZBTElEQVRPUl9BQ0NPVU5UID0gJzAxMDBjZDI4Y2VjM2RkNmQyOWI5NTlhZTdiMzZhODIwMWM5MmZlNmFmNzVmYTQ0ZDVmYTg0YjdkMmU0MTdjYTk0MCc7XG5cbi8vICNyZWdpb24gY29udHJhY3QgYXJndW1lbnRzXG5leHBvcnQgY29uc3QgTU9EVUxFX0JZVEVTX0FDVElPTiA9ICdhY3Rpb24nO1xuLy8gI2VuZHJlZ2lvblxuXG4vLyAjcmVnaW9uIGNvbnRyYWN0IGFjdGlvbnNcbmV4cG9ydCBjb25zdCBXQUxMRVRfSU5JVElBTElaQVRJT05fQ09OVFJBQ1RfQUNUSU9OID0gJ3NldF9hbGwnO1xuZXhwb3J0IGNvbnN0IERFTEVHQVRFX0NPTlRSQUNUX0FDVElPTiA9ICdkZWxlZ2F0ZSc7XG5leHBvcnQgY29uc3QgVU5ERUxFR0FURV9DT05UUkFDVF9BQ1RJT04gPSAndW5kZWxlZ2F0ZSc7XG4vLyAjZW5kcmVnaW9uXG5cbi8vICNyZWdpb24gZXh0cmEgZGVwbG95IGFyZ3VtZW50c1xuZXhwb3J0IGNvbnN0IE9XTkVSX1BSRUZJWCA9ICdvd25lcl8nO1xuZXhwb3J0IGNvbnN0IFRSQU5TRkVSX1RPX0FERFJFU1MgPSAndG9fYWRkcmVzcyc7XG5leHBvcnQgY29uc3QgREVMRUdBVEVfRlJPTV9BRERSRVNTID0gJ2Zyb21fYWRkcmVzcyc7XG5leHBvcnQgY29uc3QgVFJBTlNBQ1RJT05fVFlQRSA9ICdkZXBsb3lfdHlwZSc7XG5leHBvcnQgY29uc3QgREVMRUdBVEVfVkFMSURBVE9SID0gJ3ZhbGlkYXRvcic7XG5leHBvcnQgY29uc3QgU1RBS0lOR19UWVBFID0gJ3N0YWtpbmdfdHlwZSc7XG4vLyAjZW5kcmVnaW9uXG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo/statics';
|
|
2
|
+
import { BaseKey } from '@bitgo/sdk-core';
|
|
3
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
4
|
+
import { Transaction } from './transaction';
|
|
5
|
+
export declare class DelegateBuilder extends TransactionBuilder {
|
|
6
|
+
private _validator;
|
|
7
|
+
private readonly _action;
|
|
8
|
+
private _amount;
|
|
9
|
+
private readonly _contract;
|
|
10
|
+
/**
|
|
11
|
+
* Public constructor.
|
|
12
|
+
*
|
|
13
|
+
* @param {CoinConfig} _coinConfig Coin configuration object
|
|
14
|
+
*/
|
|
15
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
16
|
+
/** @inheritdoc */
|
|
17
|
+
protected buildImplementation(): Promise<Transaction>;
|
|
18
|
+
/** @inheritdoc */
|
|
19
|
+
initBuilder(tx: Transaction): void;
|
|
20
|
+
/** @inheritdoc */
|
|
21
|
+
protected signImplementation(key: BaseKey): Transaction;
|
|
22
|
+
/**
|
|
23
|
+
* Build args needed to create a session, then we can send this session with the contract
|
|
24
|
+
*
|
|
25
|
+
* @returns {DelegateUndelegateContractArgs} contracts args to create a session
|
|
26
|
+
*/
|
|
27
|
+
private buildDelegateParameters;
|
|
28
|
+
/**
|
|
29
|
+
* Set the destination address where the funds will be sent,
|
|
30
|
+
*
|
|
31
|
+
* @param {string} address the 68 bits address to transfer funds to
|
|
32
|
+
* @returns {DelegateBuilder} the builder with the new parameter set
|
|
33
|
+
*/
|
|
34
|
+
validator(address: string): this;
|
|
35
|
+
/**
|
|
36
|
+
* Set the amount to be transferred
|
|
37
|
+
*
|
|
38
|
+
* @param {string} amount amount to transfer
|
|
39
|
+
* @returns {DelegateBuilder} the builder with the new parameter set
|
|
40
|
+
*/
|
|
41
|
+
amount(amount: string): this;
|
|
42
|
+
/**
|
|
43
|
+
* Validate mandatory fields in the class
|
|
44
|
+
*
|
|
45
|
+
* @throws {Error} In case of missing or invalid fields
|
|
46
|
+
*/
|
|
47
|
+
validateMandatoryFields(): void;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=delegateBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delegateBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/delegateBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EACL,OAAO,EAMR,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,kBAAkB,EAAa,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAkB5C,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IAEvC;;;;OAIG;gBACS,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAM7C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAmB3D,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAOlC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAOvD;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;;;;OAKG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAQhC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY5B;;;;OAIG;IACH,uBAAuB,IAAI,IAAI;CAUhC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DelegateBuilder = void 0;
|
|
4
|
+
const casper_js_sdk_1 = require("casper-js-sdk");
|
|
5
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
6
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
class DelegateBuilder extends transactionBuilder_1.TransactionBuilder {
|
|
10
|
+
/**
|
|
11
|
+
* Public constructor.
|
|
12
|
+
*
|
|
13
|
+
* @param {CoinConfig} _coinConfig Coin configuration object
|
|
14
|
+
*/
|
|
15
|
+
constructor(_coinConfig) {
|
|
16
|
+
super(_coinConfig);
|
|
17
|
+
this._action = constants_1.DELEGATE_CONTRACT_ACTION;
|
|
18
|
+
this._contract = Uint8Array.from(Buffer.from(utils_1.casperContractHexCode, 'hex'));
|
|
19
|
+
}
|
|
20
|
+
/** @inheritdoc */
|
|
21
|
+
async buildImplementation() {
|
|
22
|
+
this._validator = this._validator || constants_1.DELEGATE_VALIDATOR_ACCOUNT;
|
|
23
|
+
const args = this.buildDelegateParameters();
|
|
24
|
+
const extraArguments = new Map();
|
|
25
|
+
extraArguments.set(constants_1.TRANSACTION_TYPE, casper_js_sdk_1.CLValueBuilder.string(sdk_core_1.TransactionType[sdk_core_1.TransactionType.StakingLock]));
|
|
26
|
+
extraArguments.set(constants_1.STAKING_TYPE, casper_js_sdk_1.CLValueBuilder.string(sdk_core_1.StakingOperationTypes[sdk_core_1.StakingOperationTypes.LOCK]));
|
|
27
|
+
extraArguments.set(constants_1.DELEGATE_FROM_ADDRESS, casper_js_sdk_1.CLValueBuilder.string(this._source.address));
|
|
28
|
+
extraArguments.set(constants_1.DELEGATE_VALIDATOR, casper_js_sdk_1.CLValueBuilder.string(this._validator));
|
|
29
|
+
this._session = {
|
|
30
|
+
moduleBytes: this._contract,
|
|
31
|
+
args: casper_js_sdk_1.RuntimeArgs.fromMap(args),
|
|
32
|
+
extraArguments: extraArguments,
|
|
33
|
+
};
|
|
34
|
+
this.transaction.setTransactionType(sdk_core_1.TransactionType.StakingLock);
|
|
35
|
+
return await super.buildImplementation();
|
|
36
|
+
}
|
|
37
|
+
/** @inheritdoc */
|
|
38
|
+
initBuilder(tx) {
|
|
39
|
+
super.initBuilder(tx);
|
|
40
|
+
this.transaction.setTransactionType(sdk_core_1.TransactionType.StakingLock);
|
|
41
|
+
this.validator(utils_1.getValidatorAddress(tx.casperTx.session));
|
|
42
|
+
this.amount(utils_1.getTransferAmount(tx.casperTx.session));
|
|
43
|
+
}
|
|
44
|
+
/** @inheritdoc */
|
|
45
|
+
signImplementation(key) {
|
|
46
|
+
if (this._multiSignerKeyPairs.length >= transactionBuilder_1.DEFAULT_M) {
|
|
47
|
+
throw new sdk_core_1.SigningError('A maximum of ' + transactionBuilder_1.DEFAULT_M + ' can sign the transaction.');
|
|
48
|
+
}
|
|
49
|
+
return super.signImplementation(key);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Build args needed to create a session, then we can send this session with the contract
|
|
53
|
+
*
|
|
54
|
+
* @returns {DelegateUndelegateContractArgs} contracts args to create a session
|
|
55
|
+
*/
|
|
56
|
+
buildDelegateParameters() {
|
|
57
|
+
const delegator = casper_js_sdk_1.CLPublicKey.fromHex(this._source.address);
|
|
58
|
+
const validator = casper_js_sdk_1.CLPublicKey.fromHex(this._validator);
|
|
59
|
+
return {
|
|
60
|
+
action: casper_js_sdk_1.CLValueBuilder.string(this._action),
|
|
61
|
+
delegator: casper_js_sdk_1.CLValueBuilder.publicKey(delegator.value(), delegator.tag),
|
|
62
|
+
validator: casper_js_sdk_1.CLValueBuilder.publicKey(validator.value(), validator.tag),
|
|
63
|
+
amount: casper_js_sdk_1.CLValueBuilder.u512(this._amount),
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// region Transfer fields
|
|
67
|
+
/**
|
|
68
|
+
* Set the destination address where the funds will be sent,
|
|
69
|
+
*
|
|
70
|
+
* @param {string} address the 68 bits address to transfer funds to
|
|
71
|
+
* @returns {DelegateBuilder} the builder with the new parameter set
|
|
72
|
+
*/
|
|
73
|
+
validator(address) {
|
|
74
|
+
if (!utils_1.isValidAddress(address)) {
|
|
75
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid address');
|
|
76
|
+
}
|
|
77
|
+
this._validator = address;
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set the amount to be transferred
|
|
82
|
+
*
|
|
83
|
+
* @param {string} amount amount to transfer
|
|
84
|
+
* @returns {DelegateBuilder} the builder with the new parameter set
|
|
85
|
+
*/
|
|
86
|
+
amount(amount) {
|
|
87
|
+
if (!utils_1.isValidDelegateAmount(amount)) {
|
|
88
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid amount');
|
|
89
|
+
}
|
|
90
|
+
this._amount = amount;
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
// endregion
|
|
94
|
+
// region Validators
|
|
95
|
+
/**
|
|
96
|
+
* Validate mandatory fields in the class
|
|
97
|
+
*
|
|
98
|
+
* @throws {Error} In case of missing or invalid fields
|
|
99
|
+
*/
|
|
100
|
+
validateMandatoryFields() {
|
|
101
|
+
if (!this._amount) {
|
|
102
|
+
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing amount');
|
|
103
|
+
}
|
|
104
|
+
if (!utils_1.isValidDelegateAmount(this._amount)) {
|
|
105
|
+
throw new sdk_core_1.InvalidParameterValueError('Invalid amount');
|
|
106
|
+
}
|
|
107
|
+
super.validateMandatoryFields();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.DelegateBuilder = DelegateBuilder;
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZWdhdGVCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZWxlZ2F0ZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQStGO0FBRS9GLDhDQU95QjtBQUN6Qiw2REFBcUU7QUFFckUsMkNBT3FCO0FBQ3JCLG1DQU1pQjtBQUdqQixNQUFhLGVBQWdCLFNBQVEsdUNBQWtCO0lBTXJEOzs7O09BSUc7SUFDSCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLG9DQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELGtCQUFrQjtJQUNSLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLHNDQUEwQixDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO1FBRWxELGNBQWMsQ0FBQyxHQUFHLENBQUMsNEJBQWdCLEVBQUUsOEJBQWMsQ0FBQyxNQUFNLENBQUMsMEJBQWUsQ0FBQywwQkFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRyxjQUFjLENBQUMsR0FBRyxDQUFDLHdCQUFZLEVBQUUsOEJBQWMsQ0FBQyxNQUFNLENBQUMsZ0NBQXFCLENBQUMsZ0NBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNHLGNBQWMsQ0FBQyxHQUFHLENBQUMsaUNBQXFCLEVBQUUsOEJBQWMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9B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T0FJRztJQUNILHVCQUF1QjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQyw2QkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsTUFBTSxJQUFJLHFDQUEwQixDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDeEQ7UUFDRCxLQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0NBRUY7QUF0SEQsMENBc0hDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IENMVmFsdWUsIENMUHVibGljS2V5IGFzIFB1YmxpY0tleSwgUnVudGltZUFyZ3MsIENMVmFsdWVCdWlsZGVyIH0gZnJvbSAnY2FzcGVyLWpzLXNkayc7XG5cbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxuICBTdGFraW5nT3BlcmF0aW9uVHlwZXMsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIsIERFRkFVTFRfTSB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBUUkFOU0FDVElPTl9UWVBFLFxuICBERUxFR0FURV9WQUxJREFUT1IsXG4gIERFTEVHQVRFX0ZST01fQUREUkVTUyxcbiAgU1RBS0lOR19UWVBFLFxuICBERUxFR0FURV9DT05UUkFDVF9BQ1RJT04sXG4gIERFTEVHQVRFX1ZBTElEQVRPUl9BQ0NPVU5ULFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICBpc1ZhbGlkRGVsZWdhdGVBbW91bnQsXG4gIGlzVmFsaWRBZGRyZXNzLFxuICBnZXRUcmFuc2ZlckFtb3VudCxcbiAgZ2V0VmFsaWRhdG9yQWRkcmVzcyxcbiAgY2FzcGVyQ29udHJhY3RIZXhDb2RlLFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlbGVnYXRlVW5kZWxlZ2F0ZUNvbnRyYWN0QXJncyB9IGZyb20gJy4vaWZhY2VzJztcblxuZXhwb3J0IGNsYXNzIERlbGVnYXRlQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgX3ZhbGlkYXRvcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hY3Rpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfYW1vdW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbnRyYWN0OiBVaW50OEFycmF5O1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29pbkNvbmZpZ30gX2NvaW5Db25maWcgQ29pbiBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMuX2FjdGlvbiA9IERFTEVHQVRFX0NPTlRSQUNUX0FDVElPTjtcbiAgICB0aGlzLl9jb250cmFjdCA9IFVpbnQ4QXJyYXkuZnJvbShCdWZmZXIuZnJvbShjYXNwZXJDb250cmFjdEhleENvZGUsICdoZXgnKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxUcmFuc2FjdGlvbj4ge1xuICAgIHRoaXMuX3ZhbGlkYXRvciA9IHRoaXMuX3ZhbGlkYXRvciB8fCBERUxFR0FURV9WQUxJREFUT1JfQUNDT1VOVDtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5idWlsZERlbGVnYXRlUGFyYW1ldGVycygpO1xuICAgIGNvbnN0IGV4dHJhQXJndW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIENMVmFsdWU+KCk7XG5cbiAgICBleHRyYUFyZ3VtZW50cy5zZXQoVFJBTlNBQ1RJT05fVFlQRSwgQ0xWYWx1ZUJ1aWxkZXIuc3RyaW5nKFRyYW5zYWN0aW9uVHlwZVtUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0xvY2tdKSk7XG4gICAgZXh0cmFBcmd1bWVudHMuc2V0KFNUQUtJTkdfVFlQRSwgQ0xWYWx1ZUJ1aWxkZXIuc3RyaW5nKFN0YWtpbmdPcGVyYXRpb25UeXBlc1tTdGFraW5nT3BlcmF0aW9uVHlwZXMuTE9DS10pKTtcbiAgICBleHRyYUFyZ3VtZW50cy5zZXQoREVMRUdBVEVfRlJPTV9BRERSRVNTLCBDTFZhbHVlQnVpbGRlci5zdHJpbmcodGhpcy5fc291cmNlLmFkZHJlc3MpKTtcbiAgICBleHRyYUFyZ3VtZW50cy5zZXQoREVMRUdBVEVfVkFMSURBVE9SLCBDTFZhbHVlQnVpbGRlci5zdHJpbmcodGhpcy5fdmFsaWRhdG9yKSk7XG5cbiAgICB0aGlzLl9zZXNzaW9uID0ge1xuICAgICAgbW9kdWxlQnl0ZXM6IHRoaXMuX2NvbnRyYWN0LFxuICAgICAgYXJnczogUnVudGltZUFyZ3MuZnJvbU1hcChhcmdzKSxcbiAgICAgIGV4dHJhQXJndW1lbnRzOiBleHRyYUFyZ3VtZW50cyxcbiAgICB9O1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nTG9jayk7XG4gICAgcmV0dXJuIGF3YWl0IHN1cGVyLmJ1aWxkSW1wbGVtZW50YXRpb24oKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBzdXBlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdMb2NrKTtcbiAgICB0aGlzLnZhbGlkYXRvcihnZXRWYWxpZGF0b3JBZGRyZXNzKHR4LmNhc3BlclR4LnNlc3Npb24pKTtcbiAgICB0aGlzLmFtb3VudChnZXRUcmFuc2ZlckFtb3VudCh0eC5jYXNwZXJUeC5zZXNzaW9uKSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIHNpZ25JbXBsZW1lbnRhdGlvbihrZXk6IEJhc2VLZXkpOiBUcmFuc2FjdGlvbiB7XG4gICAgaWYgKHRoaXMuX211bHRpU2lnbmVyS2V5UGFpcnMubGVuZ3RoID49IERFRkFVTFRfTSkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignQSBtYXhpbXVtIG9mICcgKyBERUZBVUxUX00gKyAnIGNhbiBzaWduIHRoZSB0cmFuc2FjdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNpZ25JbXBsZW1lbnRhdGlvbihrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFyZ3MgbmVlZGVkIHRvIGNyZWF0ZSBhIHNlc3Npb24sIHRoZW4gd2UgY2FuIHNlbmQgdGhpcyBzZXNzaW9uIHdpdGggdGhlIGNvbnRyYWN0XG4gICAqXG4gICAqIEByZXR1cm5zIHtEZWxlZ2F0ZVVuZGVsZWdhdGVDb250cmFjdEFyZ3N9IGNvbnRyYWN0cyBhcmdzIHRvIGNyZWF0ZSBhIHNlc3Npb25cbiAgICovXG4gIHByaXZhdGUgYnVpbGREZWxlZ2F0ZVBhcmFtZXRlcnMoKTogRGVsZWdhdGVVbmRlbGVnYXRlQ29udHJhY3RBcmdzIHtcbiAgICBjb25zdCBkZWxlZ2F0b3IgPSBQdWJsaWNLZXkuZnJvbUhleCh0aGlzLl9zb3VyY2UuYWRkcmVzcyk7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gUHVibGljS2V5LmZyb21IZXgodGhpcy5fdmFsaWRhdG9yKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IENMVmFsdWVCdWlsZGVyLnN0cmluZyh0aGlzLl9hY3Rpb24pLFxuICAgICAgZGVsZWdhdG9yOiBDTFZhbHVlQnVpbGRlci5wdWJsaWNLZXkoZGVsZWdhdG9yLnZhbHVlKCksIGRlbGVnYXRvci50YWcpLFxuICAgICAgdmFsaWRhdG9yOiBDTFZhbHVlQnVpbGRlci5wdWJsaWNLZXkodmFsaWRhdG9yLnZhbHVlKCksIHZhbGlkYXRvci50YWcpLFxuICAgICAgYW1vdW50OiBDTFZhbHVlQnVpbGRlci51NTEyKHRoaXMuX2Ftb3VudCksXG4gICAgfTtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBUcmFuc2ZlciBmaWVsZHNcbiAgLyoqXG4gICAqIFNldCB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyB3aGVyZSB0aGUgZnVuZHMgd2lsbCBiZSBzZW50LFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyB0aGUgNjggYml0cyBhZGRyZXNzIHRvIHRyYW5zZmVyIGZ1bmRzIHRvXG4gICAqIEByZXR1cm5zIHtEZWxlZ2F0ZUJ1aWxkZXJ9IHRoZSBidWlsZGVyIHdpdGggdGhlIG5ldyBwYXJhbWV0ZXIgc2V0XG4gICAqL1xuICB2YWxpZGF0b3IoYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IGFtb3VudCB0byB0cmFuc2ZlclxuICAgKiBAcmV0dXJucyB7RGVsZWdhdGVCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgYW1vdW50KGFtb3VudDogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkRGVsZWdhdGVBbW91bnQoYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFtb3VudCcpO1xuICAgIH1cbiAgICB0aGlzLl9hbW91bnQgPSBhbW91bnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbmRyZWdpb25cblxuICAvLyByZWdpb24gVmFsaWRhdG9yc1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBtYW5kYXRvcnkgZmllbGRzIGluIHRoZSBjbGFzc1xuICAgKlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSW4gY2FzZSBvZiBtaXNzaW5nIG9yIGludmFsaWQgZmllbGRzXG4gICAqL1xuICB2YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2Ftb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbjogbWlzc2luZyBhbW91bnQnKTtcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkRGVsZWdhdGVBbW91bnQodGhpcy5fYW1vdW50KSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGFtb3VudCcpO1xuICAgIH1cbiAgICBzdXBlci52YWxpZGF0ZU1hbmRhdG9yeUZpZWxkcygpO1xuICB9XG4gIC8vIGVuZHJlZ2lvblxufVxuIl19
|