@bitgo/sdk-api 1.3.0-dev.1 → 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.
- package/CHANGELOG.md +170 -0
- package/dist/package.json +20 -9
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +5 -5
- package/dist/src/bitgoAPI.d.ts +217 -6
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +588 -16
- package/dist/src/types.d.ts +109 -9
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +2 -14
- package/dist/src/util.d.ts +0 -8
- package/dist/src/util.d.ts.map +1 -1
- package/dist/src/util.js +2 -21
- package/dist/src/v1/blockchain.d.ts +5 -0
- package/dist/src/v1/blockchain.d.ts.map +1 -0
- package/dist/src/v1/blockchain.js +114 -0
- package/dist/src/v1/keychains.d.ts +5 -0
- package/dist/src/v1/keychains.d.ts.map +1 -0
- package/dist/src/v1/keychains.js +315 -0
- package/dist/src/v1/markets.d.ts +5 -0
- package/dist/src/v1/markets.d.ts.map +1 -0
- package/dist/src/v1/markets.js +63 -0
- package/dist/src/v1/pendingapproval.d.ts +6 -0
- package/dist/src/v1/pendingapproval.d.ts.map +1 -0
- package/dist/src/v1/pendingapproval.js +322 -0
- package/dist/src/v1/pendingapprovals.d.ts +6 -0
- package/dist/src/v1/pendingapprovals.d.ts.map +1 -0
- package/dist/src/v1/pendingapprovals.js +68 -0
- package/dist/src/v1/transactionBuilder.d.ts +5 -0
- package/dist/src/v1/transactionBuilder.d.ts.map +1 -0
- package/dist/src/v1/transactionBuilder.js +889 -0
- package/dist/src/v1/travelRule.d.ts +5 -0
- package/dist/src/v1/travelRule.d.ts.map +1 -0
- package/dist/src/v1/travelRule.js +257 -0
- package/dist/src/v1/wallet.d.ts +6 -0
- package/dist/src/v1/wallet.d.ts.map +1 -0
- package/dist/src/v1/wallet.js +2095 -0
- package/dist/src/v1/wallets.d.ts +5 -0
- package/dist/src/v1/wallets.d.ts.map +1 -0
- package/dist/src/v1/wallets.js +472 -0
- package/dist/web/main.js +1 -1
- package/dist/web/main.js.LICENSE.txt +41 -0
- package/package.json +20 -9
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|