@bitgo/sdk-coin-eth 25.1.0 → 25.1.1

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 (45) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +7 -7
  3. package/LICENSE +0 -191
  4. package/dist/src/erc20Token.d.ts +0 -60
  5. package/dist/src/erc20Token.d.ts.map +0 -1
  6. package/dist/src/erc20Token.js +0 -334
  7. package/dist/src/erc721Token.d.ts +0 -60
  8. package/dist/src/erc721Token.d.ts.map +0 -1
  9. package/dist/src/erc721Token.js +0 -334
  10. package/dist/src/eth.d.ts +0 -80
  11. package/dist/src/eth.d.ts.map +0 -1
  12. package/dist/src/eth.js +0 -428
  13. package/dist/src/gteth.d.ts +0 -8
  14. package/dist/src/gteth.d.ts.map +0 -1
  15. package/dist/src/gteth.js +0 -14
  16. package/dist/src/hteth.d.ts +0 -8
  17. package/dist/src/hteth.d.ts.map +0 -1
  18. package/dist/src/hteth.js +0 -14
  19. package/dist/src/index.d.ts +0 -9
  20. package/dist/src/index.d.ts.map +0 -1
  21. package/dist/src/index.js +0 -25
  22. package/dist/src/lib/index.d.ts +0 -7
  23. package/dist/src/lib/index.d.ts.map +0 -1
  24. package/dist/src/lib/index.js +0 -30
  25. package/dist/src/lib/messages/index.d.ts +0 -3
  26. package/dist/src/lib/messages/index.d.ts.map +0 -1
  27. package/dist/src/lib/messages/index.js +0 -6
  28. package/dist/src/lib/transactionBuilder.d.ts +0 -27
  29. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  30. package/dist/src/lib/transactionBuilder.js +0 -56
  31. package/dist/src/lib/transferBuilder.d.ts +0 -17
  32. package/dist/src/lib/transferBuilder.d.ts.map +0 -1
  33. package/dist/src/lib/transferBuilder.js +0 -25
  34. package/dist/src/lib/transferBuilders/index.d.ts +0 -3
  35. package/dist/src/lib/transferBuilders/index.d.ts.map +0 -1
  36. package/dist/src/lib/transferBuilders/index.js +0 -8
  37. package/dist/src/lib/walletUtil.d.ts +0 -2
  38. package/dist/src/lib/walletUtil.d.ts.map +0 -1
  39. package/dist/src/lib/walletUtil.js +0 -12
  40. package/dist/src/register.d.ts +0 -3
  41. package/dist/src/register.d.ts.map +0 -1
  42. package/dist/src/register.js +0 -23
  43. package/dist/src/teth.d.ts +0 -8
  44. package/dist/src/teth.d.ts.map +0 -1
  45. package/dist/src/teth.js +0 -14
