@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.40 → 1.4.3-alpha.401

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 (42) hide show
  1. package/.mocharc.yml +1 -1
  2. package/CHANGELOG.md +678 -0
  3. package/package.json +12 -11
  4. package/dist/src/index.d.ts +0 -5
  5. package/dist/src/index.d.ts.map +0 -1
  6. package/dist/src/index.js +0 -30
  7. package/dist/src/lib/address.d.ts +0 -8
  8. package/dist/src/lib/address.d.ts.map +0 -1
  9. package/dist/src/lib/address.js +0 -10
  10. package/dist/src/lib/iface.d.ts +0 -115
  11. package/dist/src/lib/iface.d.ts.map +0 -1
  12. package/dist/src/lib/iface.js +0 -3
  13. package/dist/src/lib/index.d.ts +0 -10
  14. package/dist/src/lib/index.d.ts.map +0 -1
  15. package/dist/src/lib/index.js +0 -37
  16. package/dist/src/lib/keyPair.d.ts +0 -40
  17. package/dist/src/lib/keyPair.d.ts.map +0 -1
  18. package/dist/src/lib/keyPair.js +0 -135
  19. package/dist/src/lib/multisigUtils.d.ts +0 -134
  20. package/dist/src/lib/multisigUtils.d.ts.map +0 -1
  21. package/dist/src/lib/multisigUtils.js +0 -1180
  22. package/dist/src/lib/transaction.d.ts +0 -119
  23. package/dist/src/lib/transaction.d.ts.map +0 -1
  24. package/dist/src/lib/transaction.js +0 -315
  25. package/dist/src/lib/transactionBuilder.d.ts +0 -171
  26. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  27. package/dist/src/lib/transactionBuilder.js +0 -453
  28. package/dist/src/lib/transferBuilder.d.ts +0 -24
  29. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  30. package/dist/src/lib/transferBuilder.js +0 -64
  31. package/dist/src/lib/utils.d.ts +0 -265
  32. package/dist/src/lib/utils.d.ts.map +0 -1
  33. package/dist/src/lib/utils.js +0 -460
  34. package/dist/src/register.d.ts +0 -3
  35. package/dist/src/register.d.ts.map +0 -1
  36. package/dist/src/register.js +0 -11
  37. package/dist/src/txtz.d.ts +0 -13
  38. package/dist/src/txtz.d.ts.map +0 -1
  39. package/dist/src/txtz.js +0 -14
  40. package/dist/src/xtz.d.ts +0 -80
  41. package/dist/src/xtz.d.ts.map +0 -1
  42. package/dist/src/xtz.js +0 -189
