@bitgo-beta/sdk-coin-flrp 1.0.0-alpha.5 → 1.0.0-alpha.50

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 (119) hide show
  1. package/dist/src/flrp.d.ts +9 -16
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +49 -75
  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 +51 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +188 -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 +327 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +242 -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 +245 -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 +169 -215
  25. package/dist/src/lib/iface.d.ts +38 -61
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +13 -14
  28. package/dist/src/lib/index.d.ts +5 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +12 -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 +43 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
  37. package/dist/src/lib/transaction.d.ts +25 -65
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +336 -199
  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 +50 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +129 -72
  46. package/dist/src/lib/utils.d.ts +75 -147
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +237 -324
  49. package/dist/test/resources/account.d.ts +51 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +54 -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/importInC.d.ts +27 -0
  59. package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInC.js +44 -0
  61. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  62. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  63. package/dist/test/resources/transactionData/importInP.js +58 -0
  64. package/dist/test/unit/flrp.js +449 -68
  65. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  66. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  67. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  68. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  69. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  70. package/dist/test/unit/lib/exportInPTxBuilder.js +157 -0
  71. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  72. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  73. package/dist/test/unit/lib/importInCTxBuilder.js +47 -0
  74. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  75. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  76. package/dist/test/unit/lib/importInPTxBuilder.js +107 -0
  77. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  78. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  79. package/dist/test/unit/lib/keyPair.js +158 -0
  80. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  81. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  82. package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
  83. package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
  84. package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
  85. package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
  86. package/dist/test/unit/lib/utils.js +507 -207
  87. package/dist/tsconfig.tsbuildinfo +1 -1
  88. package/package.json +18 -10
  89. package/.eslintignore +0 -5
  90. package/.eslintrc.json +0 -7
  91. package/.mocharc.yml +0 -8
  92. package/CHANGELOG.md +0 -0
  93. package/dist/src/iface.d.ts +0 -25
  94. package/dist/src/iface.d.ts.map +0 -1
  95. package/dist/src/iface.js +0 -3
  96. package/dist/src/lib/constants.d.ts +0 -11
  97. package/dist/src/lib/constants.d.ts.map +0 -1
  98. package/dist/src/lib/constants.js +0 -17
  99. package/dist/src/lib/errors.d.ts +0 -8
  100. package/dist/src/lib/errors.d.ts.map +0 -1
  101. package/dist/src/lib/errors.js +0 -19
  102. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  103. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  104. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  105. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  106. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  107. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  108. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  109. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  110. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  111. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  112. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  113. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  114. package/dist/test/unit/lib/transaction.d.ts +0 -2
  115. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  116. package/dist/test/unit/lib/transaction.js +0 -460
  117. package/dist/test/unit/smoke.d.ts +0 -2
  118. package/dist/test/unit/smoke.d.ts.map +0 -1
  119. package/dist/test/unit/smoke.js +0 -23
