@bitgo-beta/sdk-coin-flrp 1.0.1-beta.28 → 1.0.1-beta.281

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +187 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +330 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +213 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +197 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -76
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +141 -218
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +4 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +10 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +17 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +46 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +134 -0
  37. package/dist/src/lib/transaction.d.ts +8 -73
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +139 -207
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +84 -75
  46. package/dist/src/lib/utils.d.ts +98 -147
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +346 -319
  49. package/dist/test/resources/account.d.ts +49 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +52 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  59. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInP.js +58 -0
  61. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  62. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  63. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  64. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  65. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
  67. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  69. package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
  70. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  71. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  72. package/dist/test/unit/lib/keyPair.js +158 -0
  73. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  74. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  75. package/dist/test/unit/lib/signFlowTestSuit.js +93 -0
  76. package/dist/test/unit/lib/utils.js +29 -223
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +16 -13
  79. package/.eslintignore +0 -5
  80. package/.eslintrc.json +0 -7
  81. package/.mocharc.yml +0 -8
  82. package/CHANGELOG.md +0 -0
  83. package/dist/src/iface.d.ts +0 -25
  84. package/dist/src/iface.d.ts.map +0 -1
  85. package/dist/src/iface.js +0 -3
  86. package/dist/src/lib/constants.d.ts +0 -11
  87. package/dist/src/lib/constants.d.ts.map +0 -1
  88. package/dist/src/lib/constants.js +0 -17
  89. package/dist/src/lib/errors.d.ts +0 -8
  90. package/dist/src/lib/errors.d.ts.map +0 -1
  91. package/dist/src/lib/errors.js +0 -19
  92. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  93. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  94. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  95. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  96. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  97. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  98. package/dist/test/unit/flrp.d.ts +0 -2
  99. package/dist/test/unit/flrp.d.ts.map +0 -1
  100. package/dist/test/unit/flrp.js +0 -118
  101. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  102. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  103. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  104. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  105. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  106. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  107. package/dist/test/unit/lib/transaction.d.ts +0 -2
  108. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  109. package/dist/test/unit/lib/transaction.js +0 -460
  110. package/dist/test/unit/smoke.d.ts +0 -2
  111. package/dist/test/unit/smoke.d.ts.map +0 -1
  112. package/dist/test/unit/smoke.js +0 -23
