@bitgo-beta/sdk-coin-xrp 1.3.3-alpha.23 → 1.3.3-alpha.231

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 (60) hide show
  1. package/CHANGELOG.md +451 -0
  2. package/dist/src/index.d.ts +4 -2
  3. package/dist/src/index.d.ts.map +1 -1
  4. package/dist/src/index.js +10 -4
  5. package/dist/src/lib/accountSetBuilder.d.ts +18 -0
  6. package/dist/src/lib/accountSetBuilder.d.ts.map +1 -0
  7. package/dist/src/lib/accountSetBuilder.js +63 -0
  8. package/dist/src/lib/constants.d.ts +8 -0
  9. package/dist/src/lib/constants.d.ts.map +1 -0
  10. package/dist/src/lib/constants.js +30 -0
  11. package/dist/src/lib/iface.d.ts +108 -0
  12. package/dist/src/lib/iface.d.ts.map +1 -0
  13. package/dist/src/lib/iface.js +11 -0
  14. package/dist/src/lib/index.d.ts +14 -0
  15. package/dist/src/lib/index.d.ts.map +1 -0
  16. package/dist/src/lib/index.js +43 -0
  17. package/dist/src/lib/keyPair.d.ts +35 -0
  18. package/dist/src/lib/keyPair.d.ts.map +1 -0
  19. package/dist/src/lib/keyPair.js +109 -0
  20. package/dist/src/lib/tokenTransferBuilder.d.ts +29 -0
  21. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  22. package/dist/src/lib/tokenTransferBuilder.js +91 -0
  23. package/dist/src/lib/transaction.d.ts +62 -0
  24. package/dist/src/lib/transaction.d.ts.map +1 -0
  25. package/dist/src/lib/transaction.js +371 -0
  26. package/dist/src/lib/transactionBuilder.d.ts +72 -0
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  28. package/dist/src/lib/transactionBuilder.js +253 -0
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +39 -0
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  31. package/dist/src/lib/transactionBuilderFactory.js +97 -0
  32. package/dist/src/lib/transferBuilder.d.ts +28 -0
  33. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  34. package/dist/src/lib/transferBuilder.js +82 -0
  35. package/dist/src/lib/trustsetBuilder.d.ts +21 -0
  36. package/dist/src/lib/trustsetBuilder.d.ts.map +1 -0
  37. package/dist/src/lib/trustsetBuilder.js +72 -0
  38. package/dist/src/lib/utils.d.ts +61 -0
  39. package/dist/src/lib/utils.d.ts.map +1 -0
  40. package/dist/src/lib/utils.js +250 -0
  41. package/dist/src/lib/walletInitializationBuilder.d.ts +19 -0
  42. package/dist/src/lib/walletInitializationBuilder.d.ts.map +1 -0
  43. package/dist/src/lib/walletInitializationBuilder.js +76 -0
  44. package/dist/src/register.d.ts.map +1 -1
  45. package/dist/src/register.js +5 -1
  46. package/dist/src/ripple.d.ts +112 -2
  47. package/dist/src/ripple.d.ts.map +1 -1
  48. package/dist/src/ripple.js +17 -14
  49. package/dist/src/txrp.d.ts +3 -2
  50. package/dist/src/txrp.d.ts.map +1 -1
  51. package/dist/src/txrp.js +5 -5
  52. package/dist/src/xrp.d.ts +11 -60
  53. package/dist/src/xrp.d.ts.map +1 -1
  54. package/dist/src/xrp.js +244 -132
  55. package/dist/src/xrpToken.d.ts +21 -0
  56. package/dist/src/xrpToken.d.ts.map +1 -0
  57. package/dist/src/xrpToken.js +58 -0
  58. package/dist/tsconfig.tsbuildinfo +1 -8595
  59. package/package.json +11 -11
  60. package/.mocharc.yml +0 -8