@@ -0,0 +1,242 @@
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.ImportInCTxBuilder = void 0;
7
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
9
+ const flarejs_1 = require("@flarenetwork/flarejs");
10
+ const utils_1 = __importDefault(require("./utils"));
11
+ const iface_1 = require("./iface");
12
+ class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
13
+ constructor(_coinConfig) {
14
+ super(_coinConfig);
15
+ }
16
+ /**
17
+ * C-chain address who is target of the import.
18
+ * Address format is eth like
19
+ * @param {string} cAddress
20
+ */
21
+ to(cAddress) {
22
+ this.transaction._to = [utils_1.default.parseAddress(cAddress)];
23
+ return this;
24
+ }
25
+ get transactionType() {
26
+ return sdk_core_1.TransactionType.Import;
27
+ }
28
+ initBuilder(tx, rawBytes, parsedCredentials) {
29
+ const baseTx = tx;
30
+ if (!this.verifyTxType(baseTx._type)) {
31
+ throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
32
+ }
33
+ // The outputs is a single C-Chain address result.
34
+ // It's expected to have only one output to the destination C-Chain address.
35
+ const outputs = baseTx.Outs;
36
+ if (outputs.length !== 1) {
37
+ throw new sdk_core_1.BuildTransactionError('Transaction can have one output');
38
+ }
39
+ const output = outputs[0];
40
+ if (Buffer.from(output.assetId.toBytes()).toString('hex') !== this.transaction._assetId) {
41
+ throw new Error('AssetID are not equals');
42
+ }
43
+ this.transaction._to = [Buffer.from(output.address.toBytes())];
44
+ const inputs = baseTx.importedInputs;
45
+ this.transaction._utxos = this.recoverUtxos(inputs);
46
+ // Calculate total input and output amounts
47
+ const totalInputAmount = inputs.reduce((t, i) => t + i.amount(), BigInt(0));
48
+ const totalOutputAmount = output.amount.value();
49
+ // Calculate fee based on input/output difference
50
+ const fee = totalInputAmount - totalOutputAmount;
51
+ const feeSize = this.calculateFeeSize(baseTx);
52
+ // Use integer division to ensure feeRate can be converted back to BigInt
53
+ const feeRate = Math.floor(Number(fee) / feeSize);
54
+ this.transaction._fee = {
55
+ fee: fee.toString(),
56
+ feeRate: feeRate,
57
+ size: feeSize,
58
+ };
59
+ // Use credentials passed from TransactionBuilderFactory (properly extracted using codec)
60
+ const credentials = parsedCredentials || [];
61
+ const hasCredentials = credentials.length > 0;
62
+ // If it's a signed transaction, store the original raw bytes to preserve exact format
63
+ if (hasCredentials && rawBytes) {
64
+ this.transaction._rawSignedBytes = rawBytes;
65
+ }
66
+ // Extract threshold from first input's sigIndicies (number of required signatures)
67
+ const firstInput = inputs[0];
68
+ const inputThreshold = firstInput.sigIndicies().length || this.transaction._threshold;
69
+ this.transaction._threshold = inputThreshold;
70
+ // Create proper UnsignedTx wrapper with credentials
71
+ const toAddress = new flarejs_1.Address(output.address.toBytes());
72
+ const addressMap = new flarejs_1.utils.AddressMap([[toAddress, 0]]);
73
+ const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
74
+ // When credentials were extracted, use them directly to preserve existing signatures
75
+ // For initBuilder, _fromAddresses may not be set yet, so use all zeros for credential slots
76
+ let txCredentials;
77
+ if (credentials.length > 0) {
78
+ txCredentials = credentials;
79
+ }
80
+ else {
81
+ // Create empty credential with threshold number of signature slots (all zeros)
82
+ const emptySignatures = [];
83
+ for (let i = 0; i < inputThreshold; i++) {
84
+ emptySignatures.push(utils_1.default.createNewSig(''));
85
+ }
86
+ txCredentials = [new flarejs_1.Credential(emptySignatures)];
87
+ }
88
+ const unsignedTx = new flarejs_1.UnsignedTx(baseTx, [], addressMaps, txCredentials);
89
+ this.transaction.setTransaction(unsignedTx);
90
+ return this;
91
+ }
92
+ static verifyTxType(txnType) {
93
+ return txnType === iface_1.FlareTransactionType.EvmImportTx;
94
+ }
95
+ verifyTxType(txnType) {
96
+ return ImportInCTxBuilder.verifyTxType(txnType);
97
+ }
98
+ /**
99
+ * Build the import in C-chain transaction
100
+ * @protected
101
+ */
102
+ buildFlareTransaction() {
103
+ // if tx has credentials or was already recovered from raw, tx shouldn't change
104
+ if (this.transaction.hasCredentials)
105
+ return;
106
+ if (this.transaction._to.length !== 1) {
107
+ throw new Error('to is required');
108
+ }
109
+ if (!this.transaction._fee.feeRate) {
110
+ throw new Error('fee rate is required');
111
+ }
112
+ const { inputs, amount, credentials } = this.createInputs();
113
+ // Calculate fee
114
+ const feeRate = BigInt(this.transaction._fee.feeRate);
115
+ const feeSize = this.calculateFeeSize();
116
+ const fee = feeRate * BigInt(feeSize);
117
+ this.transaction._fee.fee = fee.toString();
118
+ this.transaction._fee.size = feeSize;
119
+ // Create EVM output using proper FlareJS class
120
+ const output = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount - fee), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
121
+ // Create the import transaction
122
+ const importTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [output]);
123
+ // Create unsigned transaction with all potential signers in address map
124
+ const addressMap = new flarejs_1.utils.AddressMap();
125
+ this.transaction._fromAddresses.forEach((addr, i) => {
126
+ addressMap.set(new flarejs_1.Address(addr), i);
127
+ });
128
+ const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
129
+ const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], // Empty UTXOs array, will be filled during processing
130
+ addressMaps, credentials);
131
+ this.transaction.setTransaction(unsignedTx);
132
+ }
133
+ /**
134
+ * Create inputs from UTXOs
135
+ * @return {
136
+ * inputs: TransferableInput[];
137
+ * credentials: Credential[];
138
+ * amount: bigint;
139
+ * }
140
+ */
141
+ createInputs() {
142
+ const sender = this.transaction._fromAddresses.slice();
143
+ if (this.recoverSigner) {
144
+ // switch first and last signer
145
+ const tmp = sender.pop();
146
+ sender.push(sender[0]);
147
+ if (tmp) {
148
+ sender[0] = tmp;
149
+ }
150
+ }
151
+ let totalAmount = BigInt(0);
152
+ const inputs = [];
153
+ const credentials = [];
154
+ this.transaction._utxos.forEach((utxo) => {
155
+ const amount = BigInt(utxo.amount);
156
+ totalAmount += amount;
157
+ // Create signature indices for threshold
158
+ const sigIndices = [];
159
+ for (let i = 0; i < this.transaction._threshold; i++) {
160
+ sigIndices.push(i);
161
+ }
162
+ // Use fromNative to create TransferableInput (same pattern as ImportInPTxBuilder)
163
+ // fromNative expects cb58-encoded strings for txId and assetId
164
+ const txIdCb58 = utxo.txid; // Already cb58 encoded
165
+ const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
166
+ const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
167
+ inputs.push(transferableInput);
168
+ // Create credential with empty signatures for slot identification
169
+ // Match avaxp behavior: dynamic ordering based on addressesIndex from UTXO
170
+ const hasAddresses = this.transaction._fromAddresses && this.transaction._fromAddresses.length >= this.transaction._threshold;
171
+ if (!hasAddresses) {
172
+ // If addresses not available, use all zeros
173
+ const emptySignatures = sigIndices.map(() => utils_1.default.createNewSig(''));
174
+ credentials.push(new flarejs_1.Credential(emptySignatures));
175
+ }
176
+ else {
177
+ // Compute addressesIndex: position of each _fromAddresses in UTXO's address list
178
+ const utxoAddresses = utxo.addresses.map((a) => utils_1.default.parseAddress(a));
179
+ const addressesIndex = this.transaction._fromAddresses.map((a) => utxoAddresses.findIndex((u) => Buffer.compare(Buffer.from(u), Buffer.from(a)) === 0));
180
+ // either user (0) or recovery (2)
181
+ const firstIndex = this.recoverSigner ? 2 : 0;
182
+ const bitgoIndex = 1;
183
+ // Dynamic ordering based on addressesIndex
184
+ let emptySignatures;
185
+ if (addressesIndex[bitgoIndex] < addressesIndex[firstIndex]) {
186
+ // Bitgo comes first in signature order: [zeros, userAddress]
187
+ emptySignatures = [
188
+ utils_1.default.createNewSig(''),
189
+ utils_1.default.createEmptySigWithAddress(Buffer.from(this.transaction._fromAddresses[firstIndex]).toString('hex')),
190
+ ];
191
+ }
192
+ else {
193
+ // User comes first in signature order: [userAddress, zeros]
194
+ emptySignatures = [
195
+ utils_1.default.createEmptySigWithAddress(Buffer.from(this.transaction._fromAddresses[firstIndex]).toString('hex')),
196
+ utils_1.default.createNewSig(''),
197
+ ];
198
+ }
199
+ credentials.push(new flarejs_1.Credential(emptySignatures));
200
+ }
201
+ });
202
+ return {
203
+ inputs,
204
+ credentials,
205
+ amount: totalAmount,
206
+ };
207
+ }
208
+ /**
209
+ * Calculate the fee size for the transaction
210
+ * For C-chain imports, the feeRate is treated as an absolute fee value
211
+ */
212
+ calculateFeeSize(tx) {
213
+ // If tx is provided, calculate based on actual transaction size
214
+ if (tx) {
215
+ const codec = flarejs_1.avmSerial.getAVMManager().getDefaultCodec();
216
+ return tx.toBytes(codec).length;
217
+ }
218
+ // For C-chain imports, treat feeRate as the absolute fee (multiplier of 1)
219
+ return 1;
220
+ }
221
+ /**
222
+ * Recover UTXOs from imported inputs
223
+ * @param importedInputs Array of transferable inputs
224
+ * @returns Array of decoded UTXO objects
225
+ */
226
+ recoverUtxos(importedInputs) {
227
+ return importedInputs.map((input) => {
228
+ const txid = input.utxoID.toString();
229
+ const outputidx = input.utxoID.outputIdx.toString();
230
+ return {
231
+ outputID: iface_1.SECP256K1_Transfer_Output,
232
+ amount: input.amount().toString(),
233
+ txid: utils_1.default.cb58Encode(Buffer.from(txid, 'hex')),
234
+ outputidx: outputidx,
235
+ threshold: this.transaction._threshold,
236
+ addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
237
+ };
238
+ });
239
+ }
240
+ }
241
+ exports.ImportInCTxBuilder = ImportInCTxBuilder;
242
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLCtFQUE0RTtBQUM1RSxtREFXK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUNqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxRQUFnQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENB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TUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRXBELE9BQU87Z0JBQ0wsUUFBUSxFQUFFLGlDQUF5QjtnQkFDbkMsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxlQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVTtnQkFDdEMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ3RELGVBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ3pHO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBdlNELGdEQXVTQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgTm90U3VwcG9ydGVkLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBBdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL2F0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQge1xuICBldm1TZXJpYWwsXG4gIFVuc2lnbmVkVHgsXG4gIENyZWRlbnRpYWwsXG4gIEJpZ0ludFByLFxuICBJbnQsXG4gIElkLFxuICBUcmFuc2ZlcmFibGVJbnB1dCxcbiAgQWRkcmVzcyxcbiAgdXRpbHMgYXMgRmxhcmVVdGlscyxcbiAgYXZtU2VyaWFsLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIEZsYXJlVHJhbnNhY3Rpb25UeXBlLCBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LCBUeCB9IGZyb20gJy4vaWZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW1wb3J0SW5DVHhCdWlsZGVyIGV4dGVuZHMgQXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEMtY2hhaW4gYWRkcmVzcyB3aG8gaXMgdGFyZ2V0IG9mIHRoZSBpbXBvcnQuXG4gICAqIEFkZHJlc3MgZm9ybWF0IGlzIGV0aCBsaWtlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjQWRkcmVzc1xuICAgKi9cbiAgdG8oY0FkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RvID0gW3V0aWxzLnBhcnNlQWRkcmVzcyhjQWRkcmVzcyldO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkltcG9ydDtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUeCwgcmF3Qnl0ZXM/OiBCdWZmZXIsIHBhcnNlZENyZWRlbnRpYWxzPzogQ3JlZGVudGlhbFtdKTogdGhpcyB7XG4gICAgY29uc3QgYmFzZVR4ID0gdHggYXMgZXZtU2VyaWFsLkltcG9ydFR4O1xuICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUoYmFzZVR4Ll90eXBlKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZCgnVHJhbnNhY3Rpb24gY2Fubm90IGJlIHBhcnNlZCBvciBoYXMgYW4gdW5zdXBwb3J0ZWQgdHJhbnNhY3Rpb24gdHlwZScpO1xuICAgIH1cblxuICAgIC8vIFRoZSBvdXRwdXRzIGlzIGEgc2luZ2xlIEMtQ2hhaW4gYWRkcmVzcyByZXN1bHQuXG4gICAgLy8gSXQncyBleHBlY3RlZCB0byBoYXZlIG9ubHkgb25lIG91dHB1dCB0byB0aGUgZGVzdGluYXRpb24gQy1DaGFpbiBhZGRyZXNzLlxuICAgIGNvbnN0IG91dHB1dHMgPSBiYXNlVHguT3V0cztcbiAgICBpZiAob3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGNhbiBoYXZlIG9uZSBvdXRwdXQnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0ID0gb3V0cHV0c1swXTtcblxuICAgIGlmIChCdWZmZXIuZnJvbShvdXRwdXQuYXNzZXRJZC50b0J5dGVzKCkpLnRvU3RyaW5nKCdoZXgnKSAhPT0gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NldElEIGFyZSBub3QgZXF1YWxzJyk7XG4gICAgfVxuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RvID0gW0J1ZmZlci5mcm9tKG91dHB1dC5hZGRyZXNzLnRvQnl0ZXMoKSldO1xuXG4gICAgY29uc3QgaW5wdXRzID0gYmFzZVR4LmltcG9ydGVkSW5wdXRzO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3V0eG9zID0gdGhpcy5yZWNvdmVyVXR4b3MoaW5wdXRzKTtcblxuICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBpbnB1dCBhbmQgb3V0cHV0IGFtb3VudHNcbiAgICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gaW5wdXRzLnJlZHVjZSgodCwgaSkgPT4gdCArIGkuYW1vdW50KCksIEJpZ0ludCgwKSk7XG4gICAgY29uc3QgdG90YWxPdXRwdXRBbW91bnQgPSBvdXRwdXQuYW1vdW50LnZhbHVlKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgZmVlIGJhc2VkIG9uIGlucHV0L291dHB1dCBkaWZmZXJlbmNlXG4gICAgY29uc3QgZmVlID0gdG90YWxJbnB1dEFtb3VudCAtIHRvdGFsT3V0cHV0QW1vdW50O1xuICAgIGNvbnN0IGZlZVNpemUgPSB0aGlzLmNhbGN1bGF0ZUZlZVNpemUoYmFzZVR4KTtcbiAgICAvLyBVc2UgaW50ZWdlciBkaXZpc2lvbiB0byBlbnN1cmUgZmVlUmF0ZSBjYW4gYmUgY29udmVydGVkIGJhY2sgdG8gQmlnSW50XG4gICAgY29uc3QgZmVlUmF0ZSA9IE1hdGguZmxvb3IoTnVtYmVyKGZlZSkgLyBmZWVTaXplKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZSA9IHtcbiAgICAgIGZlZTogZmVlLnRvU3RyaW5nKCksXG4gICAgICBmZWVSYXRlOiBmZWVSYXRlLFxuICAgICAgc2l6ZTogZmVlU2l6ZSxcbiAgICB9O1xuXG4gICAgLy8gVXNlIGNyZWRlbnRpYWxzIHBhc3NlZCBmcm9tIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgKHByb3Blcmx5IGV4dHJhY3RlZCB1c2luZyBjb2RlYylcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHBhcnNlZENyZWRlbnRpYWxzIHx8IFtdO1xuICAgIGNvbnN0IGhhc0NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMubGVuZ3RoID4gMDtcblxuICAgIC8vIElmIGl0J3MgYSBzaWduZWQgdHJhbnNhY3Rpb24sIHN0b3JlIHRoZSBvcmlnaW5hbCByYXcgYnl0ZXMgdG8gcHJlc2VydmUgZXhhY3QgZm9ybWF0XG4gICAgaWYgKGhhc0NyZWRlbnRpYWxzICYmIHJhd0J5dGVzKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9yYXdTaWduZWRCeXRlcyA9IHJhd0J5dGVzO1xuICAgIH1cblxuICAgIC8vIEV4dHJhY3QgdGhyZXNob2xkIGZyb20gZmlyc3QgaW5wdXQncyBzaWdJbmRpY2llcyAobnVtYmVyIG9mIHJlcXVpcmVkIHNpZ25hdHVyZXMpXG4gICAgY29uc3QgZmlyc3RJbnB1dCA9IGlucHV0c1swXTtcbiAgICBjb25zdCBpbnB1dFRocmVzaG9sZCA9IGZpcnN0SW5wdXQuc2lnSW5kaWNpZXMoKS5sZW5ndGggfHwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCA9IGlucHV0VGhyZXNob2xkO1xuXG4gICAgLy8gQ3JlYXRlIHByb3BlciBVbnNpZ25lZFR4IHdyYXBwZXIgd2l0aCBjcmVkZW50aWFsc1xuICAgIGNvbnN0IHRvQWRkcmVzcyA9IG5ldyBBZGRyZXNzKG91dHB1dC5hZGRyZXNzLnRvQnl0ZXMoKSk7XG4gICAgY29uc3QgYWRkcmVzc01hcCA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoW1t0b0FkZHJlc3MsIDBdXSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgLy8gV2hlbiBjcmVkZW50aWFscyB3ZXJlIGV4dHJhY3RlZCwgdXNlIHRoZW0gZGlyZWN0bHkgdG8gcHJlc2VydmUgZXhpc3Rpbmcgc2lnbmF0dXJlc1xuICAgIC8vIEZvciBpbml0QnVpbGRlciwgX2Zyb21BZGRyZXNzZXMgbWF5IG5vdCBiZSBzZXQgeWV0LCBzbyB1c2UgYWxsIHplcm9zIGZvciBjcmVkZW50aWFsIHNsb3RzXG4gICAgbGV0IHR4Q3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBpZiAoY3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgdHhDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDcmVhdGUgZW1wdHkgY3JlZGVudGlhbCB3aXRoIHRocmVzaG9sZCBudW1iZXIgb2Ygc2lnbmF0dXJlIHNsb3RzIChhbGwgemVyb3MpXG4gICAgICBjb25zdCBlbXB0eVNpZ25hdHVyZXM6IFJldHVyblR5cGU8dHlwZW9mIHV0aWxzLmNyZWF0ZU5ld1NpZz5bXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFRocmVzaG9sZDsgaSsrKSB7XG4gICAgICAgIGVtcHR5U2lnbmF0dXJlcy5wdXNoKHV0aWxzLmNyZWF0ZU5ld1NpZygnJykpO1xuICAgICAgfVxuICAgICAgdHhDcmVkZW50aWFscyA9IFtuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpXTtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoYmFzZVR4LCBbXSwgYWRkcmVzc01hcHMsIHR4Q3JlZGVudGlhbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR4blR5cGUgPT09IEZsYXJlVHJhbnNhY3Rpb25UeXBlLkV2bUltcG9ydFR4O1xuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHR4blR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHR4blR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgaW4gQy1jaGFpbiB0cmFuc2FjdGlvblxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGlmIHR4IGhhcyBjcmVkZW50aWFscyBvciB3YXMgYWxyZWFkeSByZWNvdmVyZWQgZnJvbSByYXcsIHR4IHNob3VsZG4ndCBjaGFuZ2VcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLl90by5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndG8gaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlUmF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmZWUgcmF0ZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaW5wdXRzLCBhbW91bnQsIGNyZWRlbnRpYWxzIH0gPSB0aGlzLmNyZWF0ZUlucHV0cygpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGZlZVxuICAgIGNvbnN0IGZlZVJhdGUgPSBCaWdJbnQodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZVJhdGUpO1xuICAgIGNvbnN0IGZlZVNpemUgPSB0aGlzLmNhbGN1bGF0ZUZlZVNpemUoKTtcbiAgICBjb25zdCBmZWUgPSBmZWVSYXRlICogQmlnSW50KGZlZVNpemUpO1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSBmZWUudG9TdHJpbmcoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuc2l6ZSA9IGZlZVNpemU7XG5cbiAgICAvLyBDcmVhdGUgRVZNIG91dHB1dCB1c2luZyBwcm9wZXIgRmxhcmVKUyBjbGFzc1xuICAgIGNvbnN0IG91dHB1dCA9IG5ldyBldm1TZXJpYWwuT3V0cHV0KFxuICAgICAgbmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fdG9bMF0pLFxuICAgICAgbmV3IEJpZ0ludFByKGFtb3VudCAtIGZlZSksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKSlcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICBjb25zdCBpbXBvcnRUeCA9IG5ldyBldm1TZXJpYWwuSW1wb3J0VHgoXG4gICAgICBuZXcgSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELCAnaGV4JykpKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheSh0aGlzLl9leHRlcm5hbENoYWluSWQpKSxcbiAgICAgIGlucHV0cyxcbiAgICAgIFtvdXRwdXRdXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB1bnNpZ25lZCB0cmFuc2FjdGlvbiB3aXRoIGFsbCBwb3RlbnRpYWwgc2lnbmVycyBpbiBhZGRyZXNzIG1hcFxuICAgIGNvbnN0IGFkZHJlc3NNYXAgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICBhZGRyZXNzTWFwLnNldChuZXcgQWRkcmVzcyhhZGRyKSwgaSk7XG4gICAgfSk7XG4gICAgY29uc3QgYWRkcmVzc01hcHMgPSBuZXcgRmxhcmVVdGlscy5BZGRyZXNzTWFwcyhbYWRkcmVzc01hcF0pO1xuXG4gICAgY29uc3QgdW5zaWduZWRUeCA9IG5ldyBVbnNpZ25lZFR4KFxuICAgICAgaW1wb3J0VHgsXG4gICAgICBbXSwgLy8gRW1wdHkgVVRYT3MgYXJyYXksIHdpbGwgYmUgZmlsbGVkIGR1cmluZyBwcm9jZXNzaW5nXG4gICAgICBhZGRyZXNzTWFwcyxcbiAgICAgIGNyZWRlbnRpYWxzXG4gICAgKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBmcm9tIFVUWE9zXG4gICAqIEByZXR1cm4ge1xuICAgKiAgICAgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdO1xuICAgKiAgICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICogICAgIGFtb3VudDogYmlnaW50O1xuICAgKiB9XG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRzKCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBhbW91bnQ6IGJpZ2ludDtcbiAgfSB7XG4gICAgY29uc3Qgc2VuZGVyID0gdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5zbGljZSgpO1xuICAgIGlmICh0aGlzLnJlY292ZXJTaWduZXIpIHtcbiAgICAgIC8vIHN3aXRjaCBmaXJzdCBhbmQgbGFzdCBzaWduZXJcbiAgICAgIGNvbnN0IHRtcCA9IHNlbmRlci5wb3AoKTtcbiAgICAgIHNlbmRlci5wdXNoKHNlbmRlclswXSk7XG4gICAgICBpZiAodG1wKSB7XG4gICAgICAgIHNlbmRlclswXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdG90YWxBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgY29uc3QgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdXR4b3MuZm9yRWFjaCgodXR4bykgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gQmlnSW50KHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsQW1vdW50ICs9IGFtb3VudDtcblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBpbmRpY2VzIGZvciB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IHNpZ0luZGljZXM6IG51bWJlcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDsgaSsrKSB7XG4gICAgICAgIHNpZ0luZGljZXMucHVzaChpKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlIGZyb21OYXRpdmUgdG8gY3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IChzYW1lIHBhdHRlcm4gYXMgSW1wb3J0SW5QVHhCdWlsZGVyKVxuICAgICAgLy8gZnJvbU5hdGl2ZSBleHBlY3RzIGNiNTgtZW5jb2RlZCBzdHJpbmdzIGZvciB0eElkIGFuZCBhc3NldElkXG4gICAgICBjb25zdCB0eElkQ2I1OCA9IHV0eG8udHhpZDsgLy8gQWxyZWFkeSBjYjU4IGVuY29kZWRcbiAgICAgIGNvbnN0IGFzc2V0SWRDYjU4ID0gdXRpbHMuY2I1OEVuY29kZShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl9hc3NldElkLCAnaGV4JykpO1xuXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IFRyYW5zZmVyYWJsZUlucHV0LmZyb21OYXRpdmUoXG4gICAgICAgIHR4SWRDYjU4LFxuICAgICAgICBOdW1iZXIodXR4by5vdXRwdXRpZHgpLFxuICAgICAgICBhc3NldElkQ2I1OCxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBzaWdJbmRpY2VzXG4gICAgICApO1xuXG4gICAgICBpbnB1dHMucHVzaCh0cmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggZW1wdHkgc2lnbmF0dXJlcyBmb3Igc2xvdCBpZGVudGlmaWNhdGlvblxuICAgICAgLy8gTWF0Y2ggYXZheHAgYmVoYXZpb3I6IGR5bmFtaWMgb3JkZXJpbmcgYmFzZWQgb24gYWRkcmVzc2VzSW5kZXggZnJvbSBVVFhPXG4gICAgICBjb25zdCBoYXNBZGRyZXNzZXMgPVxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzICYmIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubGVuZ3RoID49IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDtcblxuICAgICAgaWYgKCFoYXNBZGRyZXNzZXMpIHtcbiAgICAgICAgLy8gSWYgYWRkcmVzc2VzIG5vdCBhdmFpbGFibGUsIHVzZSBhbGwgemVyb3NcbiAgICAgICAgY29uc3QgZW1wdHlTaWduYXR1cmVzID0gc2lnSW5kaWNlcy5tYXAoKCkgPT4gdXRpbHMuY3JlYXRlTmV3U2lnKCcnKSk7XG4gICAgICAgIGNyZWRlbnRpYWxzLnB1c2gobmV3IENyZWRlbnRpYWwoZW1wdHlTaWduYXR1cmVzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDb21wdXRlIGFkZHJlc3Nlc0luZGV4OiBwb3NpdGlvbiBvZiBlYWNoIF9mcm9tQWRkcmVzc2VzIGluIFVUWE8ncyBhZGRyZXNzIGxpc3RcbiAgICAgICAgY29uc3QgdXR4b0FkZHJlc3NlcyA9IHV0eG8uYWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMucGFyc2VBZGRyZXNzKGEpKTtcbiAgICAgICAgY29uc3QgYWRkcmVzc2VzSW5kZXggPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT5cbiAgICAgICAgICB1dHhvQWRkcmVzc2VzLmZpbmRJbmRleCgodSkgPT4gQnVmZmVyLmNvbXBhcmUoQnVmZmVyLmZyb20odSksIEJ1ZmZlci5mcm9tKGEpKSA9PT0gMClcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBlaXRoZXIgdXNlciAoMCkgb3IgcmVjb3ZlcnkgKDIpXG4gICAgICAgIGNvbnN0IGZpcnN0SW5kZXggPSB0aGlzLnJlY292ZXJTaWduZXIgPyAyIDogMDtcbiAgICAgICAgY29uc3QgYml0Z29JbmRleCA9IDE7XG5cbiAgICAgICAgLy8gRHluYW1pYyBvcmRlcmluZyBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleFxuICAgICAgICBsZXQgZW1wdHlTaWduYXR1cmVzOiBSZXR1cm5UeXBlPHR5cGVvZiB1dGlscy5jcmVhdGVOZXdTaWc+W107XG4gICAgICAgIGlmIChhZGRyZXNzZXNJbmRleFtiaXRnb0luZGV4XSA8IGFkZHJlc3Nlc0luZGV4W2ZpcnN0SW5kZXhdKSB7XG4gICAgICAgICAgLy8gQml0Z28gY29tZXMgZmlyc3QgaW4gc2lnbmF0dXJlIG9yZGVyOiBbemVyb3MsIHVzZXJBZGRyZXNzXVxuICAgICAgICAgIGVtcHR5U2lnbmF0dXJlcyA9IFtcbiAgICAgICAgICAgIHV0aWxzLmNyZWF0ZU5ld1NpZygnJyksXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVFbXB0eVNpZ1dpdGhBZGRyZXNzKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbZmlyc3RJbmRleF0pLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBVc2VyIGNvbWVzIGZpcnN0IGluIHNpZ25hdHVyZSBvcmRlcjogW3VzZXJBZGRyZXNzLCB6ZXJvc11cbiAgICAgICAgICBlbXB0eVNpZ25hdHVyZXMgPSBbXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVFbXB0eVNpZ1dpdGhBZGRyZXNzKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXNbZmlyc3RJbmRleF0pLnRvU3RyaW5nKCdoZXgnKSksXG4gICAgICAgICAgICB1dGlscy5jcmVhdGVOZXdTaWcoJycpLFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgY3JlZGVudGlhbHMucHVzaChuZXcgQ3JlZGVudGlhbChlbXB0eVNpZ25hdHVyZXMpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIGFtb3VudDogdG90YWxBbW91bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGZlZSBzaXplIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICogRm9yIEMtY2hhaW4gaW1wb3J0cywgdGhlIGZlZVJhdGUgaXMgdHJlYXRlZCBhcyBhbiBhYnNvbHV0ZSBmZWUgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlRmVlU2l6ZSh0eD86IGV2bVNlcmlhbC5JbXBvcnRUeCk6IG51bWJlciB7XG4gICAgLy8gSWYgdHggaXMgcHJvdmlkZWQsIGNhbGN1bGF0ZSBiYXNlZCBvbiBhY3R1YWwgdHJhbnNhY3Rpb24gc2l6ZVxuICAgIGlmICh0eCkge1xuICAgICAgY29uc3QgY29kZWMgPSBhdm1TZXJpYWwuZ2V0QVZNTWFuYWdlcigpLmdldERlZmF1bHRDb2RlYygpO1xuICAgICAgcmV0dXJuIHR4LnRvQnl0ZXMoY29kZWMpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBGb3IgQy1jaGFpbiBpbXBvcnRzLCB0cmVhdCBmZWVSYXRlIGFzIHRoZSBhYnNvbHV0ZSBmZWUgKG11bHRpcGxpZXIgb2YgMSlcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIFVUWE9zIGZyb20gaW1wb3J0ZWQgaW5wdXRzXG4gICAqIEBwYXJhbSBpbXBvcnRlZElucHV0cyBBcnJheSBvZiB0cmFuc2ZlcmFibGUgaW5wdXRzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIGRlY29kZWQgVVRYTyBvYmplY3RzXG4gICAqL1xuICBwcml2YXRlIHJlY292ZXJVdHhvcyhpbXBvcnRlZElucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSk6IERlY29kZWRVdHhvT2JqW10ge1xuICAgIHJldHVybiBpbXBvcnRlZElucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB0eGlkID0gaW5wdXQudXR4b0lELnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBvdXRwdXRpZHggPSBpbnB1dC51dHhvSUQub3V0cHV0SWR4LnRvU3RyaW5nKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG91dHB1dElEOiBTRUNQMjU2SzFfVHJhbnNmZXJfT3V0cHV0LFxuICAgICAgICBhbW91bnQ6IGlucHV0LmFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICAgIHR4aWQ6IHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20odHhpZCwgJ2hleCcpKSxcbiAgICAgICAgb3V0cHV0aWR4OiBvdXRwdXRpZHgsXG4gICAgICAgIHRocmVzaG9sZDogdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMubWFwKChhZGRyKSA9PlxuICAgICAgICAgIHV0aWxzLmFkZHJlc3NUb1N0cmluZyh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrLmhycCwgdGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5hbGlhcywgQnVmZmVyLmZyb20oYWRkcikpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,33 @@
1
+ import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
+ import { TransactionType } from '@bitgo-beta/sdk-core';
3
+ import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
4
+ import { TransferableInput, Credential } from '@flarenetwork/flarejs';
5
+ import { Tx } from './iface';
6
+ export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
7
+ constructor(_coinConfig: Readonly<CoinConfig>);
8
+ protected get transactionType(): TransactionType;
9
+ initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
10
+ static verifyTxType(txnType: string): boolean;
11
+ verifyTxType(txnType: string): boolean;
12
+ /**
13
+ * Build the import transaction for P-chain
14
+ * @protected
15
+ */
16
+ protected buildFlareTransaction(): void;
17
+ /**
18
+ * Create inputs from UTXOs for P-chain import
19
+ * @returns inputs, credentials, and total amount
20
+ */
21
+ protected createImportInputs(): {
22
+ inputs: TransferableInput[];
23
+ credentials: Credential[];
24
+ totalAmount: bigint;
25
+ };
26
+ /**
27
+ * Recover UTXOs from imported inputs
28
+ * @param importedInputs Array of transferable inputs
29
+ * @returns Array of decoded UTXO objects
30
+ */
31
+ private recoverUtxos;
32
+ }
33
+ //# sourceMappingURL=ImportInPTxBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAML,iBAAiB,EAQjB,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAY7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IA8G9E,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;IAsDvC;;;OAGG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB;IAsFD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}