@bitgo-beta/sdk-coin-flrp 1.0.1-beta.28 → 1.0.1-beta.280
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 +6 -75
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +13 -298
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -2
- package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +187 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +330 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +213 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +197 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -76
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +141 -218
- package/dist/src/lib/iface.d.ts +50 -51
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +22 -10
- package/dist/src/lib/index.d.ts +4 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +10 -2
- package/dist/src/lib/keyPair.d.ts +5 -5
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +17 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +46 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +134 -0
- package/dist/src/lib/transaction.d.ts +8 -73
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +139 -207
- package/dist/src/lib/transactionBuilder.d.ts +107 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +210 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +84 -75
- package/dist/src/lib/utils.d.ts +98 -147
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +346 -319
- package/dist/test/resources/account.d.ts +49 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +52 -0
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +34 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +93 -0
- package/dist/test/unit/lib/utils.js +29 -223
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -13
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/src/iface.d.ts +0 -25
- package/dist/src/iface.d.ts.map +0 -1
- package/dist/src/iface.js +0 -3
- package/dist/src/lib/constants.d.ts +0 -11
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -17
- package/dist/src/lib/errors.d.ts +0 -8
- package/dist/src/lib/errors.d.ts.map +0 -1
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInCTxBuilder.js +0 -170
- package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/exportInPTxBuilder.js +0 -56
- package/dist/test/unit/flrp.d.ts +0 -2
- package/dist/test/unit/flrp.d.ts.map +0 -1
- package/dist/test/unit/flrp.js +0 -118
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
- package/dist/test/unit/lib/transaction.d.ts +0 -2
- package/dist/test/unit/lib/transaction.d.ts.map +0 -1
- package/dist/test/unit/lib/transaction.js +0 -460
- package/dist/test/unit/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- 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"}
|