@bitgo/sdk-api 1.1.0-rc.7 → 1.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.
- package/CHANGELOG.md +225 -0
- package/dist/package.json +27 -20
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +5 -5
- package/dist/src/bitgoAPI.d.ts +228 -6
- package/dist/src/bitgoAPI.d.ts.map +1 -1
- package/dist/src/bitgoAPI.js +597 -15
- package/dist/src/types.d.ts +83 -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 +27 -20
- package/dist/src/bip32path.d.ts +0 -24
- package/dist/src/bip32path.d.ts.map +0 -1
- package/dist/src/bip32path.js +0 -45
- package/dist/tsconfig.tsbuildinfo +0 -6755
- package/dist/web/browser.html +0 -1
|
@@ -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 bip32 = require("bip32");
|
|
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
|
+
bip32.fromBase58(params.key);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
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 = 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 = 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Y2hhaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3YxL2tleWNoYWlucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUg7R0FDRztBQUNILEVBQUU7QUFDRixtQkFBbUI7QUFDbkIsdUNBQXVDO0FBQ3ZDLEVBQUU7QUFDRixvREFBb0Q7QUFDcEQsRUFBRTtBQUVGLCtCQUErQjtBQUMvQixtQ0FBcUM7QUFDckMsOENBQW1FO0FBQ25FLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM1QixxQ0FBcUM7QUFDckMsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUU5QixFQUFFO0FBQ0YsY0FBYztBQUNkLEVBQUU7QUFDRixNQUFNLFNBQVMsR0FBRyxVQUFVLEtBQUs7SUFDL0Isc0NBQXNDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLENBQUMsQ0FBQztBQUVGLEVBQUU7QUFDRixVQUFVO0FBQ1YsZ0VBQWdFO0FBQ2hFLEVBQUU7QUFDRixTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUFVLE1BQU07SUFDNUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEIsaUJBQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUV0QyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFO1lBQ3BCLEtBQUssQ0FBQyxVQUFVLENBQUMs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ICovXG5cbi8qKlxuICovXG4vL1xuLy8gS2V5Y2hhaW5zIE9iamVjdFxuLy8gQml0R28gYWNjZXNzb3IgdG8gYSB1c2VyJ3Mga2V5Y2hhaW4uXG4vL1xuLy8gQ29weXJpZ2h0IDIwMTQsIEJpdEdvLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy9cblxuaW1wb3J0ICogYXMgYmlwMzIgZnJvbSAnYmlwMzInO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY29tbW9uLCBVdGlsLCBzYW5pdGl6ZUxlZ2FjeVBhdGggfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuY29uc3QgXyA9IHJlcXVpcmUoJ2xvZGFzaCcpO1xuaW1wb3J0ICogYXMgQmx1ZWJpcmQgZnJvbSAnYmx1ZWJpcmQnO1xuY29uc3QgY28gPSBCbHVlYmlyZC5jb3JvdXRpbmU7XG5cbi8vXG4vLyBDb25zdHJ1Y3RvclxuLy9cbmNvbnN0IEtleWNoYWlucyA9IGZ1bmN0aW9uIChiaXRnbykge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICB0aGlzLmJpdGdvID0gYml0Z287XG59O1xuXG4vL1xuLy8gaXNWYWxpZFxuLy8gVGVzdHMgYSB4cHViIG9yIHhwcnYgc3RyaW5nIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIGtleWNoYWluLlxuLy9cbktleWNoYWlucy5wcm90b3R5cGUuaXNWYWxpZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10pO1xuXG4gIGlmICghXy5pc1N0cmluZyhwYXJhbXMua2V5KSAmJiAhXy5pc09iamVjdChwYXJhbXMua2V5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcigna2V5IG11c3QgYmUgYSBzdHJpbmcgb3Igb2JqZWN0Jyk7XG4gIH1cblxuICB0cnkge1xuICAgIGlmICghcGFyYW1zLmtleS5wYXRoKSB7XG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy5rZXkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy5rZXkueHB1YikuZGVyaXZlUGF0aChzYW5pdGl6ZUxlZ2FjeVBhdGgocGFyYW1zLmtleS5wYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vL1xuLy8gY3JlYXRlXG4vLyBDcmVhdGUgYSBuZXcga2V5Y2hhaW4gbG9jYWxseS5cbi8vIERvZXMgbm90IHNlbmQgdGhlIGtleWNoYWluIHRvIGJpdGdvLCBvbmx5IGNyZWF0ZXMgbG9jYWxseS5cbi8vIElmIHxzZWVkfCBpcyBwcm92aWRlZCwgdXNlZCB0byBzZWVkIHRoZSBrZXljaGFpbi4gIE90aGVyd2lzZSxcbi8vIGEgcmFuZG9tIGtleWNoYWluIGlzIGNyZWF0ZWQuXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5jcmVhdGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gIHBhcmFtcyA9IHBhcmFtcyB8fCB7fTtcbiAgY29tbW9uLnZhbGlkYXRlUGFyYW1zKHBhcmFtcywgW10sIFtdKTtcblxuICBsZXQgc2VlZDtcbiAgaWYgKCFwYXJhbXMuc2VlZCkge1xuICAgIC8vIEFuIGV4dGVuZGVkIHByaXZhdGUga2V5IGhhcyBib3RoIGEgbm9ybWFsIDI1NiBiaXQgcHJpdmF0ZSBrZXkgYW5kIGEgMjU2XG4gICAgLy8gYml0IGNoYWluIGNvZGUsIGJvdGggb2Ygd2hpY2ggbXVzdCBiZSByYW5kb20uIDUxMiBiaXRzIGlzIHRoZXJlZm9yZSB0aGVcbiAgICAvLyBtYXhpbXVtIGVudHJvcHkgYW5kIGdpdmVzIHVzIG1heGltdW0gc2VjdXJpdHkgYWdhaW5zdCBjcmFja2luZy5cbiAgICBzZWVkID0gcmFuZG9tQnl0ZXMoNTEyIC8gOCk7XG4gIH0gZWxzZSB7XG4gICAgc2VlZCA9IHBhcmFtcy5zZWVkO1xuICB9XG5cbiAgY29uc3QgZXh0ZW5kZWRLZXkgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgY29uc3QgeHB1YiA9IGV4dGVuZGVkS2V5Lm5ldXRlcmVkKCkudG9CYXNlNTgoKTtcblxuICBsZXQgZXRoQWRkcmVzcztcbiAgdHJ5IHtcbiAgICBldGhBZGRyZXNzID0gVXRpbC54cHViVG9FdGhBZGRyZXNzKHhwdWIpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gZXRoZXJldW0gaXMgdW5hdmFpbGFibGVcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeHB1YjogeHB1YixcbiAgICB4cHJ2OiBleHRlbmRlZEtleS50b0Jhc2U1OCgpLFxuICAgIGV0aEFkZHJlc3M6IGV0aEFkZHJlc3MsXG4gIH07XG59O1xuXG4vLyB1c2VkIGJ5IGRlcml2ZUxvY2FsXG5jb25zdCBhcGlSZXNwb25zZSA9IGZ1bmN0aW9uIChzdGF0dXMsIHJlc3VsdCwgbWVzc2FnZSkge1xuICBjb25zdCBlcnI6IGFueSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyLnN0YXR1cyA9IHN0YXR1cztcbiAgZXJyLnJlc3VsdCA9IHJlc3VsdDtcbiAgcmV0dXJuIGVycjtcbn07XG5cbi8vXG4vLyBkZXJpdmVMb2NhbFxuLy8gTG9jYWxseSBkZXJpdmVzIGEga2V5Y2hhaW4gZnJvbSBhIHRvcCBsZXZlbCBCSVAzMiBzdHJpbmcsIGdpdmVuIGEgcGF0aC5cbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmRlcml2ZUxvY2FsID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsncGF0aCddLCBbJ3hwcnYnLCAneHB1YiddKTtcblxuICBpZiAoIXBhcmFtcy54cHJ2ICYmICFwYXJhbXMueHB1Yikge1xuICAgIHRocm93IG5ldyBFcnJvcignbXVzdCBwcm92aWRlIGFuIHhwdWIgb3IgeHBydiBmb3IgZGVyaXZhdGlvbi4nKTtcbiAgfVxuICBpZiAocGFyYW1zLnhwcnYgJiYgcGFyYW1zLnhwdWIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2Nhbm5vdCBwcm92aWRlIGJvdGggeHB1YiBhbmQgeHBydicpO1xuICB9XG5cbiAgbGV0IGhkTm9kZTtcbiAgdHJ5IHtcbiAgICBoZE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KHBhcmFtcy54cHJ2IHx8IHBhcmFtcy54cHViKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IGFwaVJlc3BvbnNlKDQwMCwge30sICdVbmFibGUgdG8gcGFyc2UgdGhlIHhwcnYgb3IgeHB1YicpO1xuICB9XG5cbiAgbGV0IGRlcml2ZWROb2RlO1xuICB0cnkge1xuICAgIGRlcml2ZWROb2RlID0gaGROb2RlLmRlcml2ZVBhdGgoc2FuaXRpemVMZWdhY3lQYXRoKHBhcmFtcy5wYXRoKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBhcGlSZXNwb25zZSg0MDAsIHt9LCAnVW5hYmxlIHRvIGRlcml2ZSBIRCBrZXkgZnJvbSBwYXRoJyk7XG4gIH1cblxuICBjb25zdCB4cHViID0gZGVyaXZlZE5vZGUubmV1dGVyZWQoKS50b0Jhc2U1OCgpO1xuXG4gIGxldCBldGhBZGRyZXNzO1xuICB0cnkge1xuICAgIGV0aEFkZHJlc3MgPSBVdGlsLnhwdWJUb0V0aEFkZHJlc3MoeHB1Yik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBldGhlcmV1bSBpcyB1bmF2YWlsYWJsZVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBwYXJhbXMucGF0aCxcbiAgICB4cHViOiB4cHViLFxuICAgIHhwcnY6IHBhcmFtcy54cHJ2ICYmIGRlcml2ZWROb2RlLnRvQmFzZTU4KCksXG4gICAgZXRoQWRkcmVzczogZXRoQWRkcmVzcyxcbiAgfTtcbn07XG5cbi8vXG4vLyBsaXN0XG4vLyBMaXN0IHRoZSB1c2VyJ3Mga2V5Y2hhaW5zXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5saXN0ID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLmdldCh0aGlzLmJpdGdvLnVybCgnL2tleWNoYWluJykpLnJlc3VsdCgna2V5Y2hhaW5zJykpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWlucykge1xuICAgICAga2V5Y2hhaW5zLm1hcChmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgICAgVXRpbC54cHViVG9FdGhBZGRyZXNzICYmXG4gICAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXRoQWRkcmVzcyBhbmQgeHB1YiBkbyBub3QgbWF0Y2gnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ga2V5Y2hhaW5zO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLyoqXG4gKiBpdGVyYXRlcyB0aHJvdWdoIGFsbCBrZXlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciwgZGVjcnlwdHMgdGhlbSB3aXRoIHRoZSBvbGQgcGFzc3dvcmQgYW5kIGVuY3J5cHRzIHRoZW0gd2l0aCB0aGVcbiAqIG5ldyBwYXNzd29yZFxuICogQHBhcmFtIHBhcmFtcy5vbGRQYXNzd29yZCB7U3RyaW5nfSAtIFRoZSBvbGQgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGluZyB0aGUga2V5XG4gKiBAcGFyYW0gcGFyYW1zLm5ld1Bhc3N3b3JkIHtTdHJpbmd9IC0gVGhlIG5ldyBwYXNzd29yZCB0byBiZSB1c2VkIGZvciBlbmNyeXB0aW5nIHRoZSBrZXlcbiAqIEBwYXJhbSBjYWxsYmFja1xuICogQHJldHVybnMgcmVzdWx0LmtleWNoYWlucyB7T2JqZWN0fSAtIGUuZy46XG4gKiAge1xuICogICAgeHB1YjE6IGVuY3J5cHRlZFBydjEsXG4gKiAgICB4cHViMjogZW5jcnlwdGVkUHJ2MixcbiAqICAgIC4uLlxuICogIH1cbiAqICBAcmV0dXJucyByZXN1bHQudmVyc2lvbiB7TnVtYmVyfVxuICovXG5LZXljaGFpbnMucHJvdG90eXBlLnVwZGF0ZVBhc3N3b3JkID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcmV0dXJuIGNvKGZ1bmN0aW9uKiBjb1VwZGF0ZVBhc3N3b3JkKCkge1xuICAgIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsnb2xkUGFzc3dvcmQnLCAnbmV3UGFzc3dvcmQnXSwgW10sIGNhbGxiYWNrKTtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gbm8gaW1wbGljaXQgdGhpc1xuICAgIGNvbnN0IGVuY3J5cHRlZCA9IHlpZWxkIHRoaXMuYml0Z28ucG9zdCh0aGlzLmJpdGdvLnVybCgnL3VzZXIvZW5jcnlwdGVkJykpLnJlc3VsdCgpO1xuICAgIGNvbnN0IG5ld0tleWNoYWlucyA9IHt9O1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBubyBpbXBsaWNpdCB0aGlzXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgXy5mb3JPd24oKGVuY3J5cHRlZCBhcyBhbnkpLmtleWNoYWlucywgZnVuY3Rpb24ga2V5Y2hhaW5zRm9yT3duKG9sZEVuY3J5cHRlZFhwcnYsIHhwdWIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZFBydiA9IHNlbGYuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBvbGRFbmNyeXB0ZWRYcHJ2LCBwYXNzd29yZDogcGFyYW1zLm9sZFBhc3N3b3JkIH0pO1xuICAgICAgICBjb25zdCBuZXdFbmNyeXB0ZWRQcnYgPSBzZWxmLmJpdGdvLmVuY3J5cHQoeyBpbnB1dDogZGVjcnlwdGVkUHJ2LCBwYXNzd29yZDogcGFyYW1zLm5ld1Bhc3N3b3JkIH0pO1xuICAgICAgICBuZXdLZXljaGFpbnNbeHB1Yl0gPSBuZXdFbmNyeXB0ZWRQcnY7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGRlY3J5cHRpbmcgdGhlIGtleWNoYWluIHdpdGggdGhlIG9sZCBwYXNzd29yZCBkaWRuJ3Qgd29yayBzbyB3ZSBqdXN0IGtlZXAgaXQgdGhlIHdheSBpdCBpc1xuICAgICAgICBuZXdLZXljaGFpbnNbeHB1Yl0gPSBvbGRFbmNyeXB0ZWRYcHJ2O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGtleWNoYWluczogbmV3S2V5Y2hhaW5zLCB2ZXJzaW9uOiAoZW5jcnlwdGVkIGFzIGFueSkudmVyc2lvbiB9O1xuICB9KVxuICAgIC5jYWxsKHRoaXMpXG4gICAgLmFzQ2FsbGJhY2soY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGFkZFxuLy8gQWRkIGEgbmV3IGtleWNoYWluXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFsneHB1YiddLCBbJ2VuY3J5cHRlZFhwcnYnLCAndHlwZScsICdpc0xlZGdlciddLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUoXG4gICAgdGhpcy5iaXRnb1xuICAgICAgLnBvc3QodGhpcy5iaXRnby51cmwoJy9rZXljaGFpbicpKVxuICAgICAgLnNlbmQoe1xuICAgICAgICB4cHViOiBwYXJhbXMueHB1YixcbiAgICAgICAgZW5jcnlwdGVkWHBydjogcGFyYW1zLmVuY3J5cHRlZFhwcnYsXG4gICAgICAgIHR5cGU6IHBhcmFtcy50eXBlLFxuICAgICAgICBvcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGU6IHBhcmFtcy5vcmlnaW5hbFBhc3Njb2RlRW5jcnlwdGlvbkNvZGUsXG4gICAgICAgIGlzTGVkZ2VyOiBwYXJhbXMuaXNMZWRnZXIsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG4vL1xuLy8gY3JlYXRlQml0R29cbi8vIEFkZCBhIG5ldyBCaXRHbyBzZXJ2ZXIga2V5Y2hhaW5cbi8vXG5LZXljaGFpbnMucHJvdG90eXBlLmNyZWF0ZUJpdEdvID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbXSwgW10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZSh0aGlzLmJpdGdvLnBvc3QodGhpcy5iaXRnby51cmwoJy9rZXljaGFpbi9iaXRnbycpKS5zZW5kKHBhcmFtcykucmVzdWx0KCkpXG4gICAgLnRoZW4oZnVuY3Rpb24gKGtleWNoYWluKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGtleWNoYWluLnhwdWIgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAmJlxuICAgICAgICBVdGlsLnhwdWJUb0V0aEFkZHJlc3MgJiZcbiAgICAgICAga2V5Y2hhaW4uZXRoQWRkcmVzcyAhPT0gVXRpbC54cHViVG9FdGhBZGRyZXNzKGtleWNoYWluLnhwdWIpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdldGhBZGRyZXNzIGFuZCB4cHViIGRvIG5vdCBtYXRjaCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGtleWNoYWluO1xuICAgIH0pXG4gICAgLm5vZGVpZnkoY2FsbGJhY2spO1xufTtcblxuLy9cbi8vIGNyZWF0ZUJhY2t1cFxuLy8gQ3JlYXRlIGEgbmV3IGJhY2t1cCBrZXljaGFpbiB0aHJvdWdoIGJpdGdvIC0gb2Z0ZW4gdXNlZCBmb3IgY3JlYXRpbmcgYSBrZXljaGFpbiBvbiBhIEtSU1xuLy9cbktleWNoYWlucy5wcm90b3R5cGUuY3JlYXRlQmFja3VwID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3Byb3ZpZGVyJ10sIFtdLCBjYWxsYmFjayk7XG5cbiAgcmV0dXJuIEJsdWViaXJkLnJlc29sdmUodGhpcy5iaXRnby5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4vYmFja3VwJykpLnNlbmQocGFyYW1zKS5yZXN1bHQoKSlcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIC8vIG5vdCBhbGwga2V5Y2hhaW5zIGhhdmUgYW4geHB1YlxuICAgICAgaWYgKFxuICAgICAgICBrZXljaGFpbi54cHViICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgJiZcbiAgICAgICAgVXRpbC54cHViVG9FdGhBZGRyZXNzICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgIT09IFV0aWwueHB1YlRvRXRoQWRkcmVzcyhrZXljaGFpbi54cHViKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXRoQWRkcmVzcyBhbmQgeHB1YiBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyBnZXRcbi8vIEZldGNoIGFuIGV4aXN0aW5nIGtleWNoYWluXG4vLyBQYXJhbWV0ZXJzIGluY2x1ZGU6XG4vLyAgIHhwdWI6ICB0aGUgeHB1YiBvZiB0aGUga2V5IHRvIGxvb2t1cCAocmVxdWlyZWQpXG4vL1xuS2V5Y2hhaW5zLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAocGFyYW1zLCBjYWxsYmFjaykge1xuICBwYXJhbXMgPSBwYXJhbXMgfHwge307XG4gIGNvbW1vbi52YWxpZGF0ZVBhcmFtcyhwYXJhbXMsIFtdLCBbJ3hwdWInLCAnZXRoQWRkcmVzcyddLCBjYWxsYmFjayk7XG5cbiAgaWYgKCFwYXJhbXMueHB1YiAmJiAhcGFyYW1zLmV0aEFkZHJlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3hwdWIgb3IgZXRoQWRkcmVzcyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGlkID0gcGFyYW1zLnhwdWIgfHwgcGFyYW1zLmV0aEFkZHJlc3M7XG4gIHJldHVybiBCbHVlYmlyZC5yZXNvbHZlKFxuICAgIHRoaXMuYml0Z29cbiAgICAgIC5wb3N0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4vJyArIGVuY29kZVVSSUNvbXBvbmVudChpZCkpKVxuICAgICAgLnNlbmQoe30pXG4gICAgICAucmVzdWx0KClcbiAgKVxuICAgIC50aGVuKGZ1bmN0aW9uIChrZXljaGFpbikge1xuICAgICAgaWYgKFxuICAgICAgICBrZXljaGFpbi54cHViICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgJiZcbiAgICAgICAgVXRpbC54cHViVG9FdGhBZGRyZXNzICYmXG4gICAgICAgIGtleWNoYWluLmV0aEFkZHJlc3MgIT09IFV0aWwueHB1YlRvRXRoQWRkcmVzcyhrZXljaGFpbi54cHViKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXRoQWRkcmVzcyBhbmQgeHB1YiBkbyBub3QgbWF0Y2gnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXljaGFpbjtcbiAgICB9KVxuICAgIC5ub2RlaWZ5KGNhbGxiYWNrKTtcbn07XG5cbi8vXG4vLyB1cGRhdGVcbi8vIFVwZGF0ZSBhbiBleGlzdGluZyBrZXljaGFpblxuLy8gUGFyYW1ldGVycyBpbmNsdWRlOlxuLy8gICB4cHViOiAgdGhlIHhwdWIgb2YgdGhlIGtleSB0byBsb29rdXAgKHJlcXVpcmVkKVxuLy9cbktleWNoYWlucy5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgcGFyYW1zID0gcGFyYW1zIHx8IHt9O1xuICBjb21tb24udmFsaWRhdGVQYXJhbXMocGFyYW1zLCBbJ3hwdWInXSwgWydlbmNyeXB0ZWRYcHJ2J10sIGNhbGxiYWNrKTtcblxuICByZXR1cm4gQmx1ZWJpcmQucmVzb2x2ZShcbiAgICB0aGlzLmJpdGdvXG4gICAgICAucHV0KHRoaXMuYml0Z28udXJsKCcva2V5Y2hhaW4vJyArIHBhcmFtcy54cHViKSlcbiAgICAgIC5zZW5kKHtcbiAgICAgICAgZW5jcnlwdGVkWHBydjogcGFyYW1zLmVuY3J5cHRlZFhwcnYsXG4gICAgICB9KVxuICAgICAgLnJlc3VsdCgpXG4gIClcbiAgICAudGhlbihmdW5jdGlvbiAoa2V5Y2hhaW4pIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5Y2hhaW4ueHB1YiAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICYmXG4gICAgICAgIFV0aWwueHB1YlRvRXRoQWRkcmVzcyAmJlxuICAgICAgICBrZXljaGFpbi5ldGhBZGRyZXNzICE9PSBVdGlsLnhwdWJUb0V0aEFkZHJlc3Moa2V5Y2hhaW4ueHB1YilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V0aEFkZHJlc3MgYW5kIHhwdWIgZG8gbm90IG1hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4ga2V5Y2hhaW47XG4gICAgfSlcbiAgICAubm9kZWlmeShjYWxsYmFjayk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEtleWNoYWlucztcbiJdfQ==
|
|
@@ -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"}
|