@bitgo/sdk-api 1.3.0-dev.0 → 1.4.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 (44) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/dist/package.json +20 -9
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +5 -5
  5. package/dist/src/bitgoAPI.d.ts +217 -6
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +588 -16
  8. package/dist/src/types.d.ts +109 -9
  9. package/dist/src/types.d.ts.map +1 -1
  10. package/dist/src/types.js +2 -14
  11. package/dist/src/util.d.ts +0 -8
  12. package/dist/src/util.d.ts.map +1 -1
  13. package/dist/src/util.js +2 -21
  14. package/dist/src/v1/blockchain.d.ts +5 -0
  15. package/dist/src/v1/blockchain.d.ts.map +1 -0
  16. package/dist/src/v1/blockchain.js +114 -0
  17. package/dist/src/v1/keychains.d.ts +5 -0
  18. package/dist/src/v1/keychains.d.ts.map +1 -0
  19. package/dist/src/v1/keychains.js +315 -0
  20. package/dist/src/v1/markets.d.ts +5 -0
  21. package/dist/src/v1/markets.d.ts.map +1 -0
  22. package/dist/src/v1/markets.js +63 -0
  23. package/dist/src/v1/pendingapproval.d.ts +6 -0
  24. package/dist/src/v1/pendingapproval.d.ts.map +1 -0
  25. package/dist/src/v1/pendingapproval.js +322 -0
  26. package/dist/src/v1/pendingapprovals.d.ts +6 -0
  27. package/dist/src/v1/pendingapprovals.d.ts.map +1 -0
  28. package/dist/src/v1/pendingapprovals.js +68 -0
  29. package/dist/src/v1/transactionBuilder.d.ts +5 -0
  30. package/dist/src/v1/transactionBuilder.d.ts.map +1 -0
  31. package/dist/src/v1/transactionBuilder.js +889 -0
  32. package/dist/src/v1/travelRule.d.ts +5 -0
  33. package/dist/src/v1/travelRule.d.ts.map +1 -0
  34. package/dist/src/v1/travelRule.js +257 -0
  35. package/dist/src/v1/wallet.d.ts +6 -0
  36. package/dist/src/v1/wallet.d.ts.map +1 -0
  37. package/dist/src/v1/wallet.js +2095 -0
  38. package/dist/src/v1/wallets.d.ts +5 -0
  39. package/dist/src/v1/wallets.d.ts.map +1 -0
  40. package/dist/src/v1/wallets.js +472 -0
  41. package/dist/web/main.js +1 -1
  42. package/dist/web/main.js.LICENSE.txt +41 -0
  43. package/package.json +20 -9
  44. package/dist/tsconfig.tsbuildinfo +0 -7006
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ /**
3
+ * @hidden
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ */
8
+ //
9
+ // Keychains Object
10
+ // BitGo accessor to a user's keychain.
11
+ //
12
+ // Copyright 2014, BitGo, Inc. All Rights Reserved.
13
+ //
14
+ const utxo_lib_1 = require("@bitgo/utxo-lib");
15
+ const crypto_1 = require("crypto");
16
+ const sdk_core_1 = require("@bitgo/sdk-core");
17
+ const _ = require('lodash');
18
+ const Bluebird = require("bluebird");
19
+ const co = Bluebird.coroutine;
20
+ //
21
+ // Constructor
22
+ //
23
+ const Keychains = function (bitgo) {
24
+ // @ts-expect-error - no implicit this
25
+ this.bitgo = bitgo;
26
+ };
27
+ //
28
+ // isValid
29
+ // Tests a xpub or xprv string to see if it is a valid keychain.
30
+ //
31
+ Keychains.prototype.isValid = function (params) {
32
+ params = params || {};
33
+ sdk_core_1.common.validateParams(params, [], []);
34
+ if (!_.isString(params.key) && !_.isObject(params.key)) {
35
+ throw new Error('key must be a string or object');
36
+ }
37
+ try {
38
+ if (!params.key.path) {
39
+ utxo_lib_1.bip32.fromBase58(params.key);
40
+ }
41
+ else {
42
+ utxo_lib_1.bip32.fromBase58(params.key.xpub).derivePath(sdk_core_1.sanitizeLegacyPath(params.key.path));
43
+ }
44
+ return true;
45
+ }
46
+ catch (e) {
47
+ return false;
48
+ }
49
+ };
50
+ //
51
+ // create
52
+ // Create a new keychain locally.
53
+ // Does not send the keychain to bitgo, only creates locally.
54
+ // If |seed| is provided, used to seed the keychain. Otherwise,
55
+ // a random keychain is created.
56
+ //
57
+ Keychains.prototype.create = function (params) {
58
+ params = params || {};
59
+ sdk_core_1.common.validateParams(params, [], []);
60
+ let seed;
61
+ if (!params.seed) {
62
+ // An extended private key has both a normal 256 bit private key and a 256
63
+ // bit chain code, both of which must be random. 512 bits is therefore the
64
+ // maximum entropy and gives us maximum security against cracking.
65
+ seed = crypto_1.randomBytes(512 / 8);
66
+ }
67
+ else {
68
+ seed = params.seed;
69
+ }
70
+ const extendedKey = utxo_lib_1.bip32.fromSeed(seed);
71
+ const xpub = extendedKey.neutered().toBase58();
72
+ let ethAddress;
73
+ try {
74
+ ethAddress = sdk_core_1.Util.xpubToEthAddress(xpub);
75
+ }
76
+ catch (e) {
77
+ // ethereum is unavailable
78
+ }
79
+ return {
80
+ xpub: xpub,
81
+ xprv: extendedKey.toBase58(),
82
+ ethAddress: ethAddress,
83
+ };
84
+ };
85
+ // used by deriveLocal
86
+ const apiResponse = function (status, result, message) {
87
+ const err = new Error(message);
88
+ err.status = status;
89
+ err.result = result;
90
+ return err;
91
+ };
92
+ //
93
+ // deriveLocal
94
+ // Locally derives a keychain from a top level BIP32 string, given a path.
95
+ //
96
+ Keychains.prototype.deriveLocal = function (params) {
97
+ params = params || {};
98
+ sdk_core_1.common.validateParams(params, ['path'], ['xprv', 'xpub']);
99
+ if (!params.xprv && !params.xpub) {
100
+ throw new Error('must provide an xpub or xprv for derivation.');
101
+ }
102
+ if (params.xprv && params.xpub) {
103
+ throw new Error('cannot provide both xpub and xprv');
104
+ }
105
+ let hdNode;
106
+ try {
107
+ hdNode = utxo_lib_1.bip32.fromBase58(params.xprv || params.xpub);
108
+ }
109
+ catch (e) {
110
+ throw apiResponse(400, {}, 'Unable to parse the xprv or xpub');
111
+ }
112
+ let derivedNode;
113
+ try {
114
+ derivedNode = hdNode.derivePath(sdk_core_1.sanitizeLegacyPath(params.path));
115
+ }
116
+ catch (e) {
117
+ throw apiResponse(400, {}, 'Unable to derive HD key from path');
118
+ }
119
+ const xpub = derivedNode.neutered().toBase58();
120
+ let ethAddress;
121
+ try {
122
+ ethAddress = sdk_core_1.Util.xpubToEthAddress(xpub);
123
+ }
124
+ catch (e) {
125
+ // ethereum is unavailable
126
+ }
127
+ return {
128
+ path: params.path,
129
+ xpub: xpub,
130
+ xprv: params.xprv && derivedNode.toBase58(),
131
+ ethAddress: ethAddress,
132
+ };
133
+ };
134
+ //
135
+ // list
136
+ // List the user's keychains
137
+ //
138
+ Keychains.prototype.list = function (params, callback) {
139
+ params = params || {};
140
+ sdk_core_1.common.validateParams(params, [], [], callback);
141
+ return Bluebird.resolve(this.bitgo.get(this.bitgo.url('/keychain')).result('keychains'))
142
+ .then(function (keychains) {
143
+ keychains.map(function (keychain) {
144
+ if (keychain.xpub &&
145
+ keychain.ethAddress &&
146
+ sdk_core_1.Util.xpubToEthAddress &&
147
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
148
+ throw new Error('ethAddress and xpub do not match');
149
+ }
150
+ });
151
+ return keychains;
152
+ })
153
+ .nodeify(callback);
154
+ };
155
+ /**
156
+ * iterates through all keys associated with the user, decrypts them with the old password and encrypts them with the
157
+ * new password
158
+ * @param params.oldPassword {String} - The old password used for encrypting the key
159
+ * @param params.newPassword {String} - The new password to be used for encrypting the key
160
+ * @param callback
161
+ * @returns result.keychains {Object} - e.g.:
162
+ * {
163
+ * xpub1: encryptedPrv1,
164
+ * xpub2: encryptedPrv2,
165
+ * ...
166
+ * }
167
+ * @returns result.version {Number}
168
+ */
169
+ Keychains.prototype.updatePassword = function (params, callback) {
170
+ return co(function* coUpdatePassword() {
171
+ sdk_core_1.common.validateParams(params, ['oldPassword', 'newPassword'], [], callback);
172
+ // @ts-expect-error - no implicit this
173
+ const encrypted = yield this.bitgo.post(this.bitgo.url('/user/encrypted')).result();
174
+ const newKeychains = {};
175
+ // @ts-expect-error - no implicit this
176
+ const self = this;
177
+ _.forOwn(encrypted.keychains, function keychainsForOwn(oldEncryptedXprv, xpub) {
178
+ try {
179
+ const decryptedPrv = self.bitgo.decrypt({ input: oldEncryptedXprv, password: params.oldPassword });
180
+ const newEncryptedPrv = self.bitgo.encrypt({ input: decryptedPrv, password: params.newPassword });
181
+ newKeychains[xpub] = newEncryptedPrv;
182
+ }
183
+ catch (e) {
184
+ // decrypting the keychain with the old password didn't work so we just keep it the way it is
185
+ newKeychains[xpub] = oldEncryptedXprv;
186
+ }
187
+ });
188
+ return { keychains: newKeychains, version: encrypted.version };
189
+ })
190
+ .call(this)
191
+ .asCallback(callback);
192
+ };
193
+ //
194
+ // add
195
+ // Add a new keychain
196
+ //
197
+ Keychains.prototype.add = function (params, callback) {
198
+ params = params || {};
199
+ sdk_core_1.common.validateParams(params, ['xpub'], ['encryptedXprv', 'type', 'isLedger'], callback);
200
+ return Bluebird.resolve(this.bitgo
201
+ .post(this.bitgo.url('/keychain'))
202
+ .send({
203
+ xpub: params.xpub,
204
+ encryptedXprv: params.encryptedXprv,
205
+ type: params.type,
206
+ originalPasscodeEncryptionCode: params.originalPasscodeEncryptionCode,
207
+ isLedger: params.isLedger,
208
+ })
209
+ .result())
210
+ .then(function (keychain) {
211
+ if (keychain.xpub &&
212
+ keychain.ethAddress &&
213
+ sdk_core_1.Util.xpubToEthAddress &&
214
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
215
+ throw new Error('ethAddress and xpub do not match');
216
+ }
217
+ return keychain;
218
+ })
219
+ .nodeify(callback);
220
+ };
221
+ //
222
+ // createBitGo
223
+ // Add a new BitGo server keychain
224
+ //
225
+ Keychains.prototype.createBitGo = function (params, callback) {
226
+ params = params || {};
227
+ sdk_core_1.common.validateParams(params, [], [], callback);
228
+ return Bluebird.resolve(this.bitgo.post(this.bitgo.url('/keychain/bitgo')).send(params).result())
229
+ .then(function (keychain) {
230
+ if (keychain.xpub &&
231
+ keychain.ethAddress &&
232
+ sdk_core_1.Util.xpubToEthAddress &&
233
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
234
+ throw new Error('ethAddress and xpub do not match');
235
+ }
236
+ return keychain;
237
+ })
238
+ .nodeify(callback);
239
+ };
240
+ //
241
+ // createBackup
242
+ // Create a new backup keychain through bitgo - often used for creating a keychain on a KRS
243
+ //
244
+ Keychains.prototype.createBackup = function (params, callback) {
245
+ params = params || {};
246
+ sdk_core_1.common.validateParams(params, ['provider'], [], callback);
247
+ return Bluebird.resolve(this.bitgo.post(this.bitgo.url('/keychain/backup')).send(params).result())
248
+ .then(function (keychain) {
249
+ // not all keychains have an xpub
250
+ if (keychain.xpub &&
251
+ keychain.ethAddress &&
252
+ sdk_core_1.Util.xpubToEthAddress &&
253
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
254
+ throw new Error('ethAddress and xpub do not match');
255
+ }
256
+ return keychain;
257
+ })
258
+ .nodeify(callback);
259
+ };
260
+ //
261
+ // get
262
+ // Fetch an existing keychain
263
+ // Parameters include:
264
+ // xpub: the xpub of the key to lookup (required)
265
+ //
266
+ Keychains.prototype.get = function (params, callback) {
267
+ params = params || {};
268
+ sdk_core_1.common.validateParams(params, [], ['xpub', 'ethAddress'], callback);
269
+ if (!params.xpub && !params.ethAddress) {
270
+ throw new Error('xpub or ethAddress must be defined');
271
+ }
272
+ const id = params.xpub || params.ethAddress;
273
+ return Bluebird.resolve(this.bitgo
274
+ .post(this.bitgo.url('/keychain/' + encodeURIComponent(id)))
275
+ .send({})
276
+ .result())
277
+ .then(function (keychain) {
278
+ if (keychain.xpub &&
279
+ keychain.ethAddress &&
280
+ sdk_core_1.Util.xpubToEthAddress &&
281
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
282
+ throw new Error('ethAddress and xpub do not match');
283
+ }
284
+ return keychain;
285
+ })
286
+ .nodeify(callback);
287
+ };
288
+ //
289
+ // update
290
+ // Update an existing keychain
291
+ // Parameters include:
292
+ // xpub: the xpub of the key to lookup (required)
293
+ //
294
+ Keychains.prototype.update = function (params, callback) {
295
+ params = params || {};
296
+ sdk_core_1.common.validateParams(params, ['xpub'], ['encryptedXprv'], callback);
297
+ return Bluebird.resolve(this.bitgo
298
+ .put(this.bitgo.url('/keychain/' + params.xpub))
299
+ .send({
300
+ encryptedXprv: params.encryptedXprv,
301
+ })
302
+ .result())
303
+ .then(function (keychain) {
304
+ if (keychain.xpub &&
305
+ keychain.ethAddress &&
306
+ sdk_core_1.Util.xpubToEthAddress &&
307
+ keychain.ethAddress !== sdk_core_1.Util.xpubToEthAddress(keychain.xpub)) {
308
+ throw new Error('ethAddress and xpub do not match');
309
+ }
310
+ return keychain;
311
+ })
312
+ .nodeify(callback);
313
+ };
314
+ module.exports = Keychains;
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixtQkFBbUI7QUFDbkIsdUNBQXVDO0FBQ3ZDLEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLDhDQUF3QztBQUN4QyxtQ0FBcUM7QUFDckMsOENBQW1FO0FBQ25FLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QixxQ0FBcUM7QUFDckMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUU5QixFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLFNBQVMsR0FBRyxVQUFVLEtBQUs7SUFDL0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixVQUFVO0FBQ1YsZ0VBQWdFO0FBQ2hFLEVBQUU7QUFDRixTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU07SUFDNUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ3BCLGdCQUFLLENBQUMsVUFBVSxDQUFD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ZW5cbiAqL1xuXG4vKipcbiAqL1xuLy9cbi8vIEtleWNoYWlucyBPYmplY3Rcbi8vIEJpdEdvIGFjY2Vzc29yIHRvIGEgdXNlcidzIGtleWNoYWluLlxuLy9cbi8vIENvcHlyaWdodCAyMDE0LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvL3V0eG8tbGliJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNvbW1vbiwgVXRpbCwgc2FuaXRpemVMZWdhY3lQYXRoIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmNvbnN0IF8gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcbmNvbnN0IGNvID0gQmx1ZWJpcmQuY29yb3V0aW5lO1xuXG4vL1xuLy8gQ29uc3RydWN0b3Jcbi8vXG5jb25zdCBLZXljaGFpbnMgPSBmdW5jdGlvbiAoYml0Z28pIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgdGhpcy5iaXRnbyA9IGJpdGdvO1xufTtcblxuLy9cbi8vIGlzVmFsaWRcbi8vIFRlc3RzIGEgeHB1YiBvciB4cHJ2IHN0cmluZyB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCBrZXljaGFpbi5cbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmlzVmFsaWQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICBpZiAoIV8uaXNTdHJpbmcocGFyYW1zLmtleSkgJiYgIV8uaXNPYmplY3QocGFyYW1zLmtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2tleSBtdXN0IGJlIGEgc3RyaW5nIG9yIG9iamVjdCcpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoIXBhcmFtcy5rZXkucGF0aCkge1xuICAgICAgYmlwMzIuZnJvbUJhc2U1OChwYXJhbXMua2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmlwMzIuZnJvbUJhc2U1OChwYXJhbXMua2V5LnhwdWIpLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhcmFtcy5rZXkucGF0aCkpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLy9cbi8vIGNyZWF0ZVxuLy8gQ3JlYXRlIGEgbmV3IGtleWNoYWluIGxvY2FsbHkuXG4vLyBEb2VzIG5vdCBzZW5kIHRoZSBrZXljaGFpbiB0byBiaXRnbywgb25seSBjcmVhdGVzIGxvY2FsbHkuXG4vLyBJZiB8c2VlZHwgaXMgcHJvdmlkZWQsIHVzZWQgdG8gc2VlZCB0aGUga2V5Y2hhaW4uICBPdGhlcndpc2UsXG4vLyBhIHJhbmRvbSBrZXljaGFpbiBpcyBjcmVhdGVkLlxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuY3JlYXRlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSk7XG5cbiAgbGV0IHNlZWQ7XG4gIGlmICghcGFyYW1zLnNlZWQpIHtcbiAgICAvLyBBbiBleHRlbmRlZCBwcml2YXRlIGtleSBoYXMgYm90aCBhIG5vcm1hbCAyNTYgYml0IHByaXZhdGUga2V5IGFuZCBhIDI1NlxuICAgIC8vIGJpdCBjaGFpbiBjb2RlLCBib3RoIG9mIHdoaWNoIG11c3QgYmUgcmFuZG9tLiA1MTIgYml0cyBpcyB0aGVyZWZvcmUgdGhlXG4gICAgLy8gbWF4aW11bSBlbnRyb3B5IGFuZCBnaXZlcyB1cyBtYXhpbXVtIHNlY3VyaXR5IGFnYWluc3QgY3JhY2tpbmcuXG4gICAgc2VlZCA9IHJhbmRvbUJ5dGVzKDUxMiAvIDgpO1xuICB9IGVsc2Uge1xuICAgIHNlZWQgPSBwYXJhbXMuc2VlZDtcbiAgfVxuXG4gIGNvbnN0IGV4dGVuZGVkS2V5ID0gYmlwMzIuZnJvbVNlZWQoc2VlZCk7XG4gIGNvbnN0IHhwdWIgPSBleHRlbmRlZEtleS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG5cbiAgbGV0IGV0aEFkZHJlc3M7XG4gIHRyeSB7XG4gICAgZXRoQWRkcmVzcyA9IFV0aWwueHB1YlRvRXRoQWRkcmVzcyh4cHViKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGV0aGVyZXVtIGlzIHVuYXZhaWxhYmxlXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHhwdWI6IHhwdWIsXG4gICAgeHBydjogZXh0ZW5kZWRLZXkudG9CYXNlNTgoKSxcbiAgICBldGhBZGRyZXNzOiBldGhBZGRyZXNzLFxuICB9O1xufTtcblxuLy8gdXNlZCBieSBkZXJpdmVMb2NhbFxuY29uc3QgYXBpUmVzcG9uc2UgPSBmdW5jdGlvbiAoc3RhdHVzLCByZXN1bHQsIG1lc3NhZ2UpIHtcbiAgY29uc3QgZXJyOiBhbnkgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIGVyci5zdGF0dXMgPSBzdGF0dXM7XG4gIGVyci5yZXN1bHQgPSByZXN1bHQ7XG4gIHJldHVybiBlcnI7XG59O1xuXG4vL1xuLy8gZGVyaXZlTG9jYWxcbi8vIExvY2FsbHkgZGVyaXZlcyBhIGtleWNoYWluIGZyb20gYSB0b3AgbGV2ZWwgQklQMzIgc3RyaW5nLCBnaXZlbiBhIHBhdGguXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5kZXJpdmVMb2NhbCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3BhdGgnXSwgWyd4cHJ2JywgJ3hwdWInXSk7XG5cbiAgaWYgKCFwYXJhbXMueHBydiAmJiAhcGFyYW1zLnhwdWIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgcHJvdmlkZSBhbiB4cHViIG9yIHhwcnYgZm9yIGRlcml2YXRpb24uJyk7XG4gIH1cbiAgaWYgKHBhcmFtcy54cHJ2ICYmIHBhcmFtcy54cHViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgcHJvdmlkZSBib3RoIHhwdWIgYW5kIHhwcnYnKTtcbiAgfVxuXG4gIGxldCBoZE5vZGU7XG4gIHRyeSB7XG4gICAgaGROb2RlID0gYmlwMzIuZnJvbUJhc2U1OChwYXJhbXMueHBydiB8fCBwYXJhbXMueHB1Yik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBhcGlSZXNwb25zZSg0MDAsIHt9LCAnVW5hYmxlIHRvIHBhcnNlIHRoZSB4cHJ2IG9yIHhwdWInKTtcbiAgfVxuXG4gIGxldCBkZXJpdmVkTm9kZTtcbiAgdHJ5IHtcbiAgICBkZXJpdmVkTm9kZSA9IGhkTm9kZS5kZXJpdmVQYXRoKHNhbml0aXplTGVnYWN5UGF0aChwYXJhbXMucGF0aCkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgYXBpUmVzcG9uc2UoNDAwLCB7fSwgJ1VuYWJsZSB0byBkZXJpdmUgSEQga2V5IGZyb20gcGF0aCcpO1xuICB9XG5cbiAgY29uc3QgeHB1YiA9IGRlcml2ZWROb2RlLm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICBsZXQgZXRoQWRkcmVzcztcbiAgdHJ5IHtcbiAgICBldGhBZGRyZXNzID0gVXRpbC54cHViVG9FdGhBZGRyZXNzKHhwdWIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZXRoZXJldW0gaXMgdW5hdmFpbGFibGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGF0aDogcGFyYW1zLnBhdGgsXG4gICAgeHB1YjogeHB1YixcbiAgICB4cHJ2OiBwYXJhbXMueHBydiAmJiBkZXJpdmVkTm9kZS50b0Jhc2U1OCgpLFxuICAgIGV0aEFkZHJlc3M6IGV0aEFkZHJlc3MsXG4gIH07XG59O1xuXG4vL1xuLy8gbGlzdFxuLy8gTGlzdCB0aGUgdXNlcidzIGtleWNoYWluc1xuLy9cbktleWNoYWlucy5wcm90b3R5cGUubGlzdCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby51cmwoJy9rZXljaGFpbicpKS5yZXN1bHQoJ2tleWNoYWlucycpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbnMpIHtcbiAgICAgIGtleWNoYWlucy5tYXAoZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXljaGFpbi54cHViICYmXG4gICAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgIT09IFV0aWwueHB1YlRvRXRoQWRkcmVzcyhrZXljaGFpbi54cHViKVxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGtleWNoYWlucztcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogaXRlcmF0ZXMgdGhyb3VnaCBhbGwga2V5cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGRlY3J5cHRzIHRoZW0gd2l0aCB0aGUgb2xkIHBhc3N3b3JkIGFuZCBlbmNyeXB0cyB0aGVtIHdpdGggdGhlXG4gKiBuZXcgcGFzc3dvcmRcbiAqIEBwYXJhbSBwYXJhbXMub2xkUGFzc3dvcmQge1N0cmluZ30gLSBUaGUgb2xkIHBhc3N3b3JkIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGtleVxuICogQHBhcmFtIHBhcmFtcy5uZXdQYXNzd29yZCB7U3RyaW5nfSAtIFRoZSBuZXcgcGFzc3dvcmQgdG8gYmUgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gKiBAcGFyYW0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHJlc3VsdC5rZXljaGFpbnMge09iamVjdH0gLSBlLmcuOlxuICogIHtcbiAqICAgIHhwdWIxOiBlbmNyeXB0ZWRQcnYxLFxuICogICAgeHB1YjI6IGVuY3J5cHRlZFBydjIsXG4gKiAgICAuLi5cbiAqICB9XG4gKiAgQHJldHVybnMgcmVzdWx0LnZlcnNpb24ge051bWJlcn1cbiAqL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS51cGRhdGVQYXNzd29yZCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiBjbyhmdW5jdGlvbiogY29VcGRhdGVQYXNzd29yZCgpIHtcbiAgICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ29sZFBhc3N3b3JkJywgJ25ld1Bhc3N3b3JkJ10sIFtdLCBjYWxsYmFjayk7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIG5vIGltcGxpY2l0IHRoaXNcbiAgICBjb25zdCBlbmNyeXB0ZWQgPSB5aWVsZCB0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby51cmwoJy91c2VyL2VuY3J5cHRlZCcpKS5yZXN1bHQoKTtcbiAgICBjb25zdCBuZXdLZXljaGFpbnMgPSB7fTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIF8uZm9yT3duKChlbmNyeXB0ZWQgYXMgYW55KS5rZXljaGFpbnMsIGZ1bmN0aW9uIGtleWNoYWluc0Zvck93bihvbGRFbmNyeXB0ZWRYcHJ2LCB4cHViKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkZWNyeXB0ZWRQcnYgPSBzZWxmLmJpdGdvLmRlY3J5cHQoeyBpbnB1dDogb2xkRW5jcnlwdGVkWHBydiwgcGFzc3dvcmQ6IHBhcmFtcy5vbGRQYXNzd29yZCB9KTtcbiAgICAgICAgY29uc3QgbmV3RW5jcnlwdGVkUHJ2ID0gc2VsZi5iaXRnby5lbmNyeXB0KHsgaW5wdXQ6IGRlY3J5cHRlZFBydiwgcGFzc3dvcmQ6IHBhcmFtcy5uZXdQYXNzd29yZCB9KTtcbiAgICAgICAgbmV3S2V5Y2hhaW5zW3hwdWJdID0gbmV3RW5jcnlwdGVkUHJ2O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBkZWNyeXB0aW5nIHRoZSBrZXljaGFpbiB3aXRoIHRoZSBvbGQgcGFzc3dvcmQgZGlkbid0IHdvcmsgc28gd2UganVzdCBrZWVwIGl0IHRoZSB3YXkgaXQgaXNcbiAgICAgICAgbmV3S2V5Y2hhaW5zW3hwdWJdID0gb2xkRW5jcnlwdGVkWHBydjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4geyBrZXljaGFpbnM6IG5ld0tleWNoYWlucywgdmVyc2lvbjogKGVuY3J5cHRlZCBhcyBhbnkpLnZlcnNpb24gfTtcbiAgfSlcbiAgICAuY2FsbCh0aGlzKVxuICAgIC5hc0NhbGxiYWNrKGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBhZGRcbi8vIEFkZCBhIG5ldyBrZXljaGFpblxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3hwdWInXSwgWydlbmNyeXB0ZWRYcHJ2JywgJ3R5cGUnLCAnaXNMZWRnZXInXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4nKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgeHB1YjogcGFyYW1zLnhwdWIsXG4gICAgICAgIGVuY3J5cHRlZFhwcnY6IHBhcmFtcy5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgICB0eXBlOiBwYXJhbXMudHlwZSxcbiAgICAgICAgb3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlOiBwYXJhbXMub3JpZ2luYWxQYXNzY29kZUVuY3J5cHRpb25Db2RlLFxuICAgICAgICBpc0xlZGdlcjogcGFyYW1zLmlzTGVkZ2VyLFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUJpdEdvXG4vLyBBZGQgYSBuZXcgQml0R28gc2VydmVyIGtleWNoYWluXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5jcmVhdGVCaXRHbyA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4vYml0Z28nKSkuc2VuZChwYXJhbXMpLnJlc3VsdCgpKVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgaWYgKFxuICAgICAgICBrZXljaGFpbi54cHViICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgJiZcbiAgICAgICAgVXRpbC54cHViVG9FdGhBZGRyZXNzICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgIT09IFV0aWwueHB1YlRvRXRoQWRkcmVzcyhrZXljaGFpbi54cHViKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXRoQWRkcmVzcyBhbmQgeHB1YiBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBjcmVhdGVCYWNrdXBcbi8vIENyZWF0ZSBhIG5ldyBiYWNrdXAga2V5Y2hhaW4gdGhyb3VnaCBiaXRnbyAtIG9mdGVuIHVzZWQgZm9yIGNyZWF0aW5nIGEga2V5Y2hhaW4gb24gYSBLUlNcbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmNyZWF0ZUJhY2t1cCA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWydwcm92aWRlciddLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluL2JhY2t1cCcpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICAvLyBub3QgYWxsIGtleWNoYWlucyBoYXZlIGFuIHhwdWJcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gZ2V0XG4vLyBGZXRjaCBhbiBleGlzdGluZyBrZXljaGFpblxuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICB4cHViOiAgdGhlIHhwdWIgb2YgdGhlIGtleSB0byBsb29rdXAgKHJlcXVpcmVkKVxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgWyd4cHViJywgJ2V0aEFkZHJlc3MnXSwgY2FsbGJhY2spO1xuXG4gIGlmICghcGFyYW1zLnhwdWIgJiYgIXBhcmFtcy5ldGhBZGRyZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd4cHViIG9yIGV0aEFkZHJlc3MgbXVzdCBiZSBkZWZpbmVkJyk7XG4gIH1cblxuICBjb25zdCBpZCA9IHBhcmFtcy54cHViIHx8IHBhcmFtcy5ldGhBZGRyZXNzO1xuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucG9zdCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluLycgKyBlbmNvZGVVUklDb21wb25lbnQoaWQpKSlcbiAgICAgIC5zZW5kKHt9KVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gdXBkYXRlXG4vLyBVcGRhdGUgYW4gZXhpc3Rpbmcga2V5Y2hhaW5cbi8vIFBhcmFtZXRlcnMgaW5jbHVkZTpcbi8vICAgeHB1YjogIHRoZSB4cHViIG9mIHRoZSBrZXkgdG8gbG9va3VwIChyZXF1aXJlZClcbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIChwYXJhbXMsIGNhbGxiYWNrKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgWyd4cHViJ10sIFsnZW5jcnlwdGVkWHBydiddLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnB1dCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluLycgKyBwYXJhbXMueHB1YikpXG4gICAgICAuc2VuZCh7XG4gICAgICAgIGVuY3J5cHRlZFhwcnY6IHBhcmFtcy5lbmNyeXB0ZWRYcHJ2LFxuICAgICAgfSlcbiAgICAgIC5yZXN1bHQoKVxuICApXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXljaGFpbnM7XG4iXX0=
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @hidden
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=markets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets.d.ts","sourceRoot":"","sources":["../../../src/v1/markets.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * @hidden
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ /**
7
+ */
8
+ //
9
+ // Markets Object
10
+ // BitGo accessor to Bitcoin market data.
11
+ //
12
+ // Copyright 2015, BitGo, Inc. All Rights Reserved.
13
+ //
14
+ const Bluebird = require("bluebird");
15
+ const sdk_core_1 = require("@bitgo/sdk-core");
16
+ //
17
+ // Constructor
18
+ //
19
+ const Markets = function (bitgo) {
20
+ // @ts-expect-error - no implicit this
21
+ this.bitgo = bitgo;
22
+ };
23
+ /**
24
+ * Get the latest bitcoin price data
25
+ * @param params {}
26
+ * @param callback
27
+ * @returns {*} an object containing price and volume data from the
28
+ * current day in a number of currencies
29
+ **/
30
+ Markets.prototype.latest = function (params, callback) {
31
+ params = params || {};
32
+ sdk_core_1.common.validateParams(params, [], [], callback);
33
+ return Bluebird.resolve(this.bitgo.get(this.bitgo.url('/market/latest')).result()).nodeify(callback);
34
+ };
35
+ /**
36
+ * Get yesterday's bitcoin price data
37
+ * @param params {}
38
+ * @param callback
39
+ * @returns {*} an object containing price and volume data from the
40
+ * previous day in a number of currencies
41
+ */
42
+ Markets.prototype.yesterday = function (params, callback) {
43
+ params = params || {};
44
+ sdk_core_1.common.validateParams(params, [], [], callback);
45
+ return Bluebird.resolve(this.bitgo.get(this.bitgo.url('/market/yesterday')).result()).nodeify(callback);
46
+ };
47
+ /**
48
+ * Get bitcoin price data from up to 90 days prior to today
49
+ * @param params { currencyName: the code for the desired currency, for example USD }
50
+ * @param callback
51
+ * @returns {*} an object containing average prices from a number of previous days
52
+ */
53
+ Markets.prototype.lastDays = function (params, callback) {
54
+ params = params || {};
55
+ sdk_core_1.common.validateParams(params, ['currencyName'], [], callback);
56
+ const days = !isNaN(parseInt(params.days, 10)) ? parseInt(params.days, 10) : 90;
57
+ if (days && days < 0) {
58
+ throw new Error('must use a non-negative number of days');
59
+ }
60
+ return Bluebird.resolve(this.bitgo.get(this.bitgo.url('/market/last/' + days + '/' + params.currencyName)).result()).nodeify(callback);
61
+ };
62
+ module.exports = Markets;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2V0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92MS9tYXJrZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7QUFFSDtHQUNHO0FBQ0gsRUFBRTtBQUNGLGlCQUFpQjtBQUNqQix5Q0FBeUM7QUFDekMsRUFBRTtBQUNGLG9EQUFvRDtBQUNwRCxFQUFFO0FBRUYscUNBQXFDO0FBRXJDLDhDQUF5QztBQUV6QyxFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUs7SUFDN0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGOzs7Ozs7SUFNSTtBQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQVUsTUFBTSxFQUFFLFFBQVE7SUFDbkQsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2RyxDQUFDLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3RELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUcsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUFVLE1BQU0sRUFBRSxRQUFRO0lBQ3JELE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RCLGlCQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU5RCxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBRWhGLElBQUksSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0tBQzNEO0lBRUQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUNyQixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FDNUYsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBoaWRkZW5cbiAqL1xuXG4vKipcbiAqL1xuLy9cbi8vIE1hcmtldHMgT2JqZWN0XG4vLyBCaXRHbyBhY2Nlc3NvciB0byBCaXRjb2luIG1hcmtldCBkYXRhLlxuLy9cbi8vIENvcHlyaWdodCAyMDE1LCBCaXRHbywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vXG5cbmltcG9ydCAqIGFzIEJsdWViaXJkIGZyb20gJ2JsdWViaXJkJztcblxuaW1wb3J0IHsgY29tbW9uIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcblxuLy9cbi8vIENvbnN0cnVjdG9yXG4vL1xuY29uc3QgTWFya2V0cyA9IGZ1bmN0aW9uIChiaXRnbykge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLmJpdGdvID0gYml0Z287XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGF0ZXN0IGJpdGNvaW4gcHJpY2UgZGF0YVxuICogQHBhcmFtIHBhcmFtcyB7fVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJpY2UgYW5kIHZvbHVtZSBkYXRhIGZyb20gdGhlXG4gKiBjdXJyZW50IGRheSBpbiBhIG51bWJlciBvZiBjdXJyZW5jaWVzXG4gKiovXG5NYXJrZXRzLnByb3RvdHlwZS5sYXRlc3QgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbXSwgY2FsbGJhY2spO1xuXG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28udXJsKCcvbWFya2V0L2xhdGVzdCcpKS5yZXN1bHQoKSkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEdldCB5ZXN0ZXJkYXkncyBiaXRjb2luIHByaWNlIGRhdGFcbiAqIEBwYXJhbSBwYXJhbXMge31cbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgeyp9IGFuIG9iamVjdCBjb250YWluaW5nIHByaWNlIGFuZCB2b2x1bWUgZGF0YSBmcm9tIHRoZVxuICogcHJldmlvdXMgZGF5IGluIGEgbnVtYmVyIG9mIGN1cnJlbmNpZXNcbiAqL1xuTWFya2V0cy5wcm90b3R5cGUueWVzdGVyZGF5ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL21hcmtldC95ZXN0ZXJkYXknKSkucmVzdWx0KCkpLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBHZXQgYml0Y29pbiBwcmljZSBkYXRhIGZyb20gdXAgdG8gOTAgZGF5cyBwcmlvciB0byB0b2RheVxuICogQHBhcmFtIHBhcmFtcyB7IGN1cnJlbmN5TmFtZTogdGhlIGNvZGUgZm9yIHRoZSBkZXNpcmVkIGN1cnJlbmN5LCBmb3IgZXhhbXBsZSBVU0QgfVxuICogQHBhcmFtIGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Kn0gYW4gb2JqZWN0IGNvbnRhaW5pbmcgYXZlcmFnZSBwcmljZXMgZnJvbSBhIG51bWJlciBvZiBwcmV2aW91cyBkYXlzXG4gKi9cbk1hcmtldHMucHJvdG90eXBlLmxhc3REYXlzID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ2N1cnJlbmN5TmFtZSddLCBbXSwgY2FsbGJhY2spO1xuXG4gIGNvbnN0IGRheXMgPSAhaXNOYU4ocGFyc2VJbnQocGFyYW1zLmRheXMsIDEwKSkgPyBwYXJzZUludChwYXJhbXMuZGF5cywgMTApIDogOTA7XG5cbiAgaWYgKGRheXMgJiYgZGF5cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ211c3QgdXNlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciBvZiBkYXlzJyk7XG4gIH1cblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL21hcmtldC9sYXN0LycgKyBkYXlzICsgJy8nICsgcGFyYW1zLmN1cnJlbmN5TmFtZSkpLnJlc3VsdCgpXG4gICkubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hcmtldHM7XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @hidden
3
+ */
4
+ declare const PendingApproval: (bitgo: any, pendingApproval: any, wallet: any) => void;
5
+ export = PendingApproval;
6
+ //# sourceMappingURL=pendingapproval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pendingapproval.d.ts","sourceRoot":"","sources":["../../../src/v1/pendingapproval.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,QAAA,MAAM,eAAe,yDAOpB,CAAC;AAiVF,SAAS,eAAe,CAAC"}