@bitgo/sdk-api 2.0.0-hotfix.0 → 2.1.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 (98) hide show
  1. package/dist/package.json +33 -28
  2. package/dist/src/api.d.ts +9 -8
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +132 -72
  5. package/dist/src/bitgoAPI.d.ts +366 -22
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +1286 -212
  8. package/dist/src/encrypt.d.ts +16 -6
  9. package/dist/src/encrypt.d.ts.map +1 -1
  10. package/dist/src/encrypt.js +92 -14
  11. package/dist/src/encryptV2.d.ts +68 -0
  12. package/dist/src/encryptV2.d.ts.map +1 -0
  13. package/dist/src/encryptV2.js +202 -0
  14. package/dist/src/encryptionSession.d.ts +34 -0
  15. package/dist/src/encryptionSession.d.ts.map +1 -0
  16. package/dist/src/encryptionSession.js +95 -0
  17. package/dist/src/index.d.ts +2 -1
  18. package/dist/src/index.d.ts.map +1 -1
  19. package/dist/src/index.js +8 -3
  20. package/dist/src/types.d.ts +195 -65
  21. package/dist/src/types.d.ts.map +1 -1
  22. package/dist/src/types.js +5 -15
  23. package/dist/src/util.d.ts +12 -8
  24. package/dist/src/util.d.ts.map +1 -1
  25. package/dist/src/util.js +54 -20
  26. package/dist/src/v1/blockchain.d.ts +5 -0
  27. package/dist/src/v1/blockchain.d.ts.map +1 -0
  28. package/dist/src/v1/blockchain.js +127 -0
  29. package/dist/src/v1/keychains.d.ts +5 -0
  30. package/dist/src/v1/keychains.d.ts.map +1 -0
  31. package/dist/src/v1/keychains.js +328 -0
  32. package/dist/src/v1/markets.d.ts +5 -0
  33. package/dist/src/v1/markets.d.ts.map +1 -0
  34. package/dist/src/v1/markets.js +68 -0
  35. package/dist/src/v1/pendingapproval.d.ts +6 -0
  36. package/dist/src/v1/pendingapproval.d.ts.map +1 -0
  37. package/dist/src/v1/pendingapproval.js +361 -0
  38. package/dist/src/v1/pendingapprovals.d.ts +6 -0
  39. package/dist/src/v1/pendingapprovals.d.ts.map +1 -0
  40. package/dist/src/v1/pendingapprovals.js +102 -0
  41. package/dist/src/v1/signPsbt.d.ts +14 -0
  42. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  43. package/dist/src/v1/signPsbt.js +69 -0
  44. package/dist/src/v1/transactionBuilder.d.ts +5 -0
  45. package/dist/src/v1/transactionBuilder.d.ts.map +1 -0
  46. package/dist/src/v1/transactionBuilder.js +1034 -0
  47. package/dist/src/v1/travelRule.d.ts +5 -0
  48. package/dist/src/v1/travelRule.d.ts.map +1 -0
  49. package/dist/src/v1/travelRule.js +316 -0
  50. package/dist/src/v1/verifyAddress.d.ts +6 -0
  51. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  52. package/dist/src/v1/verifyAddress.js +50 -0
  53. package/dist/src/v1/wallet.d.ts +6 -0
  54. package/dist/src/v1/wallet.d.ts.map +1 -0
  55. package/dist/src/v1/wallet.js +2366 -0
  56. package/dist/src/v1/wallets.d.ts +5 -0
  57. package/dist/src/v1/wallets.d.ts.map +1 -0
  58. package/dist/src/v1/wallets.js +537 -0
  59. package/dist/test/unit/api.d.ts +2 -0
  60. package/dist/test/unit/api.d.ts.map +1 -0
  61. package/dist/test/unit/api.js +307 -0
  62. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  63. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  64. package/dist/test/unit/bitgoAPI.js +1001 -0
  65. package/dist/test/unit/encrypt.d.ts +2 -0
  66. package/dist/test/unit/encrypt.d.ts.map +1 -0
  67. package/dist/test/unit/encrypt.js +377 -0
  68. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  69. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  70. package/dist/test/unit/hmacStrategy.js +136 -0
  71. package/dist/test/unit/utils.d.ts +2 -0
  72. package/dist/test/unit/utils.d.ts.map +1 -0
  73. package/dist/test/unit/utils.js +65 -0
  74. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  75. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  76. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  77. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  78. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  79. package/dist/test/unit/v1/fixtures/index.js +24 -0
  80. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  81. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  82. package/dist/test/unit/v1/signPsbt.js +53 -0
  83. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  84. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  85. package/dist/test/unit/v1/travelRule.js +125 -0
  86. package/dist/test/unit/v1/wallet.d.ts +2 -0
  87. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  88. package/dist/test/unit/v1/wallet.js +1658 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -5259
  90. package/package.json +33 -28
  91. package/.eslintignore +0 -5
  92. package/CHANGELOG.md +0 -67
  93. package/dist/src/bip32path.d.ts +0 -24
  94. package/dist/src/bip32path.d.ts.map +0 -1
  95. package/dist/src/bip32path.js +0 -45
  96. package/dist/web/browser.html +0 -1
  97. package/dist/web/main.js +0 -2
  98. package/dist/web/main.js.LICENSE.txt +0 -30
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @hidden
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=travelRule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"travelRule.d.ts","sourceRoot":"","sources":["../../../src/v1/travelRule.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,316 @@
1
+ "use strict";
2
+ /**
3
+ * @hidden
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ /**
43
+ */
44
+ //
45
+ // TravelRule Object
46
+ // BitGo accessor for a specific enterprise
47
+ //
48
+ // Copyright 2014, BitGo, Inc. All Rights Reserved.
49
+ //
50
+ const sdk_core_1 = require("@bitgo/sdk-core");
51
+ const utxo_lib_1 = require("@bitgo/utxo-lib");
52
+ const utxolib = __importStar(require("@bitgo/utxo-lib"));
53
+ const lodash_1 = __importDefault(require("lodash"));
54
+ //
55
+ // Constructor
56
+ //
57
+ const TravelRule = function (bitgo) {
58
+ // @ts-expect-error - no implicit this
59
+ this.bitgo = bitgo;
60
+ };
61
+ TravelRule.prototype.url = function (extra) {
62
+ extra = extra || '';
63
+ return this.bitgo.url('/travel/' + extra);
64
+ };
65
+ /**
66
+ * Get available travel-rule info recipients for a transaction
67
+ * @param params
68
+ * txid: transaction id
69
+ * @param callback
70
+ * @returns {*}
71
+ */
72
+ TravelRule.prototype.getRecipients = function (params, callback) {
73
+ params = params || {};
74
+ params.txid = params.txid || params.hash;
75
+ sdk_core_1.common.validateParams(params, ['txid'], [], callback);
76
+ const url = this.url(params.txid + '/recipients');
77
+ return Promise.resolve(this.bitgo.get(url).result('recipients')).then(callback).catch(callback);
78
+ };
79
+ TravelRule.prototype.validateTravelInfo = function (info) {
80
+ const fields = {
81
+ amount: { type: 'number' },
82
+ toAddress: { type: 'string' },
83
+ toEnterprise: { type: 'string' },
84
+ fromUserName: { type: 'string' },
85
+ fromUserAccount: { type: 'string' },
86
+ fromUserAddress: { type: 'string' },
87
+ toUserName: { type: 'string' },
88
+ toUserAccount: { type: 'string' },
89
+ toUserAddress: { type: 'string' },
90
+ extra: { type: 'object' },
91
+ };
92
+ lodash_1.default.forEach(fields, function (field, fieldName) {
93
+ // No required fields yet -- should there be?
94
+ if (field.required) {
95
+ if (info[fieldName] === undefined) {
96
+ throw new Error('missing required field ' + fieldName + ' in travel info');
97
+ }
98
+ }
99
+ if (info[fieldName] && typeof info[fieldName] !== field.type) {
100
+ throw new Error('incorrect type for field ' + fieldName + ' in travel info, expected ' + field.type);
101
+ }
102
+ });
103
+ // Strip out any other fields we don't know about
104
+ const result = lodash_1.default.pick(info, lodash_1.default.keys(fields));
105
+ if (lodash_1.default.isEmpty(result)) {
106
+ throw new Error('empty travel data');
107
+ }
108
+ return result;
109
+ };
110
+ function validateTravelRuleDecryptParams(params = {}) {
111
+ const tx = params.tx;
112
+ if (!lodash_1.default.isObject(tx)) {
113
+ throw new Error('expecting tx param to be object');
114
+ }
115
+ if (!tx.receivedTravelInfo || !tx.receivedTravelInfo.length) {
116
+ return { tx, hdNode: undefined };
117
+ }
118
+ const keychain = params.keychain;
119
+ if (!lodash_1.default.isObject(keychain) || !lodash_1.default.isString(keychain.xprv)) {
120
+ throw new Error('expecting keychain param with xprv');
121
+ }
122
+ const hdNode = utxo_lib_1.bip32.fromBase58(keychain.xprv);
123
+ return { tx, hdNode };
124
+ }
125
+ function prepareTravelRuleParamsCommon(self, params) {
126
+ params = params || {};
127
+ params.txid = params.txid || params.hash;
128
+ sdk_core_1.common.validateParams(params, ['txid'], ['fromPrivateInfo']);
129
+ const txid = params.txid;
130
+ const recipient = params.recipient;
131
+ let travelInfo = params.travelInfo;
132
+ if (!recipient || !lodash_1.default.isObject(recipient)) {
133
+ throw new Error('invalid or missing recipient');
134
+ }
135
+ if (!travelInfo || !lodash_1.default.isObject(travelInfo)) {
136
+ throw new Error('invalid or missing travelInfo');
137
+ }
138
+ if (!params.noValidate) {
139
+ travelInfo = self.validateTravelInfo(travelInfo);
140
+ }
141
+ if (!travelInfo.toEnterprise && recipient.enterprise) {
142
+ travelInfo.toEnterprise = recipient.enterprise;
143
+ }
144
+ // If a key was not provided, create a new random key
145
+ let fromKey = params.fromKey && utxolib.ECPair.fromWIF(params.fromKey, (0, sdk_core_1.getNetwork)());
146
+ if (!fromKey) {
147
+ fromKey = (0, sdk_core_1.makeRandomKey)();
148
+ }
149
+ // Compute the shared key for encryption
150
+ const sharedSecret = (0, sdk_core_1.getSharedSecret)(fromKey, Buffer.from(recipient.pubKey, 'hex')).toString('hex');
151
+ // JSON-ify and encrypt the payload
152
+ const travelInfoJSON = JSON.stringify(travelInfo);
153
+ return {
154
+ txid,
155
+ recipient,
156
+ travelInfoJSON,
157
+ fromKey,
158
+ sharedSecret,
159
+ fromPrivateInfo: params.fromPrivateInfo,
160
+ };
161
+ }
162
+ function buildTravelRuleSendParams(prepared, encryptedTravelInfo) {
163
+ const result = {
164
+ txid: prepared.txid,
165
+ outputIndex: prepared.recipient.outputIndex,
166
+ toPubKey: prepared.recipient.pubKey,
167
+ fromPubKey: prepared.fromKey.publicKey.toString('hex'),
168
+ encryptedTravelInfo: encryptedTravelInfo,
169
+ fromPrivateInfo: undefined,
170
+ };
171
+ if (prepared.fromPrivateInfo) {
172
+ result.fromPrivateInfo = prepared.fromPrivateInfo;
173
+ }
174
+ return result;
175
+ }
176
+ /**
177
+ * Takes a transaction object as returned by getTransaction or listTransactions, along
178
+ * with a keychain (or hdnode object), and attempts to decrypt any encrypted travel
179
+ * info included in the transaction's receivedTravelInfo field.
180
+ * Parameters:
181
+ * tx: a transaction object
182
+ * keychain: keychain object (with xprv)
183
+ * Returns:
184
+ * the tx object, augmented with decrypted travelInfo fields
185
+ * Auto-detects v1 (SJCL) and v2 (Argon2id) envelopes.
186
+ */
187
+ TravelRule.prototype.decryptReceivedTravelInfo = async function (params = {}) {
188
+ const { tx, hdNode } = validateTravelRuleDecryptParams(params);
189
+ if (!hdNode) {
190
+ return tx;
191
+ }
192
+ for (const info of tx.receivedTravelInfo) {
193
+ const key = hdNode.derivePath((0, sdk_core_1.sanitizeLegacyPath)(info.toPubKeyPath));
194
+ const secret = (0, sdk_core_1.getSharedSecret)(key, Buffer.from(info.fromPubKey, 'hex')).toString('hex');
195
+ try {
196
+ const decrypted = await this.bitgo.decrypt({
197
+ input: info.encryptedTravelInfo,
198
+ password: secret,
199
+ });
200
+ info.travelInfo = JSON.parse(decrypted);
201
+ }
202
+ catch (err) {
203
+ console.error('failed to decrypt or parse travel info for ', info.transactionId + ':' + info.outputIndex);
204
+ }
205
+ }
206
+ return tx;
207
+ };
208
+ TravelRule.prototype.prepareParams = async function (params) {
209
+ const prepared = prepareTravelRuleParamsCommon(this, params);
210
+ const encryptedTravelInfo = await this.bitgo.encrypt({
211
+ input: prepared.travelInfoJSON,
212
+ password: prepared.sharedSecret,
213
+ encryptionVersion: params.encryptionVersion,
214
+ });
215
+ return buildTravelRuleSendParams(prepared, encryptedTravelInfo);
216
+ };
217
+ /**
218
+ * Send travel data to the server for a transaction
219
+ */
220
+ TravelRule.prototype.send = function (params, callback) {
221
+ params = params || {};
222
+ params.txid = params.txid || params.hash;
223
+ sdk_core_1.common.validateParams(params, ['txid', 'toPubKey', 'encryptedTravelInfo'], ['fromPubKey', 'fromPrivateInfo'], callback);
224
+ if (!lodash_1.default.isNumber(params.outputIndex)) {
225
+ throw new Error('invalid outputIndex');
226
+ }
227
+ return Promise.resolve(this.bitgo
228
+ .post(this.url(params.txid + '/' + params.outputIndex))
229
+ .send(params)
230
+ .result())
231
+ .then(callback)
232
+ .catch(callback);
233
+ };
234
+ /**
235
+ * Send multiple travel rule infos for the outputs of a single transaction.
236
+ * Parameters:
237
+ * - txid (or hash): txid of the transaction (must be a sender of the tx)
238
+ * - travelInfos: array of travelInfo objects which look like the following:
239
+ * {
240
+ * outputIndex: number, // tx output index
241
+ * fromUserName: string, // name of the sending user
242
+ * fromUserAccount: string, // account id of the sending user
243
+ * fromUserAddress: string, // mailing address of the sending user
244
+ * toUserName: string, // name of the receiving user
245
+ * toUserAccount: string, // account id of the receiving user
246
+ * toUserAddress: string // mailing address of the receiving user
247
+ * }
248
+ * All fields aside from outputIndex are optional, but at least one must
249
+ * be defined.
250
+ *
251
+ * It is not necessary to provide travelInfo for all output indices.
252
+ * End-to-end encryption of the travel info is handled automatically by this method.
253
+ *
254
+ */
255
+ TravelRule.prototype.sendMany = function (params, callback) {
256
+ params = params || {};
257
+ params.txid = params.txid || params.hash;
258
+ sdk_core_1.common.validateParams(params, ['txid'], callback);
259
+ const travelInfos = params.travelInfos;
260
+ if (!lodash_1.default.isArray(travelInfos)) {
261
+ throw new Error('expected parameter travelInfos to be array');
262
+ }
263
+ const self = this;
264
+ const travelInfoMap = (0, lodash_1.default)(travelInfos)
265
+ .keyBy('outputIndex')
266
+ .mapValues(function (travelInfo) {
267
+ return self.validateTravelInfo(travelInfo);
268
+ })
269
+ .value();
270
+ return self.getRecipients({ txid: params.txid }).then(async function (recipients) {
271
+ // Build up data to post
272
+ const sendParamsList = [];
273
+ // don't regenerate a new random key for each recipient
274
+ const fromKey = params.fromKey || (0, sdk_core_1.makeRandomKey)().toWIF();
275
+ for (const recipient of recipients) {
276
+ const outputIndex = recipient.outputIndex;
277
+ const info = travelInfoMap[outputIndex];
278
+ if (info) {
279
+ if (info.amount && info.amount !== recipient.amount) {
280
+ throw new Error('amount did not match for output index ' + outputIndex);
281
+ }
282
+ const sendParams = await self.prepareParams({
283
+ txid: params.txid,
284
+ recipient: recipient,
285
+ travelInfo: info,
286
+ fromKey: fromKey,
287
+ noValidate: true, // don't re-validate
288
+ });
289
+ sendParamsList.push(sendParams);
290
+ }
291
+ }
292
+ const result = {
293
+ matched: sendParamsList.length,
294
+ results: [],
295
+ };
296
+ const sendSerial = function () {
297
+ const sendParams = sendParamsList.shift();
298
+ if (!sendParams) {
299
+ return result;
300
+ }
301
+ return self
302
+ .send(sendParams)
303
+ .then(function (res) {
304
+ result.results.push({ result: res });
305
+ return sendSerial();
306
+ })
307
+ .catch(function (err) {
308
+ result.results.push({ error: err.toString() });
309
+ return sendSerial();
310
+ });
311
+ };
312
+ return sendSerial();
313
+ });
314
+ };
315
+ module.exports = TravelRule;
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVsUnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS90cmF2ZWxSdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLG9CQUFvQjtBQUNwQiwyQ0FBMkM7QUFDM0MsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBQ0YsOENBQXlHO0FBQ3pHLDhDQUF3RDtBQUN4RCx5REFBMkM7QUFDM0Msb0RBQXVCO0FBMkJ2QixFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUs7SUFDaEMsc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLFVBQVUsS0FBSztJQUN4QyxLQUFLLEdBQUcsS0FBSyxJQUFJLEVBQUUsQ0FBQztJQUNwQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxVQUFVLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQzdELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3pDLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdB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LEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDaEIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUNELE9BQU8sSUFBSTtpQkFDUixJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHO2dCQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsVUFBVSxHQUFHO2dCQUNsQixNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUMvQyxPQUFPLFVBQVUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO1FBRUYsT0FBTyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAaGlkZGVuXG4gKi9cblxuLyoqXG4gKi9cbi8vXG4vLyBUcmF2ZWxSdWxlIE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgZm9yIGEgc3BlY2lmaWMgZW50ZXJwcmlzZVxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5pbXBvcnQgeyBjb21tb24sIGdldE5ldHdvcmssIGdldFNoYXJlZFNlY3JldCwgbWFrZVJhbmRvbUtleSwgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbnRlcmZhY2UgUmVjZWl2ZWRUcmF2ZWxJbmZvRW50cnkge1xuICB0b1B1YktleVBhdGg6IHN0cmluZztcbiAgZnJvbVB1YktleTogc3RyaW5nO1xuICBlbmNyeXB0ZWRUcmF2ZWxJbmZvOiBzdHJpbmc7XG4gIHRyYXZlbEluZm86IHN0cmluZztcbiAgdHJhbnNhY3Rpb25JZDogc3RyaW5nO1xuICBvdXRwdXRJbmRleDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgRGVjcnlwdFJlY2VpdmVkVHJhdmVsUnVsZU9wdGlvbnMge1xuICB0eD86IHtcbiAgICByZWNlaXZlZFRyYXZlbEluZm8/OiBSZWNlaXZlZFRyYXZlbEluZm9FbnRyeVtdO1xuICB9O1xuICBrZXljaGFpbj86IHtcbiAgICB4cHJ2Pzogc3RyaW5nO1xuICB9O1xuICBoZG5vZGU/OiBCSVAzMkludGVyZmFjZTtcbn1cblxuaW50ZXJmYWNlIFJlY2lwaWVudCB7XG4gIGVudGVycHJpc2U6IHN0cmluZztcbiAgcHViS2V5OiBzdHJpbmc7XG4gIG91dHB1dEluZGV4OiBzdHJpbmc7XG59XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IFRyYXZlbFJ1bGUgPSBmdW5jdGlvbiAoYml0Z28pIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy5iaXRnbyA9IGJpdGdvO1xufTtcblxuVHJhdmVsUnVsZS5wcm90b3R5cGUudXJsID0gZnVuY3Rpb24gKGV4dHJhKSB7XG4gIGV4dHJhID0gZXh0cmEgfHwgJyc7XG4gIHJldHVybiB0aGlzLmJpdGdvLnVybCgnL3RyYXZlbC8nICsgZXh0cmEpO1xufTtcblxuLyoqXG4gKiBHZXQgYXZhaWxhYmxlIHRyYXZlbC1ydWxlIGluZm8gcmVjaXBpZW50cyBmb3IgYSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHBhcmFtc1xuICogIHR4aWQ6IHRyYW5zYWN0aW9uIGlkXG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHsqfVxuICovXG5UcmF2ZWxSdWxlLnByb3RvdHlwZS5nZXRSZWNpcGllbnRzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBwYXJhbXMudHhpZCA9IHBhcmFtcy50eGlkIHx8IHBhcmFtcy5oYXNoO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnXSwgW10sIGNhbGxiYWNrKTtcblxuICBjb25zdCB1cmwgPSB0aGlzLnVybChwYXJhbXMudHhpZCArICcvcmVjaXBpZW50cycpO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHVybCkucmVzdWx0KCdyZWNpcGllbnRzJykpLnRoZW4oY2FsbGJhY2spLmNhdGNoKGNhbGxiYWNrKTtcbn07XG5cblRyYXZlbFJ1bGUucHJvdG90eXBlLnZhbGlkYXRlVHJhdmVsSW5mbyA9IGZ1bmN0aW9uIChpbmZvKSB7XG4gIGNvbnN0IGZpZWxkcyA9IHtcbiAgICBhbW91bnQ6IHsgdHlwZTogJ251bWJlcicgfSxcbiAgICB0b0FkZHJlc3M6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICB0b0VudGVycHJpc2U6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICBmcm9tVXNlck5hbWU6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICBmcm9tVXNlckFjY291bnQ6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICBmcm9tVXNlckFkZHJlc3M6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICB0b1VzZXJOYW1lOiB7IHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgdG9Vc2VyQWNjb3VudDogeyB0eXBlOiAnc3RyaW5nJyB9LFxuICAgIHRvVXNlckFkZHJlc3M6IHsgdHlwZTogJ3N0cmluZycgfSxcbiAgICBleHRyYTogeyB0eXBlOiAnb2JqZWN0JyB9LFxuICB9O1xuXG4gIF8uZm9yRWFjaChmaWVsZHMsIGZ1bmN0aW9uIChmaWVsZDogYW55LCBmaWVsZE5hbWUpIHtcbiAgICAvLyBObyByZXF1aXJlZCBmaWVsZHMgeWV0IC0tIHNob3VsZCB0aGVyZSBiZT9cbiAgICBpZiAoZmllbGQucmVxdWlyZWQpIHtcbiAgICAgIGlmIChpbmZvW2ZpZWxkTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgZmllbGQgJyArIGZpZWxkTmFtZSArICcgaW4gdHJhdmVsIGluZm8nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluZm9bZmllbGROYW1lXSAmJiB0eXBlb2YgaW5mb1tmaWVsZE5hbWVdICE9PSBmaWVsZC50eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2luY29ycmVjdCB0eXBlIGZvciBmaWVsZCAnICsgZmllbGROYW1lICsgJyBpbiB0cmF2ZWwgaW5mbywgZXhwZWN0ZWQgJyArIGZpZWxkLnR5cGUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gU3RyaXAgb3V0IGFueSBvdGhlciBmaWVsZHMgd2UgZG9uJ3Qga25vdyBhYm91dFxuICBjb25zdCByZXN1bHQgPSBfLnBpY2soaW5mbywgXy5rZXlzKGZpZWxkcykpO1xuICBpZiAoXy5pc0VtcHR5KHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VtcHR5IHRyYXZlbCBkYXRhJyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmZ1bmN0aW9uIHZhbGlkYXRlVHJhdmVsUnVsZURlY3J5cHRQYXJhbXMocGFyYW1zOiBEZWNyeXB0UmVjZWl2ZWRUcmF2ZWxSdWxlT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHR4ID0gcGFyYW1zLnR4O1xuICBpZiAoIV8uaXNPYmplY3QodHgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RpbmcgdHggcGFyYW0gdG8gYmUgb2JqZWN0Jyk7XG4gIH1cblxuICBpZiAoIXR4LnJlY2VpdmVkVHJhdmVsSW5mbyB8fCAhdHgucmVjZWl2ZWRUcmF2ZWxJbmZvLmxlbmd0aCkge1xuICAgIHJldHVybiB7IHR4LCBoZE5vZGU6IHVuZGVmaW5lZCBhcyBCSVAzMkludGVyZmFjZSB8IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgY29uc3Qga2V5Y2hhaW4gPSBwYXJhbXMua2V5Y2hhaW47XG4gIGlmICghXy5pc09iamVjdChrZXljaGFpbikgfHwgIV8uaXNTdHJpbmcoa2V5Y2hhaW4ueHBydikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGluZyBrZXljaGFpbiBwYXJhbSB3aXRoIHhwcnYnKTtcbiAgfVxuICBjb25zdCBoZE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGtleWNoYWluLnhwcnYpO1xuICByZXR1cm4geyB0eCwgaGROb2RlIH07XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVUcmF2ZWxSdWxlUGFyYW1zQ29tbW9uKHNlbGY6IHsgdmFsaWRhdGVUcmF2ZWxJbmZvOiAoaW5mbzogYW55KSA9PiBhbnkgfSwgcGFyYW1zOiBhbnkpIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBwYXJhbXMudHhpZCA9IHBhcmFtcy50eGlkIHx8IHBhcmFtcy5oYXNoO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnXSwgWydmcm9tUHJpdmF0ZUluZm8nXSk7XG4gIGNvbnN0IHR4aWQgPSBwYXJhbXMudHhpZDtcbiAgY29uc3QgcmVjaXBpZW50OiBSZWNpcGllbnQgfCB1bmRlZmluZWQgPSBwYXJhbXMucmVjaXBpZW50O1xuICBsZXQgdHJhdmVsSW5mbyA9IHBhcmFtcy50cmF2ZWxJbmZvO1xuICBpZiAoIXJlY2lwaWVudCB8fCAhXy5pc09iamVjdChyZWNpcGllbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG9yIG1pc3NpbmcgcmVjaXBpZW50Jyk7XG4gIH1cbiAgaWYgKCF0cmF2ZWxJbmZvIHx8ICFfLmlzT2JqZWN0KHRyYXZlbEluZm8pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG9yIG1pc3NpbmcgdHJhdmVsSW5mbycpO1xuICB9XG4gIGlmICghcGFyYW1zLm5vVmFsaWRhdGUpIHtcbiAgICB0cmF2ZWxJbmZvID0gc2VsZi52YWxpZGF0ZVRyYXZlbEluZm8odHJhdmVsSW5mbyk7XG4gIH1cblxuICBpZiAoIXRyYXZlbEluZm8udG9FbnRlcnByaXNlICYmIHJlY2lwaWVudC5lbnRlcnByaXNlKSB7XG4gICAgdHJhdmVsSW5mby50b0VudGVycHJpc2UgPSByZWNpcGllbnQuZW50ZXJwcmlzZTtcbiAgfVxuXG4gIC8vIElmIGEga2V5IHdhcyBub3QgcHJvdmlkZWQsIGNyZWF0ZSBhIG5ldyByYW5kb20ga2V5XG4gIGxldCBmcm9tS2V5ID0gcGFyYW1zLmZyb21LZXkgJiYgdXR4b2xpYi5FQ1BhaXIuZnJvbVdJRihwYXJhbXMuZnJvbUtleSwgZ2V0TmV0d29yaygpIGFzIHV0eG9saWIuQml0Y29pbkpTTmV0d29yayk7XG4gIGlmICghZnJvbUtleSkge1xuICAgIGZyb21LZXkgPSBtYWtlUmFuZG9tS2V5KCk7XG4gIH1cblxuICAvLyBDb21wdXRlIHRoZSBzaGFyZWQga2V5IGZvciBlbmNyeXB0aW9uXG4gIGNvbnN0IHNoYXJlZFNlY3JldCA9IGdldFNoYXJlZFNlY3JldChmcm9tS2V5LCBCdWZmZXIuZnJvbShyZWNpcGllbnQucHViS2V5LCAnaGV4JykpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAvLyBKU09OLWlmeSBhbmQgZW5jcnlwdCB0aGUgcGF5bG9hZFxuICBjb25zdCB0cmF2ZWxJbmZvSlNPTiA9IEpTT04uc3RyaW5naWZ5KHRyYXZlbEluZm8pO1xuXG4gIHJldHVybiB7XG4gICAgdHhpZCxcbiAgICByZWNpcGllbnQsXG4gICAgdHJhdmVsSW5mb0pTT04sXG4gICAgZnJvbUtleSxcbiAgICBzaGFyZWRTZWNyZXQsXG4gICAgZnJvbVByaXZhdGVJbmZvOiBwYXJhbXMuZnJvbVByaXZhdGVJbmZvLFxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZFRyYXZlbFJ1bGVTZW5kUGFyYW1zKFxuICBwcmVwYXJlZDoge1xuICAgIHR4aWQ6IHN0cmluZztcbiAgICByZWNpcGllbnQ6IFJlY2lwaWVudDtcbiAgICBmcm9tS2V5OiB1dHhvbGliLkVDUGFpckludGVyZmFjZTtcbiAgICBmcm9tUHJpdmF0ZUluZm8/OiBzdHJpbmc7XG4gIH0sXG4gIGVuY3J5cHRlZFRyYXZlbEluZm86IHN0cmluZ1xuKSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICB0eGlkOiBwcmVwYXJlZC50eGlkLFxuICAgIG91dHB1dEluZGV4OiBwcmVwYXJlZC5yZWNpcGllbnQub3V0cHV0SW5kZXgsXG4gICAgdG9QdWJLZXk6IHByZXBhcmVkLnJlY2lwaWVudC5wdWJLZXksXG4gICAgZnJvbVB1YktleTogcHJlcGFyZWQuZnJvbUtleS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpLFxuICAgIGVuY3J5cHRlZFRyYXZlbEluZm86IGVuY3J5cHRlZFRyYXZlbEluZm8sXG4gICAgZnJvbVByaXZhdGVJbmZvOiB1bmRlZmluZWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB9O1xuXG4gIGlmIChwcmVwYXJlZC5mcm9tUHJpdmF0ZUluZm8pIHtcbiAgICByZXN1bHQuZnJvbVByaXZhdGVJbmZvID0gcHJlcGFyZWQuZnJvbVByaXZhdGVJbmZvO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIHRyYW5zYWN0aW9uIG9iamVjdCBhcyByZXR1cm5lZCBieSBnZXRUcmFuc2FjdGlvbiBvciBsaXN0VHJhbnNhY3Rpb25zLCBhbG9uZ1xuICogd2l0aCBhIGtleWNoYWluIChvciBoZG5vZGUgb2JqZWN0KSwgYW5kIGF0dGVtcHRzIHRvIGRlY3J5cHQgYW55IGVuY3J5cHRlZCB0cmF2ZWxcbiAqIGluZm8gaW5jbHVkZWQgaW4gdGhlIHRyYW5zYWN0aW9uJ3MgcmVjZWl2ZWRUcmF2ZWxJbmZvIGZpZWxkLlxuICogUGFyYW1ldGVyczpcbiAqICAgdHg6IGEgdHJhbnNhY3Rpb24gb2JqZWN0XG4gKiAgIGtleWNoYWluOiBrZXljaGFpbiBvYmplY3QgKHdpdGggeHBydilcbiAqIFJldHVybnM6XG4gKiAgIHRoZSB0eCBvYmplY3QsIGF1Z21lbnRlZCB3aXRoIGRlY3J5cHRlZCB0cmF2ZWxJbmZvIGZpZWxkc1xuICogQXV0by1kZXRlY3RzIHYxIChTSkNMKSBhbmQgdjIgKEFyZ29uMmlkKSBlbnZlbG9wZXMuXG4gKi9cblRyYXZlbFJ1bGUucHJvdG90eXBlLmRlY3J5cHRSZWNlaXZlZFRyYXZlbEluZm8gPSBhc3luYyBmdW5jdGlvbiAocGFyYW1zOiBEZWNyeXB0UmVjZWl2ZWRUcmF2ZWxSdWxlT3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IHsgdHgsIGhkTm9kZSB9ID0gdmFsaWRhdGVUcmF2ZWxSdWxlRGVjcnlwdFBhcmFtcyhwYXJhbXMpO1xuICBpZiAoIWhkTm9kZSkge1xuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIGZvciAoY29uc3QgaW5mbyBvZiB0eCEucmVjZWl2ZWRUcmF2ZWxJbmZvISkge1xuICAgIGNvbnN0IGtleSA9IGhkTm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChpbmZvLnRvUHViS2V5UGF0aCkpO1xuICAgIGNvbnN0IHNlY3JldCA9IGdldFNoYXJlZFNlY3JldChrZXksIEJ1ZmZlci5mcm9tKGluZm8uZnJvbVB1YktleSwgJ2hleCcpKS50b1N0cmluZygnaGV4Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgIGlucHV0OiBpbmZvLmVuY3J5cHRlZFRyYXZlbEluZm8sXG4gICAgICAgIHBhc3N3b3JkOiBzZWNyZXQsXG4gICAgICB9KTtcbiAgICAgIGluZm8udHJhdmVsSW5mbyA9IEpTT04ucGFyc2UoZGVjcnlwdGVkKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2ZhaWxlZCB0byBkZWNyeXB0IG9yIHBhcnNlIHRyYXZlbCBpbmZvIGZvciAnLCBpbmZvLnRyYW5zYWN0aW9uSWQgKyAnOicgKyBpbmZvLm91dHB1dEluZGV4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHg7XG59O1xuXG5UcmF2ZWxSdWxlLnByb3RvdHlwZS5wcmVwYXJlUGFyYW1zID0gYXN5bmMgZnVuY3Rpb24gKHBhcmFtcykge1xuICBjb25zdCBwcmVwYXJlZCA9IHByZXBhcmVUcmF2ZWxSdWxlUGFyYW1zQ29tbW9uKHRoaXMsIHBhcmFtcyk7XG4gIGNvbnN0IGVuY3J5cHRlZFRyYXZlbEluZm8gPSBhd2FpdCB0aGlzLmJpdGdvLmVuY3J5cHQoe1xuICAgIGlucHV0OiBwcmVwYXJlZC50cmF2ZWxJbmZvSlNPTixcbiAgICBwYXNzd29yZDogcHJlcGFyZWQuc2hhcmVkU2VjcmV0LFxuICAgIGVuY3J5cHRpb25WZXJzaW9uOiBwYXJhbXMuZW5jcnlwdGlvblZlcnNpb24sXG4gIH0pO1xuXG4gIHJldHVybiBidWlsZFRyYXZlbFJ1bGVTZW5kUGFyYW1zKHByZXBhcmVkLCBlbmNyeXB0ZWRUcmF2ZWxJbmZvKTtcbn07XG5cbi8qKlxuICogU2VuZCB0cmF2ZWwgZGF0YSB0byB0aGUgc2VydmVyIGZvciBhIHRyYW5zYWN0aW9uXG4gKi9cblRyYXZlbFJ1bGUucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIHBhcmFtcy50eGlkID0gcGFyYW1zLnR4aWQgfHwgcGFyYW1zLmhhc2g7XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhcbiAgICBwYXJhbXMsXG4gICAgWyd0eGlkJywgJ3RvUHViS2V5JywgJ2VuY3J5cHRlZFRyYXZlbEluZm8nXSxcbiAgICBbJ2Zyb21QdWJLZXknLCAnZnJvbVByaXZhdGVJbmZvJ10sXG4gICAgY2FsbGJhY2tcbiAgKTtcblxuICBpZiAoIV8uaXNOdW1iZXIocGFyYW1zLm91dHB1dEluZGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBvdXRwdXRJbmRleCcpO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLnVybChwYXJhbXMudHhpZCArICcvJyArIHBhcmFtcy5vdXRwdXRJbmRleCkpXG4gICAgICAuc2VuZChwYXJhbXMpXG4gICAgICAucmVzdWx0KClcbiAgKVxuICAgIC50aGVuKGNhbGxiYWNrKVxuICAgIC5jYXRjaChjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIFNlbmQgbXVsdGlwbGUgdHJhdmVsIHJ1bGUgaW5mb3MgZm9yIHRoZSBvdXRwdXRzIG9mIGEgc2luZ2xlIHRyYW5zYWN0aW9uLlxuICogUGFyYW1ldGVyczpcbiAqICAgLSB0eGlkIChvciBoYXNoKTogdHhpZCBvZiB0aGUgdHJhbnNhY3Rpb24gKG11c3QgYmUgYSBzZW5kZXIgb2YgdGhlIHR4KVxuICogICAtIHRyYXZlbEluZm9zOiBhcnJheSBvZiB0cmF2ZWxJbmZvIG9iamVjdHMgd2hpY2ggbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6XG4gKiAgICAge1xuICogICAgICAgb3V0cHV0SW5kZXg6IG51bWJlciwgICAgIC8vIHR4IG91dHB1dCBpbmRleFxuICogICAgICAgZnJvbVVzZXJOYW1lOiBzdHJpbmcsICAgIC8vIG5hbWUgb2YgdGhlIHNlbmRpbmcgdXNlclxuICogICAgICAgZnJvbVVzZXJBY2NvdW50OiBzdHJpbmcsIC8vIGFjY291bnQgaWQgb2YgdGhlIHNlbmRpbmcgdXNlclxuICogICAgICAgZnJvbVVzZXJBZGRyZXNzOiBzdHJpbmcsIC8vIG1haWxpbmcgYWRkcmVzcyBvZiB0aGUgc2VuZGluZyB1c2VyXG4gKiAgICAgICB0b1VzZXJOYW1lOiBzdHJpbmcsICAgICAgLy8gbmFtZSBvZiB0aGUgcmVjZWl2aW5nIHVzZXJcbiAqICAgICAgIHRvVXNlckFjY291bnQ6IHN0cmluZywgICAvLyBhY2NvdW50IGlkIG9mIHRoZSByZWNlaXZpbmcgdXNlclxuICogICAgICAgdG9Vc2VyQWRkcmVzczogc3RyaW5nICAgIC8vIG1haWxpbmcgYWRkcmVzcyBvZiB0aGUgcmVjZWl2aW5nIHVzZXJcbiAqICAgICB9XG4gKiAgICAgQWxsIGZpZWxkcyBhc2lkZSBmcm9tIG91dHB1dEluZGV4IGFyZSBvcHRpb25hbCwgYnV0IGF0IGxlYXN0IG9uZSBtdXN0XG4gKiAgICAgYmUgZGVmaW5lZC5cbiAqXG4gKiAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBwcm92aWRlIHRyYXZlbEluZm8gZm9yIGFsbCBvdXRwdXQgaW5kaWNlcy5cbiAqICBFbmQtdG8tZW5kIGVuY3J5cHRpb24gb2YgdGhlIHRyYXZlbCBpbmZvIGlzIGhhbmRsZWQgYXV0b21hdGljYWxseSBieSB0aGlzIG1ldGhvZC5cbiAqXG4gKi9cblRyYXZlbFJ1bGUucHJvdG90eXBlLnNlbmRNYW55ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBwYXJhbXMudHhpZCA9IHBhcmFtcy50eGlkIHx8IHBhcmFtcy5oYXNoO1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3R4aWQnXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IHRyYXZlbEluZm9zID0gcGFyYW1zLnRyYXZlbEluZm9zO1xuICBpZiAoIV8uaXNBcnJheSh0cmF2ZWxJbmZvcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkIHBhcmFtZXRlciB0cmF2ZWxJbmZvcyB0byBiZSBhcnJheScpO1xuICB9XG5cbiAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gIGNvbnN0IHRyYXZlbEluZm9NYXAgPSBfKHRyYXZlbEluZm9zKVxuICAgIC5rZXlCeSgnb3V0cHV0SW5kZXgnKVxuICAgIC5tYXBWYWx1ZXMoZnVuY3Rpb24gKHRyYXZlbEluZm8pIHtcbiAgICAgIHJldHVybiBzZWxmLnZhbGlkYXRlVHJhdmVsSW5mbyh0cmF2ZWxJbmZvKTtcbiAgICB9KVxuICAgIC52YWx1ZSgpO1xuXG4gIHJldHVybiBzZWxmLmdldFJlY2lwaWVudHMoeyB0eGlkOiBwYXJhbXMudHhpZCB9KS50aGVuKGFzeW5jIGZ1bmN0aW9uIChyZWNpcGllbnRzKSB7XG4gICAgLy8gQnVpbGQgdXAgZGF0YSB0byBwb3N0XG4gICAgY29uc3Qgc2VuZFBhcmFtc0xpc3Q6IGFueVtdID0gW107XG4gICAgLy8gZG9uJ3QgcmVnZW5lcmF0ZSBhIG5ldyByYW5kb20ga2V5IGZvciBlYWNoIHJlY2lwaWVudFxuICAgIGNvbnN0IGZyb21LZXkgPSBwYXJhbXMuZnJvbUtleSB8fCBtYWtlUmFuZG9tS2V5KCkudG9XSUYoKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBpZW50IG9mIHJlY2lwaWVudHMpIHtcbiAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gcmVjaXBpZW50Lm91dHB1dEluZGV4O1xuICAgICAgY29uc3QgaW5mbyA9IHRyYXZlbEluZm9NYXBbb3V0cHV0SW5kZXhdO1xuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8uYW1vdW50ICYmIGluZm8uYW1vdW50ICE9PSByZWNpcGllbnQuYW1vdW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbW91bnQgZGlkIG5vdCBtYXRjaCBmb3Igb3V0cHV0IGluZGV4ICcgKyBvdXRwdXRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VuZFBhcmFtcyA9IGF3YWl0IHNlbGYucHJlcGFyZVBhcmFtcyh7XG4gICAgICAgICAgdHhpZDogcGFyYW1zLnR4aWQsXG4gICAgICAgICAgcmVjaXBpZW50OiByZWNpcGllbnQsXG4gICAgICAgICAgdHJhdmVsSW5mbzogaW5mbyxcbiAgICAgICAgICBmcm9tS2V5OiBmcm9tS2V5LFxuICAgICAgICAgIG5vVmFsaWRhdGU6IHRydWUsIC8vIGRvbid0IHJlLXZhbGlkYXRlXG4gICAgICAgIH0pO1xuICAgICAgICBzZW5kUGFyYW1zTGlzdC5wdXNoKHNlbmRQYXJhbXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDoge1xuICAgICAgbWF0Y2hlZDogbnVtYmVyO1xuICAgICAgcmVzdWx0czoge1xuICAgICAgICByZXN1bHQ/OiBhbnk7XG4gICAgICAgIGVycm9yPzogc3RyaW5nO1xuICAgICAgfVtdO1xuICAgIH0gPSB7XG4gICAgICBtYXRjaGVkOiBzZW5kUGFyYW1zTGlzdC5sZW5ndGgsXG4gICAgICByZXN1bHRzOiBbXSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VuZFNlcmlhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNlbmRQYXJhbXMgPSBzZW5kUGFyYW1zTGlzdC5zaGlmdCgpO1xuICAgICAgaWYgKCFzZW5kUGFyYW1zKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZlxuICAgICAgICAuc2VuZChzZW5kUGFyYW1zKVxuICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdHMucHVzaCh7IHJlc3VsdDogcmVzIH0pO1xuICAgICAgICAgIHJldHVybiBzZW5kU2VyaWFsKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0LnJlc3VsdHMucHVzaCh7IGVycm9yOiBlcnIudG9TdHJpbmcoKSB9KTtcbiAgICAgICAgICByZXR1cm4gc2VuZFNlcmlhbCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNlbmRTZXJpYWwoKTtcbiAgfSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYXZlbFJ1bGU7XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { Network } from '@bitgo/utxo-lib';
2
+ /**
3
+ * Verify a Bitcoin address is a valid address
4
+ */
5
+ export declare function verifyAddress(address: any, network: Network): boolean;
6
+ //# sourceMappingURL=verifyAddress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAddress.d.ts","sourceRoot":"","sources":["../../../src/v1/verifyAddress.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,KAAA,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAOhE"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.verifyAddress = verifyAddress;
37
+ const utxolib = __importStar(require("@bitgo/utxo-lib"));
38
+ /**
39
+ * Verify a Bitcoin address is a valid address
40
+ */
41
+ function verifyAddress(address, network) {
42
+ try {
43
+ const script = utxolib.addressFormat.toOutputScriptTryFormats(address, network, undefined);
44
+ return address === utxolib.address.fromOutputScript(script, network);
45
+ }
46
+ catch (e) {
47
+ return false;
48
+ }
49
+ }
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyaWZ5QWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS92ZXJpZnlBZGRyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsc0NBT0M7QUFiRCx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQUMsT0FBTyxFQUFFLE9BQWdCO0lBQ3JELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRixPQUFPLE9BQU8sS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcblxuLyoqXG4gKiBWZXJpZnkgYSBCaXRjb2luIGFkZHJlc3MgaXMgYSB2YWxpZCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlBZGRyZXNzKGFkZHJlc3MsIG5ldHdvcms6IE5ldHdvcmspOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzY3JpcHQgPSB1dHhvbGliLmFkZHJlc3NGb3JtYXQudG9PdXRwdXRTY3JpcHRUcnlGb3JtYXRzKGFkZHJlc3MsIG5ldHdvcmssIHVuZGVmaW5lZCk7XG4gICAgcmV0dXJuIGFkZHJlc3MgPT09IHV0eG9saWIuYWRkcmVzcy5mcm9tT3V0cHV0U2NyaXB0KHNjcmlwdCwgbmV0d29yayk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @hidden
3
+ */
4
+ declare const Wallet: (bitgo: any, wallet: any) => void;
5
+ export = Wallet;
6
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/v1/wallet.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwDH,QAAA,MAAM,MAAM,mCAYX,CAAC;AAyjFF,SAAS,MAAM,CAAC"}