@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.
Files changed (51) hide show
  1. package/.eslintignore +4 -0
  2. package/.mocharc.yml +8 -0
  3. package/CHANGELOG.md +8 -0
  4. package/LICENSE +191 -0
  5. package/README.md +39 -0
  6. package/dist/src/cspr.d.ts +101 -0
  7. package/dist/src/cspr.d.ts.map +1 -0
  8. package/dist/src/cspr.js +293 -0
  9. package/dist/src/index.d.ts +4 -0
  10. package/dist/src/index.d.ts.map +1 -0
  11. package/dist/src/index.js +29 -0
  12. package/dist/src/lib/constants.d.ts +19 -0
  13. package/dist/src/lib/constants.d.ts.map +1 -0
  14. package/dist/src/lib/constants.js +28 -0
  15. package/dist/src/lib/delegateBuilder.d.ts +49 -0
  16. package/dist/src/lib/delegateBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/delegateBuilder.js +111 -0
  18. package/dist/src/lib/ifaces.d.ts +69 -0
  19. package/dist/src/lib/ifaces.d.ts.map +1 -0
  20. package/dist/src/lib/ifaces.js +3 -0
  21. package/dist/src/lib/index.d.ts +6 -0
  22. package/dist/src/lib/index.d.ts.map +1 -0
  23. package/dist/src/lib/index.js +31 -0
  24. package/dist/src/lib/keyPair.d.ts +18 -0
  25. package/dist/src/lib/keyPair.d.ts.map +1 -0
  26. package/dist/src/lib/keyPair.js +75 -0
  27. package/dist/src/lib/transaction.d.ts +55 -0
  28. package/dist/src/lib/transaction.d.ts.map +1 -0
  29. package/dist/src/lib/transaction.js +227 -0
  30. package/dist/src/lib/transactionBuilder.d.ts +124 -0
  31. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  32. package/dist/src/lib/transactionBuilder.js +312 -0
  33. package/dist/src/lib/transactionBuilderFactory.d.ts +46 -0
  34. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  35. package/dist/src/lib/transactionBuilderFactory.js +98 -0
  36. package/dist/src/lib/transferBuilder.d.ts +39 -0
  37. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  38. package/dist/src/lib/transferBuilder.js +106 -0
  39. package/dist/src/lib/undelegateBuilder.d.ts +49 -0
  40. package/dist/src/lib/undelegateBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/undelegateBuilder.js +111 -0
  42. package/dist/src/lib/utils.d.ts +188 -0
  43. package/dist/src/lib/utils.d.ts.map +1 -0
  44. package/dist/src/lib/utils.js +477 -0
  45. package/dist/src/lib/walletInitializationBuilder.d.ts +27 -0
  46. package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  47. package/dist/src/lib/walletInitializationBuilder.js +95 -0
  48. package/dist/src/tcspr.d.ts +11 -0
  49. package/dist/src/tcspr.d.ts.map +1 -0
  50. package/dist/src/tcspr.js +24 -0
  51. package/package.json +62 -0
@@ -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,4 @@
1
+ export * from './cspr';
2
+ export * from './tcspr';
3
+ export * as CsprLib from './lib';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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