@bitgo-beta/sdk-coin-hbar 2.0.73-alpha.108 → 2.0.73-alpha.109
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/package.json +6 -6
- package/dist/src/hbar.d.ts +0 -168
- package/dist/src/hbar.d.ts.map +0 -1
- package/dist/src/hbar.js +0 -497
- package/dist/src/hbarToken.d.ts +0 -21
- package/dist/src/hbarToken.d.ts.map +0 -1
- package/dist/src/hbarToken.js +0 -58
- package/dist/src/index.d.ts +0 -6
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -22
- package/dist/src/lib/coinTransferBuilder.d.ts +0 -47
- package/dist/src/lib/coinTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/coinTransferBuilder.js +0 -159
- package/dist/src/lib/constants.d.ts +0 -8
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -12
- package/dist/src/lib/iface.d.ts +0 -50
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -3
- package/dist/src/lib/index.d.ts +0 -10
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -53
- package/dist/src/lib/keyPair.d.ts +0 -24
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -70
- package/dist/src/lib/tokenAssociateBuilder.d.ts +0 -38
- package/dist/src/lib/tokenAssociateBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenAssociateBuilder.js +0 -107
- package/dist/src/lib/tokenTransferBuilder.d.ts +0 -25
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenTransferBuilder.js +0 -130
- package/dist/src/lib/transaction.d.ts +0 -106
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -330
- package/dist/src/lib/transactionBuilder.d.ts +0 -111
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -284
- package/dist/src/lib/transactionBuilderFactory.d.ts +0 -47
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilderFactory.js +0 -88
- package/dist/src/lib/transferBuilder.d.ts +0 -24
- package/dist/src/lib/transferBuilder.d.ts.map +0 -1
- package/dist/src/lib/transferBuilder.js +0 -55
- package/dist/src/lib/utils.d.ts +0 -210
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -481
- package/dist/src/lib/walletInitializationBuilder.d.ts +0 -28
- package/dist/src/lib/walletInitializationBuilder.d.ts.map +0 -1
- package/dist/src/lib/walletInitializationBuilder.js +0 -124
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -15
- package/dist/src/seedValidator.d.ts +0 -31
- package/dist/src/seedValidator.d.ts.map +0 -1
- package/dist/src/seedValidator.js +0 -103
- package/dist/src/thbar.d.ts +0 -14
- package/dist/src/thbar.d.ts.map +0 -1
- package/dist/src/thbar.js +0 -17
package/dist/src/lib/utils.js
DELETED
|
@@ -1,481 +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
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.toUint8Array = exports.toHex = void 0;
|
|
40
|
-
exports.isValidAddress = isValidAddress;
|
|
41
|
-
exports.isValidTransactionId = isValidTransactionId;
|
|
42
|
-
exports.isValidPublicKey = isValidPublicKey;
|
|
43
|
-
exports.isNodeEnvironment = isNodeEnvironment;
|
|
44
|
-
exports.getCurrentTime = getCurrentTime;
|
|
45
|
-
exports.isValidTimeString = isValidTimeString;
|
|
46
|
-
exports.isValidAmount = isValidAmount;
|
|
47
|
-
exports.isValidRawTransactionFormat = isValidRawTransactionFormat;
|
|
48
|
-
exports.stringifyAccountId = stringifyAccountId;
|
|
49
|
-
exports.stringifyTokenId = stringifyTokenId;
|
|
50
|
-
exports.stringifyTxTime = stringifyTxTime;
|
|
51
|
-
exports.removePrefix = removePrefix;
|
|
52
|
-
exports.isValidMemo = isValidMemo;
|
|
53
|
-
exports.createRawKey = createRawKey;
|
|
54
|
-
exports.convertFromStellarPub = convertFromStellarPub;
|
|
55
|
-
exports.isSameBaseAddress = isSameBaseAddress;
|
|
56
|
-
exports.getBaseAddress = getBaseAddress;
|
|
57
|
-
exports.getAddressDetails = getAddressDetails;
|
|
58
|
-
exports.normalizeAddress = normalizeAddress;
|
|
59
|
-
exports.isValidAddressWithPaymentId = isValidAddressWithPaymentId;
|
|
60
|
-
exports.buildHederaTokenID = buildHederaTokenID;
|
|
61
|
-
exports.buildHederaAccountID = buildHederaAccountID;
|
|
62
|
-
exports.isValidHederaTokenID = isValidHederaTokenID;
|
|
63
|
-
exports.getHederaTokenIdFromName = getHederaTokenIdFromName;
|
|
64
|
-
exports.getHederaTokenNameFromId = getHederaTokenNameFromId;
|
|
65
|
-
exports.isTokenTransfer = isTokenTransfer;
|
|
66
|
-
exports.validateStartTime = validateStartTime;
|
|
67
|
-
exports.normalizeStarttime = normalizeStarttime;
|
|
68
|
-
exports.sleep = sleep;
|
|
69
|
-
exports.shouldBroadcastNow = shouldBroadcastNow;
|
|
70
|
-
const _ = __importStar(require("lodash"));
|
|
71
|
-
const sdk_1 = require("@hashgraph/sdk");
|
|
72
|
-
const proto_1 = require("@hashgraph/proto");
|
|
73
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
74
|
-
const stellar = __importStar(require("stellar-sdk"));
|
|
75
|
-
const url_1 = __importDefault(require("url"));
|
|
76
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
77
|
-
Object.defineProperty(exports, "toHex", { enumerable: true, get: function () { return sdk_core_1.toHex; } });
|
|
78
|
-
Object.defineProperty(exports, "toUint8Array", { enumerable: true, get: function () { return sdk_core_1.toUint8Array; } });
|
|
79
|
-
const statics_1 = require("@bitgo-beta/statics");
|
|
80
|
-
const MAX_TINYBARS_AMOUNT = new bignumber_js_1.default(2).pow(63).minus(1);
|
|
81
|
-
/**
|
|
82
|
-
* Returns whether the string is a valid Hedera account address
|
|
83
|
-
*
|
|
84
|
-
* In any form, `shard` and `realm` are assumed to be 0 if not provided.
|
|
85
|
-
*
|
|
86
|
-
* @param {string} address - The address to be validated
|
|
87
|
-
* @returns {boolean} - The validation result
|
|
88
|
-
*/
|
|
89
|
-
function isValidAddress(address) {
|
|
90
|
-
const addressArray = address.split('?memoId=');
|
|
91
|
-
if (_.isEmpty(address) ||
|
|
92
|
-
![1, 2].includes(addressArray.length) ||
|
|
93
|
-
!addressArray[0].match(/^\d+(?:(?=\.)(\.\d+){2}|(?!\.))$/) ||
|
|
94
|
-
(addressArray[1] && !isValidMemo(addressArray[1]))) {
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
|
-
try {
|
|
98
|
-
const acc = sdk_1.AccountId.fromString(addressArray[0]);
|
|
99
|
-
return !_.isNaN(acc.num);
|
|
100
|
-
}
|
|
101
|
-
catch (e) {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Returns whether the string is a valid Hedera transaction id
|
|
107
|
-
*
|
|
108
|
-
* @param {string} txId - The transaction id to be validated
|
|
109
|
-
* @returns {boolean} - The validation result
|
|
110
|
-
*/
|
|
111
|
-
function isValidTransactionId(txId) {
|
|
112
|
-
if (_.isEmpty(txId)) {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
try {
|
|
116
|
-
const tx = sdk_1.TransactionId.fromString(txId);
|
|
117
|
-
if (_.isNil(tx.accountId)) {
|
|
118
|
-
return false;
|
|
119
|
-
}
|
|
120
|
-
return !_.isNaN(tx.accountId.num);
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
Returns whether the string is a valid Hedera public key
|
|
128
|
-
*
|
|
129
|
-
* @param {string} key - The public key to be validated
|
|
130
|
-
* @returns {boolean} - The validation result
|
|
131
|
-
*/
|
|
132
|
-
function isValidPublicKey(key) {
|
|
133
|
-
if (_.isEmpty(key)) {
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
const pubKey = sdk_1.PublicKey.fromString(key.toLowerCase());
|
|
138
|
-
return !_.isNaN(pubKey.toString());
|
|
139
|
-
}
|
|
140
|
-
catch (e) {
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Checks whether nodeJS.process exist and if a node version is defined to determine if this is an nodeJS environment
|
|
146
|
-
*
|
|
147
|
-
* @returns {boolean} - The validation result
|
|
148
|
-
*/
|
|
149
|
-
function isNodeEnvironment() {
|
|
150
|
-
return typeof process !== 'undefined' && typeof process.versions.node !== 'undefined';
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Calculate the current time with nanoseconds precision
|
|
154
|
-
*
|
|
155
|
-
* @returns {string} - The current time in seconds
|
|
156
|
-
*/
|
|
157
|
-
function getCurrentTime() {
|
|
158
|
-
if (isNodeEnvironment()) {
|
|
159
|
-
const nanos = process.hrtime()[1];
|
|
160
|
-
const seconds = (Date.now() * 1000000 + nanos) / 1000000000;
|
|
161
|
-
return seconds.toFixed(9);
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
return (performance.timeOrigin + performance.now()).toFixed(9);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Returns whether the string is a valid timestamp
|
|
169
|
-
*
|
|
170
|
-
* Nanoseconds are optional and can be passed after a dot, for example: 1595374723.356981689
|
|
171
|
-
*
|
|
172
|
-
* @param {string} time - The timestamp to be validated
|
|
173
|
-
* @returns {boolean} - The validation result
|
|
174
|
-
*/
|
|
175
|
-
function isValidTimeString(time) {
|
|
176
|
-
return /^\d+(\.\d+)?$/.test(time);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Returns whether the string is a valid amount number
|
|
180
|
-
*
|
|
181
|
-
* @param {string} amount - The string to validate
|
|
182
|
-
* @returns {boolean} - The validation result
|
|
183
|
-
*/
|
|
184
|
-
function isValidAmount(amount) {
|
|
185
|
-
const bigNumberAmount = new bignumber_js_1.default(amount);
|
|
186
|
-
return (bigNumberAmount.isInteger() &&
|
|
187
|
-
bigNumberAmount.isGreaterThanOrEqualTo(0) &&
|
|
188
|
-
bigNumberAmount.isLessThanOrEqualTo(MAX_TINYBARS_AMOUNT));
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Returns whether the provided raw transaction accommodates to bitgo's preferred format
|
|
192
|
-
*
|
|
193
|
-
* @param {any} rawTransaction - The raw transaction to be checked
|
|
194
|
-
* @returns {boolean} - The validation result
|
|
195
|
-
*/
|
|
196
|
-
function isValidRawTransactionFormat(rawTransaction) {
|
|
197
|
-
const isAlphaNumeric = typeof rawTransaction === 'string' && /^[\da-fA-F]+$/.test(rawTransaction);
|
|
198
|
-
const isValidBuffer = Buffer.isBuffer(rawTransaction) && !!Uint8Array.from(rawTransaction);
|
|
199
|
-
return isAlphaNumeric || isValidBuffer;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Returns a string representation of an {proto.IAccountID} object
|
|
203
|
-
*
|
|
204
|
-
* @param {proto.IAccountID} accountId - Account id to be cast to string
|
|
205
|
-
* @returns {string} - The string representation of the {proto.IAccountID}
|
|
206
|
-
*/
|
|
207
|
-
function stringifyAccountId({ shardNum, realmNum, accountNum }) {
|
|
208
|
-
return `${shardNum || 0}.${realmNum || 0}.${accountNum}`;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* Returns a string representation of an {proto.ITokenID} object
|
|
212
|
-
*
|
|
213
|
-
* @param {proto.ITokenID} - token id to be cast to string
|
|
214
|
-
* @returns {string} - the string representation of the {proto.ITokenID}
|
|
215
|
-
*/
|
|
216
|
-
function stringifyTokenId({ shardNum, realmNum, tokenNum }) {
|
|
217
|
-
return `${shardNum || 0}.${realmNum || 0}.${tokenNum}`;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Returns a string representation of an {proto.ITimestamp} object
|
|
221
|
-
*
|
|
222
|
-
* @param {proto.ITimestamp} timestamp - Timestamp to be cast to string
|
|
223
|
-
* @returns {string} - The string representation of the {proto.ITimestamp}
|
|
224
|
-
*/
|
|
225
|
-
function stringifyTxTime({ seconds, nanos }) {
|
|
226
|
-
return `${seconds}.${nanos}`;
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Remove the specified prefix from a string only if it starts with that prefix
|
|
230
|
-
*
|
|
231
|
-
* @param {string} prefix - The prefix to be removed
|
|
232
|
-
* @param {string} key - The original string, usually a private or public key
|
|
233
|
-
* @returns {string} - The string without prefix
|
|
234
|
-
*/
|
|
235
|
-
function removePrefix(prefix, key) {
|
|
236
|
-
if (key.startsWith(prefix)) {
|
|
237
|
-
return key.slice(prefix.length);
|
|
238
|
-
}
|
|
239
|
-
return key;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Check if this is a valid memo
|
|
243
|
-
*
|
|
244
|
-
* @param {string} memo
|
|
245
|
-
* @returns {boolean}
|
|
246
|
-
*/
|
|
247
|
-
function isValidMemo(memo) {
|
|
248
|
-
return !(_.isEmpty(memo) || Buffer.from(memo).length > 100);
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Uses the native hashgraph SDK function to get a raw key.
|
|
252
|
-
*
|
|
253
|
-
* @param {string} prv - Private key
|
|
254
|
-
* @returns {PrivateKey}
|
|
255
|
-
*/
|
|
256
|
-
function createRawKey(prv) {
|
|
257
|
-
return sdk_1.PrivateKey.fromString(prv);
|
|
258
|
-
}
|
|
259
|
-
/**
|
|
260
|
-
* Converts a stellar public key to ed25519 hex format
|
|
261
|
-
*
|
|
262
|
-
* @param {string} stellarPub
|
|
263
|
-
* @returns {string}
|
|
264
|
-
*/
|
|
265
|
-
function convertFromStellarPub(stellarPub) {
|
|
266
|
-
if (!stellar.StrKey.isValidEd25519PublicKey(stellarPub)) {
|
|
267
|
-
throw new Error('Not a valid stellar pub.');
|
|
268
|
-
}
|
|
269
|
-
const rawKey = stellar.StrKey.decodeEd25519PublicKey(stellarPub);
|
|
270
|
-
return rawKey.toString('hex');
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Checks if two addresses have the same base address
|
|
274
|
-
*
|
|
275
|
-
* @param {String} address
|
|
276
|
-
* @param {String} baseAddress
|
|
277
|
-
* @returns {boolean}
|
|
278
|
-
*/
|
|
279
|
-
function isSameBaseAddress(address, baseAddress) {
|
|
280
|
-
if (!isValidAddressWithPaymentId(address)) {
|
|
281
|
-
throw new sdk_core_1.UtilsError(`invalid address: ${address}`);
|
|
282
|
-
}
|
|
283
|
-
return getBaseAddress(address) === getBaseAddress(baseAddress);
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Returns the base address portion of an address
|
|
287
|
-
*
|
|
288
|
-
* @param {String} address
|
|
289
|
-
* @returns {String} - the base address
|
|
290
|
-
*/
|
|
291
|
-
function getBaseAddress(address) {
|
|
292
|
-
const addressDetails = getAddressDetails(address);
|
|
293
|
-
return addressDetails.address;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* Process address into address and memo id
|
|
297
|
-
*
|
|
298
|
-
* @param {string} rawAddress
|
|
299
|
-
* @returns {AddressDetails} - object containing address and memo id
|
|
300
|
-
*/
|
|
301
|
-
function getAddressDetails(rawAddress) {
|
|
302
|
-
const addressDetails = url_1.default.parse(rawAddress);
|
|
303
|
-
const queryDetails = addressDetails.query ? new URLSearchParams(addressDetails.query) : undefined;
|
|
304
|
-
const baseAddress = addressDetails.pathname;
|
|
305
|
-
if (!isValidAddress(baseAddress)) {
|
|
306
|
-
throw new sdk_core_1.UtilsError(`invalid address: ${rawAddress}`);
|
|
307
|
-
}
|
|
308
|
-
// address doesn't have a memo id or memoId is empty
|
|
309
|
-
if (baseAddress === rawAddress) {
|
|
310
|
-
return {
|
|
311
|
-
address: rawAddress,
|
|
312
|
-
memoId: undefined,
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
if (!queryDetails || _.isNil(queryDetails.get('memoId'))) {
|
|
316
|
-
// if there are more properties, the query details need to contain the memo id property
|
|
317
|
-
throw new sdk_core_1.UtilsError(`invalid address with memo id: ${rawAddress}`);
|
|
318
|
-
}
|
|
319
|
-
const memoId = queryDetails.get('memoId');
|
|
320
|
-
if (!isValidMemo(memoId)) {
|
|
321
|
-
throw new sdk_core_1.UtilsError(`invalid address: '${rawAddress}', memoId is not valid`);
|
|
322
|
-
}
|
|
323
|
-
return {
|
|
324
|
-
address: baseAddress,
|
|
325
|
-
memoId,
|
|
326
|
-
};
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Validate and return address with appended memo id
|
|
330
|
-
*
|
|
331
|
-
* @param {AddressDetails} addressDetails - Address which to append memo id
|
|
332
|
-
* @returns {string} - Address with appended memo id
|
|
333
|
-
*/
|
|
334
|
-
function normalizeAddress({ address, memoId }) {
|
|
335
|
-
if (memoId && isValidMemo(memoId)) {
|
|
336
|
-
return `${address}?memoId=${memoId}`;
|
|
337
|
-
}
|
|
338
|
-
return address;
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Return boolean indicating whether input is a valid address with memo id
|
|
342
|
-
*
|
|
343
|
-
* @param {string} address - Address in the form <address>?memoId=<memoId>
|
|
344
|
-
* @returns {boolean} - True if input is a valid address
|
|
345
|
-
*/
|
|
346
|
-
function isValidAddressWithPaymentId(address) {
|
|
347
|
-
try {
|
|
348
|
-
const addressDetails = getAddressDetails(address);
|
|
349
|
-
return address === normalizeAddress(addressDetails);
|
|
350
|
-
}
|
|
351
|
-
catch (e) {
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Build hedera {proto.TokenID} object from token ID string
|
|
357
|
-
*
|
|
358
|
-
* @param {string} tokenID - The token ID to build
|
|
359
|
-
* @returns {proto.TokenID} - The resulting proto TokenID object
|
|
360
|
-
*/
|
|
361
|
-
function buildHederaTokenID(tokenID) {
|
|
362
|
-
const tokenData = sdk_1.TokenId.fromString(tokenID);
|
|
363
|
-
return new proto_1.proto.TokenID({
|
|
364
|
-
tokenNum: tokenData.num,
|
|
365
|
-
realmNum: tokenData.realm,
|
|
366
|
-
shardNum: tokenData.shard,
|
|
367
|
-
});
|
|
368
|
-
}
|
|
369
|
-
/**
|
|
370
|
-
* Build hedera {proto.AccountID} object from account ID string
|
|
371
|
-
*
|
|
372
|
-
* @param {string} accountID - The account ID to build
|
|
373
|
-
* @returns {proto} - The resulting proto AccountID object
|
|
374
|
-
*/
|
|
375
|
-
function buildHederaAccountID(accountID) {
|
|
376
|
-
const accountId = sdk_1.AccountId.fromString(accountID);
|
|
377
|
-
return new proto_1.proto.AccountID({
|
|
378
|
-
shardNum: accountId.shard,
|
|
379
|
-
realmNum: accountId.realm,
|
|
380
|
-
accountNum: accountId.num,
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Check if Hedera token ID is valid and supported
|
|
385
|
-
*
|
|
386
|
-
* @param {string} tokenId - The token ID to validate
|
|
387
|
-
* @returns {boolean} - True if tokenId is valid and supported
|
|
388
|
-
*/
|
|
389
|
-
function isValidHederaTokenID(tokenId) {
|
|
390
|
-
const isFormatValid = !_.isEmpty(tokenId) && !!tokenId.match(/^\d+(?:(?=\.)(\.\d+){2}|(?!\.))$/);
|
|
391
|
-
const isTokenSupported = getHederaTokenNameFromId(tokenId) !== undefined;
|
|
392
|
-
return isFormatValid && isTokenSupported;
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Get the associated hedera token ID from token name, if supported
|
|
396
|
-
*
|
|
397
|
-
* @param {string} tokenName - The hedera token name
|
|
398
|
-
* @returns {boolean} - The associated token ID or undefined if not supported
|
|
399
|
-
*/
|
|
400
|
-
function getHederaTokenIdFromName(tokenName) {
|
|
401
|
-
if (statics_1.coins.has(tokenName)) {
|
|
402
|
-
const token = statics_1.coins.get(tokenName);
|
|
403
|
-
if (token.isToken && token instanceof statics_1.HederaToken) {
|
|
404
|
-
return token.tokenId;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
return undefined;
|
|
408
|
-
}
|
|
409
|
-
/**
|
|
410
|
-
* Get the associated hedera token from token ID, if supported
|
|
411
|
-
*
|
|
412
|
-
* @param tokenId - The token address
|
|
413
|
-
* @returns {BaseCoin} - BaseCoin object for the matching token
|
|
414
|
-
*/
|
|
415
|
-
function getHederaTokenNameFromId(tokenId) {
|
|
416
|
-
const tokensArray = statics_1.coins
|
|
417
|
-
.filter((coin) => {
|
|
418
|
-
return coin instanceof statics_1.HederaToken && coin.tokenId === tokenId;
|
|
419
|
-
})
|
|
420
|
-
.map((token) => token); // flatten coin map to array
|
|
421
|
-
return tokensArray.length > 0 ? tokensArray[0] : undefined;
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Return boolean indicating whether input is a valid token transfer transaction
|
|
425
|
-
*
|
|
426
|
-
* @param {proto.ICryptoTransferTransactionBody | null} transferTxBody is a transfer transaction body
|
|
427
|
-
* @returns {boolean} true is input is a valid token transfer transaction
|
|
428
|
-
*/
|
|
429
|
-
function isTokenTransfer(transferTxBody) {
|
|
430
|
-
return !!transferTxBody && !!transferTxBody.tokenTransfers && transferTxBody.tokenTransfers.length > 0;
|
|
431
|
-
}
|
|
432
|
-
/** validates a startTime string to be a valid timestamp and in the future
|
|
433
|
-
* @param {string} startTime - The startTime to be validated
|
|
434
|
-
* @throws {Error} - if startTime is not a valid timestamp or is in the past
|
|
435
|
-
* @returns {void}
|
|
436
|
-
* */
|
|
437
|
-
function validateStartTime(startTime) {
|
|
438
|
-
if (!isValidTimeString(startTime)) {
|
|
439
|
-
throw new Error('invalid startTime, got: ' + startTime);
|
|
440
|
-
}
|
|
441
|
-
const currentTime = getCurrentTime();
|
|
442
|
-
const startTimeFixed = normalizeStarttime(startTime);
|
|
443
|
-
const result = new bignumber_js_1.default(startTimeFixed).isLessThanOrEqualTo(currentTime);
|
|
444
|
-
if (result) {
|
|
445
|
-
throw new Error('startTime must be a future timestamp, got: ' + startTime);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
function normalizeStarttime(startTime) {
|
|
449
|
-
return new bignumber_js_1.default(startTime).toFixed(9);
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* Await for a given amount of time in milliseconds
|
|
453
|
-
* @param ms - The amount of time to wait in milliseconds
|
|
454
|
-
* @returns {Promise<void>} - A promise that resolves after the given amount of time
|
|
455
|
-
*/
|
|
456
|
-
function sleep(ms) {
|
|
457
|
-
console.log(`sleeping for ${ms} ms`);
|
|
458
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* Check if the startTime is within the broadcast window (5 seconds after and 175 seconds after the startTime)
|
|
462
|
-
*/
|
|
463
|
-
function shouldBroadcastNow(startTime) {
|
|
464
|
-
const startTimeFixed = normalizeStarttime(startTime);
|
|
465
|
-
const currentTime = getCurrentTime();
|
|
466
|
-
// startTime plus 5 seconds
|
|
467
|
-
const startingTimeWindow = new bignumber_js_1.default(startTimeFixed).plus(5).toFixed(9);
|
|
468
|
-
// startTime plus 170 seconds
|
|
469
|
-
const endingTimeWindow = new bignumber_js_1.default(startTimeFixed).plus(175).toFixed(9);
|
|
470
|
-
if (new bignumber_js_1.default(currentTime).isGreaterThan(endingTimeWindow)) {
|
|
471
|
-
throw new Error('startTime window expired, got: ' +
|
|
472
|
-
startTimeFixed +
|
|
473
|
-
' - currentTime: ' +
|
|
474
|
-
currentTime +
|
|
475
|
-
' - endingTimeWindow ' +
|
|
476
|
-
endingTimeWindow);
|
|
477
|
-
}
|
|
478
|
-
return (new bignumber_js_1.default(currentTime).isGreaterThanOrEqualTo(startingTimeWindow) &&
|
|
479
|
-
new bignumber_js_1.default(currentTime).isLessThanOrEqualTo(endingTimeWindow));
|
|
480
|
-
}
|
|
481
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXFCQSx3Q0FrQkM7QUFRRCxvREFhQztBQVFELDRDQVVDO0FBT0QsOENBRUM7QUFPRCx3Q0FRQztBQVVELDhDQUVDO0FBUUQsc0NBT0M7QUFRRCxrRUFLQztBQVFELGdEQUVDO0FBUUQsNENBRUM7QUFRRCwwQ0FFQztBQVNELG9DQUtDO0FBUUQsa0NBRUM7QUFRRCxvQ0FFQztBQVFELHNEQU9DO0FBU0QsOENBS0M7QUFRRCx3Q0FHQztBQVFELDhDQTZCQztBQVFELDRDQUtDO0FBUUQsa0VBT0M7QUFRRCxnREFPQztBQVFELG9EQU9DO0FBUUQsb0RBS0M7QUFRRCw0REFTQztBQVFELDREQVFDO0FBUUQsMENBRUM7QUFPRCw4Q0FVQztBQUVELGdEQUVDO0FBT0Qsc0JBR0M7QUFLRCxnREF1QkM7QUF4Y0QsMENBQTRCO0FBQzVCLHdDQUEwRjtBQUMxRiw0Q0FBeUM7QUFDekMsZ0VBQXFDO0FBQ3JDLHFEQUF1QztBQUV2Qyw4Q0FBc0I7QUFDdEIsbURBQXVFO0FBRTlELHNGQUZBLGdCQUFLLE9BRUE7QUFBRSw2RkFGQSx1QkFBWSxPQUVBO0FBRDVCLGlEQUFtRTtBQUduRSxNQUFNLG1CQUFtQixHQUFHLElBQUksc0JBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRTlEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLElBQ0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUMsRUFB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LFdBQVcsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLENBQ2pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQWNjb3VudElkLCBQcml2YXRlS2V5LCBQdWJsaWNLZXksIFRva2VuSWQsIFRyYW5zYWN0aW9uSWQgfSBmcm9tICdAaGFzaGdyYXBoL3Nkayc7XG5pbXBvcnQgeyBwcm90byB9IGZyb20gJ0BoYXNoZ3JhcGgvcHJvdG8nO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgc3RlbGxhciBmcm9tICdzdGVsbGFyLXNkayc7XG5pbXBvcnQgeyBBZGRyZXNzRGV0YWlscyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuaW1wb3J0IHsgdG9IZXgsIHRvVWludDhBcnJheSwgVXRpbHNFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luLCBjb2lucywgSGVkZXJhVG9rZW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmV4cG9ydCB7IHRvSGV4LCB0b1VpbnQ4QXJyYXkgfTtcblxuY29uc3QgTUFYX1RJTllCQVJTX0FNT1VOVCA9IG5ldyBCaWdOdW1iZXIoMikucG93KDYzKS5taW51cygxKTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEhlZGVyYSBhY2NvdW50IGFkZHJlc3NcbiAqXG4gKiBJbiBhbnkgZm9ybSwgYHNoYXJkYCBhbmQgYHJlYWxtYCBhcmUgYXNzdW1lZCB0byBiZSAwIGlmIG5vdCBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWRkcmVzc0FycmF5ID0gYWRkcmVzcy5zcGxpdCgnP21lbW9JZD0nKTtcblxuICBpZiAoXG4gICAgXy5pc0VtcHR5KGFkZHJlc3MpIHx8XG4gICAgIVsxLCAyXS5pbmNsdWRlcyhhZGRyZXNzQXJyYXkubGVuZ3RoKSB8fFxuICAgICFhZGRyZXNzQXJyYXlbMF0ubWF0Y2goL15cXGQrKD86KD89XFwuKShcXC5cXGQrKXsyfXwoPyFcXC4pKSQvKSB8fFxuICAgIChhZGRyZXNzQXJyYXlbMV0gJiYgIWlzVmFsaWRNZW1vKGFkZHJlc3NBcnJheVsxXSkpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYWNjID0gQWNjb3VudElkLmZyb21TdHJpbmcoYWRkcmVzc0FycmF5WzBdKTtcbiAgICByZXR1cm4gIV8uaXNOYU4oYWNjLm51bSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEhlZGVyYSB0cmFuc2FjdGlvbiBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0eElkIC0gVGhlIHRyYW5zYWN0aW9uIGlkIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKF8uaXNFbXB0eSh0eElkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb25JZC5mcm9tU3RyaW5nKHR4SWQpO1xuICAgIGlmIChfLmlzTmlsKHR4LmFjY291bnRJZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICFfLmlzTmFOKHR4LmFjY291bnRJZC5udW0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuIFJldHVybnMgd2hldGhlciB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgSGVkZXJhIHB1YmxpYyBrZXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHB1YmxpYyBrZXkgdG8gYmUgdmFsaWRhdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKF8uaXNFbXB0eShrZXkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcHViS2V5ID0gUHVibGljS2V5LmZyb21TdHJpbmcoa2V5LnRvTG93ZXJDYXNlKCkpO1xuICAgIHJldHVybiAhXy5pc05hTihwdWJLZXkudG9TdHJpbmcoKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBub2RlSlMucHJvY2VzcyBleGlzdCBhbmQgaWYgYSBub2RlIHZlcnNpb24gaXMgZGVmaW5lZCB0byBkZXRlcm1pbmUgaWYgdGhpcyBpcyBhbiBub2RlSlMgZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZUVudmlyb25tZW50KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgIT09ICd1bmRlZmluZWQnO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgY3VycmVudCB0aW1lIHdpdGggbmFub3NlY29uZHMgcHJlY2lzaW9uXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgY3VycmVudCB0aW1lIGluIHNlY29uZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRUaW1lKCk6IHN0cmluZyB7XG4gIGlmIChpc05vZGVFbnZpcm9ubWVudCgpKSB7XG4gICAgY29uc3QgbmFub3MgPSBwcm9jZXNzLmhydGltZSgpWzFdO1xuICAgIGNvbnN0IHNlY29uZHMgPSAoRGF0ZS5ub3coKSAqIDEwMDAwMDAgKyBuYW5vcykgLyAxMDAwMDAwMDAwO1xuICAgIHJldHVybiBzZWNvbmRzLnRvRml4ZWQoOSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkpLnRvRml4ZWQoOSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBhIHZhbGlkIHRpbWVzdGFtcFxuICpcbiAqIE5hbm9zZWNvbmRzIGFyZSBvcHRpb25hbCBhbmQgY2FuIGJlIHBhc3NlZCBhZnRlciBhIGRvdCwgZm9yIGV4YW1wbGU6IDE1OTUzNzQ3MjMuMzU2OTgxNjg5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRpbWUgLSBUaGUgdGltZXN0YW1wIHRvIGJlIHZhbGlkYXRlZFxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVGhlIHZhbGlkYXRpb24gcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGltZVN0cmluZyh0aW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9eXFxkKyhcXC5cXGQrKT8kLy50ZXN0KHRpbWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgYW1vdW50IG51bWJlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbW91bnQgLSBUaGUgc3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBbW91bnQoYW1vdW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmlnTnVtYmVyQW1vdW50ID0gbmV3IEJpZ051bWJlcihhbW91bnQpO1xuICByZXR1cm4gKFxuICAgIGJpZ051bWJlckFtb3VudC5pc0ludGVnZXIoKSAmJlxuICAgIGJpZ051bWJlckFtb3VudC5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDApICYmXG4gICAgYmlnTnVtYmVyQW1vdW50LmlzTGVzc1RoYW5PckVxdWFsVG8oTUFYX1RJTllCQVJTX0FNT1VOVClcbiAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHJhdyB0cmFuc2FjdGlvbiBhY2NvbW1vZGF0ZXMgdG8gYml0Z28ncyBwcmVmZXJyZWQgZm9ybWF0XG4gKlxuICogQHBhcmFtIHthbnl9IHJhd1RyYW5zYWN0aW9uIC0gVGhlIHJhdyB0cmFuc2FjdGlvbiB0byBiZSBjaGVja2VkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgdmFsaWRhdGlvbiByZXN1bHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRSYXdUcmFuc2FjdGlvbkZvcm1hdChyYXdUcmFuc2FjdGlvbjogYW55KTogYm9vbGVhbiB7XG4gIGNvbnN0IGlzQWxwaGFOdW1lcmljID0gdHlwZW9mIHJhd1RyYW5zYWN0aW9uID09PSAnc3RyaW5nJyAmJiAvXltcXGRhLWZBLUZdKyQvLnRlc3QocmF3VHJhbnNhY3Rpb24pO1xuICBjb25zdCBpc1ZhbGlkQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyKHJhd1RyYW5zYWN0aW9uKSAmJiAhIVVpbnQ4QXJyYXkuZnJvbShyYXdUcmFuc2FjdGlvbik7XG5cbiAgcmV0dXJuIGlzQWxwaGFOdW1lcmljIHx8IGlzVmFsaWRCdWZmZXI7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiB7cHJvdG8uSUFjY291bnRJRH0gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtwcm90by5JQWNjb3VudElEfSBhY2NvdW50SWQgLSBBY2NvdW50IGlkIHRvIGJlIGNhc3QgdG8gc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHtwcm90by5JQWNjb3VudElEfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5QWNjb3VudElkKHsgc2hhcmROdW0sIHJlYWxtTnVtLCBhY2NvdW50TnVtIH06IHByb3RvLklBY2NvdW50SUQpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2hhcmROdW0gfHwgMH0uJHtyZWFsbU51bSB8fCAwfS4ke2FjY291bnROdW19YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHtwcm90by5JVG9rZW5JRH0gb2JqZWN0XG4gKlxuICogQHBhcmFtIHtwcm90by5JVG9rZW5JRH0gLSB0b2tlbiBpZCB0byBiZSBjYXN0IHRvIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7cHJvdG8uSVRva2VuSUR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnlUb2tlbklkKHsgc2hhcmROdW0sIHJlYWxtTnVtLCB0b2tlbk51bSB9OiBwcm90by5JVG9rZW5JRCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzaGFyZE51bSB8fCAwfS4ke3JlYWxtTnVtIHx8IDB9LiR7dG9rZW5OdW19YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIHtwcm90by5JVGltZXN0YW1wfSBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge3Byb3RvLklUaW1lc3RhbXB9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcCB0byBiZSBjYXN0IHRvIHN0cmluZ1xuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB7cHJvdG8uSVRpbWVzdGFtcH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeVR4VGltZSh7IHNlY29uZHMsIG5hbm9zIH06IHByb3RvLklUaW1lc3RhbXApOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2Vjb25kc30uJHtuYW5vc31gO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHByZWZpeCBmcm9tIGEgc3RyaW5nIG9ubHkgaWYgaXQgc3RhcnRzIHdpdGggdGhhdCBwcmVmaXhcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gVGhlIHByZWZpeCB0byBiZSByZW1vdmVkXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIG9yaWdpbmFsIHN0cmluZywgdXN1YWxseSBhIHByaXZhdGUgb3IgcHVibGljIGtleVxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgc3RyaW5nIHdpdGhvdXQgcHJlZml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQcmVmaXgocHJlZml4OiBzdHJpbmcsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICByZXR1cm4ga2V5LnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBrZXk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIG1lbW9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVtb1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkTWVtbyhtZW1vOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuICEoXy5pc0VtcHR5KG1lbW8pIHx8IEJ1ZmZlci5mcm9tKG1lbW8pLmxlbmd0aCA+IDEwMCk7XG59XG5cbi8qKlxuICogVXNlcyB0aGUgbmF0aXZlIGhhc2hncmFwaCBTREsgZnVuY3Rpb24gdG8gZ2V0IGEgcmF3IGtleS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJ2IC0gUHJpdmF0ZSBrZXlcbiAqIEByZXR1cm5zIHtQcml2YXRlS2V5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmF3S2V5KHBydjogc3RyaW5nKTogUHJpdmF0ZUtleSB7XG4gIHJldHVybiBQcml2YXRlS2V5LmZyb21TdHJpbmcocHJ2KTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0ZWxsYXIgcHVibGljIGtleSB0byBlZDI1NTE5IGhleCBmb3JtYXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RlbGxhclB1YlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRGcm9tU3RlbGxhclB1YihzdGVsbGFyUHViOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5UHVibGljS2V5KHN0ZWxsYXJQdWIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYSB2YWxpZCBzdGVsbGFyIHB1Yi4nKTtcbiAgfVxuXG4gIGNvbnN0IHJhd0tleTogQnVmZmVyID0gc3RlbGxhci5TdHJLZXkuZGVjb2RlRWQyNTUxOVB1YmxpY0tleShzdGVsbGFyUHViKTtcbiAgcmV0dXJuIHJhd0tleS50b1N0cmluZygnaGV4Jyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHR3byBhZGRyZXNzZXMgaGF2ZSB0aGUgc2FtZSBiYXNlIGFkZHJlc3NcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzc1xuICogQHBhcmFtIHtTdHJpbmd9IGJhc2VBZGRyZXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FtZUJhc2VBZGRyZXNzKGFkZHJlc3M6IHN0cmluZywgYmFzZUFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzKSkge1xuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3M6ICR7YWRkcmVzc31gKTtcbiAgfVxuICByZXR1cm4gZ2V0QmFzZUFkZHJlc3MoYWRkcmVzcykgPT09IGdldEJhc2VBZGRyZXNzKGJhc2VBZGRyZXNzKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIGFkZHJlc3MgcG9ydGlvbiBvZiBhbiBhZGRyZXNzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFkZHJlc3NcbiAqIEByZXR1cm5zIHtTdHJpbmd9IC0gdGhlIGJhc2UgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QmFzZUFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBnZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3M7XG59XG5cbi8qKlxuICogUHJvY2VzcyBhZGRyZXNzIGludG8gYWRkcmVzcyBhbmQgbWVtbyBpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByYXdBZGRyZXNzXG4gKiBAcmV0dXJucyB7QWRkcmVzc0RldGFpbHN9IC0gb2JqZWN0IGNvbnRhaW5pbmcgYWRkcmVzcyBhbmQgbWVtbyBpZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWRkcmVzc0RldGFpbHMocmF3QWRkcmVzczogc3RyaW5nKTogQWRkcmVzc0RldGFpbHMge1xuICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IHVybC5wYXJzZShyYXdBZGRyZXNzKTtcbiAgY29uc3QgcXVlcnlEZXRhaWxzID0gYWRkcmVzc0RldGFpbHMucXVlcnkgPyBuZXcgVVJMU2VhcmNoUGFyYW1zKGFkZHJlc3NEZXRhaWxzLnF1ZXJ5KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgYmFzZUFkZHJlc3MgPSBhZGRyZXNzRGV0YWlscy5wYXRobmFtZSBhcyBzdHJpbmc7XG4gIGlmICghaXNWYWxpZEFkZHJlc3MoYmFzZUFkZHJlc3MpKSB7XG4gICAgdGhyb3cgbmV3IFV0aWxzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHtyYXdBZGRyZXNzfWApO1xuICB9XG5cbiAgLy8gYWRkcmVzcyBkb2Vzbid0IGhhdmUgYSBtZW1vIGlkIG9yIG1lbW9JZCBpcyBlbXB0eVxuICBpZiAoYmFzZUFkZHJlc3MgPT09IHJhd0FkZHJlc3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWRkcmVzczogcmF3QWRkcmVzcyxcbiAgICAgIG1lbW9JZDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAoIXF1ZXJ5RGV0YWlscyB8fCBfLmlzTmlsKHF1ZXJ5RGV0YWlscy5nZXQoJ21lbW9JZCcpKSkge1xuICAgIC8vIGlmIHRoZXJlIGFyZSBtb3JlIHByb3BlcnRpZXMsIHRoZSBxdWVyeSBkZXRhaWxzIG5lZWQgdG8gY29udGFpbiB0aGUgbWVtbyBpZCBwcm9wZXJ0eVxuICAgIHRocm93IG5ldyBVdGlsc0Vycm9yKGBpbnZhbGlkIGFkZHJlc3Mgd2l0aCBtZW1vIGlkOiAke3Jhd0FkZHJlc3N9YCk7XG4gIH1cbiAgY29uc3QgbWVtb0lkID0gcXVlcnlEZXRhaWxzLmdldCgnbWVtb0lkJykgYXMgc3RyaW5nO1xuICBpZiAoIWlzVmFsaWRNZW1vKG1lbW9JZCkpIHtcbiAgICB0aHJvdyBuZXcgVXRpbHNFcnJvcihgaW52YWxpZCBhZGRyZXNzOiAnJHtyYXdBZGRyZXNzfScsIG1lbW9JZCBpcyBub3QgdmFsaWRgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYWRkcmVzczogYmFzZUFkZHJlc3MsXG4gICAgbWVtb0lkLFxuICB9O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCByZXR1cm4gYWRkcmVzcyB3aXRoIGFwcGVuZGVkIG1lbW8gaWRcbiAqXG4gKiBAcGFyYW0ge0FkZHJlc3NEZXRhaWxzfSBhZGRyZXNzRGV0YWlscyAtIEFkZHJlc3Mgd2hpY2ggdG8gYXBwZW5kIG1lbW8gaWRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWRkcmVzcyB3aXRoIGFwcGVuZGVkIG1lbW8gaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFkZHJlc3MoeyBhZGRyZXNzLCBtZW1vSWQgfTogQWRkcmVzc0RldGFpbHMpOiBzdHJpbmcge1xuICBpZiAobWVtb0lkICYmIGlzVmFsaWRNZW1vKG1lbW9JZCkpIHtcbiAgICByZXR1cm4gYCR7YWRkcmVzc30/bWVtb0lkPSR7bWVtb0lkfWA7XG4gIH1cbiAgcmV0dXJuIGFkZHJlc3M7XG59XG5cbi8qKlxuICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIGEgdmFsaWQgYWRkcmVzcyB3aXRoIG1lbW8gaWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyAtIEFkZHJlc3MgaW4gdGhlIGZvcm0gPGFkZHJlc3M+P21lbW9JZD08bWVtb0lkPlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBpbnB1dCBpcyBhIHZhbGlkIGFkZHJlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRBZGRyZXNzV2l0aFBheW1lbnRJZChhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhZGRyZXNzRGV0YWlscyA9IGdldEFkZHJlc3NEZXRhaWxzKGFkZHJlc3MpO1xuICAgIHJldHVybiBhZGRyZXNzID09PSBub3JtYWxpemVBZGRyZXNzKGFkZHJlc3NEZXRhaWxzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkIGhlZGVyYSB7cHJvdG8uVG9rZW5JRH0gb2JqZWN0IGZyb20gdG9rZW4gSUQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRva2VuSUQgLSBUaGUgdG9rZW4gSUQgdG8gYnVpbGRcbiAqIEByZXR1cm5zIHtwcm90by5Ub2tlbklEfSAtIFRoZSByZXN1bHRpbmcgcHJvdG8gVG9rZW5JRCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkSGVkZXJhVG9rZW5JRCh0b2tlbklEOiBzdHJpbmcpOiBwcm90by5Ub2tlbklEIHtcbiAgY29uc3QgdG9rZW5EYXRhID0gVG9rZW5JZC5mcm9tU3RyaW5nKHRva2VuSUQpO1xuICByZXR1cm4gbmV3IHByb3RvLlRva2VuSUQoe1xuICAgIHRva2VuTnVtOiB0b2tlbkRhdGEubnVtLFxuICAgIHJlYWxtTnVtOiB0b2tlbkRhdGEucmVhbG0sXG4gICAgc2hhcmROdW06IHRva2VuRGF0YS5zaGFyZCxcbiAgfSk7XG59XG5cbi8qKlxuICogQnVpbGQgaGVkZXJhIHtwcm90by5BY2NvdW50SUR9IG9iamVjdCBmcm9tIGFjY291bnQgSUQgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFjY291bnRJRCAtIFRoZSBhY2NvdW50IElEIHRvIGJ1aWxkXG4gKiBAcmV0dXJucyB7cHJvdG99IC0gVGhlIHJlc3VsdGluZyBwcm90byBBY2NvdW50SUQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEhlZGVyYUFjY291bnRJRChhY2NvdW50SUQ6IHN0cmluZyk6IHByb3RvLkFjY291bnRJRCB7XG4gIGNvbnN0IGFjY291bnRJZCA9IEFjY291bnRJZC5mcm9tU3RyaW5nKGFjY291bnRJRCk7XG4gIHJldHVybiBuZXcgcHJvdG8uQWNjb3VudElEKHtcbiAgICBzaGFyZE51bTogYWNjb3VudElkLnNoYXJkLFxuICAgIHJlYWxtTnVtOiBhY2NvdW50SWQucmVhbG0sXG4gICAgYWNjb3VudE51bTogYWNjb3VudElkLm51bSxcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgSGVkZXJhIHRva2VuIElEIGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5JZCAtIFRoZSB0b2tlbiBJRCB0byB2YWxpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiB0b2tlbklkIGlzIHZhbGlkIGFuZCBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRIZWRlcmFUb2tlbklEKHRva2VuSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBpc0Zvcm1hdFZhbGlkID0gIV8uaXNFbXB0eSh0b2tlbklkKSAmJiAhIXRva2VuSWQubWF0Y2goL15cXGQrKD86KD89XFwuKShcXC5cXGQrKXsyfXwoPyFcXC4pKSQvKTtcbiAgY29uc3QgaXNUb2tlblN1cHBvcnRlZCA9IGdldEhlZGVyYVRva2VuTmFtZUZyb21JZCh0b2tlbklkKSAhPT0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBpc0Zvcm1hdFZhbGlkICYmIGlzVG9rZW5TdXBwb3J0ZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhc3NvY2lhdGVkIGhlZGVyYSB0b2tlbiBJRCBmcm9tIHRva2VuIG5hbWUsIGlmIHN1cHBvcnRlZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlbk5hbWUgLSBUaGUgaGVkZXJhIHRva2VuIG5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRoZSBhc3NvY2lhdGVkIHRva2VuIElEIG9yIHVuZGVmaW5lZCBpZiBub3Qgc3VwcG9ydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWRlcmFUb2tlbklkRnJvbU5hbWUodG9rZW5OYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoY29pbnMuaGFzKHRva2VuTmFtZSkpIHtcbiAgICBjb25zdCB0b2tlbiA9IGNvaW5zLmdldCh0b2tlbk5hbWUpO1xuICAgIGlmICh0b2tlbi5pc1Rva2VuICYmIHRva2VuIGluc3RhbmNlb2YgSGVkZXJhVG9rZW4pIHtcbiAgICAgIHJldHVybiB0b2tlbi50b2tlbklkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhc3NvY2lhdGVkIGhlZGVyYSB0b2tlbiBmcm9tIHRva2VuIElELCBpZiBzdXBwb3J0ZWRcbiAqXG4gKiBAcGFyYW0gdG9rZW5JZCAtIFRoZSB0b2tlbiBhZGRyZXNzXG4gKiBAcmV0dXJucyB7QmFzZUNvaW59IC0gQmFzZUNvaW4gb2JqZWN0IGZvciB0aGUgbWF0Y2hpbmcgdG9rZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEhlZGVyYVRva2VuTmFtZUZyb21JZCh0b2tlbklkOiBzdHJpbmcpOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB0b2tlbnNBcnJheSA9IGNvaW5zXG4gICAgLmZpbHRlcigoY29pbikgPT4ge1xuICAgICAgcmV0dXJuIGNvaW4gaW5zdGFuY2VvZiBIZWRlcmFUb2tlbiAmJiBjb2luLnRva2VuSWQgPT09IHRva2VuSWQ7XG4gICAgfSlcbiAgICAubWFwKCh0b2tlbikgPT4gdG9rZW4pOyAvLyBmbGF0dGVuIGNvaW4gbWFwIHRvIGFycmF5XG5cbiAgcmV0dXJuIHRva2Vuc0FycmF5Lmxlbmd0aCA+IDAgPyB0b2tlbnNBcnJheVswXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgaW5wdXQgaXMgYSB2YWxpZCB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvblxuICpcbiAqIEBwYXJhbSB7cHJvdG8uSUNyeXB0b1RyYW5zZmVyVHJhbnNhY3Rpb25Cb2R5IHwgbnVsbH0gdHJhbnNmZXJUeEJvZHkgaXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBib2R5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpcyBpbnB1dCBpcyBhIHZhbGlkIHRva2VuIHRyYW5zZmVyIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Rva2VuVHJhbnNmZXIodHJhbnNmZXJUeEJvZHk6IHByb3RvLklDcnlwdG9UcmFuc2ZlclRyYW5zYWN0aW9uQm9keSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhdHJhbnNmZXJUeEJvZHkgJiYgISF0cmFuc2ZlclR4Qm9keS50b2tlblRyYW5zZmVycyAmJiB0cmFuc2ZlclR4Qm9keS50b2tlblRyYW5zZmVycy5sZW5ndGggPiAwO1xufVxuXG4vKiogdmFsaWRhdGVzIGEgc3RhcnRUaW1lIHN0cmluZyB0byBiZSBhIHZhbGlkIHRpbWVzdGFtcCBhbmQgaW4gdGhlIGZ1dHVyZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0YXJ0VGltZSAtIFRoZSBzdGFydFRpbWUgdG8gYmUgdmFsaWRhdGVkXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBpZiBzdGFydFRpbWUgaXMgbm90IGEgdmFsaWQgdGltZXN0YW1wIG9yIGlzIGluIHRoZSBwYXN0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVTdGFydFRpbWUoc3RhcnRUaW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFpc1ZhbGlkVGltZVN0cmluZyhzdGFydFRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXJ0VGltZSwgZ290OiAnICsgc3RhcnRUaW1lKTtcbiAgfVxuICBjb25zdCBjdXJyZW50VGltZSA9IGdldEN1cnJlbnRUaW1lKCk7XG4gIGNvbnN0IHN0YXJ0VGltZUZpeGVkID0gbm9ybWFsaXplU3RhcnR0aW1lKHN0YXJ0VGltZSk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBCaWdOdW1iZXIoc3RhcnRUaW1lRml4ZWQpLmlzTGVzc1RoYW5PckVxdWFsVG8oY3VycmVudFRpbWUpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydFRpbWUgbXVzdCBiZSBhIGZ1dHVyZSB0aW1lc3RhbXAsIGdvdDogJyArIHN0YXJ0VGltZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXJ0dGltZShzdGFydFRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBuZXcgQmlnTnVtYmVyKHN0YXJ0VGltZSkudG9GaXhlZCg5KTtcbn1cblxuLyoqXG4gKiBBd2FpdCBmb3IgYSBnaXZlbiBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBtcyAtIFRoZSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUubG9nKGBzbGVlcGluZyBmb3IgJHttc30gbXNgKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHN0YXJ0VGltZSBpcyB3aXRoaW4gdGhlIGJyb2FkY2FzdCB3aW5kb3cgKDUgc2Vjb25kcyBhZnRlciBhbmQgMTc1IHNlY29uZHMgYWZ0ZXIgdGhlIHN0YXJ0VGltZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEJyb2FkY2FzdE5vdyhzdGFydFRpbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzdGFydFRpbWVGaXhlZCA9IG5vcm1hbGl6ZVN0YXJ0dGltZShzdGFydFRpbWUpO1xuICBjb25zdCBjdXJyZW50VGltZSA9IGdldEN1cnJlbnRUaW1lKCk7XG4gIC8vIHN0YXJ0VGltZSBwbHVzIDUgc2Vjb25kc1xuICBjb25zdCBzdGFydGluZ1RpbWVXaW5kb3cgPSBuZXcgQmlnTnVtYmVyKHN0YXJ0VGltZUZpeGVkKS5wbHVzKDUpLnRvRml4ZWQoOSk7XG4gIC8vIHN0YXJ0VGltZSBwbHVzIDE3MCBzZWNvbmRzXG4gIGNvbnN0IGVuZGluZ1RpbWVXaW5kb3cgPSBuZXcgQmlnTnVtYmVyKHN0YXJ0VGltZUZpeGVkKS5wbHVzKDE3NSkudG9GaXhlZCg5KTtcblxuICBpZiAobmV3IEJpZ051bWJlcihjdXJyZW50VGltZSkuaXNHcmVhdGVyVGhhbihlbmRpbmdUaW1lV2luZG93KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdzdGFydFRpbWUgd2luZG93IGV4cGlyZWQsIGdvdDogJyArXG4gICAgICAgIHN0YXJ0VGltZUZpeGVkICtcbiAgICAgICAgJyAtIGN1cnJlbnRUaW1lOiAnICtcbiAgICAgICAgY3VycmVudFRpbWUgK1xuICAgICAgICAnIC0gZW5kaW5nVGltZVdpbmRvdyAnICtcbiAgICAgICAgZW5kaW5nVGltZVdpbmRvd1xuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIG5ldyBCaWdOdW1iZXIoY3VycmVudFRpbWUpLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oc3RhcnRpbmdUaW1lV2luZG93KSAmJlxuICAgIG5ldyBCaWdOdW1iZXIoY3VycmVudFRpbWUpLmlzTGVzc1RoYW5PckVxdWFsVG8oZW5kaW5nVGltZVdpbmRvdylcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
-
import { TransactionBuilder } from './transactionBuilder';
|
|
3
|
-
import { Transaction } from './transaction';
|
|
4
|
-
export declare class WalletInitializationBuilder extends TransactionBuilder {
|
|
5
|
-
private readonly _txBodyData;
|
|
6
|
-
private _owners;
|
|
7
|
-
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
8
|
-
/** @inheritdoc */
|
|
9
|
-
protected buildImplementation(): Promise<Transaction>;
|
|
10
|
-
/**
|
|
11
|
-
*
|
|
12
|
-
* @param {boolean} rawKeys - Defines if the owners keys are obtained in raw or protocol default format
|
|
13
|
-
* @returns {proto.ThresholdKey} - The wallet threshold keys
|
|
14
|
-
*/
|
|
15
|
-
private buildOwnersKeys;
|
|
16
|
-
/** @inheritdoc */
|
|
17
|
-
initBuilder(tx: Transaction): void;
|
|
18
|
-
private initOwners;
|
|
19
|
-
/**
|
|
20
|
-
* Set one of the owners of the multisig wallet.
|
|
21
|
-
*
|
|
22
|
-
* @param {string} address - The public key of the owner's account
|
|
23
|
-
* @returns {WalletInitializationBuilder} - This wallet initialization builder
|
|
24
|
-
*/
|
|
25
|
-
owner(address: string): this;
|
|
26
|
-
validateMandatoryFields(): void;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=walletInitializationBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"walletInitializationBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/walletInitializationBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK5C,qBAAa,2BAA4B,SAAQ,kBAAkB;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;IAChE,OAAO,CAAC,OAAO,CAAgB;gBAEnB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ7C,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAO3D;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAWvB,kBAAkB;IAClB,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAQlC,OAAO,CAAC,UAAU;IAUlB;;;;;OAKG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAkB5B,uBAAuB,IAAI,IAAI;CAahC"}
|