@bitgo-beta/sdk-coin-icp 1.0.1-beta.84 → 1.0.1-beta.840
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/dist/resources/messageCompiled.d.ts +797 -0
- package/dist/resources/messageCompiled.js +1859 -0
- package/dist/src/icp.d.ts +64 -3
- package/dist/src/icp.d.ts.map +1 -1
- package/dist/src/icp.js +332 -10
- package/dist/src/lib/icpAgent.d.ts +36 -0
- package/dist/src/lib/icpAgent.d.ts.map +1 -0
- package/dist/src/lib/icpAgent.js +90 -0
- package/dist/src/lib/iface.d.ts +195 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +44 -0
- package/dist/src/lib/index.d.ts +4 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- package/dist/src/lib/signedTransactionBuilder.d.ts +9 -0
- package/dist/src/lib/signedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/signedTransactionBuilder.js +64 -0
- package/dist/src/lib/transaction.d.ts +54 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +255 -0
- package/dist/src/lib/transactionBuilder.d.ts +58 -28
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +127 -40
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -14
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +43 -27
- package/dist/src/lib/transferBuilder.d.ts +7 -24
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +88 -43
- package/dist/src/lib/unsignedTransactionBuilder.d.ts +13 -0
- package/dist/src/lib/unsignedTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/unsignedTransactionBuilder.js +90 -0
- package/dist/src/lib/utils.d.ts +286 -8
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +615 -53
- package/dist/src/ticp.d.ts +0 -4
- package/dist/src/ticp.d.ts.map +1 -1
- package/dist/src/ticp.js +1 -7
- package/dist/test/resources/icp.d.ts +268 -0
- package/dist/test/resources/icp.d.ts.map +1 -0
- package/dist/test/resources/icp.js +377 -0
- package/dist/test/unit/getBuilderFactory.d.ts +3 -0
- package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/getBuilderFactory.js +10 -0
- package/dist/test/unit/icp.d.ts +2 -0
- package/dist/test/unit/icp.d.ts.map +1 -0
- package/dist/test/unit/icp.js +418 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +107 -0
- package/dist/test/unit/transaction.d.ts +2 -0
- package/dist/test/unit/transaction.d.ts.map +1 -0
- package/dist/test/unit/transaction.js +109 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +274 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionRecover.js +188 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +206 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +23 -12
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -54
package/dist/src/icp.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { BaseCoin, BitGoBase, MPCAlgorithm,
|
|
1
|
+
import { AuditDecryptedKeyParams, BaseBroadcastTransactionOptions, BaseBroadcastTransactionResult, BaseCoin, BitGoBase, KeyPair, MPCAlgorithm, MultisigType, ParsedTransaction, ParseTransactionOptions, SignedTransaction, SignTransactionOptions, VerifyTransactionOptions } from '@bitgo-beta/sdk-core';
|
|
2
2
|
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
3
|
+
import BigNumber from 'bignumber.js';
|
|
4
|
+
import { Hash } from 'crypto';
|
|
5
|
+
import { PayloadsData, RecoveryOptions, RecoveryTransaction, Signatures, IcpTransactionExplanation, TransactionHexParams, TssVerifyIcpAddressOptions, UnsignedSweepRecoveryTransaction } from './lib/iface';
|
|
3
6
|
/**
|
|
4
7
|
* Class representing the Internet Computer (ICP) coin.
|
|
5
8
|
* Extends the BaseCoin class and provides specific implementations for ICP.
|
|
@@ -16,8 +19,17 @@ export declare class Icp extends BaseCoin {
|
|
|
16
19
|
getFamily(): string;
|
|
17
20
|
getFullName(): string;
|
|
18
21
|
getBaseFactor(): number;
|
|
22
|
+
explainTransaction(params: TransactionHexParams): Promise<IcpTransactionExplanation>;
|
|
19
23
|
verifyTransaction(params: VerifyTransactionOptions): Promise<boolean>;
|
|
20
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Verify that an address belongs to this wallet.
|
|
26
|
+
*
|
|
27
|
+
* @param {TssVerifyIcpAddressOptions} params - Verification parameters
|
|
28
|
+
* @returns {Promise<boolean>} True if address belongs to wallet
|
|
29
|
+
* @throws {InvalidAddressError} If address format is invalid or doesn't match derived address
|
|
30
|
+
* @throws {Error} If invalid wallet version or missing parameters
|
|
31
|
+
*/
|
|
32
|
+
isWalletAddress(params: TssVerifyIcpAddressOptions): Promise<boolean>;
|
|
21
33
|
parseTransaction(params: ParseTransactionOptions): Promise<ParsedTransaction>;
|
|
22
34
|
/**
|
|
23
35
|
* Generate a new keypair for this coin.
|
|
@@ -25,15 +37,64 @@ export declare class Icp extends BaseCoin {
|
|
|
25
37
|
*/
|
|
26
38
|
generateKeyPair(seed?: Buffer): KeyPair;
|
|
27
39
|
isValidAddress(address: string): boolean;
|
|
28
|
-
signTransaction(
|
|
40
|
+
signTransaction(params: SignTransactionOptions & {
|
|
41
|
+
txPrebuild: {
|
|
42
|
+
txHex: string;
|
|
43
|
+
};
|
|
44
|
+
prv: string;
|
|
45
|
+
}): Promise<SignedTransaction>;
|
|
29
46
|
isValidPub(key: string): boolean;
|
|
30
47
|
isValidPrv(key: string): boolean;
|
|
31
48
|
/** @inheritDoc */
|
|
32
49
|
supportsTss(): boolean;
|
|
50
|
+
/** inherited doc */
|
|
51
|
+
getDefaultMultisigType(): MultisigType;
|
|
33
52
|
/** @inheritDoc */
|
|
34
53
|
getMPCAlgorithm(): MPCAlgorithm;
|
|
54
|
+
/** @inheritDoc **/
|
|
55
|
+
getHashFunction(): Hash;
|
|
35
56
|
private getAddressFromPublicKey;
|
|
36
57
|
/** @inheritDoc **/
|
|
37
58
|
protected getPublicNodeUrl(): string;
|
|
59
|
+
/** @inheritDoc **/
|
|
60
|
+
broadcastTransaction(payload: BaseBroadcastTransactionOptions): Promise<BaseBroadcastTransactionResult>;
|
|
61
|
+
private getPublicNodeBroadcastEndpoint;
|
|
62
|
+
/**
|
|
63
|
+
* Fetches the account balance for a given public key.
|
|
64
|
+
* @param publicKeyHex - Hex-encoded public key of the account.
|
|
65
|
+
* @returns Promise resolving to the account balance as a string.
|
|
66
|
+
* @throws Error if the balance could not be fetched.
|
|
67
|
+
*/
|
|
68
|
+
protected getAccountBalance(publicKeyHex: string): Promise<BigNumber>;
|
|
69
|
+
/**
|
|
70
|
+
* Retrieves the current transaction fee data from the ICP public node.
|
|
71
|
+
*
|
|
72
|
+
* This method creates an instance of `IcpAgent` using the public node URL,
|
|
73
|
+
* then queries the node for the current fee information.
|
|
74
|
+
*
|
|
75
|
+
* @returns A promise that resolves to a `BigNumber` representing the current transaction fee.
|
|
76
|
+
* @throws Will propagate any errors encountered while communicating with the ICP node.
|
|
77
|
+
*/
|
|
78
|
+
protected getFeeData(): Promise<BigNumber>;
|
|
79
|
+
private getBuilderFactory;
|
|
80
|
+
/**
|
|
81
|
+
* Generates an array of signatures for the provided payloads using MPC
|
|
82
|
+
*
|
|
83
|
+
* @param payloadsData - The data containing the payloads to be signed.
|
|
84
|
+
* @param senderPublicKey - The public key of the sender in hexadecimal format.
|
|
85
|
+
* @param userKeyShare - The user's key share as a Buffer.
|
|
86
|
+
* @param backupKeyShare - The backup key share as a Buffer.
|
|
87
|
+
* @param commonKeyChain - The common key chain identifier used for MPC signing.
|
|
88
|
+
* @returns A promise that resolves to an array of `Signatures` objects, each containing the signing payload,
|
|
89
|
+
* signature type, public key, and the generated signature in hexadecimal format.
|
|
90
|
+
*/
|
|
91
|
+
signatures(payloadsData: PayloadsData, senderPublicKey: string, userKeyShare: Buffer<ArrayBufferLike>, backupKeyShare: Buffer<ArrayBufferLike>, commonKeyChain: string): Promise<Signatures[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Builds a funds recovery transaction without BitGo
|
|
94
|
+
* @param params
|
|
95
|
+
*/
|
|
96
|
+
recover(params: RecoveryOptions): Promise<RecoveryTransaction | UnsignedSweepRecoveryTransaction>;
|
|
97
|
+
/** @inheritDoc */
|
|
98
|
+
auditDecryptedKey({ multiSigType, prv, publicKey }: AuditDecryptedKeyParams): void;
|
|
38
99
|
}
|
|
39
100
|
//# sourceMappingURL=icp.d.ts.map
|
package/dist/src/icp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icp.d.ts","sourceRoot":"","sources":["../../src/icp.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"icp.d.ts","sourceRoot":"","sources":["../../src/icp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/icp.js
CHANGED
|
@@ -1,11 +1,55 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.Icp = void 0;
|
|
40
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
41
|
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
42
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
43
|
+
const principal_1 = require("@dfinity/principal");
|
|
44
|
+
const axios_1 = __importDefault(require("axios"));
|
|
45
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
46
|
+
const crypto_1 = require("crypto");
|
|
47
|
+
const mpc = __importStar(require("@bitgo-beta/sdk-lib-mpc"));
|
|
48
|
+
const iface_1 = require("./lib/iface");
|
|
49
|
+
const transactionBuilderFactory_1 = require("./lib/transactionBuilderFactory");
|
|
8
50
|
const utils_1 = __importDefault(require("./lib/utils"));
|
|
51
|
+
const sdk_lib_mpc_1 = require("@bitgo-beta/sdk-lib-mpc");
|
|
52
|
+
const icpAgent_1 = require("./lib/icpAgent");
|
|
9
53
|
/**
|
|
10
54
|
* Class representing the Internet Computer (ICP) coin.
|
|
11
55
|
* Extends the BaseCoin class and provides specific implementations for ICP.
|
|
@@ -31,7 +75,7 @@ class Icp extends sdk_core_1.BaseCoin {
|
|
|
31
75
|
return 'icp';
|
|
32
76
|
}
|
|
33
77
|
getFamily() {
|
|
34
|
-
return
|
|
78
|
+
return this._staticsCoin.family;
|
|
35
79
|
}
|
|
36
80
|
getFullName() {
|
|
37
81
|
return 'Internet Computer';
|
|
@@ -39,14 +83,81 @@ class Icp extends sdk_core_1.BaseCoin {
|
|
|
39
83
|
getBaseFactor() {
|
|
40
84
|
return Math.pow(10, this._staticsCoin.decimalPlaces);
|
|
41
85
|
}
|
|
86
|
+
async explainTransaction(params) {
|
|
87
|
+
const factory = this.getBuilderFactory();
|
|
88
|
+
const txBuilder = await factory.from(params.transactionHex);
|
|
89
|
+
const transaction = await txBuilder.build();
|
|
90
|
+
if (params.signableHex !== undefined) {
|
|
91
|
+
const generatedSignableHex = txBuilder.transaction.payloadsData.payloads[0].hex_bytes;
|
|
92
|
+
if (generatedSignableHex !== params.signableHex) {
|
|
93
|
+
throw new Error('generated signableHex is not equal to params.signableHex');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return transaction.explainTransaction();
|
|
97
|
+
}
|
|
42
98
|
async verifyTransaction(params) {
|
|
43
|
-
|
|
99
|
+
const { txParams, txPrebuild } = params;
|
|
100
|
+
const txHex = txPrebuild?.txHex;
|
|
101
|
+
if (!txHex) {
|
|
102
|
+
throw new Error('txHex is required');
|
|
103
|
+
}
|
|
104
|
+
const txHexParams = {
|
|
105
|
+
transactionHex: txHex,
|
|
106
|
+
};
|
|
107
|
+
if (txPrebuild.txInfo && txPrebuild.txInfo !== undefined && typeof txPrebuild.txInfo === 'string') {
|
|
108
|
+
txHexParams.signableHex = txPrebuild.txInfo;
|
|
109
|
+
}
|
|
110
|
+
const explainedTx = await this.explainTransaction(txHexParams);
|
|
111
|
+
if (Array.isArray(txParams.recipients) && txParams.recipients.length > 0) {
|
|
112
|
+
if (txParams.recipients.length > 1) {
|
|
113
|
+
throw new Error(`${this.getChain()} doesn't support sending to more than 1 destination address within a single transaction. Try again, using only a single recipient.`);
|
|
114
|
+
}
|
|
115
|
+
(0, assert_1.default)(explainedTx.outputs.length === 1, 'Tx outputs does not match with expected txParams recipients');
|
|
116
|
+
const output = explainedTx.outputs[0];
|
|
117
|
+
const recipient = txParams.recipients[0];
|
|
118
|
+
(0, assert_1.default)(typeof recipient.address === 'string' &&
|
|
119
|
+
typeof output.address === 'string' &&
|
|
120
|
+
output.address === recipient.address &&
|
|
121
|
+
(0, bignumber_js_1.default)(output.amount).eq((0, bignumber_js_1.default)(recipient.amount)), 'Tx outputs does not match with expected txParams recipients');
|
|
122
|
+
}
|
|
123
|
+
return true;
|
|
44
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Verify that an address belongs to this wallet.
|
|
127
|
+
*
|
|
128
|
+
* @param {TssVerifyIcpAddressOptions} params - Verification parameters
|
|
129
|
+
* @returns {Promise<boolean>} True if address belongs to wallet
|
|
130
|
+
* @throws {InvalidAddressError} If address format is invalid or doesn't match derived address
|
|
131
|
+
* @throws {Error} If invalid wallet version or missing parameters
|
|
132
|
+
*/
|
|
45
133
|
async isWalletAddress(params) {
|
|
46
|
-
|
|
134
|
+
const { address, rootAddress, walletVersion } = params;
|
|
135
|
+
if (!this.isValidAddress(address)) {
|
|
136
|
+
throw new sdk_core_1.InvalidAddressError(`invalid address: ${address}`);
|
|
137
|
+
}
|
|
138
|
+
let addressToVerify = address;
|
|
139
|
+
if (walletVersion === 1) {
|
|
140
|
+
if (!rootAddress) {
|
|
141
|
+
throw new Error('rootAddress is required for wallet version 1');
|
|
142
|
+
}
|
|
143
|
+
const extractedRootAddress = utils_1.default.validateMemoAndReturnRootAddress(address);
|
|
144
|
+
if (!extractedRootAddress || extractedRootAddress === address) {
|
|
145
|
+
throw new Error('memoId is required for wallet version 1 addresses');
|
|
146
|
+
}
|
|
147
|
+
if (extractedRootAddress.toLowerCase() !== rootAddress.toLowerCase()) {
|
|
148
|
+
throw new sdk_core_1.UnexpectedAddressError(`address validation failure: expected ${rootAddress} but got ${extractedRootAddress}`);
|
|
149
|
+
}
|
|
150
|
+
addressToVerify = rootAddress;
|
|
151
|
+
}
|
|
152
|
+
const indexToVerify = walletVersion === 1 ? 0 : params.index;
|
|
153
|
+
const result = await (0, sdk_core_1.verifyMPCWalletAddress)({ ...params, address: addressToVerify, index: indexToVerify, keyCurve: 'secp256k1' }, this.isValidAddress.bind(this), (pubKey) => utils_1.default.getAddressFromPublicKey(pubKey));
|
|
154
|
+
if (!result) {
|
|
155
|
+
throw new sdk_core_1.UnexpectedAddressError(`address validation failure: address ${addressToVerify} is not a wallet address`);
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
47
158
|
}
|
|
48
159
|
async parseTransaction(params) {
|
|
49
|
-
|
|
160
|
+
return {};
|
|
50
161
|
}
|
|
51
162
|
/**
|
|
52
163
|
* Generate a new keypair for this coin.
|
|
@@ -56,10 +167,25 @@ class Icp extends sdk_core_1.BaseCoin {
|
|
|
56
167
|
return utils_1.default.generateKeyPair(seed);
|
|
57
168
|
}
|
|
58
169
|
isValidAddress(address) {
|
|
59
|
-
|
|
170
|
+
return utils_1.default.isValidAddress(address);
|
|
60
171
|
}
|
|
61
|
-
signTransaction(
|
|
62
|
-
|
|
172
|
+
async signTransaction(params) {
|
|
173
|
+
const txHex = params?.txPrebuild?.txHex;
|
|
174
|
+
const privateKey = params?.prv;
|
|
175
|
+
if (!txHex) {
|
|
176
|
+
throw new sdk_core_1.SigningError('missing required txPrebuild parameter: params.txPrebuild.txHex');
|
|
177
|
+
}
|
|
178
|
+
if (!privateKey) {
|
|
179
|
+
throw new sdk_core_1.SigningError('missing required prv parameter: params.prv');
|
|
180
|
+
}
|
|
181
|
+
const factory = this.getBuilderFactory();
|
|
182
|
+
const txBuilder = await factory.from(params.txPrebuild.txHex);
|
|
183
|
+
txBuilder.sign({ key: params.prv });
|
|
184
|
+
txBuilder.combine();
|
|
185
|
+
const serializedTx = txBuilder.transaction.toBroadcastFormat();
|
|
186
|
+
return {
|
|
187
|
+
txHex: serializedTx,
|
|
188
|
+
};
|
|
63
189
|
}
|
|
64
190
|
isValidPub(key) {
|
|
65
191
|
return utils_1.default.isValidPublicKey(key);
|
|
@@ -71,17 +197,213 @@ class Icp extends sdk_core_1.BaseCoin {
|
|
|
71
197
|
supportsTss() {
|
|
72
198
|
return true;
|
|
73
199
|
}
|
|
200
|
+
/** inherited doc */
|
|
201
|
+
getDefaultMultisigType() {
|
|
202
|
+
return sdk_core_1.multisigTypes.tss;
|
|
203
|
+
}
|
|
74
204
|
/** @inheritDoc */
|
|
75
205
|
getMPCAlgorithm() {
|
|
76
206
|
return 'ecdsa';
|
|
77
207
|
}
|
|
78
|
-
|
|
208
|
+
/** @inheritDoc **/
|
|
209
|
+
getHashFunction() {
|
|
210
|
+
return (0, crypto_1.createHash)('sha256');
|
|
211
|
+
}
|
|
212
|
+
getAddressFromPublicKey(hexEncodedPublicKey) {
|
|
79
213
|
return utils_1.default.getAddressFromPublicKey(hexEncodedPublicKey);
|
|
80
214
|
}
|
|
81
215
|
/** @inheritDoc **/
|
|
82
216
|
getPublicNodeUrl() {
|
|
83
|
-
return sdk_core_1.Environments[this.bitgo.getEnv()].
|
|
217
|
+
return sdk_core_1.Environments[this.bitgo.getEnv()].icpNodeUrl;
|
|
218
|
+
}
|
|
219
|
+
/** @inheritDoc **/
|
|
220
|
+
// this method calls the public node to broadcast the transaction and not the rosetta node
|
|
221
|
+
async broadcastTransaction(payload) {
|
|
222
|
+
const endpoint = this.getPublicNodeBroadcastEndpoint();
|
|
223
|
+
try {
|
|
224
|
+
const bodyBytes = utils_1.default.blobFromHex(payload.serializedSignedTransaction);
|
|
225
|
+
const response = await axios_1.default.post(endpoint, bodyBytes, {
|
|
226
|
+
headers: { 'Content-Type': 'application/cbor' },
|
|
227
|
+
responseType: 'arraybuffer', // This ensures you get a Buffer, not a string
|
|
228
|
+
});
|
|
229
|
+
if (response.status !== 200) {
|
|
230
|
+
throw new Error(`Transaction broadcast failed with status: ${response.status} - ${response.statusText}`);
|
|
231
|
+
}
|
|
232
|
+
const decodedResponse = utils_1.default.cborDecode(response.data);
|
|
233
|
+
if (decodedResponse.status === 'replied') {
|
|
234
|
+
// it is considered a success because ICP returns response in a CBOR map with a status of 'replied'
|
|
235
|
+
return {}; // returned empty object as ICP does not return a txid
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
throw new Error(`Unexpected response status from node: ${decodedResponse.status}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
throw new Error(`Transaction broadcast error: ${error?.message || JSON.stringify(error)}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
getPublicNodeBroadcastEndpoint() {
|
|
246
|
+
const nodeUrl = this.getPublicNodeUrl();
|
|
247
|
+
const ledgerCanisterId = this._staticsCoin.network.type === statics_1.NetworkType.TESTNET ? iface_1.TESTNET_LEDGER_CANISTER_ID : iface_1.LEDGER_CANISTER_ID;
|
|
248
|
+
const principal = principal_1.Principal.fromUint8Array(ledgerCanisterId);
|
|
249
|
+
const canisterIdHex = principal.toText();
|
|
250
|
+
const endpoint = `${nodeUrl}${iface_1.PUBLIC_NODE_REQUEST_ENDPOINT}${canisterIdHex}/call`;
|
|
251
|
+
return endpoint;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Fetches the account balance for a given public key.
|
|
255
|
+
* @param publicKeyHex - Hex-encoded public key of the account.
|
|
256
|
+
* @returns Promise resolving to the account balance as a string.
|
|
257
|
+
* @throws Error if the balance could not be fetched.
|
|
258
|
+
*/
|
|
259
|
+
async getAccountBalance(publicKeyHex) {
|
|
260
|
+
const principalId = utils_1.default.getPrincipalIdFromPublicKey(publicKeyHex).toText();
|
|
261
|
+
const agent = new icpAgent_1.IcpAgent(this.getPublicNodeUrl(), this._staticsCoin);
|
|
262
|
+
return agent.getBalance(principalId);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Retrieves the current transaction fee data from the ICP public node.
|
|
266
|
+
*
|
|
267
|
+
* This method creates an instance of `IcpAgent` using the public node URL,
|
|
268
|
+
* then queries the node for the current fee information.
|
|
269
|
+
*
|
|
270
|
+
* @returns A promise that resolves to a `BigNumber` representing the current transaction fee.
|
|
271
|
+
* @throws Will propagate any errors encountered while communicating with the ICP node.
|
|
272
|
+
*/
|
|
273
|
+
async getFeeData() {
|
|
274
|
+
const agent = new icpAgent_1.IcpAgent(this.getPublicNodeUrl(), this._staticsCoin);
|
|
275
|
+
return await agent.getFee();
|
|
276
|
+
}
|
|
277
|
+
getBuilderFactory() {
|
|
278
|
+
return new transactionBuilderFactory_1.TransactionBuilderFactory(statics_1.coins.get(this.getBaseChain()));
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Generates an array of signatures for the provided payloads using MPC
|
|
282
|
+
*
|
|
283
|
+
* @param payloadsData - The data containing the payloads to be signed.
|
|
284
|
+
* @param senderPublicKey - The public key of the sender in hexadecimal format.
|
|
285
|
+
* @param userKeyShare - The user's key share as a Buffer.
|
|
286
|
+
* @param backupKeyShare - The backup key share as a Buffer.
|
|
287
|
+
* @param commonKeyChain - The common key chain identifier used for MPC signing.
|
|
288
|
+
* @returns A promise that resolves to an array of `Signatures` objects, each containing the signing payload,
|
|
289
|
+
* signature type, public key, and the generated signature in hexadecimal format.
|
|
290
|
+
*/
|
|
291
|
+
async signatures(payloadsData, senderPublicKey, userKeyShare, backupKeyShare, commonKeyChain) {
|
|
292
|
+
try {
|
|
293
|
+
const payload = payloadsData.payloads[0];
|
|
294
|
+
const message = Buffer.from(payload.hex_bytes, 'hex');
|
|
295
|
+
const messageHash = (0, crypto_1.createHash)('sha256').update(message).digest();
|
|
296
|
+
const signature = await sdk_core_1.ECDSAUtils.signRecoveryMpcV2(messageHash, userKeyShare, backupKeyShare, commonKeyChain);
|
|
297
|
+
const signaturePayload = {
|
|
298
|
+
signing_payload: payload,
|
|
299
|
+
signature_type: payload.signature_type,
|
|
300
|
+
public_key: {
|
|
301
|
+
hex_bytes: senderPublicKey,
|
|
302
|
+
curve_type: iface_1.CurveType.SECP256K1,
|
|
303
|
+
},
|
|
304
|
+
hex_bytes: signature.r + signature.s,
|
|
305
|
+
};
|
|
306
|
+
return [signaturePayload];
|
|
307
|
+
}
|
|
308
|
+
catch (error) {
|
|
309
|
+
throw new Error(`Error generating signatures: ${error.message || error}`);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Builds a funds recovery transaction without BitGo
|
|
314
|
+
* @param params
|
|
315
|
+
*/
|
|
316
|
+
async recover(params) {
|
|
317
|
+
try {
|
|
318
|
+
if (!params.recoveryDestination || !this.isValidAddress(params.recoveryDestination)) {
|
|
319
|
+
throw new Error('invalid recoveryDestination');
|
|
320
|
+
}
|
|
321
|
+
const isUnsignedSweep = !params.userKey && !params.backupKey && !params.walletPassphrase;
|
|
322
|
+
let publicKey;
|
|
323
|
+
let userKeyShare, backupKeyShare, commonKeyChain;
|
|
324
|
+
const MPC = new sdk_core_1.Ecdsa();
|
|
325
|
+
if (!isUnsignedSweep) {
|
|
326
|
+
if (!params.userKey) {
|
|
327
|
+
throw new Error('missing userKey');
|
|
328
|
+
}
|
|
329
|
+
if (!params.backupKey) {
|
|
330
|
+
throw new Error('missing backupKey');
|
|
331
|
+
}
|
|
332
|
+
if (!params.walletPassphrase) {
|
|
333
|
+
throw new Error('missing wallet passphrase');
|
|
334
|
+
}
|
|
335
|
+
const userKey = params.userKey.replace(/\s/g, '');
|
|
336
|
+
const backupKey = params.backupKey.replace(/\s/g, '');
|
|
337
|
+
({ userKeyShare, backupKeyShare, commonKeyChain } = await sdk_core_1.ECDSAUtils.getMpcV2RecoveryKeyShares(userKey, backupKey, params.walletPassphrase));
|
|
338
|
+
publicKey = MPC.deriveUnhardened(commonKeyChain, iface_1.ROOT_PATH).slice(0, 66);
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
const bitgoKey = params.bitgoKey;
|
|
342
|
+
if (!bitgoKey) {
|
|
343
|
+
throw new Error('missing bitgoKey');
|
|
344
|
+
}
|
|
345
|
+
const hdTree = new mpc.Secp256k1Bip32HdTree();
|
|
346
|
+
const derivationPath = 'm/0';
|
|
347
|
+
const derivedPub = hdTree.publicDerive({
|
|
348
|
+
pk: mpc.bigIntFromBufferBE(Buffer.from(bitgoKey.slice(0, 66), 'hex')),
|
|
349
|
+
chaincode: mpc.bigIntFromBufferBE(Buffer.from(bitgoKey.slice(66), 'hex')),
|
|
350
|
+
}, derivationPath);
|
|
351
|
+
publicKey = mpc.bigIntToBufferBE(derivedPub.pk).toString('hex');
|
|
352
|
+
}
|
|
353
|
+
if (!publicKey) {
|
|
354
|
+
throw new Error('failed to derive public key');
|
|
355
|
+
}
|
|
356
|
+
const senderAddress = this.getAddressFromPublicKey(publicKey);
|
|
357
|
+
const balance = await this.getAccountBalance(publicKey);
|
|
358
|
+
const feeData = await this.getFeeData();
|
|
359
|
+
const actualBalance = balance.minus(feeData);
|
|
360
|
+
if (actualBalance.isLessThanOrEqualTo(0)) {
|
|
361
|
+
throw new Error('Did not have enough funds to recover');
|
|
362
|
+
}
|
|
363
|
+
const factory = this.getBuilderFactory();
|
|
364
|
+
const txBuilder = factory.getTransferBuilder();
|
|
365
|
+
txBuilder.sender(senderAddress, publicKey);
|
|
366
|
+
txBuilder.receiverId(params.recoveryDestination);
|
|
367
|
+
txBuilder.amount(actualBalance.toString());
|
|
368
|
+
if (params.memo !== undefined && utils_1.default.validateMemo(params.memo)) {
|
|
369
|
+
txBuilder.memo(Number(params.memo));
|
|
370
|
+
}
|
|
371
|
+
await txBuilder.build();
|
|
372
|
+
if (txBuilder.transaction.payloadsData.payloads.length === 0) {
|
|
373
|
+
throw new Error('Missing payloads to generate signatures');
|
|
374
|
+
}
|
|
375
|
+
if (isUnsignedSweep) {
|
|
376
|
+
return {
|
|
377
|
+
txHex: txBuilder.transaction.unsignedTransaction,
|
|
378
|
+
coin: this.getChain(),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
const signatures = await this.signatures(txBuilder.transaction.payloadsData, publicKey, userKeyShare, backupKeyShare, commonKeyChain);
|
|
382
|
+
if (!signatures || signatures.length === 0) {
|
|
383
|
+
throw new Error('Failed to generate signatures');
|
|
384
|
+
}
|
|
385
|
+
txBuilder.transaction.addSignature(signatures);
|
|
386
|
+
txBuilder.combine();
|
|
387
|
+
const broadcastableTxn = txBuilder.transaction.toBroadcastFormat();
|
|
388
|
+
await this.broadcastTransaction({ serializedSignedTransaction: broadcastableTxn });
|
|
389
|
+
const txId = txBuilder.transaction.id;
|
|
390
|
+
const recoveredTransaction = {
|
|
391
|
+
id: txId,
|
|
392
|
+
tx: broadcastableTxn,
|
|
393
|
+
};
|
|
394
|
+
return recoveredTransaction;
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
throw new Error(`Error during ICP recovery: ${error.message || error}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/** @inheritDoc */
|
|
401
|
+
auditDecryptedKey({ multiSigType, prv, publicKey }) {
|
|
402
|
+
if (multiSigType !== 'tss') {
|
|
403
|
+
throw new Error('Unsupported multisigtype ');
|
|
404
|
+
}
|
|
405
|
+
(0, sdk_lib_mpc_1.auditEcdsaPrivateKey)(prv, publicKey);
|
|
84
406
|
}
|
|
85
407
|
}
|
|
86
408
|
exports.Icp = Icp;
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ljcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFZOEI7QUFFOUIsd0RBQWdDO0FBRWhDOzs7Ozs7R0FNRztBQUNILE1BQWEsR0FBSSxTQUFRLG1CQUFRO0lBRS9CLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sbUJBQW1CLENBQUM7SUFDN0IsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFnQztRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBK0I7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBK0I7UUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7O09BR0c7SUFDSSxlQUFlLENBQUMsSUFBYTtRQUNsQyxPQUFPLGVBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsZUFBZSxDQUFDLENBQXlCO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsVUFBVSxDQUFDLEdBQVc7UUFDcEIsT0FBTyxlQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXO1FBQ3BCLE9BQU8sZUFBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixlQUFlO1FBQ2IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVPLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBMkI7UUFDL0QsT0FBTyxlQUFLLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsbUJBQW1CO0lBQ1QsZ0JBQWdCO1FBQ3hCLE9BQU8sdUJBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDO0lBQzFELENBQUM7Q0FDRjtBQTFGRCxrQkEwRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBNUENBbGdvcml0aG0sXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHNzVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgS2V5UGFpcixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIEVudmlyb25tZW50cyxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgU3RhdGljc0Jhc2VDb2luIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgSW50ZXJuZXQgQ29tcHV0ZXIgKElDUCkgY29pbi5cbiAqIEV4dGVuZHMgdGhlIEJhc2VDb2luIGNsYXNzIGFuZCBwcm92aWRlcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgZm9yIElDUC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2ludGVybmV0Y29tcHV0ZXIub3JnL31cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaW50ZXJuZXRjb21wdXRlci5vcmcvZG9jcy9jdXJyZW50L2RldmVsb3Blci1kb2NzL2RlZmkvcm9zZXR0YS9pY3Bfcm9zZXR0YS9kYXRhX2FwaS99XG4gKi9cbmV4cG9ydCBjbGFzcyBJY3AgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBJY3AoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdpY3AnO1xuICB9XG5cbiAgZ2V0QmFzZUNoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdpY3AnO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdpY3AnO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ0ludGVybmV0IENvbXB1dGVyJztcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcga2V5cGFpciBmb3IgdGhpcyBjb2luLlxuICAgKiBAcGFyYW0gc2VlZCBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIHJldHVybiB1dGlscy5nZW5lcmF0ZUtleVBhaXIoc2VlZCk7XG4gIH1cblxuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBzaWduVHJhbnNhY3Rpb24oXzogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBpc1ZhbGlkUHViKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoa2V5KTtcbiAgfVxuXG4gIGlzVmFsaWRQcnYoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFByaXZhdGVLZXkoa2V5KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBzdXBwb3J0c1RzcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHV0aWxzLmdldEFkZHJlc3NGcm9tUHVibGljS2V5KGhleEVuY29kZWRQdWJsaWNLZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICBwcm90ZWN0ZWQgZ2V0UHVibGljTm9kZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFbnZpcm9ubWVudHNbdGhpcy5iaXRnby5nZXRFbnYoKV0ucm9zZXR0YU5vZGVVUkw7XG4gIH1cbn1cbiJdfQ==
|
|
409
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ljcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbURBc0I4QjtBQUM5QixpREFBc0Y7QUFDdEYsa0RBQStDO0FBQy9DLGtEQUEwQjtBQUMxQixnRUFBcUM7QUFDckMsbUNBQTBDO0FBQzFDLDZEQUErQztBQUUvQyx1Q0FnQnFCO0FBQ3JCLCtFQUE0RTtBQUM1RSx3REFBZ0M7QUFDaEMseURBQStEO0FBQy9ELDZDQUEwQztBQUUxQzs7Ozs7O0dBTUc7QUFDSCxNQUFhLEdBQUksU0FBUSxtQkFBUTtJQUUvQixZQUFzQixLQUFnQixFQUFFLFdBQXVDO1FBQzdFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLG1CQUFtQixDQUFDO0lBQzdCLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFB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Q0FBQyxDQUFDO1FBQy9DLENBQUM7UUFDRCxJQUFBLGtDQUFvQixFQUFDLEdBQWEsRUFBRSxTQUFtQixDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBcmJELGtCQXFiQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25PcHRpb25zLFxuICBCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQsXG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEVjZHNhLFxuICBFQ0RTQVV0aWxzLFxuICBFbnZpcm9ubWVudHMsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEtleVBhaXIsXG4gIE1QQ0FsZ29yaXRobSxcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduaW5nRXJyb3IsXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgdmVyaWZ5TVBDV2FsbGV0QWRkcmVzcyxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIE5ldHdvcmtUeXBlLCBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gJ0BkZmluaXR5L3ByaW5jaXBhbCc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgSGFzaCB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgKiBhcyBtcGMgZnJvbSAnQGJpdGdvLWJldGEvc2RrLWxpYi1tcGMnO1xuXG5pbXBvcnQge1xuICBDdXJ2ZVR5cGUsXG4gIExFREdFUl9DQU5JU1RFUl9JRCxcbiAgVEVTVE5FVF9MRURHRVJfQ0FOSVNURVJfSUQsXG4gIFBheWxvYWRzRGF0YSxcbiAgUFVCTElDX05PREVfUkVRVUVTVF9FTkRQT0lOVCxcbiAgUHVibGljTm9kZVN1Ym1pdFJlc3BvbnNlLFxuICBSZWNvdmVyeU9wdGlvbnMsXG4gIFJlY292ZXJ5VHJhbnNhY3Rpb24sXG4gIFJPT1RfUEFUSCxcbiAgU2lnbmF0dXJlcyxcbiAgU2lnbmluZ1BheWxvYWQsXG4gIEljcFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFRyYW5zYWN0aW9uSGV4UGFyYW1zLFxuICBUc3NWZXJpZnlJY3BBZGRyZXNzT3B0aW9ucyxcbiAgVW5zaWduZWRTd2VlcFJlY292ZXJ5VHJhbnNhY3Rpb24sXG59IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5JztcbmltcG9ydCB1dGlscyBmcm9tICcuL2xpYi91dGlscyc7XG5pbXBvcnQgeyBhdWRpdEVjZHNhUHJpdmF0ZUtleSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1saWItbXBjJztcbmltcG9ydCB7IEljcEFnZW50IH0gZnJvbSAnLi9saWIvaWNwQWdlbnQnO1xuXG4vKipcbiAqIENsYXNzIHJlcHJlc2VudGluZyB0aGUgSW50ZXJuZXQgQ29tcHV0ZXIgKElDUCkgY29pbi5cbiAqIEV4dGVuZHMgdGhlIEJhc2VDb2luIGNsYXNzIGFuZCBwcm92aWRlcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgZm9yIElDUC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2ludGVybmV0Y29tcHV0ZXIub3JnL31cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vaW50ZXJuZXRjb21wdXRlci5vcmcvZG9jcy9jdXJyZW50L2RldmVsb3Blci1kb2NzL2RlZmkvcm9zZXR0YS9pY3Bfcm9zZXR0YS9kYXRhX2FwaS99XG4gKi9cbmV4cG9ydCBjbGFzcyBJY3AgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG5cbiAgICBpZiAoIXN0YXRpY3NDb2luKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBJY3AoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdpY3AnO1xuICB9XG5cbiAgZ2V0QmFzZUNoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdpY3AnO1xuICB9XG5cbiAgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdJbnRlcm5ldCBDb21wdXRlcic7XG4gIH1cblxuICBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IFRyYW5zYWN0aW9uSGV4UGFyYW1zKTogUHJvbWlzZTxJY3BUcmFuc2FjdGlvbkV4cGxhbmF0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocGFyYW1zLnRyYW5zYWN0aW9uSGV4KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGlmIChwYXJhbXMuc2lnbmFibGVIZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZ2VuZXJhdGVkU2lnbmFibGVIZXggPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb24ucGF5bG9hZHNEYXRhLnBheWxvYWRzWzBdLmhleF9ieXRlcztcbiAgICAgIGlmIChnZW5lcmF0ZWRTaWduYWJsZUhleCAhPT0gcGFyYW1zLnNpZ25hYmxlSGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2VuZXJhdGVkIHNpZ25hYmxlSGV4IGlzIG5vdCBlcXVhbCB0byBwYXJhbXMuc2lnbmFibGVIZXgnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLmV4cGxhaW5UcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgYXN5bmMgdmVyaWZ5VHJhbnNhY3Rpb24ocGFyYW1zOiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHhIZXggPSB0eFByZWJ1aWxkPy50eEhleDtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGNvbnN0IHR4SGV4UGFyYW1zOiBUcmFuc2FjdGlvbkhleFBhcmFtcyA9IHtcbiAgICAgIHRyYW5zYWN0aW9uSGV4OiB0eEhleCxcbiAgICB9O1xuXG4gICAgaWYgKHR4UHJlYnVpbGQudHhJbmZvICYmIHR4UHJlYnVpbGQudHhJbmZvICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHR4UHJlYnVpbGQudHhJbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgdHhIZXhQYXJhbXMuc2lnbmFibGVIZXggPSB0eFByZWJ1aWxkLnR4SW5mbztcbiAgICB9XG5cbiAgICBjb25zdCBleHBsYWluZWRUeCA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHR4SGV4UGFyYW1zKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHR4UGFyYW1zLnJlY2lwaWVudHMpICYmIHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYCR7dGhpcy5nZXRDaGFpbigpfSBkb2Vzbid0IHN1cHBvcnQgc2VuZGluZyB0byBtb3JlIHRoYW4gMSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVHJ5IGFnYWluLCB1c2luZyBvbmx5IGEgc2luZ2xlIHJlY2lwaWVudC5gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoZXhwbGFpbmVkVHgub3V0cHV0cy5sZW5ndGggPT09IDEsICdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSBleHBsYWluZWRUeC5vdXRwdXRzWzBdO1xuICAgICAgY29uc3QgcmVjaXBpZW50ID0gdHhQYXJhbXMucmVjaXBpZW50c1swXTtcbiAgICAgIGFzc2VydChcbiAgICAgICAgdHlwZW9mIHJlY2lwaWVudC5hZGRyZXNzID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIHR5cGVvZiBvdXRwdXQuYWRkcmVzcyA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICBvdXRwdXQuYWRkcmVzcyA9PT0gcmVjaXBpZW50LmFkZHJlc3MgJiZcbiAgICAgICAgICBCaWdOdW1iZXIob3V0cHV0LmFtb3VudCkuZXEoQmlnTnVtYmVyKHJlY2lwaWVudC5hbW91bnQpKSxcbiAgICAgICAgJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYW4gYWRkcmVzcyBiZWxvbmdzIHRvIHRoaXMgd2FsbGV0LlxuICAgKlxuICAgKiBAcGFyYW0ge1Rzc1ZlcmlmeUljcEFkZHJlc3NPcHRpb25zfSBwYXJhbXMgLSBWZXJpZmljYXRpb24gcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gVHJ1ZSBpZiBhZGRyZXNzIGJlbG9uZ3MgdG8gd2FsbGV0XG4gICAqIEB0aHJvd3Mge0ludmFsaWRBZGRyZXNzRXJyb3J9IElmIGFkZHJlc3MgZm9ybWF0IGlzIGludmFsaWQgb3IgZG9lc24ndCBtYXRjaCBkZXJpdmVkIGFkZHJlc3NcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGludmFsaWQgd2FsbGV0IHZlcnNpb24gb3IgbWlzc2luZyBwYXJhbWV0ZXJzXG4gICAqL1xuICBhc3luYyBpc1dhbGxldEFkZHJlc3MocGFyYW1zOiBUc3NWZXJpZnlJY3BBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHsgYWRkcmVzcywgcm9vdEFkZHJlc3MsIHdhbGxldFZlcnNpb24gfSA9IHBhcmFtcztcblxuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGludmFsaWQgYWRkcmVzczogJHthZGRyZXNzfWApO1xuICAgIH1cblxuICAgIGxldCBhZGRyZXNzVG9WZXJpZnkgPSBhZGRyZXNzO1xuICAgIGlmICh3YWxsZXRWZXJzaW9uID09PSAxKSB7XG4gICAgICBpZiAoIXJvb3RBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigncm9vdEFkZHJlc3MgaXMgcmVxdWlyZWQgZm9yIHdhbGxldCB2ZXJzaW9uIDEnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dHJhY3RlZFJvb3RBZGRyZXNzID0gdXRpbHMudmFsaWRhdGVNZW1vQW5kUmV0dXJuUm9vdEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICBpZiAoIWV4dHJhY3RlZFJvb3RBZGRyZXNzIHx8IGV4dHJhY3RlZFJvb3RBZGRyZXNzID09PSBhZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWVtb0lkIGlzIHJlcXVpcmVkIGZvciB3YWxsZXQgdmVyc2lvbiAxIGFkZHJlc3NlcycpO1xuICAgICAgfVxuICAgICAgaWYgKGV4dHJhY3RlZFJvb3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkgIT09IHJvb3RBZGRyZXNzLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBleHBlY3RlZCAke3Jvb3RBZGRyZXNzfSBidXQgZ290ICR7ZXh0cmFjdGVkUm9vdEFkZHJlc3N9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYWRkcmVzc1RvVmVyaWZ5ID0gcm9vdEFkZHJlc3M7XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXhUb1ZlcmlmeSA9IHdhbGxldFZlcnNpb24gPT09IDEgPyAwIDogcGFyYW1zLmluZGV4O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZlcmlmeU1QQ1dhbGxldEFkZHJlc3MoXG4gICAgICB7IC4uLnBhcmFtcywgYWRkcmVzczogYWRkcmVzc1RvVmVyaWZ5LCBpbmRleDogaW5kZXhUb1ZlcmlmeSwga2V5Q3VydmU6ICdzZWNwMjU2azEnIH0sXG4gICAgICB0aGlzLmlzVmFsaWRBZGRyZXNzLmJpbmQodGhpcyksXG4gICAgICAocHViS2V5KSA9PiB1dGlscy5nZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJLZXkpXG4gICAgKTtcblxuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEFkZHJlc3NFcnJvcihcbiAgICAgICAgYGFkZHJlc3MgdmFsaWRhdGlvbiBmYWlsdXJlOiBhZGRyZXNzICR7YWRkcmVzc1RvVmVyaWZ5fSBpcyBub3QgYSB3YWxsZXQgYWRkcmVzc2BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IGtleXBhaXIgZm9yIHRoaXMgY29pbi5cbiAgICogQHBhcmFtIHNlZWQgU2VlZCBmcm9tIHdoaWNoIHRoZSBuZXcga2V5cGFpciBzaG91bGQgYmUgZ2VuZXJhdGVkLCBvdGhlcndpc2UgYSByYW5kb20gc2VlZCBpcyB1c2VkXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICByZXR1cm4gdXRpbHMuZ2VuZXJhdGVLZXlQYWlyKHNlZWQpO1xuICB9XG5cbiAgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKFxuICAgIHBhcmFtczogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyAmIHsgdHhQcmVidWlsZDogeyB0eEhleDogc3RyaW5nIH07IHBydjogc3RyaW5nIH1cbiAgKTogUHJvbWlzZTxTaWduZWRUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zPy50eFByZWJ1aWxkPy50eEhleDtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gcGFyYW1zPy5wcnY7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHBhcmFtZXRlcjogcGFyYW1zLnR4UHJlYnVpbGQudHhIZXgnKTtcbiAgICB9XG4gICAgaWYgKCFwcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdtaXNzaW5nIHJlcXVpcmVkIHBydiBwYXJhbWV0ZXI6IHBhcmFtcy5wcnYnKTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBhd2FpdCBmYWN0b3J5LmZyb20ocGFyYW1zLnR4UHJlYnVpbGQudHhIZXgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBwYXJhbXMucHJ2IH0pO1xuICAgIHR4QnVpbGRlci5jb21iaW5lKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHgsXG4gICAgfTtcbiAgfVxuXG4gIGlzVmFsaWRQdWIoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgaXNWYWxpZFBydihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHJpdmF0ZUtleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHN1cHBvcnRzVHNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLnRzcztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBnZXRNUENBbGdvcml0aG0oKTogTVBDQWxnb3JpdGhtIHtcbiAgICByZXR1cm4gJ2VjZHNhJztcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqKi9cbiAgZ2V0SGFzaEZ1bmN0aW9uKCk6IEhhc2gge1xuICAgIHJldHVybiBjcmVhdGVIYXNoKCdzaGEyNTYnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXRpbHMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkoaGV4RW5jb2RlZFB1YmxpY0tleSk7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKiovXG4gIHByb3RlY3RlZCBnZXRQdWJsaWNOb2RlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEVudmlyb25tZW50c1t0aGlzLmJpdGdvLmdldEVudigpXS5pY3BOb2RlVXJsO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICoqL1xuICAvLyB0aGlzIG1ldGhvZCBjYWxscyB0aGUgcHVibGljIG5vZGUgdG8gYnJvYWRjYXN0IHRoZSB0cmFuc2FjdGlvbiBhbmQgbm90IHRoZSByb3NldHRhIG5vZGVcbiAgcHVibGljIGFzeW5jIGJyb2FkY2FzdFRyYW5zYWN0aW9uKHBheWxvYWQ6IEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3VsdD4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdGhpcy5nZXRQdWJsaWNOb2RlQnJvYWRjYXN0RW5kcG9pbnQoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBib2R5Qnl0ZXMgPSB1dGlscy5ibG9iRnJvbUhleChwYXlsb2FkLnNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zLnBvc3QoZW5kcG9pbnQsIGJvZHlCeXRlcywge1xuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vY2JvcicgfSxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLCAvLyBUaGlzIGVuc3VyZXMgeW91IGdldCBhIEJ1ZmZlciwgbm90IGEgc3RyaW5nXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gYnJvYWRjYXN0IGZhaWxlZCB3aXRoIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9IC0gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvZGVkUmVzcG9uc2UgPSB1dGlscy5jYm9yRGVjb2RlKHJlc3BvbnNlLmRhdGEpIGFzIFB1YmxpY05vZGVTdWJtaXRSZXNwb25zZTtcblxuICAgICAgaWYgKGRlY29kZWRSZXNwb25zZS5zdGF0dXMgPT09ICdyZXBsaWVkJykge1xuICAgICAgICAvLyBpdCBpcyBjb25zaWRlcmVkIGEgc3VjY2VzcyBiZWNhdXNlIElDUCByZXR1cm5zIHJlc3BvbnNlIGluIGEgQ0JPUiBtYXAgd2l0aCBhIHN0YXR1cyBvZiAncmVwbGllZCdcbiAgICAgICAgcmV0dXJuIHt9OyAvLyByZXR1cm5lZCBlbXB0eSBvYmplY3QgYXMgSUNQIGRvZXMgbm90IHJldHVybiBhIHR4aWRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMgZnJvbSBub2RlOiAke2RlY29kZWRSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gYnJvYWRjYXN0IGVycm9yOiAke2Vycm9yPy5tZXNzYWdlIHx8IEpTT04uc3RyaW5naWZ5KGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFB1YmxpY05vZGVCcm9hZGNhc3RFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5vZGVVcmwgPSB0aGlzLmdldFB1YmxpY05vZGVVcmwoKTtcbiAgICBjb25zdCBsZWRnZXJDYW5pc3RlcklkID1cbiAgICAgIHRoaXMuX3N0YXRpY3NDb2luLm5ldHdvcmsudHlwZSA9PT0gTmV0d29ya1R5cGUuVEVTVE5FVCA/IFRFU1RORVRfTEVER0VSX0NBTklTVEVSX0lEIDogTEVER0VSX0NBTklTVEVSX0lEO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IFByaW5jaXBhbC5mcm9tVWludDhBcnJheShsZWRnZXJDYW5pc3RlcklkKTtcbiAgICBjb25zdCBjYW5pc3RlcklkSGV4ID0gcHJpbmNpcGFsLnRvVGV4dCgpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYCR7bm9kZVVybH0ke1BVQkxJQ19OT0RFX1JFUVVFU1RfRU5EUE9JTlR9JHtjYW5pc3RlcklkSGV4fS9jYWxsYDtcbiAgICByZXR1cm4gZW5kcG9pbnQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgYWNjb3VudCBiYWxhbmNlIGZvciBhIGdpdmVuIHB1YmxpYyBrZXkuXG4gICAqIEBwYXJhbSBwdWJsaWNLZXlIZXggLSBIZXgtZW5jb2RlZCBwdWJsaWMga2V5IG9mIHRoZSBhY2NvdW50LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgYWNjb3VudCBiYWxhbmNlIGFzIGEgc3RyaW5nLlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBiYWxhbmNlIGNvdWxkIG5vdCBiZSBmZXRjaGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGdldEFjY291bnRCYWxhbmNlKHB1YmxpY0tleUhleDogc3RyaW5nKTogUHJvbWlzZTxCaWdOdW1iZXI+IHtcbiAgICBjb25zdCBwcmluY2lwYWxJZCA9IHV0aWxzLmdldFByaW5jaXBhbElkRnJvbVB1YmxpY0tleShwdWJsaWNLZXlIZXgpLnRvVGV4dCgpO1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEljcEFnZW50KHRoaXMuZ2V0UHVibGljTm9kZVVybCgpLCB0aGlzLl9zdGF0aWNzQ29pbik7XG4gICAgcmV0dXJuIGFnZW50LmdldEJhbGFuY2UocHJpbmNpcGFsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBmZWUgZGF0YSBmcm9tIHRoZSBJQ1AgcHVibGljIG5vZGUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEljcEFnZW50YCB1c2luZyB0aGUgcHVibGljIG5vZGUgVVJMLFxuICAgKiB0aGVuIHF1ZXJpZXMgdGhlIG5vZGUgZm9yIHRoZSBjdXJyZW50IGZlZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBgQmlnTnVtYmVyYCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gZmVlLlxuICAgKiBAdGhyb3dzIFdpbGwgcHJvcGFnYXRlIGFueSBlcnJvcnMgZW5jb3VudGVyZWQgd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBJQ1Agbm9kZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRGZWVEYXRhKCk6IFByb21pc2U8QmlnTnVtYmVyPiB7XG4gICAgY29uc3QgYWdlbnQgPSBuZXcgSWNwQWdlbnQodGhpcy5nZXRQdWJsaWNOb2RlVXJsKCksIHRoaXMuX3N0YXRpY3NDb2luKTtcbiAgICByZXR1cm4gYXdhaXQgYWdlbnQuZ2V0RmVlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRCYXNlQ2hhaW4oKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiBhcnJheSBvZiBzaWduYXR1cmVzIGZvciB0aGUgcHJvdmlkZWQgcGF5bG9hZHMgdXNpbmcgTVBDXG4gICAqXG4gICAqIEBwYXJhbSBwYXlsb2Fkc0RhdGEgLSBUaGUgZGF0YSBjb250YWluaW5nIHRoZSBwYXlsb2FkcyB0byBiZSBzaWduZWQuXG4gICAqIEBwYXJhbSBzZW5kZXJQdWJsaWNLZXkgLSBUaGUgcHVibGljIGtleSBvZiB0aGUgc2VuZGVyIGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICogQHBhcmFtIHVzZXJLZXlTaGFyZSAtIFRoZSB1c2VyJ3Mga2V5IHNoYXJlIGFzIGEgQnVmZmVyLlxuICAgKiBAcGFyYW0gYmFja3VwS2V5U2hhcmUgLSBUaGUgYmFja3VwIGtleSBzaGFyZSBhcyBhIEJ1ZmZlci5cbiAgICogQHBhcmFtIGNvbW1vbktleUNoYWluIC0gVGhlIGNvbW1vbiBrZXkgY2hhaW4gaWRlbnRpZmllciB1c2VkIGZvciBNUEMgc2lnbmluZy5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgYFNpZ25hdHVyZXNgIG9iamVjdHMsIGVhY2ggY29udGFpbmluZyB0aGUgc2lnbmluZyBwYXlsb2FkLFxuICAgKiAgICAgICAgICBzaWduYXR1cmUgdHlwZSwgcHVibGljIGtleSwgYW5kIHRoZSBnZW5lcmF0ZWQgc2lnbmF0dXJlIGluIGhleGFkZWNpbWFsIGZvcm1hdC5cbiAgICovXG4gIGFzeW5jIHNpZ25hdHVyZXMoXG4gICAgcGF5bG9hZHNEYXRhOiBQYXlsb2Fkc0RhdGEsXG4gICAgc2VuZGVyUHVibGljS2V5OiBzdHJpbmcsXG4gICAgdXNlcktleVNoYXJlOiBCdWZmZXI8QXJyYXlCdWZmZXJMaWtlPixcbiAgICBiYWNrdXBLZXlTaGFyZTogQnVmZmVyPEFycmF5QnVmZmVyTGlrZT4sXG4gICAgY29tbW9uS2V5Q2hhaW46IHN0cmluZ1xuICApOiBQcm9taXNlPFNpZ25hdHVyZXNbXT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gcGF5bG9hZHNEYXRhLnBheWxvYWRzWzBdIGFzIFNpZ25pbmdQYXlsb2FkO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IEJ1ZmZlci5mcm9tKHBheWxvYWQuaGV4X2J5dGVzLCAnaGV4Jyk7XG4gICAgICBjb25zdCBtZXNzYWdlSGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShtZXNzYWdlKS5kaWdlc3QoKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IEVDRFNBVXRpbHMuc2lnblJlY292ZXJ5TXBjVjIobWVzc2FnZUhhc2gsIHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluKTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZVBheWxvYWQ6IFNpZ25hdHVyZXMgPSB7XG4gICAgICAgIHNpZ25pbmdfcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgc2lnbmF0dXJlX3R5cGU6IHBheWxvYWQuc2lnbmF0dXJlX3R5cGUsXG4gICAgICAgIHB1YmxpY19rZXk6IHtcbiAgICAgICAgICBoZXhfYnl0ZXM6IHNlbmRlclB1YmxpY0tleSxcbiAgICAgICAgICBjdXJ2ZV90eXBlOiBDdXJ2ZVR5cGUuU0VDUDI1NksxLFxuICAgICAgICB9LFxuICAgICAgICBoZXhfYnl0ZXM6IHNpZ25hdHVyZS5yICsgc2lnbmF0dXJlLnMsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gW3NpZ25hdHVyZVBheWxvYWRdO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdlbmVyYXRpbmcgc2lnbmF0dXJlczogJHtlcnJvci5tZXNzYWdlIHx8IGVycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5VHJhbnNhY3Rpb24gfCBVbnNpZ25lZFN3ZWVwUmVjb3ZlcnlUcmFuc2FjdGlvbj4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIHx8ICF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSAhcGFyYW1zLnVzZXJLZXkgJiYgIXBhcmFtcy5iYWNrdXBLZXkgJiYgIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlO1xuXG4gICAgICBsZXQgcHVibGljS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgdXNlcktleVNoYXJlLCBiYWNrdXBLZXlTaGFyZSwgY29tbW9uS2V5Q2hhaW47XG4gICAgICBjb25zdCBNUEMgPSBuZXcgRWNkc2EoKTtcblxuICAgICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgaWYgKCFwYXJhbXMudXNlcktleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB1c2VyS2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmFtcy5iYWNrdXBLZXkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHdhbGxldCBwYXNzcGhyYXNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1c2VyS2V5ID0gcGFyYW1zLnVzZXJLZXkucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICAgICAgY29uc3QgYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleS5yZXBsYWNlKC9cXHMvZywgJycpO1xuXG4gICAgICAgICh7IHVzZXJLZXlTaGFyZSwgYmFja3VwS2V5U2hhcmUsIGNvbW1vbktleUNoYWluIH0gPSBhd2FpdCBFQ0RTQVV0aWxzLmdldE1wY1YyUmVjb3ZlcnlLZXlTaGFyZXMoXG4gICAgICAgICAgdXNlcktleSxcbiAgICAgICAgICBiYWNrdXBLZXksXG4gICAgICAgICAgcGFyYW1zLndhbGxldFBhc3NwaHJhc2VcbiAgICAgICAgKSk7XG4gICAgICAgIHB1YmxpY0tleSA9IE1QQy5kZXJpdmVVbmhhcmRlbmVkKGNvbW1vbktleUNoYWluLCBST09UX1BBVEgpLnNsaWNlKDAsIDY2KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGJpdGdvS2V5ID0gcGFyYW1zLmJpdGdvS2V5O1xuICAgICAgICBpZiAoIWJpdGdvS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGJpdGdvS2V5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoZFRyZWUgPSBuZXcgbXBjLlNlY3AyNTZrMUJpcDMySGRUcmVlKCk7XG4gICAgICAgIGNvbnN0IGRlcml2YXRpb25QYXRoID0gJ20vMCc7XG4gICAgICAgIGNvbnN0IGRlcml2ZWRQdWIgPSBoZFRyZWUucHVibGljRGVyaXZlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBrOiBtcGMuYmlnSW50RnJvbUJ1ZmZlckJFKEJ1ZmZlci5mcm9tKGJpdGdvS2V5LnNsaWNlKDAsIDY2KSwgJ2hleCcpKSxcbiAgICAgICAgICAgIGNoYWluY29kZTogbXBjLmJpZ0ludEZyb21CdWZmZXJCRShCdWZmZXIuZnJvbShiaXRnb0tleS5zbGljZSg2NiksICdoZXgnKSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZXJpdmF0aW9uUGF0aFxuICAgICAgICApO1xuXG4gICAgICAgIHB1YmxpY0tleSA9IG1wYy5iaWdJbnRUb0J1ZmZlckJFKGRlcml2ZWRQdWIucGspLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFwdWJsaWNLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZGVyaXZlIHB1YmxpYyBrZXknKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IHRoaXMuZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkocHVibGljS2V5KTtcbiAgICAgIGNvbnN0IGJhbGFuY2UgPSBhd2FpdCB0aGlzLmdldEFjY291bnRCYWxhbmNlKHB1YmxpY0tleSk7XG4gICAgICBjb25zdCBmZWVEYXRhID0gYXdhaXQgdGhpcy5nZXRGZWVEYXRhKCk7XG4gICAgICBjb25zdCBhY3R1YWxCYWxhbmNlID0gYmFsYW5jZS5taW51cyhmZWVEYXRhKTtcbiAgICAgIGlmIChhY3R1YWxCYWxhbmNlLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaWQgbm90IGhhdmUgZW5vdWdoIGZ1bmRzIHRvIHJlY292ZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKTtcbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZGVyKHNlbmRlckFkZHJlc3MsIHB1YmxpY0tleSBhcyBzdHJpbmcpO1xuICAgICAgdHhCdWlsZGVyLnJlY2VpdmVySWQocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgICAgdHhCdWlsZGVyLmFtb3VudChhY3R1YWxCYWxhbmNlLnRvU3RyaW5nKCkpO1xuICAgICAgaWYgKHBhcmFtcy5tZW1vICE9PSB1bmRlZmluZWQgJiYgdXRpbHMudmFsaWRhdGVNZW1vKHBhcmFtcy5tZW1vKSkge1xuICAgICAgICB0eEJ1aWxkZXIubWVtbyhOdW1iZXIocGFyYW1zLm1lbW8pKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgaWYgKHR4QnVpbGRlci50cmFuc2FjdGlvbi5wYXlsb2Fkc0RhdGEucGF5bG9hZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBwYXlsb2FkcyB0byBnZW5lcmF0ZSBzaWduYXR1cmVzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eEhleDogdHhCdWlsZGVyLnRyYW5zYWN0aW9uLnVuc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaWduYXR1cmVzID0gYXdhaXQgdGhpcy5zaWduYXR1cmVzKFxuICAgICAgICB0eEJ1aWxkZXIudHJhbnNhY3Rpb24ucGF5bG9hZHNEYXRhLFxuICAgICAgICBwdWJsaWNLZXksXG4gICAgICAgIHVzZXJLZXlTaGFyZSxcbiAgICAgICAgYmFja3VwS2V5U2hhcmUsXG4gICAgICAgIGNvbW1vbktleUNoYWluXG4gICAgICApO1xuICAgICAgaWYgKCFzaWduYXR1cmVzIHx8IHNpZ25hdHVyZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdlbmVyYXRlIHNpZ25hdHVyZXMnKTtcbiAgICAgIH1cbiAgICAgIHR4QnVpbGRlci50cmFuc2FjdGlvbi5hZGRTaWduYXR1cmUoc2lnbmF0dXJlcyk7XG4gICAgICB0eEJ1aWxkZXIuY29tYmluZSgpO1xuICAgICAgY29uc3QgYnJvYWRjYXN0YWJsZVR4biA9IHR4QnVpbGRlci50cmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgYXdhaXQgdGhpcy5icm9hZGNhc3RUcmFuc2FjdGlvbih7IHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbjogYnJvYWRjYXN0YWJsZVR4biB9KTtcbiAgICAgIGNvbnN0IHR4SWQgPSB0eEJ1aWxkZXIudHJhbnNhY3Rpb24uaWQ7XG4gICAgICBjb25zdCByZWNvdmVyZWRUcmFuc2FjdGlvbjogUmVjb3ZlcnlUcmFuc2FjdGlvbiA9IHtcbiAgICAgICAgaWQ6IHR4SWQsXG4gICAgICAgIHR4OiBicm9hZGNhc3RhYmxlVHhuLFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvdmVyZWRUcmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkdXJpbmcgSUNQIHJlY292ZXJ5OiAke2Vycm9yLm1lc3NhZ2UgfHwgZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgbXVsdGlTaWdUeXBlLCBwcnYsIHB1YmxpY0tleSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgIT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpc2lndHlwZSAnKTtcbiAgICB9XG4gICAgYXVkaXRFY2RzYVByaXZhdGVLZXkocHJ2IGFzIHN0cmluZywgcHVibGljS2V5IGFzIHN0cmluZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import BigNumber from 'bignumber.js';
|
|
2
|
+
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
3
|
+
export declare class IcpAgent {
|
|
4
|
+
private readonly host;
|
|
5
|
+
private readonly staticsCoin;
|
|
6
|
+
constructor(host: string, staticsCoin: Readonly<StaticsBaseCoin>);
|
|
7
|
+
/**
|
|
8
|
+
* Creates a new HTTP agent for communicating with the Internet Computer.
|
|
9
|
+
* @returns An instance of HttpAgent.
|
|
10
|
+
*/
|
|
11
|
+
private createAgent;
|
|
12
|
+
/**
|
|
13
|
+
* Retrieves an instance of the ledger canister agent.
|
|
14
|
+
*
|
|
15
|
+
* This method creates a new agent using `createAgent()`, initializes a replica interface
|
|
16
|
+
* with the agent (configured for local use), and returns an `AgentCanister` instance
|
|
17
|
+
* for the ledger canister identified by `LEDGER_CANISTER_ID`.
|
|
18
|
+
*
|
|
19
|
+
* @returns {AgentCanister} An agent interface for interacting with the ledger canister.
|
|
20
|
+
*/
|
|
21
|
+
private getLedger;
|
|
22
|
+
/**
|
|
23
|
+
* Fetches the account balance for a given principal ID.
|
|
24
|
+
* @param principalId - The principal ID of the account.
|
|
25
|
+
* @returns Promise resolving to the account balance as a string.
|
|
26
|
+
* @throws Error if the balance could not be fetched.
|
|
27
|
+
*/
|
|
28
|
+
getBalance(principalId: string): Promise<BigNumber>;
|
|
29
|
+
/**
|
|
30
|
+
* Fetches the transaction fee from the ledger.
|
|
31
|
+
* @returns Promise resolving to the transaction fee as a string.
|
|
32
|
+
* @throws Error if the fee could not be fetched.
|
|
33
|
+
*/
|
|
34
|
+
getFee(): Promise<BigNumber>;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=icpAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icpAgent.d.ts","sourceRoot":"","sources":["../../../src/lib/icpAgent.ts"],"names":[],"mappings":"AAWA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAe,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE/E,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;gBAE5C,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC;IAKhE;;;OAGG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAQjB;;;;;OAKG;IACU,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAmBhE;;;;OAIG;IACU,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;CAmB1C"}
|