@@ -1,334 +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
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.Erc721Token = void 0;
37
- /**
38
- * @prettier
39
- */
40
- const sdk_core_1 = require("@bitgo/sdk-core");
41
- const bignumber_js_1 = require("bignumber.js");
42
- const statics_1 = require("@bitgo/statics");
43
- const secp256k1_1 = require("@bitgo/secp256k1");
44
- const _ = __importStar(require("lodash"));
45
- const eth_1 = require("./eth");
46
- const lib_1 = require("./lib");
47
- class Erc721Token extends eth_1.Eth {
48
- constructor(bitgo, tokenConfig) {
49
- const staticsCoin = statics_1.coins.get(Erc721Token.coinNames[tokenConfig.network]);
50
- super(bitgo, staticsCoin);
51
- this.tokenConfig = tokenConfig;
52
- this.sendMethodName = 'sendMultiSigToken';
53
- }
54
- static createTokenConstructor(config) {
55
- return (bitgo) => new Erc721Token(bitgo, config);
56
- }
57
- static createTokenConstructors(tokenConfigs = [...statics_1.tokens.bitcoin.eth.nfts, ...statics_1.tokens.testnet.eth.nfts]) {
58
- const tokensCtors = [];
59
- for (const token of tokenConfigs) {
60
- const tokenConstructor = Erc721Token.createTokenConstructor(token);
61
- tokensCtors.push({ name: token.type, coinConstructor: tokenConstructor });
62
- tokensCtors.push({ name: token.tokenContractAddress, coinConstructor: tokenConstructor });
63
- }
64
- return tokensCtors;
65
- }
66
- get type() {
67
- return this.tokenConfig.type;
68
- }
69
- get name() {
70
- return this.tokenConfig.name;
71
- }
72
- get coin() {
73
- return this.tokenConfig.coin;
74
- }
75
- get network() {
76
- return this.tokenConfig.network;
77
- }
78
- get tokenContractAddress() {
79
- return this.tokenConfig.tokenContractAddress;
80
- }
81
- get decimalPlaces() {
82
- return this.tokenConfig.decimalPlaces;
83
- }
84
- getChain() {
85
- return this.tokenConfig.type;
86
- }
87
- getFullName() {
88
- return 'ERC721 Token';
89
- }
90
- getBaseFactor() {
91
- return Math.pow(10, this.tokenConfig.decimalPlaces);
92
- }
93
- /**
94
- * Flag for sending value of 0
95
- * @returns {boolean} True if okay to send 0 value, false otherwise
96
- */
97
- valuelessTransferAllowed() {
98
- return false;
99
- }
100
- /**
101
- * Flag for sending data along with transactions
102
- * @returns {boolean} True if okay to send tx data (ETH), false otherwise
103
- */
104
- transactionDataAllowed() {
105
- return false;
106
- }
107
- /** @inheritDoc */
108
- supportsTss() {
109
- return true;
110
- }
111
- /** @inheritDoc */
112
- getMPCAlgorithm() {
113
- return 'ecdsa';
114
- }
115
- getTransactionBuilder() {
116
- return new lib_1.TransactionBuilder(statics_1.coins.get(this.getBaseChain()));
117
- }
118
- /**
119
- * Builds a token recovery transaction without BitGo
120
- * @param params
121
- * @param params.userKey {String} [encrypted] xprv
122
- * @param params.backupKey {String} [encrypted] xprv or xpub if the xprv is held by a KRS providers
123
- * @param params.walletPassphrase {String} used to decrypt userKey and backupKey
124
- * @param params.walletContractAddress {String} the ETH address of the wallet contract
125
- * @param params.recoveryDestination {String} target address to send recovered funds to
126
- * @param params.krsProvider {String} necessary if backup key is held by KRS
127
- */
128
- async recover(params) {
129
- if (_.isUndefined(params.userKey)) {
130
- throw new Error('missing userKey');
131
- }
132
- if (_.isUndefined(params.backupKey)) {
133
- throw new Error('missing backupKey');
134
- }
135
- if (_.isUndefined(params.walletPassphrase) && !params.userKey.startsWith('xpub')) {
136
- throw new Error('missing wallet passphrase');
137
- }
138
- if (_.isUndefined(params.walletContractAddress) || !this.isValidAddress(params.walletContractAddress)) {
139
- throw new Error('invalid walletContractAddress');
140
- }
141
- if (_.isUndefined(params.recoveryDestination) || !this.isValidAddress(params.recoveryDestination)) {
142
- throw new Error('invalid recoveryDestination');
143
- }
144
- const isKrsRecovery = (0, sdk_core_1.getIsKrsRecovery)(params);
145
- const isUnsignedSweep = (0, sdk_core_1.getIsUnsignedSweep)(params);
146
- if (isKrsRecovery) {
147
- (0, sdk_core_1.checkKrsProvider)(this, params.krsProvider, { checkCoinFamilySupport: false });
148
- }
149
- // Clean up whitespace from entered values
150
- const userKey = params.userKey.replace(/\s/g, '');
151
- const backupKey = params.backupKey.replace(/\s/g, '');
152
- // Set new eth tx fees (default to using platform values if none are provided)
153
- const gasPrice = params.eip1559
154
- ? new eth_1.optionalDeps.ethUtil.BN(params.eip1559.maxFeePerGas)
155
- : new eth_1.optionalDeps.ethUtil.BN(this.setGasPrice(params.gasPrice));
156
- const gasLimit = new eth_1.optionalDeps.ethUtil.BN(this.setGasLimit(params.gasLimit));
157
- // Decrypt private keys from KeyCard values
158
- let userPrv;
159
- if (!userKey.startsWith('xpub') && !userKey.startsWith('xprv')) {
160
- try {
161
- userPrv = this.bitgo.decrypt({
162
- input: userKey,
163
- password: params.walletPassphrase,
164
- });
165
- }
166
- catch (e) {
167
- throw new Error(`Error decrypting user keychain: ${e.message}`);
168
- }
169
- }
170
- let backupKeyAddress;
171
- let backupSigningKey;
172
- if (isKrsRecovery || isUnsignedSweep) {
173
- const backupHDNode = secp256k1_1.bip32.fromBase58(backupKey);
174
- backupSigningKey = backupHDNode.publicKey;
175
- backupKeyAddress = `0x${eth_1.optionalDeps.ethUtil.publicToAddress(backupSigningKey, true).toString('hex')}`;
176
- }
177
- else {
178
- let backupPrv;
179
- try {
180
- backupPrv = this.bitgo.decrypt({
181
- input: backupKey,
182
- password: params.walletPassphrase,
183
- });
184
- }
185
- catch (e) {
186
- throw new Error(`Error decrypting backup keychain: ${e.message}`);
187
- }
188
- const backupHDNode = secp256k1_1.bip32.fromBase58(backupPrv);
189
- backupSigningKey = backupHDNode.privateKey;
190
- backupKeyAddress = `0x${eth_1.optionalDeps.ethUtil.privateToAddress(backupSigningKey).toString('hex')}`;
191
- }
192
- // Get nonce for backup key (should be 0)
193
- let backupKeyNonce = 0;
194
- const result = await this.recoveryBlockchainExplorerQuery({
195
- chainid: this.getChainId().toString(),
196
- module: 'account',
197
- action: 'txlist',
198
- address: backupKeyAddress,
199
- }, params.apiKey);
200
- const backupKeyTxList = result.result;
201
- if (backupKeyTxList.length > 0) {
202
- // Calculate last nonce used
203
- const outgoingTxs = backupKeyTxList.filter((tx) => tx.from === backupKeyAddress);
204
- backupKeyNonce = outgoingTxs.length;
205
- }
206
- // get balance of backup key and make sure we can afford gas
207
- const backupKeyBalance = await this.queryAddressBalance(backupKeyAddress, params.apiKey);
208
- if (backupKeyBalance.lt(gasPrice.mul(gasLimit))) {
209
- throw new Error(`Backup key address ${backupKeyAddress} has balance ${backupKeyBalance.toString(10)}. This address must have a balance of at least 0.01 ETH to perform recoveries`);
210
- }
211
- // get token balance of wallet
212
- const txAmount = await this.queryAddressTokenBalance(this.tokenContractAddress, params.walletContractAddress, params.apiKey);
213
- if (new bignumber_js_1.BigNumber(txAmount).isLessThanOrEqualTo(0)) {
214
- throw new Error('Wallet does not have enough funds to recover');
215
- }
216
- // build recipients object
217
- const recipients = [
218
- {
219
- address: params.recoveryDestination,
220
- amount: txAmount.toString(10),
221
- },
222
- ];
223
- // Get sequence ID using contract call
224
- const sequenceId = await this.querySequenceId(params.walletContractAddress, params.apiKey);
225
- let operationHash, signature;
226
- if (!isUnsignedSweep) {
227
- // Get operation hash and sign it
228
- operationHash = this.getOperationSha3ForExecuteAndConfirm(recipients, this.getDefaultExpireTime(), sequenceId);
229
- signature = sdk_core_1.Util.ethSignMsgHash(operationHash, sdk_core_1.Util.xprvToEthPrivateKey(userPrv));
230
- try {
231
- sdk_core_1.Util.ecRecoverEthAddress(operationHash, signature);
232
- }
233
- catch (e) {
234
- throw new Error('Invalid signature');
235
- }
236
- }
237
- const txInfo = {
238
- recipient: recipients[0],
239
- expireTime: this.getDefaultExpireTime(),
240
- contractSequenceId: sequenceId,
241
- signature: signature,
242
- gasLimit: gasLimit.toString(10),
243
- tokenContractAddress: this.tokenContractAddress,
244
- };
245
- // calculate send data
246
- const sendMethodArgs = this.getSendMethodArgs(txInfo);
247
- const methodSignature = eth_1.optionalDeps.ethAbi.methodID(this.sendMethodName, _.map(sendMethodArgs, 'type'));
248
- const encodedArgs = eth_1.optionalDeps.ethAbi.rawEncode(_.map(sendMethodArgs, 'type'), _.map(sendMethodArgs, 'value'));
249
- const sendData = Buffer.concat([methodSignature, encodedArgs]);
250
- let tx = eth_1.Eth.buildTransaction({
251
- to: params.walletContractAddress,
252
- nonce: backupKeyNonce,
253
- value: 0,
254
- gasPrice: gasPrice,
255
- gasLimit: gasLimit,
256
- data: sendData,
257
- eip1559: params.eip1559,
258
- replayProtectionOptions: params.replayProtectionOptions,
259
- });
260
- if (isUnsignedSweep) {
261
- return this.formatForOfflineVault(txInfo, tx, userKey, backupKey, gasPrice, gasLimit, params.eip1559, params.replayProtectionOptions, params.apiKey);
262
- }
263
- if (!isKrsRecovery) {
264
- tx = tx.sign(backupSigningKey);
265
- }
266
- const signedTx = {
267
- id: eth_1.optionalDeps.ethUtil.bufferToHex(tx.hash()),
268
- tx: tx.serialize().toString('hex'),
269
- };
270
- if (isKrsRecovery) {
271
- signedTx.backupKey = backupKey;
272
- signedTx.coin = 'erc721';
273
- }
274
- return signedTx;
275
- }
276
- getOperation(recipient, expireTime, contractSequenceId) {
277
- return [
278
- ['string', 'address', 'uint', 'address', 'uint', 'uint'],
279
- [
280
- 'ERC721',
281
- new eth_1.optionalDeps.ethUtil.BN(eth_1.optionalDeps.ethUtil.stripHexPrefix(recipient.address), 16),
282
- recipient.amount,
283
- new eth_1.optionalDeps.ethUtil.BN(eth_1.optionalDeps.ethUtil.stripHexPrefix(this.tokenContractAddress), 16),
284
- expireTime,
285
- contractSequenceId,
286
- ],
287
- ];
288
- }
289
- getSendMethodArgs(txInfo) {
290
- // Method signature is
291
- // sendMultiSigToken(address toAddress, uint value, address tokenContractAddress, uint expireTime, uint sequenceId, bytes signature)
292
- return [
293
- {
294
- name: 'toAddress',
295
- type: 'address',
296
- value: txInfo.recipient.address,
297
- },
298
- {
299
- name: 'value',
300
- type: 'uint',
301
- value: txInfo.recipient.amount,
302
- },
303
- {
304
- name: 'tokenContractAddress',
305
- type: 'address',
306
- value: this.tokenContractAddress,
307
- },
308
- {
309
- name: 'expireTime',
310
- type: 'uint',
311
- value: txInfo.expireTime,
312
- },
313
- {
314
- name: 'sequenceId',
315
- type: 'uint',
316
- value: txInfo.contractSequenceId,
317
- },
318
- {
319
- name: 'signature',
320
- type: 'bytes',
321
- value: eth_1.optionalDeps.ethUtil.toBuffer(eth_1.optionalDeps.ethUtil.addHexPrefix(txInfo.signature)),
322
- },
323
- ];
324
- }
325
- verifyCoin(txPrebuild) {
326
- return txPrebuild.coin === this.tokenConfig.coin && txPrebuild.token === this.tokenConfig.type;
327
- }
328
- }
329
- exports.Erc721Token = Erc721Token;
330
- Erc721Token.coinNames = {
331
- Mainnet: 'eth',
332
- Testnet: 'hteth',
333
- };
334
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJjNzIxVG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXJjNzIxVG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0dBRUc7QUFDSCw4Q0FTeUI7QUFDekIsK0NBQXlDO0FBRXpDLDRDQUFtRTtBQUVuRSxnREFBeUM7QUFDekMsMENBQTRCO0FBRTVCLCtCQUE2RjtBQUM3RiwrQkFBMkM7QUFHM0MsTUFBYSxXQUFZLFNBQVEsU0FBRztJQVFsQyxZQUFZLEtBQWdCLEVBQUUsV0FBK0I7UUFDM0QsTUFBTSxXQUFXLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQztJQUM1QyxDQUFDO0lBRUQsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQTBCO1FBQ3RELE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELE1BQU0sQ0FBQyx1QkFBdUIsQ0FDNUIsZUFBcUMsQ0FBQyxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRTdGLE1BQU0sV0FBVyxHQUEyQixFQUFFLENBQUM7UUFDL0MsS0FBSyxNQUFNLEtBQUssSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENB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QyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDMUY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBQyxVQUErQjtRQUN4QyxPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNqRyxDQUFDOztBQXBXSCxrQ0FxV0M7QUFsV1EscUJBQVMsR0FBYztJQUM1QixPQUFPLEVBQUUsS0FBSztJQUNkLE9BQU8sRUFBRSxPQUFPO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQge1xuICBCaXRHb0Jhc2UsXG4gIENvaW5Db25zdHJ1Y3RvcixcbiAgVXRpbCxcbiAgY2hlY2tLcnNQcm92aWRlcixcbiAgZ2V0SXNLcnNSZWNvdmVyeSxcbiAgZ2V0SXNVbnNpZ25lZFN3ZWVwLFxuICBNUENBbGdvcml0aG0sXG4gIE5hbWVkQ29pbkNvbnN0cnVjdG9yLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmlnTnVtYmVyIH0gZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuaW1wb3J0IHsgY29pbnMsIEV0aExpa2VUb2tlbkNvbmZpZywgdG9rZW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQ29pbk5hbWVzIH0gZnJvbSAnQGJpdGdvL2Fic3RyYWN0LWV0aCc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby9zZWNwMjU2azEnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBFdGgsIFJlY292ZXJPcHRpb25zLCBSZWNvdmVyeUluZm8sIG9wdGlvbmFsRGVwcywgVHJhbnNhY3Rpb25QcmVidWlsZCB9IGZyb20gJy4vZXRoJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vbGliJztcblxuZXhwb3J0IHsgRXRoTGlrZVRva2VuQ29uZmlnIH07XG5leHBvcnQgY2xhc3MgRXJjNzIxVG9rZW4gZXh0ZW5kcyBFdGgge1xuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5Db25maWc6IEV0aExpa2VUb2tlbkNvbmZpZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbmRNZXRob2ROYW1lOiAnc2VuZE11bHRpU2lnJyB8ICdzZW5kTXVsdGlTaWdUb2tlbic7XG4gIHN0YXRpYyBjb2luTmFtZXM6IENvaW5OYW1lcyA9IHtcbiAgICBNYWlubmV0OiAnZXRoJyxcbiAgICBUZXN0bmV0OiAnaHRldGgnLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHRva2VuQ29uZmlnOiBFdGhMaWtlVG9rZW5Db25maWcpIHtcbiAgICBjb25zdCBzdGF0aWNzQ29pbiA9IGNvaW5zLmdldChFcmM3MjFUb2tlbi5jb2luTmFtZXNbdG9rZW5Db25maWcubmV0d29ya10pO1xuICAgIHN1cGVyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gICAgdGhpcy50b2tlbkNvbmZpZyA9IHRva2VuQ29uZmlnO1xuICAgIHRoaXMuc2VuZE1ldGhvZE5hbWUgPSAnc2VuZE11bHRpU2lnVG9rZW4nO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3IoY29uZmlnOiBFdGhMaWtlVG9rZW5Db25maWcpOiBDb2luQ29uc3RydWN0b3Ige1xuICAgIHJldHVybiAoYml0Z286IEJpdEdvQmFzZSkgPT4gbmV3IEVyYzcyMVRva2VuKGJpdGdvLCBjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVRva2VuQ29uc3RydWN0b3JzKFxuICAgIHRva2VuQ29uZmlnczogRXRoTGlrZVRva2VuQ29uZmlnW10gPSBbLi4udG9rZW5zLmJpdGNvaW4uZXRoLm5mdHMsIC4uLnRva2Vucy50ZXN0bmV0LmV0aC5uZnRzXVxuICApOiBOYW1lZENvaW5Db25zdHJ1Y3RvcltdIHtcbiAgICBjb25zdCB0b2tlbnNDdG9yczogTmFtZWRDb2luQ29uc3RydWN0b3JbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgdG9rZW4gb2YgdG9rZW5Db25maWdzKSB7XG4gICAgICBjb25zdCB0b2tlbkNvbnN0cnVjdG9yID0gRXJjNzIxVG9rZW4uY3JlYXRlVG9rZW5Db25zdHJ1Y3Rvcih0b2tlbik7XG4gICAgICB0b2tlbnNDdG9ycy5wdXNoKHsgbmFtZTogdG9rZW4udHlwZSwgY29pbkNvbnN0cnVjdG9yOiB0b2tlbkNvbnN0cnVjdG9yIH0pO1xuICAgICAgdG9rZW5zQ3RvcnMucHVzaCh7IG5hbWU6IHRva2VuLnRva2VuQ29udHJhY3RBZGRyZXNzLCBjb2luQ29uc3RydWN0b3I6IHRva2VuQ29uc3RydWN0b3IgfSk7XG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNDdG9ycztcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5uYW1lO1xuICB9XG5cbiAgZ2V0IGNvaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcuY29pbjtcbiAgfVxuXG4gIGdldCBuZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRva2VuQ29uZmlnLm5ldHdvcms7XG4gIH1cblxuICBnZXQgdG9rZW5Db250cmFjdEFkZHJlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudG9rZW5Db250cmFjdEFkZHJlc3M7XG4gIH1cblxuICBnZXQgZGVjaW1hbFBsYWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkNvbmZpZy5kZWNpbWFsUGxhY2VzO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Db25maWcudHlwZTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiAnRVJDNzIxIFRva2VuJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLnRva2VuQ29uZmlnLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgdmFsdWUgb2YgMFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgMCB2YWx1ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYWcgZm9yIHNlbmRpbmcgZGF0YSBhbG9uZyB3aXRoIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBva2F5IHRvIHNlbmQgdHggZGF0YSAoRVRIKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICB0cmFuc2FjdGlvbkRhdGFBbGxvd2VkKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRUcmFuc2FjdGlvbkJ1aWxkZXIoKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlcihjb2lucy5nZXQodGhpcy5nZXRCYXNlQ2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHRva2VuIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnVzZXJLZXkge1N0cmluZ30gW2VuY3J5cHRlZF0geHBydlxuICAgKiBAcGFyYW0gcGFyYW1zLmJhY2t1cEtleSB7U3RyaW5nfSBbZW5jcnlwdGVkXSB4cHJ2IG9yIHhwdWIgaWYgdGhlIHhwcnYgaXMgaGVsZCBieSBhIEtSUyBwcm92aWRlcnNcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIHtTdHJpbmd9IHVzZWQgdG8gZGVjcnlwdCB1c2VyS2V5IGFuZCBiYWNrdXBLZXlcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3Mge1N0cmluZ30gdGhlIEVUSCBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAgICogQHBhcmFtIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHtTdHJpbmd9IHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqIEBwYXJhbSBwYXJhbXMua3JzUHJvdmlkZXIge1N0cmluZ30gbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyT3B0aW9ucyk6IFByb21pc2U8UmVjb3ZlcnlJbmZvPiB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnVzZXJLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy5iYWNrdXBLZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLndhbGxldFBhc3NwaHJhc2UpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB3YWxsZXQgcGFzc3BocmFzZScpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2FsbGV0Q29udHJhY3RBZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gZ2V0SXNLcnNSZWNvdmVyeShwYXJhbXMpO1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyLCB7IGNoZWNrQ29pbkZhbWlseVN1cHBvcnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vIENsZWFuIHVwIHdoaXRlc3BhY2UgZnJvbSBlbnRlcmVkIHZhbHVlc1xuICAgIGNvbnN0IHVzZXJLZXkgPSBwYXJhbXMudXNlcktleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIGNvbnN0IGJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcblxuICAgIC8vIFNldCBuZXcgZXRoIHR4IGZlZXMgKGRlZmF1bHQgdG8gdXNpbmcgcGxhdGZvcm0gdmFsdWVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkKVxuICAgIGNvbnN0IGdhc1ByaWNlID0gcGFyYW1zLmVpcDE1NTlcbiAgICAgID8gbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHBhcmFtcy5laXAxNTU5Lm1heEZlZVBlckdhcylcbiAgICAgIDogbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKHRoaXMuc2V0R2FzUHJpY2UocGFyYW1zLmdhc1ByaWNlKSk7XG4gICAgY29uc3QgZ2FzTGltaXQgPSBuZXcgb3B0aW9uYWxEZXBzLmV0aFV0aWwuQk4odGhpcy5zZXRHYXNMaW1pdChwYXJhbXMuZ2FzTGltaXQpKTtcblxuICAgIC8vIERlY3J5cHQgcHJpdmF0ZSBrZXlzIGZyb20gS2V5Q2FyZCB2YWx1ZXNcbiAgICBsZXQgdXNlclBydjtcbiAgICBpZiAoIXVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICF1c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwcnYnKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXNlclBydiA9IHRoaXMuYml0Z28uZGVjcnlwdCh7XG4gICAgICAgICAgaW5wdXQ6IHVzZXJLZXksXG4gICAgICAgICAgcGFzc3dvcmQ6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNyeXB0aW5nIHVzZXIga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBiYWNrdXBLZXlBZGRyZXNzO1xuICAgIGxldCBiYWNrdXBTaWduaW5nS2V5O1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkgfHwgaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cEtleSk7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnB1YmxpY0tleTtcbiAgICAgIGJhY2t1cEtleUFkZHJlc3MgPSBgMHgke29wdGlvbmFsRGVwcy5ldGhVdGlsLnB1YmxpY1RvQWRkcmVzcyhiYWNrdXBTaWduaW5nS2V5LCB0cnVlKS50b1N0cmluZygnaGV4Jyl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGJhY2t1cFBydjtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgYmFja3VwUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHtcbiAgICAgICAgICBpbnB1dDogYmFja3VwS2V5LFxuICAgICAgICAgIHBhc3N3b3JkOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZGVjcnlwdGluZyBiYWNrdXAga2V5Y2hhaW46ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYWNrdXBIRE5vZGUgPSBiaXAzMi5mcm9tQmFzZTU4KGJhY2t1cFBydik7XG4gICAgICBiYWNrdXBTaWduaW5nS2V5ID0gYmFja3VwSEROb2RlLnByaXZhdGVLZXk7XG4gICAgICBiYWNrdXBLZXlBZGRyZXNzID0gYDB4JHtvcHRpb25hbERlcHMuZXRoVXRpbC5wcml2YXRlVG9BZGRyZXNzKGJhY2t1cFNpZ25pbmdLZXkpLnRvU3RyaW5nKCdoZXgnKX1gO1xuICAgIH1cblxuICAgIC8vIEdldCBub25jZSBmb3IgYmFja3VwIGtleSAoc2hvdWxkIGJlIDApXG4gICAgbGV0IGJhY2t1cEtleU5vbmNlID0gMDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucmVjb3ZlcnlCbG9ja2NoYWluRXhwbG9yZXJRdWVyeShcbiAgICAgIHtcbiAgICAgICAgY2hhaW5pZDogdGhpcy5nZXRDaGFpbklkKCkudG9TdHJpbmcoKSxcbiAgICAgICAgbW9kdWxlOiAnYWNjb3VudCcsXG4gICAgICAgIGFjdGlvbjogJ3R4bGlzdCcsXG4gICAgICAgIGFkZHJlc3M6IGJhY2t1cEtleUFkZHJlc3MsXG4gICAgICB9LFxuICAgICAgcGFyYW1zLmFwaUtleVxuICAgICk7XG4gICAgY29uc3QgYmFja3VwS2V5VHhMaXN0ID0gcmVzdWx0LnJlc3VsdDtcbiAgICBpZiAoYmFja3VwS2V5VHhMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIENhbGN1bGF0ZSBsYXN0IG5vbmNlIHVzZWRcbiAgICAgIGNvbnN0IG91dGdvaW5nVHhzID0gYmFja3VwS2V5VHhMaXN0LmZpbHRlcigodHgpID0+IHR4LmZyb20gPT09IGJhY2t1cEtleUFkZHJlc3MpO1xuICAgICAgYmFja3VwS2V5Tm9uY2UgPSBvdXRnb2luZ1R4cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gZ2V0IGJhbGFuY2Ugb2YgYmFja3VwIGtleSBhbmQgbWFrZSBzdXJlIHdlIGNhbiBhZmZvcmQgZ2FzXG4gICAgY29uc3QgYmFja3VwS2V5QmFsYW5jZSA9IGF3YWl0IHRoaXMucXVlcnlBZGRyZXNzQmFsYW5jZShiYWNrdXBLZXlBZGRyZXNzLCBwYXJhbXMuYXBpS2V5KTtcblxuICAgIGlmIChiYWNrdXBLZXlCYWxhbmNlLmx0KGdhc1ByaWNlLm11bChnYXNMaW1pdCkpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBCYWNrdXAga2V5IGFkZHJlc3MgJHtiYWNrdXBLZXlBZGRyZXNzfSBoYXMgYmFsYW5jZSAke2JhY2t1cEtleUJhbGFuY2UudG9TdHJpbmcoXG4gICAgICAgICAgMTBcbiAgICAgICAgKX0uIFRoaXMgYWRkcmVzcyBtdXN0IGhhdmUgYSBiYWxhbmNlIG9mIGF0IGxlYXN0IDAuMDEgRVRIIHRvIHBlcmZvcm0gcmVjb3Zlcmllc2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHRva2VuIGJhbGFuY2Ugb2Ygd2FsbGV0XG4gICAgY29uc3QgdHhBbW91bnQgPSBhd2FpdCB0aGlzLnF1ZXJ5QWRkcmVzc1Rva2VuQmFsYW5jZShcbiAgICAgIHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MsXG4gICAgICBwYXJhbXMud2FsbGV0Q29udHJhY3RBZGRyZXNzLFxuICAgICAgcGFyYW1zLmFwaUtleVxuICAgICk7XG4gICAgaWYgKG5ldyBCaWdOdW1iZXIodHhBbW91bnQpLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2FsbGV0IGRvZXMgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZCByZWNpcGllbnRzIG9iamVjdFxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICBhbW91bnQ6IHR4QW1vdW50LnRvU3RyaW5nKDEwKSxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEdldCBzZXF1ZW5jZSBJRCB1c2luZyBjb250cmFjdCBjYWxsXG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IGF3YWl0IHRoaXMucXVlcnlTZXF1ZW5jZUlkKHBhcmFtcy53YWxsZXRDb250cmFjdEFkZHJlc3MsIHBhcmFtcy5hcGlLZXkpO1xuXG4gICAgbGV0IG9wZXJhdGlvbkhhc2gsIHNpZ25hdHVyZTtcbiAgICBpZiAoIWlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgLy8gR2V0IG9wZXJhdGlvbiBoYXNoIGFuZCBzaWduIGl0XG4gICAgICBvcGVyYXRpb25IYXNoID0gdGhpcy5nZXRPcGVyYXRpb25TaGEzRm9yRXhlY3V0ZUFuZENvbmZpcm0ocmVjaXBpZW50cywgdGhpcy5nZXREZWZhdWx0RXhwaXJlVGltZSgpLCBzZXF1ZW5jZUlkKTtcbiAgICAgIHNpZ25hdHVyZSA9IFV0aWwuZXRoU2lnbk1zZ0hhc2gob3BlcmF0aW9uSGFzaCwgVXRpbC54cHJ2VG9FdGhQcml2YXRlS2V5KHVzZXJQcnYpKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgVXRpbC5lY1JlY292ZXJFdGhBZGRyZXNzKG9wZXJhdGlvbkhhc2gsIHNpZ25hdHVyZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaWduYXR1cmUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0eEluZm8gPSB7XG4gICAgICByZWNpcGllbnQ6IHJlY2lwaWVudHNbMF0sXG4gICAgICBleHBpcmVUaW1lOiB0aGlzLmdldERlZmF1bHRFeHBpcmVUaW1lKCksXG4gICAgICBjb250cmFjdFNlcXVlbmNlSWQ6IHNlcXVlbmNlSWQsXG4gICAgICBzaWduYXR1cmU6IHNpZ25hdHVyZSxcbiAgICAgIGdhc0xpbWl0OiBnYXNMaW1pdC50b1N0cmluZygxMCksXG4gICAgICB0b2tlbkNvbnRyYWN0QWRkcmVzczogdGhpcy50b2tlbkNvbnRyYWN0QWRkcmVzcyxcbiAgICB9O1xuXG4gICAgLy8gY2FsY3VsYXRlIHNlbmQgZGF0YVxuICAgIGNvbnN0IHNlbmRNZXRob2RBcmdzID0gdGhpcy5nZXRTZW5kTWV0aG9kQXJncyh0eEluZm8pO1xuICAgIGNvbnN0IG1ldGhvZFNpZ25hdHVyZSA9IG9wdGlvbmFsRGVwcy5ldGhBYmkubWV0aG9kSUQodGhpcy5zZW5kTWV0aG9kTmFtZSwgXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJykpO1xuICAgIGNvbnN0IGVuY29kZWRBcmdzID0gb3B0aW9uYWxEZXBzLmV0aEFiaS5yYXdFbmNvZGUoXy5tYXAoc2VuZE1ldGhvZEFyZ3MsICd0eXBlJyksIF8ubWFwKHNlbmRNZXRob2RBcmdzLCAndmFsdWUnKSk7XG4gICAgY29uc3Qgc2VuZERhdGEgPSBCdWZmZXIuY29uY2F0KFttZXRob2RTaWduYXR1cmUsIGVuY29kZWRBcmdzXSk7XG5cbiAgICBsZXQgdHggPSBFdGguYnVpbGRUcmFuc2FjdGlvbih7XG4gICAgICB0bzogcGFyYW1zLndhbGxldENvbnRyYWN0QWRkcmVzcyxcbiAgICAgIG5vbmNlOiBiYWNrdXBLZXlOb25jZSxcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgZ2FzUHJpY2U6IGdhc1ByaWNlLFxuICAgICAgZ2FzTGltaXQ6IGdhc0xpbWl0LFxuICAgICAgZGF0YTogc2VuZERhdGEsXG4gICAgICBlaXAxNTU5OiBwYXJhbXMuZWlwMTU1OSxcbiAgICAgIHJlcGxheVByb3RlY3Rpb25PcHRpb25zOiBwYXJhbXMucmVwbGF5UHJvdGVjdGlvbk9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXRGb3JPZmZsaW5lVmF1bHQoXG4gICAgICAgIHR4SW5mbyxcbiAgICAgICAgdHgsXG4gICAgICAgIHVzZXJLZXksXG4gICAgICAgIGJhY2t1cEtleSxcbiAgICAgICAgZ2FzUHJpY2UsXG4gICAgICAgIGdhc0xpbWl0LFxuICAgICAgICBwYXJhbXMuZWlwMTU1OSxcbiAgICAgICAgcGFyYW1zLnJlcGxheVByb3RlY3Rpb25PcHRpb25zLFxuICAgICAgICBwYXJhbXMuYXBpS2V5XG4gICAgICApIGFzIGFueTtcbiAgICB9XG5cbiAgICBpZiAoIWlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHR4ID0gdHguc2lnbihiYWNrdXBTaWduaW5nS2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWduZWRUeDogUmVjb3ZlcnlJbmZvID0ge1xuICAgICAgaWQ6IG9wdGlvbmFsRGVwcy5ldGhVdGlsLmJ1ZmZlclRvSGV4KHR4Lmhhc2goKSksXG4gICAgICB0eDogdHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIH07XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHguYmFja3VwS2V5ID0gYmFja3VwS2V5O1xuICAgICAgc2lnbmVkVHguY29pbiA9ICdlcmM3MjEnO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduZWRUeDtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbihyZWNpcGllbnQsIGV4cGlyZVRpbWUsIGNvbnRyYWN0U2VxdWVuY2VJZCkge1xuICAgIHJldHVybiBbXG4gICAgICBbJ3N0cmluZycsICdhZGRyZXNzJywgJ3VpbnQnLCAnYWRkcmVzcycsICd1aW50JywgJ3VpbnQnXSxcbiAgICAgIFtcbiAgICAgICAgJ0VSQzcyMScsXG4gICAgICAgIG5ldyBvcHRpb25hbERlcHMuZXRoVXRpbC5CTihvcHRpb25hbERlcHMuZXRoVXRpbC5zdHJpcEhleFByZWZpeChyZWNpcGllbnQuYWRkcmVzcyksIDE2KSxcbiAgICAgICAgcmVjaXBpZW50LmFtb3VudCxcbiAgICAgICAgbmV3IG9wdGlvbmFsRGVwcy5ldGhVdGlsLkJOKG9wdGlvbmFsRGVwcy5ldGhVdGlsLnN0cmlwSGV4UHJlZml4KHRoaXMudG9rZW5Db250cmFjdEFkZHJlc3MpLCAxNiksXG4gICAgICAgIGV4cGlyZVRpbWUsXG4gICAgICAgIGNvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgIF0sXG4gICAgXTtcbiAgfVxuXG4gIGdldFNlbmRNZXRob2RBcmdzKHR4SW5mbykge1xuICAgIC8vIE1ldGhvZCBzaWduYXR1cmUgaXNcbiAgICAvLyBzZW5kTXVsdGlTaWdUb2tlbihhZGRyZXNzIHRvQWRkcmVzcywgdWludCB2YWx1ZSwgYWRkcmVzcyB0b2tlbkNvbnRyYWN0QWRkcmVzcywgdWludCBleHBpcmVUaW1lLCB1aW50IHNlcXVlbmNlSWQsIGJ5dGVzIHNpZ25hdHVyZSlcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBuYW1lOiAndG9BZGRyZXNzJyxcbiAgICAgICAgdHlwZTogJ2FkZHJlc3MnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLnJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3ZhbHVlJyxcbiAgICAgICAgdHlwZTogJ3VpbnQnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLnJlY2lwaWVudC5hbW91bnQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndG9rZW5Db250cmFjdEFkZHJlc3MnLFxuICAgICAgICB0eXBlOiAnYWRkcmVzcycsXG4gICAgICAgIHZhbHVlOiB0aGlzLnRva2VuQ29udHJhY3RBZGRyZXNzLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ2V4cGlyZVRpbWUnLFxuICAgICAgICB0eXBlOiAndWludCcsXG4gICAgICAgIHZhbHVlOiB0eEluZm8uZXhwaXJlVGltZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzZXF1ZW5jZUlkJyxcbiAgICAgICAgdHlwZTogJ3VpbnQnLFxuICAgICAgICB2YWx1ZTogdHhJbmZvLmNvbnRyYWN0U2VxdWVuY2VJZCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzaWduYXR1cmUnLFxuICAgICAgICB0eXBlOiAnYnl0ZXMnLFxuICAgICAgICB2YWx1ZTogb3B0aW9uYWxEZXBzLmV0aFV0aWwudG9CdWZmZXIob3B0aW9uYWxEZXBzLmV0aFV0aWwuYWRkSGV4UHJlZml4KHR4SW5mby5zaWduYXR1cmUpKSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHZlcmlmeUNvaW4odHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eFByZWJ1aWxkLmNvaW4gPT09IHRoaXMudG9rZW5Db25maWcuY29pbiAmJiB0eFByZWJ1aWxkLnRva2VuID09PSB0aGlzLnRva2VuQ29uZmlnLnR5cGU7XG4gIH1cbn1cbiJdfQ==
package/dist/src/eth.d.ts DELETED
@@ -1,80 +0,0 @@
1
- import { BaseCoin, BitGoBase, FullySignedTransaction, HalfSignedTransaction, MPCAlgorithm, MultisigType, Recipient } from '@bitgo/sdk-core';
2
- import { AbstractEthLikeNewCoins, BuildOptions, BuildTransactionParams, FeesUsed, GetBatchExecutionInfoRT, GetSendMethodArgsOptions, OfflineVaultTxInfo, optionalDeps, RecoverOptions, RecoveryInfo, SendMethodArgs, SignedTransaction, SignFinalOptions, SignTransactionOptions, TransactionPrebuild, UnsignedSweepTxMPCv2 } from '@bitgo/abstract-eth';
3
- import { BaseCoin as StaticsBaseCoin } from '@bitgo/statics';
4
- import type * as EthTxLib from '@ethereumjs/tx';
5
- import { TransactionBuilder } from './lib';
6
- export { BuildTransactionParams, Recipient, HalfSignedTransaction, FeesUsed, FullySignedTransaction, GetBatchExecutionInfoRT, GetSendMethodArgsOptions, TransactionPrebuild, OfflineVaultTxInfo, optionalDeps, RecoverOptions, RecoveryInfo, SendMethodArgs, SignFinalOptions, SignedTransaction, SignTransactionOptions, };
7
- export declare class Eth extends AbstractEthLikeNewCoins {
8
- protected constructor(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>);
9
- static createInstance(bitgo: BitGoBase, staticsCoin?: Readonly<StaticsBaseCoin>): BaseCoin;
10
- allowsAccountConsolidations(): boolean;
11
- /** @inheritDoc */
12
- supportsTss(): boolean;
13
- /** inherited doc */
14
- getDefaultMultisigType(): MultisigType;
15
- getMPCAlgorithm(): MPCAlgorithm;
16
- /**
17
- * Gets correct Eth Common object based on params from either recovery or tx building
18
- * @param eip1559 {EIP1559} configs that specify whether we should construct an eip1559 tx
19
- * @param replayProtectionOptions {ReplayProtectionOptions} check if chain id supports replay protection
20
- */
21
- private static getEthCommon;
22
- static buildTransaction(params: BuildTransactionParams): EthTxLib.FeeMarketEIP1559Transaction | EthTxLib.Transaction;
23
- /**
24
- * Make a query to Etherscan for information such as balance, token balance, solidity calls
25
- * @param query {Object} key-value pairs of parameters to append after /api
26
- * @param apiKey {string} optional API key to use instead of the one from the environment
27
- * @returns {Object} response from Etherscan
28
- */
29
- recoveryBlockchainExplorerQuery(query: Record<string, string>, apiKey?: string): Promise<any>;
30
- /**
31
- * Recovers a tx with non-TSS keys
32
- * same expected arguments as recover method (original logic before adding TSS recover path)
33
- */
34
- protected recoverEthLike(params: RecoverOptions): Promise<RecoveryInfo | OfflineVaultTxInfo>;
35
- protected buildUnsignedSweepTxnTSS(params: RecoverOptions): Promise<OfflineVaultTxInfo | UnsignedSweepTxMPCv2>;
36
- /**
37
- * Return boolean indicating whether input is valid public key for the coin.
38
- *
39
- * @param {String} pub the pub to be checked
40
- * @returns {Boolean} is it valid?
41
- */
42
- isValidPub(pub: string): boolean;
43
- /**
44
- * Helper function for signTransaction for the rare case that SDK is doing the second signature
45
- * Note: we are expecting this to be called from the offline vault
46
- * @param params.txPrebuild
47
- * @param params.signingKeyNonce
48
- * @param params.walletContractAddress
49
- * @param params.prv
50
- * @returns {{txHex: *}}
51
- */
52
- signFinal(params: SignFinalOptions): FullySignedTransaction;
53
- /**
54
- * Assemble keychain and half-sign prebuilt transaction
55
- * @param params
56
- * - txPrebuild
57
- * - prv
58
- * @returns {Promise<SignedTransaction>}
59
- */
60
- signTransaction(params: SignTransactionOptions): Promise<SignedTransaction>;
61
- /**
62
- * Modify prebuild before sending it to the server. Add things like hop transaction params
63
- * @param buildParams The whitelisted parameters for this prebuild
64
- * @param buildParams.hop True if this should prebuild a hop tx, else false
65
- * @param buildParams.recipients The recipients array of this transaction
66
- * @param buildParams.wallet The wallet sending this tx
67
- * @param buildParams.walletPassphrase the passphrase for this wallet
68
- */
69
- getExtraPrebuildParams(buildParams: BuildOptions): Promise<BuildOptions>;
70
- /**
71
- * Create a new transaction builder for the current chain
72
- * @return a new transaction builder
73
- */
74
- protected getTransactionBuilder(): TransactionBuilder;
75
- /** @inheritDoc */
76
- supportsMessageSigning(): boolean;
77
- /** @inheritDoc */
78
- supportsSigningTypedData(): boolean;
79
- }
80
- //# sourceMappingURL=eth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eth.d.ts","sourceRoot":"","sources":["../../src/eth.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,QAAQ,EACR,SAAS,EAGT,sBAAsB,EAGtB,qBAAqB,EACrB,YAAY,EACZ,YAAY,EAEZ,SAAS,EAEV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EAEtB,QAAQ,EACR,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EAEZ,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAS,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAG3C,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,GACvB,CAAC;AAEF,qBAAa,GAAI,SAAQ,uBAAuB;IAC9C,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;IAI1F,2BAA2B,IAAI,OAAO;IAItC,kBAAkB;IAClB,WAAW,IAAI,OAAO;IAItB,oBAAoB;IACpB,sBAAsB,IAAI,YAAY;IAItC,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,QAAQ,CAAC,2BAA2B,GAAG,QAAQ,CAAC,WAAW;IAiCpH;;;;;OAKG;IACG,+BAA+B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAiBnG;;;OAGG;cACa,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,kBAAkB,CAAC;cA2KlF,wBAAwB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,GAAG,oBAAoB,CAAC;IAKpH;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQhC;;;;;;;;OAQG;IACH,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAAG,sBAAsB;IAwD3D;;;;;;OAMG;IACG,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqEjF;;;;;;;OAOG;IACG,sBAAsB,CAAC,WAAW,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB9E;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,kBAAkB;IAIrD,kBAAkB;IAClB,sBAAsB,IAAI,OAAO;IAIjC,kBAAkB;IAClB,wBAAwB,IAAI,OAAO;CAGpC"}