@@ -0,0 +1,371 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.Transaction = void 0;
30
+ const lodash_1 = __importDefault(require("lodash"));
31
+ const xrpl = __importStar(require("xrpl"));
32
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
33
+ const utils_1 = __importDefault(require("./utils"));
34
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
35
+ const iface_1 = require("./iface");
36
+ /**
37
+ * XRP transaction.
38
+ */
39
+ class Transaction extends sdk_core_1.BaseTransaction {
40
+ constructor(coinConfig) {
41
+ super(coinConfig);
42
+ }
43
+ get xrpTransaction() {
44
+ return this._xrpTransaction;
45
+ }
46
+ set xrpTransaction(tx) {
47
+ this._xrpTransaction = tx;
48
+ }
49
+ canSign(key) {
50
+ if (!utils_1.default.isValidPrivateKey(key.key)) {
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ toJson() {
56
+ if (!this._xrpTransaction) {
57
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
58
+ }
59
+ const txData = {
60
+ from: this._xrpTransaction.Account,
61
+ isMultiSig: this._isMultiSig,
62
+ transactionType: this._xrpTransaction.TransactionType,
63
+ id: this._id,
64
+ fee: this._xrpTransaction.Fee,
65
+ sequence: this._xrpTransaction.Sequence,
66
+ lastLedgerSequence: this._xrpTransaction.LastLedgerSequence,
67
+ flags: this._xrpTransaction.Flags,
68
+ signingPubKey: this._xrpTransaction.SigningPubKey,
69
+ signers: this._xrpTransaction.Signers,
70
+ txnSignature: this._xrpTransaction.TxnSignature,
71
+ };
72
+ if (this._xrpTransaction.SigningPubKey === '' && !lodash_1.default.isEmpty(this._xrpTransaction.Signers)) {
73
+ txData.isMultiSig = true;
74
+ }
75
+ if (this._xrpTransaction.SigningPubKey && utils_1.default.isValidPublicKey(this._xrpTransaction.SigningPubKey)) {
76
+ txData.isMultiSig = false;
77
+ }
78
+ switch (this._xrpTransaction.TransactionType) {
79
+ case iface_1.XrpTransactionType.Payment:
80
+ txData.destination = this._xrpTransaction.Destination;
81
+ txData.destinationTag = this._xrpTransaction.DestinationTag;
82
+ if (typeof this._xrpTransaction.Amount === 'string' ||
83
+ utils_1.default.isIssuedCurrencyAmount(this._xrpTransaction.Amount)) {
84
+ txData.amount = this._xrpTransaction.Amount;
85
+ }
86
+ else {
87
+ throw new sdk_core_1.InvalidTransactionError('Invalid amount');
88
+ }
89
+ return txData;
90
+ case iface_1.XrpTransactionType.AccountSet:
91
+ txData.setFlag = this._xrpTransaction.SetFlag;
92
+ txData.messageKey = this._xrpTransaction.MessageKey;
93
+ return txData;
94
+ case iface_1.XrpTransactionType.SignerListSet:
95
+ txData.signerQuorum = this._xrpTransaction.SignerQuorum;
96
+ txData.signerEntries = this._xrpTransaction.SignerEntries;
97
+ return txData;
98
+ case iface_1.XrpTransactionType.TrustSet:
99
+ txData.amount = this._xrpTransaction.LimitAmount;
100
+ return txData;
101
+ default:
102
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction type');
103
+ }
104
+ }
105
+ getSignablePayload() {
106
+ if (!this._xrpTransaction) {
107
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
108
+ }
109
+ return lodash_1.default.omit(this._xrpTransaction, ['TxnSignature', 'Signers', 'SigningPubKey']);
110
+ }
111
+ sign(keyPair) {
112
+ if (!this._xrpTransaction) {
113
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
114
+ }
115
+ if (!this._xrpTransaction.Fee) {
116
+ throw new sdk_core_1.InvalidTransactionError('Missing fee');
117
+ }
118
+ if (!this._xrpTransaction.Sequence) {
119
+ throw new sdk_core_1.InvalidTransactionError('Missing sequence');
120
+ }
121
+ if (!this._xrpTransaction.Flags) {
122
+ throw new sdk_core_1.InvalidTransactionError('Missing flags');
123
+ }
124
+ if (lodash_1.default.isEmpty(keyPair)) {
125
+ return;
126
+ }
127
+ const keyPairs = keyPair instanceof Array ? keyPair : [keyPair];
128
+ for (const kp of keyPairs) {
129
+ const { pub, prv } = kp.getKeys();
130
+ if (!prv) {
131
+ throw new sdk_core_1.SigningError('Missing private key');
132
+ }
133
+ if (this._isMultiSig === false && this._xrpTransaction.TxnSignature) {
134
+ throw new sdk_core_1.SigningError('Transaction has already been signed');
135
+ }
136
+ const signablePayload = this.getSignablePayload();
137
+ const xrpWallet = new xrpl.Wallet(pub, prv);
138
+ const signedTx = xrpWallet.sign(signablePayload, this._isMultiSig);
139
+ const xrpSignedTx = xrpl.decode(signedTx.tx_blob);
140
+ xrpl.validate(xrpSignedTx);
141
+ if (this._isMultiSig === false) {
142
+ xrpWallet.verifyTransaction(signedTx.tx_blob);
143
+ this._xrpTransaction = xrpSignedTx;
144
+ this._id = signedTx.hash;
145
+ }
146
+ if (this._isMultiSig === true) {
147
+ if (!xrpSignedTx.Signers || !lodash_1.default.isArray(xrpSignedTx.Signers)) {
148
+ throw new sdk_core_1.SigningError('Missing or invalid signers');
149
+ }
150
+ const sortedSigners = this.concatAndSortSigners(this._xrpTransaction.Signers || [], xrpSignedTx.Signers);
151
+ this._xrpTransaction = xrpSignedTx;
152
+ this._xrpTransaction.Signers = sortedSigners;
153
+ this._id = this.calculateIdFromRawTx(xrpl.encode(this._xrpTransaction));
154
+ }
155
+ }
156
+ }
157
+ /** @inheritdoc */
158
+ toBroadcastFormat() {
159
+ if (!this._xrpTransaction) {
160
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
161
+ }
162
+ return xrpl.encode(this._xrpTransaction);
163
+ }
164
+ explainTransaction() {
165
+ switch (this._xrpTransaction.TransactionType) {
166
+ case iface_1.XrpTransactionType.Payment:
167
+ return this.explainPaymentTransaction();
168
+ case iface_1.XrpTransactionType.AccountSet:
169
+ return this.explainAccountSetTransaction();
170
+ case iface_1.XrpTransactionType.SignerListSet:
171
+ return this.explainSignerListSetTransaction();
172
+ default:
173
+ throw new Error('Unsupported transaction type');
174
+ }
175
+ }
176
+ explainPaymentTransaction() {
177
+ const tx = this._xrpTransaction;
178
+ const address = utils_1.default.normalizeAddress({ address: tx.Destination, destinationTag: tx.DestinationTag });
179
+ const amount = lodash_1.default.isString(tx.Amount) ? tx.Amount : 0;
180
+ return {
181
+ displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee'],
182
+ id: this._id,
183
+ changeOutputs: [],
184
+ outputAmount: amount,
185
+ changeAmount: 0,
186
+ outputs: [
187
+ {
188
+ address,
189
+ amount,
190
+ },
191
+ ],
192
+ fee: {
193
+ fee: tx.Fee,
194
+ feeRate: undefined,
195
+ },
196
+ };
197
+ }
198
+ explainAccountSetTransaction() {
199
+ const tx = this._xrpTransaction;
200
+ return {
201
+ displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'accountSet'],
202
+ id: this._id,
203
+ changeOutputs: [],
204
+ outputAmount: 0,
205
+ changeAmount: 0,
206
+ outputs: [],
207
+ fee: {
208
+ fee: tx.Fee,
209
+ feeRate: undefined,
210
+ },
211
+ accountSet: {
212
+ messageKey: tx.MessageKey,
213
+ setFlag: tx.SetFlag,
214
+ },
215
+ };
216
+ }
217
+ explainSignerListSetTransaction() {
218
+ const tx = this._xrpTransaction;
219
+ return {
220
+ displayOrder: ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'signerListSet'],
221
+ id: this._id,
222
+ changeOutputs: [],
223
+ outputAmount: 0,
224
+ changeAmount: 0,
225
+ outputs: [],
226
+ fee: {
227
+ fee: tx.Fee,
228
+ feeRate: undefined,
229
+ },
230
+ signerListSet: {
231
+ signerQuorum: tx.SignerQuorum,
232
+ signerEntries: tx.SignerEntries,
233
+ },
234
+ };
235
+ }
236
+ calculateIdFromRawTx(rawTransaction) {
237
+ let id;
238
+ // hashes ids are different for signed and unsigned tx
239
+ // first we try to get the hash id as if it is signed, will throw if its not
240
+ try {
241
+ id = xrpl.hashes.hashSignedTx(rawTransaction);
242
+ }
243
+ catch (e) {
244
+ id = xrpl.hashes.hashTx(rawTransaction);
245
+ }
246
+ return id;
247
+ }
248
+ /**
249
+ * Set the transaction type.
250
+ *
251
+ * @param {TransactionType} transactionType The transaction type to be set.
252
+ */
253
+ setTransactionType(transactionType) {
254
+ this._type = transactionType;
255
+ }
256
+ setMultiSigValue(isMultiSig) {
257
+ this._isMultiSig = isMultiSig;
258
+ }
259
+ /**
260
+ * Sets this transaction payload
261
+ *
262
+ * @param rawTransaction
263
+ */
264
+ fromRawTransaction(rawTransaction) {
265
+ let txHex = rawTransaction;
266
+ if (!utils_1.default.isValidHex(rawTransaction)) {
267
+ try {
268
+ txHex = xrpl.encode(JSON.parse(rawTransaction));
269
+ }
270
+ catch (e) {
271
+ throw new sdk_core_1.InvalidTransactionError('Invalid transaction');
272
+ }
273
+ }
274
+ utils_1.default.validateRawTransaction(txHex);
275
+ this._xrpTransaction = xrpl.decode(txHex);
276
+ if (!iface_1.XrpTransactionType[this._xrpTransaction.TransactionType]) {
277
+ throw new sdk_core_1.InvalidTransactionError('Unsupported transaction type, got: ' + this._xrpTransaction.TransactionType);
278
+ }
279
+ if (this._xrpTransaction.SigningPubKey && this._xrpTransaction.SigningPubKey !== '') {
280
+ this._isMultiSig = false;
281
+ }
282
+ if (this._xrpTransaction.SigningPubKey === '' &&
283
+ this._xrpTransaction.Signers &&
284
+ this._xrpTransaction.Signers.length > 0) {
285
+ this._isMultiSig = true;
286
+ }
287
+ this._id = this.calculateIdFromRawTx(txHex);
288
+ switch (this._xrpTransaction.TransactionType) {
289
+ case iface_1.XrpTransactionType.SignerListSet:
290
+ this.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
291
+ break;
292
+ case iface_1.XrpTransactionType.AccountSet:
293
+ this.setTransactionType(sdk_core_1.TransactionType.AccountUpdate);
294
+ break;
295
+ case iface_1.XrpTransactionType.Payment:
296
+ if (utils_1.default.isIssuedCurrencyAmount(this._xrpTransaction.Amount)) {
297
+ this.setTransactionType(sdk_core_1.TransactionType.SendToken);
298
+ }
299
+ else {
300
+ this.setTransactionType(sdk_core_1.TransactionType.Send);
301
+ }
302
+ break;
303
+ case iface_1.XrpTransactionType.TrustSet:
304
+ this.setTransactionType(sdk_core_1.TransactionType.TrustLine);
305
+ break;
306
+ }
307
+ this.loadInputsAndOutputs();
308
+ }
309
+ /**
310
+ * Load the input and output data on this transaction.
311
+ */
312
+ loadInputsAndOutputs() {
313
+ if (!this._xrpTransaction) {
314
+ return;
315
+ }
316
+ if (this._xrpTransaction.TransactionType === iface_1.XrpTransactionType.Payment) {
317
+ let value;
318
+ const { Account, Destination, Amount, DestinationTag } = this._xrpTransaction;
319
+ if (typeof Amount === 'string') {
320
+ value = Amount;
321
+ }
322
+ else {
323
+ value = Amount.value;
324
+ }
325
+ const coin = this._coinConfig.name;
326
+ this.inputs.push({
327
+ address: Account,
328
+ value,
329
+ coin,
330
+ });
331
+ this.outputs.push({
332
+ address: utils_1.default.normalizeAddress({ address: Destination, destinationTag: DestinationTag }),
333
+ value,
334
+ coin,
335
+ });
336
+ }
337
+ }
338
+ /**
339
+ * Groups and sorts the signers by account.
340
+ * @param {Signer[]}signers1 - The first set of signers.
341
+ * @param {Signer[]}signers2 - The second set of signers.
342
+ * @returns The grouped and sorted signers.
343
+ **/
344
+ concatAndSortSigners(signers1, signers2) {
345
+ return signers1
346
+ .concat(signers2)
347
+ .sort((signer1, signer2) => this.compareSignersByAccount(signer1.Signer.Account, signer2.Signer.Account));
348
+ }
349
+ /**
350
+ * If presented in binary form, the Signers array must be sorted based on
351
+ * the numeric value of the signer addresses, with the lowest value first.
352
+ * (If submitted as JSON, the submit_multisigned method handles this automatically.)
353
+ * https://xrpl.org/multi-signing.html.
354
+ *
355
+ * @param left - A Signer to compare with.
356
+ * @param right - A second Signer to compare with.
357
+ * @returns 1 if left \> right, 0 if left = right, -1 if left \< right, and null if left or right are NaN.
358
+ */
359
+ compareSignersByAccount(address1, address2) {
360
+ const addressBN1 = this.addressToBigNumber(address1);
361
+ const addressBN2 = this.addressToBigNumber(address2);
362
+ return addressBN1.comparedTo(addressBN2);
363
+ }
364
+ addressToBigNumber(address) {
365
+ const hex = Buffer.from(xrpl.decodeAccountID(address)).toString('hex');
366
+ const numberOfBitsInHex = 16;
367
+ return new bignumber_js_1.default(hex, numberOfBitsInHex);
368
+ }
369
+ }
370
+ exports.Transaction = Transaction;
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQXVCO0FBQ3ZCLDJDQUE2QjtBQUU3QixtREFPOEI7QUFFOUIsb0RBQTRCO0FBRTVCLGdFQUFxQztBQUVyQyxtQ0FPaUI7QUFHakI7O0dBRUc7QUFDSCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQUs5QyxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsRUFBa0I7UUFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFZO1FBQ2xCLElBQUksQ0FBQyxlQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDeEQ7UUFFRCxNQUFNLE1BQU0sR0FBVztZQUNyQixJQUFJLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM1QixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFxQztZQUMzRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDWixHQUFHLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHO1lBQzdC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QUNMLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUVEOzs7OztRQUtJO0lBQ0ksb0JBQW9CLENBQUMsUUFBa0IsRUFBRSxRQUFrQjtRQUNqRSxPQUFPLFFBQVE7YUFDWixNQUFNLENBQUMsUUFBUSxDQUFDO2FBQ2hCLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUcsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNLLHVCQUF1QixDQUFDLFFBQWdCLEVBQUUsUUFBZ0I7UUFDaEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQWU7UUFDeEMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxzQkFBUyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7Q0FDRjtBQS9XRCxrQ0ErV0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgeHJwbCBmcm9tICd4cnBsJztcblxuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIGFzIEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgU2lnbmVyIH0gZnJvbSAneHJwbCc7XG5pbXBvcnQge1xuICBBY2NvdW50U2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgU2lnbmVyTGlzdFNldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4RGF0YSxcbiAgWHJwVHJhbnNhY3Rpb24sXG4gIFhycFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcblxuLyoqXG4gKiBYUlAgdHJhbnNhY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIC8vIFhSUCBzcGVjaWZpYyBmaWVsZHNcbiAgcHJvdGVjdGVkIF94cnBUcmFuc2FjdGlvbjogWHJwVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfaXNNdWx0aVNpZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICB9XG5cbiAgZ2V0IHhycFRyYW5zYWN0aW9uKCk6IFhycFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5feHJwVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgeHJwVHJhbnNhY3Rpb24odHg6IFhycFRyYW5zYWN0aW9uKSB7XG4gICAgdGhpcy5feHJwVHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShrZXkua2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0eERhdGE6IFR4RGF0YSA9IHtcbiAgICAgIGZyb206IHRoaXMuX3hycFRyYW5zYWN0aW9uLkFjY291bnQsXG4gICAgICBpc011bHRpU2lnOiB0aGlzLl9pc011bHRpU2lnLFxuICAgICAgdHJhbnNhY3Rpb25UeXBlOiB0aGlzLl94cnBUcmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUgYXMgWHJwVHJhbnNhY3Rpb25UeXBlLFxuICAgICAgaWQ6IHRoaXMuX2lkLFxuICAgICAgZmVlOiB0aGlzLl94cnBUcmFuc2FjdGlvbi5GZWUsXG4gICAgICBzZXF1ZW5jZTogdGhpcy5feHJwVHJhbnNhY3Rpb24uU2VxdWVuY2UsXG4gICAgICBsYXN0TGVkZ2VyU2VxdWVuY2U6IHRoaXMuX3hycFRyYW5zYWN0aW9uLkxhc3RMZWRnZXJTZXF1ZW5jZSxcbiAgICAgIGZsYWdzOiB0aGlzLl94cnBUcmFuc2FjdGlvbi5GbGFncyBhcyBudW1iZXIsXG4gICAgICBzaWduaW5nUHViS2V5OiB0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduaW5nUHViS2V5LFxuICAgICAgc2lnbmVyczogdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycyxcbiAgICAgIHR4blNpZ25hdHVyZTogdGhpcy5feHJwVHJhbnNhY3Rpb24uVHhuU2lnbmF0dXJlLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSA9PT0gJycgJiYgIV8uaXNFbXB0eSh0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduZXJzKSkge1xuICAgICAgdHhEYXRhLmlzTXVsdGlTaWcgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSAmJiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25pbmdQdWJLZXkpKSB7XG4gICAgICB0eERhdGEuaXNNdWx0aVNpZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5QYXltZW50OlxuICAgICAgICB0eERhdGEuZGVzdGluYXRpb24gPSB0aGlzLl94cnBUcmFuc2FjdGlvbi5EZXN0aW5hdGlvbjtcbiAgICAgICAgdHhEYXRhLmRlc3RpbmF0aW9uVGFnID0gdGhpcy5feHJwVHJhbnNhY3Rpb24uRGVzdGluYXRpb25UYWc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgdGhpcy5feHJwVHJhbnNhY3Rpb24uQW1vdW50ID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIHV0aWxzLmlzSXNzdWVkQ3VycmVuY3lBbW91bnQodGhpcy5feHJwVHJhbnNhY3Rpb24uQW1vdW50KVxuICAgICAgICApIHtcbiAgICAgICAgICB0eERhdGEuYW1vdW50ID0gdGhpcy5feHJwVHJhbnNhY3Rpb24uQW1vdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhbW91bnQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHhEYXRhO1xuXG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50U2V0OlxuICAgICAgICB0eERhdGEuc2V0RmxhZyA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLlNldEZsYWc7XG4gICAgICAgIHR4RGF0YS5tZXNzYWdlS2V5ID0gdGhpcy5feHJwVHJhbnNhY3Rpb24uTWVzc2FnZUtleTtcbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcblxuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuU2lnbmVyTGlzdFNldDpcbiAgICAgICAgdHhEYXRhLnNpZ25lclF1b3J1bSA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLlNpZ25lclF1b3J1bTtcbiAgICAgICAgdHhEYXRhLnNpZ25lckVudHJpZXMgPSB0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduZXJFbnRyaWVzO1xuICAgICAgICByZXR1cm4gdHhEYXRhO1xuXG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5UcnVzdFNldDpcbiAgICAgICAgdHhEYXRhLmFtb3VudCA9IHRoaXMuX3hycFRyYW5zYWN0aW9uLkxpbWl0QW1vdW50O1xuICAgICAgICByZXR1cm4gdHhEYXRhO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cbiAgfVxuXG4gIGdldFNpZ25hYmxlUGF5bG9hZCgpOiBYcnBUcmFuc2FjdGlvbiB7XG4gICAgaWYgKCF0aGlzLl94cnBUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gXy5vbWl0KHRoaXMuX3hycFRyYW5zYWN0aW9uLCBbJ1R4blNpZ25hdHVyZScsICdTaWduZXJzJywgJ1NpZ25pbmdQdWJLZXknXSkgYXMgWHJwVHJhbnNhY3Rpb247XG4gIH1cblxuICBzaWduKGtleVBhaXI6IEtleVBhaXIgfCBLZXlQYWlyW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24uRmVlKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgZmVlJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24uU2VxdWVuY2UpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignTWlzc2luZyBzZXF1ZW5jZScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX3hycFRyYW5zYWN0aW9uLkZsYWdzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ01pc3NpbmcgZmxhZ3MnKTtcbiAgICB9XG4gICAgaWYgKF8uaXNFbXB0eShrZXlQYWlyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleVBhaXJzID0ga2V5UGFpciBpbnN0YW5jZW9mIEFycmF5ID8ga2V5UGFpciA6IFtrZXlQYWlyXTtcbiAgICBmb3IgKGNvbnN0IGtwIG9mIGtleVBhaXJzKSB7XG4gICAgICBjb25zdCB7IHB1YiwgcHJ2IH0gPSBrcC5nZXRLZXlzKCk7XG4gICAgICBpZiAoIXBydikge1xuICAgICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9pc011bHRpU2lnID09PSBmYWxzZSAmJiB0aGlzLl94cnBUcmFuc2FjdGlvbi5UeG5TaWduYXR1cmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignVHJhbnNhY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzaWduZWQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNpZ25hYmxlUGF5bG9hZCA9IHRoaXMuZ2V0U2lnbmFibGVQYXlsb2FkKCk7XG5cbiAgICAgIGNvbnN0IHhycFdhbGxldCA9IG5ldyB4cnBsLldhbGxldChwdWIsIHBydik7XG4gICAgICBjb25zdCBzaWduZWRUeCA9IHhycFdhbGxldC5zaWduKHNpZ25hYmxlUGF5bG9hZCwgdGhpcy5faXNNdWx0aVNpZyk7XG4gICAgICBjb25zdCB4cnBTaWduZWRUeCA9IHhycGwuZGVjb2RlKHNpZ25lZFR4LnR4X2Jsb2IpO1xuICAgICAgeHJwbC52YWxpZGF0ZSh4cnBTaWduZWRUeCk7XG5cbiAgICAgIGlmICh0aGlzLl9pc011bHRpU2lnID09PSBmYWxzZSkge1xuICAgICAgICB4cnBXYWxsZXQudmVyaWZ5VHJhbnNhY3Rpb24oc2lnbmVkVHgudHhfYmxvYik7XG4gICAgICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uID0geHJwU2lnbmVkVHggYXMgdW5rbm93biBhcyBYcnBUcmFuc2FjdGlvbjtcbiAgICAgICAgdGhpcy5faWQgPSBzaWduZWRUeC5oYXNoO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNNdWx0aVNpZyA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXhycFNpZ25lZFR4LlNpZ25lcnMgfHwgIV8uaXNBcnJheSh4cnBTaWduZWRUeC5TaWduZXJzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBzaWduZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkU2lnbmVycyA9IHRoaXMuY29uY2F0QW5kU29ydFNpZ25lcnModGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycyB8fCBbXSwgeHJwU2lnbmVkVHguU2lnbmVycyk7XG4gICAgICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uID0geHJwU2lnbmVkVHggYXMgdW5rbm93biBhcyBYcnBUcmFuc2FjdGlvbjtcbiAgICAgICAgdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycyA9IHNvcnRlZFNpZ25lcnM7XG4gICAgICAgIHRoaXMuX2lkID0gdGhpcy5jYWxjdWxhdGVJZEZyb21SYXdUeCh4cnBsLmVuY29kZSh0aGlzLl94cnBUcmFuc2FjdGlvbikpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5feHJwVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHhycGwuZW5jb2RlKHRoaXMuX3hycFRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBzd2l0Y2ggKHRoaXMuX3hycFRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuUGF5bWVudDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblBheW1lbnRUcmFuc2FjdGlvbigpO1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuQWNjb3VudFNldDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpbkFjY291bnRTZXRUcmFuc2FjdGlvbigpO1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuU2lnbmVyTGlzdFNldDpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwbGFpblNpZ25lckxpc3RTZXRUcmFuc2FjdGlvbigpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBleHBsYWluUGF5bWVudFRyYW5zYWN0aW9uKCk6IEJhc2VUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eCA9IHRoaXMuX3hycFRyYW5zYWN0aW9uIGFzIHhycGwuUGF5bWVudDtcbiAgICBjb25zdCBhZGRyZXNzID0gdXRpbHMubm9ybWFsaXplQWRkcmVzcyh7IGFkZHJlc3M6IHR4LkRlc3RpbmF0aW9uLCBkZXN0aW5hdGlvblRhZzogdHguRGVzdGluYXRpb25UYWcgfSk7XG4gICAgY29uc3QgYW1vdW50ID0gXy5pc1N0cmluZyh0eC5BbW91bnQpID8gdHguQW1vdW50IDogMDtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJ10sXG4gICAgICBpZDogdGhpcy5faWQgYXMgc3RyaW5nLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6IGFtb3VudCxcbiAgICAgIGNoYW5nZUFtb3VudDogMCxcbiAgICAgIG91dHB1dHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFkZHJlc3MsXG4gICAgICAgICAgYW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IHR4LkZlZSBhcyBzdHJpbmcsXG4gICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZXhwbGFpbkFjY291bnRTZXRUcmFuc2FjdGlvbigpOiBBY2NvdW50U2V0VHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHggPSB0aGlzLl94cnBUcmFuc2FjdGlvbiBhcyB4cnBsLkFjY291bnRTZXQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAnYWNjb3VudFNldCddLFxuICAgICAgaWQ6IHRoaXMuX2lkIGFzIHN0cmluZyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0QW1vdW50OiAwLFxuICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgb3V0cHV0czogW10sXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiB0eC5GZWUgYXMgc3RyaW5nLFxuICAgICAgICBmZWVSYXRlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgICAgYWNjb3VudFNldDoge1xuICAgICAgICBtZXNzYWdlS2V5OiB0eC5NZXNzYWdlS2V5LFxuICAgICAgICBzZXRGbGFnOiB0eC5TZXRGbGFnIGFzIHhycGwuQWNjb3VudFNldEFzZkZsYWdzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBleHBsYWluU2lnbmVyTGlzdFNldFRyYW5zYWN0aW9uKCk6IFNpZ25lckxpc3RTZXRUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCB0eCA9IHRoaXMuX3hycFRyYW5zYWN0aW9uIGFzIHhycGwuU2lnbmVyTGlzdFNldDtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICdzaWduZXJMaXN0U2V0J10sXG4gICAgICBpZDogdGhpcy5faWQgYXMgc3RyaW5nLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IHR4LkZlZSBhcyBzdHJpbmcsXG4gICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgICBzaWduZXJMaXN0U2V0OiB7XG4gICAgICAgIHNpZ25lclF1b3J1bTogdHguU2lnbmVyUXVvcnVtLFxuICAgICAgICBzaWduZXJFbnRyaWVzOiB0eC5TaWduZXJFbnRyaWVzIGFzIHhycGwuU2lnbmVyRW50cnlbXSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlSWRGcm9tUmF3VHgocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgLy8gaGFzaGVzIGlkcyBhcmUgZGlmZmVyZW50IGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIHR4XG4gICAgLy8gZmlyc3Qgd2UgdHJ5IHRvIGdldCB0aGUgaGFzaCBpZCBhcyBpZiBpdCBpcyBzaWduZWQsIHdpbGwgdGhyb3cgaWYgaXRzIG5vdFxuICAgIHRyeSB7XG4gICAgICBpZCA9IHhycGwuaGFzaGVzLmhhc2hTaWduZWRUeChyYXdUcmFuc2FjdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWQgPSB4cnBsLmhhc2hlcy5oYXNoVHgocmF3VHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldC5cbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICBzZXRNdWx0aVNpZ1ZhbHVlKGlzTXVsdGlTaWc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLl9pc011bHRpU2lnID0gaXNNdWx0aVNpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoaXMgdHJhbnNhY3Rpb24gcGF5bG9hZFxuICAgKlxuICAgKiBAcGFyYW0gcmF3VHJhbnNhY3Rpb25cbiAgICovXG4gIGZyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHR4SGV4ID0gcmF3VHJhbnNhY3Rpb247XG4gICAgaWYgKCF1dGlscy5pc1ZhbGlkSGV4KHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdHhIZXggPSB4cnBsLmVuY29kZShKU09OLnBhcnNlKHJhd1RyYW5zYWN0aW9uKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHR4SGV4KTtcblxuICAgIHRoaXMuX3hycFRyYW5zYWN0aW9uID0geHJwbC5kZWNvZGUodHhIZXgpIGFzIHVua25vd24gYXMgWHJwVHJhbnNhY3Rpb247XG4gICAgaWYgKCFYcnBUcmFuc2FjdGlvblR5cGVbdGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlXSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdVbnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlLCBnb3Q6ICcgKyB0aGlzLl94cnBUcmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmluZ1B1YktleSAmJiB0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduaW5nUHViS2V5ICE9PSAnJykge1xuICAgICAgdGhpcy5faXNNdWx0aVNpZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0aGlzLl94cnBUcmFuc2FjdGlvbi5TaWduaW5nUHViS2V5ID09PSAnJyAmJlxuICAgICAgdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycyAmJlxuICAgICAgdGhpcy5feHJwVHJhbnNhY3Rpb24uU2lnbmVycy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLl9pc011bHRpU2lnID0gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5faWQgPSB0aGlzLmNhbGN1bGF0ZUlkRnJvbVJhd1R4KHR4SGV4KTtcblxuICAgIHN3aXRjaCAodGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5TaWduZXJMaXN0U2V0OlxuICAgICAgICB0aGlzLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgWHJwVHJhbnNhY3Rpb25UeXBlLkFjY291bnRTZXQ6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5BY2NvdW50VXBkYXRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFhycFRyYW5zYWN0aW9uVHlwZS5QYXltZW50OlxuICAgICAgICBpZiAodXRpbHMuaXNJc3N1ZWRDdXJyZW5jeUFtb3VudCh0aGlzLl94cnBUcmFuc2FjdGlvbi5BbW91bnQpKSB7XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmRUb2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRUcmFuc2FjdGlvblR5cGUoVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBYcnBUcmFuc2FjdGlvblR5cGUuVHJ1c3RTZXQ6XG4gICAgICAgIHRoaXMuc2V0VHJhbnNhY3Rpb25UeXBlKFRyYW5zYWN0aW9uVHlwZS5UcnVzdExpbmUpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5sb2FkSW5wdXRzQW5kT3V0cHV0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBvbiB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgbG9hZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl94cnBUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5feHJwVHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlID09PSBYcnBUcmFuc2FjdGlvblR5cGUuUGF5bWVudCkge1xuICAgICAgbGV0IHZhbHVlOiBzdHJpbmc7XG4gICAgICBjb25zdCB7IEFjY291bnQsIERlc3RpbmF0aW9uLCBBbW91bnQsIERlc3RpbmF0aW9uVGFnIH0gPSB0aGlzLl94cnBUcmFuc2FjdGlvbjtcbiAgICAgIGlmICh0eXBlb2YgQW1vdW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZSA9IEFtb3VudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gQW1vdW50LnZhbHVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY29pbiA9IHRoaXMuX2NvaW5Db25maWcubmFtZTtcbiAgICAgIHRoaXMuaW5wdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiBBY2NvdW50LFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgY29pbixcbiAgICAgIH0pO1xuICAgICAgdGhpcy5vdXRwdXRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiB1dGlscy5ub3JtYWxpemVBZGRyZXNzKHsgYWRkcmVzczogRGVzdGluYXRpb24sIGRlc3RpbmF0aW9uVGFnOiBEZXN0aW5hdGlvblRhZyB9KSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGNvaW4sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR3JvdXBzIGFuZCBzb3J0cyB0aGUgc2lnbmVycyBieSBhY2NvdW50LlxuICAgKiBAcGFyYW0ge1NpZ25lcltdfXNpZ25lcnMxIC0gVGhlIGZpcnN0IHNldCBvZiBzaWduZXJzLlxuICAgKiBAcGFyYW0ge1NpZ25lcltdfXNpZ25lcnMyIC0gVGhlIHNlY29uZCBzZXQgb2Ygc2lnbmVycy5cbiAgICogQHJldHVybnMgVGhlIGdyb3VwZWQgYW5kIHNvcnRlZCBzaWduZXJzLlxuICAgKiovXG4gIHByaXZhdGUgY29uY2F0QW5kU29ydFNpZ25lcnMoc2lnbmVyczE6IFNpZ25lcltdLCBzaWduZXJzMjogU2lnbmVyW10pOiBTaWduZXJbXSB7XG4gICAgcmV0dXJuIHNpZ25lcnMxXG4gICAgICAuY29uY2F0KHNpZ25lcnMyKVxuICAgICAgLnNvcnQoKHNpZ25lcjEsIHNpZ25lcjIpID0+IHRoaXMuY29tcGFyZVNpZ25lcnNCeUFjY291bnQoc2lnbmVyMS5TaWduZXIuQWNjb3VudCwgc2lnbmVyMi5TaWduZXIuQWNjb3VudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIElmIHByZXNlbnRlZCBpbiBiaW5hcnkgZm9ybSwgdGhlIFNpZ25lcnMgYXJyYXkgbXVzdCBiZSBzb3J0ZWQgYmFzZWQgb25cbiAgICogdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNpZ25lciBhZGRyZXNzZXMsIHdpdGggdGhlIGxvd2VzdCB2YWx1ZSBmaXJzdC5cbiAgICogKElmIHN1Ym1pdHRlZCBhcyBKU09OLCB0aGUgc3VibWl0X211bHRpc2lnbmVkIG1ldGhvZCBoYW5kbGVzIHRoaXMgYXV0b21hdGljYWxseS4pXG4gICAqIGh0dHBzOi8veHJwbC5vcmcvbXVsdGktc2lnbmluZy5odG1sLlxuICAgKlxuICAgKiBAcGFyYW0gbGVmdCAtIEEgU2lnbmVyIHRvIGNvbXBhcmUgd2l0aC5cbiAgICogQHBhcmFtIHJpZ2h0IC0gQSBzZWNvbmQgU2lnbmVyIHRvIGNvbXBhcmUgd2l0aC5cbiAgICogQHJldHVybnMgMSBpZiBsZWZ0IFxcPiByaWdodCwgMCBpZiBsZWZ0ID0gcmlnaHQsIC0xIGlmIGxlZnQgXFw8IHJpZ2h0LCBhbmQgbnVsbCBpZiBsZWZ0IG9yIHJpZ2h0IGFyZSBOYU4uXG4gICAqL1xuICBwcml2YXRlIGNvbXBhcmVTaWduZXJzQnlBY2NvdW50KGFkZHJlc3MxOiBzdHJpbmcsIGFkZHJlc3MyOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IGFkZHJlc3NCTjEgPSB0aGlzLmFkZHJlc3NUb0JpZ051bWJlcihhZGRyZXNzMSk7XG4gICAgY29uc3QgYWRkcmVzc0JOMiA9IHRoaXMuYWRkcmVzc1RvQmlnTnVtYmVyKGFkZHJlc3MyKTtcbiAgICByZXR1cm4gYWRkcmVzc0JOMS5jb21wYXJlZFRvKGFkZHJlc3NCTjIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRyZXNzVG9CaWdOdW1iZXIoYWRkcmVzczogc3RyaW5nKTogQmlnTnVtYmVyIHtcbiAgICBjb25zdCBoZXggPSBCdWZmZXIuZnJvbSh4cnBsLmRlY29kZUFjY291bnRJRChhZGRyZXNzKSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IG51bWJlck9mQml0c0luSGV4ID0gMTY7XG4gICAgcmV0dXJuIG5ldyBCaWdOdW1iZXIoaGV4LCBudW1iZXJPZkJpdHNJbkhleCk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,72 @@
1
+ import { BaseAddress, BaseKey, BaseTransaction, BaseTransactionBuilder, TransactionType } from '@bitgo-beta/sdk-core';
2
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
3
+ import BigNumber from 'bignumber.js';
4
+ import { Signer } from 'xrpl/dist/npm/models/common';
5
+ import { XrpTransaction } from './iface';
6
+ import { KeyPair } from './keyPair';
7
+ import { Transaction } from './transaction';
8
+ /**
9
+ * XRP transaction builder.
10
+ */
11
+ export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
12
+ protected _transaction: Transaction;
13
+ protected _sender: string;
14
+ protected _fee?: string;
15
+ protected _sequence?: number;
16
+ protected _lastLedgerSequence?: number;
17
+ protected _flags?: number;
18
+ protected _signingPubKey?: string;
19
+ protected _signers: Signer[];
20
+ protected _txnSignature?: string;
21
+ protected _specificFields: XrpTransaction;
22
+ protected _isMultiSig?: boolean;
23
+ protected _keyPairs: KeyPair[];
24
+ constructor(_coinConfig: Readonly<CoinConfig>);
25
+ /**
26
+ * The transaction type.
27
+ */
28
+ protected abstract get transactionType(): TransactionType;
29
+ /**
30
+ * Set the transaction signature type to multi sig.
31
+ **/
32
+ setMultiSig(): TransactionBuilder;
33
+ /**
34
+ * Set the transaction signature type to single sig.
35
+ **/
36
+ setSingleSig(): TransactionBuilder;
37
+ /**
38
+ * Sets the sender of this transaction.
39
+ *
40
+ * @param {string} address the account that is sending this transaction
41
+ * @returns {TransactionBuilder} This transaction builder
42
+ */
43
+ sender(address: string): TransactionBuilder;
44
+ sequence(sequence: number): TransactionBuilder;
45
+ fee(fee: string): TransactionBuilder;
46
+ flags(flags: number): TransactionBuilder;
47
+ lastLedgerSequence(lastLedgerSequence: number): TransactionBuilder;
48
+ /**
49
+ * Initialize the transaction builder fields using the decoded transaction data
50
+ *
51
+ * @param {Transaction} tx the transaction data
52
+ */
53
+ initBuilder(tx: Transaction): void;
54
+ /** @inheritdoc */
55
+ protected fromImplementation(rawTransaction: string): BaseTransaction;
56
+ /** @inheritdoc */
57
+ protected signImplementation(key: BaseKey): Transaction;
58
+ private checkDuplicatedKeys;
59
+ /** @inheritdoc */
60
+ protected buildImplementation(): Promise<Transaction>;
61
+ private buildXrpTransaction;
62
+ validateKey(key: BaseKey): void;
63
+ validateIsMultiSig(): void;
64
+ /** @inheritdoc */
65
+ validateTransaction(): void;
66
+ validateAddress(address: BaseAddress): void;
67
+ validateValue(value: BigNumber): void;
68
+ validateRawTransaction(rawTransaction: string): void;
69
+ protected get transaction(): Transaction;
70
+ protected set transaction(transaction: Transaction);
71
+ }
72
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,OAAO,EACP,eAAe,EACf,sBAAsB,EAGtB,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;GAEG;AACH,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACvC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAK;IAC9B,SAAS,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAClC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,eAAe,EAAE,cAAc,CAAC;IAE1C,SAAS,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAEhC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;gBAEnB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAO7C;;OAEG;IACH,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D;;QAEI;IACJ,WAAW,IAAI,kBAAkB;IAKjC;;QAEI;IACJ,YAAY,IAAI,kBAAkB;IAKlC;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB;IAM3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB;IAQ9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB;IAYpC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAQxC,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,GAAG,kBAAkB;IAQlE;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IA0BlC,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,eAAe;IAQrE,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAevD,OAAO,CAAC,mBAAmB;IAiB3B,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAY3D,OAAO,CAAC,mBAAmB;IA0B3B,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAa/B,kBAAkB,IAAI,IAAI;IAM1B,kBAAkB;IAClB,mBAAmB,IAAI,IAAI;IAY3B,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM3C,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAMrC,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CACF"}