@bitgo-beta/sdk-coin-trx 1.2.3-alpha.40 → 1.2.3-alpha.401
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/.mocharc.yml +1 -1
- package/CHANGELOG.md +988 -0
- package/dist/resources/protobuf/Contract.proto +32 -0
- package/dist/resources/protobuf/tron.d.ts +1478 -214
- package/dist/resources/protobuf/tron.js +6312 -2600
- package/dist/resources/protobuf/tron.proto +6 -0
- package/package.json +16 -14
- package/resources/protobuf/Contract.proto +32 -0
- package/resources/protobuf/tron.d.ts +1478 -214
- package/resources/protobuf/tron.js +6312 -2600
- package/resources/protobuf/tron.proto +6 -0
- package/dist/src/index.d.ts +0 -6
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -18
- package/dist/src/lib/address.d.ts +0 -11
- package/dist/src/lib/address.d.ts.map +0 -1
- package/dist/src/lib/address.js +0 -13
- package/dist/src/lib/builder.d.ts +0 -3
- package/dist/src/lib/builder.d.ts.map +0 -1
- package/dist/src/lib/builder.js +0 -10
- package/dist/src/lib/contractCallBuilder.d.ts +0 -96
- package/dist/src/lib/contractCallBuilder.d.ts.map +0 -1
- package/dist/src/lib/contractCallBuilder.js +0 -281
- package/dist/src/lib/enum.d.ts +0 -23
- package/dist/src/lib/enum.d.ts.map +0 -1
- package/dist/src/lib/enum.js +0 -28
- package/dist/src/lib/iface.d.ts +0 -103
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -3
- package/dist/src/lib/index.d.ts +0 -12
- package/dist/src/lib/index.d.ts.map +0 -1
- package/dist/src/lib/index.js +0 -39
- package/dist/src/lib/keyPair.d.ts +0 -44
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -121
- package/dist/src/lib/tokenTransferBuilder.d.ts +0 -23
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +0 -1
- package/dist/src/lib/tokenTransferBuilder.js +0 -42
- package/dist/src/lib/transaction.d.ts +0 -74
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -226
- package/dist/src/lib/transactionBuilder.d.ts +0 -65
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -215
- package/dist/src/lib/utils.d.ts +0 -144
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -426
- package/dist/src/lib/wrappedBuilder.d.ts +0 -54
- package/dist/src/lib/wrappedBuilder.d.ts.map +0 -1
- package/dist/src/lib/wrappedBuilder.js +0 -108
- package/dist/src/register.d.ts +0 -3
- package/dist/src/register.d.ts.map +0 -1
- package/dist/src/register.js +0 -15
- package/dist/src/trx.d.ts +0 -208
- package/dist/src/trx.d.ts.map +0 -1
- package/dist/src/trx.js +0 -563
- package/dist/src/trxToken.d.ts +0 -38
- package/dist/src/trxToken.d.ts.map +0 -1
- package/dist/src/trxToken.js +0 -91
- package/dist/src/ttrx.d.ts +0 -13
- package/dist/src/ttrx.d.ts.map +0 -1
- package/dist/src/ttrx.js +0 -14
|
@@ -1,226 +0,0 @@
|
|
|
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 crypto_1 = require("crypto");
|
|
8
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
9
|
-
const tron_1 = require("../../resources/protobuf/tron");
|
|
10
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
11
|
-
const enum_1 = require("./enum");
|
|
12
|
-
const utils_1 = require("./utils");
|
|
13
|
-
/**
|
|
14
|
-
* Tron transaction model.
|
|
15
|
-
*/
|
|
16
|
-
class Transaction extends sdk_core_1.BaseTransaction {
|
|
17
|
-
/**
|
|
18
|
-
* Public constructor.
|
|
19
|
-
*
|
|
20
|
-
* @param coinConfig
|
|
21
|
-
* @param rawTransaction
|
|
22
|
-
*/
|
|
23
|
-
constructor(coinConfig, rawTransaction) {
|
|
24
|
-
super(coinConfig);
|
|
25
|
-
if (rawTransaction) {
|
|
26
|
-
if (!rawTransaction.txID) {
|
|
27
|
-
throw new sdk_core_1.ParseTransactionError('Transaction has no id');
|
|
28
|
-
}
|
|
29
|
-
this._id = rawTransaction.txID;
|
|
30
|
-
this._transaction = rawTransaction;
|
|
31
|
-
this._decodedRawDataHex = utils_1.decodeTransaction(rawTransaction.raw_data_hex);
|
|
32
|
-
// Destination depends on the contract type
|
|
33
|
-
this.recordRawDataFields(this._decodedRawDataHex);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Parse the transaction raw data and record the most important fields.
|
|
38
|
-
*
|
|
39
|
-
* @param rawData Object from a tron transaction
|
|
40
|
-
*/
|
|
41
|
-
recordRawDataFields(rawData) {
|
|
42
|
-
// Contract-agnostic fields
|
|
43
|
-
this._validFrom = rawData.timestamp;
|
|
44
|
-
this._validTo = rawData.expiration;
|
|
45
|
-
let output, input;
|
|
46
|
-
// Contract-specific fields
|
|
47
|
-
switch (rawData.contractType) {
|
|
48
|
-
case enum_1.ContractType.Transfer:
|
|
49
|
-
this._type = sdk_core_1.TransactionType.Send;
|
|
50
|
-
const value = new bignumber_js_1.default(rawData.contract[0].parameter.value.amount).toFixed(0);
|
|
51
|
-
output = {
|
|
52
|
-
address: rawData.contract[0].parameter.value.to_address,
|
|
53
|
-
value,
|
|
54
|
-
};
|
|
55
|
-
input = {
|
|
56
|
-
address: rawData.contract[0].parameter.value.owner_address,
|
|
57
|
-
value,
|
|
58
|
-
};
|
|
59
|
-
break;
|
|
60
|
-
case enum_1.ContractType.AccountPermissionUpdate:
|
|
61
|
-
this._type = sdk_core_1.TransactionType.WalletInitialization;
|
|
62
|
-
output = {
|
|
63
|
-
address: rawData.contract.owner_address,
|
|
64
|
-
value: '0',
|
|
65
|
-
};
|
|
66
|
-
input = {
|
|
67
|
-
address: rawData.contract.owner_address,
|
|
68
|
-
value: '0',
|
|
69
|
-
};
|
|
70
|
-
break;
|
|
71
|
-
case enum_1.ContractType.TriggerSmartContract:
|
|
72
|
-
this._type = sdk_core_1.TransactionType.ContractCall;
|
|
73
|
-
const contractCallValues = rawData.contract[0].parameter.value;
|
|
74
|
-
const contractAddress = contractCallValues.contract_address;
|
|
75
|
-
if (utils_1.tokenMainnetContractAddresses.includes(contractAddress) ||
|
|
76
|
-
utils_1.tokenTestnetContractAddresses.includes(contractAddress)) {
|
|
77
|
-
// this is then a token smart contract transaction and the data must be decoded
|
|
78
|
-
const types = ['address', 'uint256'];
|
|
79
|
-
const data = Buffer.from(contractCallValues.data, 'base64').toString('hex');
|
|
80
|
-
const decodedData = utils_1.decodeDataParams(types, data);
|
|
81
|
-
const recipient_address = utils_1.getBase58AddressFromHex(decodedData[0]);
|
|
82
|
-
const value = decodedData[1].toString();
|
|
83
|
-
output = {
|
|
84
|
-
address: recipient_address,
|
|
85
|
-
value,
|
|
86
|
-
};
|
|
87
|
-
input = {
|
|
88
|
-
address: contractCallValues.owner_address,
|
|
89
|
-
contractAddress,
|
|
90
|
-
data,
|
|
91
|
-
value,
|
|
92
|
-
};
|
|
93
|
-
break;
|
|
94
|
-
}
|
|
95
|
-
output = {
|
|
96
|
-
address: contractCallValues.owner_address,
|
|
97
|
-
value: '0',
|
|
98
|
-
};
|
|
99
|
-
input = {
|
|
100
|
-
address: contractCallValues.owner_address,
|
|
101
|
-
contractAddress,
|
|
102
|
-
data: contractCallValues.data,
|
|
103
|
-
value: '0',
|
|
104
|
-
};
|
|
105
|
-
break;
|
|
106
|
-
default:
|
|
107
|
-
throw new sdk_core_1.ParseTransactionError('Unsupported contract type');
|
|
108
|
-
}
|
|
109
|
-
this._inputs = [input];
|
|
110
|
-
this._outputs = [output];
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Recalculate and update the transaction id. This should be done after changing any transaction
|
|
114
|
-
* field since the the id is a hash of the transaction body.
|
|
115
|
-
*/
|
|
116
|
-
updateId() {
|
|
117
|
-
if (!this._transaction) {
|
|
118
|
-
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
119
|
-
}
|
|
120
|
-
const hexBuffer = Buffer.from(this._transaction.raw_data_hex, 'hex');
|
|
121
|
-
const newTxid = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
|
|
122
|
-
this._transaction.txID = newTxid;
|
|
123
|
-
this._id = newTxid;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Extend the expiration date by the given number of milliseconds.
|
|
127
|
-
*
|
|
128
|
-
* @param extensionMs The number of milliseconds to extend the expiration by
|
|
129
|
-
*/
|
|
130
|
-
extendExpiration(extensionMs) {
|
|
131
|
-
if (extensionMs < 0) {
|
|
132
|
-
throw new sdk_core_1.ExtendTransactionError('Invalid extension range. Must be positive a integer');
|
|
133
|
-
}
|
|
134
|
-
if (!this._transaction) {
|
|
135
|
-
throw new sdk_core_1.ExtendTransactionError('Empty transaction');
|
|
136
|
-
}
|
|
137
|
-
if (this._transaction.signature && this._transaction.signature.length > 0) {
|
|
138
|
-
throw new sdk_core_1.ExtendTransactionError('Cannot extend a signed transaction');
|
|
139
|
-
}
|
|
140
|
-
const rawDataHex = this._transaction.raw_data_hex;
|
|
141
|
-
const bytes = Buffer.from(rawDataHex, 'hex');
|
|
142
|
-
let raw;
|
|
143
|
-
try {
|
|
144
|
-
raw = tron_1.protocol.Transaction.raw.decode(bytes);
|
|
145
|
-
const newExpiration = new bignumber_js_1.default(raw.expiration).plus(extensionMs).toNumber();
|
|
146
|
-
raw.expiration = newExpiration;
|
|
147
|
-
const newRawDataHex = Buffer.from(tron_1.protocol.Transaction.raw.encode(raw).finish()).toString('hex');
|
|
148
|
-
// Set the internal variables to account for the new expiration date
|
|
149
|
-
this._transaction.raw_data_hex = newRawDataHex;
|
|
150
|
-
this._transaction.raw_data.expiration = newExpiration;
|
|
151
|
-
this._decodedRawDataHex = utils_1.decodeTransaction(newRawDataHex);
|
|
152
|
-
this.recordRawDataFields(this._decodedRawDataHex);
|
|
153
|
-
this.updateId();
|
|
154
|
-
}
|
|
155
|
-
catch (e) {
|
|
156
|
-
throw new sdk_core_1.ExtendTransactionError('There was an error decoding the initial raw_data_hex from the serialized tx.');
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Get the signatures associated with this transaction.
|
|
161
|
-
*/
|
|
162
|
-
get signature() {
|
|
163
|
-
if (this._transaction && this._transaction.signature) {
|
|
164
|
-
return this._transaction.signature;
|
|
165
|
-
}
|
|
166
|
-
return [];
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Get the time in milliseconds this transaction becomes valid and can be broadcasted to the
|
|
170
|
-
* network.
|
|
171
|
-
*/
|
|
172
|
-
get validFrom() {
|
|
173
|
-
return this._validFrom;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Get the expiration time in milliseconds.
|
|
177
|
-
*/
|
|
178
|
-
get validTo() {
|
|
179
|
-
return this._validTo;
|
|
180
|
-
}
|
|
181
|
-
/** @inheritdoc */
|
|
182
|
-
get outputs() {
|
|
183
|
-
return this._outputs;
|
|
184
|
-
}
|
|
185
|
-
/** @inheritdoc */
|
|
186
|
-
get inputs() {
|
|
187
|
-
return this._inputs;
|
|
188
|
-
}
|
|
189
|
-
/** @inheritdoc */
|
|
190
|
-
canSign(key) {
|
|
191
|
-
// Tron transaction do not contain the owners account address so it is not possible to check the
|
|
192
|
-
// private key with any but the account main address. This is not enough to fail this check, so
|
|
193
|
-
// it is a no-op.
|
|
194
|
-
return true;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Sets this transaction
|
|
198
|
-
*
|
|
199
|
-
* @param {Transaction} tx transaction
|
|
200
|
-
*/
|
|
201
|
-
setTransactionReceipt(tx) {
|
|
202
|
-
this._transaction = tx;
|
|
203
|
-
this.updateId();
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Set the transaction type
|
|
207
|
-
*
|
|
208
|
-
* @param {TransactionType} transactionType The transaction type to be set
|
|
209
|
-
*/
|
|
210
|
-
setTransactionType(transactionType) {
|
|
211
|
-
this._type = transactionType;
|
|
212
|
-
}
|
|
213
|
-
/** @inheritdoc */
|
|
214
|
-
toJson() {
|
|
215
|
-
if (!this._transaction) {
|
|
216
|
-
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
217
|
-
}
|
|
218
|
-
return this._transaction;
|
|
219
|
-
}
|
|
220
|
-
/** @inheritdoc */
|
|
221
|
-
toBroadcastFormat() {
|
|
222
|
-
return JSON.stringify(this.toJson());
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
exports.Transaction = Transaction;
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1DQUFvQztBQUVwQyxnRUFBcUM7QUFDckMsd0RBQXlEO0FBQ3pELG1EQU04QjtBQUM5QixpQ0FBc0M7QUFDdEMsbUNBTWlCO0FBR2pCOztHQUVHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFVOUM7Ozs7O09BS0c7SUFDSCxZQUFZLFVBQWdDLEVBQUUsY0FBbUM7UUFDL0UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFO2dCQUN4QixNQUFNLElBQUksZ0NBQXFCLENBQUMsdUJBQXVCLENBQUMsQ0FBQzthQUMxRDtZQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQztZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQztZQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcseUJBQWlCLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRXpFLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG1CQUFtQixDQUFDLE9BQWdCO1FBQzFDLDJCQUEyQjtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO1FBRW5DLElBQUksTUFBcUIsRUFBRSxLQUFvQixDQUFDO1FBQ2hELDJCQUEyQjtRQUMzQixRQUFRLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDNUIsS0FBSyxtQkFBWSxDQUFDLFFBQVE7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksc0JBQVMsQ0FBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekcsTUFBTSxHQUFHO29CQUNQLE9BQU8sRUFBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBc0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVU7b0JBQzdFLEtBQUs7aUJBQ04sQ0FBQztnQkFDRixLQUFLLEdBQUc7b0JBQ04sT0FBTyxFQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFzQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYTtvQkFDaEYsS0FBSztpQkFDTixDQUFDO2dCQUNGLE1BQU07WUFDUixLQUFLLG1CQUFZLENBQUMsdUJBQXVCO2dCQUN2QyxJQUFJLENBQUMsS0FBSyxHQUFHLDBCQUFlLENBQUMsb0JBQW9CLENBQUM7Z0JBQ2xELE1BQU0sR0FBRztvQkFDUCxPQUFPLEVBQUcsT0FBTyxDQUFDLFFBQWdCLENBQUMsYUFBYTtvQkFDaEQsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsQ0FBQztnQkFDRixLQUFLLEdBQUc7b0JBQ04sT0FBTyxFQUFHLE9BQU8sQ0FBQyxRQUFnQixDQUFDLGFBQWE7b0JBQ2hELEtBQUssRUFBRSxHQUFHO2lCQUNYLENBQUM7Z0JBQ0YsTUFBTTtZQUNSLEtBQUssbUJBQVksQ0FBQyxvQkFBb0I7Z0JBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxZQUFZLENBQUM7Z0JBQzFDLE1BQU0sa0JBQWtCLEdBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQTBCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDekYsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzVELElBQ0UscUNBQTZCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQztvQkFDdkQscUNBQTZCLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUN2RDtvQkFDQSwrRUFBK0U7b0JBQy9FLE1BQU0sS0FBSyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVFLE1BQU0sV0FBVyxHQUFHLHdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbEQsTUFBTSxpQkFBaUIsR0FBRywrQkFBdUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEUsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN4QyxNQUFNLEdBQUc7d0JBQ1AsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsS0FBSztxQkFDTixDQUFDO29CQUNGLEtBQUssR0FBRzt3QkFDTixPQUFPLEVBQUUsa0JBQWtCLENBQUMsYUFBYTt3QkFDekMsZUFBZTt3QkFDZixJQUFJO3dCQUNKLEtBQUs7cUJBQ04sQ0FBQztvQkFDRixNQUFNO2lCQUNQO2dCQUNELE1BQU0sR0FBRztvQkFDUCxPQUFPLEVBQUUsa0JBQWtCLENBQUMsYUFBYTtvQkFDekMsS0FBSyxFQUFFLEdBQUc7aUJBQ1gsQ0FBQztnQkFDRixLQUFLLEdBQUc7b0JBQ04sT0FBTyxFQUFFLGtCQUFrQixDQUFDLGFBQWE7b0JBQ3pDLGVBQWU7b0JBQ2YsSUFBSSxFQUFFLGtCQUFrQixDQUFDLElBQUk7b0JBQzdCLEtBQUssRUFBRSxHQUFHO2lCQUNYLENBQUM7Z0JBQ0YsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ2hFO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssUUFBUTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxtQkFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsV0FBbUI7UUFDbEMsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxpQ0FBc0IsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1NBQ3pGO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsTUFBTSxJQUFJLGlDQUFzQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdkQ7UUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDekUsTUFBTSxJQUFJLGlDQUFzQixDQUFDLG9DQUFvQyxDQUFDLENBQUM7U0FDeEU7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxJQUFJLEdBQUcsQ0FBQztRQUNSLElBQUk7WUFDRixHQUFHLEdBQUcsZUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksc0JBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2pGLEdBQUcsQ0FBQyxVQUFVLEdBQUcsYUFBYSxDQUFDO1lBQy9CLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pHLG9FQUFvRTtZQUNwRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxhQUFhLENBQUM7WUFDL0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQztZQUN0RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcseUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLGlDQUFzQixDQUFDLDhFQUE4RSxDQUFDLENBQUM7U0FDbEg7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLFNBQVM7UUFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztTQUNwQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNEOzs7T0FHRztJQUNILElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixPQUFPLENBQUMsR0FBWTtRQUNsQixnR0FBZ0c7UUFDaEcsK0ZBQStGO1FBQy9GLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gscUJBQXFCLENBQUMsRUFBc0I7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsa0JBQWtCLENBQUMsZUFBZ0M7UUFDakQsSUFBSSxDQUFDLEtBQUssR0FBRyxlQUFlLENBQUM7SUFDL0IsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDdEQ7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztDQUNGO0FBM09ELGtDQTJPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgcHJvdG9jb2wgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcHJvdG9idWYvdHJvbic7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEV4dGVuZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBDb250cmFjdFR5cGUgfSBmcm9tICcuL2VudW0nO1xuaW1wb3J0IHtcbiAgZGVjb2RlVHJhbnNhY3Rpb24sXG4gIGRlY29kZURhdGFQYXJhbXMsXG4gIGdldEJhc2U1OEFkZHJlc3NGcm9tSGV4LFxuICB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcyxcbiAgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ29udHJhY3RFbnRyeSwgUmF3RGF0YSwgVHJhbnNhY3Rpb25SZWNlaXB0LCBUcmFuc2ZlckNvbnRyYWN0LCBUcmlnZ2VyU21hcnRDb250cmFjdCB9IGZyb20gJy4vaWZhY2UnO1xuXG4vKipcbiAqIFRyb24gdHJhbnNhY3Rpb24gbW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIC8vIFRyb24gc3BlY2lmaWMgZmllbGRzXG4gIHByb3RlY3RlZCBfdmFsaWRGcm9tOiBudW1iZXI7XG4gIHByb3RlY3RlZCBfdmFsaWRUbzogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX2lucHV0czogQ29udHJhY3RFbnRyeVtdO1xuICBwcm90ZWN0ZWQgX291dHB1dHM6IENvbnRyYWN0RW50cnlbXTtcblxuICBwcml2YXRlIF9kZWNvZGVkUmF3RGF0YUhleDogUmF3RGF0YTtcbiAgcHJpdmF0ZSBfdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvblJlY2VpcHQ7XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIGNvaW5Db25maWdcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPiwgcmF3VHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvblJlY2VpcHQpIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICBpZiAocmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmICghcmF3VHJhbnNhY3Rpb24udHhJRCkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm8gaWQnKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lkID0gcmF3VHJhbnNhY3Rpb24udHhJRDtcbiAgICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gcmF3VHJhbnNhY3Rpb247XG4gICAgICB0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCA9IGRlY29kZVRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uLnJhd19kYXRhX2hleCk7XG5cbiAgICAgIC8vIERlc3RpbmF0aW9uIGRlcGVuZHMgb24gdGhlIGNvbnRyYWN0IHR5cGVcbiAgICAgIHRoaXMucmVjb3JkUmF3RGF0YUZpZWxkcyh0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSB0cmFuc2FjdGlvbiByYXcgZGF0YSBhbmQgcmVjb3JkIHRoZSBtb3N0IGltcG9ydGFudCBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSByYXdEYXRhIE9iamVjdCBmcm9tIGEgdHJvbiB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJpdmF0ZSByZWNvcmRSYXdEYXRhRmllbGRzKHJhd0RhdGE6IFJhd0RhdGEpIHtcbiAgICAvLyBDb250cmFjdC1hZ25vc3RpYyBmaWVsZHNcbiAgICB0aGlzLl92YWxpZEZyb20gPSByYXdEYXRhLnRpbWVzdGFtcDtcbiAgICB0aGlzLl92YWxpZFRvID0gcmF3RGF0YS5leHBpcmF0aW9uO1xuXG4gICAgbGV0IG91dHB1dDogQ29udHJhY3RFbnRyeSwgaW5wdXQ6IENvbnRyYWN0RW50cnk7XG4gICAgLy8gQ29udHJhY3Qtc3BlY2lmaWMgZmllbGRzXG4gICAgc3dpdGNoIChyYXdEYXRhLmNvbnRyYWN0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuVHJhbnNmZXI6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBuZXcgQmlnTnVtYmVyKChyYXdEYXRhLmNvbnRyYWN0WzBdIGFzIFRyYW5zZmVyQ29udHJhY3QpLnBhcmFtZXRlci52YWx1ZS5hbW91bnQpLnRvRml4ZWQoMCk7XG4gICAgICAgIG91dHB1dCA9IHtcbiAgICAgICAgICBhZGRyZXNzOiAocmF3RGF0YS5jb250cmFjdFswXSBhcyBUcmFuc2ZlckNvbnRyYWN0KS5wYXJhbWV0ZXIudmFsdWUudG9fYWRkcmVzcyxcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogKHJhd0RhdGEuY29udHJhY3RbMF0gYXMgVHJhbnNmZXJDb250cmFjdCkucGFyYW1ldGVyLnZhbHVlLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuQWNjb3VudFBlcm1pc3Npb25VcGRhdGU6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb247XG4gICAgICAgIG91dHB1dCA9IHtcbiAgICAgICAgICBhZGRyZXNzOiAocmF3RGF0YS5jb250cmFjdCBhcyBhbnkpLm93bmVyX2FkZHJlc3MsXG4gICAgICAgICAgdmFsdWU6ICcwJyxcbiAgICAgICAgfTtcbiAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgYWRkcmVzczogKHJhd0RhdGEuY29udHJhY3QgYXMgYW55KS5vd25lcl9hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDb250cmFjdFR5cGUuVHJpZ2dlclNtYXJ0Q29udHJhY3Q6XG4gICAgICAgIHRoaXMuX3R5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgICBjb25zdCBjb250cmFjdENhbGxWYWx1ZXMgPSAocmF3RGF0YS5jb250cmFjdFswXSBhcyBUcmlnZ2VyU21hcnRDb250cmFjdCkucGFyYW1ldGVyLnZhbHVlO1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3MgPSBjb250cmFjdENhbGxWYWx1ZXMuY29udHJhY3RfYWRkcmVzcztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKGNvbnRyYWN0QWRkcmVzcykgfHxcbiAgICAgICAgICB0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcyhjb250cmFjdEFkZHJlc3MpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIHRoaXMgaXMgdGhlbiBhIHRva2VuIHNtYXJ0IGNvbnRyYWN0IHRyYW5zYWN0aW9uIGFuZCB0aGUgZGF0YSBtdXN0IGJlIGRlY29kZWRcbiAgICAgICAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J107XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5mcm9tKGNvbnRyYWN0Q2FsbFZhbHVlcy5kYXRhLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZGVjb2RlRGF0YVBhcmFtcyh0eXBlcywgZGF0YSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50X2FkZHJlc3MgPSBnZXRCYXNlNThBZGRyZXNzRnJvbUhleChkZWNvZGVkRGF0YVswXSk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpO1xuICAgICAgICAgIG91dHB1dCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudF9hZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbnB1dCA9IHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGNvbnRyYWN0Q2FsbFZhbHVlcy5vd25lcl9hZGRyZXNzLFxuICAgICAgICAgICAgY29udHJhY3RBZGRyZXNzLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IGNvbnRyYWN0Q2FsbFZhbHVlcy5vd25lcl9hZGRyZXNzLFxuICAgICAgICAgIHZhbHVlOiAnMCcsXG4gICAgICAgIH07XG4gICAgICAgIGlucHV0ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IGNvbnRyYWN0Q2FsbFZhbHVlcy5vd25lcl9hZGRyZXNzLFxuICAgICAgICAgIGNvbnRyYWN0QWRkcmVzcyxcbiAgICAgICAgICBkYXRhOiBjb250cmFjdENhbGxWYWx1ZXMuZGF0YSxcbiAgICAgICAgICB2YWx1ZTogJzAnLFxuICAgICAgICB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbnRyYWN0IHR5cGUnKTtcbiAgICB9XG4gICAgdGhpcy5faW5wdXRzID0gW2lucHV0XTtcbiAgICB0aGlzLl9vdXRwdXRzID0gW291dHB1dF07XG4gIH1cblxuICAvKipcbiAgICogUmVjYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaWQuIFRoaXMgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgY2hhbmdpbmcgYW55IHRyYW5zYWN0aW9uXG4gICAqIGZpZWxkIHNpbmNlIHRoZSB0aGUgaWQgaXMgYSBoYXNoIG9mIHRoZSB0cmFuc2FjdGlvbiBib2R5LlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICBjb25zdCBoZXhCdWZmZXIgPSBCdWZmZXIuZnJvbSh0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXgsICdoZXgnKTtcbiAgICBjb25zdCBuZXdUeGlkID0gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGhleEJ1ZmZlcikuZGlnZXN0KCdoZXgnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi50eElEID0gbmV3VHhpZDtcbiAgICB0aGlzLl9pZCA9IG5ld1R4aWQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRoZSBleHBpcmF0aW9uIGRhdGUgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBleHRlbnNpb25NcyBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBleHRlbmQgdGhlIGV4cGlyYXRpb24gYnlcbiAgICovXG4gIGV4dGVuZEV4cGlyYXRpb24oZXh0ZW5zaW9uTXM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChleHRlbnNpb25NcyA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFeHRlbmRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIGV4dGVuc2lvbiByYW5nZS4gTXVzdCBiZSBwb3NpdGl2ZSBhIGludGVnZXInKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlICYmIHRoaXMuX3RyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignQ2Fubm90IGV4dGVuZCBhIHNpZ25lZCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJhd0RhdGFIZXggPSB0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXg7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbShyYXdEYXRhSGV4LCAnaGV4Jyk7XG4gICAgbGV0IHJhdztcbiAgICB0cnkge1xuICAgICAgcmF3ID0gcHJvdG9jb2wuVHJhbnNhY3Rpb24ucmF3LmRlY29kZShieXRlcyk7XG4gICAgICBjb25zdCBuZXdFeHBpcmF0aW9uID0gbmV3IEJpZ051bWJlcihyYXcuZXhwaXJhdGlvbikucGx1cyhleHRlbnNpb25NcykudG9OdW1iZXIoKTtcbiAgICAgIHJhdy5leHBpcmF0aW9uID0gbmV3RXhwaXJhdGlvbjtcbiAgICAgIGNvbnN0IG5ld1Jhd0RhdGFIZXggPSBCdWZmZXIuZnJvbShwcm90b2NvbC5UcmFuc2FjdGlvbi5yYXcuZW5jb2RlKHJhdykuZmluaXNoKCkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIC8vIFNldCB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIHRvIGFjY291bnQgZm9yIHRoZSBuZXcgZXhwaXJhdGlvbiBkYXRlXG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5yYXdfZGF0YV9oZXggPSBuZXdSYXdEYXRhSGV4O1xuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24ucmF3X2RhdGEuZXhwaXJhdGlvbiA9IG5ld0V4cGlyYXRpb247XG4gICAgICB0aGlzLl9kZWNvZGVkUmF3RGF0YUhleCA9IGRlY29kZVRyYW5zYWN0aW9uKG5ld1Jhd0RhdGFIZXgpO1xuICAgICAgdGhpcy5yZWNvcmRSYXdEYXRhRmllbGRzKHRoaXMuX2RlY29kZWRSYXdEYXRhSGV4KTtcbiAgICAgIHRoaXMudXBkYXRlSWQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXh0ZW5kVHJhbnNhY3Rpb25FcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIGRlY29kaW5nIHRoZSBpbml0aWFsIHJhd19kYXRhX2hleCBmcm9tIHRoZSBzZXJpYWxpemVkIHR4LicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHNpZ25hdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBnZXQgc2lnbmF0dXJlKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24gJiYgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb24uc2lnbmF0dXJlO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMgdGhpcyB0cmFuc2FjdGlvbiBiZWNvbWVzIHZhbGlkIGFuZCBjYW4gYmUgYnJvYWRjYXN0ZWQgdG8gdGhlXG4gICAqIG5ldHdvcmsuXG4gICAqL1xuICBnZXQgdmFsaWRGcm9tKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkRnJvbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGV4cGlyYXRpb24gdGltZSBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBnZXQgdmFsaWRUbygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92YWxpZFRvO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGdldCBvdXRwdXRzKCk6IENvbnRyYWN0RW50cnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZ2V0IGlucHV0cygpOiBDb250cmFjdEVudHJ5W10ge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dHM7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbihrZXk6IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUcm9uIHRyYW5zYWN0aW9uIGRvIG5vdCBjb250YWluIHRoZSBvd25lcnMgYWNjb3VudCBhZGRyZXNzIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjaGVjayB0aGVcbiAgICAvLyBwcml2YXRlIGtleSB3aXRoIGFueSBidXQgdGhlIGFjY291bnQgbWFpbiBhZGRyZXNzLiBUaGlzIGlzIG5vdCBlbm91Z2ggdG8gZmFpbCB0aGlzIGNoZWNrLCBzb1xuICAgIC8vIGl0IGlzIGEgbm8tb3AuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHR4IHRyYW5zYWN0aW9uXG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblJlY2VpcHQodHg6IFRyYW5zYWN0aW9uUmVjZWlwdCkge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHg7XG4gICAgdGhpcy51cGRhdGVJZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKlxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fdHlwZSA9IHRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0pzb24oKTogVHJhbnNhY3Rpb25SZWNlaXB0IHtcbiAgICBpZiAoIXRoaXMuX3RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogYW55IHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pzb24oKSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import BigNumber from 'bignumber.js';
|
|
2
|
-
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
-
import { BaseKey, BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
|
|
4
|
-
import { TransactionReceipt } from './iface';
|
|
5
|
-
import { Address } from './address';
|
|
6
|
-
import { Transaction } from './transaction';
|
|
7
|
-
/**
|
|
8
|
-
* Tron transaction builder.
|
|
9
|
-
*/
|
|
10
|
-
export declare class TransactionBuilder extends BaseTransactionBuilder {
|
|
11
|
-
private _transaction;
|
|
12
|
-
/**
|
|
13
|
-
* Public constructor.
|
|
14
|
-
*
|
|
15
|
-
* @param {CoinConfig} _coinConfig Configuration object
|
|
16
|
-
*/
|
|
17
|
-
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
18
|
-
/**
|
|
19
|
-
* Parse transaction takes in raw JSON directly from the node.
|
|
20
|
-
*
|
|
21
|
-
* @param {TransactionReceipt} rawTransaction The Tron transaction in JSON format as returned by the Tron lib or a stringifyed version of such JSON.
|
|
22
|
-
* @returns {Transaction} Tron transaction
|
|
23
|
-
*/
|
|
24
|
-
protected fromImplementation(rawTransaction: TransactionReceipt | string): Transaction;
|
|
25
|
-
/** @inheritdoc */
|
|
26
|
-
protected signImplementation(key: BaseKey): Transaction;
|
|
27
|
-
protected applySignature(key: BaseKey): Transaction;
|
|
28
|
-
/** @inheritdoc */
|
|
29
|
-
protected buildImplementation(): Promise<Transaction>;
|
|
30
|
-
initBuilder(tx: TransactionReceipt | string): void;
|
|
31
|
-
/**
|
|
32
|
-
* Extend the validity of this transaction by the given amount of time
|
|
33
|
-
*
|
|
34
|
-
* @param {number} extensionMs The number of milliseconds to extend the validTo time
|
|
35
|
-
* @returns {undefined}
|
|
36
|
-
*/
|
|
37
|
-
extendValidTo(extensionMs: number): void;
|
|
38
|
-
/** @inheritdoc */
|
|
39
|
-
validateValue(value: BigNumber): void;
|
|
40
|
-
/** @inheritdoc */
|
|
41
|
-
validateAddress(address: Address): void;
|
|
42
|
-
/** @inheritdoc */
|
|
43
|
-
validateKey(key: BaseKey): void;
|
|
44
|
-
/**
|
|
45
|
-
* Validate the contents of a raw transaction. The validation
|
|
46
|
-
* phase is to compare the raw-data-hex to the raw-data of the
|
|
47
|
-
* transaction.
|
|
48
|
-
*
|
|
49
|
-
* The contents to be validated are
|
|
50
|
-
* 1. The transaction id
|
|
51
|
-
* 2. The expiration date
|
|
52
|
-
* 3. The timestamp
|
|
53
|
-
* 4. The contract
|
|
54
|
-
*
|
|
55
|
-
* @param {TransactionReceipt | string} rawTransaction The raw transaction to be validated
|
|
56
|
-
*/
|
|
57
|
-
validateRawTransaction(rawTransaction: TransactionReceipt | string): void;
|
|
58
|
-
/** @inheritdoc */
|
|
59
|
-
validateTransaction(transaction: Transaction): void;
|
|
60
|
-
/** @inheritdoc */
|
|
61
|
-
protected get transaction(): Transaction;
|
|
62
|
-
/** @inheritdoc */
|
|
63
|
-
protected set transaction(transaction: Transaction);
|
|
64
|
-
}
|
|
65
|
-
//# sourceMappingURL=transactionBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,OAAO,EACP,sBAAsB,EAKvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;IAE5D,OAAO,CAAC,YAAY,CAAc;IAClC;;;;OAIG;gBACS,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;;OAKG;IACH,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,WAAW;IAWtF,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAWvD,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAuBnD,kBAAkB;cACF,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ3D,WAAW,CAAC,EAAE,EAAE,kBAAkB,GAAG,MAAM;IAI3C;;;;;OAKG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIxC,kBAAkB;IAClB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAWrC,kBAAkB;IAClB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOvC,kBAAkB;IAClB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAQ/B;;;;;;;;;;;;OAYG;IACH,sBAAsB,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI;IA2CzE,kBAAkB;IAClB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAQnD,kBAAkB;IAClB,SAAS,KAAK,WAAW,IAAI,WAAW,CAEvC;IAED,kBAAkB;IAClB,SAAS,KAAK,WAAW,CAAC,WAAW,EAAE,WAAW,EAEjD;CACF"}
|
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
-
}) : (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
o[k2] = m[k];
|
|
8
|
-
}));
|
|
9
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
-
}) : function(o, v) {
|
|
12
|
-
o["default"] = v;
|
|
13
|
-
});
|
|
14
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
-
if (mod && mod.__esModule) return mod;
|
|
16
|
-
var result = {};
|
|
17
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
-
__setModuleDefault(result, mod);
|
|
19
|
-
return result;
|
|
20
|
-
};
|
|
21
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
-
};
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.TransactionBuilder = void 0;
|
|
26
|
-
const crypto_1 = require("crypto");
|
|
27
|
-
const _ = __importStar(require("lodash"));
|
|
28
|
-
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
29
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
30
|
-
const utils_1 = require("./utils");
|
|
31
|
-
const transaction_1 = require("./transaction");
|
|
32
|
-
const keyPair_1 = require("./keyPair");
|
|
33
|
-
/**
|
|
34
|
-
* Tron transaction builder.
|
|
35
|
-
*/
|
|
36
|
-
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
37
|
-
/**
|
|
38
|
-
* Public constructor.
|
|
39
|
-
*
|
|
40
|
-
* @param {CoinConfig} _coinConfig Configuration object
|
|
41
|
-
*/
|
|
42
|
-
constructor(_coinConfig) {
|
|
43
|
-
super(_coinConfig);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Parse transaction takes in raw JSON directly from the node.
|
|
47
|
-
*
|
|
48
|
-
* @param {TransactionReceipt} rawTransaction The Tron transaction in JSON format as returned by the Tron lib or a stringifyed version of such JSON.
|
|
49
|
-
* @returns {Transaction} Tron transaction
|
|
50
|
-
*/
|
|
51
|
-
fromImplementation(rawTransaction) {
|
|
52
|
-
let tx;
|
|
53
|
-
if (typeof rawTransaction === 'string') {
|
|
54
|
-
const transaction = JSON.parse(rawTransaction);
|
|
55
|
-
tx = new transaction_1.Transaction(this._coinConfig, transaction);
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
tx = new transaction_1.Transaction(this._coinConfig, rawTransaction);
|
|
59
|
-
}
|
|
60
|
-
return tx;
|
|
61
|
-
}
|
|
62
|
-
/** @inheritdoc */
|
|
63
|
-
signImplementation(key) {
|
|
64
|
-
if (!this.transaction.inputs) {
|
|
65
|
-
throw new sdk_core_1.SigningError('Transaction has no sender');
|
|
66
|
-
}
|
|
67
|
-
if (!this.transaction.outputs) {
|
|
68
|
-
throw new sdk_core_1.SigningError('Transaction has no receiver');
|
|
69
|
-
}
|
|
70
|
-
return this.applySignature(key);
|
|
71
|
-
}
|
|
72
|
-
applySignature(key) {
|
|
73
|
-
const oldTransaction = this.transaction.toJson();
|
|
74
|
-
// Store the original signatures to compare them with the new ones in a later step. Signatures
|
|
75
|
-
// can be undefined if this is the first time the transaction is being signed
|
|
76
|
-
const oldSignatureCount = oldTransaction.signature ? oldTransaction.signature.length : 0;
|
|
77
|
-
let signedTransaction;
|
|
78
|
-
try {
|
|
79
|
-
const keyPair = new keyPair_1.KeyPair({ prv: key.key });
|
|
80
|
-
// Since the key pair was generated using a private key, it will always have a prv attribute,
|
|
81
|
-
// hence it is safe to use non-null operator
|
|
82
|
-
signedTransaction = utils_1.signTransaction(keyPair.getKeys().prv, this.transaction.toJson());
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
throw new sdk_core_1.SigningError('Failed to sign transaction via helper.');
|
|
86
|
-
}
|
|
87
|
-
// Ensure that we have more signatures than what we started with
|
|
88
|
-
if (!signedTransaction.signature || oldSignatureCount >= signedTransaction.signature.length) {
|
|
89
|
-
throw new sdk_core_1.SigningError('Transaction signing did not return an additional signature.');
|
|
90
|
-
}
|
|
91
|
-
return new transaction_1.Transaction(this._coinConfig, signedTransaction);
|
|
92
|
-
}
|
|
93
|
-
/** @inheritdoc */
|
|
94
|
-
async buildImplementation() {
|
|
95
|
-
// This is a no-op since Tron transactions are built from
|
|
96
|
-
if (!this.transaction.id) {
|
|
97
|
-
throw new sdk_core_1.BuildTransactionError('A valid transaction must have an id');
|
|
98
|
-
}
|
|
99
|
-
return Promise.resolve(this.transaction);
|
|
100
|
-
}
|
|
101
|
-
initBuilder(tx) {
|
|
102
|
-
this.transaction = this.fromImplementation(tx);
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Extend the validity of this transaction by the given amount of time
|
|
106
|
-
*
|
|
107
|
-
* @param {number} extensionMs The number of milliseconds to extend the validTo time
|
|
108
|
-
* @returns {undefined}
|
|
109
|
-
*/
|
|
110
|
-
extendValidTo(extensionMs) {
|
|
111
|
-
this.transaction.extendExpiration(extensionMs);
|
|
112
|
-
}
|
|
113
|
-
/** @inheritdoc */
|
|
114
|
-
validateValue(value) {
|
|
115
|
-
if (value.isLessThanOrEqualTo(0)) {
|
|
116
|
-
throw new Error('Value cannot be below zero.');
|
|
117
|
-
}
|
|
118
|
-
// max long in Java - assumed upper limit for a TRX transaction
|
|
119
|
-
if (value.isGreaterThan(new bignumber_js_1.default('9223372036854775807'))) {
|
|
120
|
-
throw new Error('Value cannot be greater than handled by the javatron node.');
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/** @inheritdoc */
|
|
124
|
-
validateAddress(address) {
|
|
125
|
-
// assumes a base 58 address for our addresses
|
|
126
|
-
if (!utils_1.isBase58Address(address.address)) {
|
|
127
|
-
throw new Error(address.address + ' is not a valid base58 address.');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
/** @inheritdoc */
|
|
131
|
-
validateKey(key) {
|
|
132
|
-
try {
|
|
133
|
-
new keyPair_1.KeyPair({ prv: key.key });
|
|
134
|
-
}
|
|
135
|
-
catch (err) {
|
|
136
|
-
throw new Error('The provided key is not valid');
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Validate the contents of a raw transaction. The validation
|
|
141
|
-
* phase is to compare the raw-data-hex to the raw-data of the
|
|
142
|
-
* transaction.
|
|
143
|
-
*
|
|
144
|
-
* The contents to be validated are
|
|
145
|
-
* 1. The transaction id
|
|
146
|
-
* 2. The expiration date
|
|
147
|
-
* 3. The timestamp
|
|
148
|
-
* 4. The contract
|
|
149
|
-
*
|
|
150
|
-
* @param {TransactionReceipt | string} rawTransaction The raw transaction to be validated
|
|
151
|
-
*/
|
|
152
|
-
validateRawTransaction(rawTransaction) {
|
|
153
|
-
// TODO: Validation of signature
|
|
154
|
-
if (!rawTransaction) {
|
|
155
|
-
throw new sdk_core_1.InvalidTransactionError('Raw transaction is empty');
|
|
156
|
-
}
|
|
157
|
-
let currTransaction;
|
|
158
|
-
// rawTransaction can be either Stringified JSON OR
|
|
159
|
-
// it can be a regular JSON object (not stringified).
|
|
160
|
-
if (typeof rawTransaction === 'string') {
|
|
161
|
-
try {
|
|
162
|
-
currTransaction = JSON.parse(rawTransaction);
|
|
163
|
-
}
|
|
164
|
-
catch (e) {
|
|
165
|
-
throw new sdk_core_1.ParseTransactionError('There was error in parsing the JSON string');
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else if (_.isObject(rawTransaction)) {
|
|
169
|
-
currTransaction = rawTransaction;
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction is not an object or stringified json');
|
|
173
|
-
}
|
|
174
|
-
const decodedRawDataHex = utils_1.decodeTransaction(currTransaction.raw_data_hex);
|
|
175
|
-
if (!currTransaction.txID) {
|
|
176
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction ID is empty');
|
|
177
|
-
}
|
|
178
|
-
// Validate the transaction ID from the raw data hex
|
|
179
|
-
const hexBuffer = Buffer.from(currTransaction.raw_data_hex, 'hex');
|
|
180
|
-
const currTxID = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
|
|
181
|
-
if (currTransaction.txID !== currTxID) {
|
|
182
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid id');
|
|
183
|
-
}
|
|
184
|
-
// Validate the expiration time from the raw-data-hex
|
|
185
|
-
if (currTransaction.raw_data.expiration !== decodedRawDataHex.expiration) {
|
|
186
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid expiration');
|
|
187
|
-
}
|
|
188
|
-
// Validate the timestamp from the raw-data-hex
|
|
189
|
-
if (currTransaction.raw_data.timestamp !== decodedRawDataHex.timestamp) {
|
|
190
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction has not have a valid timetamp');
|
|
191
|
-
}
|
|
192
|
-
// Transaction contract must exist
|
|
193
|
-
if (!currTransaction.raw_data.contract) {
|
|
194
|
-
throw new sdk_core_1.InvalidTransactionError('Transaction contracts are empty');
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
/** @inheritdoc */
|
|
198
|
-
validateTransaction(transaction) {
|
|
199
|
-
const hexBuffer = Buffer.from(transaction.toJson().raw_data_hex, 'hex');
|
|
200
|
-
const txId = crypto_1.createHash('sha256').update(hexBuffer).digest('hex');
|
|
201
|
-
if (transaction.id !== txId) {
|
|
202
|
-
throw new sdk_core_1.InvalidTransactionError(transaction.id + ' is not a valid transaction id. Expecting: ' + txId);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
/** @inheritdoc */
|
|
206
|
-
get transaction() {
|
|
207
|
-
return this._transaction;
|
|
208
|
-
}
|
|
209
|
-
/** @inheritdoc */
|
|
210
|
-
set transaction(transaction) {
|
|
211
|
-
this._transaction = transaction;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
exports.TransactionBuilder = TransactionBuilder;
|
|
215
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUFvQztBQUNwQywwQ0FBNEI7QUFDNUIsZ0VBQXFDO0FBRXJDLG1EQU84QjtBQUc5QixtQ0FBOEU7QUFDOUUsK0NBQTRDO0FBQzVDLHVDQUFvQztBQUVwQzs7R0FFRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsaUNBQXNCO0lBRzVEOzs7O09BSUc7SUFDSCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxrQkFBa0IsQ0FBQyxjQUEyQztRQUN0RSxJQUFJLEVBQUUsQ0FBQztRQUNQLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDL0MsRUFBRSxHQUFHLElBQUkseUJBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1NBQ3JEO2FBQU07WUFDTCxFQUFFLEdBQUcsSUFBSSx5QkFBVyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDeEQ7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxrQkFBa0I7SUFDUixrQkFBa0IsQ0FBQyxHQUFZO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUM1QixNQUFNLElBQUksdUJBQVksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQzdCLE1BQU0sSUFBSSx1QkFBWSxDQUFDLDZCQUE2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V0FBVyxDQUFDLFdBQXdCO1FBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7Q0FDRjtBQTlMRCxnREE4TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbkJ1aWxkZXIsXG4gIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcixcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblJlY2VpcHQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICcuL2FkZHJlc3MnO1xuaW1wb3J0IHsgc2lnblRyYW5zYWN0aW9uLCBpc0Jhc2U1OEFkZHJlc3MsIGRlY29kZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5cbi8qKlxuICogVHJvbiB0cmFuc2FjdGlvbiBidWlsZGVyLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIC8vIHRyYW5zYWN0aW9uIGJlaW5nIGJ1aWx0XG4gIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbjtcbiAgLyoqXG4gICAqIFB1YmxpYyBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHtDb2luQ29uZmlnfSBfY29pbkNvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRyYW5zYWN0aW9uIHRha2VzIGluIHJhdyBKU09OIGRpcmVjdGx5IGZyb20gdGhlIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25SZWNlaXB0fSByYXdUcmFuc2FjdGlvbiBUaGUgVHJvbiB0cmFuc2FjdGlvbiBpbiBKU09OIGZvcm1hdCBhcyByZXR1cm5lZCBieSB0aGUgVHJvbiBsaWIgb3IgYSBzdHJpbmdpZnllZCB2ZXJzaW9uIG9mIHN1Y2ggSlNPTi5cbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9ufSBUcm9uIHRyYW5zYWN0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblJlY2VpcHQgfCBzdHJpbmcpOiBUcmFuc2FjdGlvbiB7XG4gICAgbGV0IHR4O1xuICAgIGlmICh0eXBlb2YgcmF3VHJhbnNhY3Rpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IEpTT04ucGFyc2UocmF3VHJhbnNhY3Rpb24pO1xuICAgICAgdHggPSBuZXcgVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgdHJhbnNhY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0eCA9IG5ldyBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCByYXdUcmFuc2FjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2lnbkltcGxlbWVudGF0aW9uKGtleTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uaW5wdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm8gc2VuZGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLm91dHB1dHMpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ1RyYW5zYWN0aW9uIGhhcyBubyByZWNlaXZlcicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hcHBseVNpZ25hdHVyZShrZXkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFwcGx5U2lnbmF0dXJlKGtleTogQmFzZUtleSk6IFRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCBvbGRUcmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb24udG9Kc29uKCk7XG4gICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIHNpZ25hdHVyZXMgdG8gY29tcGFyZSB0aGVtIHdpdGggdGhlIG5ldyBvbmVzIGluIGEgbGF0ZXIgc3RlcC4gU2lnbmF0dXJlc1xuICAgIC8vIGNhbiBiZSB1bmRlZmluZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgdHJhbnNhY3Rpb24gaXMgYmVpbmcgc2lnbmVkXG4gICAgY29uc3Qgb2xkU2lnbmF0dXJlQ291bnQgPSBvbGRUcmFuc2FjdGlvbi5zaWduYXR1cmUgPyBvbGRUcmFuc2FjdGlvbi5zaWduYXR1cmUubGVuZ3RoIDogMDtcbiAgICBsZXQgc2lnbmVkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uUmVjZWlwdDtcbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkua2V5IH0pO1xuICAgICAgLy8gU2luY2UgdGhlIGtleSBwYWlyIHdhcyBnZW5lcmF0ZWQgdXNpbmcgYSBwcml2YXRlIGtleSwgaXQgd2lsbCBhbHdheXMgaGF2ZSBhIHBydiBhdHRyaWJ1dGUsXG4gICAgICAvLyBoZW5jZSBpdCBpcyBzYWZlIHRvIHVzZSBub24tbnVsbCBvcGVyYXRvclxuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSBzaWduVHJhbnNhY3Rpb24oa2V5UGFpci5nZXRLZXlzKCkucHJ2ISwgdGhpcy50cmFuc2FjdGlvbi50b0pzb24oKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignRmFpbGVkIHRvIHNpZ24gdHJhbnNhY3Rpb24gdmlhIGhlbHBlci4nKTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhhdCB3ZSBoYXZlIG1vcmUgc2lnbmF0dXJlcyB0aGFuIHdoYXQgd2Ugc3RhcnRlZCB3aXRoXG4gICAgaWYgKCFzaWduZWRUcmFuc2FjdGlvbi5zaWduYXR1cmUgfHwgb2xkU2lnbmF0dXJlQ291bnQgPj0gc2lnbmVkVHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignVHJhbnNhY3Rpb24gc2lnbmluZyBkaWQgbm90IHJldHVybiBhbiBhZGRpdGlvbmFsIHNpZ25hdHVyZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHNpZ25lZFRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPiB7XG4gICAgLy8gVGhpcyBpcyBhIG5vLW9wIHNpbmNlIFRyb24gdHJhbnNhY3Rpb25zIGFyZSBidWlsdCBmcm9tXG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLmlkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBIHZhbGlkIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBhbiBpZCcpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uUmVjZWlwdCB8IHN0cmluZykge1xuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzLmZyb21JbXBsZW1lbnRhdGlvbih0eCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0ZW5kIHRoZSB2YWxpZGl0eSBvZiB0aGlzIHRyYW5zYWN0aW9uIGJ5IHRoZSBnaXZlbiBhbW91bnQgb2YgdGltZVxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZXh0ZW5zaW9uTXMgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZXh0ZW5kIHRoZSB2YWxpZFRvIHRpbWVcbiAgICogQHJldHVybnMge3VuZGVmaW5lZH1cbiAgICovXG4gIGV4dGVuZFZhbGlkVG8oZXh0ZW5zaW9uTXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uZXh0ZW5kRXhwaXJhdGlvbihleHRlbnNpb25Ncyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW5PckVxdWFsVG8oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgY2Fubm90IGJlIGJlbG93IHplcm8uJyk7XG4gICAgfVxuXG4gICAgLy8gbWF4IGxvbmcgaW4gSmF2YSAtIGFzc3VtZWQgdXBwZXIgbGltaXQgZm9yIGEgVFJYIHRyYW5zYWN0aW9uXG4gICAgaWYgKHZhbHVlLmlzR3JlYXRlclRoYW4obmV3IEJpZ051bWJlcignOTIyMzM3MjAzNjg1NDc3NTgwNycpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGhhbmRsZWQgYnkgdGhlIGphdmF0cm9uIG5vZGUuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgLy8gYXNzdW1lcyBhIGJhc2UgNTggYWRkcmVzcyBmb3Igb3VyIGFkZHJlc3Nlc1xuICAgIGlmICghaXNCYXNlNThBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihhZGRyZXNzLmFkZHJlc3MgKyAnIGlzIG5vdCBhIHZhbGlkIGJhc2U1OCBhZGRyZXNzLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZUtleShrZXk6IEJhc2VLZXkpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgbmV3IEtleVBhaXIoeyBwcnY6IGtleS5rZXkgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBrZXkgaXMgbm90IHZhbGlkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiBhIHJhdyB0cmFuc2FjdGlvbi4gVGhlIHZhbGlkYXRpb25cbiAgICogcGhhc2UgaXMgdG8gY29tcGFyZSB0aGUgcmF3LWRhdGEtaGV4IHRvIHRoZSByYXctZGF0YSBvZiB0aGVcbiAgICogdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZSBjb250ZW50cyB0byBiZSB2YWxpZGF0ZWQgYXJlXG4gICAqIDEuIFRoZSB0cmFuc2FjdGlvbiBpZFxuICAgKiAyLiBUaGUgZXhwaXJhdGlvbiBkYXRlXG4gICAqIDMuIFRoZSB0aW1lc3RhbXBcbiAgICogNC4gVGhlIGNvbnRyYWN0XG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25SZWNlaXB0IHwgc3RyaW5nfSByYXdUcmFuc2FjdGlvbiBUaGUgcmF3IHRyYW5zYWN0aW9uIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogVHJhbnNhY3Rpb25SZWNlaXB0IHwgc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gVE9ETzogVmFsaWRhdGlvbiBvZiBzaWduYXR1cmVcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBsZXQgY3VyclRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblJlY2VpcHQ7XG4gICAgLy8gcmF3VHJhbnNhY3Rpb24gY2FuIGJlIGVpdGhlciBTdHJpbmdpZmllZCBKU09OIE9SXG4gICAgLy8gaXQgY2FuIGJlIGEgcmVndWxhciBKU09OIG9iamVjdCAobm90IHN0cmluZ2lmaWVkKS5cbiAgICBpZiAodHlwZW9mIHJhd1RyYW5zYWN0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY3VyclRyYW5zYWN0aW9uID0gSlNPTi5wYXJzZShyYXdUcmFuc2FjdGlvbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ1RoZXJlIHdhcyBlcnJvciBpbiBwYXJzaW5nIHRoZSBKU09OIHN0cmluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXy5pc09iamVjdChyYXdUcmFuc2FjdGlvbikpIHtcbiAgICAgIGN1cnJUcmFuc2FjdGlvbiA9IHJhd1RyYW5zYWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG5vdCBhbiBvYmplY3Qgb3Igc3RyaW5naWZpZWQganNvbicpO1xuICAgIH1cbiAgICBjb25zdCBkZWNvZGVkUmF3RGF0YUhleCA9IGRlY29kZVRyYW5zYWN0aW9uKGN1cnJUcmFuc2FjdGlvbi5yYXdfZGF0YV9oZXgpO1xuICAgIGlmICghY3VyclRyYW5zYWN0aW9uLnR4SUQpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gSUQgaXMgZW1wdHknKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uIElEIGZyb20gdGhlIHJhdyBkYXRhIGhleFxuICAgIGNvbnN0IGhleEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGN1cnJUcmFuc2FjdGlvbi5yYXdfZGF0YV9oZXgsICdoZXgnKTtcbiAgICBjb25zdCBjdXJyVHhJRCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShoZXhCdWZmZXIpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgaWYgKGN1cnJUcmFuc2FjdGlvbi50eElEICE9PSBjdXJyVHhJRCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm90IGhhdmUgYSB2YWxpZCBpZCcpO1xuICAgIH1cbiAgICAvLyBWYWxpZGF0ZSB0aGUgZXhwaXJhdGlvbiB0aW1lIGZyb20gdGhlIHJhdy1kYXRhLWhleFxuICAgIGlmIChjdXJyVHJhbnNhY3Rpb24ucmF3X2RhdGEuZXhwaXJhdGlvbiAhPT0gZGVjb2RlZFJhd0RhdGFIZXguZXhwaXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm90IGhhdmUgYSB2YWxpZCBleHBpcmF0aW9uJyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgcmF3LWRhdGEtaGV4XG4gICAgaWYgKGN1cnJUcmFuc2FjdGlvbi5yYXdfZGF0YS50aW1lc3RhbXAgIT09IGRlY29kZWRSYXdEYXRhSGV4LnRpbWVzdGFtcCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBoYXMgbm90IGhhdmUgYSB2YWxpZCB0aW1ldGFtcCcpO1xuICAgIH1cbiAgICAvLyBUcmFuc2FjdGlvbiBjb250cmFjdCBtdXN0IGV4aXN0XG4gICAgaWYgKCFjdXJyVHJhbnNhY3Rpb24ucmF3X2RhdGEuY29udHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gY29udHJhY3RzIGFyZSBlbXB0eScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGhleEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLnRvSnNvbigpLnJhd19kYXRhX2hleCwgJ2hleCcpO1xuICAgIGNvbnN0IHR4SWQgPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGV4QnVmZmVyKS5kaWdlc3QoJ2hleCcpO1xuICAgIGlmICh0cmFuc2FjdGlvbi5pZCAhPT0gdHhJZCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKHRyYW5zYWN0aW9uLmlkICsgJyBpcyBub3QgYSB2YWxpZCB0cmFuc2FjdGlvbiBpZC4gRXhwZWN0aW5nOiAnICsgdHhJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgc2V0IHRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cbn1cbiJdfQ==
|