@bitgo-beta/sdk-coin-flrp 1.0.1-beta.21 → 1.0.1-beta.211
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/src/flrp.d.ts +82 -61
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +293 -134
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -6
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +233 -29
- package/dist/src/lib/constants.d.ts +160 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +213 -3
- package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +224 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +46 -17
- package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInPTxBuilder.js +70 -6
- package/dist/src/lib/iface.d.ts +52 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +403 -0
- package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
- package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInPTxBuilder.js +464 -0
- package/dist/src/lib/index.d.ts +7 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +15 -2
- package/dist/src/lib/keyPair.d.ts +4 -4
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +12 -10
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
- package/dist/src/lib/transaction.d.ts +111 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +322 -0
- package/dist/src/lib/transactionBuilder.d.ts +85 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +167 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +91 -0
- package/dist/src/lib/types.d.ts +78 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +5 -0
- package/dist/src/lib/utils.d.ts +81 -19
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +286 -93
- package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +180 -0
- package/dist/test/resources/account.d.ts +49 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +52 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.js +37 -11
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +258 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +501 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +460 -0
- package/dist/test/unit/lib/utils.js +176 -43
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +114 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/validatorTxBuilder.test.js +293 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -13
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
|
@@ -0,0 +1,322 @@
|
|
|
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 buffer_1 = require("buffer");
|
|
9
|
+
const iface_1 = require("./iface");
|
|
10
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
11
|
+
const constants_1 = require("./constants");
|
|
12
|
+
/**
|
|
13
|
+
* Flare P-chain transaction implementation using FlareJS
|
|
14
|
+
* Based on AVAX transaction patterns adapted for Flare network
|
|
15
|
+
*/
|
|
16
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
17
|
+
constructor(coinConfig) {
|
|
18
|
+
super(coinConfig);
|
|
19
|
+
this._threshold = 2;
|
|
20
|
+
this._locktime = BigInt(0);
|
|
21
|
+
this._fromAddresses = [];
|
|
22
|
+
this._rewardAddresses = [];
|
|
23
|
+
this._utxos = [];
|
|
24
|
+
this._fee = {};
|
|
25
|
+
this._memo = new Uint8Array(); // FlareJS memo field
|
|
26
|
+
this._network = coinConfig.network;
|
|
27
|
+
this._assetId = constants_1.FLR_ASSET_ID; // Default FLR asset
|
|
28
|
+
this._blockchainID = this._network.blockchainID || '';
|
|
29
|
+
this._networkID = this._network.networkID || 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the base transaction from FlareJS UnsignedTx
|
|
33
|
+
* TODO: Implement proper FlareJS transaction extraction
|
|
34
|
+
*/
|
|
35
|
+
get flareTransaction() {
|
|
36
|
+
return this._flareTransaction;
|
|
37
|
+
}
|
|
38
|
+
get signature() {
|
|
39
|
+
if (this.credentials.length === 0) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
// TODO: Extract signatures from FlareJS credentials
|
|
43
|
+
// For now, return placeholder
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
get credentials() {
|
|
47
|
+
// TODO: Extract credentials from FlareJS transaction
|
|
48
|
+
// For now, return empty array
|
|
49
|
+
return [];
|
|
50
|
+
}
|
|
51
|
+
get hasCredentials() {
|
|
52
|
+
return this.credentials !== undefined && this.credentials.length > 0;
|
|
53
|
+
}
|
|
54
|
+
/** @inheritdoc */
|
|
55
|
+
canSign({ key }) {
|
|
56
|
+
// TODO: Implement proper signing validation for FlareJS
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sign a Flare transaction using FlareJS
|
|
61
|
+
* @param {KeyPair} keyPair
|
|
62
|
+
*/
|
|
63
|
+
async sign(keyPair) {
|
|
64
|
+
const prv = keyPair.getPrivateKey();
|
|
65
|
+
if (!prv) {
|
|
66
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
67
|
+
}
|
|
68
|
+
if (!this.flareTransaction) {
|
|
69
|
+
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
|
|
70
|
+
}
|
|
71
|
+
if (!this.hasCredentials) {
|
|
72
|
+
throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
|
|
73
|
+
}
|
|
74
|
+
// TODO: Implement FlareJS signing process
|
|
75
|
+
// This will involve:
|
|
76
|
+
// 1. Creating FlareJS signature using private key
|
|
77
|
+
// 2. Attaching signature to appropriate credential
|
|
78
|
+
// 3. Updating transaction with signed credentials
|
|
79
|
+
throw new Error('FlareJS signing not yet implemented - placeholder');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set memo from string
|
|
83
|
+
* @param {string} memo - Memo text
|
|
84
|
+
*/
|
|
85
|
+
setMemo(memo) {
|
|
86
|
+
this._memo = utils_1.default.stringToBytes(memo);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Set memo from various formats
|
|
90
|
+
* @param {string | Record<string, unknown> | Uint8Array} memo - Memo data
|
|
91
|
+
*/
|
|
92
|
+
setMemoData(memo) {
|
|
93
|
+
this._memo = utils_1.default.createMemoBytes(memo);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get memo as bytes (FlareJS format)
|
|
97
|
+
* @returns {Uint8Array} Memo bytes
|
|
98
|
+
*/
|
|
99
|
+
getMemoBytes() {
|
|
100
|
+
return this._memo;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get memo as string
|
|
104
|
+
* @returns {string} Memo string
|
|
105
|
+
*/
|
|
106
|
+
getMemoString() {
|
|
107
|
+
return utils_1.default.parseMemoBytes(this._memo);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Check if transaction has memo
|
|
111
|
+
* @returns {boolean} Whether memo exists and is not empty
|
|
112
|
+
*/
|
|
113
|
+
hasMemo() {
|
|
114
|
+
return this._memo.length > 0;
|
|
115
|
+
}
|
|
116
|
+
toHexString(byteArray) {
|
|
117
|
+
return buffer_1.Buffer.from(byteArray).toString(constants_1.HEX_ENCODING);
|
|
118
|
+
}
|
|
119
|
+
/** @inheritdoc */
|
|
120
|
+
toBroadcastFormat() {
|
|
121
|
+
if (!this.flareTransaction) {
|
|
122
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
123
|
+
}
|
|
124
|
+
// TODO: Implement FlareJS transaction serialization
|
|
125
|
+
// For now, return placeholder
|
|
126
|
+
return constants_1.FLARE_TX_HEX_PLACEHOLDER;
|
|
127
|
+
}
|
|
128
|
+
toJson() {
|
|
129
|
+
if (!this.flareTransaction) {
|
|
130
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
id: this.id,
|
|
134
|
+
inputs: this.inputs,
|
|
135
|
+
fromAddresses: this.fromAddresses,
|
|
136
|
+
threshold: this._threshold,
|
|
137
|
+
locktime: this._locktime.toString(),
|
|
138
|
+
type: this.type,
|
|
139
|
+
signatures: this.signature,
|
|
140
|
+
outputs: this.outputs,
|
|
141
|
+
changeOutputs: this.changeOutputs,
|
|
142
|
+
sourceChain: this._network.blockchainID,
|
|
143
|
+
destinationChain: this._network.cChainBlockchainID,
|
|
144
|
+
memo: this.getMemoString(), // Include memo in JSON representation
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
setTransaction(tx) {
|
|
148
|
+
this._flareTransaction = tx;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Set the transaction type
|
|
152
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
153
|
+
*/
|
|
154
|
+
setTransactionType(transactionType) {
|
|
155
|
+
const supportedTypes = [
|
|
156
|
+
sdk_core_1.TransactionType.Export,
|
|
157
|
+
sdk_core_1.TransactionType.Import,
|
|
158
|
+
sdk_core_1.TransactionType.AddValidator,
|
|
159
|
+
sdk_core_1.TransactionType.AddDelegator,
|
|
160
|
+
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
161
|
+
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
162
|
+
];
|
|
163
|
+
if (!supportedTypes.includes(transactionType)) {
|
|
164
|
+
throw new Error(`Transaction type ${transactionType} is not supported`);
|
|
165
|
+
}
|
|
166
|
+
this._type = transactionType;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
170
|
+
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
171
|
+
*/
|
|
172
|
+
get signablePayload() {
|
|
173
|
+
if (!this.flareTransaction) {
|
|
174
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction for signing');
|
|
175
|
+
}
|
|
176
|
+
// TODO: Implement FlareJS signable payload extraction
|
|
177
|
+
// For now, return placeholder
|
|
178
|
+
return buffer_1.Buffer.from(constants_1.FLARE_SIGNABLE_PAYLOAD);
|
|
179
|
+
}
|
|
180
|
+
get id() {
|
|
181
|
+
if (!this.flareTransaction) {
|
|
182
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction for ID generation');
|
|
183
|
+
}
|
|
184
|
+
// TODO: Implement FlareJS transaction ID generation
|
|
185
|
+
// For now, return placeholder
|
|
186
|
+
return constants_1.FLARE_TRANSACTION_ID_PLACEHOLDER;
|
|
187
|
+
}
|
|
188
|
+
get fromAddresses() {
|
|
189
|
+
return this._fromAddresses.map((address) => {
|
|
190
|
+
// TODO: Format addresses using FlareJS utilities
|
|
191
|
+
return address;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
get rewardAddresses() {
|
|
195
|
+
return this._rewardAddresses.map((address) => {
|
|
196
|
+
// TODO: Format addresses using FlareJS utilities
|
|
197
|
+
return address;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
202
|
+
*/
|
|
203
|
+
get outputs() {
|
|
204
|
+
switch (this.type) {
|
|
205
|
+
case sdk_core_1.TransactionType.Export:
|
|
206
|
+
// TODO: Extract export outputs from FlareJS transaction
|
|
207
|
+
return [];
|
|
208
|
+
case sdk_core_1.TransactionType.Import:
|
|
209
|
+
// TODO: Extract import outputs from FlareJS transaction
|
|
210
|
+
return [];
|
|
211
|
+
case sdk_core_1.TransactionType.AddValidator:
|
|
212
|
+
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
213
|
+
// TODO: Extract validator outputs from FlareJS transaction
|
|
214
|
+
return [
|
|
215
|
+
{
|
|
216
|
+
address: this._nodeID || constants_1.PLACEHOLDER_NODE_ID,
|
|
217
|
+
value: this._stakeAmount?.toString() || '0',
|
|
218
|
+
},
|
|
219
|
+
];
|
|
220
|
+
case sdk_core_1.TransactionType.AddDelegator:
|
|
221
|
+
case sdk_core_1.TransactionType.AddPermissionlessDelegator:
|
|
222
|
+
// TODO: Extract delegator outputs from FlareJS transaction
|
|
223
|
+
return [
|
|
224
|
+
{
|
|
225
|
+
address: this._nodeID || constants_1.PLACEHOLDER_NODE_ID,
|
|
226
|
+
value: this._stakeAmount?.toString() || '0',
|
|
227
|
+
},
|
|
228
|
+
];
|
|
229
|
+
default:
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
get fee() {
|
|
234
|
+
return { fee: '0', ...this._fee };
|
|
235
|
+
}
|
|
236
|
+
get changeOutputs() {
|
|
237
|
+
// TODO: Extract change outputs from FlareJS transaction
|
|
238
|
+
// For now, return empty array
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
get inputs() {
|
|
242
|
+
// TODO: Extract inputs from FlareJS transaction
|
|
243
|
+
// For now, return placeholder based on UTXOs
|
|
244
|
+
return this._utxos.map((utxo) => ({
|
|
245
|
+
id: utxo.txid + iface_1.INPUT_SEPARATOR + utxo.outputidx,
|
|
246
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
247
|
+
value: utxo.amount,
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Flare wrapper to create signature and return it for credentials
|
|
252
|
+
* @param prv
|
|
253
|
+
* @return hexstring
|
|
254
|
+
*/
|
|
255
|
+
createSignature(prv) {
|
|
256
|
+
// TODO: Implement FlareJS signature creation
|
|
257
|
+
// This should use FlareJS signing utilities
|
|
258
|
+
const signval = utils_1.default.createSignature(this._network, this.signablePayload, prv);
|
|
259
|
+
return signval.toString(constants_1.HEX_ENCODING);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Check if transaction is for C-chain (cross-chain)
|
|
263
|
+
*/
|
|
264
|
+
get isTransactionForCChain() {
|
|
265
|
+
return this.type === sdk_core_1.TransactionType.Export || this.type === sdk_core_1.TransactionType.Import;
|
|
266
|
+
}
|
|
267
|
+
/** @inheritdoc */
|
|
268
|
+
explainTransaction() {
|
|
269
|
+
const txJson = this.toJson();
|
|
270
|
+
const displayOrder = [...constants_1.DISPLAY_ORDER_BASE];
|
|
271
|
+
// Add memo to display order if present
|
|
272
|
+
if (this.hasMemo()) {
|
|
273
|
+
displayOrder.push(constants_1.MEMO_FIELD);
|
|
274
|
+
}
|
|
275
|
+
// Calculate total output amount
|
|
276
|
+
const outputAmount = txJson.outputs
|
|
277
|
+
.reduce((sum, output) => {
|
|
278
|
+
return sum + BigInt(output.value || '0');
|
|
279
|
+
}, BigInt(0))
|
|
280
|
+
.toString();
|
|
281
|
+
// Calculate total change amount
|
|
282
|
+
const changeAmount = txJson.changeOutputs
|
|
283
|
+
.reduce((sum, output) => {
|
|
284
|
+
return sum + BigInt(output.value || '0');
|
|
285
|
+
}, BigInt(0))
|
|
286
|
+
.toString();
|
|
287
|
+
let rewardAddresses;
|
|
288
|
+
const stakingTypes = [
|
|
289
|
+
sdk_core_1.TransactionType.AddValidator,
|
|
290
|
+
sdk_core_1.TransactionType.AddDelegator,
|
|
291
|
+
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
292
|
+
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
293
|
+
];
|
|
294
|
+
if (stakingTypes.includes(txJson.type)) {
|
|
295
|
+
rewardAddresses = this.rewardAddresses;
|
|
296
|
+
displayOrder.splice(6, 0, constants_1.REWARD_ADDRESSES_FIELD);
|
|
297
|
+
}
|
|
298
|
+
// Add cross-chain information for export/import
|
|
299
|
+
if (this.isTransactionForCChain) {
|
|
300
|
+
displayOrder.push(constants_1.SOURCE_CHAIN_FIELD, constants_1.DESTINATION_CHAIN_FIELD);
|
|
301
|
+
}
|
|
302
|
+
const explanation = {
|
|
303
|
+
displayOrder,
|
|
304
|
+
id: txJson.id,
|
|
305
|
+
inputs: txJson.inputs,
|
|
306
|
+
outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
307
|
+
outputAmount,
|
|
308
|
+
changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
309
|
+
changeAmount,
|
|
310
|
+
rewardAddresses,
|
|
311
|
+
fee: this.fee,
|
|
312
|
+
type: txJson.type,
|
|
313
|
+
};
|
|
314
|
+
// Add memo to explanation if present
|
|
315
|
+
if (this.hasMemo()) {
|
|
316
|
+
explanation.memo = this.getMemoString();
|
|
317
|
+
}
|
|
318
|
+
return explanation;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
exports.Transaction = Transaction;
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUU5QixtQ0FBZ0M7QUFDaEMsbUNBUWlCO0FBRWpCLG9EQUE0QjtBQUM1QiwyQ0FZcUI7QUFFckI7OztHQUdHO0FBQ0gsTUFBYSxXQUFZLFNBQVEsMEJBQWU7SUFzQjlDLFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBWmIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLGNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDOUIscUJBQWdCLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLFdBQU0sR0FBcUIsRUFBRSxDQUFDO1FBRTlCLFNBQUksR0FBNEIsRUFBRSxDQUFDO1FBR25DLFVBQUssR0FBZSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMscUJBQXFCO1FBSWhFLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLE9BQXVCLENBQUM7UUFDbkQsSUFBSSxDQUFDLFFBQVEsR0FBRyx3QkFBWSxDQUFDLENBQUMsb0JBQW9CO1FBQ2xELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBK0IsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLEVBQUUs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QUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDbkIsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQTVXRCxrQ0E0V0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVbnNpZ25lZFR4LCBDcmVkZW50aWFsIH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uRmVlLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEZsYXJlTmV0d29yaywgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7XG4gIEFERFJFU1NfU0VQQVJBVE9SLFxuICBEZWNvZGVkVXR4b09iaixcbiAgSU5QVVRfU0VQQVJBVE9SLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBUeCxcbiAgVHhEYXRhLFxuICBGbHJwRW50cnksXG59IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge1xuICBGTFJfQVNTRVRfSUQsXG4gIEZMQVJFX1RYX0hFWF9QTEFDRUhPTERFUixcbiAgRkxBUkVfU0lHTkFCTEVfUEFZTE9BRCxcbiAgRkxBUkVfVFJBTlNBQ1RJT05fSURfUExBQ0VIT0xERVIsXG4gIFBMQUNFSE9MREVSX05PREVfSUQsXG4gIEhFWF9FTkNPRElORyxcbiAgTUVNT19GSUVMRCxcbiAgRElTUExBWV9PUkRFUl9CQVNFLFxuICBSRVdBUkRfQUREUkVTU0VTX0ZJRUxELFxuICBTT1VSQ0VfQ0hBSU5fRklFTEQsXG4gIERFU1RJTkFUSU9OX0NIQUlOX0ZJRUxELFxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogRmxhcmUgUC1jaGFpbiB0cmFuc2FjdGlvbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBGbGFyZUpTXG4gKiBCYXNlZCBvbiBBVkFYIHRyYW5zYWN0aW9uIHBhdHRlcm5zIGFkYXB0ZWQgZm9yIEZsYXJlIG5ldHdvcmtcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9mbGFyZVRyYW5zYWN0aW9uOiBUeDtcbiAgcHVibGljIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHB1YmxpYyBfbmV0d29yazogRmxhcmVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IHN0cmluZztcbiAgcHVibGljIF9ibG9ja2NoYWluSUQ6IHN0cmluZztcbiAgcHVibGljIF9ub2RlSUQ6IHN0cmluZztcbiAgcHVibGljIF9zdGFydFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9lbmRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfc3Rha2VBbW91bnQ6IGJpZ2ludDtcbiAgcHVibGljIF90aHJlc2hvbGQgPSAyO1xuICBwdWJsaWMgX2xvY2t0aW1lID0gQmlnSW50KDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IHN0cmluZ1tdO1xuICBwdWJsaWMgX2ZlZTogUGFydGlhbDxUcmFuc2FjdGlvbkZlZT4gPSB7fTtcbiAgcHVibGljIF9ibHNQdWJsaWNLZXk6IHN0cmluZztcbiAgcHVibGljIF9ibHNTaWduYXR1cmU6IHN0cmluZztcbiAgcHVibGljIF9tZW1vOiBVaW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoKTsgLy8gRmxhcmVKUyBtZW1vIGZpZWxkXG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEZsYXJlTmV0d29yaztcbiAgICB0aGlzLl9hc3NldElkID0gRkxSX0FTU0VUX0lEOyAvLyBEZWZhdWx0IEZMUiBhc3NldFxuICAgIHRoaXMuX2Jsb2NrY2hhaW5JRCA9IHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEIHx8ICcnO1xuICAgIHRoaXMuX25ldHdvcmtJRCA9IHRoaXMuX25ldHdvcmsubmV0d29ya0lEIHx8IDA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiYXNlIHRyYW5zYWN0aW9uIGZyb20gRmxhcmVKUyBVbnNpZ25lZFR4XG4gICAqIFRPRE86IEltcGxlbWVudCBwcm9wZXIgRmxhcmVKUyB0cmFuc2FjdGlvbiBleHRyYWN0aW9uXG4gICAqL1xuICBnZXQgZmxhcmVUcmFuc2FjdGlvbigpOiBVbnNpZ25lZFR4IHtcbiAgICByZXR1cm4gdGhpcy5fZmxhcmVUcmFuc2FjdGlvbiBhcyBVbnNpZ25lZFR4O1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFRPRE86IEV4dHJhY3Qgc2lnbmF0dXJlcyBmcm9tIEZsYXJlSlMgY3JlZGVudGlhbHNcbiAgICAvLyBGb3Igbm93LCByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICAvLyBUT0RPOiBFeHRyYWN0IGNyZWRlbnRpYWxzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgIC8vIEZvciBub3csIHJldHVybiBlbXB0eSBhcnJheVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldCBoYXNDcmVkZW50aWFscygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKHsga2V5IH06IEJhc2VLZXkpOiBib29sZWFuIHtcbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIHNpZ25pbmcgdmFsaWRhdGlvbiBmb3IgRmxhcmVKU1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBGbGFyZSB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTXG4gICAqIEBwYXJhbSB7S2V5UGFpcn0ga2V5UGFpclxuICAgKi9cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgQnVmZmVyO1xuXG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSB0cmFuc2FjdGlvbiB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ2VtcHR5IGNyZWRlbnRpYWxzIHRvIHNpZ24nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyBzaWduaW5nIHByb2Nlc3NcbiAgICAvLyBUaGlzIHdpbGwgaW52b2x2ZTpcbiAgICAvLyAxLiBDcmVhdGluZyBGbGFyZUpTIHNpZ25hdHVyZSB1c2luZyBwcml2YXRlIGtleVxuICAgIC8vIDIuIEF0dGFjaGluZyBzaWduYXR1cmUgdG8gYXBwcm9wcmlhdGUgY3JlZGVudGlhbFxuICAgIC8vIDMuIFVwZGF0aW5nIHRyYW5zYWN0aW9uIHdpdGggc2lnbmVkIGNyZWRlbnRpYWxzXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZsYXJlSlMgc2lnbmluZyBub3QgeWV0IGltcGxlbWVudGVkIC0gcGxhY2Vob2xkZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWVtbyBmcm9tIHN0cmluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVtbyAtIE1lbW8gdGV4dFxuICAgKi9cbiAgc2V0TWVtbyhtZW1vOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9tZW1vID0gdXRpbHMuc3RyaW5nVG9CeXRlcyhtZW1vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWVtbyBmcm9tIHZhcmlvdXMgZm9ybWF0c1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheX0gbWVtbyAtIE1lbW8gZGF0YVxuICAgKi9cbiAgc2V0TWVtb0RhdGEobWVtbzogc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgdGhpcy5fbWVtbyA9IHV0aWxzLmNyZWF0ZU1lbW9CeXRlcyhtZW1vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtbyBhcyBieXRlcyAoRmxhcmVKUyBmb3JtYXQpXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBNZW1vIGJ5dGVzXG4gICAqL1xuICBnZXRNZW1vQnl0ZXMoKTogVWludDhBcnJheSB7XG4gICAgcmV0dXJuIHRoaXMuX21lbW87XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lbW8gYXMgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IE1lbW8gc3RyaW5nXG4gICAqL1xuICBnZXRNZW1vU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHV0aWxzLnBhcnNlTWVtb0J5dGVzKHRoaXMuX21lbW8pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRyYW5zYWN0aW9uIGhhcyBtZW1vXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIG1lbW8gZXhpc3RzIGFuZCBpcyBub3QgZW1wdHlcbiAgICovXG4gIGhhc01lbW8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX21lbW8ubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHRvSGV4U3RyaW5nKGJ5dGVBcnJheTogVWludDhBcnJheSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ5dGVBcnJheSkudG9TdHJpbmcoSEVYX0VOQ09ESU5HKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyB0cmFuc2FjdGlvbiBzZXJpYWxpemF0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIEZMQVJFX1RYX0hFWF9QTEFDRUhPTERFUjtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgICAgc291cmNlQ2hhaW46IHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklELFxuICAgICAgZGVzdGluYXRpb25DaGFpbjogdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQsXG4gICAgICBtZW1vOiB0aGlzLmdldE1lbW9TdHJpbmcoKSwgLy8gSW5jbHVkZSBtZW1vIGluIEpTT04gcmVwcmVzZW50YXRpb25cbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fZmxhcmVUcmFuc2FjdGlvbiA9IHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHJhbnNhY3Rpb25UeXBlIFRoZSB0cmFuc2FjdGlvbiB0eXBlIHRvIGJlIHNldFxuICAgKi9cbiAgc2V0VHJhbnNhY3Rpb25UeXBlKHRyYW5zYWN0aW9uVHlwZTogVHJhbnNhY3Rpb25UeXBlKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkVHlwZXMgPSBbXG4gICAgICBUcmFuc2FjdGlvblR5cGUuRXhwb3J0LFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkltcG9ydCxcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yLFxuICAgIF07XG5cbiAgICBpZiAoIXN1cHBvcnRlZFR5cGVzLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkIGluIEJ1ZmZlciBmb3JtYXQuXG4gICAqIE9ubHkgbmVlZGVkIGZvciBjb2lucyB0aGF0IHN1cHBvcnQgYWRkaW5nIHNpZ25hdHVyZXMgZGlyZWN0bHkgKGUuZy4gVFNTKS5cbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICBpZiAoIXRoaXMuZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBmb3Igc2lnbmluZycpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHNpZ25hYmxlIHBheWxvYWQgZXh0cmFjdGlvblxuICAgIC8vIEZvciBub3csIHJldHVybiBwbGFjZWhvbGRlclxuICAgIHJldHVybiBCdWZmZXIuZnJvbShGTEFSRV9TSUdOQUJMRV9QQVlMT0FEKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGZvciBJRCBnZW5lcmF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgdHJhbnNhY3Rpb24gSUQgZ2VuZXJhdGlvblxuICAgIC8vIEZvciBub3csIHJldHVybiBwbGFjZWhvbGRlclxuICAgIHJldHVybiBGTEFSRV9UUkFOU0FDVElPTl9JRF9QTEFDRUhPTERFUjtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IGV4cG9ydCBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIC8vIFRPRE86IEV4dHJhY3QgaW1wb3J0IG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IHZhbGlkYXRvciBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25vZGVJRCB8fCBQTEFDRUhPTERFUl9OT0RFX0lELFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3N0YWtlQW1vdW50Py50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3I6XG4gICAgICAgIC8vIFRPRE86IEV4dHJhY3QgZGVsZWdhdG9yIG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGhpcy5fbm9kZUlEIHx8IFBMQUNFSE9MREVSX05PREVfSUQsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fc3Rha2VBbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0IGZlZSgpOiBUcmFuc2FjdGlvbkZlZSB7XG4gICAgcmV0dXJuIHsgZmVlOiAnMCcsIC4uLnRoaXMuX2ZlZSB9O1xuICB9XG5cbiAgZ2V0IGNoYW5nZU91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBjaGFuZ2Ugb3V0cHV0cyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IEZscnBFbnRyeVtdIHtcbiAgICAvLyBUT0RPOiBFeHRyYWN0IGlucHV0cyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gcGxhY2Vob2xkZXIgYmFzZWQgb24gVVRYT3NcbiAgICByZXR1cm4gdGhpcy5fdXR4b3MubWFwKCh1dHhvKSA9PiAoe1xuICAgICAgaWQ6IHV0eG8udHhpZCArIElOUFVUX1NFUEFSQVRPUiArIHV0eG8ub3V0cHV0aWR4LFxuICAgICAgYWRkcmVzczogdGhpcy5mcm9tQWRkcmVzc2VzLnNvcnQoKS5qb2luKEFERFJFU1NfU0VQQVJBVE9SKSxcbiAgICAgIHZhbHVlOiB1dHhvLmFtb3VudCxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgd3JhcHBlciB0byBjcmVhdGUgc2lnbmF0dXJlIGFuZCByZXR1cm4gaXQgZm9yIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiBoZXhzdHJpbmdcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShwcnY6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmF0dXJlIGNyZWF0aW9uXG4gICAgLy8gVGhpcyBzaG91bGQgdXNlIEZsYXJlSlMgc2lnbmluZyB1dGlsaXRpZXNcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlKHRoaXMuX25ldHdvcmssIHRoaXMuc2lnbmFibGVQYXlsb2FkLCBwcnYpO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKEhFWF9FTkNPRElORyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgZm9yIEMtY2hhaW4gKGNyb3NzLWNoYWluKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCB8fCB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWy4uLkRJU1BMQVlfT1JERVJfQkFTRV07XG5cbiAgICAvLyBBZGQgbWVtbyB0byBkaXNwbGF5IG9yZGVyIGlmIHByZXNlbnRcbiAgICBpZiAodGhpcy5oYXNNZW1vKCkpIHtcbiAgICAgIGRpc3BsYXlPcmRlci5wdXNoKE1FTU9fRklFTEQpO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBvdXRwdXQgYW1vdW50XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHNcbiAgICAgIC5yZWR1Y2UoKHN1bSwgb3V0cHV0KSA9PiB7XG4gICAgICAgIHJldHVybiBzdW0gKyBCaWdJbnQob3V0cHV0LnZhbHVlIHx8ICcwJyk7XG4gICAgICB9LCBCaWdJbnQoMCkpXG4gICAgICAudG9TdHJpbmcoKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBjaGFuZ2UgYW1vdW50XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHNcbiAgICAgIC5yZWR1Y2UoKHN1bSwgb3V0cHV0KSA9PiB7XG4gICAgICAgIHJldHVybiBzdW0gKyBCaWdJbnQob3V0cHV0LnZhbHVlIHx8ICcwJyk7XG4gICAgICB9LCBCaWdJbnQoMCkpXG4gICAgICAudG9TdHJpbmcoKTtcblxuICAgIGxldCByZXdhcmRBZGRyZXNzZXM7XG4gICAgY29uc3Qgc3Rha2luZ1R5cGVzID0gW1xuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcixcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gICAgXTtcblxuICAgIGlmIChzdGFraW5nVHlwZXMuaW5jbHVkZXModHhKc29uLnR5cGUpKSB7XG4gICAgICByZXdhcmRBZGRyZXNzZXMgPSB0aGlzLnJld2FyZEFkZHJlc3NlcztcbiAgICAgIGRpc3BsYXlPcmRlci5zcGxpY2UoNiwgMCwgUkVXQVJEX0FERFJFU1NFU19GSUVMRCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyb3NzLWNoYWluIGluZm9ybWF0aW9uIGZvciBleHBvcnQvaW1wb3J0XG4gICAgaWYgKHRoaXMuaXNUcmFuc2FjdGlvbkZvckNDaGFpbikge1xuICAgICAgZGlzcGxheU9yZGVyLnB1c2goU09VUkNFX0NIQUlOX0ZJRUxELCBERVNUSU5BVElPTl9DSEFJTl9GSUVMRCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwbGFuYXRpb246IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gJiB7IG1lbW8/OiBzdHJpbmcgfSA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBpbnB1dHM6IHR4SnNvbi5pbnB1dHMsXG4gICAgICBvdXRwdXRzOiB0eEpzb24ub3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIG91dHB1dEFtb3VudCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgY2hhbmdlQW1vdW50LFxuICAgICAgcmV3YXJkQWRkcmVzc2VzLFxuICAgICAgZmVlOiB0aGlzLmZlZSxcbiAgICAgIHR5cGU6IHR4SnNvbi50eXBlLFxuICAgIH07XG5cbiAgICAvLyBBZGQgbWVtbyB0byBleHBsYW5hdGlvbiBpZiBwcmVzZW50XG4gICAgaWYgKHRoaXMuaGFzTWVtbygpKSB7XG4gICAgICBleHBsYW5hdGlvbi5tZW1vID0gdGhpcy5nZXRNZW1vU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cGxhbmF0aW9uO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BaseTransactionBuilder } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { DecodedUtxoObj, Tx } from './iface';
|
|
4
|
+
import { KeyPair } from './keyPair';
|
|
5
|
+
import { Transaction } from './transaction';
|
|
6
|
+
export declare abstract class TransactionBuilder extends BaseTransactionBuilder {
|
|
7
|
+
protected _transaction: Transaction;
|
|
8
|
+
protected recoverSigner: boolean;
|
|
9
|
+
_signer: KeyPair[];
|
|
10
|
+
protected _recoveryMode: boolean;
|
|
11
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
12
|
+
/**
|
|
13
|
+
* Initialize the transaction builder fields using the decoded transaction data
|
|
14
|
+
*
|
|
15
|
+
* @param {Tx} tx the transaction data
|
|
16
|
+
* @returns itself
|
|
17
|
+
*/
|
|
18
|
+
initBuilder(tx: Tx): this;
|
|
19
|
+
/**
|
|
20
|
+
* Validates the threshold
|
|
21
|
+
* @param threshold
|
|
22
|
+
*/
|
|
23
|
+
validateThreshold(threshold: number): void;
|
|
24
|
+
/**
|
|
25
|
+
* Check the UTXO has expected fields.
|
|
26
|
+
* @param UTXO
|
|
27
|
+
*/
|
|
28
|
+
validateUtxo(value: DecodedUtxoObj): void;
|
|
29
|
+
/**
|
|
30
|
+
* Check the list of UTXOS is empty and check each UTXO.
|
|
31
|
+
* @param values
|
|
32
|
+
*/
|
|
33
|
+
validateUtxos(values: DecodedUtxoObj[]): void;
|
|
34
|
+
/**
|
|
35
|
+
* Validates locktime
|
|
36
|
+
* @param locktime
|
|
37
|
+
*/
|
|
38
|
+
validateLocktime(locktime: bigint): void;
|
|
39
|
+
/**
|
|
40
|
+
* Threshold is an int that names the number of unique signatures required to spend the output.
|
|
41
|
+
* Must be less than or equal to the length of Addresses.
|
|
42
|
+
* @param {number} value
|
|
43
|
+
*/
|
|
44
|
+
threshold(value: number): this;
|
|
45
|
+
/**
|
|
46
|
+
* Locktime is a long that contains the unix timestamp that this output can be spent after.
|
|
47
|
+
* The unix timestamp is specific to the second.
|
|
48
|
+
* @param value
|
|
49
|
+
*/
|
|
50
|
+
locktime(value: string | number): this;
|
|
51
|
+
/**
|
|
52
|
+
* When using recovery key must be set here
|
|
53
|
+
* @param {boolean}[recoverSigner=true] whether it's recovery signer
|
|
54
|
+
*/
|
|
55
|
+
recoverMode(recoverSigner?: boolean): this;
|
|
56
|
+
/**
|
|
57
|
+
* fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
|
|
58
|
+
* @param {string | string[]} senderPubKey
|
|
59
|
+
*/
|
|
60
|
+
fromPubKey(senderPubKey: string | string[]): this;
|
|
61
|
+
/**
|
|
62
|
+
* List of UTXO required as inputs.
|
|
63
|
+
* A UTXO is a standalone representation of a transaction output.
|
|
64
|
+
*
|
|
65
|
+
* @param {DecodedUtxoObj[]} list of UTXOS
|
|
66
|
+
*/
|
|
67
|
+
utxos(value: DecodedUtxoObj[]): this;
|
|
68
|
+
/**
|
|
69
|
+
* Build the Flare transaction using FlareJS API
|
|
70
|
+
* @protected
|
|
71
|
+
*/
|
|
72
|
+
protected abstract buildFlareTransaction(): Promise<void> | void;
|
|
73
|
+
/** @inheritdoc */
|
|
74
|
+
protected fromImplementation(rawTransaction: string): Transaction;
|
|
75
|
+
/**
|
|
76
|
+
* Get the transaction instance
|
|
77
|
+
*/
|
|
78
|
+
get transaction(): Transaction;
|
|
79
|
+
/**
|
|
80
|
+
* Validate required fields before building transaction
|
|
81
|
+
* @protected
|
|
82
|
+
*/
|
|
83
|
+
protected validateRequiredFields(): void;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=transactionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAyB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAiB5C,8BAAsB,kBAAmB,SAAQ,sBAAsB;IACrE,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,aAAa,UAAS;IACzB,OAAO,EAAE,OAAO,EAAE,CAAM;IAG/B,SAAS,CAAC,aAAa,UAAS;gBAEpB,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAK7C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAyBzB;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAM1C;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAMzC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI;IAO7C;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOxC;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMtC;;;OAGG;IACH,WAAW,CAAC,aAAa,UAAO,GAAG,IAAI;IAYvC;;;OAGG;IACH,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAMjD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAEhE,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW;IAajE;;OAEG;IACH,IAAI,WAAW,IAAI,WAAW,CAE7B;IAED;;;OAGG;IACH,SAAS,CAAC,sBAAsB,IAAI,IAAI;CAQzC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const transaction_1 = require("./transaction");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
8
|
+
constructor(_coinConfig) {
|
|
9
|
+
super(_coinConfig);
|
|
10
|
+
this.recoverSigner = false;
|
|
11
|
+
this._signer = [];
|
|
12
|
+
// Recovery mode flag for transaction building
|
|
13
|
+
this._recoveryMode = false;
|
|
14
|
+
this._transaction = new transaction_1.Transaction(_coinConfig);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the transaction builder fields using the decoded transaction data
|
|
18
|
+
*
|
|
19
|
+
* @param {Tx} tx the transaction data
|
|
20
|
+
* @returns itself
|
|
21
|
+
*/
|
|
22
|
+
initBuilder(tx) {
|
|
23
|
+
// Validate network and blockchain IDs if available
|
|
24
|
+
const txData = tx;
|
|
25
|
+
if (txData.networkID !== undefined && txData.networkID !== this._transaction._networkID) {
|
|
26
|
+
throw new Error(constants_1.ERROR_NETWORK_ID_MISMATCH);
|
|
27
|
+
}
|
|
28
|
+
if (txData.blockchainID) {
|
|
29
|
+
const blockchainID = Buffer.isBuffer(txData.blockchainID)
|
|
30
|
+
? txData.blockchainID
|
|
31
|
+
: Buffer.from(txData.blockchainID, constants_1.HEX_ENCODING);
|
|
32
|
+
const transactionBlockchainID = Buffer.isBuffer(this._transaction._blockchainID)
|
|
33
|
+
? this._transaction._blockchainID
|
|
34
|
+
: Buffer.from(this._transaction._blockchainID, constants_1.HEX_ENCODING);
|
|
35
|
+
if (!blockchainID.equals(transactionBlockchainID)) {
|
|
36
|
+
throw new Error(constants_1.ERROR_BLOCKCHAIN_ID_MISMATCH_BUILDER);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
this._transaction.setTransaction(tx);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
// region Validators
|
|
43
|
+
/**
|
|
44
|
+
* Validates the threshold
|
|
45
|
+
* @param threshold
|
|
46
|
+
*/
|
|
47
|
+
validateThreshold(threshold) {
|
|
48
|
+
if (!threshold || threshold !== 2) {
|
|
49
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_THRESHOLD);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check the UTXO has expected fields.
|
|
54
|
+
* @param UTXO
|
|
55
|
+
*/
|
|
56
|
+
validateUtxo(value) {
|
|
57
|
+
constants_1.UTXO_REQUIRED_FIELDS.forEach((field) => {
|
|
58
|
+
if (!value.hasOwnProperty(field))
|
|
59
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_UTXOS_MISSING_FIELD} ${field}`);
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check the list of UTXOS is empty and check each UTXO.
|
|
64
|
+
* @param values
|
|
65
|
+
*/
|
|
66
|
+
validateUtxos(values) {
|
|
67
|
+
if (values.length === 0) {
|
|
68
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_EMPTY_ARRAY);
|
|
69
|
+
}
|
|
70
|
+
values.forEach(this.validateUtxo);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validates locktime
|
|
74
|
+
* @param locktime
|
|
75
|
+
*/
|
|
76
|
+
validateLocktime(locktime) {
|
|
77
|
+
if (!locktime || locktime < BigInt(0)) {
|
|
78
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_LOCKTIME);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// endregion
|
|
82
|
+
/**
|
|
83
|
+
* Threshold is an int that names the number of unique signatures required to spend the output.
|
|
84
|
+
* Must be less than or equal to the length of Addresses.
|
|
85
|
+
* @param {number} value
|
|
86
|
+
*/
|
|
87
|
+
threshold(value) {
|
|
88
|
+
this.validateThreshold(value);
|
|
89
|
+
this._transaction._threshold = value;
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Locktime is a long that contains the unix timestamp that this output can be spent after.
|
|
94
|
+
* The unix timestamp is specific to the second.
|
|
95
|
+
* @param value
|
|
96
|
+
*/
|
|
97
|
+
locktime(value) {
|
|
98
|
+
this.validateLocktime(BigInt(value));
|
|
99
|
+
this._transaction._locktime = BigInt(value);
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* When using recovery key must be set here
|
|
104
|
+
* @param {boolean}[recoverSigner=true] whether it's recovery signer
|
|
105
|
+
*/
|
|
106
|
+
recoverMode(recoverSigner = true) {
|
|
107
|
+
this.recoverSigner = recoverSigner;
|
|
108
|
+
this._recoveryMode = recoverSigner;
|
|
109
|
+
// Recovery operations typically need single signature
|
|
110
|
+
if (recoverSigner && !this._transaction._threshold) {
|
|
111
|
+
this._transaction._threshold = 1;
|
|
112
|
+
}
|
|
113
|
+
return this;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* fromPubKey is a list of unique addresses that correspond to the private keys that can be used to spend this output
|
|
117
|
+
* @param {string | string[]} senderPubKey
|
|
118
|
+
*/
|
|
119
|
+
fromPubKey(senderPubKey) {
|
|
120
|
+
const pubKeys = senderPubKey instanceof Array ? senderPubKey : [senderPubKey];
|
|
121
|
+
this._transaction._fromAddresses = pubKeys; // Store as strings directly
|
|
122
|
+
return this;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* List of UTXO required as inputs.
|
|
126
|
+
* A UTXO is a standalone representation of a transaction output.
|
|
127
|
+
*
|
|
128
|
+
* @param {DecodedUtxoObj[]} list of UTXOS
|
|
129
|
+
*/
|
|
130
|
+
utxos(value) {
|
|
131
|
+
this.validateUtxos(value);
|
|
132
|
+
this._transaction._utxos = value;
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/** @inheritdoc */
|
|
136
|
+
fromImplementation(rawTransaction) {
|
|
137
|
+
// Parse the raw transaction and initialize the builder
|
|
138
|
+
try {
|
|
139
|
+
const parsedTx = JSON.parse(rawTransaction);
|
|
140
|
+
this.initBuilder(parsedTx);
|
|
141
|
+
return this._transaction;
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
throw new Error(`${constants_1.ERROR_PARSE_RAW_TRANSACTION}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN_PARSING}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get the transaction instance
|
|
149
|
+
*/
|
|
150
|
+
get transaction() {
|
|
151
|
+
return this._transaction;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Validate required fields before building transaction
|
|
155
|
+
* @protected
|
|
156
|
+
*/
|
|
157
|
+
validateRequiredFields() {
|
|
158
|
+
if (this._transaction._fromAddresses.length === 0) {
|
|
159
|
+
throw new Error(constants_1.ERROR_FROM_ADDRESSES_REQUIRED);
|
|
160
|
+
}
|
|
161
|
+
if (this._transaction._utxos.length === 0) {
|
|
162
|
+
throw new Error(constants_1.ERROR_UTXOS_REQUIRED_BUILDER);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.TransactionBuilder = TransactionBuilder;
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXFGO0FBSXJGLCtDQUE0QztBQUU1QywyQ0FhcUI7QUFFckIsTUFBc0Isa0JBQW1CLFNBQVEsaUNBQXNCO0lBUXJFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBUFgsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDekIsWUFBTyxHQUFjLEVBQUUsQ0FBQztRQUUvQiw4Q0FBOEM7UUFDcEMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFJOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHlCQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLEVBQU07UUFDaEIsbURBQW1EO1FBQ25ELE1BQU0sTUFBTSxHQUFHLEVBQW1DLENBQUM7UUFFbkQsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDeEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN4QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWTtnQkFDckIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSx3QkFBWSxDQUFDLENBQUM7WUFDbkQsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZ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TUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUE0QixDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXpMRCxnREF5TEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBEZWNvZGVkVXR4b09iaiwgVHggfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFJhd1RyYW5zYWN0aW9uRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgRVJST1JfTkVUV09SS19JRF9NSVNNQVRDSCxcbiAgRVJST1JfQkxPQ0tDSEFJTl9JRF9NSVNNQVRDSF9CVUlMREVSLFxuICBFUlJPUl9JTlZBTElEX1RIUkVTSE9MRCxcbiAgRVJST1JfSU5WQUxJRF9MT0NLVElNRSxcbiAgRVJST1JfVVRYT1NfRU1QVFlfQVJSQVksXG4gIEVSUk9SX1VUWE9TX01JU1NJTkdfRklFTEQsXG4gIEVSUk9SX0ZST01fQUREUkVTU0VTX1JFUVVJUkVELFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRF9CVUlMREVSLFxuICBFUlJPUl9QQVJTRV9SQVdfVFJBTlNBQ1RJT04sXG4gIEVSUk9SX1VOS05PV05fUEFSU0lORyxcbiAgVVRYT19SRVFVSVJFRF9GSUVMRFMsXG4gIEhFWF9FTkNPRElORyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBwcm90ZWN0ZWQgcmVjb3ZlclNpZ25lciA9IGZhbHNlO1xuICBwdWJsaWMgX3NpZ25lcjogS2V5UGFpcltdID0gW107XG5cbiAgLy8gUmVjb3ZlcnkgbW9kZSBmbGFnIGZvciB0cmFuc2FjdGlvbiBidWlsZGluZ1xuICBwcm90ZWN0ZWQgX3JlY292ZXJ5TW9kZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmaWVsZHMgdXNpbmcgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1R4fSB0eCB0aGUgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyBpdHNlbGZcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCk6IHRoaXMge1xuICAgIC8vIFZhbGlkYXRlIG5ldHdvcmsgYW5kIGJsb2NrY2hhaW4gSURzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IHR4RGF0YSA9IHR4IGFzIHVua25vd24gYXMgUmF3VHJhbnNhY3Rpb25EYXRhO1xuXG4gICAgaWYgKHR4RGF0YS5uZXR3b3JrSUQgIT09IHVuZGVmaW5lZCAmJiB0eERhdGEubmV0d29ya0lEICE9PSB0aGlzLl90cmFuc2FjdGlvbi5fbmV0d29ya0lEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfTkVUV09SS19JRF9NSVNNQVRDSCk7XG4gICAgfVxuXG4gICAgaWYgKHR4RGF0YS5ibG9ja2NoYWluSUQpIHtcbiAgICAgIGNvbnN0IGJsb2NrY2hhaW5JRCA9IEJ1ZmZlci5pc0J1ZmZlcih0eERhdGEuYmxvY2tjaGFpbklEKVxuICAgICAgICA/IHR4RGF0YS5ibG9ja2NoYWluSURcbiAgICAgICAgOiBCdWZmZXIuZnJvbSh0eERhdGEuYmxvY2tjaGFpbklELCBIRVhfRU5DT0RJTkcpO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb25CbG9ja2NoYWluSUQgPSBCdWZmZXIuaXNCdWZmZXIodGhpcy5fdHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRClcbiAgICAgICAgPyB0aGlzLl90cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklEXG4gICAgICAgIDogQnVmZmVyLmZyb20odGhpcy5fdHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCwgSEVYX0VOQ09ESU5HKTtcbiAgICAgIGlmICghYmxvY2tjaGFpbklELmVxdWFscyh0cmFuc2FjdGlvbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX0JMT0NLQ0hBSU5fSURfTUlTTUFUQ0hfQlVJTERFUik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odHgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgdGhyZXNob2xkXG4gICAqIEBwYXJhbSB0aHJlc2hvbGRcbiAgICovXG4gIHZhbGlkYXRlVGhyZXNob2xkKHRocmVzaG9sZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aHJlc2hvbGQgfHwgdGhyZXNob2xkICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0lOVkFMSURfVEhSRVNIT0xEKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdGhlIFVUWE8gaGFzIGV4cGVjdGVkIGZpZWxkcy5cbiAgICogQHBhcmFtIFVUWE9cbiAgICovXG4gIHZhbGlkYXRlVXR4byh2YWx1ZTogRGVjb2RlZFV0eG9PYmopOiB2b2lkIHtcbiAgICBVVFhPX1JFUVVJUkVEX0ZJRUxEUy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYCR7RVJST1JfVVRYT1NfTUlTU0lOR19GSUVMRH0gJHtmaWVsZH1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgbGlzdCBvZiBVVFhPUyBpcyBlbXB0eSBhbmQgY2hlY2sgZWFjaCBVVFhPLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqL1xuICB2YWxpZGF0ZVV0eG9zKHZhbHVlczogRGVjb2RlZFV0eG9PYmpbXSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX0VNUFRZX0FSUkFZKTtcbiAgICB9XG4gICAgdmFsdWVzLmZvckVhY2godGhpcy52YWxpZGF0ZVV0eG8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBsb2NrdGltZVxuICAgKiBAcGFyYW0gbG9ja3RpbWVcbiAgICovXG4gIHZhbGlkYXRlTG9ja3RpbWUobG9ja3RpbWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmICghbG9ja3RpbWUgfHwgbG9ja3RpbWUgPCBCaWdJbnQoMCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfSU5WQUxJRF9MT0NLVElNRSk7XG4gICAgfVxuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgaXMgYW4gaW50IHRoYXQgbmFtZXMgdGhlIG51bWJlciBvZiB1bmlxdWUgc2lnbmF0dXJlcyByZXF1aXJlZCB0byBzcGVuZCB0aGUgb3V0cHV0LlxuICAgKiBNdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIEFkZHJlc3Nlcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqL1xuICB0aHJlc2hvbGQodmFsdWU6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMudmFsaWRhdGVUaHJlc2hvbGQodmFsdWUpO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NrdGltZSBpcyBhIGxvbmcgdGhhdCBjb250YWlucyB0aGUgdW5peCB0aW1lc3RhbXAgdGhhdCB0aGlzIG91dHB1dCBjYW4gYmUgc3BlbnQgYWZ0ZXIuXG4gICAqIFRoZSB1bml4IHRpbWVzdGFtcCBpcyBzcGVjaWZpYyB0byB0aGUgc2Vjb25kLlxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIGxvY2t0aW1lKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlTG9ja3RpbWUoQmlnSW50KHZhbHVlKSk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uX2xvY2t0aW1lID0gQmlnSW50KHZhbHVlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHVzaW5nIHJlY292ZXJ5IGtleSBtdXN0IGJlIHNldCBoZXJlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1bcmVjb3ZlclNpZ25lcj10cnVlXSB3aGV0aGVyIGl0J3MgcmVjb3Zlcnkgc2lnbmVyXG4gICAqL1xuICByZWNvdmVyTW9kZShyZWNvdmVyU2lnbmVyID0gdHJ1ZSk6IHRoaXMge1xuICAgIHRoaXMucmVjb3ZlclNpZ25lciA9IHJlY292ZXJTaWduZXI7XG4gICAgdGhpcy5fcmVjb3ZlcnlNb2RlID0gcmVjb3ZlclNpZ25lcjtcblxuICAgIC8vIFJlY292ZXJ5IG9wZXJhdGlvbnMgdHlwaWNhbGx5IG5lZWQgc2luZ2xlIHNpZ25hdHVyZVxuICAgIGlmIChyZWNvdmVyU2lnbmVyICYmICF0aGlzLl90cmFuc2FjdGlvbi5fdGhyZXNob2xkKSB7XG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBmcm9tUHViS2V5IGlzIGEgbGlzdCBvZiB1bmlxdWUgYWRkcmVzc2VzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcHJpdmF0ZSBrZXlzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlbmQgdGhpcyBvdXRwdXRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBzdHJpbmdbXX0gc2VuZGVyUHViS2V5XG4gICAqL1xuICBmcm9tUHViS2V5KHNlbmRlclB1YktleTogc3RyaW5nIHwgc3RyaW5nW10pOiB0aGlzIHtcbiAgICBjb25zdCBwdWJLZXlzID0gc2VuZGVyUHViS2V5IGluc3RhbmNlb2YgQXJyYXkgPyBzZW5kZXJQdWJLZXkgOiBbc2VuZGVyUHViS2V5XTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyA9IHB1YktleXM7IC8vIFN0b3JlIGFzIHN0cmluZ3MgZGlyZWN0bHlcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IG9mIFVUWE8gcmVxdWlyZWQgYXMgaW5wdXRzLlxuICAgKiBBIFVUWE8gaXMgYSBzdGFuZGFsb25lIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gb3V0cHV0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RlY29kZWRVdHhvT2JqW119IGxpc3Qgb2YgVVRYT1NcbiAgICovXG4gIHV0eG9zKHZhbHVlOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZVV0eG9zKHZhbHVlKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbi5fdXR4b3MgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgRmxhcmUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKUyBBUElcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIC8vIFBhcnNlIHRoZSByYXcgdHJhbnNhY3Rpb24gYW5kIGluaXRpYWxpemUgdGhlIGJ1aWxkZXJcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkVHggPSBKU09OLnBhcnNlKHJhd1RyYW5zYWN0aW9uKTtcbiAgICAgIHRoaXMuaW5pdEJ1aWxkZXIocGFyc2VkVHgpO1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0VSUk9SX1BBUlNFX1JBV19UUkFOU0FDVElPTn06ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBFUlJPUl9VTktOT1dOX1BBUlNJTkd9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0cmFuc2FjdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgZ2V0IHRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzIGJlZm9yZSBidWlsZGluZyB0cmFuc2FjdGlvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVSZXF1aXJlZEZpZWxkcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoRVJST1JfRlJPTV9BRERSRVNTRVNfUkVRVUlSRUQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb24uX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEX0JVSUxERVIpO1xuICAgIH1cbiAgfVxufVxuIl19
|