@bitgo-beta/sdk-coin-icp 1.0.1-beta.84 → 1.0.1-beta.841

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 (67) hide show
  1. package/dist/resources/messageCompiled.d.ts +797 -0
  2. package/dist/resources/messageCompiled.js +1859 -0
  3. package/dist/src/icp.d.ts +64 -3
  4. package/dist/src/icp.d.ts.map +1 -1
  5. package/dist/src/icp.js +332 -10
  6. package/dist/src/lib/icpAgent.d.ts +36 -0
  7. package/dist/src/lib/icpAgent.d.ts.map +1 -0
  8. package/dist/src/lib/icpAgent.js +90 -0
  9. package/dist/src/lib/iface.d.ts +195 -0
  10. package/dist/src/lib/iface.d.ts.map +1 -0
  11. package/dist/src/lib/iface.js +44 -0
  12. package/dist/src/lib/index.d.ts +4 -0
  13. package/dist/src/lib/index.d.ts.map +1 -1
  14. package/dist/src/lib/index.js +12 -2
  15. package/dist/src/lib/signedTransactionBuilder.d.ts +9 -0
  16. package/dist/src/lib/signedTransactionBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/signedTransactionBuilder.js +64 -0
  18. package/dist/src/lib/transaction.d.ts +54 -0
  19. package/dist/src/lib/transaction.d.ts.map +1 -0
  20. package/dist/src/lib/transaction.js +255 -0
  21. package/dist/src/lib/transactionBuilder.d.ts +58 -28
  22. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  23. package/dist/src/lib/transactionBuilder.js +127 -40
  24. package/dist/src/lib/transactionBuilderFactory.d.ts +15 -14
  25. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  26. package/dist/src/lib/transactionBuilderFactory.js +43 -27
  27. package/dist/src/lib/transferBuilder.d.ts +7 -24
  28. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  29. package/dist/src/lib/transferBuilder.js +88 -43
  30. package/dist/src/lib/unsignedTransactionBuilder.d.ts +13 -0
  31. package/dist/src/lib/unsignedTransactionBuilder.d.ts.map +1 -0
  32. package/dist/src/lib/unsignedTransactionBuilder.js +90 -0
  33. package/dist/src/lib/utils.d.ts +286 -8
  34. package/dist/src/lib/utils.d.ts.map +1 -1
  35. package/dist/src/lib/utils.js +615 -53
  36. package/dist/src/ticp.d.ts +0 -4
  37. package/dist/src/ticp.d.ts.map +1 -1
  38. package/dist/src/ticp.js +1 -7
  39. package/dist/test/resources/icp.d.ts +268 -0
  40. package/dist/test/resources/icp.d.ts.map +1 -0
  41. package/dist/test/resources/icp.js +377 -0
  42. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  43. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  44. package/dist/test/unit/getBuilderFactory.js +10 -0
  45. package/dist/test/unit/icp.d.ts +2 -0
  46. package/dist/test/unit/icp.d.ts.map +1 -0
  47. package/dist/test/unit/icp.js +418 -0
  48. package/dist/test/unit/keyPair.d.ts +2 -0
  49. package/dist/test/unit/keyPair.d.ts.map +1 -0
  50. package/dist/test/unit/keyPair.js +107 -0
  51. package/dist/test/unit/transaction.d.ts +2 -0
  52. package/dist/test/unit/transaction.d.ts.map +1 -0
  53. package/dist/test/unit/transaction.js +109 -0
  54. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  55. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  56. package/dist/test/unit/transactionBuilder/transactionBuilder.js +274 -0
  57. package/dist/test/unit/transactionBuilder/transactionRecover.d.ts +2 -0
  58. package/dist/test/unit/transactionBuilder/transactionRecover.d.ts.map +1 -0
  59. package/dist/test/unit/transactionBuilder/transactionRecover.js +188 -0
  60. package/dist/test/unit/utils.d.ts +2 -0
  61. package/dist/test/unit/utils.d.ts.map +1 -0
  62. package/dist/test/unit/utils.js +206 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/package.json +23 -12
  65. package/.eslintignore +0 -4
  66. package/.mocharc.yml +0 -8
  67. package/CHANGELOG.md +0 -54
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transaction = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const iface_1 = require("./iface");
9
+ const utils_1 = __importDefault(require("./utils"));
10
+ class Transaction extends sdk_core_1.BaseTransaction {
11
+ constructor(_coinConfig) {
12
+ super(_coinConfig);
13
+ }
14
+ get icpTransactionData() {
15
+ return this._icpTransactionData;
16
+ }
17
+ set icpTransactionData(icpTransactionData) {
18
+ this._icpTransactionData = icpTransactionData;
19
+ }
20
+ get icpTransaction() {
21
+ return this._icpTransaction;
22
+ }
23
+ set icpTransaction(icpTransaction) {
24
+ this._icpTransaction = icpTransaction;
25
+ }
26
+ get unsignedTransaction() {
27
+ return this._payloadsData.unsigned_transaction;
28
+ }
29
+ get signaturePayload() {
30
+ return this._signaturePayload;
31
+ }
32
+ set signedTransaction(signature) {
33
+ this._signedTransaction = signature;
34
+ }
35
+ get signedTransaction() {
36
+ return this._signedTransaction;
37
+ }
38
+ set payloadsData(payloadsData) {
39
+ this._payloadsData = payloadsData;
40
+ }
41
+ get payloadsData() {
42
+ return this._payloadsData;
43
+ }
44
+ set createdTimestamp(createdTimestamp) {
45
+ this._createdTimestamp = createdTimestamp;
46
+ }
47
+ get createdTimestamp() {
48
+ return this._createdTimestamp;
49
+ }
50
+ async fromRawTransaction(rawTransaction) {
51
+ try {
52
+ const serializedTxFormatBuffer = Buffer.from(rawTransaction, 'hex');
53
+ const serializedTxFormatJsonString = serializedTxFormatBuffer.toString('utf-8');
54
+ const jsonRawTransaction = JSON.parse(serializedTxFormatJsonString);
55
+ const payloadsData = jsonRawTransaction.serializedTxHex;
56
+ this._payloadsData = payloadsData;
57
+ const parsedTx = await this.parseUnsignedTransaction(payloadsData.unsigned_transaction);
58
+ const senderPublicKeyHex = jsonRawTransaction.publicKey;
59
+ const transactionType = parsedTx.operations[0].type;
60
+ switch (transactionType) {
61
+ case iface_1.OperationType.TRANSACTION:
62
+ this._icpTransactionData = {
63
+ senderAddress: parsedTx.operations[0].account.address,
64
+ receiverAddress: parsedTx.operations[1].account.address,
65
+ amount: parsedTx.operations[1].amount.value,
66
+ fee: parsedTx.operations[2].amount.value,
67
+ senderPublicKeyHex: senderPublicKeyHex,
68
+ transactionType: transactionType,
69
+ expiryTime: Number(parsedTx.metadata.ingress_end ?? parsedTx.metadata.created_at_time + iface_1.MAX_INGRESS_TTL),
70
+ memo: parsedTx.metadata.memo,
71
+ };
72
+ utils_1.default.validateRawTransaction(this._icpTransactionData);
73
+ this._id = this.generateTransactionId();
74
+ break;
75
+ default:
76
+ throw new Error('Invalid transaction type');
77
+ }
78
+ }
79
+ catch (error) {
80
+ throw new sdk_core_1.InvalidTransactionError(`Invalid transaction: ${error.message}`);
81
+ }
82
+ }
83
+ addSignature(signaturePayloads) {
84
+ if (!signaturePayloads) {
85
+ throw new Error('signatures not provided');
86
+ }
87
+ if (signaturePayloads.length !== this._payloadsData.payloads.length) {
88
+ throw new Error('signatures length is not matching');
89
+ }
90
+ this._signaturePayload = signaturePayloads;
91
+ if (this._id === undefined || this._id === null) {
92
+ this._id = this.generateTransactionId();
93
+ }
94
+ }
95
+ /** @inheritdoc */
96
+ toJson() {
97
+ if (!this._icpTransactionData) {
98
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
99
+ }
100
+ switch (this._icpTransactionData.transactionType) {
101
+ case iface_1.OperationType.TRANSACTION:
102
+ const txData = {
103
+ id: this._id,
104
+ sender: this._icpTransactionData.senderAddress,
105
+ senderPublicKey: this._icpTransactionData.senderPublicKeyHex,
106
+ recipient: this._icpTransactionData.receiverAddress,
107
+ memo: this._icpTransactionData.memo,
108
+ feeAmount: this._icpTransactionData.fee,
109
+ expirationTime: this._icpTransactionData.expiryTime,
110
+ type: sdk_core_1.TransactionType.Send,
111
+ };
112
+ if (this._icpTransactionData.memo !== undefined) {
113
+ txData.memo = this._icpTransactionData.memo;
114
+ }
115
+ return txData;
116
+ default:
117
+ throw new Error(`Unsupported transaction type: ${this._icpTransactionData.transactionType}`);
118
+ }
119
+ }
120
+ /** @inheritDoc */
121
+ explainTransaction() {
122
+ const result = this.toJson();
123
+ const displayOrder = ['id', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee'];
124
+ const outputs = [];
125
+ const explanationResult = {
126
+ displayOrder,
127
+ id: this.id,
128
+ outputs,
129
+ outputAmount: '0',
130
+ fee: { fee: '0' },
131
+ type: result.type,
132
+ changeOutputs: [], // account based does not use change outputs
133
+ changeAmount: '0', // account based does not make change
134
+ };
135
+ switch (explanationResult.type) {
136
+ case sdk_core_1.TransactionType.Send:
137
+ return this.explainTransferTransaction(explanationResult);
138
+ default:
139
+ throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
140
+ }
141
+ }
142
+ /**
143
+ * Explains a transfer transaction by providing details about the recipients and the total output amount.
144
+ *
145
+ * @param {IcpTransactionExplanation} explanationResult - The initial explanation result to be extended.
146
+ * @returns {IcpTransactionExplanation} The extended explanation result including the output amount and recipients.
147
+ */
148
+ explainTransferTransaction(explanationResult) {
149
+ explanationResult.fee = { fee: this.icpTransactionData.fee };
150
+ const recipients = utils_1.default.getRecipients(this.icpTransactionData);
151
+ const outputs = [recipients];
152
+ const outputAmountBN = recipients.amount;
153
+ const outputAmount = outputAmountBN.toString();
154
+ return {
155
+ ...explanationResult,
156
+ outputAmount,
157
+ outputs,
158
+ };
159
+ }
160
+ /** @inheritdoc */
161
+ toBroadcastFormat() {
162
+ if (!this._signedTransaction) {
163
+ throw new sdk_core_1.InvalidTransactionError('Empty transaction');
164
+ }
165
+ return this.serialize();
166
+ }
167
+ serialize() {
168
+ return this._signedTransaction;
169
+ }
170
+ async parseUnsignedTransaction(rawTransaction) {
171
+ const unsignedTransaction = utils_1.default.cborDecode(utils_1.default.blobFromHex(rawTransaction));
172
+ const update = unsignedTransaction.updates[0];
173
+ const httpCanisterUpdate = update[1];
174
+ httpCanisterUpdate.ingress_expiry = BigInt(unsignedTransaction.ingress_expiries[0]);
175
+ return await this.getParsedTransactionFromUpdate(httpCanisterUpdate, false);
176
+ }
177
+ async getParsedTransactionFromUpdate(httpCanisterUpdate, isSigned) {
178
+ const senderPrincipal = utils_1.default.convertSenderBlobToPrincipal(httpCanisterUpdate.sender);
179
+ const ACCOUNT_ID_PREFIX = utils_1.default.getAccountIdPrefix();
180
+ const subAccount = new Uint8Array(32);
181
+ const senderAccount = utils_1.default.getAccountIdFromPrincipalBytes(ACCOUNT_ID_PREFIX, Buffer.from(senderPrincipal.buffer), subAccount);
182
+ const args = await utils_1.default.fromArgs(httpCanisterUpdate.arg);
183
+ const senderOperation = {
184
+ type: iface_1.OperationType.TRANSACTION,
185
+ account: { address: senderAccount },
186
+ amount: {
187
+ value: `-${args.payment.receiverGets.e8s.toString()}`,
188
+ currency: {
189
+ symbol: this._coinConfig.family,
190
+ decimals: this._coinConfig.decimalPlaces,
191
+ },
192
+ },
193
+ };
194
+ const receiverOperation = {
195
+ type: iface_1.OperationType.TRANSACTION,
196
+ account: { address: args.to.hash.toString('hex') },
197
+ amount: {
198
+ value: args.payment.receiverGets.e8s.toString(),
199
+ currency: {
200
+ symbol: this._coinConfig.family,
201
+ decimals: this._coinConfig.decimalPlaces,
202
+ },
203
+ },
204
+ };
205
+ const feeOperation = {
206
+ type: iface_1.OperationType.FEE,
207
+ account: { address: senderAccount },
208
+ amount: {
209
+ value: `-${args.maxFee.e8s.toString()}`,
210
+ currency: {
211
+ symbol: this._coinConfig.family,
212
+ decimals: this._coinConfig.decimalPlaces,
213
+ },
214
+ },
215
+ };
216
+ const accountIdentifierSigners = [];
217
+ if (isSigned) {
218
+ accountIdentifierSigners.push({ address: senderAccount });
219
+ }
220
+ const parsedTxn = {
221
+ operations: [senderOperation, receiverOperation, feeOperation],
222
+ metadata: {
223
+ created_at_time: args.createdAtTime.timestampNanos,
224
+ memo: Number(args.memo.memo),
225
+ ingress_end: Number(httpCanisterUpdate.ingress_expiry) + iface_1.PERMITTED_DRIFT,
226
+ },
227
+ account_identifier_signers: accountIdentifierSigners,
228
+ };
229
+ this.createdTimestamp = args.createdAtTime.timestampNanos;
230
+ return parsedTxn;
231
+ }
232
+ async parseSignedTransaction(rawTransaction) {
233
+ const signedTransaction = utils_1.default.cborDecode(utils_1.default.blobFromHex(rawTransaction));
234
+ const httpCanisterUpdate = signedTransaction.content;
235
+ httpCanisterUpdate.ingress_expiry = BigInt(signedTransaction.content.ingress_expiry);
236
+ return await this.getParsedTransactionFromUpdate(httpCanisterUpdate, true);
237
+ }
238
+ /** @inheritdoc */
239
+ canSign(key) {
240
+ return true;
241
+ }
242
+ /**
243
+ * Generates a unique transaction ID for the current transaction.
244
+ * The transaction ID is derived using the unsigned transaction data,
245
+ * the sender's address, and the receiver's address.
246
+ *
247
+ * @returns {string} The generated transaction ID.
248
+ */
249
+ generateTransactionId() {
250
+ const id = utils_1.default.getTransactionId(this.unsignedTransaction, this.icpTransactionData.senderAddress, this.icpTransactionData.receiverAddress);
251
+ return id;
252
+ }
253
+ }
254
+ exports.Transaction = Transaction;
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQU84QjtBQUU5QixtQ0FpQmlCO0FBQ2pCLG9EQUE0QjtBQUU1QixNQUFhLFdBQVksU0FBUSwwQkFBZTtJQVE5QyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsa0JBQXNDO1FBQzNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztJQUNoRCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsY0FBOEI7UUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztJQUVELElBQUksaUJBQWlCLENBQUMsU0FBaUI7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksWUFBWSxDQUFDLFlBQTBCO1FBQ3pDLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FB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SyxDQUFDLFVBQVUsQ0FBQyxlQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDOUUsTUFBTSxrQkFBa0IsR0FBSSxpQkFBb0MsQ0FBQyxPQUE2QixDQUFDO1FBQy9GLGtCQUFrQixDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUUsaUJBQW9DLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3pHLE9BQU8sTUFBTSxJQUFJLENBQUMsOEJBQThCLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsR0FBWTtRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxxQkFBcUI7UUFDM0IsTUFBTSxFQUFFLEdBQUcsZUFBSyxDQUFDLGdCQUFnQixDQUMvQixJQUFJLENBQUMsbUJBQW1CLEVBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLEVBQ3JDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQ3hDLENBQUM7UUFDRixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQWpTRCxrQ0FpU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblR5cGUsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvblR5cGUgYXMgQml0R29UcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEljcFRyYW5zYWN0aW9uLFxuICBJY3BUcmFuc2FjdGlvbkRhdGEsXG4gIFBheWxvYWRzRGF0YSxcbiAgT3BlcmF0aW9uVHlwZSxcbiAgU2lnbmF0dXJlcyxcbiAgVHhEYXRhLFxuICBJY3BUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBDYm9yVW5zaWduZWRUcmFuc2FjdGlvbixcbiAgSHR0cENhbmlzdGVyVXBkYXRlLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgSWNwT3BlcmF0aW9uLFxuICBVcGRhdGVFbnZlbG9wZSxcbiAgSWNwQWNjb3VudCxcbiAgTUFYX0lOR1JFU1NfVFRMLFxuICBQRVJNSVRURURfRFJJRlQsXG4gIFJhd1RyYW5zYWN0aW9uLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9pY3BUcmFuc2FjdGlvbkRhdGE6IEljcFRyYW5zYWN0aW9uRGF0YTtcbiAgcHJvdGVjdGVkIF9pY3BUcmFuc2FjdGlvbjogSWNwVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfcGF5bG9hZHNEYXRhOiBQYXlsb2Fkc0RhdGE7XG4gIHByb3RlY3RlZCBfc2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZztcbiAgcHJvdGVjdGVkIF9zaWduYXR1cmVQYXlsb2FkOiBTaWduYXR1cmVzW107XG4gIHByb3RlY3RlZCBfY3JlYXRlZFRpbWVzdGFtcDogbnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIGdldCBpY3BUcmFuc2FjdGlvbkRhdGEoKTogSWNwVHJhbnNhY3Rpb25EYXRhIHtcbiAgICByZXR1cm4gdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhO1xuICB9XG5cbiAgc2V0IGljcFRyYW5zYWN0aW9uRGF0YShpY3BUcmFuc2FjdGlvbkRhdGE6IEljcFRyYW5zYWN0aW9uRGF0YSkge1xuICAgIHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YSA9IGljcFRyYW5zYWN0aW9uRGF0YTtcbiAgfVxuXG4gIGdldCBpY3BUcmFuc2FjdGlvbigpOiBJY3BUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ljcFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgc2V0IGljcFRyYW5zYWN0aW9uKGljcFRyYW5zYWN0aW9uOiBJY3BUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX2ljcFRyYW5zYWN0aW9uID0gaWNwVHJhbnNhY3Rpb247XG4gIH1cblxuICBnZXQgdW5zaWduZWRUcmFuc2FjdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXlsb2Fkc0RhdGEudW5zaWduZWRfdHJhbnNhY3Rpb247XG4gIH1cblxuICBnZXQgc2lnbmF0dXJlUGF5bG9hZCgpOiBTaWduYXR1cmVzW10ge1xuICAgIHJldHVybiB0aGlzLl9zaWduYXR1cmVQYXlsb2FkO1xuICB9XG5cbiAgc2V0IHNpZ25lZFRyYW5zYWN0aW9uKHNpZ25hdHVyZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduYXR1cmU7XG4gIH1cblxuICBnZXQgc2lnbmVkVHJhbnNhY3Rpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2lnbmVkVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgcGF5bG9hZHNEYXRhKHBheWxvYWRzRGF0YTogUGF5bG9hZHNEYXRhKSB7XG4gICAgdGhpcy5fcGF5bG9hZHNEYXRhID0gcGF5bG9hZHNEYXRhO1xuICB9XG5cbiAgZ2V0IHBheWxvYWRzRGF0YSgpOiBQYXlsb2Fkc0RhdGEge1xuICAgIHJldHVybiB0aGlzLl9wYXlsb2Fkc0RhdGE7XG4gIH1cblxuICBzZXQgY3JlYXRlZFRpbWVzdGFtcChjcmVhdGVkVGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICB0aGlzLl9jcmVhdGVkVGltZXN0YW1wID0gY3JlYXRlZFRpbWVzdGFtcDtcbiAgfVxuXG4gIGdldCBjcmVhdGVkVGltZXN0YW1wKCk6IG51bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZWRUaW1lc3RhbXA7XG4gIH1cblxuICBhc3luYyBmcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhGb3JtYXRCdWZmZXIgPSBCdWZmZXIuZnJvbShyYXdUcmFuc2FjdGlvbiwgJ2hleCcpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4Rm9ybWF0SnNvblN0cmluZyA9IHNlcmlhbGl6ZWRUeEZvcm1hdEJ1ZmZlci50b1N0cmluZygndXRmLTgnKTtcbiAgICAgIGNvbnN0IGpzb25SYXdUcmFuc2FjdGlvbjogUmF3VHJhbnNhY3Rpb24gPSBKU09OLnBhcnNlKHNlcmlhbGl6ZWRUeEZvcm1hdEpzb25TdHJpbmcpO1xuICAgICAgY29uc3QgcGF5bG9hZHNEYXRhID0ganNvblJhd1RyYW5zYWN0aW9uLnNlcmlhbGl6ZWRUeEhleDtcbiAgICAgIHRoaXMuX3BheWxvYWRzRGF0YSA9IHBheWxvYWRzRGF0YTtcbiAgICAgIGNvbnN0IHBhcnNlZFR4ID0gYXdhaXQgdGhpcy5wYXJzZVVuc2lnbmVkVHJhbnNhY3Rpb24ocGF5bG9hZHNEYXRhLnVuc2lnbmVkX3RyYW5zYWN0aW9uKTtcbiAgICAgIGNvbnN0IHNlbmRlclB1YmxpY0tleUhleCA9IGpzb25SYXdUcmFuc2FjdGlvbi5wdWJsaWNLZXk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSBwYXJzZWRUeC5vcGVyYXRpb25zWzBdLnR5cGU7XG4gICAgICBzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkge1xuICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT046XG4gICAgICAgICAgdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgICAgICAgc2VuZGVyQWRkcmVzczogcGFyc2VkVHgub3BlcmF0aW9uc1swXS5hY2NvdW50LmFkZHJlc3MsXG4gICAgICAgICAgICByZWNlaXZlckFkZHJlc3M6IHBhcnNlZFR4Lm9wZXJhdGlvbnNbMV0uYWNjb3VudC5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBwYXJzZWRUeC5vcGVyYXRpb25zWzFdLmFtb3VudC52YWx1ZSxcbiAgICAgICAgICAgIGZlZTogcGFyc2VkVHgub3BlcmF0aW9uc1syXS5hbW91bnQudmFsdWUsXG4gICAgICAgICAgICBzZW5kZXJQdWJsaWNLZXlIZXg6IHNlbmRlclB1YmxpY0tleUhleCxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uVHlwZTogdHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICAgICAgZXhwaXJ5VGltZTogTnVtYmVyKHBhcnNlZFR4Lm1ldGFkYXRhLmluZ3Jlc3NfZW5kID8/IHBhcnNlZFR4Lm1ldGFkYXRhLmNyZWF0ZWRfYXRfdGltZSArIE1BWF9JTkdSRVNTX1RUTCksXG4gICAgICAgICAgICBtZW1vOiBwYXJzZWRUeC5tZXRhZGF0YS5tZW1vLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICB1dGlscy52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YSk7XG4gICAgICAgICAgdGhpcy5faWQgPSB0aGlzLmdlbmVyYXRlVHJhbnNhY3Rpb25JZCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0cmFuc2FjdGlvbjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFkZFNpZ25hdHVyZShzaWduYXR1cmVQYXlsb2FkczogU2lnbmF0dXJlc1tdKTogdm9pZCB7XG4gICAgaWYgKCFzaWduYXR1cmVQYXlsb2Fkcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduYXR1cmVzIG5vdCBwcm92aWRlZCcpO1xuICAgIH1cbiAgICBpZiAoc2lnbmF0dXJlUGF5bG9hZHMubGVuZ3RoICE9PSB0aGlzLl9wYXlsb2Fkc0RhdGEucGF5bG9hZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZXMgbGVuZ3RoIGlzIG5vdCBtYXRjaGluZycpO1xuICAgIH1cbiAgICB0aGlzLl9zaWduYXR1cmVQYXlsb2FkID0gc2lnbmF0dXJlUGF5bG9hZHM7XG4gICAgaWYgKHRoaXMuX2lkID09PSB1bmRlZmluZWQgfHwgdGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2lkID0gdGhpcy5nZW5lcmF0ZVRyYW5zYWN0aW9uSWQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT046XG4gICAgICAgIGNvbnN0IHR4RGF0YTogVHhEYXRhID0ge1xuICAgICAgICAgIGlkOiB0aGlzLl9pZCxcbiAgICAgICAgICBzZW5kZXI6IHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YS5zZW5kZXJBZGRyZXNzLFxuICAgICAgICAgIHNlbmRlclB1YmxpY0tleTogdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLnNlbmRlclB1YmxpY0tleUhleCxcbiAgICAgICAgICByZWNpcGllbnQ6IHRoaXMuX2ljcFRyYW5zYWN0aW9uRGF0YS5yZWNlaXZlckFkZHJlc3MsXG4gICAgICAgICAgbWVtbzogdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW8sXG4gICAgICAgICAgZmVlQW1vdW50OiB0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEuZmVlLFxuICAgICAgICAgIGV4cGlyYXRpb25UaW1lOiB0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEuZXhwaXJ5VGltZSxcbiAgICAgICAgICB0eXBlOiBCaXRHb1RyYW5zYWN0aW9uVHlwZS5TZW5kLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHR4RGF0YS5tZW1vID0gdGhpcy5faWNwVHJhbnNhY3Rpb25EYXRhLm1lbW87XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR4RGF0YTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZTogJHt0aGlzLl9pY3BUcmFuc2FjdGlvbkRhdGEudHJhbnNhY3Rpb25UeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogSWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZSddO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10gPSBbXTtcblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uUmVzdWx0ID0ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiAnMCcsXG4gICAgICBmZWU6IHsgZmVlOiAnMCcgfSxcbiAgICAgIHR5cGU6IHJlc3VsdC50eXBlLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sIC8vIGFjY291bnQgYmFzZWQgZG9lcyBub3QgdXNlIGNoYW5nZSBvdXRwdXRzXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJywgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCBtYWtlIGNoYW5nZVxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgIHJldHVybiB0aGlzLmV4cGxhaW5UcmFuc2ZlclRyYW5zYWN0aW9uKGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdHlwZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxhaW5zIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYnkgcHJvdmlkaW5nIGRldGFpbHMgYWJvdXQgdGhlIHJlY2lwaWVudHMgYW5kIHRoZSB0b3RhbCBvdXRwdXQgYW1vdW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0ljcFRyYW5zYWN0aW9uRXhwbGFuYXRpb259IGV4cGxhbmF0aW9uUmVzdWx0IC0gVGhlIGluaXRpYWwgZXhwbGFuYXRpb24gcmVzdWx0IHRvIGJlIGV4dGVuZGVkLlxuICAgKiBAcmV0dXJucyB7SWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gVGhlIGV4dGVuZGVkIGV4cGxhbmF0aW9uIHJlc3VsdCBpbmNsdWRpbmcgdGhlIG91dHB1dCBhbW91bnQgYW5kIHJlY2lwaWVudHMuXG4gICAqL1xuICBleHBsYWluVHJhbnNmZXJUcmFuc2FjdGlvbihleHBsYW5hdGlvblJlc3VsdDogSWNwVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IEljcFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGV4cGxhbmF0aW9uUmVzdWx0LmZlZSA9IHsgZmVlOiB0aGlzLmljcFRyYW5zYWN0aW9uRGF0YS5mZWUgfTtcbiAgICBjb25zdCByZWNpcGllbnRzID0gdXRpbHMuZ2V0UmVjaXBpZW50cyh0aGlzLmljcFRyYW5zYWN0aW9uRGF0YSk7XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSA9IFtyZWNpcGllbnRzXTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnRCTiA9IHJlY2lwaWVudHMuYW1vdW50O1xuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudEJOLnRvU3RyaW5nKCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXhwbGFuYXRpb25SZXN1bHQsXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25lZFRyYW5zYWN0aW9uO1xuICB9XG5cbiAgYXN5bmMgcGFyc2VVbnNpZ25lZFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdW5zaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLmNib3JEZWNvZGUodXRpbHMuYmxvYkZyb21IZXgocmF3VHJhbnNhY3Rpb24pKSBhcyBDYm9yVW5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICBjb25zdCB1cGRhdGUgPSB1bnNpZ25lZFRyYW5zYWN0aW9uLnVwZGF0ZXNbMF07XG4gICAgY29uc3QgaHR0cENhbmlzdGVyVXBkYXRlID0gKHVwZGF0ZSBhcyB1bmtub3duIGFzIFtzdHJpbmcsIEh0dHBDYW5pc3RlclVwZGF0ZV0pWzFdO1xuICAgIGh0dHBDYW5pc3RlclVwZGF0ZS5pbmdyZXNzX2V4cGlyeSA9IEJpZ0ludCh1bnNpZ25lZFRyYW5zYWN0aW9uLmluZ3Jlc3NfZXhwaXJpZXNbMF0pO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFBhcnNlZFRyYW5zYWN0aW9uRnJvbVVwZGF0ZShodHRwQ2FuaXN0ZXJVcGRhdGUsIGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGFyc2VkVHJhbnNhY3Rpb25Gcm9tVXBkYXRlKFxuICAgIGh0dHBDYW5pc3RlclVwZGF0ZTogSHR0cENhbmlzdGVyVXBkYXRlLFxuICAgIGlzU2lnbmVkOiBib29sZWFuXG4gICk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBzZW5kZXJQcmluY2lwYWwgPSB1dGlscy5jb252ZXJ0U2VuZGVyQmxvYlRvUHJpbmNpcGFsKGh0dHBDYW5pc3RlclVwZGF0ZS5zZW5kZXIpO1xuICAgIGNvbnN0IEFDQ09VTlRfSURfUFJFRklYID0gdXRpbHMuZ2V0QWNjb3VudElkUHJlZml4KCk7XG4gICAgY29uc3Qgc3ViQWNjb3VudCA9IG5ldyBVaW50OEFycmF5KDMyKTtcbiAgICBjb25zdCBzZW5kZXJBY2NvdW50ID0gdXRpbHMuZ2V0QWNjb3VudElkRnJvbVByaW5jaXBhbEJ5dGVzKFxuICAgICAgQUNDT1VOVF9JRF9QUkVGSVgsXG4gICAgICBCdWZmZXIuZnJvbShzZW5kZXJQcmluY2lwYWwuYnVmZmVyKSxcbiAgICAgIHN1YkFjY291bnRcbiAgICApO1xuICAgIGNvbnN0IGFyZ3MgPSBhd2FpdCB1dGlscy5mcm9tQXJncyhodHRwQ2FuaXN0ZXJVcGRhdGUuYXJnKTtcbiAgICBjb25zdCBzZW5kZXJPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT04sXG4gICAgICBhY2NvdW50OiB7IGFkZHJlc3M6IHNlbmRlckFjY291bnQgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB2YWx1ZTogYC0ke2FyZ3MucGF5bWVudC5yZWNlaXZlckdldHMuZThzLnRvU3RyaW5nKCl9YCxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICBzeW1ib2w6IHRoaXMuX2NvaW5Db25maWcuZmFtaWx5LFxuICAgICAgICAgIGRlY2ltYWxzOiB0aGlzLl9jb2luQ29uZmlnLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3QgcmVjZWl2ZXJPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuVFJBTlNBQ1RJT04sXG4gICAgICBhY2NvdW50OiB7IGFkZHJlc3M6IGFyZ3MudG8uaGFzaC50b1N0cmluZygnaGV4JykgfSxcbiAgICAgIGFtb3VudDoge1xuICAgICAgICB2YWx1ZTogYXJncy5wYXltZW50LnJlY2VpdmVyR2V0cy5lOHMudG9TdHJpbmcoKSxcbiAgICAgICAgY3VycmVuY3k6IHtcbiAgICAgICAgICBzeW1ib2w6IHRoaXMuX2NvaW5Db25maWcuZmFtaWx5LFxuICAgICAgICAgIGRlY2ltYWxzOiB0aGlzLl9jb2luQ29uZmlnLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBmZWVPcGVyYXRpb246IEljcE9wZXJhdGlvbiA9IHtcbiAgICAgIHR5cGU6IE9wZXJhdGlvblR5cGUuRkVFLFxuICAgICAgYWNjb3VudDogeyBhZGRyZXNzOiBzZW5kZXJBY2NvdW50IH0sXG4gICAgICBhbW91bnQ6IHtcbiAgICAgICAgdmFsdWU6IGAtJHthcmdzLm1heEZlZS5lOHMudG9TdHJpbmcoKX1gLFxuICAgICAgICBjdXJyZW5jeToge1xuICAgICAgICAgIHN5bWJvbDogdGhpcy5fY29pbkNvbmZpZy5mYW1pbHksXG4gICAgICAgICAgZGVjaW1hbHM6IHRoaXMuX2NvaW5Db25maWcuZGVjaW1hbFBsYWNlcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBhY2NvdW50SWRlbnRpZmllclNpZ25lcnM6IEljcEFjY291bnRbXSA9IFtdO1xuICAgIGlmIChpc1NpZ25lZCkge1xuICAgICAgYWNjb3VudElkZW50aWZpZXJTaWduZXJzLnB1c2goeyBhZGRyZXNzOiBzZW5kZXJBY2NvdW50IH0pO1xuICAgIH1cbiAgICBjb25zdCBwYXJzZWRUeG46IFBhcnNlZFRyYW5zYWN0aW9uID0ge1xuICAgICAgb3BlcmF0aW9uczogW3NlbmRlck9wZXJhdGlvbiwgcmVjZWl2ZXJPcGVyYXRpb24sIGZlZU9wZXJhdGlvbl0sXG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICBjcmVhdGVkX2F0X3RpbWU6IGFyZ3MuY3JlYXRlZEF0VGltZS50aW1lc3RhbXBOYW5vcyxcbiAgICAgICAgbWVtbzogTnVtYmVyKGFyZ3MubWVtby5tZW1vKSxcbiAgICAgICAgaW5ncmVzc19lbmQ6IE51bWJlcihodHRwQ2FuaXN0ZXJVcGRhdGUuaW5ncmVzc19leHBpcnkpICsgUEVSTUlUVEVEX0RSSUZULFxuICAgICAgfSxcbiAgICAgIGFjY291bnRfaWRlbnRpZmllcl9zaWduZXJzOiBhY2NvdW50SWRlbnRpZmllclNpZ25lcnMsXG4gICAgfTtcbiAgICB0aGlzLmNyZWF0ZWRUaW1lc3RhbXAgPSBhcmdzLmNyZWF0ZWRBdFRpbWUudGltZXN0YW1wTmFub3M7XG4gICAgcmV0dXJuIHBhcnNlZFR4bjtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlU2lnbmVkVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBzaWduZWRUcmFuc2FjdGlvbiA9IHV0aWxzLmNib3JEZWNvZGUodXRpbHMuYmxvYkZyb21IZXgocmF3VHJhbnNhY3Rpb24pKTtcbiAgICBjb25zdCBodHRwQ2FuaXN0ZXJVcGRhdGUgPSAoc2lnbmVkVHJhbnNhY3Rpb24gYXMgVXBkYXRlRW52ZWxvcGUpLmNvbnRlbnQgYXMgSHR0cENhbmlzdGVyVXBkYXRlO1xuICAgIGh0dHBDYW5pc3RlclVwZGF0ZS5pbmdyZXNzX2V4cGlyeSA9IEJpZ0ludCgoc2lnbmVkVHJhbnNhY3Rpb24gYXMgVXBkYXRlRW52ZWxvcGUpLmNvbnRlbnQuaW5ncmVzc19leHBpcnkpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldFBhcnNlZFRyYW5zYWN0aW9uRnJvbVVwZGF0ZShodHRwQ2FuaXN0ZXJVcGRhdGUsIHRydWUpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oa2V5OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgdW5pcXVlIHRyYW5zYWN0aW9uIElEIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi5cbiAgICogVGhlIHRyYW5zYWN0aW9uIElEIGlzIGRlcml2ZWQgdXNpbmcgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIGRhdGEsXG4gICAqIHRoZSBzZW5kZXIncyBhZGRyZXNzLCBhbmQgdGhlIHJlY2VpdmVyJ3MgYWRkcmVzcy5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGdlbmVyYXRlZCB0cmFuc2FjdGlvbiBJRC5cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVUcmFuc2FjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaWQgPSB1dGlscy5nZXRUcmFuc2FjdGlvbklkKFxuICAgICAgdGhpcy51bnNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgdGhpcy5pY3BUcmFuc2FjdGlvbkRhdGEuc2VuZGVyQWRkcmVzcyxcbiAgICAgIHRoaXMuaWNwVHJhbnNhY3Rpb25EYXRhLnJlY2VpdmVyQWRkcmVzc1xuICAgICk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG59XG4iXX0=
@@ -1,48 +1,78 @@
1
+ import { BaseAddress, BaseKey, BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
1
2
  import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
- import { BaseKey, BaseTransaction, PublicKey as BasePublicKey, BaseTransactionBuilder, BaseAddress, Recipient } from '@bitgo-beta/sdk-core';
3
- import { TransferBuilder } from './transferBuilder';
3
+ import BigNumber from 'bignumber.js';
4
+ import { IcpTransaction, IcpTransactionData, PayloadsData, Signatures } from './iface';
5
+ import { Transaction } from './transaction';
4
6
  export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
5
- protected _transfer: TransferBuilder;
6
- protected constructor(_coinConfig: Readonly<CoinConfig>);
7
- /** @inheritdoc */
8
- protected signImplementation(key: BaseKey): BaseTransaction;
7
+ protected _transaction: Transaction;
8
+ protected _sender: string;
9
+ protected _publicKey: string;
10
+ protected _memo: number | BigInt;
11
+ protected _ingressEnd: number | BigInt;
12
+ protected _receiverId: string;
13
+ protected _amount: string;
14
+ constructor(_coinConfig: Readonly<CoinConfig>);
15
+ signaturePayload(): Signatures[];
16
+ payloadData(): PayloadsData;
17
+ icpTransaction(): IcpTransaction;
9
18
  /**
10
- * add a signature to the transaction
19
+ * Sets the public key and the address of the sender of this transaction.
20
+ *
21
+ * @param {string} address the account that is sending this transaction
22
+ * @param {string} pubKey the public key that is sending this transaction
23
+ * @returns {TransactionBuilder} This transaction builder
11
24
  */
12
- addSignature(publicKey: BasePublicKey, signature: Buffer): void;
25
+ sender(address: string, pubKey: string): this;
13
26
  /**
14
- * Sets the sender of this transaction.
27
+ * Set the memo
28
+ *
29
+ * @param {number} memo - number that to be used as memo
30
+ * @returns {TransactionBuilder} This transaction builder
15
31
  */
16
- sender(senderAddress: string): this;
32
+ memo(memo: number): this;
17
33
  /**
18
- * gets the gas data of this transaction.
34
+ * Set the ingressEnd timestamp
35
+ * @param {number} ingressEnd - timestamp in nanoseconds
36
+ * @returns {TransactionBuilder} This transaction builder
19
37
  */
20
- gasData(): this;
21
- /** @inheritdoc */
22
- validateAddress(address: BaseAddress, addressFormat?: string): void;
38
+ ingressEnd(ingressEnd: number | BigInt): this;
23
39
  /**
24
- * validates the recipients of the transaction
40
+ * Sets the account Id of the receiver of this transaction.
41
+ *
42
+ * @param {string} accountId the account id of the account that is receiving this transaction
43
+ * @returns {TransactionBuilder} This transaction builder
25
44
  */
26
- validateRecipients(recipients: Recipient[]): void;
45
+ receiverId(accountId: string): this;
46
+ /** @inheritdoc */
47
+ get transaction(): Transaction;
48
+ /** @inheritdoc */
49
+ set transaction(transaction: Transaction);
50
+ get transactionType(): string;
51
+ /** @inheritdoc */
52
+ fromImplementation(rawTransaction: string): Transaction;
53
+ /** @inheritdoc */
54
+ validateTransaction(transaction: Transaction): void;
27
55
  /**
28
- * validates the gas data of the transaction
56
+ * Sets the amount of this transaction.
57
+ *
58
+ * @param {string} value the amount to be sent in e8s (1 ICP = 1e8 e8s)
59
+ * @returns {TransactionBuilder} This transaction builder
29
60
  */
30
- validateGasData(): void;
61
+ amount(value: string): this;
62
+ validateValue(value: BigNumber): void;
31
63
  /**
32
- * validates the gas price of the transaction
64
+ * Initialize the transaction builder fields using the decoded transaction data
65
+ *
66
+ * @param {Transaction} tx the transaction data
33
67
  */
34
- validateGasPrice(gasPrice: number): void;
68
+ initBuilder(tx: Transaction): void;
69
+ validateAddress(address: BaseAddress): void;
70
+ validateRawTransaction(rawTransaction: IcpTransactionData): void;
35
71
  /** @inheritdoc */
36
72
  validateKey(key: BaseKey): void;
37
- /** @inheritdoc */
38
- validateRawTransaction(rawTransaction: string): void;
39
- /** @inheritdoc */
40
- validateValue(): void;
41
73
  /**
42
- * Validates the specific transaction builder internally
74
+ * Combines the unsigned transaction and the signature payload to create a signed transaction.
43
75
  */
44
- validateDecodedTransaction(): void;
45
- /** @inheritdoc */
46
- validateTransaction(): void;
76
+ combine(): void;
47
77
  }
48
78
  //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,OAAO,EACP,eAAe,EACf,SAAS,IAAI,aAAa,EAC1B,sBAAsB,EACtB,WAAW,EACX,SAAS,EACV,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,SAAS,EAAE,eAAe,CAAC;IAErC,SAAS,aAAa,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAIvD,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe;IAI3D;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI/D;;OAEG;IACH,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAInE;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IAIjD;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAIxC,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIpD,kBAAkB;IAClB,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,0BAA0B,IAAI,IAAI;IAIlC,kBAAkB;IAClB,mBAAmB,IAAI,IAAI;CAG5B"}
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,EAAuC,MAAM,sBAAsB,CAAC;AACzH,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAgB,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC;IAC7B,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC;IAC9B,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEd,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAKtC,gBAAgB,IAAI,UAAU,EAAE;IAIhC,WAAW,IAAI,YAAY;IAI3B,cAAc,IAAI,cAAc;IAIvC;;;;;;OAMG;IACI,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAYpD;;;;;OAKG;IACI,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ/B;;;;OAIG;IACI,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQpD;;;;;OAKG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAQ1C,kBAAkB;IAClB,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED,kBAAkB;IAClB,IAAI,WAAW,CAAC,WAAW,EAAE,WAAW,EAEvC;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,kBAAkB;IAClB,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAQvD,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAOnD;;;;;OAKG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAMlC,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAIrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;IAWlC,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAM3C,sBAAsB,CAAC,cAAc,EAAE,kBAAkB,GAAG,IAAI;IAIhE,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAS/B;;OAEG;IACI,OAAO,IAAI,IAAI;CAOvB"}