@bitgo-beta/sdk-coin-flrp 1.0.1-beta.21 → 1.0.1-beta.23
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 +39 -6
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +144 -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/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +6 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +4 -6
- 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 +321 -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/utils.d.ts +57 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +140 -43
- package/dist/test/unit/lib/atomicTransactionBuilder.js +37 -11
- 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 +55 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -11
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
/**
|
|
12
|
+
* Flare P-chain transaction implementation using FlareJS
|
|
13
|
+
* Based on AVAX transaction patterns adapted for Flare network
|
|
14
|
+
*/
|
|
15
|
+
class Transaction extends sdk_core_1.BaseTransaction {
|
|
16
|
+
constructor(coinConfig) {
|
|
17
|
+
super(coinConfig);
|
|
18
|
+
this._threshold = 2;
|
|
19
|
+
this._locktime = BigInt(0);
|
|
20
|
+
this._fromAddresses = [];
|
|
21
|
+
this._rewardAddresses = [];
|
|
22
|
+
this._utxos = [];
|
|
23
|
+
this._fee = {};
|
|
24
|
+
this._memo = new Uint8Array(); // FlareJS memo field
|
|
25
|
+
this._network = coinConfig.network;
|
|
26
|
+
this._assetId = 'FLR'; // Default FLR asset
|
|
27
|
+
this._blockchainID = this._network.blockchainID || '';
|
|
28
|
+
this._networkID = this._network.networkID || 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the base transaction from FlareJS UnsignedTx
|
|
32
|
+
* TODO: Implement proper FlareJS transaction extraction
|
|
33
|
+
*/
|
|
34
|
+
get flareTransaction() {
|
|
35
|
+
return this._flareTransaction;
|
|
36
|
+
}
|
|
37
|
+
get signature() {
|
|
38
|
+
if (this.credentials.length === 0) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
// TODO: Extract signatures from FlareJS credentials
|
|
42
|
+
// For now, return placeholder
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
get credentials() {
|
|
46
|
+
// TODO: Extract credentials from FlareJS transaction
|
|
47
|
+
// For now, return empty array
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
get hasCredentials() {
|
|
51
|
+
return this.credentials !== undefined && this.credentials.length > 0;
|
|
52
|
+
}
|
|
53
|
+
/** @inheritdoc */
|
|
54
|
+
canSign({ key }) {
|
|
55
|
+
// TODO: Implement proper signing validation for FlareJS
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sign a Flare transaction using FlareJS
|
|
60
|
+
* @param {KeyPair} keyPair
|
|
61
|
+
*/
|
|
62
|
+
async sign(keyPair) {
|
|
63
|
+
const prv = keyPair.getPrivateKey();
|
|
64
|
+
if (!prv) {
|
|
65
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
66
|
+
}
|
|
67
|
+
if (!this.flareTransaction) {
|
|
68
|
+
throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
|
|
69
|
+
}
|
|
70
|
+
if (!this.hasCredentials) {
|
|
71
|
+
throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
|
|
72
|
+
}
|
|
73
|
+
// TODO: Implement FlareJS signing process
|
|
74
|
+
// This will involve:
|
|
75
|
+
// 1. Creating FlareJS signature using private key
|
|
76
|
+
// 2. Attaching signature to appropriate credential
|
|
77
|
+
// 3. Updating transaction with signed credentials
|
|
78
|
+
throw new Error('FlareJS signing not yet implemented - placeholder');
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Set memo from string
|
|
82
|
+
* @param {string} memo - Memo text
|
|
83
|
+
*/
|
|
84
|
+
setMemo(memo) {
|
|
85
|
+
this._memo = utils_1.default.stringToBytes(memo);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Set memo from various formats
|
|
89
|
+
* @param {string | Record<string, unknown> | Uint8Array} memo - Memo data
|
|
90
|
+
*/
|
|
91
|
+
setMemoData(memo) {
|
|
92
|
+
this._memo = utils_1.default.createMemoBytes(memo);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get memo as bytes (FlareJS format)
|
|
96
|
+
* @returns {Uint8Array} Memo bytes
|
|
97
|
+
*/
|
|
98
|
+
getMemoBytes() {
|
|
99
|
+
return this._memo;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get memo as string
|
|
103
|
+
* @returns {string} Memo string
|
|
104
|
+
*/
|
|
105
|
+
getMemoString() {
|
|
106
|
+
return utils_1.default.parseMemoBytes(this._memo);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if transaction has memo
|
|
110
|
+
* @returns {boolean} Whether memo exists and is not empty
|
|
111
|
+
*/
|
|
112
|
+
hasMemo() {
|
|
113
|
+
return this._memo.length > 0;
|
|
114
|
+
}
|
|
115
|
+
toHexString(byteArray) {
|
|
116
|
+
return buffer_1.Buffer.from(byteArray).toString('hex');
|
|
117
|
+
}
|
|
118
|
+
/** @inheritdoc */
|
|
119
|
+
toBroadcastFormat() {
|
|
120
|
+
if (!this.flareTransaction) {
|
|
121
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
122
|
+
}
|
|
123
|
+
// TODO: Implement FlareJS transaction serialization
|
|
124
|
+
// For now, return placeholder
|
|
125
|
+
return 'flare-tx-hex-placeholder';
|
|
126
|
+
}
|
|
127
|
+
toJson() {
|
|
128
|
+
if (!this.flareTransaction) {
|
|
129
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
id: this.id,
|
|
133
|
+
inputs: this.inputs,
|
|
134
|
+
fromAddresses: this.fromAddresses,
|
|
135
|
+
threshold: this._threshold,
|
|
136
|
+
locktime: this._locktime.toString(),
|
|
137
|
+
type: this.type,
|
|
138
|
+
signatures: this.signature,
|
|
139
|
+
outputs: this.outputs,
|
|
140
|
+
changeOutputs: this.changeOutputs,
|
|
141
|
+
sourceChain: this._network.blockchainID,
|
|
142
|
+
destinationChain: this._network.cChainBlockchainID,
|
|
143
|
+
memo: this.getMemoString(), // Include memo in JSON representation
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
setTransaction(tx) {
|
|
147
|
+
this._flareTransaction = tx;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Set the transaction type
|
|
151
|
+
* @param {TransactionType} transactionType The transaction type to be set
|
|
152
|
+
*/
|
|
153
|
+
setTransactionType(transactionType) {
|
|
154
|
+
const supportedTypes = [
|
|
155
|
+
sdk_core_1.TransactionType.Export,
|
|
156
|
+
sdk_core_1.TransactionType.Import,
|
|
157
|
+
sdk_core_1.TransactionType.AddValidator,
|
|
158
|
+
sdk_core_1.TransactionType.AddDelegator,
|
|
159
|
+
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
160
|
+
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
161
|
+
];
|
|
162
|
+
if (!supportedTypes.includes(transactionType)) {
|
|
163
|
+
throw new Error(`Transaction type ${transactionType} is not supported`);
|
|
164
|
+
}
|
|
165
|
+
this._type = transactionType;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Returns the portion of the transaction that needs to be signed in Buffer format.
|
|
169
|
+
* Only needed for coins that support adding signatures directly (e.g. TSS).
|
|
170
|
+
*/
|
|
171
|
+
get signablePayload() {
|
|
172
|
+
if (!this.flareTransaction) {
|
|
173
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction for signing');
|
|
174
|
+
}
|
|
175
|
+
// TODO: Implement FlareJS signable payload extraction
|
|
176
|
+
// For now, return placeholder
|
|
177
|
+
return buffer_1.Buffer.from('flare-signable-payload');
|
|
178
|
+
}
|
|
179
|
+
get id() {
|
|
180
|
+
if (!this.flareTransaction) {
|
|
181
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction for ID generation');
|
|
182
|
+
}
|
|
183
|
+
// TODO: Implement FlareJS transaction ID generation
|
|
184
|
+
// For now, return placeholder
|
|
185
|
+
return 'flare-transaction-id-placeholder';
|
|
186
|
+
}
|
|
187
|
+
get fromAddresses() {
|
|
188
|
+
return this._fromAddresses.map((address) => {
|
|
189
|
+
// TODO: Format addresses using FlareJS utilities
|
|
190
|
+
return address;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
get rewardAddresses() {
|
|
194
|
+
return this._rewardAddresses.map((address) => {
|
|
195
|
+
// TODO: Format addresses using FlareJS utilities
|
|
196
|
+
return address;
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get the list of outputs. Amounts are expressed in absolute value.
|
|
201
|
+
*/
|
|
202
|
+
get outputs() {
|
|
203
|
+
switch (this.type) {
|
|
204
|
+
case sdk_core_1.TransactionType.Export:
|
|
205
|
+
// TODO: Extract export outputs from FlareJS transaction
|
|
206
|
+
return [];
|
|
207
|
+
case sdk_core_1.TransactionType.Import:
|
|
208
|
+
// TODO: Extract import outputs from FlareJS transaction
|
|
209
|
+
return [];
|
|
210
|
+
case sdk_core_1.TransactionType.AddValidator:
|
|
211
|
+
case sdk_core_1.TransactionType.AddPermissionlessValidator:
|
|
212
|
+
// TODO: Extract validator outputs from FlareJS transaction
|
|
213
|
+
return [
|
|
214
|
+
{
|
|
215
|
+
address: this._nodeID || 'placeholder-node-id',
|
|
216
|
+
value: this._stakeAmount?.toString() || '0',
|
|
217
|
+
},
|
|
218
|
+
];
|
|
219
|
+
case sdk_core_1.TransactionType.AddDelegator:
|
|
220
|
+
case sdk_core_1.TransactionType.AddPermissionlessDelegator:
|
|
221
|
+
// TODO: Extract delegator outputs from FlareJS transaction
|
|
222
|
+
return [
|
|
223
|
+
{
|
|
224
|
+
address: this._nodeID || 'placeholder-node-id',
|
|
225
|
+
value: this._stakeAmount?.toString() || '0',
|
|
226
|
+
},
|
|
227
|
+
];
|
|
228
|
+
default:
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
get fee() {
|
|
233
|
+
return { fee: '0', ...this._fee };
|
|
234
|
+
}
|
|
235
|
+
get changeOutputs() {
|
|
236
|
+
// TODO: Extract change outputs from FlareJS transaction
|
|
237
|
+
// For now, return empty array
|
|
238
|
+
return [];
|
|
239
|
+
}
|
|
240
|
+
get inputs() {
|
|
241
|
+
// TODO: Extract inputs from FlareJS transaction
|
|
242
|
+
// For now, return placeholder based on UTXOs
|
|
243
|
+
return this._utxos.map((utxo) => ({
|
|
244
|
+
id: utxo.txid + iface_1.INPUT_SEPARATOR + utxo.outputidx,
|
|
245
|
+
address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
|
|
246
|
+
value: utxo.amount,
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Flare wrapper to create signature and return it for credentials
|
|
251
|
+
* @param prv
|
|
252
|
+
* @return hexstring
|
|
253
|
+
*/
|
|
254
|
+
createSignature(prv) {
|
|
255
|
+
// TODO: Implement FlareJS signature creation
|
|
256
|
+
// This should use FlareJS signing utilities
|
|
257
|
+
const signval = utils_1.default.createSignature(this._network, this.signablePayload, prv);
|
|
258
|
+
return signval.toString('hex');
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Check if transaction is for C-chain (cross-chain)
|
|
262
|
+
*/
|
|
263
|
+
get isTransactionForCChain() {
|
|
264
|
+
return this.type === sdk_core_1.TransactionType.Export || this.type === sdk_core_1.TransactionType.Import;
|
|
265
|
+
}
|
|
266
|
+
/** @inheritdoc */
|
|
267
|
+
explainTransaction() {
|
|
268
|
+
const txJson = this.toJson();
|
|
269
|
+
const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
|
|
270
|
+
// Add memo to display order if present
|
|
271
|
+
if (this.hasMemo()) {
|
|
272
|
+
displayOrder.push('memo');
|
|
273
|
+
}
|
|
274
|
+
// Calculate total output amount
|
|
275
|
+
const outputAmount = txJson.outputs
|
|
276
|
+
.reduce((sum, output) => {
|
|
277
|
+
return sum + BigInt(output.value || '0');
|
|
278
|
+
}, BigInt(0))
|
|
279
|
+
.toString();
|
|
280
|
+
// Calculate total change amount
|
|
281
|
+
const changeAmount = txJson.changeOutputs
|
|
282
|
+
.reduce((sum, output) => {
|
|
283
|
+
return sum + BigInt(output.value || '0');
|
|
284
|
+
}, BigInt(0))
|
|
285
|
+
.toString();
|
|
286
|
+
let rewardAddresses;
|
|
287
|
+
const stakingTypes = [
|
|
288
|
+
sdk_core_1.TransactionType.AddValidator,
|
|
289
|
+
sdk_core_1.TransactionType.AddDelegator,
|
|
290
|
+
sdk_core_1.TransactionType.AddPermissionlessValidator,
|
|
291
|
+
sdk_core_1.TransactionType.AddPermissionlessDelegator,
|
|
292
|
+
];
|
|
293
|
+
if (stakingTypes.includes(txJson.type)) {
|
|
294
|
+
rewardAddresses = this.rewardAddresses;
|
|
295
|
+
displayOrder.splice(6, 0, 'rewardAddresses');
|
|
296
|
+
}
|
|
297
|
+
// Add cross-chain information for export/import
|
|
298
|
+
if (this.isTransactionForCChain) {
|
|
299
|
+
displayOrder.push('sourceChain', 'destinationChain');
|
|
300
|
+
}
|
|
301
|
+
const explanation = {
|
|
302
|
+
displayOrder,
|
|
303
|
+
id: txJson.id,
|
|
304
|
+
inputs: txJson.inputs,
|
|
305
|
+
outputs: txJson.outputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
306
|
+
outputAmount,
|
|
307
|
+
changeOutputs: txJson.changeOutputs.map((o) => ({ address: o.address, amount: o.value })),
|
|
308
|
+
changeAmount,
|
|
309
|
+
rewardAddresses,
|
|
310
|
+
fee: this.fee,
|
|
311
|
+
type: txJson.type,
|
|
312
|
+
};
|
|
313
|
+
// Add memo to explanation if present
|
|
314
|
+
if (this.hasMemo()) {
|
|
315
|
+
explanation.memo = this.getMemoString();
|
|
316
|
+
}
|
|
317
|
+
return explanation;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.Transaction = Transaction;
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUU5QixtQ0FBZ0M7QUFDaEMsbUNBUWlCO0FBRWpCLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQXNCOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFaYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsU0FBSSxHQUE0QixFQUFFLENBQUM7UUFHbkMsVUFBSyxHQUFlLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFJaEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBdUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLG9CQUFvQjtRQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQStCLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFD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QU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7UUFFRixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuQixXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBNVdELGtDQTRXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVuc2lnbmVkVHgsIENyZWRlbnRpYWwgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHtcbiAgQUREUkVTU19TRVBBUkFUT1IsXG4gIERlY29kZWRVdHhvT2JqLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4LFxuICBUeERhdGEsXG4gIEZscnBFbnRyeSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIEZsYXJlSlNcbiAqIEJhc2VkIG9uIEFWQVggdHJhbnNhY3Rpb24gcGF0dGVybnMgYWRhcHRlZCBmb3IgRmxhcmUgbmV0d29ya1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2ZsYXJlVHJhbnNhY3Rpb246IFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBGbGFyZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogc3RyaW5nO1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogc3RyaW5nO1xuICBwdWJsaWMgX25vZGVJRDogc3RyaW5nO1xuICBwdWJsaWMgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwdWJsaWMgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWUgPSBCaWdJbnQoMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90bzogc3RyaW5nW107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICBwdWJsaWMgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwdWJsaWMgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuICBwdWJsaWMgX21lbW86IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgpOyAvLyBGbGFyZUpTIG1lbW8gZmllbGRcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSAnRkxSJzsgLy8gRGVmYXVsdCBGTFIgYXNzZXRcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCB8fCAnJztcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRCB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmFzZSB0cmFuc2FjdGlvbiBmcm9tIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgdHJhbnNhY3Rpb24gZXh0cmFjdGlvblxuICAgKi9cbiAgZ2V0IGZsYXJlVHJhbnNhY3Rpb24oKTogVW5zaWduZWRUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBUT0RPOiBFeHRyYWN0IHNpZ25hdHVyZXMgZnJvbSBGbGFyZUpTIGNyZWRlbnRpYWxzXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBjcmVkZW50aWFscyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHByb3BlciBzaWduaW5nIHZhbGlkYXRpb24gZm9yIEZsYXJlSlNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgRmxhcmUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKU1xuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIEJ1ZmZlcjtcblxuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmluZyBwcm9jZXNzXG4gICAgLy8gVGhpcyB3aWxsIGludm9sdmU6XG4gICAgLy8gMS4gQ3JlYXRpbmcgRmxhcmVKUyBzaWduYXR1cmUgdXNpbmcgcHJpdmF0ZSBrZXlcbiAgICAvLyAyLiBBdHRhY2hpbmcgc2lnbmF0dXJlIHRvIGFwcHJvcHJpYXRlIGNyZWRlbnRpYWxcbiAgICAvLyAzLiBVcGRhdGluZyB0cmFuc2FjdGlvbiB3aXRoIHNpZ25lZCBjcmVkZW50aWFsc1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGbGFyZUpTIHNpZ25pbmcgbm90IHlldCBpbXBsZW1lbnRlZCAtIHBsYWNlaG9sZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW8gLSBNZW1vIHRleHRcbiAgICovXG4gIHNldE1lbW8obWVtbzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWVtbyA9IHV0aWxzLnN0cmluZ1RvQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVpbnQ4QXJyYXl9IG1lbW8gLSBNZW1vIGRhdGFcbiAgICovXG4gIHNldE1lbW9EYXRhKG1lbW86IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheSk6IHZvaWQge1xuICAgIHRoaXMuX21lbW8gPSB1dGlscy5jcmVhdGVNZW1vQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lbW8gYXMgYnl0ZXMgKEZsYXJlSlMgZm9ybWF0KVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gTWVtbyBieXRlc1xuICAgKi9cbiAgZ2V0TWVtb0J5dGVzKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9tZW1vO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNZW1vIHN0cmluZ1xuICAgKi9cbiAgZ2V0TWVtb1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5wYXJzZU1lbW9CeXRlcyh0aGlzLl9tZW1vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0cmFuc2FjdGlvbiBoYXMgbWVtb1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vIGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gICAqL1xuICBoYXNNZW1vKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tZW1vLmxlbmd0aCA+IDA7XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlQXJyYXkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyB0cmFuc2FjdGlvbiBzZXJpYWxpemF0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuICdmbGFyZS10eC1oZXgtcGxhY2Vob2xkZXInO1xuICB9XG5cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQsXG4gICAgICBkZXN0aW5hdGlvbkNoYWluOiB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCxcbiAgICAgIG1lbW86IHRoaXMuZ2V0TWVtb1N0cmluZygpLCAvLyBJbmNsdWRlIG1lbW8gaW4gSlNPTiByZXByZXNlbnRhdGlvblxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuSW1wb3J0LFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcixcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gICAgXTtcblxuICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXModHJhbnNhY3Rpb25UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmFibGUgcGF5bG9hZCBleHRyYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKCdmbGFyZS1zaWduYWJsZS1wYXlsb2FkJyk7XG4gIH1cblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBmb3IgSUQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHRyYW5zYWN0aW9uIElEIGdlbmVyYXRpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICByZXR1cm4gJ2ZsYXJlLXRyYW5zYWN0aW9uLWlkLXBsYWNlaG9sZGVyJztcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IGV4cG9ydCBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIC8vIFRPRE86IEV4dHJhY3QgaW1wb3J0IG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IHZhbGlkYXRvciBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25vZGVJRCB8fCAncGxhY2Vob2xkZXItbm9kZS1pZCcsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fc3Rha2VBbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjpcbiAgICAgICAgLy8gVE9ETzogRXh0cmFjdCBkZWxlZ2F0b3Igb3V0cHV0cyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9ub2RlSUQgfHwgJ3BsYWNlaG9sZGVyLW5vZGUtaWQnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3N0YWtlQW1vdW50Py50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIC8vIFRPRE86IEV4dHJhY3QgY2hhbmdlIG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBGbHJwRW50cnlbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBpbnB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyIGJhc2VkIG9uIFVUWE9zXG4gICAgcmV0dXJuIHRoaXMuX3V0eG9zLm1hcCgodXR4bykgPT4gKHtcbiAgICAgIGlkOiB1dHhvLnR4aWQgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dHhvLm91dHB1dGlkeCxcbiAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICB2YWx1ZTogdXR4by5hbW91bnQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXJlIHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHNpZ25hdHVyZSBjcmVhdGlvblxuICAgIC8vIFRoaXMgc2hvdWxkIHVzZSBGbGFyZUpTIHNpZ25pbmcgdXRpbGl0aWVzXG4gICAgY29uc3Qgc2lnbnZhbCA9IHV0aWxzLmNyZWF0ZVNpZ25hdHVyZSh0aGlzLl9uZXR3b3JrLCB0aGlzLnNpZ25hYmxlUGF5bG9hZCwgcHJ2KTtcbiAgICByZXR1cm4gc2lnbnZhbC50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgZm9yIEMtY2hhaW4gKGNyb3NzLWNoYWluKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCB8fCB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdpbnB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcblxuICAgIC8vIEFkZCBtZW1vIHRvIGRpc3BsYXkgb3JkZXIgaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZGlzcGxheU9yZGVyLnB1c2goJ21lbW8nKTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgb3V0cHV0IGFtb3VudFxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHR4SnNvbi5vdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgY2hhbmdlIGFtb3VudFxuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHR4SnNvbi5jaGFuZ2VPdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGNvbnN0IHN0YWtpbmdUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yLFxuICAgIF07XG5cbiAgICBpZiAoc3Rha2luZ1R5cGVzLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY3Jvc3MtY2hhaW4gaW5mb3JtYXRpb24gZm9yIGV4cG9ydC9pbXBvcnRcbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICBkaXNwbGF5T3JkZXIucHVzaCgnc291cmNlQ2hhaW4nLCAnZGVzdGluYXRpb25DaGFpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uICYgeyBtZW1vPzogc3RyaW5nIH0gPSB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIG1lbW8gdG8gZXhwbGFuYXRpb24gaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZXhwbGFuYXRpb24ubWVtbyA9IHRoaXMuZ2V0TWVtb1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsYW5hdGlvbjtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
4
|
+
export declare class ExportTxBuilder extends AtomicTransactionBuilder {
|
|
5
|
+
protected get transactionType(): TransactionType;
|
|
6
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
7
|
+
}
|
|
8
|
+
export declare class ImportTxBuilder extends AtomicTransactionBuilder {
|
|
9
|
+
protected get transactionType(): TransactionType;
|
|
10
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
11
|
+
}
|
|
12
|
+
export declare class ValidatorTxBuilder extends AtomicTransactionBuilder {
|
|
13
|
+
protected get transactionType(): TransactionType;
|
|
14
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
15
|
+
}
|
|
16
|
+
export declare class DelegatorTxBuilder extends AtomicTransactionBuilder {
|
|
17
|
+
protected get transactionType(): TransactionType;
|
|
18
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Factory for Flare P-chain transaction builders
|
|
22
|
+
*/
|
|
23
|
+
export declare class TransactionBuilderFactory {
|
|
24
|
+
protected _coinConfig: Readonly<CoinConfig>;
|
|
25
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
26
|
+
/**
|
|
27
|
+
* Create a transaction builder from a hex string
|
|
28
|
+
* @param txHex - Transaction hex string
|
|
29
|
+
*/
|
|
30
|
+
from(txHex: string): AtomicTransactionBuilder;
|
|
31
|
+
/**
|
|
32
|
+
* Create a transaction builder for a specific type
|
|
33
|
+
* @param type - Transaction type
|
|
34
|
+
*/
|
|
35
|
+
getBuilder(type: TransactionType): AtomicTransactionBuilder;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=transactionBuilderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAGtE,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;gBAEW,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;CAI7C;AAED,qBAAa,eAAgB,SAAQ,wBAAwB;IAC3D,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;gBAEW,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;gBAEW,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;CAI7C;AAED,qBAAa,kBAAmB,SAAQ,wBAAwB;IAC9D,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;gBAEW,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;CAI7C;AAED;;GAEG;AACH,qBAAa,yBAAyB;IACpC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAEhC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,wBAAwB;IAiB7C;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,wBAAwB;CAc5D"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBuilderFactory = exports.DelegatorTxBuilder = exports.ValidatorTxBuilder = exports.ImportTxBuilder = exports.ExportTxBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
|
|
6
|
+
// Placeholder builders - basic implementations for testing
|
|
7
|
+
class ExportTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
8
|
+
get transactionType() {
|
|
9
|
+
return sdk_core_1.TransactionType.Export;
|
|
10
|
+
}
|
|
11
|
+
constructor(coinConfig) {
|
|
12
|
+
super(coinConfig);
|
|
13
|
+
// Don't throw error, allow placeholder functionality
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.ExportTxBuilder = ExportTxBuilder;
|
|
17
|
+
class ImportTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
18
|
+
get transactionType() {
|
|
19
|
+
return sdk_core_1.TransactionType.Import;
|
|
20
|
+
}
|
|
21
|
+
constructor(coinConfig) {
|
|
22
|
+
super(coinConfig);
|
|
23
|
+
// Don't throw error, allow placeholder functionality
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.ImportTxBuilder = ImportTxBuilder;
|
|
27
|
+
class ValidatorTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
28
|
+
get transactionType() {
|
|
29
|
+
return sdk_core_1.TransactionType.AddValidator;
|
|
30
|
+
}
|
|
31
|
+
constructor(coinConfig) {
|
|
32
|
+
super(coinConfig);
|
|
33
|
+
// Don't throw error, allow placeholder functionality
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.ValidatorTxBuilder = ValidatorTxBuilder;
|
|
37
|
+
class DelegatorTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
38
|
+
get transactionType() {
|
|
39
|
+
return sdk_core_1.TransactionType.AddDelegator;
|
|
40
|
+
}
|
|
41
|
+
constructor(coinConfig) {
|
|
42
|
+
super(coinConfig);
|
|
43
|
+
// Don't throw error, allow placeholder functionality
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.DelegatorTxBuilder = DelegatorTxBuilder;
|
|
47
|
+
/**
|
|
48
|
+
* Factory for Flare P-chain transaction builders
|
|
49
|
+
*/
|
|
50
|
+
class TransactionBuilderFactory {
|
|
51
|
+
constructor(coinConfig) {
|
|
52
|
+
this._coinConfig = coinConfig;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a transaction builder from a hex string
|
|
56
|
+
* @param txHex - Transaction hex string
|
|
57
|
+
*/
|
|
58
|
+
from(txHex) {
|
|
59
|
+
// TODO: Parse the hex and determine transaction type, then return appropriate builder
|
|
60
|
+
// For now, return a basic export builder as that's the most common use case
|
|
61
|
+
if (!txHex) {
|
|
62
|
+
throw new Error('Transaction hex is required');
|
|
63
|
+
}
|
|
64
|
+
// Create a mock export builder for now
|
|
65
|
+
// In the future, this will parse the transaction and determine the correct type
|
|
66
|
+
const builder = new ExportTxBuilder(this._coinConfig);
|
|
67
|
+
// Initialize with the hex data (placeholder)
|
|
68
|
+
builder.initBuilder({ txHex });
|
|
69
|
+
return builder;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Create a transaction builder for a specific type
|
|
73
|
+
* @param type - Transaction type
|
|
74
|
+
*/
|
|
75
|
+
getBuilder(type) {
|
|
76
|
+
switch (type) {
|
|
77
|
+
case sdk_core_1.TransactionType.Export:
|
|
78
|
+
return new ExportTxBuilder(this._coinConfig);
|
|
79
|
+
case sdk_core_1.TransactionType.Import:
|
|
80
|
+
return new ImportTxBuilder(this._coinConfig);
|
|
81
|
+
case sdk_core_1.TransactionType.AddValidator:
|
|
82
|
+
return new ValidatorTxBuilder(this._coinConfig);
|
|
83
|
+
case sdk_core_1.TransactionType.AddDelegator:
|
|
84
|
+
return new DelegatorTxBuilder(this._coinConfig);
|
|
85
|
+
default:
|
|
86
|
+
throw new sdk_core_1.NotImplementedError(`Transaction type ${type} not supported`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxtREFBNEU7QUFDNUUseUVBQXNFO0FBRXRFLDJEQUEyRDtBQUMzRCxNQUFhLGVBQWdCLFNBQVEsbURBQXdCO0lBQzNELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixxREFBcUQ7SUFDdkQsQ0FBQztDQUNGO0FBVEQsMENBU0M7QUFFRCxNQUFhLGVBQWdCLFNBQVEsbURBQXdCO0lBQzNELElBQWMsZUFBZTtRQUMzQixPQUFPLDBCQUFlLENBQUMsTUFBTSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNsQixxREFBcUQ7SUFDdkQsQ0FBQztDQUNGO0FBVEQsMENBU0M7QUFFRCxNQUFhLGtCQUFtQixTQUFRLG1EQUF3QjtJQUM5RCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBRUQsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEIscURBQXFEO0lBQ3ZELENBQUM7Q0FDRjtBQVRELGdEQVNDO0FBRUQsTUFBYSxrQkFBbUIsU0FBUSxtREFBd0I7SUFDOUQsSUFBYyxlQUFlO1FBQzNCLE9BQU8sMEJBQWUsQ0FBQyxZQUFZLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLHFEQUFxRDtJQUN2RCxDQUFDO0NBQ0Y7QUFURCxnREFTQztBQUVEOztHQUVHO0FBQ0gsTUFBYSx5QkFBeUI7SUFHcEMsWUFBWSxVQUFnQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxDQUFDLEtBQWE7UUFDaEIsc0ZBQXNGO1FBQ3RGLDRFQUE0RTtRQUM1RSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxnRkFBZ0Y7UUFDaEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXRELDZDQUE2QztRQUM3QyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUUvQixPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUFDLElBQXFCO1FBQzlCLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDYixLQUFLLDBCQUFlLENBQUMsTUFBTTtnQkFDekIsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0MsS0FBSywwQkFBZSxDQUFDLE1BQU07Z0JBQ3pCLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQy9DLEtBQUssMEJBQWUsQ0FBQyxZQUFZO2dCQUMvQixPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELEtBQUssMEJBQWUsQ0FBQyxZQUFZO2dCQUMvQixPQUFPLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xEO2dCQUNFLE1BQU0sSUFBSSw4QkFBbUIsQ0FBQyxvQkFBb0IsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE5Q0QsOERBOENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgTm90SW1wbGVtZW50ZWRFcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuXG4vLyBQbGFjZWhvbGRlciBidWlsZGVycyAtIGJhc2ljIGltcGxlbWVudGF0aW9ucyBmb3IgdGVzdGluZ1xuZXhwb3J0IGNsYXNzIEV4cG9ydFR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIC8vIERvbid0IHRocm93IGVycm9yLCBhbGxvdyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEltcG9ydFR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIC8vIERvbid0IHRocm93IGVycm9yLCBhbGxvdyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFZhbGlkYXRvclR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3I7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIC8vIERvbid0IHRocm93IGVycm9yLCBhbGxvdyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlbGVnYXRvclR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIC8vIERvbid0IHRocm93IGVycm9yLCBhbGxvdyBwbGFjZWhvbGRlciBmdW5jdGlvbmFsaXR5XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9uIGJ1aWxkZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IHtcbiAgcHJvdGVjdGVkIF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZnJvbSBhIGhleCBzdHJpbmdcbiAgICogQHBhcmFtIHR4SGV4IC0gVHJhbnNhY3Rpb24gaGV4IHN0cmluZ1xuICAgKi9cbiAgZnJvbSh0eEhleDogc3RyaW5nKTogQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICAvLyBUT0RPOiBQYXJzZSB0aGUgaGV4IGFuZCBkZXRlcm1pbmUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiByZXR1cm4gYXBwcm9wcmlhdGUgYnVpbGRlclxuICAgIC8vIEZvciBub3csIHJldHVybiBhIGJhc2ljIGV4cG9ydCBidWlsZGVyIGFzIHRoYXQncyB0aGUgbW9zdCBjb21tb24gdXNlIGNhc2VcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGhleCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIG1vY2sgZXhwb3J0IGJ1aWxkZXIgZm9yIG5vd1xuICAgIC8vIEluIHRoZSBmdXR1cmUsIHRoaXMgd2lsbCBwYXJzZSB0aGUgdHJhbnNhY3Rpb24gYW5kIGRldGVybWluZSB0aGUgY29ycmVjdCB0eXBlXG4gICAgY29uc3QgYnVpbGRlciA9IG5ldyBFeHBvcnRUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIHdpdGggdGhlIGhleCBkYXRhIChwbGFjZWhvbGRlcilcbiAgICBidWlsZGVyLmluaXRCdWlsZGVyKHsgdHhIZXggfSk7XG5cbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZvciBhIHNwZWNpZmljIHR5cGVcbiAgICogQHBhcmFtIHR5cGUgLSBUcmFuc2FjdGlvbiB0eXBlXG4gICAqL1xuICBnZXRCdWlsZGVyKHR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIHJldHVybiBuZXcgRXhwb3J0VHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICByZXR1cm4gbmV3IEltcG9ydFR4QnVpbGRlcih0aGlzLl9jb2luQ29uZmlnKTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JUeEJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICAgIHJldHVybiBuZXcgRGVsZWdhdG9yVHhCdWlsZGVyKHRoaXMuX2NvaW5Db25maWcpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoYFRyYW5zYWN0aW9uIHR5cGUgJHt0eXBlfSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
package/dist/src/lib/utils.d.ts
CHANGED
|
@@ -49,6 +49,30 @@ export declare class Utils implements BaseUtils {
|
|
|
49
49
|
* @returns {boolean} - the validation result
|
|
50
50
|
*/
|
|
51
51
|
allHexChars(maybe: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Lightweight Ethereum address validation
|
|
54
|
+
* Validates that an address is a 40-character hex string (optionally prefixed with 0x)
|
|
55
|
+
*
|
|
56
|
+
* @param {string} address - the Ethereum address to validate
|
|
57
|
+
* @returns {boolean} - true if valid Ethereum address format
|
|
58
|
+
*/
|
|
59
|
+
isValidEthereumAddress(address: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Pick specific properties from an object (replaces lodash.pick)
|
|
62
|
+
*
|
|
63
|
+
* @param {T} obj - the source object
|
|
64
|
+
* @param {K[]} keys - array of property keys to pick
|
|
65
|
+
* @returns {Pick<T, K>} - new object with only the specified properties
|
|
66
|
+
*/
|
|
67
|
+
pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
|
|
68
|
+
/**
|
|
69
|
+
* Deep equality comparison (replaces lodash.isEqual)
|
|
70
|
+
*
|
|
71
|
+
* @param {unknown} a - first value to compare
|
|
72
|
+
* @param {unknown} b - second value to compare
|
|
73
|
+
* @returns {boolean} - true if values are deeply equal
|
|
74
|
+
*/
|
|
75
|
+
isEqual(a: unknown, b: unknown): boolean;
|
|
52
76
|
/** @inheritdoc */
|
|
53
77
|
isValidSignature(signature: string): boolean;
|
|
54
78
|
/** @inheritdoc */
|
|
@@ -152,6 +176,39 @@ export declare class Utils implements BaseUtils {
|
|
|
152
176
|
* @returns {string} Address string
|
|
153
177
|
*/
|
|
154
178
|
addressToString(hrp: string, chainid: string, addressBuffer: Buffer): string;
|
|
179
|
+
/**
|
|
180
|
+
* Convert string to bytes for FlareJS memo
|
|
181
|
+
* Follows FlareJS utils.stringToBytes pattern
|
|
182
|
+
* @param {string} text - Text to convert
|
|
183
|
+
* @returns {Uint8Array} Byte array
|
|
184
|
+
*/
|
|
185
|
+
stringToBytes(text: string): Uint8Array;
|
|
186
|
+
/**
|
|
187
|
+
* Convert bytes to string from FlareJS memo
|
|
188
|
+
* @param {Uint8Array} bytes - Bytes to convert
|
|
189
|
+
* @returns {string} Decoded string
|
|
190
|
+
*/
|
|
191
|
+
bytesToString(bytes: Uint8Array): string;
|
|
192
|
+
/**
|
|
193
|
+
* Create memo bytes from various input formats
|
|
194
|
+
* Supports string, JSON object, or raw bytes
|
|
195
|
+
* @param {string | Record<string, unknown> | Uint8Array} memo - Memo data
|
|
196
|
+
* @returns {Uint8Array} Memo bytes for FlareJS
|
|
197
|
+
*/
|
|
198
|
+
createMemoBytes(memo: string | Record<string, unknown> | Uint8Array): Uint8Array;
|
|
199
|
+
/**
|
|
200
|
+
* Parse memo bytes to string
|
|
201
|
+
* @param {Uint8Array} memoBytes - Memo bytes from FlareJS transaction
|
|
202
|
+
* @returns {string} Decoded memo string
|
|
203
|
+
*/
|
|
204
|
+
parseMemoBytes(memoBytes: Uint8Array): string;
|
|
205
|
+
/**
|
|
206
|
+
* Validate memo size (FlareJS has transaction size limits)
|
|
207
|
+
* @param {Uint8Array} memoBytes - Memo bytes
|
|
208
|
+
* @param {number} maxSize - Maximum size in bytes (default 4KB)
|
|
209
|
+
* @returns {boolean} Whether memo is within size limits
|
|
210
|
+
*/
|
|
211
|
+
validateMemoSize(memoBytes: Uint8Array, maxSize?: number): boolean;
|
|
155
212
|
}
|
|
156
213
|
declare const utils: Utils;
|
|
157
214
|
export default utils;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,SAAS,EACT,KAAK,EAMN,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAcjE,qBAAa,KAAM,YAAW,SAAS;IAC9B,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,EAAE,mBAAmB,EAAE,MAAM,EAAE,GAAG,OAAO;IAInF;;;;;OAKG;IACH,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO;IAYnD,OAAO,CAAC,mBAAmB;IAI3B;;;;;OAKG;IACH,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAUrC;;;;;;OAMG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAwC/B,YAAY,QAAS,MAAM,KAAG,MAAM,CAGzC;IAEF;;;;;;;;;;OAUG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiBvC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAInC,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAU5E;;;;;;;OAOG;IACH,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAQtG;;;;;;OAMG;IACH,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAUpF,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;IAI/B;;;;;OAKG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IASpD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAahE;;;;;OAKG;IACH,8BAA8B,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO;IAIjE;;;;;OAKG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,IAAI,kBAAkB;IAIlE;;;;OAIG;IACH,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,KAAK;IA4BtF;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,YAAY,GAAG,CAAC,MAAM,KAAA,KAAK,KAAK;IAmB1D;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOpC;;;;OAIG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIlD;;;;OAIG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIlD;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAWhC;;;;;;OAMG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"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"}
|