@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.
- 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
|
@@ -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
|
|
3
|
-
import {
|
|
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
|
|
6
|
-
protected
|
|
7
|
-
|
|
8
|
-
protected
|
|
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
|
-
*
|
|
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
|
-
|
|
25
|
+
sender(address: string, pubKey: string): this;
|
|
13
26
|
/**
|
|
14
|
-
*
|
|
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
|
-
|
|
32
|
+
memo(memo: number): this;
|
|
17
33
|
/**
|
|
18
|
-
*
|
|
34
|
+
* Set the ingressEnd timestamp
|
|
35
|
+
* @param {number} ingressEnd - timestamp in nanoseconds
|
|
36
|
+
* @returns {TransactionBuilder} This transaction builder
|
|
19
37
|
*/
|
|
20
|
-
|
|
21
|
-
/** @inheritdoc */
|
|
22
|
-
validateAddress(address: BaseAddress, addressFormat?: string): void;
|
|
38
|
+
ingressEnd(ingressEnd: number | BigInt): this;
|
|
23
39
|
/**
|
|
24
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
61
|
+
amount(value: string): this;
|
|
62
|
+
validateValue(value: BigNumber): void;
|
|
31
63
|
/**
|
|
32
|
-
*
|
|
64
|
+
* Initialize the transaction builder fields using the decoded transaction data
|
|
65
|
+
*
|
|
66
|
+
* @param {Transaction} tx the transaction data
|
|
33
67
|
*/
|
|
34
|
-
|
|
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
|
-
*
|
|
74
|
+
* Combines the unsigned transaction and the signature payload to create a signed transaction.
|
|
43
75
|
*/
|
|
44
|
-
|
|
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,
|
|
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"}
|