@@ -1,460 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
- var __importDefault = (this && this.__importDefault) || function (mod) {
22
- return (mod && mod.__esModule) ? mod : { "default": mod };
23
- };
24
- Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.DEFAULT_STORAGE_LIMIT = exports.DEFAULT_FEE = exports.DEFAULT_GAS_LIMIT = exports.hashTypes = exports.decodeSignature = exports.decodeKey = exports.isValidKey = exports.isValidTransactionHash = exports.isValidBlockHash = exports.isValidPrivateKey = exports.isValidPublicKey = exports.isValidSignature = exports.isValidOriginatedAddress = exports.isValidImplicitAddress = exports.isValidAddress = exports.isValidHash = exports.generateDataToSign = exports.verifySignature = exports.sign = exports.calculateOriginatedAddress = exports.calculateTransactionId = exports.base58encode = exports.DEFAULT_WATERMARK = void 0;
26
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
27
- const signer_1 = require("@taquito/signer");
28
- const base58check = __importStar(require("bs58check"));
29
- const elliptic_1 = require("elliptic");
30
- const libsodium_wrappers_1 = __importDefault(require("libsodium-wrappers"));
31
- const multisigUtils_1 = require("./multisigUtils");
32
- // By default, use the transactions prefix
33
- exports.DEFAULT_WATERMARK = new Uint8Array([3]);
34
- /**
35
- * Encode the payload to base58 with a specific Tezos prefix.
36
- *
37
- * @param {Buffer} prefix to add to the encoded payload
38
- * @param {Buffer} payload to encode
39
- * @returns {any} base58 payload with a Tezos prefix
40
- */
41
- function base58encode(prefix, payload) {
42
- const n = Buffer.alloc(prefix.length + payload.length);
43
- n.set(prefix);
44
- n.set(payload, prefix.length);
45
- return base58check.encode(n);
46
- }
47
- exports.base58encode = base58encode;
48
- /**
49
- * Calculate the transaction id for a for a signed transaction.
50
- *
51
- * @param {string} encodedTransaction Signed transaction in hexadecimal
52
- * @returns {Promise<string>} The transaction id
53
- */
54
- async function calculateTransactionId(encodedTransaction) {
55
- await libsodium_wrappers_1.default.ready;
56
- const encodedTransactionBuffer = Uint8Array.from(Buffer.from(encodedTransaction, 'hex'));
57
- const operationHashPayload = libsodium_wrappers_1.default.crypto_generichash(32, encodedTransactionBuffer);
58
- return base58encode(exports.hashTypes.o.prefix, Buffer.from(operationHashPayload));
59
- }
60
- exports.calculateTransactionId = calculateTransactionId;
61
- /**
62
- * Calculate the address of a new originated account.
63
- *
64
- * @param {string} transactionId The transaction id
65
- * @param {number} index The index of the origination operation inside the transaction (starts at 0)
66
- * @returns {Promise<string>} An originated address with the KT prefix
67
- */
68
- async function calculateOriginatedAddress(transactionId, index) {
69
- // From https://github.com/TezTech/eztz/blob/cfdc4fcfc891f4f4f077c3056f414476dde3610b/src/main.js#L768
70
- const ob = base58check.decode(transactionId).slice(exports.hashTypes.o.prefix.length);
71
- let tt = [];
72
- for (let i = 0; i < ob.length; i++) {
73
- tt.push(ob[i]);
74
- }
75
- tt = tt.concat([
76
- (index & 0xff000000) >> 24,
77
- (index & 0x00ff0000) >> 16,
78
- (index & 0x0000ff00) >> 8,
79
- index & 0x000000ff,
80
- ]);
81
- await libsodium_wrappers_1.default.ready;
82
- const payload = libsodium_wrappers_1.default.crypto_generichash(20, new Uint8Array(tt));
83
- return base58encode(exports.hashTypes.KT.prefix, Buffer.from(payload));
84
- }
85
- exports.calculateOriginatedAddress = calculateOriginatedAddress;
86
- /**
87
- * Generic data signing using Tezos library.
88
- *
89
- * @param {KeyPair} keyPair A Key Pair with a private key set
90
- * @param {string} data The data in hexadecimal to sign
91
- * @param {Uint8Array} watermark Magic byte: 1 for block, 2 for endorsement, 3 for generic
92
- * @returns {Promise<SignResponse>}
93
- */
94
- async function sign(keyPair, data, watermark = exports.DEFAULT_WATERMARK) {
95
- if (!keyPair.getKeys().prv) {
96
- throw new sdk_core_1.SigningError('Missing private key');
97
- }
98
- const signer = new signer_1.InMemorySigner(keyPair.getKeys().prv);
99
- return signer.sign(data, watermark);
100
- }
101
- exports.sign = sign;
102
- /**
103
- * Verifies the signature produced for a given message belongs to a secp256k1 public key.
104
- *
105
- * @param {string} message Message in hex format to verify
106
- * @param {string} publicKey secp256k1 public key with "sppk" prefix to verify the signature with
107
- * @param {string} signature Tezos signature with "sig" prefix
108
- * @param {Uint8Array} watermark Optional watermark used to generate the signature
109
- * @returns {Promise<boolean>}
110
- */
111
- async function verifySignature(message, publicKey, signature, watermark = exports.DEFAULT_WATERMARK) {
112
- const rawPublicKey = decodeKey(publicKey, exports.hashTypes.sppk);
113
- const ec = new elliptic_1.ec('secp256k1');
114
- const key = ec.keyFromPublic(rawPublicKey);
115
- const messageBuffer = Uint8Array.from(Buffer.from(message, 'hex'));
116
- // Tezos signatures always have a watermark
117
- const messageWithWatermark = new Uint8Array(watermark.length + messageBuffer.length);
118
- messageWithWatermark.set(watermark);
119
- messageWithWatermark.set(messageBuffer, watermark.length);
120
- await libsodium_wrappers_1.default.ready;
121
- const bytesHash = Buffer.from(libsodium_wrappers_1.default.crypto_generichash(32, messageWithWatermark));
122
- const rawSignature = decodeSignature(signature, exports.hashTypes.sig);
123
- return key.verify(bytesHash, { r: rawSignature.slice(0, 32), s: rawSignature.slice(32, 64) });
124
- }
125
- exports.verifySignature = verifySignature;
126
- /**
127
- * Useful wrapper to create the generic multisig contract data to sign when moving funds.
128
- *
129
- * @param {string} contractAddress The wallet contract address with the funds to withdraw
130
- * @param {string} destinationAddress The address to transfer the funds to
131
- * @param {number} amount Number mutez to transfer
132
- * @param {string} contractCounter Wallet counter to use in the transaction
133
- * @returns {any} A JSON representation of the Michelson script to sign and approve a transfer
134
- */
135
- function generateDataToSign(contractAddress, destinationAddress, amount, contractCounter) {
136
- if (!isValidOriginatedAddress(contractAddress)) {
137
- throw new Error('Invalid contract address ' + contractAddress + '. An originated account address was expected');
138
- }
139
- if (!isValidAddress(destinationAddress)) {
140
- throw new Error('Invalid destination address ' + destinationAddress);
141
- }
142
- return multisigUtils_1.genericMultisigDataToSign(contractAddress, destinationAddress, amount, contractCounter);
143
- }
144
- exports.generateDataToSign = generateDataToSign;
145
- /**
146
- * Returns whether or not the string is a valid Tezos hash of the given type
147
- *
148
- * @param {string} hash - the string to validate
149
- * @param {HashType} hashType - the type of the provided hash
150
- * @returns {boolean}
151
- */
152
- function isValidHash(hash, hashType) {
153
- // Validate encoding
154
- let decodedHash;
155
- try {
156
- decodedHash = base58check.decode(hash);
157
- }
158
- catch (e) {
159
- return false;
160
- }
161
- const hashPrefix = decodedHash.slice(0, hashType.prefix.length);
162
- // Check prefix
163
- if (!hashPrefix.equals(Buffer.from(hashType.prefix))) {
164
- return false;
165
- }
166
- // Check length
167
- const hashLength = decodedHash.length - hashPrefix.length;
168
- return hashLength === hashType.byteLength;
169
- }
170
- exports.isValidHash = isValidHash;
171
- /**
172
- * Returns whether or not the string is a valid Tezos address
173
- *
174
- * @param {string} hash - the address to validate
175
- * @returns {boolean}
176
- */
177
- function isValidAddress(hash) {
178
- return isValidImplicitAddress(hash) || isValidHash(hash, exports.hashTypes.KT);
179
- }
180
- exports.isValidAddress = isValidAddress;
181
- /**
182
- * Returns whether or not the string is a valid Tezos implicit account address
183
- *
184
- * @param {string} hash - the address to validate
185
- * @returns {boolean}
186
- */
187
- function isValidImplicitAddress(hash) {
188
- return isValidHash(hash, exports.hashTypes.tz1) || isValidHash(hash, exports.hashTypes.tz2) || isValidHash(hash, exports.hashTypes.tz3);
189
- }
190
- exports.isValidImplicitAddress = isValidImplicitAddress;
191
- /**
192
- * Returns whether or not the string is a valid Tezos originated account address
193
- *
194
- * @param {string} hash - the address to validate
195
- * @returns {boolean}
196
- */
197
- function isValidOriginatedAddress(hash) {
198
- return isValidHash(hash, exports.hashTypes.KT);
199
- }
200
- exports.isValidOriginatedAddress = isValidOriginatedAddress;
201
- /**
202
- * Returns whether or not the string is a valid Tezos signature
203
- *
204
- * @param {string} hash - the signature to validate
205
- * @returns {boolean}
206
- */
207
- function isValidSignature(hash) {
208
- return (isValidHash(hash, exports.hashTypes.edsig) ||
209
- isValidHash(hash, exports.hashTypes.spsig1) ||
210
- isValidHash(hash, exports.hashTypes.p2sig) ||
211
- isValidHash(hash, exports.hashTypes.sig));
212
- }
213
- exports.isValidSignature = isValidSignature;
214
- /**
215
- * Returns whether or not the string is a valid Tezos public key
216
- *
217
- * @param {string} publicKey The public key to validate
218
- * @returns {boolean}
219
- */
220
- function isValidPublicKey(publicKey) {
221
- return (isValidHash(publicKey, exports.hashTypes.sppk) ||
222
- isValidHash(publicKey, exports.hashTypes.p2pk) ||
223
- isValidHash(publicKey, exports.hashTypes.edpk) ||
224
- sdk_core_1.isValidXpub(publicKey) // xpubs are valid too.
225
- );
226
- }
227
- exports.isValidPublicKey = isValidPublicKey;
228
- /**
229
- * Returns whether or not the string is a valid Tezos private key
230
- *
231
- * @param {string} privateKey The private key to validate
232
- * @returns {boolean}
233
- */
234
- function isValidPrivateKey(privateKey) {
235
- return (isValidHash(privateKey, exports.hashTypes.edesk) ||
236
- isValidHash(privateKey, exports.hashTypes.edsk) ||
237
- isValidHash(privateKey, exports.hashTypes.spsk) ||
238
- isValidHash(privateKey, exports.hashTypes.p2sk));
239
- }
240
- exports.isValidPrivateKey = isValidPrivateKey;
241
- /**
242
- * Returns whether or not the string is a valid Tezos block hash
243
- *
244
- * @param {string} hash - the address to validate
245
- * @returns {boolean}
246
- */
247
- function isValidBlockHash(hash) {
248
- return isValidHash(hash, exports.hashTypes.b);
249
- }
250
- exports.isValidBlockHash = isValidBlockHash;
251
- /**
252
- * Returns whether or not the string is a valid Tezos transaction hash
253
- *
254
- * @param {string} hash - the address to validate
255
- * @returns {boolean}
256
- */
257
- function isValidTransactionHash(hash) {
258
- return isValidHash(hash, exports.hashTypes.o);
259
- }
260
- exports.isValidTransactionHash = isValidTransactionHash;
261
- /**
262
- * Returns whether or not the string is a valid Tezos key given a prefix
263
- *
264
- * @param {string} hash - the key to validate
265
- * @param {HashType} hashType - the type of the provided hash
266
- * @returns {boolean}
267
- */
268
- function isValidKey(hash, hashType) {
269
- return isValidHash(hash, hashType);
270
- }
271
- exports.isValidKey = isValidKey;
272
- /**
273
- * Get the original key form the text without the given prefix.
274
- *
275
- * @param {string} hash - base58 encoded key with a Tezos prefix
276
- * @param {HashType} hashType - the type of the provided hash
277
- * @returns {Buffer} the original decoded key
278
- */
279
- function decodeKey(hash, hashType) {
280
- if (!isValidKey(hash, hashType)) {
281
- throw new Error('Unsupported private key');
282
- }
283
- const decodedPrv = base58check.decode(hash);
284
- return Buffer.from(decodedPrv.slice(hashType.prefix.length, decodedPrv.length));
285
- }
286
- exports.decodeKey = decodeKey;
287
- /**
288
- * Get the raw signature from a Tezos encoded one.
289
- *
290
- * @param {string} signature Tezos signatures prefixed with sig, edsig, p2sig or spsig
291
- * @param {HashType} hashType The prefix of remove
292
- * @returns {Buffer} The decoded signature without prefix
293
- */
294
- function decodeSignature(signature, hashType) {
295
- if (!isValidSignature(signature)) {
296
- throw new Error('Unsupported signature');
297
- }
298
- const decodedPrv = base58check.decode(signature);
299
- return Buffer.from(decodedPrv.slice(hashType.prefix.length, decodedPrv.length));
300
- }
301
- exports.decodeSignature = decodeSignature;
302
- // Base58Check is used for encoding
303
- // hashedTypes is used to validate hashes by type, by checking their prefix and
304
- // the length of the Buffer obtained by decoding the hash (excluding the prefix)
305
- exports.hashTypes = {
306
- /* 20 bytes long */
307
- // ed25519 public key hash
308
- tz1: {
309
- prefix: Buffer.from([6, 161, 159]),
310
- byteLength: 20,
311
- },
312
- // secp256k1 public key hash
313
- tz2: {
314
- prefix: Buffer.from([6, 161, 161]),
315
- byteLength: 20,
316
- },
317
- // p256 public key hash
318
- tz3: {
319
- prefix: Buffer.from([6, 161, 164]),
320
- byteLength: 20,
321
- },
322
- KT: {
323
- prefix: Buffer.from([2, 90, 121]),
324
- byteLength: 20,
325
- },
326
- /* 32 bytes long */
327
- // ed25519 public key
328
- edpk: {
329
- prefix: Buffer.from([13, 15, 37, 217]),
330
- byteLength: 32,
331
- },
332
- // ed25519 secret key
333
- edsk2: {
334
- prefix: Buffer.from([13, 15, 58, 7]),
335
- byteLength: 32,
336
- },
337
- // secp256k1 secret key
338
- spsk: {
339
- prefix: Buffer.from([17, 162, 224, 201]),
340
- byteLength: 32,
341
- },
342
- // p256 secret key
343
- p2sk: {
344
- prefix: Buffer.from([16, 81, 238, 189]),
345
- byteLength: 32,
346
- },
347
- // block hash
348
- b: {
349
- prefix: Buffer.from([1, 52]),
350
- byteLength: 32,
351
- },
352
- // operation hash
353
- o: {
354
- prefix: Buffer.from([5, 116]),
355
- byteLength: 32,
356
- },
357
- // operation list hash
358
- Lo: {
359
- prefix: Buffer.from([133, 233]),
360
- byteLength: 32,
361
- },
362
- // operation list list hash
363
- LLo: {
364
- prefix: Buffer.from([29, 159, 109]),
365
- byteLength: 32,
366
- },
367
- // protocol hash
368
- P: {
369
- prefix: Buffer.from([2, 170]),
370
- byteLength: 32,
371
- },
372
- // context hash
373
- Co: {
374
- prefix: Buffer.from([79, 179]),
375
- byteLength: 32,
376
- },
377
- /* 33 bytes long */
378
- // secp256k1 public key
379
- sppk: {
380
- prefix: Buffer.from([3, 254, 226, 86]),
381
- byteLength: 33,
382
- },
383
- // p256 public key
384
- p2pk: {
385
- prefix: Buffer.from([3, 178, 139, 127]),
386
- byteLength: 33,
387
- },
388
- /* 56 bytes long */
389
- // ed25519 encrypted seed
390
- edesk: {
391
- prefix: Buffer.from([7, 90, 60, 179, 41]),
392
- byteLength: 56,
393
- },
394
- /* 63 bytes long */
395
- // ed25519 secret key
396
- edsk: {
397
- prefix: Buffer.from([43, 246, 78, 7]),
398
- byteLength: 64,
399
- },
400
- // ed25519 signature
401
- edsig: {
402
- prefix: Buffer.from([9, 245, 205, 134, 18]),
403
- byteLength: 64,
404
- },
405
- // secp256k1 signature
406
- spsig1: {
407
- prefix: Buffer.from([13, 115, 101, 19, 63]),
408
- byteLength: 64,
409
- },
410
- // p256_signature
411
- p2sig: {
412
- prefix: Buffer.from([54, 240, 44, 52]),
413
- byteLength: 64,
414
- },
415
- // generic signature
416
- sig: {
417
- prefix: Buffer.from([4, 130, 43]),
418
- byteLength: 64,
419
- },
420
- /* 15 bytes long */
421
- // network hash
422
- Net: {
423
- prefix: Buffer.from([87, 82, 0]),
424
- byteLength: 15,
425
- },
426
- // nonce hash
427
- nce: {
428
- prefix: Buffer.from([69, 220, 169]),
429
- byteLength: 15,
430
- },
431
- /* 4 bytes long */
432
- // chain id
433
- id: {
434
- prefix: Buffer.from([153, 103]),
435
- byteLength: 4,
436
- },
437
- };
438
- // From https://github.com/ecadlabs/taquito/blob/master/packages/taquito/src/constants.ts
439
- var DEFAULT_GAS_LIMIT;
440
- (function (DEFAULT_GAS_LIMIT) {
441
- DEFAULT_GAS_LIMIT[DEFAULT_GAS_LIMIT["DELEGATION"] = 10600] = "DELEGATION";
442
- DEFAULT_GAS_LIMIT[DEFAULT_GAS_LIMIT["ORIGINATION"] = 10600] = "ORIGINATION";
443
- DEFAULT_GAS_LIMIT[DEFAULT_GAS_LIMIT["TRANSFER"] = 10600] = "TRANSFER";
444
- DEFAULT_GAS_LIMIT[DEFAULT_GAS_LIMIT["REVEAL"] = 10600] = "REVEAL";
445
- })(DEFAULT_GAS_LIMIT = exports.DEFAULT_GAS_LIMIT || (exports.DEFAULT_GAS_LIMIT = {}));
446
- var DEFAULT_FEE;
447
- (function (DEFAULT_FEE) {
448
- DEFAULT_FEE[DEFAULT_FEE["DELEGATION"] = 1257] = "DELEGATION";
449
- DEFAULT_FEE[DEFAULT_FEE["ORIGINATION"] = 10000] = "ORIGINATION";
450
- DEFAULT_FEE[DEFAULT_FEE["TRANSFER"] = 10000] = "TRANSFER";
451
- DEFAULT_FEE[DEFAULT_FEE["REVEAL"] = 1420] = "REVEAL";
452
- })(DEFAULT_FEE = exports.DEFAULT_FEE || (exports.DEFAULT_FEE = {}));
453
- var DEFAULT_STORAGE_LIMIT;
454
- (function (DEFAULT_STORAGE_LIMIT) {
455
- DEFAULT_STORAGE_LIMIT[DEFAULT_STORAGE_LIMIT["DELEGATION"] = 0] = "DELEGATION";
456
- DEFAULT_STORAGE_LIMIT[DEFAULT_STORAGE_LIMIT["ORIGINATION"] = 257] = "ORIGINATION";
457
- DEFAULT_STORAGE_LIMIT[DEFAULT_STORAGE_LIMIT["TRANSFER"] = 257] = "TRANSFER";
458
- DEFAULT_STORAGE_LIMIT[DEFAULT_STORAGE_LIMIT["REVEAL"] = 0] = "REVEAL";
459
- })(DEFAULT_STORAGE_LIMIT = exports.DEFAULT_STORAGE_LIMIT || (exports.DEFAULT_STORAGE_LIMIT = {}));
460
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtREFBaUU7QUFDakUsNENBQWlEO0FBQ2pELHVEQUF5QztBQUN6Qyx1Q0FBb0M7QUFDcEMsNEVBQXdDO0FBR3hDLG1EQUE0RDtBQUU1RCwwQ0FBMEM7QUFDN0IsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFckQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsWUFBWSxDQUFDLE1BQWMsRUFBRSxPQUFlO0lBQzFELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQU5ELG9DQU1DO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsc0JBQXNCLENBQUMsa0JBQTBCO0lBQ3JFLE1BQU0sNEJBQU0sQ0FBQyxLQUFLLENBQUM7SUFDbkIsTUFBTSx3QkFBd0IsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN6RixNQUFNLG9CQUFvQixHQUFHLDRCQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDckYsT0FBTyxZQUFZLENBQUMsaUJBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0s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QUFMRCxXQUFZLFdBQVc7SUFDckIsNERBQWlCLENBQUE7SUFDakIsK0RBQW1CLENBQUE7SUFDbkIseURBQWdCLENBQUE7SUFDaEIsb0RBQWEsQ0FBQTtBQUNmLENBQUMsRUFMVyxXQUFXLEdBQVgsbUJBQVcsS0FBWCxtQkFBVyxRQUt0QjtBQUVELElBQVkscUJBS1g7QUFMRCxXQUFZLHFCQUFxQjtJQUMvQiw2RUFBYyxDQUFBO0lBQ2QsaUZBQWlCLENBQUE7SUFDakIsMkVBQWMsQ0FBQTtJQUNkLHFFQUFVLENBQUE7QUFDWixDQUFDLEVBTFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFLaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1ZhbGlkWHB1YiwgU2lnbmluZ0Vycm9yIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgSW5NZW1vcnlTaWduZXIgfSBmcm9tICdAdGFxdWl0by9zaWduZXInO1xuaW1wb3J0ICogYXMgYmFzZTU4Y2hlY2sgZnJvbSAnYnM1OGNoZWNrJztcbmltcG9ydCB7IGVjIGFzIEVDIH0gZnJvbSAnZWxsaXB0aWMnO1xuaW1wb3J0IHNvZGl1bSBmcm9tICdsaWJzb2RpdW0td3JhcHBlcnMnO1xuaW1wb3J0IHsgSGFzaFR5cGUsIFNpZ25SZXNwb25zZSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgeyBnZW5lcmljTXVsdGlzaWdEYXRhVG9TaWduIH0gZnJvbSAnLi9tdWx0aXNpZ1V0aWxzJztcblxuLy8gQnkgZGVmYXVsdCwgdXNlIHRoZSB0cmFuc2FjdGlvbnMgcHJlZml4XG5leHBvcnQgY29uc3QgREVGQVVMVF9XQVRFUk1BUksgPSBuZXcgVWludDhBcnJheShbM10pO1xuXG4vKipcbiAqIEVuY29kZSB0aGUgcGF5bG9hZCB0byBiYXNlNTggd2l0aCBhIHNwZWNpZmljIFRlem9zIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcHJlZml4IHRvIGFkZCB0byB0aGUgZW5jb2RlZCBwYXlsb2FkXG4gKiBAcGFyYW0ge0J1ZmZlcn0gcGF5bG9hZCB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHthbnl9IGJhc2U1OCBwYXlsb2FkIHdpdGggYSBUZXpvcyBwcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U1OGVuY29kZShwcmVmaXg6IEJ1ZmZlciwgcGF5bG9hZDogQnVmZmVyKTogc3RyaW5nIHtcbiAgY29uc3QgbiA9IEJ1ZmZlci5hbGxvYyhwcmVmaXgubGVuZ3RoICsgcGF5bG9hZC5sZW5ndGgpO1xuICBuLnNldChwcmVmaXgpO1xuICBuLnNldChwYXlsb2FkLCBwcmVmaXgubGVuZ3RoKTtcblxuICByZXR1cm4gYmFzZTU4Y2hlY2suZW5jb2RlKG4pO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgdHJhbnNhY3Rpb24gaWQgZm9yIGEgZm9yIGEgc2lnbmVkIHRyYW5zYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkVHJhbnNhY3Rpb24gU2lnbmVkIHRyYW5zYWN0aW9uIGluIGhleGFkZWNpbWFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgdHJhbnNhY3Rpb24gaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZVRyYW5zYWN0aW9uSWQoZW5jb2RlZFRyYW5zYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBhd2FpdCBzb2RpdW0ucmVhZHk7XG4gIGNvbnN0IGVuY29kZWRUcmFuc2FjdGlvbkJ1ZmZlciA9IFVpbnQ4QXJyYXkuZnJvbShCdWZmZXIuZnJvbShlbmNvZGVkVHJhbnNhY3Rpb24sICdoZXgnKSk7XG4gIGNvbnN0IG9wZXJhdGlvbkhhc2hQYXlsb2FkID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaCgzMiwgZW5jb2RlZFRyYW5zYWN0aW9uQnVmZmVyKTtcbiAgcmV0dXJuIGJhc2U1OGVuY29kZShoYXNoVHlwZXMuby5wcmVmaXgsIEJ1ZmZlci5mcm9tKG9wZXJhdGlvbkhhc2hQYXlsb2FkKSk7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIGEgbmV3IG9yaWdpbmF0ZWQgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNhY3Rpb25JZCBUaGUgdHJhbnNhY3Rpb24gaWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIG9yaWdpbmF0aW9uIG9wZXJhdGlvbiBpbnNpZGUgdGhlIHRyYW5zYWN0aW9uIChzdGFydHMgYXQgMClcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IEFuIG9yaWdpbmF0ZWQgYWRkcmVzcyB3aXRoIHRoZSBLVCBwcmVmaXhcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNhbGN1bGF0ZU9yaWdpbmF0ZWRBZGRyZXNzKHRyYW5zYWN0aW9uSWQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL1RlelRlY2gvZXp0ei9ibG9iL2NmZGM0ZmNmYzg5MWY0ZjRmMDc3YzMwNTZmNDE0NDc2ZGRlMzYxMGIvc3JjL21haW4uanMjTDc2OFxuICBjb25zdCBvYiA9IGJhc2U1OGNoZWNrLmRlY29kZSh0cmFuc2FjdGlvbklkKS5zbGljZShoYXNoVHlwZXMuby5wcmVmaXgubGVuZ3RoKTtcblxuICBsZXQgdHQ6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb2IubGVuZ3RoOyBpKyspIHtcbiAgICB0dC5wdXNoKG9iW2ldKTtcbiAgfVxuXG4gIHR0ID0gdHQuY29uY2F0KFtcbiAgICAoaW5kZXggJiAweGZmMDAwMDAwKSA+PiAyNCxcbiAgICAoaW5kZXggJiAweDAwZmYwMDAwKSA+PiAxNixcbiAgICAoaW5kZXggJiAweDAwMDBmZjAwKSA+PiA4LFxuICAgIGluZGV4ICYgMHgwMDAwMDBmZixcbiAgXSk7XG5cbiAgYXdhaXQgc29kaXVtLnJlYWR5O1xuICBjb25zdCBwYXlsb2FkID0gc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaCgyMCwgbmV3IFVpbnQ4QXJyYXkodHQpKTtcbiAgcmV0dXJuIGJhc2U1OGVuY29kZShoYXNoVHlwZXMuS1QucHJlZml4LCBCdWZmZXIuZnJvbShwYXlsb2FkKSk7XG59XG5cbi8qKlxuICogR2VuZXJpYyBkYXRhIHNpZ25pbmcgdXNpbmcgVGV6b3MgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXIgQSBLZXkgUGFpciB3aXRoIGEgcHJpdmF0ZSBrZXkgc2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0YSBUaGUgZGF0YSBpbiBoZXhhZGVjaW1hbCB0byBzaWduXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHdhdGVybWFyayBNYWdpYyBieXRlOiAxIGZvciBibG9jaywgMiBmb3IgZW5kb3JzZW1lbnQsIDMgZm9yIGdlbmVyaWNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNpZ25SZXNwb25zZT59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduKFxuICBrZXlQYWlyOiBLZXlQYWlyLFxuICBkYXRhOiBzdHJpbmcsXG4gIHdhdGVybWFyazogVWludDhBcnJheSA9IERFRkFVTFRfV0FURVJNQVJLXG4pOiBQcm9taXNlPFNpZ25SZXNwb25zZT4ge1xuICBpZiAoIWtleVBhaXIuZ2V0S2V5cygpLnBydikge1xuICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgfVxuICBjb25zdCBzaWduZXIgPSBuZXcgSW5NZW1vcnlTaWduZXIoa2V5UGFpci5nZXRLZXlzKCkucHJ2ISk7XG4gIHJldHVybiBzaWduZXIuc2lnbihkYXRhLCB3YXRlcm1hcmspO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgcHJvZHVjZWQgZm9yIGEgZ2l2ZW4gbWVzc2FnZSBiZWxvbmdzIHRvIGEgc2VjcDI1NmsxIHB1YmxpYyBrZXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgTWVzc2FnZSBpbiBoZXggZm9ybWF0IHRvIHZlcmlmeVxuICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY0tleSBzZWNwMjU2azEgcHVibGljIGtleSB3aXRoIFwic3Bwa1wiIHByZWZpeCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSB3aXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIFRlem9zIHNpZ25hdHVyZSB3aXRoIFwic2lnXCIgcHJlZml4XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHdhdGVybWFyayBPcHRpb25hbCB3YXRlcm1hcmsgdXNlZCB0byBnZW5lcmF0ZSB0aGUgc2lnbmF0dXJlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVNpZ25hdHVyZShcbiAgbWVzc2FnZTogc3RyaW5nLFxuICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgc2lnbmF0dXJlOiBzdHJpbmcsXG4gIHdhdGVybWFyazogVWludDhBcnJheSA9IERFRkFVTFRfV0FURVJNQVJLXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcmF3UHVibGljS2V5ID0gZGVjb2RlS2V5KHB1YmxpY0tleSwgaGFzaFR5cGVzLnNwcGspO1xuICBjb25zdCBlYyA9IG5ldyBFQygnc2VjcDI1NmsxJyk7XG4gIGNvbnN0IGtleSA9IGVjLmtleUZyb21QdWJsaWMocmF3UHVibGljS2V5KTtcblxuICBjb25zdCBtZXNzYWdlQnVmZmVyID0gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKG1lc3NhZ2UsICdoZXgnKSk7XG4gIC8vIFRlem9zIHNpZ25hdHVyZXMgYWx3YXlzIGhhdmUgYSB3YXRlcm1hcmtcbiAgY29uc3QgbWVzc2FnZVdpdGhXYXRlcm1hcmsgPSBuZXcgVWludDhBcnJheSh3YXRlcm1hcmsubGVuZ3RoICsgbWVzc2FnZUJ1ZmZlci5sZW5ndGgpO1xuICBtZXNzYWdlV2l0aFdhdGVybWFyay5zZXQod2F0ZXJtYXJrKTtcbiAgbWVzc2FnZVdpdGhXYXRlcm1hcmsuc2V0KG1lc3NhZ2VCdWZmZXIsIHdhdGVybWFyay5sZW5ndGgpO1xuXG4gIGF3YWl0IHNvZGl1bS5yZWFkeTtcbiAgY29uc3QgYnl0ZXNIYXNoID0gQnVmZmVyLmZyb20oc29kaXVtLmNyeXB0b19nZW5lcmljaGFzaCgzMiwgbWVzc2FnZVdpdGhXYXRlcm1hcmspKTtcblxuICBjb25zdCByYXdTaWduYXR1cmUgPSBkZWNvZGVTaWduYXR1cmUoc2lnbmF0dXJlLCBoYXNoVHlwZXMuc2lnKTtcbiAgcmV0dXJuIGtleS52ZXJpZnkoYnl0ZXNIYXNoLCB7IHI6IHJhd1NpZ25hdHVyZS5zbGljZSgwLCAzMiksIHM6IHJhd1NpZ25hdHVyZS5zbGljZSgzMiwgNjQpIH0pO1xufVxuXG4vKipcbiAqIFVzZWZ1bCB3cmFwcGVyIHRvIGNyZWF0ZSB0aGUgZ2VuZXJpYyBtdWx0aXNpZyBjb250cmFjdCBkYXRhIHRvIHNpZ24gd2hlbiBtb3ZpbmcgZnVuZHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0QWRkcmVzcyBUaGUgd2FsbGV0IGNvbnRyYWN0IGFkZHJlc3Mgd2l0aCB0aGUgZnVuZHMgdG8gd2l0aGRyYXdcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbkFkZHJlc3MgVGhlIGFkZHJlc3MgdG8gdHJhbnNmZXIgdGhlIGZ1bmRzIHRvXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IE51bWJlciBtdXRleiB0byB0cmFuc2ZlclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0Q291bnRlciBXYWxsZXQgY291bnRlciB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyB7YW55fSBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIE1pY2hlbHNvbiBzY3JpcHQgdG8gc2lnbiBhbmQgYXBwcm92ZSBhIHRyYW5zZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZURhdGFUb1NpZ24oXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBkZXN0aW5hdGlvbkFkZHJlc3M6IHN0cmluZyxcbiAgYW1vdW50OiBzdHJpbmcsXG4gIGNvbnRyYWN0Q291bnRlcjogc3RyaW5nXG4pOiBhbnkge1xuICBpZiAoIWlzVmFsaWRPcmlnaW5hdGVkQWRkcmVzcyhjb250cmFjdEFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnRyYWN0IGFkZHJlc3MgJyArIGNvbnRyYWN0QWRkcmVzcyArICcuIEFuIG9yaWdpbmF0ZWQgYWNjb3VudCBhZGRyZXNzIHdhcyBleHBlY3RlZCcpO1xuICB9XG4gIGlmICghaXNWYWxpZEFkZHJlc3MoZGVzdGluYXRpb25BZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzICcgKyBkZXN0aW5hdGlvbkFkZHJlc3MpO1xuICB9XG4gIHJldHVybiBnZW5lcmljTXVsdGlzaWdEYXRhVG9TaWduKGNvbnRyYWN0QWRkcmVzcywgZGVzdGluYXRpb25BZGRyZXNzLCBhbW91bnQsIGNvbnRyYWN0Q291bnRlcik7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3MgaGFzaCBvZiB0aGUgZ2l2ZW4gdHlwZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gdGhlIHN0cmluZyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHtIYXNoVHlwZX0gaGFzaFR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgaGFzaFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSGFzaChoYXNoOiBzdHJpbmcsIGhhc2hUeXBlOiBIYXNoVHlwZSk6IGJvb2xlYW4ge1xuICAvLyBWYWxpZGF0ZSBlbmNvZGluZ1xuICBsZXQgZGVjb2RlZEhhc2g7XG4gIHRyeSB7XG4gICAgZGVjb2RlZEhhc2ggPSBiYXNlNThjaGVjay5kZWNvZGUoaGFzaCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaGFzaFByZWZpeCA9IGRlY29kZWRIYXNoLnNsaWNlKDAsIGhhc2hUeXBlLnByZWZpeC5sZW5ndGgpO1xuXG4gIC8vIENoZWNrIHByZWZpeFxuICBpZiAoIWhhc2hQcmVmaXguZXF1YWxzKEJ1ZmZlci5mcm9tKGhhc2hUeXBlLnByZWZpeCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgbGVuZ3RoXG4gIGNvbnN0IGhhc2hMZW5ndGggPSBkZWNvZGVkSGFzaC5sZW5ndGggLSBoYXNoUHJlZml4Lmxlbmd0aDtcbiAgcmV0dXJuIGhhc2hMZW5ndGggPT09IGhhc2hUeXBlLmJ5dGVMZW5ndGg7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3MgYWRkcmVzc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gdGhlIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEFkZHJlc3MoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkSW1wbGljaXRBZGRyZXNzKGhhc2gpIHx8IGlzVmFsaWRIYXNoKGhhc2gsIGhhc2hUeXBlcy5LVCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3MgaW1wbGljaXQgYWNjb3VudCBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSB0aGUgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSW1wbGljaXRBZGRyZXNzKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLnR6MSkgfHwgaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLnR6MikgfHwgaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLnR6Myk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3Mgb3JpZ2luYXRlZCBhY2NvdW50IGFkZHJlc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaGFzaCAtIHRoZSBhZGRyZXNzIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRPcmlnaW5hdGVkQWRkcmVzcyhoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRIYXNoKGhhc2gsIGhhc2hUeXBlcy5LVCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3Mgc2lnbmF0dXJlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSB0aGUgc2lnbmF0dXJlIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRTaWduYXR1cmUoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLmVkc2lnKSB8fFxuICAgIGlzVmFsaWRIYXNoKGhhc2gsIGhhc2hUeXBlcy5zcHNpZzEpIHx8XG4gICAgaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLnAyc2lnKSB8fFxuICAgIGlzVmFsaWRIYXNoKGhhc2gsIGhhc2hUeXBlcy5zaWcpXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3MgcHVibGljIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNLZXkgVGhlIHB1YmxpYyBrZXkgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGlzVmFsaWRIYXNoKHB1YmxpY0tleSwgaGFzaFR5cGVzLnNwcGspIHx8XG4gICAgaXNWYWxpZEhhc2gocHVibGljS2V5LCBoYXNoVHlwZXMucDJwaykgfHxcbiAgICBpc1ZhbGlkSGFzaChwdWJsaWNLZXksIGhhc2hUeXBlcy5lZHBrKSB8fFxuICAgIGlzVmFsaWRYcHViKHB1YmxpY0tleSkgLy8geHB1YnMgYXJlIHZhbGlkIHRvby5cbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBUZXpvcyBwcml2YXRlIGtleVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcml2YXRlS2V5IFRoZSBwcml2YXRlIGtleSB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUHJpdmF0ZUtleShwcml2YXRlS2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBpc1ZhbGlkSGFzaChwcml2YXRlS2V5LCBoYXNoVHlwZXMuZWRlc2spIHx8XG4gICAgaXNWYWxpZEhhc2gocHJpdmF0ZUtleSwgaGFzaFR5cGVzLmVkc2spIHx8XG4gICAgaXNWYWxpZEhhc2gocHJpdmF0ZUtleSwgaGFzaFR5cGVzLnNwc2spIHx8XG4gICAgaXNWYWxpZEhhc2gocHJpdmF0ZUtleSwgaGFzaFR5cGVzLnAyc2spXG4gICk7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgVGV6b3MgYmxvY2sgaGFzaFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gdGhlIGFkZHJlc3MgdG8gdmFsaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEJsb2NrSGFzaChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzVmFsaWRIYXNoKGhhc2gsIGhhc2hUeXBlcy5iKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBUZXpvcyB0cmFuc2FjdGlvbiBoYXNoXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSB0aGUgYWRkcmVzcyB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNhY3Rpb25IYXNoKGhhc2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZEhhc2goaGFzaCwgaGFzaFR5cGVzLm8pO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHN0cmluZyBpcyBhIHZhbGlkIFRlem9zIGtleSBnaXZlbiBhIHByZWZpeFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIC0gdGhlIGtleSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHtIYXNoVHlwZX0gaGFzaFR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgaGFzaFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkS2V5KGhhc2g6IHN0cmluZywgaGFzaFR5cGU6IEhhc2hUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkSGFzaChoYXNoLCBoYXNoVHlwZSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBvcmlnaW5hbCBrZXkgZm9ybSB0aGUgdGV4dCB3aXRob3V0IHRoZSBnaXZlbiBwcmVmaXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggLSBiYXNlNTggZW5jb2RlZCBrZXkgd2l0aCBhIFRlem9zIHByZWZpeFxuICogQHBhcmFtIHtIYXNoVHlwZX0gaGFzaFR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgcHJvdmlkZWQgaGFzaFxuICogQHJldHVybnMge0J1ZmZlcn0gdGhlIG9yaWdpbmFsIGRlY29kZWQga2V5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVLZXkoaGFzaDogc3RyaW5nLCBoYXNoVHlwZTogSGFzaFR5cGUpOiBCdWZmZXIge1xuICBpZiAoIWlzVmFsaWRLZXkoaGFzaCwgaGFzaFR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBwcml2YXRlIGtleScpO1xuICB9XG4gIGNvbnN0IGRlY29kZWRQcnYgPSBiYXNlNThjaGVjay5kZWNvZGUoaGFzaCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbShkZWNvZGVkUHJ2LnNsaWNlKGhhc2hUeXBlLnByZWZpeC5sZW5ndGgsIGRlY29kZWRQcnYubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSByYXcgc2lnbmF0dXJlIGZyb20gYSBUZXpvcyBlbmNvZGVkIG9uZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc2lnbmF0dXJlIFRlem9zIHNpZ25hdHVyZXMgcHJlZml4ZWQgd2l0aCBzaWcsIGVkc2lnLCBwMnNpZyBvciBzcHNpZ1xuICogQHBhcmFtIHtIYXNoVHlwZX0gaGFzaFR5cGUgVGhlIHByZWZpeCBvZiByZW1vdmVcbiAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSBkZWNvZGVkIHNpZ25hdHVyZSB3aXRob3V0IHByZWZpeFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nLCBoYXNoVHlwZTogSGFzaFR5cGUpOiBCdWZmZXIge1xuICBpZiAoIWlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc2lnbmF0dXJlJyk7XG4gIH1cbiAgY29uc3QgZGVjb2RlZFBydiA9IGJhc2U1OGNoZWNrLmRlY29kZShzaWduYXR1cmUpO1xuICByZXR1cm4gQnVmZmVyLmZyb20oZGVjb2RlZFBydi5zbGljZShoYXNoVHlwZS5wcmVmaXgubGVuZ3RoLCBkZWNvZGVkUHJ2Lmxlbmd0aCkpO1xufVxuXG4vLyBCYXNlNThDaGVjayBpcyB1c2VkIGZvciBlbmNvZGluZ1xuLy8gaGFzaGVkVHlwZXMgaXMgdXNlZCB0byB2YWxpZGF0ZSBoYXNoZXMgYnkgdHlwZSwgYnkgY2hlY2tpbmcgdGhlaXIgcHJlZml4IGFuZFxuLy8gdGhlIGxlbmd0aCBvZiB0aGUgQnVmZmVyIG9idGFpbmVkIGJ5IGRlY29kaW5nIHRoZSBoYXNoIChleGNsdWRpbmcgdGhlIHByZWZpeClcbmV4cG9ydCBjb25zdCBoYXNoVHlwZXMgPSB7XG4gIC8qIDIwIGJ5dGVzIGxvbmcgKi9cbiAgLy8gZWQyNTUxOSBwdWJsaWMga2V5IGhhc2hcbiAgdHoxOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbNiwgMTYxLCAxNTldKSxcbiAgICBieXRlTGVuZ3RoOiAyMCxcbiAgfSxcbiAgLy8gc2VjcDI1NmsxIHB1YmxpYyBrZXkgaGFzaFxuICB0ejI6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFs2LCAxNjEsIDE2MV0pLFxuICAgIGJ5dGVMZW5ndGg6IDIwLFxuICB9LFxuICAvLyBwMjU2IHB1YmxpYyBrZXkgaGFzaFxuICB0ejM6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFs2LCAxNjEsIDE2NF0pLFxuICAgIGJ5dGVMZW5ndGg6IDIwLFxuICB9LFxuICBLVDoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzIsIDkwLCAxMjFdKSxcbiAgICBieXRlTGVuZ3RoOiAyMCxcbiAgfSxcbiAgLyogMzIgYnl0ZXMgbG9uZyAqL1xuICAvLyBlZDI1NTE5IHB1YmxpYyBrZXlcbiAgZWRwazoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzEzLCAxNSwgMzcsIDIxN10pLFxuICAgIGJ5dGVMZW5ndGg6IDMyLFxuICB9LFxuICAvLyBlZDI1NTE5IHNlY3JldCBrZXlcbiAgZWRzazI6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFsxMywgMTUsIDU4LCA3XSksXG4gICAgYnl0ZUxlbmd0aDogMzIsXG4gIH0sXG4gIC8vIHNlY3AyNTZrMSBzZWNyZXQga2V5XG4gIHNwc2s6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFsxNywgMTYyLCAyMjQsIDIwMV0pLFxuICAgIGJ5dGVMZW5ndGg6IDMyLFxuICB9LFxuICAvLyBwMjU2IHNlY3JldCBrZXlcbiAgcDJzazoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzE2LCA4MSwgMjM4LCAxODldKSxcbiAgICBieXRlTGVuZ3RoOiAzMixcbiAgfSxcbiAgLy8gYmxvY2sgaGFzaFxuICBiOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbMSwgNTJdKSxcbiAgICBieXRlTGVuZ3RoOiAzMixcbiAgfSxcbiAgLy8gb3BlcmF0aW9uIGhhc2hcbiAgbzoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzUsIDExNl0pLFxuICAgIGJ5dGVMZW5ndGg6IDMyLFxuICB9LFxuICAvLyBvcGVyYXRpb24gbGlzdCBoYXNoXG4gIExvOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbMTMzLCAyMzNdKSxcbiAgICBieXRlTGVuZ3RoOiAzMixcbiAgfSxcbiAgLy8gb3BlcmF0aW9uIGxpc3QgbGlzdCBoYXNoXG4gIExMbzoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzI5LCAxNTksIDEwOV0pLFxuICAgIGJ5dGVMZW5ndGg6IDMyLFxuICB9LFxuICAvLyBwcm90b2NvbCBoYXNoXG4gIFA6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFsyLCAxNzBdKSxcbiAgICBieXRlTGVuZ3RoOiAzMixcbiAgfSxcbiAgLy8gY29udGV4dCBoYXNoXG4gIENvOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbNzksIDE3OV0pLFxuICAgIGJ5dGVMZW5ndGg6IDMyLFxuICB9LFxuICAvKiAzMyBieXRlcyBsb25nICovXG4gIC8vIHNlY3AyNTZrMSBwdWJsaWMga2V5XG4gIHNwcGs6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFszLCAyNTQsIDIyNiwgODZdKSxcbiAgICBieXRlTGVuZ3RoOiAzMyxcbiAgfSxcbiAgLy8gcDI1NiBwdWJsaWMga2V5XG4gIHAycGs6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFszLCAxNzgsIDEzOSwgMTI3XSksXG4gICAgYnl0ZUxlbmd0aDogMzMsXG4gIH0sXG4gIC8qIDU2IGJ5dGVzIGxvbmcgKi9cbiAgLy8gZWQyNTUxOSBlbmNyeXB0ZWQgc2VlZFxuICBlZGVzazoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzcsIDkwLCA2MCwgMTc5LCA0MV0pLFxuICAgIGJ5dGVMZW5ndGg6IDU2LFxuICB9LFxuICAvKiA2MyBieXRlcyBsb25nICovXG4gIC8vIGVkMjU1MTkgc2VjcmV0IGtleVxuICBlZHNrOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbNDMsIDI0NiwgNzgsIDddKSxcbiAgICBieXRlTGVuZ3RoOiA2NCxcbiAgfSxcbiAgLy8gZWQyNTUxOSBzaWduYXR1cmVcbiAgZWRzaWc6IHtcbiAgICBwcmVmaXg6IEJ1ZmZlci5mcm9tKFs5LCAyNDUsIDIwNSwgMTM0LCAxOF0pLFxuICAgIGJ5dGVMZW5ndGg6IDY0LFxuICB9LFxuICAvLyBzZWNwMjU2azEgc2lnbmF0dXJlXG4gIHNwc2lnMToge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzEzLCAxMTUsIDEwMSwgMTksIDYzXSksXG4gICAgYnl0ZUxlbmd0aDogNjQsXG4gIH0sXG4gIC8vIHAyNTZfc2lnbmF0dXJlXG4gIHAyc2lnOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbNTQsIDI0MCwgNDQsIDUyXSksXG4gICAgYnl0ZUxlbmd0aDogNjQsXG4gIH0sXG4gIC8vIGdlbmVyaWMgc2lnbmF0dXJlXG4gIHNpZzoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzQsIDEzMCwgNDNdKSxcbiAgICBieXRlTGVuZ3RoOiA2NCxcbiAgfSxcbiAgLyogMTUgYnl0ZXMgbG9uZyAqL1xuICAvLyBuZXR3b3JrIGhhc2hcbiAgTmV0OiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbODcsIDgyLCAwXSksXG4gICAgYnl0ZUxlbmd0aDogMTUsXG4gIH0sXG4gIC8vIG5vbmNlIGhhc2hcbiAgbmNlOiB7XG4gICAgcHJlZml4OiBCdWZmZXIuZnJvbShbNjksIDIyMCwgMTY5XSksXG4gICAgYnl0ZUxlbmd0aDogMTUsXG4gIH0sXG4gIC8qIDQgYnl0ZXMgbG9uZyAqL1xuICAvLyBjaGFpbiBpZFxuICBpZDoge1xuICAgIHByZWZpeDogQnVmZmVyLmZyb20oWzE1MywgMTAzXSksXG4gICAgYnl0ZUxlbmd0aDogNCxcbiAgfSxcbn07XG5cbi8vIEZyb20gaHR0cHM6Ly9naXRodWIuY29tL2VjYWRsYWJzL3RhcXVpdG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvdGFxdWl0by9zcmMvY29uc3RhbnRzLnRzXG5cbmV4cG9ydCBlbnVtIERFRkFVTFRfR0FTX0xJTUlUIHtcbiAgREVMRUdBVElPTiA9IDEwNjAwLFxuICBPUklHSU5BVElPTiA9IDEwNjAwLFxuICBUUkFOU0ZFUiA9IDEwNjAwLFxuICBSRVZFQUwgPSAxMDYwMCxcbn1cblxuZXhwb3J0IGVudW0gREVGQVVMVF9GRUUge1xuICBERUxFR0FUSU9OID0gMTI1NyxcbiAgT1JJR0lOQVRJT04gPSAxMDAwMCxcbiAgVFJBTlNGRVIgPSAxMDAwMCxcbiAgUkVWRUFMID0gMTQyMCxcbn1cblxuZXhwb3J0IGVudW0gREVGQVVMVF9TVE9SQUdFX0xJTUlUIHtcbiAgREVMRUdBVElPTiA9IDAsXG4gIE9SSUdJTkFUSU9OID0gMjU3LFxuICBUUkFOU0ZFUiA9IDI1NyxcbiAgUkVWRUFMID0gMCxcbn1cbiJdfQ==
@@ -1,3 +0,0 @@
1
- import { BitGoBase } from '@bitgo-beta/sdk-core';
2
- export declare const register: (sdk: BitGoBase) => void;
3
- //# sourceMappingURL=register.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAIjD,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAGzC,CAAC"}
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.register = void 0;
4
- const txtz_1 = require("./txtz");
5
- const xtz_1 = require("./xtz");
6
- const register = (sdk) => {
7
- sdk.register('xtz', xtz_1.Xtz.createInstance);
8
- sdk.register('txtz', txtz_1.Txtz.createInstance);
9
- };
10
- exports.register = register;
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaUNBQThCO0FBQzlCLCtCQUE0QjtBQUVyQixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWMsRUFBUSxFQUFFO0lBQy9DLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4QyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBSFcsUUFBQSxRQUFRLFlBR25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVHh0eiB9IGZyb20gJy4vdHh0eic7XG5pbXBvcnQgeyBYdHogfSBmcm9tICcuL3h0eic7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlciA9IChzZGs6IEJpdEdvQmFzZSk6IHZvaWQgPT4ge1xuICBzZGsucmVnaXN0ZXIoJ3h0eicsIFh0ei5jcmVhdGVJbnN0YW5jZSk7XG4gIHNkay5yZWdpc3RlcigndHh0eicsIFR4dHouY3JlYXRlSW5zdGFuY2UpO1xufTtcbiJdfQ==
@@ -1,13 +0,0 @@
1
- /**
2
- * Testnet Xtz
3
- *
4
- * @format
5
- */
6
- import { BaseCoin, BitGoBase } from '@bitgo-beta/sdk-core';
7
- import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
8
- import { Xtz } from './xtz';
9
- export declare class Txtz extends Xtz {
10
- protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
11
- static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>): BaseCoin;
12
- }
13
- //# sourceMappingURL=txtz.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"txtz.d.ts","sourceRoot":"","sources":["../../src/txtz.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,qBAAa,IAAK,SAAQ,GAAG;IAC3B,SAAS,aAAa,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAI/E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;CAG3F"}
package/dist/src/txtz.js DELETED
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Txtz = void 0;
4
- const xtz_1 = require("./xtz");
5
- class Txtz extends xtz_1.Xtz {
6
- constructor(bitgo, staticsCoin) {
7
- super(bitgo, staticsCoin);
8
- }
9
- static createInstance(bitgo, staticsCoin) {
10
- return new Txtz(bitgo, staticsCoin);
11
- }
12
- }
13
- exports.Txtz = Txtz;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHh0ei5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eHR6LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU9BLCtCQUE0QjtBQUU1QixNQUFhLElBQUssU0FBUSxTQUFHO0lBQzNCLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQVJELG9CQVFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUZXN0bmV0IFh0elxuICpcbiAqIEBmb3JtYXRcbiAqL1xuaW1wb3J0IHsgQmFzZUNvaW4sIEJpdEdvQmFzZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgWHR6IH0gZnJvbSAnLi94dHonO1xuXG5leHBvcnQgY2xhc3MgVHh0eiBleHRlbmRzIFh0eiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFR4dHooYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxufVxuIl19
package/dist/src/xtz.d.ts DELETED
@@ -1,80 +0,0 @@
1
- /// <reference types="node" />
2
- import { BaseCoin, BitGoBase, KeyPair as SdkCoreKeyPair, ParsedTransaction, ParseTransactionOptions, SignedTransaction, VerifyAddressOptions, VerifyTransactionOptions, TransactionExplanation } from '@bitgo-beta/sdk-core';
3
- import { BaseCoin as StaticsBaseCoin, CoinFamily } from '@bitgo-beta/statics';
4
- import { Interface } from './lib';
5
- export declare class Xtz extends BaseCoin {
6
- protected readonly _staticsCoin: Readonly<StaticsBaseCoin>;
7
- constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
8
- static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>): BaseCoin;
9
- getChain(): string;
10
- getFamily(): CoinFamily;
11
- getFullName(): string;
12
- getBaseFactor(): number;
13
- /**
14
- * Flag for sending value of 0
15
- * @returns {boolean} True if okay to send 0 value, false otherwise
16
- */
17
- valuelessTransferAllowed(): boolean;
18
- /**
19
- * Xtz supports transfers to consolidate balance from receive address to the wallet contract
20
- */
21
- allowsAccountConsolidations(): boolean;
22
- /**
23
- * Checks if this is a valid base58 or hex address
24
- * @param address
25
- */
26
- isValidAddress(address: string): boolean;
27
- /**
28
- * Generate Tezos key pair - BitGo xpub format
29
- *
30
- * @param seed
31
- * @returns {Object} object with generated xpub, xprv
32
- */
33
- generateKeyPair(seed?: Buffer): SdkCoreKeyPair;
34
- parseTransaction(params: ParseTransactionOptions): Promise<ParsedTransaction>;
35
- isWalletAddress(params: VerifyAddressOptions): Promise<boolean>;
36
- verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
37
- /**
38
- * Derive a user key using the chain path of the address
39
- * @param key
40
- * @param path
41
- * @returns {string} derived private key
42
- */
43
- deriveKeyWithPath({ key, path }: {
44
- key: string;
45
- path: string;
46
- }): string;
47
- /**
48
- * Assemble keychain and half-sign prebuilt transaction
49
- *
50
- * @param params
51
- * @param params.txPrebuild {Object} prebuild object returned by platform
52
- * @param params.prv {String} user prv
53
- * @param params.wallet.addressVersion {String} this is the version of the Algorand multisig address generation format
54
- * @returns Bluebird<SignedTransaction>
55
- */
56
- signTransaction(params: Interface.XtzSignTransactionOptions): Promise<SignedTransaction>;
57
- /**
58
- * Sign message with private key
59
- *
60
- * @param key
61
- * @param message
62
- */
63
- signMessage(key: SdkCoreKeyPair, message: string | Buffer): Promise<Buffer>;
64
- /**
65
- * Builds a funds recovery transaction without BitGo.
66
- * We need to do three queries during this:
67
- * 1) Node query - how much money is in the account
68
- * 2) Build transaction - build our transaction for the amount
69
- * 3) Send signed build - send our signed build to a public node
70
- * @param params
71
- */
72
- recover(params: any): Promise<any>;
73
- /**
74
- * Explain a Tezos transaction from txHex
75
- * @param params
76
- */
77
- explainTransaction(params: Interface.ExplainTransactionOptions): Promise<TransactionExplanation>;
78
- isValidPub(pub: string): boolean;
79
- }
80
- //# sourceMappingURL=xtz.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"xtz.d.ts","sourceRoot":"","sources":["../../src/xtz.ts"],"names":[],"mappings":";AAAA,OAAO,EACL,QAAQ,EACR,SAAS,EAET,OAAO,IAAI,cAAc,EAEzB,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,UAAU,EAAS,MAAM,qBAAqB,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAsC,MAAM,OAAO,CAAC;AAEtE,qBAAa,GAAI,SAAQ,QAAQ;IAC/B,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAE/C,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;IAUrE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,QAAQ;IAI1F,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,UAAU;IAIvB,WAAW,IAAI,MAAM;IAIrB,aAAa;IAIb;;;OAGG;IACH,wBAAwB,IAAI,OAAO;IAInC;;OAEG;IACH,2BAA2B,IAAI,OAAO;IAItC;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOxC;;;;;OAKG;IACH,eAAe,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,cAAc;IAcxC,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI7E,eAAe,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/D,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC;IAI3E;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAMvE;;;;;;;;OAQG;IACG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,yBAAyB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA6B9F;;;;;OAKG;IACG,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjF;;;;;;;OAOG;IACG,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAIxC;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA4BtG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAGjC"}