@@ -0,0 +1,330 @@
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.ExportInPTxBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
9
+ const flarejs_1 = require("@flarenetwork/flarejs");
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ const iface_1 = require("./iface");
12
+ class ExportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ // For Export FROM P-chain:
16
+ // - external chain (destination) is C-chain
17
+ // - blockchain ID (source) is P-chain
18
+ this._externalChainId = utils_1.default.cb58Decode(this.transaction._network.cChainBlockchainID);
19
+ // P-chain blockchain ID (from network config - decode from cb58 to hex)
20
+ this.transaction._blockchainID = Buffer.from(utils_1.default.cb58Decode(this.transaction._network.blockchainID)).toString('hex');
21
+ }
22
+ get transactionType() {
23
+ return sdk_core_1.TransactionType.Export;
24
+ }
25
+ /**
26
+ * Amount is a bigint that specifies the quantity of the asset that this output owns. Must be positive.
27
+ * @param {bigint | string} amount The withdrawal amount
28
+ */
29
+ amount(value) {
30
+ const valueBigInt = typeof value === 'string' ? BigInt(value) : value;
31
+ this.validateAmount(valueBigInt);
32
+ this._amount = valueBigInt;
33
+ return this;
34
+ }
35
+ initBuilder(tx, rawBytes) {
36
+ const exportTx = tx;
37
+ if (!this.verifyTxType(exportTx._type)) {
38
+ throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
39
+ }
40
+ // The exportedOutputs is a TransferableOutput array.
41
+ // It's expected to have only one output with the addresses of the sender.
42
+ const outputs = exportTx.outs;
43
+ if (outputs.length !== 1) {
44
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one external output');
45
+ }
46
+ const output = outputs[0];
47
+ const outputTransfer = output.output;
48
+ const assetId = output.assetId.toBytes();
49
+ if (Buffer.compare(Buffer.from(assetId), Buffer.from(this.transaction._assetId, 'hex')) !== 0) {
50
+ throw new Error('The Asset ID of the output does not match the transaction');
51
+ }
52
+ const outputOwners = outputTransfer.outputOwners;
53
+ // Set locktime from output
54
+ this.transaction._locktime = outputOwners.locktime.value();
55
+ // Set threshold from output
56
+ this.transaction._threshold = outputOwners.threshold.value();
57
+ // Convert output addresses to buffers and set as fromAddresses
58
+ this.transaction._fromAddresses = outputOwners.addrs.map((addr) => Buffer.from(addr.toBytes()));
59
+ // Set external chain ID from the destination chain
60
+ this._externalChainId = Buffer.from(exportTx.destination.toBytes());
61
+ // Set amount from exported output
62
+ this._amount = outputTransfer.amount();
63
+ // Recover UTXOs from base tx inputs
64
+ this.transaction._utxos = this.recoverUtxos([...exportTx.baseTx.inputs]);
65
+ // Calculate and set fee from input/output difference
66
+ const totalInputAmount = exportTx.baseTx.inputs.reduce((sum, input) => sum + input.amount(), BigInt(0));
67
+ const changeOutputAmount = exportTx.baseTx.outputs.reduce((sum, out) => {
68
+ const transferOut = out.output;
69
+ return sum + transferOut.amount();
70
+ }, BigInt(0));
71
+ const fee = totalInputAmount - changeOutputAmount - this._amount;
72
+ this.transaction._fee.fee = fee.toString();
73
+ // Extract credentials from raw bytes
74
+ let hasCredentials = false;
75
+ let credentials = [];
76
+ if (rawBytes) {
77
+ // Try standard extraction first
78
+ const result = utils_1.default.extractCredentialsFromRawBytes(rawBytes, exportTx, 'PVM');
79
+ hasCredentials = result.hasCredentials;
80
+ credentials = result.credentials;
81
+ // If extraction failed but raw bytes are longer, try parsing credentials at known offset
82
+ if ((!hasCredentials || credentials.length === 0) && rawBytes.length > 300) {
83
+ const codec = flarejs_1.utils.getManagerForVM('PVM').getDefaultCodec();
84
+ const txBytesLength = exportTx.toBytes(codec).length;
85
+ if (rawBytes.length > txBytesLength) {
86
+ hasCredentials = true;
87
+ const credResult = utils_1.default.parseCredentialsAtOffset(rawBytes, txBytesLength);
88
+ if (credResult.length > 0) {
89
+ credentials = credResult;
90
+ }
91
+ }
92
+ }
93
+ }
94
+ // If we have parsed credentials with the correct number of credentials for the inputs,
95
+ // use them directly (preserves existing signatures)
96
+ const numInputs = exportTx.baseTx.inputs.length;
97
+ const useDirectCredentials = hasCredentials && credentials.length === numInputs;
98
+ // If there are credentials in raw bytes, store the original bytes to preserve exact format
99
+ if (rawBytes && hasCredentials) {
100
+ this.transaction._rawSignedBytes = rawBytes;
101
+ }
102
+ // Create proper UnsignedTx wrapper with credentials
103
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
104
+ // Helper function to check if a signature is empty (contains no real signature data)
105
+ // A real ECDSA signature will never start with 45 bytes of zeros
106
+ const isSignatureEmpty = (sig) => {
107
+ if (!sig)
108
+ return true;
109
+ const cleanSig = utils_1.default.removeHexPrefix(sig);
110
+ if (cleanSig.length === 0)
111
+ return true;
112
+ // Check if the first 90 hex chars (45 bytes) are all zeros
113
+ // Real signatures from secp256k1 will never have this pattern
114
+ const first90Chars = cleanSig.substring(0, 90);
115
+ return first90Chars === '0'.repeat(90) || first90Chars === '0'.repeat(first90Chars.length);
116
+ };
117
+ // Build txCredentials - either use direct credentials or reconstruct with embedded addresses
118
+ let txCredentials;
119
+ if (useDirectCredentials) {
120
+ // Use the extracted credentials directly - they already have the correct signatures
121
+ // Just ensure empty slots have embedded addresses for signing identification
122
+ txCredentials = credentials;
123
+ }
124
+ else {
125
+ // Reconstruct credentials from scratch with embedded addresses
126
+ txCredentials = exportTx.baseTx.inputs.map((input, idx) => {
127
+ const transferInput = input.input;
128
+ const inputThreshold = transferInput.sigIndicies().length || this.transaction._threshold;
129
+ // Get existing signatures from parsed credentials if available
130
+ const existingSigs = [];
131
+ if (idx < credentials.length) {
132
+ const existingCred = credentials[idx];
133
+ existingSigs.push(...existingCred.getSignatures());
134
+ }
135
+ // Create credential with correct number of slots, preserving existing signatures
136
+ // Empty slots get embedded addresses for slot identification
137
+ const sigSlots = [];
138
+ for (let i = 0; i < inputThreshold; i++) {
139
+ const existingSig = i < existingSigs.length ? existingSigs[i] : null;
140
+ if (existingSig && !isSignatureEmpty(existingSig)) {
141
+ // Use existing non-empty signature (real signature from signing)
142
+ const sigHex = utils_1.default.removeHexPrefix(existingSig);
143
+ sigSlots.push(utils_1.default.createNewSig(sigHex));
144
+ }
145
+ else {
146
+ // Empty slot - create with embedded address for slot identification
147
+ const addrHex = Buffer.from(sortedAddresses[i]).toString('hex');
148
+ sigSlots.push(utils_1.default.createEmptySigWithAddress(addrHex));
149
+ }
150
+ }
151
+ return new flarejs_1.Credential(sigSlots);
152
+ });
153
+ }
154
+ // Create address maps for signing - one per input/credential
155
+ // Each address map contains all addresses mapped to their indices
156
+ const addressMaps = txCredentials.map(() => {
157
+ const addressMap = new flarejs_1.utils.AddressMap();
158
+ sortedAddresses.forEach((addr, i) => {
159
+ addressMap.set(new flarejs_1.Address(addr), i);
160
+ });
161
+ return addressMap;
162
+ });
163
+ // Always create a new UnsignedTx with properly structured credentials
164
+ const unsignedTx = new flarejs_1.UnsignedTx(exportTx, [], new flarejs_1.utils.AddressMaps(addressMaps), txCredentials);
165
+ this.transaction.setTransaction(unsignedTx);
166
+ return this;
167
+ }
168
+ static verifyTxType(txnType) {
169
+ return txnType === iface_1.FlareTransactionType.PvmExportTx;
170
+ }
171
+ verifyTxType(txnType) {
172
+ return ExportInPTxBuilder.verifyTxType(txnType);
173
+ }
174
+ /**
175
+ * Build the export transaction for P-chain
176
+ * @protected
177
+ */
178
+ buildFlareTransaction() {
179
+ // if tx has credentials, tx shouldn't change
180
+ if (this.transaction.hasCredentials)
181
+ return;
182
+ const { inputs, changeOutputs, credentials, totalAmount } = this.createExportInputs();
183
+ // Calculate fee from transaction fee settings
184
+ const fee = BigInt(this.transaction.fee.fee);
185
+ const targetAmount = this._amount + fee;
186
+ // Verify we have enough funds
187
+ if (totalAmount < targetAmount) {
188
+ throw new sdk_core_1.BuildTransactionError(`Insufficient funds: have ${totalAmount}, need ${targetAmount}`);
189
+ }
190
+ // Create the BaseTx for the P-chain export transaction
191
+ const baseTx = new flarejs_1.avaxSerial.BaseTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(Buffer.from(this.transaction._blockchainID, 'hex')), changeOutputs, // change outputs
192
+ inputs, // inputs
193
+ new flarejs_1.Bytes(new Uint8Array(0)) // empty memo
194
+ );
195
+ // Create the P-chain export transaction using pvmSerial.ExportTx
196
+ const exportTx = new flarejs_1.pvmSerial.ExportTx(baseTx, new flarejs_1.Id(this._externalChainId), // destinationChain (C-chain)
197
+ this.exportedOutputs() // exportedOutputs
198
+ );
199
+ // Create address maps for signing - one per input/credential
200
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
201
+ const addressMaps = credentials.map(() => {
202
+ const addressMap = new flarejs_1.utils.AddressMap();
203
+ sortedAddresses.forEach((addr, i) => {
204
+ addressMap.set(new flarejs_1.Address(addr), i);
205
+ });
206
+ return addressMap;
207
+ });
208
+ // Create unsigned transaction
209
+ const unsignedTx = new flarejs_1.UnsignedTx(exportTx, [], // Empty UTXOs array
210
+ new flarejs_1.utils.AddressMaps(addressMaps), credentials);
211
+ this.transaction.setTransaction(unsignedTx);
212
+ }
213
+ /**
214
+ * Create inputs from UTXOs for P-chain export
215
+ * Only selects enough UTXOs to cover the target amount (amount + fee)
216
+ * @returns inputs, change outputs, credentials, and total amount
217
+ */
218
+ createExportInputs() {
219
+ const sender = [...this.transaction._fromAddresses];
220
+ if (this.recoverSigner) {
221
+ // switch first and last signer
222
+ const tmp = sender.pop();
223
+ sender.push(sender[0]);
224
+ if (tmp) {
225
+ sender[0] = tmp;
226
+ }
227
+ }
228
+ const fee = BigInt(this.transaction.fee.fee);
229
+ const targetAmount = this._amount + fee;
230
+ let totalAmount = BigInt(0);
231
+ const inputs = [];
232
+ const credentials = [];
233
+ // Change output threshold is always 1 (matching Flare protocol behavior)
234
+ // This allows easier spending of change while maintaining security for export outputs
235
+ const changeOutputThreshold = 1;
236
+ // Only consume enough UTXOs to cover the target amount (in array order)
237
+ // Inputs will be sorted after selection
238
+ for (const utxo of this.transaction._utxos) {
239
+ // Stop if we already have enough
240
+ if (totalAmount >= targetAmount) {
241
+ break;
242
+ }
243
+ const amount = BigInt(utxo.amount);
244
+ totalAmount += amount;
245
+ // Use the UTXO's own threshold for signature indices
246
+ const utxoThreshold = utxo.threshold || this.transaction._threshold;
247
+ // Create signature indices for the UTXO's threshold
248
+ const sigIndices = [];
249
+ for (let i = 0; i < utxoThreshold; i++) {
250
+ sigIndices.push(i);
251
+ }
252
+ // Use fromNative to create TransferableInput
253
+ const txIdCb58 = utxo.txid; // Already cb58 encoded
254
+ const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
255
+ const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
256
+ inputs.push(transferableInput);
257
+ // Create credential with empty signatures that have embedded addresses for slot identification
258
+ // This allows the signing logic to determine which slot belongs to which address
259
+ const sortedAddrs = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
260
+ const emptySignatures = sigIndices.map((idx) => {
261
+ const addrHex = Buffer.from(sortedAddrs[idx]).toString('hex');
262
+ return utils_1.default.createEmptySigWithAddress(addrHex);
263
+ });
264
+ credentials.push(new flarejs_1.Credential(emptySignatures));
265
+ }
266
+ // Create change output if there is remaining amount after export and fee
267
+ const changeOutputs = [];
268
+ const changeAmount = totalAmount - this._amount - fee;
269
+ if (changeAmount > BigInt(0)) {
270
+ const assetIdBytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
271
+ // Create OutputOwners with the P-chain addresses (sorted by byte value as per AVAX protocol)
272
+ // Use threshold=1 for change outputs (matching Flare protocol behavior)
273
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
274
+ const outputOwners = new flarejs_1.OutputOwners(new flarejs_1.BigIntPr(this.transaction._locktime), new flarejs_1.Int(changeOutputThreshold), sortedAddresses.map((addr) => new flarejs_1.Address(addr)));
275
+ const transferOutput = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(changeAmount), outputOwners);
276
+ const changeOutput = new flarejs_1.TransferableOutput(new flarejs_1.Id(assetIdBytes), transferOutput);
277
+ changeOutputs.push(changeOutput);
278
+ }
279
+ // Sort inputs lexicographically by txid (Avalanche protocol requirement)
280
+ const sortedInputsWithCredentials = inputs
281
+ .map((input, i) => ({ input, credential: credentials[i] }))
282
+ .sort((a, b) => {
283
+ const aTxId = Buffer.from(a.input.utxoID.txID.toBytes());
284
+ const bTxId = Buffer.from(b.input.utxoID.txID.toBytes());
285
+ return Buffer.compare(aTxId, bTxId);
286
+ });
287
+ return {
288
+ inputs: sortedInputsWithCredentials.map((x) => x.input),
289
+ changeOutputs,
290
+ credentials: sortedInputsWithCredentials.map((x) => x.credential),
291
+ totalAmount,
292
+ };
293
+ }
294
+ /**
295
+ * Create the ExportedOutputs where the recipient address are the sender.
296
+ * Later an importTx should complete the operations signing with the same keys.
297
+ * @protected
298
+ */
299
+ exportedOutputs() {
300
+ const assetIdBytes = new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'));
301
+ // Create OutputOwners with sorted addresses
302
+ const sortedAddresses = [...this.transaction._fromAddresses].sort((a, b) => Buffer.compare(a, b));
303
+ const outputOwners = new flarejs_1.OutputOwners(new flarejs_1.BigIntPr(this.transaction._locktime), new flarejs_1.Int(this.transaction._threshold), sortedAddresses.map((addr) => new flarejs_1.Address(addr)));
304
+ const output = new flarejs_1.TransferOutput(new flarejs_1.BigIntPr(this._amount), outputOwners);
305
+ return [new flarejs_1.TransferableOutput(new flarejs_1.Id(assetIdBytes), output)];
306
+ }
307
+ /**
308
+ * Recover UTXOs from inputs
309
+ * @param inputs Array of TransferableInput
310
+ * @returns Array of decoded UTXO objects
311
+ */
312
+ recoverUtxos(inputs) {
313
+ return inputs.map((input) => {
314
+ const utxoId = input.utxoID;
315
+ // Get the threshold from the input's sigIndices length
316
+ const transferInput = input.input;
317
+ const inputThreshold = transferInput.sigIndicies().length;
318
+ return {
319
+ outputID: iface_1.SECP256K1_Transfer_Output,
320
+ amount: input.amount().toString(),
321
+ txid: utils_1.default.cb58Encode(Buffer.from(utxoId.txID.toBytes())),
322
+ outputidx: utxoId.outputIdx.value().toString(),
323
+ threshold: inputThreshold || this.transaction._threshold,
324
+ addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
325
+ };
326
+ });
327
+ }
328
+ }
329
+ exports.ExportInPTxBuilder = ExportInPTxBuilder;
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9FeHBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLHlFQUFzRTtBQUN0RSxtREFnQitCO0FBQy9CLG9EQUE0QjtBQUM1QixtQ0FBOEY7QUFFOUYsTUFBYSxrQkFBbUIsU0FBUSxtREFBd0I7SUFHOUQsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsMkJBQTJCO1FBQzNCLDRDQUE0QztRQUM1QyxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN2Rix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUM3RyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLEtBQXNCO1FBQzNCLE1BQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDdEUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQztRQUMzQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxX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QUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUMxRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzlDLFNBQVMsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVO2dCQUN4RCxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDdEQsZUFBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDekc7YUFDRixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF6WkQsZ0RBeVpDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBOb3RTdXBwb3J0ZWQsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7XG4gIHB2bVNlcmlhbCxcbiAgYXZheFNlcmlhbCxcbiAgVW5zaWduZWRUeCxcbiAgQmlnSW50UHIsXG4gIEludCxcbiAgSWQsXG4gIFRyYW5zZmVyYWJsZUlucHV0LFxuICBUcmFuc2ZlcmFibGVPdXRwdXQsXG4gIFRyYW5zZmVySW5wdXQsXG4gIEFkZHJlc3MsXG4gIHV0aWxzIGFzIEZsYXJlVXRpbHMsXG4gIFRyYW5zZmVyT3V0cHV0LFxuICBPdXRwdXRPd25lcnMsXG4gIENyZWRlbnRpYWwsXG4gIEJ5dGVzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFNFQ1AyNTZLMV9UcmFuc2Zlcl9PdXRwdXQsIEZsYXJlVHJhbnNhY3Rpb25UeXBlLCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SW5QVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBfYW1vdW50OiBiaWdpbnQ7XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIC8vIEZvciBFeHBvcnQgRlJPTSBQLWNoYWluOlxuICAgIC8vIC0gZXh0ZXJuYWwgY2hhaW4gKGRlc3RpbmF0aW9uKSBpcyBDLWNoYWluXG4gICAgLy8gLSBibG9ja2NoYWluIElEIChzb3VyY2UpIGlzIFAtY2hhaW5cbiAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSB1dGlscy5jYjU4RGVjb2RlKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgICAvLyBQLWNoYWluIGJsb2NrY2hhaW4gSUQgKGZyb20gbmV0d29yayBjb25maWcgLSBkZWNvZGUgZnJvbSBjYjU4IHRvIGhleClcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQgPSBCdWZmZXIuZnJvbSh1dGlscy5jYjU4RGVjb2RlKHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYmxvY2tjaGFpbklEKSkudG9TdHJpbmcoXG4gICAgICAnaGV4J1xuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuRXhwb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFtb3VudCBpcyBhIGJpZ2ludCB0aGF0IHNwZWNpZmllcyB0aGUgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHRoYXQgdGhpcyBvdXRwdXQgb3ducy4gTXVzdCBiZSBwb3NpdGl2ZS5cbiAgICogQHBhcmFtIHtiaWdpbnQgfCBzdHJpbmd9IGFtb3VudCBUaGUgd2l0aGRyYXdhbCBhbW91bnRcbiAgICovXG4gIGFtb3VudCh2YWx1ZTogYmlnaW50IHwgc3RyaW5nKTogdGhpcyB7XG4gICAgY29uc3QgdmFsdWVCaWdJbnQgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gQmlnSW50KHZhbHVlKSA6IHZhbHVlO1xuICAgIHRoaXMudmFsaWRhdGVBbW91bnQodmFsdWVCaWdJbnQpO1xuICAgIHRoaXMuX2Ftb3VudCA9IHZhbHVlQmlnSW50O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaW5pdEJ1aWxkZXIodHg6IFR4LCByYXdCeXRlcz86IEJ1ZmZlcik6IHRoaXMge1xuICAgIGNvbnN0IGV4cG9ydFR4ID0gdHggYXMgcHZtU2VyaWFsLkV4cG9ydFR4O1xuXG4gICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZShleHBvcnRUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhwb3J0ZWRPdXRwdXRzIGlzIGEgVHJhbnNmZXJhYmxlT3V0cHV0IGFycmF5LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgd2l0aCB0aGUgYWRkcmVzc2VzIG9mIHRoZSBzZW5kZXIuXG4gICAgY29uc3Qgb3V0cHV0cyA9IGV4cG9ydFR4Lm91dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgZXh0ZXJuYWwgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTtcbiAgICBjb25zdCBvdXRwdXRUcmFuc2ZlciA9IG91dHB1dC5vdXRwdXQgYXMgVHJhbnNmZXJPdXRwdXQ7XG4gICAgY29uc3QgYXNzZXRJZCA9IG91dHB1dC5hc3NldElkLnRvQnl0ZXMoKTtcbiAgICBpZiAoQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20oYXNzZXRJZCksIEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSkgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIEFzc2V0IElEIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgbWF0Y2ggdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0T3duZXJzID0gb3V0cHV0VHJhbnNmZXIub3V0cHV0T3duZXJzO1xuXG4gICAgLy8gU2V0IGxvY2t0aW1lIGZyb20gb3V0cHV0XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSBvdXRwdXRPd25lcnMubG9ja3RpbWUudmFsdWUoKTtcblxuICAgIC8vIFNldCB0aHJlc2hvbGQgZnJvbSBvdXRwdXRcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBvdXRwdXRPd25lcnMudGhyZXNob2xkLnZhbHVlKCk7XG5cbiAgICAvLyBDb252ZXJ0IG91dHB1dCBhZGRyZXNzZXMgdG8gYnVmZmVycyBhbmQgc2V0IGFzIGZyb21BZGRyZXNzZXNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzID0gb3V0cHV0T3duZXJzLmFkZHJzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkci50b0J5dGVzKCkpKTtcblxuICAgIC8vIFNldCBleHRlcm5hbCBjaGFpbiBJRCBmcm9tIHRoZSBkZXN0aW5hdGlvbiBjaGFpblxuICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IEJ1ZmZlci5mcm9tKGV4cG9ydFR4LmRlc3RpbmF0aW9uLnRvQnl0ZXMoKSk7XG5cbiAgICAvLyBTZXQgYW1vdW50IGZyb20gZXhwb3J0ZWQgb3V0cHV0XG4gICAgdGhpcy5fYW1vdW50ID0gb3V0cHV0VHJhbnNmZXIuYW1vdW50KCk7XG5cbiAgICAvLyBSZWNvdmVyIFVUWE9zIGZyb20gYmFzZSB0eCBpbnB1dHNcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHRoaXMucmVjb3ZlclV0eG9zKFsuLi5leHBvcnRUeC5iYXNlVHguaW5wdXRzXSk7XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBmZWUgZnJvbSBpbnB1dC9vdXRwdXQgZGlmZmVyZW5jZVxuICAgIGNvbnN0IHRvdGFsSW5wdXRBbW91bnQgPSBleHBvcnRUeC5iYXNlVHguaW5wdXRzLnJlZHVjZSgoc3VtLCBpbnB1dCkgPT4gc3VtICsgaW5wdXQuYW1vdW50KCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgY2hhbmdlT3V0cHV0QW1vdW50ID0gZXhwb3J0VHguYmFzZVR4Lm91dHB1dHMucmVkdWNlKChzdW0sIG91dCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmZXJPdXQgPSBvdXQub3V0cHV0IGFzIFRyYW5zZmVyT3V0cHV0O1xuICAgICAgcmV0dXJuIHN1bSArIHRyYW5zZmVyT3V0LmFtb3VudCgpO1xuICAgIH0sIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgZmVlID0gdG90YWxJbnB1dEFtb3VudCAtIGNoYW5nZU91dHB1dEFtb3VudCAtIHRoaXMuX2Ftb3VudDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gZmVlLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBFeHRyYWN0IGNyZWRlbnRpYWxzIGZyb20gcmF3IGJ5dGVzXG4gICAgbGV0IGhhc0NyZWRlbnRpYWxzID0gZmFsc2U7XG4gICAgbGV0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGlmIChyYXdCeXRlcykge1xuICAgICAgLy8gVHJ5IHN0YW5kYXJkIGV4dHJhY3Rpb24gZmlyc3RcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHV0aWxzLmV4dHJhY3RDcmVkZW50aWFsc0Zyb21SYXdCeXRlcyhyYXdCeXRlcywgZXhwb3J0VHgsICdQVk0nKTtcbiAgICAgIGhhc0NyZWRlbnRpYWxzID0gcmVzdWx0Lmhhc0NyZWRlbnRpYWxzO1xuICAgICAgY3JlZGVudGlhbHMgPSByZXN1bHQuY3JlZGVudGlhbHM7XG5cbiAgICAgIC8vIElmIGV4dHJhY3Rpb24gZmFpbGVkIGJ1dCByYXcgYnl0ZXMgYXJlIGxvbmdlciwgdHJ5IHBhcnNpbmcgY3JlZGVudGlhbHMgYXQga25vd24gb2Zmc2V0XG4gICAgICBpZiAoKCFoYXNDcmVkZW50aWFscyB8fCBjcmVkZW50aWFscy5sZW5ndGggPT09IDApICYmIHJhd0J5dGVzLmxlbmd0aCA+IDMwMCkge1xuICAgICAgICBjb25zdCBjb2RlYyA9IEZsYXJlVXRpbHMuZ2V0TWFuYWdlckZvclZNKCdQVk0nKS5nZXREZWZhdWx0Q29kZWMoKTtcbiAgICAgICAgY29uc3QgdHhCeXRlc0xlbmd0aCA9IGV4cG9ydFR4LnRvQnl0ZXMoY29kZWMpLmxlbmd0aDtcblxuICAgICAgICBpZiAocmF3Qnl0ZXMubGVuZ3RoID4gdHhCeXRlc0xlbmd0aCkge1xuICAgICAgICAgIGhhc0NyZWRlbnRpYWxzID0gdHJ1ZTtcbiAgICAgICAgICBjb25zdCBjcmVkUmVzdWx0ID0gdXRpbHMucGFyc2VDcmVkZW50aWFsc0F0T2Zmc2V0KHJhd0J5dGVzLCB0eEJ5dGVzTGVuZ3RoKTtcbiAgICAgICAgICBpZiAoY3JlZFJlc3VsdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjcmVkZW50aWFscyA9IGNyZWRSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBwYXJzZWQgY3JlZGVudGlhbHMgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb2YgY3JlZGVudGlhbHMgZm9yIHRoZSBpbnB1dHMsXG4gICAgLy8gdXNlIHRoZW0gZGlyZWN0bHkgKHByZXNlcnZlcyBleGlzdGluZyBzaWduYXR1cmVzKVxuICAgIGNvbnN0IG51bUlucHV0cyA9IGV4cG9ydFR4LmJhc2VUeC5pbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IHVzZURpcmVjdENyZWRlbnRpYWxzID0gaGFzQ3JlZGVudGlhbHMgJiYgY3JlZGVudGlhbHMubGVuZ3RoID09PSBudW1JbnB1dHM7XG5cbiAgICAvLyBJZiB0aGVyZSBhcmUgY3JlZGVudGlhbHMgaW4gcmF3IGJ5dGVzLCBzdG9yZSB0aGUgb3JpZ2luYWwgYnl0ZXMgdG8gcHJlc2VydmUgZXhhY3QgZm9ybWF0XG4gICAgaWYgKHJhd0J5dGVzICYmIGhhc0NyZWRlbnRpYWxzKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwcm9wZXIgVW5zaWduZWRUeCB3cmFwcGVyIHdpdGggY3JlZGVudGlhbHNcbiAgICBjb25zdCBzb3J0ZWRBZGRyZXNzZXMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgc2lnbmF0dXJlIGlzIGVtcHR5IChjb250YWlucyBubyByZWFsIHNpZ25hdHVyZSBkYXRhKVxuICAgIC8vIEEgcmVhbCBFQ0RTQSBzaWduYXR1cmUgd2lsbCBuZXZlciBzdGFydCB3aXRoIDQ1IGJ5dGVzIG9mIHplcm9zXG4gICAgY29uc3QgaXNTaWduYXR1cmVFbXB0eSA9IChzaWc6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgICAgaWYgKCFzaWcpIHJldHVybiB0cnVlO1xuICAgICAgY29uc3QgY2xlYW5TaWcgPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnKTtcbiAgICAgIGlmIChjbGVhblNpZy5sZW5ndGggPT09IDApIHJldHVybiB0cnVlO1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZpcnN0IDkwIGhleCBjaGFycyAoNDUgYnl0ZXMpIGFyZSBhbGwgemVyb3NcbiAgICAgIC8vIFJlYWwgc2lnbmF0dXJlcyBmcm9tIHNlY3AyNTZrMSB3aWxsIG5ldmVyIGhhdmUgdGhpcyBwYXR0ZXJuXG4gICAgICBjb25zdCBmaXJzdDkwQ2hhcnMgPSBjbGVhblNpZy5zdWJzdHJpbmcoMCwgOTApO1xuICAgICAgcmV0dXJuIGZpcnN0OTBDaGFycyA9PT0gJzAnLnJlcGVhdCg5MCkgfHwgZmlyc3Q5MENoYXJzID09PSAnMCcucmVwZWF0KGZpcnN0OTBDaGFycy5sZW5ndGgpO1xuICAgIH07XG5cbiAgICAvLyBCdWlsZCB0eENyZWRlbnRpYWxzIC0gZWl0aGVyIHVzZSBkaXJlY3QgY3JlZGVudGlhbHMgb3IgcmVjb25zdHJ1Y3Qgd2l0aCBlbWJlZGRlZCBhZGRyZXNzZXNcbiAgICBsZXQgdHhDcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuXG4gICAgaWYgKHVzZURpcmVjdENyZWRlbnRpYWxzKSB7XG4gICAgICAvLyBVc2UgdGhlIGV4dHJhY3RlZCBjcmVkZW50aWFscyBkaXJlY3RseSAtIHRoZXkgYWxyZWFkeSBoYXZlIHRoZSBjb3JyZWN0IHNpZ25hdHVyZXNcbiAgICAgIC8vIEp1c3QgZW5zdXJlIGVtcHR5IHNsb3RzIGhhdmUgZW1iZWRkZWQgYWRkcmVzc2VzIGZvciBzaWduaW5nIGlkZW50aWZpY2F0aW9uXG4gICAgICB0eENyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlY29uc3RydWN0IGNyZWRlbnRpYWxzIGZyb20gc2NyYXRjaCB3aXRoIGVtYmVkZGVkIGFkZHJlc3Nlc1xuICAgICAgdHhDcmVkZW50aWFscyA9IGV4cG9ydFR4LmJhc2VUeC5pbnB1dHMubWFwKChpbnB1dCwgaWR4KSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5wdXQgPSBpbnB1dC5pbnB1dCBhcyBUcmFuc2ZlcklucHV0O1xuICAgICAgICBjb25zdCBpbnB1dFRocmVzaG9sZCA9IHRyYW5zZmVySW5wdXQuc2lnSW5kaWNpZXMoKS5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuXG4gICAgICAgIC8vIEdldCBleGlzdGluZyBzaWduYXR1cmVzIGZyb20gcGFyc2VkIGNyZWRlbnRpYWxzIGlmIGF2YWlsYWJsZVxuICAgICAgICBjb25zdCBleGlzdGluZ1NpZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChpZHggPCBjcmVkZW50aWFscy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0NyZWQgPSBjcmVkZW50aWFsc1tpZHhdO1xuICAgICAgICAgIGV4aXN0aW5nU2lncy5wdXNoKC4uLmV4aXN0aW5nQ3JlZC5nZXRTaWduYXR1cmVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBjb3JyZWN0IG51bWJlciBvZiBzbG90cywgcHJlc2VydmluZyBleGlzdGluZyBzaWduYXR1cmVzXG4gICAgICAgIC8vIEVtcHR5IHNsb3RzIGdldCBlbWJlZGRlZCBhZGRyZXNzZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgICAgY29uc3Qgc2lnU2xvdHM6IFJldHVyblR5cGU8dHlwZW9mIHV0aWxzLmNyZWF0ZU5ld1NpZz5bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0VGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NpZyA9IGkgPCBleGlzdGluZ1NpZ3MubGVuZ3RoID8gZXhpc3RpbmdTaWdzW2ldIDogbnVsbDtcblxuICAgICAgICAgIGlmIChleGlzdGluZ1NpZyAmJiAhaXNTaWduYXR1cmVFbXB0eShleGlzdGluZ1NpZykpIHtcbiAgICAgICAgICAgIC8vIFVzZSBleGlzdGluZyBub24tZW1wdHkgc2lnbmF0dXJlIChyZWFsIHNpZ25hdHVyZSBmcm9tIHNpZ25pbmcpXG4gICAgICAgICAgICBjb25zdCBzaWdIZXggPSB1dGlscy5yZW1vdmVIZXhQcmVmaXgoZXhpc3RpbmdTaWcpO1xuICAgICAgICAgICAgc2lnU2xvdHMucHVzaCh1dGlscy5jcmVhdGVOZXdTaWcoc2lnSGV4KSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEVtcHR5IHNsb3QgLSBjcmVhdGUgd2l0aCBlbWJlZGRlZCBhZGRyZXNzIGZvciBzbG90IGlkZW50aWZpY2F0aW9uXG4gICAgICAgICAgICBjb25zdCBhZGRySGV4ID0gQnVmZmVyLmZyb20oc29ydGVkQWRkcmVzc2VzW2ldKS50b1N0cmluZygnaGV4Jyk7XG4gICAgICAgICAgICBzaWdTbG90cy5wdXNoKHV0aWxzLmNyZWF0ZUVtcHR5U2lnV2l0aEFkZHJlc3MoYWRkckhleCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IENyZWRlbnRpYWwoc2lnU2xvdHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFkZHJlc3MgbWFwcyBmb3Igc2lnbmluZyAtIG9uZSBwZXIgaW5wdXQvY3JlZGVudGlhbFxuICAgIC8vIEVhY2ggYWRkcmVzcyBtYXAgY29udGFpbnMgYWxsIGFkZHJlc3NlcyBtYXBwZWQgdG8gdGhlaXIgaW5kaWNlc1xuICAgIGNvbnN0IGFkZHJlc3NNYXBzID0gdHhDcmVkZW50aWFscy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKGFkZHIpLCBpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFkZHJlc3NNYXA7XG4gICAgfSk7XG5cbiAgICAvLyBBbHdheXMgY3JlYXRlIGEgbmV3IFVuc2lnbmVkVHggd2l0aCBwcm9wZXJseSBzdHJ1Y3R1cmVkIGNyZWRlbnRpYWxzXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KGV4cG9ydFR4LCBbXSwgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLCB0eENyZWRlbnRpYWxzKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eG5UeXBlID09PSBGbGFyZVRyYW5zYWN0aW9uVHlwZS5Qdm1FeHBvcnRUeDtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eG5UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gRXhwb3J0SW5QVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh0eG5UeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgZXhwb3J0IHRyYW5zYWN0aW9uIGZvciBQLWNoYWluXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gaWYgdHggaGFzIGNyZWRlbnRpYWxzLCB0eCBzaG91bGRuJ3QgY2hhbmdlXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMpIHJldHVybjtcblxuICAgIGNvbnN0IHsgaW5wdXRzLCBjaGFuZ2VPdXRwdXRzLCBjcmVkZW50aWFscywgdG90YWxBbW91bnQgfSA9IHRoaXMuY3JlYXRlRXhwb3J0SW5wdXRzKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZmVlIGZyb20gdHJhbnNhY3Rpb24gZmVlIHNldHRpbmdzXG4gICAgY29uc3QgZmVlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uZmVlLmZlZSk7XG4gICAgY29uc3QgdGFyZ2V0QW1vdW50ID0gdGhpcy5fYW1vdW50ICsgZmVlO1xuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGZ1bmRzXG4gICAgaWYgKHRvdGFsQW1vdW50IDwgdGFyZ2V0QW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IGhhdmUgJHt0b3RhbEFtb3VudH0sIG5lZWQgJHt0YXJnZXRBbW91bnR9YCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBCYXNlVHggZm9yIHRoZSBQLWNoYWluIGV4cG9ydCB0cmFuc2FjdGlvblxuICAgIGNvbnN0IGJhc2VUeCA9IG5ldyBhdmF4U2VyaWFsLkJhc2VUeChcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lEKSxcbiAgICAgIG5ldyBJZChCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQsICdoZXgnKSksXG4gICAgICBjaGFuZ2VPdXRwdXRzLCAvLyBjaGFuZ2Ugb3V0cHV0c1xuICAgICAgaW5wdXRzLCAvLyBpbnB1dHNcbiAgICAgIG5ldyBCeXRlcyhuZXcgVWludDhBcnJheSgwKSkgLy8gZW1wdHkgbWVtb1xuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIFAtY2hhaW4gZXhwb3J0IHRyYW5zYWN0aW9uIHVzaW5nIHB2bVNlcmlhbC5FeHBvcnRUeFxuICAgIGNvbnN0IGV4cG9ydFR4ID0gbmV3IHB2bVNlcmlhbC5FeHBvcnRUeChcbiAgICAgIGJhc2VUeCxcbiAgICAgIG5ldyBJZCh0aGlzLl9leHRlcm5hbENoYWluSWQpLCAvLyBkZXN0aW5hdGlvbkNoYWluIChDLWNoYWluKVxuICAgICAgdGhpcy5leHBvcnRlZE91dHB1dHMoKSAvLyBleHBvcnRlZE91dHB1dHNcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIGFkZHJlc3MgbWFwcyBmb3Igc2lnbmluZyAtIG9uZSBwZXIgaW5wdXQvY3JlZGVudGlhbFxuICAgIGNvbnN0IHNvcnRlZEFkZHJlc3NlcyA9IFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXS5zb3J0KChhLCBiKSA9PiBCdWZmZXIuY29tcGFyZShhLCBiKSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBjcmVkZW50aWFscy5tYXAoKCkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgIGFkZHJlc3NNYXAuc2V0KG5ldyBBZGRyZXNzKGFkZHIpLCBpKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGFkZHJlc3NNYXA7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdW5zaWduZWQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoXG4gICAgICBleHBvcnRUeCxcbiAgICAgIFtdLCAvLyBFbXB0eSBVVFhPcyBhcnJheVxuICAgICAgbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcHMoYWRkcmVzc01hcHMpLFxuICAgICAgY3JlZGVudGlhbHNcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5wdXRzIGZyb20gVVRYT3MgZm9yIFAtY2hhaW4gZXhwb3J0XG4gICAqIE9ubHkgc2VsZWN0cyBlbm91Z2ggVVRYT3MgdG8gY292ZXIgdGhlIHRhcmdldCBhbW91bnQgKGFtb3VudCArIGZlZSlcbiAgICogQHJldHVybnMgaW5wdXRzLCBjaGFuZ2Ugb3V0cHV0cywgY3JlZGVudGlhbHMsIGFuZCB0b3RhbCBhbW91bnRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFeHBvcnRJbnB1dHMoKToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjaGFuZ2VPdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgIHRvdGFsQW1vdW50OiBiaWdpbnQ7XG4gIH0ge1xuICAgIGNvbnN0IHNlbmRlciA9IFsuLi50aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzXTtcbiAgICBpZiAodGhpcy5yZWNvdmVyU2lnbmVyKSB7XG4gICAgICAvLyBzd2l0Y2ggZmlyc3QgYW5kIGxhc3Qgc2lnbmVyXG4gICAgICBjb25zdCB0bXAgPSBzZW5kZXIucG9wKCk7XG4gICAgICBzZW5kZXIucHVzaChzZW5kZXJbMF0pO1xuICAgICAgaWYgKHRtcCkge1xuICAgICAgICBzZW5kZXJbMF0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmVlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uZmVlLmZlZSk7XG4gICAgY29uc3QgdGFyZ2V0QW1vdW50ID0gdGhpcy5fYW1vdW50ICsgZmVlO1xuXG4gICAgbGV0IHRvdGFsQW1vdW50ID0gQmlnSW50KDApO1xuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIC8vIENoYW5nZSBvdXRwdXQgdGhyZXNob2xkIGlzIGFsd2F5cyAxIChtYXRjaGluZyBGbGFyZSBwcm90b2NvbCBiZWhhdmlvcilcbiAgICAvLyBUaGlzIGFsbG93cyBlYXNpZXIgc3BlbmRpbmcgb2YgY2hhbmdlIHdoaWxlIG1haW50YWluaW5nIHNlY3VyaXR5IGZvciBleHBvcnQgb3V0cHV0c1xuICAgIGNvbnN0IGNoYW5nZU91dHB1dFRocmVzaG9sZCA9IDE7XG5cbiAgICAvLyBPbmx5IGNvbnN1bWUgZW5vdWdoIFVUWE9zIHRvIGNvdmVyIHRoZSB0YXJnZXQgYW1vdW50IChpbiBhcnJheSBvcmRlcilcbiAgICAvLyBJbnB1dHMgd2lsbCBiZSBzb3J0ZWQgYWZ0ZXIgc2VsZWN0aW9uXG4gICAgZm9yIChjb25zdCB1dHhvIG9mIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zKSB7XG4gICAgICAvLyBTdG9wIGlmIHdlIGFscmVhZHkgaGF2ZSBlbm91Z2hcbiAgICAgIGlmICh0b3RhbEFtb3VudCA+PSB0YXJnZXRBbW91bnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFtb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG4gICAgICB0b3RhbEFtb3VudCArPSBhbW91bnQ7XG5cbiAgICAgIC8vIFVzZSB0aGUgVVRYTydzIG93biB0aHJlc2hvbGQgZm9yIHNpZ25hdHVyZSBpbmRpY2VzXG4gICAgICBjb25zdCB1dHhvVGhyZXNob2xkID0gdXR4by50aHJlc2hvbGQgfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuXG4gICAgICAvLyBDcmVhdGUgc2lnbmF0dXJlIGluZGljZXMgZm9yIHRoZSBVVFhPJ3MgdGhyZXNob2xkXG4gICAgICBjb25zdCBzaWdJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1dHhvVGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgc2lnSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgZnJvbU5hdGl2ZSB0byBjcmVhdGUgVHJhbnNmZXJhYmxlSW5wdXRcbiAgICAgIGNvbnN0IHR4SWRDYjU4ID0gdXR4by50eGlkOyAvLyBBbHJlYWR5IGNiNTggZW5jb2RlZFxuICAgICAgY29uc3QgYXNzZXRJZENiNTggPSB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0ID0gVHJhbnNmZXJhYmxlSW5wdXQuZnJvbU5hdGl2ZShcbiAgICAgICAgdHhJZENiNTgsXG4gICAgICAgIE51bWJlcih1dHhvLm91dHB1dGlkeCksXG4gICAgICAgIGFzc2V0SWRDYjU4LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXNcbiAgICAgICk7XG5cbiAgICAgIGlucHV0cy5wdXNoKHRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBlbXB0eSBzaWduYXR1cmVzIHRoYXQgaGF2ZSBlbWJlZGRlZCBhZGRyZXNzZXMgZm9yIHNsb3QgaWRlbnRpZmljYXRpb25cbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBzaWduaW5nIGxvZ2ljIHRvIGRldGVybWluZSB3aGljaCBzbG90IGJlbG9uZ3MgdG8gd2hpY2ggYWRkcmVzc1xuICAgICAgY29uc3Qgc29ydGVkQWRkcnMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2lnSW5kaWNlcy5tYXAoKGlkeCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRySGV4ID0gQnVmZmVyLmZyb20oc29ydGVkQWRkcnNbaWR4XSkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICByZXR1cm4gdXRpbHMuY3JlYXRlRW1wdHlTaWdXaXRoQWRkcmVzcyhhZGRySGV4KTtcbiAgICAgIH0pO1xuICAgICAgY3JlZGVudGlhbHMucHVzaChuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB0aGVyZSBpcyByZW1haW5pbmcgYW1vdW50IGFmdGVyIGV4cG9ydCBhbmQgZmVlXG4gICAgY29uc3QgY2hhbmdlT3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0b3RhbEFtb3VudCAtIHRoaXMuX2Ftb3VudCAtIGZlZTtcblxuICAgIGlmIChjaGFuZ2VBbW91bnQgPiBCaWdJbnQoMCkpIHtcbiAgICAgIGNvbnN0IGFzc2V0SWRCeXRlcyA9IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG5cbiAgICAgIC8vIENyZWF0ZSBPdXRwdXRPd25lcnMgd2l0aCB0aGUgUC1jaGFpbiBhZGRyZXNzZXMgKHNvcnRlZCBieSBieXRlIHZhbHVlIGFzIHBlciBBVkFYIHByb3RvY29sKVxuICAgICAgLy8gVXNlIHRocmVzaG9sZD0xIGZvciBjaGFuZ2Ugb3V0cHV0cyAobWF0Y2hpbmcgRmxhcmUgcHJvdG9jb2wgYmVoYXZpb3IpXG4gICAgICBjb25zdCBzb3J0ZWRBZGRyZXNzZXMgPSBbLi4udGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlc10uc29ydCgoYSwgYikgPT4gQnVmZmVyLmNvbXBhcmUoYSwgYikpO1xuICAgICAgY29uc3Qgb3V0cHV0T3duZXJzID0gbmV3IE91dHB1dE93bmVycyhcbiAgICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgICAgbmV3IEludChjaGFuZ2VPdXRwdXRUaHJlc2hvbGQpLFxuICAgICAgICBzb3J0ZWRBZGRyZXNzZXMubWFwKChhZGRyKSA9PiBuZXcgQWRkcmVzcyhhZGRyKSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0ID0gbmV3IFRyYW5zZmVyT3V0cHV0KG5ldyBCaWdJbnRQcihjaGFuZ2VBbW91bnQpLCBvdXRwdXRPd25lcnMpO1xuICAgICAgY29uc3QgY2hhbmdlT3V0cHV0ID0gbmV3IFRyYW5zZmVyYWJsZU91dHB1dChuZXcgSWQoYXNzZXRJZEJ5dGVzKSwgdHJhbnNmZXJPdXRwdXQpO1xuICAgICAgY2hhbmdlT3V0cHV0cy5wdXNoKGNoYW5nZU91dHB1dCk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBpbnB1dHMgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgdHhpZCAoQXZhbGFuY2hlIHByb3RvY29sIHJlcXVpcmVtZW50KVxuICAgIGNvbnN0IHNvcnRlZElucHV0c1dpdGhDcmVkZW50aWFscyA9IGlucHV0c1xuICAgICAgLm1hcCgoaW5wdXQsIGkpID0+ICh7IGlucHV0LCBjcmVkZW50aWFsOiBjcmVkZW50aWFsc1tpXSB9KSlcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFUeElkID0gQnVmZmVyLmZyb20oYS5pbnB1dC51dHhvSUQudHhJRC50b0J5dGVzKCkpO1xuICAgICAgICBjb25zdCBiVHhJZCA9IEJ1ZmZlci5mcm9tKGIuaW5wdXQudXR4b0lELnR4SUQudG9CeXRlcygpKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKGFUeElkLCBiVHhJZCk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHM6IHNvcnRlZElucHV0c1dpdGhDcmVkZW50aWFscy5tYXAoKHgpID0+IHguaW5wdXQpLFxuICAgICAgY2hhbmdlT3V0cHV0cyxcbiAgICAgIGNyZWRlbnRpYWxzOiBzb3J0ZWRJbnB1dHNXaXRoQ3JlZGVudGlhbHMubWFwKCh4KSA9PiB4LmNyZWRlbnRpYWwpLFxuICAgICAgdG90YWxBbW91bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEV4cG9ydGVkT3V0cHV0cyB3aGVyZSB0aGUgcmVjaXBpZW50IGFkZHJlc3MgYXJlIHRoZSBzZW5kZXIuXG4gICAqIExhdGVyIGFuIGltcG9ydFR4IHNob3VsZCBjb21wbGV0ZSB0aGUgb3BlcmF0aW9ucyBzaWduaW5nIHdpdGggdGhlIHNhbWUga2V5cy5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGV4cG9ydGVkT3V0cHV0cygpOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSB7XG4gICAgY29uc3QgYXNzZXRJZEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKTtcblxuICAgIC8vIENyZWF0ZSBPdXRwdXRPd25lcnMgd2l0aCBzb3J0ZWQgYWRkcmVzc2VzXG4gICAgY29uc3Qgc29ydGVkQWRkcmVzc2VzID0gWy4uLnRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNdLnNvcnQoKGEsIGIpID0+IEJ1ZmZlci5jb21wYXJlKGEsIGIpKTtcbiAgICBjb25zdCBvdXRwdXRPd25lcnMgPSBuZXcgT3V0cHV0T3duZXJzKFxuICAgICAgbmV3IEJpZ0ludFByKHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lKSxcbiAgICAgIG5ldyBJbnQodGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSxcbiAgICAgIHNvcnRlZEFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IG5ldyBBZGRyZXNzKGFkZHIpKVxuICAgICk7XG5cbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgVHJhbnNmZXJPdXRwdXQobmV3IEJpZ0ludFByKHRoaXMuX2Ftb3VudCksIG91dHB1dE93bmVycyk7XG5cbiAgICByZXR1cm4gW25ldyBUcmFuc2ZlcmFibGVPdXRwdXQobmV3IElkKGFzc2V0SWRCeXRlcyksIG91dHB1dCldO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY292ZXIgVVRYT3MgZnJvbSBpbnB1dHNcbiAgICogQHBhcmFtIGlucHV0cyBBcnJheSBvZiBUcmFuc2ZlcmFibGVJbnB1dFxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNvdmVyVXR4b3MoaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdKTogRGVjb2RlZFV0eG9PYmpbXSB7XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB1dHhvSWQgPSBpbnB1dC51dHhvSUQ7XG4gICAgICAvLyBHZXQgdGhlIHRocmVzaG9sZCBmcm9tIHRoZSBpbnB1dCdzIHNpZ0luZGljZXMgbGVuZ3RoXG4gICAgICBjb25zdCB0cmFuc2ZlcklucHV0ID0gaW5wdXQuaW5wdXQgYXMgVHJhbnNmZXJJbnB1dDtcbiAgICAgIGNvbnN0IGlucHV0VGhyZXNob2xkID0gdHJhbnNmZXJJbnB1dC5zaWdJbmRpY2llcygpLmxlbmd0aDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dHB1dElEOiBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LFxuICAgICAgICBhbW91bnQ6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgIHR4aWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20odXR4b0lkLnR4SUQudG9CeXRlcygpKSksXG4gICAgICAgIG91dHB1dGlkeDogdXR4b0lkLm91dHB1dElkeC52YWx1ZSgpLnRvU3RyaW5nKCksXG4gICAgICAgIHRocmVzaG9sZDogaW5wdXRUaHJlc2hvbGQgfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubWFwKChhZGRyKSA9PlxuICAgICAgICAgIHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCwgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hbGlhcywgQnVmZmVyLmZyb20oYWRkcikpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,47 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
+ import { TransactionType } from '@bitgo-beta/sdk-core';
3
+ import { AtomicInCTransactionBuilder } from './atomicInCTransactionBuilder';
4
+ import { Credential, TransferableInput } from '@flarenetwork/flarejs';
5
+ import { Tx } from './iface';
6
+ export declare class ImportInCTxBuilder extends AtomicInCTransactionBuilder {
7
+ constructor(_coinConfig: Readonly<CoinConfig>);
8
+ /**
9
+ * C-chain address who is target of the import.
10
+ * Address format is eth like
11
+ * @param {string} cAddress
12
+ */
13
+ to(cAddress: string): this;
14
+ protected get transactionType(): TransactionType;
15
+ initBuilder(tx: Tx): this;
16
+ static verifyTxType(txnType: string): boolean;
17
+ verifyTxType(txnType: string): boolean;
18
+ /**
19
+ * Build the import in C-chain transaction
20
+ * @protected
21
+ */
22
+ protected buildFlareTransaction(): void;
23
+ /**
24
+ * Create inputs from UTXOs
25
+ * @return {
26
+ * inputs: TransferableInput[];
27
+ * credentials: Credential[];
28
+ * amount: bigint;
29
+ * }
30
+ */
31
+ protected createInputs(): {
32
+ inputs: TransferableInput[];
33
+ credentials: Credential[];
34
+ amount: bigint;
35
+ };
36
+ /**
37
+ * Calculate the fee size for the transaction
38
+ */
39
+ private calculateFeeSize;
40
+ /**
41
+ * Recover UTXOs from imported inputs
42
+ * @param importedInputs Array of transferable inputs
43
+ * @returns Array of decoded UTXO objects
44
+ */
45
+ private recoverUtxos;
46
+ }
47
+ //# sourceMappingURL=ImportInCTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportInCTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInCTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAGL,UAAU,EAIV,iBAAiB,EAKlB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,2BAA2B;gBACrD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IA0CzB,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAmDvC;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,IAAI;QACxB,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;IAyED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}