@bitgo-beta/sdk-coin-flrp 1.0.1-beta.9 → 1.0.1-beta.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/flrp.d.ts +82 -61
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +293 -134
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -6
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +233 -29
- package/dist/src/lib/constants.d.ts +160 -1
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +213 -3
- package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +224 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInCTxBuilder.js +46 -17
- package/dist/src/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/exportInPTxBuilder.js +70 -6
- package/dist/src/lib/iface.d.ts +52 -1
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +403 -0
- package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
- package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInPTxBuilder.js +464 -0
- package/dist/src/lib/index.d.ts +7 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +15 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +4 -6
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
- package/dist/src/lib/transaction.d.ts +111 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +322 -0
- package/dist/src/lib/transactionBuilder.d.ts +85 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +167 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +91 -0
- package/dist/src/lib/types.d.ts +78 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +5 -0
- package/dist/src/lib/utils.d.ts +59 -0
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +160 -52
- package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +180 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.js +37 -11
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +257 -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 +500 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +460 -0
- package/dist/test/unit/lib/utils.js +55 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +114 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/validatorTxBuilder.test.js +293 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -11
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ImportInCTxBuilder = void 0;
|
|
40
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
+
const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
|
|
42
|
+
const buffer_1 = require("buffer");
|
|
43
|
+
const utils_1 = __importStar(require("./utils"));
|
|
44
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
45
|
+
const constants_1 = require("./constants");
|
|
46
|
+
/**
|
|
47
|
+
* Flare P->C Import Transaction Builder
|
|
48
|
+
* Builds import transactions from P-chain to C-chain using FlareJS
|
|
49
|
+
*/
|
|
50
|
+
class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
|
|
51
|
+
constructor(_coinConfig) {
|
|
52
|
+
super(_coinConfig);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* C-chain address who is target of the import.
|
|
56
|
+
* Address format is Ethereum-like for Flare C-chain
|
|
57
|
+
* @param {string} cAddress - C-chain address (hex format)
|
|
58
|
+
*/
|
|
59
|
+
to(cAddress) {
|
|
60
|
+
// Validate and normalize C-chain address
|
|
61
|
+
if (!utils_1.default.isValidAddress(cAddress)) {
|
|
62
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid C-chain address: ${cAddress}`);
|
|
63
|
+
}
|
|
64
|
+
this.transaction._to = [cAddress];
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
get transactionType() {
|
|
68
|
+
return sdk_core_1.TransactionType.Import;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritdoc */
|
|
71
|
+
initBuilder(tx) {
|
|
72
|
+
if (!tx) {
|
|
73
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_TRANSACTION_REQUIRED);
|
|
74
|
+
}
|
|
75
|
+
// Handle both UnsignedTx and signed transaction formats
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
const unsignedTx = tx.unsignedTx || tx;
|
|
78
|
+
try {
|
|
79
|
+
// Extract network and blockchain validation
|
|
80
|
+
if (unsignedTx.networkID !== undefined && unsignedTx.networkID !== this.transaction._networkID) {
|
|
81
|
+
throw new sdk_core_1.BuildTransactionError(`Network ID mismatch: expected ${this.transaction._networkID}, got ${unsignedTx.networkID}`);
|
|
82
|
+
}
|
|
83
|
+
if (unsignedTx.blockchainID && !unsignedTx.blockchainID.equals(this.transaction._blockchainID)) {
|
|
84
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_BLOCKCHAIN_ID_MISMATCH);
|
|
85
|
+
}
|
|
86
|
+
// Extract C-chain import transaction details
|
|
87
|
+
if (unsignedTx.importIns && Array.isArray(unsignedTx.importIns)) {
|
|
88
|
+
// Extract UTXOs from import inputs (typically from P-chain)
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
const utxos = unsignedTx.importIns.map((importIn) => ({
|
|
91
|
+
id: importIn.txID?.toString() || constants_1.EMPTY_STRING,
|
|
92
|
+
outputIndex: importIn.outputIndex || constants_1.FIRST_ARRAY_INDEX,
|
|
93
|
+
amount: importIn.input?.amount?.toString() || constants_1.AMOUNT_STRING_ZERO,
|
|
94
|
+
assetId: importIn.input?.assetID || buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
95
|
+
address: importIn.input?.addresses?.[constants_1.FIRST_ARRAY_INDEX] || constants_1.EMPTY_STRING,
|
|
96
|
+
threshold: importIn.input?.threshold || constants_1.DEFAULT_THRESHOLD,
|
|
97
|
+
locktime: importIn.input?.locktime || constants_1.DEFAULT_LOCKTIME,
|
|
98
|
+
}));
|
|
99
|
+
this.addUtxos(utxos);
|
|
100
|
+
}
|
|
101
|
+
// Extract outputs (C-chain destination)
|
|
102
|
+
if (unsignedTx.outs && Array.isArray(unsignedTx.outs)) {
|
|
103
|
+
const outputs = unsignedTx.outs;
|
|
104
|
+
if (outputs.length > constants_1.ZERO_NUMBER) {
|
|
105
|
+
const firstOutput = outputs[constants_1.FIRST_ARRAY_INDEX];
|
|
106
|
+
// C-chain uses Ethereum-style addresses
|
|
107
|
+
if (firstOutput.addresses && Array.isArray(firstOutput.addresses)) {
|
|
108
|
+
// Set the first address as the destination
|
|
109
|
+
if (firstOutput.addresses.length > constants_1.ZERO_NUMBER) {
|
|
110
|
+
this.to(firstOutput.addresses[constants_1.FIRST_ARRAY_INDEX]);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Extract amount if present
|
|
114
|
+
if (firstOutput.amount) {
|
|
115
|
+
// Store output amount for validation
|
|
116
|
+
this.transaction._outputAmount = firstOutput.amount.toString();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Extract source chain (typically P-chain for C-chain imports)
|
|
121
|
+
if (unsignedTx.sourceChain) {
|
|
122
|
+
this._externalChainId = buffer_1.Buffer.isBuffer(unsignedTx.sourceChain)
|
|
123
|
+
? unsignedTx.sourceChain
|
|
124
|
+
: buffer_1.Buffer.from(unsignedTx.sourceChain, constants_1.HEX_ENCODING);
|
|
125
|
+
}
|
|
126
|
+
// Extract fee information
|
|
127
|
+
if (unsignedTx.fee !== undefined) {
|
|
128
|
+
this.transaction._fee.fee = unsignedTx.fee.toString();
|
|
129
|
+
}
|
|
130
|
+
// Extract memo if present
|
|
131
|
+
if (unsignedTx.memo && unsignedTx.memo.length > 0) {
|
|
132
|
+
// Store memo data for later use
|
|
133
|
+
this.transaction._memo = unsignedTx.memo;
|
|
134
|
+
}
|
|
135
|
+
// Set the transaction
|
|
136
|
+
this.transaction.setTransaction(tx);
|
|
137
|
+
// Validate transaction type
|
|
138
|
+
if (!this.verifyTxType(tx)) {
|
|
139
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_TRANSACTION_PARSE_FAILED);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
if (error instanceof sdk_core_1.BuildTransactionError) {
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FAILED_INITIALIZE_BUILDER}: ${error}`);
|
|
147
|
+
}
|
|
148
|
+
return this;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Verify transaction type for FlareJS import transactions
|
|
152
|
+
* @param {unknown} unsignedTx - FlareJS UnsignedTx
|
|
153
|
+
* @returns {boolean} - Whether transaction is valid import type
|
|
154
|
+
*/
|
|
155
|
+
static verifyTxType(unsignedTx) {
|
|
156
|
+
try {
|
|
157
|
+
// Check if transaction has the structure of an import transaction
|
|
158
|
+
const tx = unsignedTx;
|
|
159
|
+
// If transaction is null/undefined, return false
|
|
160
|
+
if (!tx || typeof tx !== constants_1.OBJECT_TYPE_STRING) {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
// If it's a placeholder with type 'import', accept it (for testing)
|
|
164
|
+
if (tx.type === 'import') {
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
// Check for import transaction specific properties
|
|
168
|
+
// ImportTx should have sourceChain, importIns, and destination C-chain address
|
|
169
|
+
const hasImportIns = Boolean(tx.importIns && Array.isArray(tx.importIns));
|
|
170
|
+
const hasSourceChain = Boolean(tx.sourceChain && (buffer_1.Buffer.isBuffer(tx.sourceChain) || typeof tx.sourceChain === 'string'));
|
|
171
|
+
// For C-chain imports, check EVM-specific properties
|
|
172
|
+
const hasToAddress = Boolean(tx.to && (buffer_1.Buffer.isBuffer(tx.to) || typeof tx.to === 'string'));
|
|
173
|
+
// If it has all import transaction properties, it's valid
|
|
174
|
+
if (hasImportIns && hasSourceChain && hasToAddress) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// For other cases (empty objects, different types), return false
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
verifyTxType(unsignedTx) {
|
|
185
|
+
return ImportInCTxBuilder.verifyTxType(unsignedTx);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Build the import C-chain transaction using FlareJS evm.newImportTx
|
|
189
|
+
* @protected
|
|
190
|
+
*/
|
|
191
|
+
buildFlareTransaction() {
|
|
192
|
+
// if tx has credentials, tx shouldn't change
|
|
193
|
+
if (this.transaction.hasCredentials)
|
|
194
|
+
return;
|
|
195
|
+
if (this.transaction._to.length !== 1) {
|
|
196
|
+
throw new sdk_core_1.BuildTransactionError('C-chain destination address is required');
|
|
197
|
+
}
|
|
198
|
+
if (this._utxos.length === 0) {
|
|
199
|
+
throw new sdk_core_1.BuildTransactionError('UTXOs are required for import transaction');
|
|
200
|
+
}
|
|
201
|
+
try {
|
|
202
|
+
// Prepare parameters for FlareJS evm.newImportTx
|
|
203
|
+
const toAddress = new Uint8Array(buffer_1.Buffer.from(this.transaction._to[0].replace('0x', ''), 'hex'));
|
|
204
|
+
// Convert our UTXOs to FlareJS format
|
|
205
|
+
const flareUtxos = this._utxos.map((utxo) => ({
|
|
206
|
+
txID: utxo.txid,
|
|
207
|
+
outputIndex: parseInt(utxo.outputidx, 10),
|
|
208
|
+
output: {
|
|
209
|
+
amount: () => BigInt(utxo.amount),
|
|
210
|
+
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Default asset ID, should be extracted from UTXO in real implementation
|
|
211
|
+
addresses: utxo.addresses,
|
|
212
|
+
threshold: utxo.threshold,
|
|
213
|
+
locktime: 0n, // Default locktime, should be extracted from UTXO in real implementation
|
|
214
|
+
},
|
|
215
|
+
}));
|
|
216
|
+
// Get source chain ID (typically P-chain for C-chain imports)
|
|
217
|
+
const sourceChainId = this._externalChainId ? this._externalChainId.toString(constants_1.HEX_ENCODING) : constants_1.P_CHAIN_SHORT;
|
|
218
|
+
// Calculate fee
|
|
219
|
+
const fee = BigInt(this.transaction._fee.fee || constants_1.DEFAULT_EVM_GAS_FEE); // EVM-style gas fee
|
|
220
|
+
// Prepare source addresses from UTXOs for FlareJS
|
|
221
|
+
const fromAddresses = Array.from(new Set(this._utxos.flatMap((utxo) => utxo.addresses))).map((addr) => buffer_1.Buffer.from(addr, 'hex'));
|
|
222
|
+
// Enhanced implementation - prepare for FlareJS integration
|
|
223
|
+
// Create transaction structure compatible with FlareJS evm.newImportTx
|
|
224
|
+
const enhancedTx = {
|
|
225
|
+
networkID: this.transaction._networkID,
|
|
226
|
+
blockchainID: this.transaction._blockchainID,
|
|
227
|
+
sourceChain: sourceChainId,
|
|
228
|
+
importedInputs: flareUtxos.map((utxo) => ({
|
|
229
|
+
...utxo,
|
|
230
|
+
// Add FlareJS-compatible fields
|
|
231
|
+
utxoID: buffer_1.Buffer.from(utxo.txID + utxo.outputIndex.toString(16).padStart(constants_1.OUTPUT_INDEX_HEX_LENGTH, constants_1.AMOUNT_STRING_ZERO), constants_1.HEX_ENCODING),
|
|
232
|
+
assetID: utxo.output.assetID,
|
|
233
|
+
amount: utxo.output.amount(),
|
|
234
|
+
})),
|
|
235
|
+
outputs: [
|
|
236
|
+
{
|
|
237
|
+
address: toAddress,
|
|
238
|
+
amount: this.calculateTotalAmount(flareUtxos) - fee,
|
|
239
|
+
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Default asset ID for Flare native token
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
fee,
|
|
243
|
+
type: constants_1.IMPORT_C_TYPE,
|
|
244
|
+
fromAddresses: fromAddresses.map((addr) => addr.toString('hex')),
|
|
245
|
+
toAddress: buffer_1.Buffer.from(toAddress).toString('hex'),
|
|
246
|
+
// Add FlareJS-specific metadata for future integration
|
|
247
|
+
_flareJSReady: true,
|
|
248
|
+
};
|
|
249
|
+
this.transaction.setTransaction(enhancedTx);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
throw new sdk_core_1.BuildTransactionError(`Failed to build import transaction: ${error}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Calculate total amount from UTXOs
|
|
257
|
+
* @private
|
|
258
|
+
*/
|
|
259
|
+
calculateTotalAmount(utxos) {
|
|
260
|
+
return utxos.reduce((total, utxo) => {
|
|
261
|
+
const amount = typeof utxo.output.amount === 'function' ? utxo.output.amount() : BigInt(utxo.output.amount || 0);
|
|
262
|
+
return total + amount;
|
|
263
|
+
}, 0n);
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Create inputs for the import transaction from UTXOs
|
|
267
|
+
* @returns {Object} - Inputs, total amount, and credentials
|
|
268
|
+
* @protected
|
|
269
|
+
*/
|
|
270
|
+
createInputs() {
|
|
271
|
+
if (this._utxos.length === 0) {
|
|
272
|
+
throw new sdk_core_1.BuildTransactionError('No UTXOs available for import');
|
|
273
|
+
}
|
|
274
|
+
const inputs = [];
|
|
275
|
+
const credentials = [];
|
|
276
|
+
let totalAmount = new bignumber_js_1.default(0);
|
|
277
|
+
// Process each UTXO to create inputs
|
|
278
|
+
this._utxos.forEach((utxo) => {
|
|
279
|
+
// Convert UTXO to FlareJS-compatible TransferableInput format
|
|
280
|
+
const amount = new bignumber_js_1.default(utxo.amount);
|
|
281
|
+
totalAmount = totalAmount.plus(amount);
|
|
282
|
+
// Create enhanced input structure ready for FlareJS integration
|
|
283
|
+
const enhancedInput = {
|
|
284
|
+
// UTXO identification
|
|
285
|
+
txID: buffer_1.Buffer.from(utxo.txid, 'hex'),
|
|
286
|
+
outputIndex: parseInt(utxo.outputidx, 10),
|
|
287
|
+
// Asset information
|
|
288
|
+
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH), // Should be extracted from UTXO in real implementation
|
|
289
|
+
// Transfer details
|
|
290
|
+
amount: amount.toString(),
|
|
291
|
+
locktime: BigInt(0),
|
|
292
|
+
threshold: utxo.threshold,
|
|
293
|
+
addresses: utxo.addresses.map((addr) => buffer_1.Buffer.from(addr, 'hex')),
|
|
294
|
+
// FlareJS compatibility markers
|
|
295
|
+
_flareJSReady: true,
|
|
296
|
+
_type: constants_1.TRANSFERABLE_INPUT_TYPE,
|
|
297
|
+
// Methods for FlareJS compatibility
|
|
298
|
+
getAmount: () => BigInt(amount.toString()),
|
|
299
|
+
getAssetID: () => buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
300
|
+
getUTXOID: () => buffer_1.Buffer.from(utxo.txid + utxo.outputidx.padStart(constants_1.OUTPUT_INDEX_HEX_LENGTH, constants_1.AMOUNT_STRING_ZERO), constants_1.HEX_ENCODING),
|
|
301
|
+
};
|
|
302
|
+
inputs.push(enhancedInput);
|
|
303
|
+
// Create enhanced credential structure ready for FlareJS integration
|
|
304
|
+
const enhancedCredential = {
|
|
305
|
+
// Signature management
|
|
306
|
+
signatureIndices: Array.from({ length: utxo.threshold }, (_, i) => i),
|
|
307
|
+
signatures: [], // Will be populated during signing
|
|
308
|
+
// FlareJS compatibility markers
|
|
309
|
+
_flareJSReady: true,
|
|
310
|
+
_type: constants_1.CREDENTIAL_TYPE,
|
|
311
|
+
// Methods for FlareJS compatibility
|
|
312
|
+
addSignature: (signature) => enhancedCredential.signatures.push(signature),
|
|
313
|
+
getSignatureIndices: () => enhancedCredential.signatureIndices,
|
|
314
|
+
serialize: () => buffer_1.Buffer.alloc(0),
|
|
315
|
+
};
|
|
316
|
+
credentials.push(enhancedCredential);
|
|
317
|
+
});
|
|
318
|
+
return {
|
|
319
|
+
inputs,
|
|
320
|
+
credentials,
|
|
321
|
+
amount: totalAmount,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Calculate import transaction fee using FlareJS
|
|
326
|
+
* @param {TransferableInput[]} inputs - Transaction inputs
|
|
327
|
+
* @returns {BigNumber} - Calculated fee amount
|
|
328
|
+
* @protected
|
|
329
|
+
*/
|
|
330
|
+
calculateImportFee(inputs) {
|
|
331
|
+
// Implement FlareJS-compatible fee calculation
|
|
332
|
+
// This follows FlareJS fee calculation patterns for C-chain imports
|
|
333
|
+
const baseFee = new bignumber_js_1.default(this.transaction._fee.feeRate || constants_1.DEFAULT_BASE_FEE); // 1M nanoFLR default
|
|
334
|
+
const inputCount = inputs.length;
|
|
335
|
+
const outputCount = 1; // Single C-chain output
|
|
336
|
+
// FlareJS-style fee calculation for import transactions
|
|
337
|
+
// Base fee covers transaction overhead
|
|
338
|
+
// Input fees cover UTXO processing
|
|
339
|
+
// Output fees cover result generation
|
|
340
|
+
const inputFee = new bignumber_js_1.default(constants_1.INPUT_FEE); // 100K nanoFLR per input (FlareJS standard)
|
|
341
|
+
const outputFee = new bignumber_js_1.default(constants_1.OUTPUT_FEE); // 50K nanoFLR per output (FlareJS standard)
|
|
342
|
+
// Calculate total fee: base + inputs + outputs
|
|
343
|
+
const totalFee = baseFee
|
|
344
|
+
.plus(new bignumber_js_1.default(inputCount).times(inputFee))
|
|
345
|
+
.plus(new bignumber_js_1.default(outputCount).times(outputFee));
|
|
346
|
+
// Add C-chain specific fees (EVM gas consideration)
|
|
347
|
+
const evmGasFee = new bignumber_js_1.default(constants_1.DEFAULT_EVM_GAS_FEE); // Standard EVM transfer gas
|
|
348
|
+
const finalFee = totalFee.plus(evmGasFee);
|
|
349
|
+
// Ensure minimum fee threshold
|
|
350
|
+
const minimumFee = new bignumber_js_1.default(constants_1.MINIMUM_FEE); // 1M nanoFLR minimum
|
|
351
|
+
return bignumber_js_1.default.max(finalFee, minimumFee);
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Add UTXOs to be used as inputs for the import transaction
|
|
355
|
+
* @param {DecodedUtxoObj[]} utxos - UTXOs from P-chain to import
|
|
356
|
+
*/
|
|
357
|
+
addUtxos(utxos) {
|
|
358
|
+
if (!Array.isArray(utxos)) {
|
|
359
|
+
throw new sdk_core_1.BuildTransactionError('UTXOs must be an array');
|
|
360
|
+
}
|
|
361
|
+
this._utxos = [...this._utxos, ...utxos];
|
|
362
|
+
return this;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Set the source chain for the import (typically P-chain)
|
|
366
|
+
* @param {string} chainId - Source chain ID
|
|
367
|
+
*/
|
|
368
|
+
sourceChain(chainId) {
|
|
369
|
+
// Validate and set source chain ID for C-chain imports
|
|
370
|
+
if (!chainId || typeof chainId !== 'string') {
|
|
371
|
+
throw new sdk_core_1.BuildTransactionError('Source chain ID must be a non-empty string');
|
|
372
|
+
}
|
|
373
|
+
// Valid source chains for C-chain imports in Flare network
|
|
374
|
+
const validSourceChains = constants_1.VALID_IMPORT_SOURCE_CHAINS;
|
|
375
|
+
const chainIdNormalized = chainId.replace('-chain', '').toUpperCase();
|
|
376
|
+
// Check if it's a predefined chain identifier
|
|
377
|
+
if (validSourceChains.some((chain) => chain.replace('-chain', '').toUpperCase() === chainIdNormalized)) {
|
|
378
|
+
// Store normalized chain ID (e.g., 'P' for P-chain)
|
|
379
|
+
this._externalChainId = buffer_1.Buffer.from(chainIdNormalized, constants_1.UTF8_ENCODING);
|
|
380
|
+
return this;
|
|
381
|
+
}
|
|
382
|
+
// Check if it's a hex-encoded chain ID (CHAIN_ID_HEX_LENGTH characters for FlareJS)
|
|
383
|
+
if ((0, utils_1.createHexRegex)(constants_1.CHAIN_ID_HEX_LENGTH).test(chainId)) {
|
|
384
|
+
this._externalChainId = buffer_1.Buffer.from(chainId, 'hex');
|
|
385
|
+
return this;
|
|
386
|
+
}
|
|
387
|
+
// Check if it's a CB58-encoded chain ID (FlareJS format)
|
|
388
|
+
if (utils_1.default.isValidAddress(chainId)) {
|
|
389
|
+
this._externalChainId = utils_1.default.cb58Decode(chainId);
|
|
390
|
+
return this;
|
|
391
|
+
}
|
|
392
|
+
// If none of the above, try to decode as hex or use as-is
|
|
393
|
+
try {
|
|
394
|
+
this._externalChainId = buffer_1.Buffer.from(chainId, 'hex');
|
|
395
|
+
}
|
|
396
|
+
catch (error) {
|
|
397
|
+
this._externalChainId = buffer_1.Buffer.from(chainId, constants_1.UTF8_ENCODING);
|
|
398
|
+
}
|
|
399
|
+
return this;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
exports.ImportInCTxBuilder = ImportInCTxBuilder;
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsbURBQThFO0FBQzlFLCtFQUE0RTtBQUU1RSxtQ0FBZ0M7QUFDaEMsaURBQWdEO0FBRWhELGdFQUFxQztBQUVyQywyQ0EyQnFCO0FBRXJCOzs7R0FHRztBQUNILE1BQWEsa0JBQW1CLFNBQVEseURBQTJCO0lBQ2pFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsRUFBRSxDQUFDLFFBQWdCO1FBQ2pCLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw0QkFBNEIsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMxRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLFdBQVcsQ0FBQyxFQUFNO1FBQ2hCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNSLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxzQ0FBMEIsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFFRCx3REFBd0Q7UUFDeEQsOERBQThEO1FBQzlELE1BQU0sVUFBVSxHQUFJLEVBQVUsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQztZQUNILDRDQUE0QztZQUM1QyxJQUFJ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LE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBOWFELGdEQThhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHsgVHJhbnNmZXJhYmxlSW5wdXQsIENyZWRlbnRpYWwgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB1dGlscywgeyBjcmVhdGVIZXhSZWdleCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHgsIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0ZW5kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQVNTRVRfSURfTEVOR1RILFxuICBPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCxcbiAgQ0hBSU5fSURfSEVYX0xFTkdUSCxcbiAgREVGQVVMVF9CQVNFX0ZFRSxcbiAgREVGQVVMVF9FVk1fR0FTX0ZFRSxcbiAgSU5QVVRfRkVFLFxuICBPVVRQVVRfRkVFLFxuICBNSU5JTVVNX0ZFRSxcbiAgRU1QVFlfU1RSSU5HLFxuICBBTU9VTlRfU1RSSU5HX1pFUk8sXG4gIEZJUlNUX0FSUkFZX0lOREVYLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgREVGQVVMVF9MT0NLVElNRSxcbiAgWkVST19OVU1CRVIsXG4gIEVSUk9SX1RSQU5TQUNUSU9OX1JFUVVJUkVELFxuICBFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENILFxuICBFUlJPUl9UUkFOU0FDVElPTl9QQVJTRV9GQUlMRUQsXG4gIEVSUk9SX0ZBSUxFRF9JTklUSUFMSVpFX0JVSUxERVIsXG4gIE9CSkVDVF9UWVBFX1NUUklORyxcbiAgSEVYX0VOQ09ESU5HLFxuICBWQUxJRF9JTVBPUlRfU09VUkNFX0NIQUlOUyxcbiAgUF9DSEFJTl9TSE9SVCxcbiAgVVRGOF9FTkNPRElORyxcbiAgSU1QT1JUX0NfVFlQRSxcbiAgVFJBTlNGRVJBQkxFX0lOUFVUX1RZUEUsXG4gIENSRURFTlRJQUxfVFlQRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEZsYXJlIFAtPkMgSW1wb3J0IFRyYW5zYWN0aW9uIEJ1aWxkZXJcbiAqIEJ1aWxkcyBpbXBvcnQgdHJhbnNhY3Rpb25zIGZyb20gUC1jaGFpbiB0byBDLWNoYWluIHVzaW5nIEZsYXJlSlNcbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydEluQ1R4QnVpbGRlciBleHRlbmRzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDLWNoYWluIGFkZHJlc3Mgd2hvIGlzIHRhcmdldCBvZiB0aGUgaW1wb3J0LlxuICAgKiBBZGRyZXNzIGZvcm1hdCBpcyBFdGhlcmV1bS1saWtlIGZvciBGbGFyZSBDLWNoYWluXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjQWRkcmVzcyAtIEMtY2hhaW4gYWRkcmVzcyAoaGV4IGZvcm1hdClcbiAgICovXG4gIHRvKGNBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICAvLyBWYWxpZGF0ZSBhbmQgbm9ybWFsaXplIEMtY2hhaW4gYWRkcmVzc1xuICAgIGlmICghdXRpbHMuaXNWYWxpZEFkZHJlc3MoY0FkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIEMtY2hhaW4gYWRkcmVzczogJHtjQWRkcmVzc31gKTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBbY0FkZHJlc3NdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkltcG9ydDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpbml0QnVpbGRlcih0eDogVHgpOiB0aGlzIHtcbiAgICBpZiAoIXR4KSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1RSQU5TQUNUSU9OX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgYm90aCBVbnNpZ25lZFR4IGFuZCBzaWduZWQgdHJhbnNhY3Rpb24gZm9ybWF0c1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgdW5zaWduZWRUeCA9ICh0eCBhcyBhbnkpLnVuc2lnbmVkVHggfHwgdHg7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRXh0cmFjdCBuZXR3b3JrIGFuZCBibG9ja2NoYWluIHZhbGlkYXRpb25cbiAgICAgIGlmICh1bnNpZ25lZFR4Lm5ldHdvcmtJRCAhPT0gdW5kZWZpbmVkICYmIHVuc2lnbmVkVHgubmV0d29ya0lEICE9PSB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgICBgTmV0d29yayBJRCBtaXNtYXRjaDogZXhwZWN0ZWQgJHt0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUR9LCBnb3QgJHt1bnNpZ25lZFR4Lm5ldHdvcmtJRH1gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bnNpZ25lZFR4LmJsb2NrY2hhaW5JRCAmJiAhdW5zaWduZWRUeC5ibG9ja2NoYWluSUQuZXF1YWxzKHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9CTE9DS0NIQUlOX0lEX01JU01BVENIKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBDLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAgICBpZiAodW5zaWduZWRUeC5pbXBvcnRJbnMgJiYgQXJyYXkuaXNBcnJheSh1bnNpZ25lZFR4LmltcG9ydElucykpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBVVFhPcyBmcm9tIGltcG9ydCBpbnB1dHMgKHR5cGljYWxseSBmcm9tIFAtY2hhaW4pXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gdW5zaWduZWRUeC5pbXBvcnRJbnMubWFwKChpbXBvcnRJbjogYW55KSA9PiAoe1xuICAgICAgICAgIGlkOiBpbXBvcnRJbi50eElEPy50b1N0cmluZygpIHx8IEVNUFRZX1NUUklORyxcbiAgICAgICAgICBvdXRwdXRJbmRleDogaW1wb3J0SW4ub3V0cHV0SW5kZXggfHwgRklSU1RfQVJSQVlfSU5ERVgsXG4gICAgICAgICAgYW1vdW50OiBpbXBvcnRJbi5pbnB1dD8uYW1vdW50Py50b1N0cmluZygpIHx8IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICBhc3NldElkOiBpbXBvcnRJbi5pbnB1dD8uYXNzZXRJRCB8fCBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSxcbiAgICAgICAgICBhZGRyZXNzOiBpbXBvcnRJbi5pbnB1dD8uYWRkcmVzc2VzPy5bRklSU1RfQVJSQVlfSU5ERVhdIHx8IEVNUFRZX1NUUklORyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IGltcG9ydEluLmlucHV0Py50aHJlc2hvbGQgfHwgREVGQVVMVF9USFJFU0hPTEQsXG4gICAgICAgICAgbG9ja3RpbWU6IGltcG9ydEluLmlucHV0Py5sb2NrdGltZSB8fCBERUZBVUxUX0xPQ0tUSU1FLFxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuYWRkVXR4b3ModXR4b3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IG91dHB1dHMgKEMtY2hhaW4gZGVzdGluYXRpb24pXG4gICAgICBpZiAodW5zaWduZWRUeC5vdXRzICYmIEFycmF5LmlzQXJyYXkodW5zaWduZWRUeC5vdXRzKSkge1xuICAgICAgICBjb25zdCBvdXRwdXRzID0gdW5zaWduZWRUeC5vdXRzO1xuICAgICAgICBpZiAob3V0cHV0cy5sZW5ndGggPiBaRVJPX05VTUJFUikge1xuICAgICAgICAgIGNvbnN0IGZpcnN0T3V0cHV0ID0gb3V0cHV0c1tGSVJTVF9BUlJBWV9JTkRFWF07XG5cbiAgICAgICAgICAvLyBDLWNoYWluIHVzZXMgRXRoZXJldW0tc3R5bGUgYWRkcmVzc2VzXG4gICAgICAgICAgaWYgKGZpcnN0T3V0cHV0LmFkZHJlc3NlcyAmJiBBcnJheS5pc0FycmF5KGZpcnN0T3V0cHV0LmFkZHJlc3NlcykpIHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgZmlyc3QgYWRkcmVzcyBhcyB0aGUgZGVzdGluYXRpb25cbiAgICAgICAgICAgIGlmIChmaXJzdE91dHB1dC5hZGRyZXNzZXMubGVuZ3RoID4gWkVST19OVU1CRVIpIHtcbiAgICAgICAgICAgICAgdGhpcy50byhmaXJzdE91dHB1dC5hZGRyZXNzZXNbRklSU1RfQVJSQVlfSU5ERVhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGFtb3VudCBpZiBwcmVzZW50XG4gICAgICAgICAgaWYgKGZpcnN0T3V0cHV0LmFtb3VudCkge1xuICAgICAgICAgICAgLy8gU3RvcmUgb3V0cHV0IGFtb3VudCBmb3IgdmFsaWRhdGlvblxuICAgICAgICAgICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24pLl9vdXRwdXRBbW91bnQgPSBmaXJzdE91dHB1dC5hbW91bnQudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzb3VyY2UgY2hhaW4gKHR5cGljYWxseSBQLWNoYWluIGZvciBDLWNoYWluIGltcG9ydHMpXG4gICAgICBpZiAodW5zaWduZWRUeC5zb3VyY2VDaGFpbikge1xuICAgICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuaXNCdWZmZXIodW5zaWduZWRUeC5zb3VyY2VDaGFpbilcbiAgICAgICAgICA/IHVuc2lnbmVkVHguc291cmNlQ2hhaW5cbiAgICAgICAgICA6IEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHguc291cmNlQ2hhaW4sIEhFWF9FTkNPRElORyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgZmVlIGluZm9ybWF0aW9uXG4gICAgICBpZiAodW5zaWduZWRUeC5mZWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlID0gdW5zaWduZWRUeC5mZWUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBtZW1vIGlmIHByZXNlbnRcbiAgICAgIGlmICh1bnNpZ25lZFR4Lm1lbW8gJiYgdW5zaWduZWRUeC5tZW1vLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gU3RvcmUgbWVtbyBkYXRhIGZvciBsYXRlciB1c2VcbiAgICAgICAgKHRoaXMudHJhbnNhY3Rpb24gYXMgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24pLl9tZW1vID0gdW5zaWduZWRUeC5tZW1vO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIHRyYW5zYWN0aW9uXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHR4KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdHJhbnNhY3Rpb24gdHlwZVxuICAgICAgaWYgKCF0aGlzLnZlcmlmeVR4VHlwZSh0eCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9UUkFOU0FDVElPTl9QQVJTRV9GQUlMRUQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGAke0VSUk9SX0ZBSUxFRF9JTklUSUFMSVpFX0JVSUxERVJ9OiAke2Vycm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0cmFuc2FjdGlvbiB0eXBlIGZvciBGbGFyZUpTIGltcG9ydCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHt1bmtub3dufSB1bnNpZ25lZFR4IC0gRmxhcmVKUyBVbnNpZ25lZFR4XG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdHJhbnNhY3Rpb24gaXMgdmFsaWQgaW1wb3J0IHR5cGVcbiAgICovXG4gIHN0YXRpYyB2ZXJpZnlUeFR5cGUodW5zaWduZWRUeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2FjdGlvbiBoYXMgdGhlIHN0cnVjdHVyZSBvZiBhbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IHR4ID0gdW5zaWduZWRUeCBhcyB7XG4gICAgICAgIGltcG9ydElucz86IHVua25vd25bXTtcbiAgICAgICAgc291cmNlQ2hhaW4/OiBCdWZmZXIgfCBzdHJpbmc7XG4gICAgICAgIHRvPzogQnVmZmVyIHwgc3RyaW5nO1xuICAgICAgICB0eXBlPzogc3RyaW5nO1xuICAgICAgfTtcblxuICAgICAgLy8gSWYgdHJhbnNhY3Rpb24gaXMgbnVsbC91bmRlZmluZWQsIHJldHVybiBmYWxzZVxuICAgICAgaWYgKCF0eCB8fCB0eXBlb2YgdHggIT09IE9CSkVDVF9UWVBFX1NUUklORykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSBwbGFjZWhvbGRlciB3aXRoIHR5cGUgJ2ltcG9ydCcsIGFjY2VwdCBpdCAoZm9yIHRlc3RpbmcpXG4gICAgICBpZiAodHgudHlwZSA9PT0gJ2ltcG9ydCcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBpbXBvcnQgdHJhbnNhY3Rpb24gc3BlY2lmaWMgcHJvcGVydGllc1xuICAgICAgLy8gSW1wb3J0VHggc2hvdWxkIGhhdmUgc291cmNlQ2hhaW4sIGltcG9ydElucywgYW5kIGRlc3RpbmF0aW9uIEMtY2hhaW4gYWRkcmVzc1xuICAgICAgY29uc3QgaGFzSW1wb3J0SW5zID0gQm9vbGVhbih0eC5pbXBvcnRJbnMgJiYgQXJyYXkuaXNBcnJheSh0eC5pbXBvcnRJbnMpKTtcbiAgICAgIGNvbnN0IGhhc1NvdXJjZUNoYWluID0gQm9vbGVhbihcbiAgICAgICAgdHguc291cmNlQ2hhaW4gJiYgKEJ1ZmZlci5pc0J1ZmZlcih0eC5zb3VyY2VDaGFpbikgfHwgdHlwZW9mIHR4LnNvdXJjZUNoYWluID09PSAnc3RyaW5nJylcbiAgICAgICk7XG5cbiAgICAgIC8vIEZvciBDLWNoYWluIGltcG9ydHMsIGNoZWNrIEVWTS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBoYXNUb0FkZHJlc3MgPSBCb29sZWFuKHR4LnRvICYmIChCdWZmZXIuaXNCdWZmZXIodHgudG8pIHx8IHR5cGVvZiB0eC50byA9PT0gJ3N0cmluZycpKTtcblxuICAgICAgLy8gSWYgaXQgaGFzIGFsbCBpbXBvcnQgdHJhbnNhY3Rpb24gcHJvcGVydGllcywgaXQncyB2YWxpZFxuICAgICAgaWYgKGhhc0ltcG9ydElucyAmJiBoYXNTb3VyY2VDaGFpbiAmJiBoYXNUb0FkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBvdGhlciBjYXNlcyAoZW1wdHkgb2JqZWN0cywgZGlmZmVyZW50IHR5cGVzKSwgcmV0dXJuIGZhbHNlXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodW5zaWduZWRUeDogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBJbXBvcnRJbkNUeEJ1aWxkZXIudmVyaWZ5VHhUeXBlKHVuc2lnbmVkVHgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBpbXBvcnQgQy1jaGFpbiB0cmFuc2FjdGlvbiB1c2luZyBGbGFyZUpTIGV2bS5uZXdJbXBvcnRUeFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIC8vIGlmIHR4IGhhcyBjcmVkZW50aWFscywgdHggc2hvdWxkbid0IGNoYW5nZVxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5fdG8ubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdDLWNoYWluIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdVVFhPcyBhcmUgcmVxdWlyZWQgZm9yIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBQcmVwYXJlIHBhcmFtZXRlcnMgZm9yIEZsYXJlSlMgZXZtLm5ld0ltcG9ydFR4XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSh0aGlzLnRyYW5zYWN0aW9uLl90b1swXS5yZXBsYWNlKCcweCcsICcnKSwgJ2hleCcpKTtcblxuICAgICAgLy8gQ29udmVydCBvdXIgVVRYT3MgdG8gRmxhcmVKUyBmb3JtYXRcbiAgICAgIGNvbnN0IGZsYXJlVXR4b3MgPSB0aGlzLl91dHhvcy5tYXAoKHV0eG8pID0+ICh7XG4gICAgICAgIHR4SUQ6IHV0eG8udHhpZCxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHBhcnNlSW50KHV0eG8ub3V0cHV0aWR4LCAxMCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogKCkgPT4gQmlnSW50KHV0eG8uYW1vdW50KSxcbiAgICAgICAgICBhc3NldElEOiBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSwgLy8gRGVmYXVsdCBhc3NldCBJRCwgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIFVUWE8gaW4gcmVhbCBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgIGFkZHJlc3NlczogdXR4by5hZGRyZXNzZXMsXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgICBsb2NrdGltZTogMG4sIC8vIERlZmF1bHQgbG9ja3RpbWUsIHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSBVVFhPIGluIHJlYWwgaW1wbGVtZW50YXRpb25cbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gR2V0IHNvdXJjZSBjaGFpbiBJRCAodHlwaWNhbGx5IFAtY2hhaW4gZm9yIEMtY2hhaW4gaW1wb3J0cylcbiAgICAgIGNvbnN0IHNvdXJjZUNoYWluSWQgPSB0aGlzLl9leHRlcm5hbENoYWluSWQgPyB0aGlzLl9leHRlcm5hbENoYWluSWQudG9TdHJpbmcoSEVYX0VOQ09ESU5HKSA6IFBfQ0hBSU5fU0hPUlQ7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBmZWVcbiAgICAgIGNvbnN0IGZlZSA9IEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlIHx8IERFRkFVTFRfRVZNX0dBU19GRUUpOyAvLyBFVk0tc3R5bGUgZ2FzIGZlZVxuXG4gICAgICAvLyBQcmVwYXJlIHNvdXJjZSBhZGRyZXNzZXMgZnJvbSBVVFhPcyBmb3IgRmxhcmVKU1xuICAgICAgY29uc3QgZnJvbUFkZHJlc3NlcyA9IEFycmF5LmZyb20obmV3IFNldCh0aGlzLl91dHhvcy5mbGF0TWFwKCh1dHhvKSA9PiB1dHhvLmFkZHJlc3NlcykpKS5tYXAoKGFkZHIpID0+XG4gICAgICAgIEJ1ZmZlci5mcm9tKGFkZHIsICdoZXgnKVxuICAgICAgKTtcblxuICAgICAgLy8gRW5oYW5jZWQgaW1wbGVtZW50YXRpb24gLSBwcmVwYXJlIGZvciBGbGFyZUpTIGludGVncmF0aW9uXG4gICAgICAvLyBDcmVhdGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGNvbXBhdGlibGUgd2l0aCBGbGFyZUpTIGV2bS5uZXdJbXBvcnRUeFxuICAgICAgY29uc3QgZW5oYW5jZWRUeCA9IHtcbiAgICAgICAgbmV0d29ya0lEOiB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogdGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELFxuICAgICAgICBzb3VyY2VDaGFpbjogc291cmNlQ2hhaW5JZCxcbiAgICAgICAgaW1wb3J0ZWRJbnB1dHM6IGZsYXJlVXR4b3MubWFwKCh1dHhvKSA9PiAoe1xuICAgICAgICAgIC4uLnV0eG8sXG4gICAgICAgICAgLy8gQWRkIEZsYXJlSlMtY29tcGF0aWJsZSBmaWVsZHNcbiAgICAgICAgICB1dHhvSUQ6IEJ1ZmZlci5mcm9tKFxuICAgICAgICAgICAgdXR4by50eElEICsgdXR4by5vdXRwdXRJbmRleC50b1N0cmluZygxNikucGFkU3RhcnQoT1VUUFVUX0lOREVYX0hFWF9MRU5HVEgsIEFNT1VOVF9TVFJJTkdfWkVSTyksXG4gICAgICAgICAgICBIRVhfRU5DT0RJTkdcbiAgICAgICAgICApLFxuICAgICAgICAgIGFzc2V0SUQ6IHV0eG8ub3V0cHV0LmFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiB1dHhvLm91dHB1dC5hbW91bnQoKSxcbiAgICAgICAgfSkpLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdG9BZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0aGlzLmNhbGN1bGF0ZVRvdGFsQW1vdW50KGZsYXJlVXR4b3MpIC0gZmVlLFxuICAgICAgICAgICAgYXNzZXRJRDogQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCksIC8vIERlZmF1bHQgYXNzZXQgSUQgZm9yIEZsYXJlIG5hdGl2ZSB0b2tlblxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGZlZSxcbiAgICAgICAgdHlwZTogSU1QT1JUX0NfVFlQRSxcbiAgICAgICAgZnJvbUFkZHJlc3NlczogZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHIpID0+IGFkZHIudG9TdHJpbmcoJ2hleCcpKSxcbiAgICAgICAgdG9BZGRyZXNzOiBCdWZmZXIuZnJvbSh0b0FkZHJlc3MpLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICAgLy8gQWRkIEZsYXJlSlMtc3BlY2lmaWMgbWV0YWRhdGEgZm9yIGZ1dHVyZSBpbnRlZ3JhdGlvblxuICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgfTtcblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbihlbmhhbmNlZFR4KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIGJ1aWxkIGltcG9ydCB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIGFtb3VudCBmcm9tIFVUWE9zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRvdGFsQW1vdW50KHV0eG9zOiBBcnJheTx7IG91dHB1dDogeyBhbW91bnQ6ICgpID0+IGJpZ2ludCB9IH0+KTogYmlnaW50IHtcbiAgICByZXR1cm4gdXR4b3MucmVkdWNlKCh0b3RhbCwgdXR4bykgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gdHlwZW9mIHV0eG8ub3V0cHV0LmFtb3VudCA9PT0gJ2Z1bmN0aW9uJyA/IHV0eG8ub3V0cHV0LmFtb3VudCgpIDogQmlnSW50KHV0eG8ub3V0cHV0LmFtb3VudCB8fCAwKTtcbiAgICAgIHJldHVybiB0b3RhbCArIGFtb3VudDtcbiAgICB9LCAwbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBmb3IgdGhlIGltcG9ydCB0cmFuc2FjdGlvbiBmcm9tIFVUWE9zXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IC0gSW5wdXRzLCB0b3RhbCBhbW91bnQsIGFuZCBjcmVkZW50aWFsc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRzKCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgICBhbW91bnQ6IEJpZ051bWJlcjtcbiAgfSB7XG4gICAgaWYgKHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm8gVVRYT3MgYXZhaWxhYmxlIGZvciBpbXBvcnQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG4gICAgbGV0IHRvdGFsQW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBVVFhPIHRvIGNyZWF0ZSBpbnB1dHNcbiAgICB0aGlzLl91dHhvcy5mb3JFYWNoKCh1dHhvOiBEZWNvZGVkVXR4b09iaikgPT4ge1xuICAgICAgLy8gQ29udmVydCBVVFhPIHRvIEZsYXJlSlMtY29tcGF0aWJsZSBUcmFuc2ZlcmFibGVJbnB1dCBmb3JtYXRcbiAgICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgPSB0b3RhbEFtb3VudC5wbHVzKGFtb3VudCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBpbnB1dCBzdHJ1Y3R1cmUgcmVhZHkgZm9yIEZsYXJlSlMgaW50ZWdyYXRpb25cbiAgICAgIGNvbnN0IGVuaGFuY2VkSW5wdXQgPSB7XG4gICAgICAgIC8vIFVUWE8gaWRlbnRpZmljYXRpb25cbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkLCAnaGV4JyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCwgMTApLFxuXG4gICAgICAgIC8vIEFzc2V0IGluZm9ybWF0aW9uXG4gICAgICAgIGFzc2V0SUQ6IEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpLCAvLyBTaG91bGQgYmUgZXh0cmFjdGVkIGZyb20gVVRYTyBpbiByZWFsIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgLy8gVHJhbnNmZXIgZGV0YWlsc1xuICAgICAgICBhbW91bnQ6IGFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBsb2NrdGltZTogQmlnSW50KDApLFxuICAgICAgICB0aHJlc2hvbGQ6IHV0eG8udGhyZXNob2xkLFxuICAgICAgICBhZGRyZXNzZXM6IHV0eG8uYWRkcmVzc2VzLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkciwgJ2hleCcpKSxcblxuICAgICAgICAvLyBGbGFyZUpTIGNvbXBhdGliaWxpdHkgbWFya2Vyc1xuICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICBfdHlwZTogVFJBTlNGRVJBQkxFX0lOUFVUX1RZUEUsXG5cbiAgICAgICAgLy8gTWV0aG9kcyBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICAgIGdldEFtb3VudDogKCkgPT4gQmlnSW50KGFtb3VudC50b1N0cmluZygpKSxcbiAgICAgICAgZ2V0QXNzZXRJRDogKCkgPT4gQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCksXG4gICAgICAgIGdldFVUWE9JRDogKCkgPT5cbiAgICAgICAgICBCdWZmZXIuZnJvbSh1dHhvLnR4aWQgKyB1dHhvLm91dHB1dGlkeC5wYWRTdGFydChPVVRQVVRfSU5ERVhfSEVYX0xFTkdUSCwgQU1PVU5UX1NUUklOR19aRVJPKSwgSEVYX0VOQ09ESU5HKSxcbiAgICAgIH07XG5cbiAgICAgIGlucHV0cy5wdXNoKGVuaGFuY2VkSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjcmVkZW50aWFsIHN0cnVjdHVyZSByZWFkeSBmb3IgRmxhcmVKUyBpbnRlZ3JhdGlvblxuICAgICAgY29uc3QgZW5oYW5jZWRDcmVkZW50aWFsID0ge1xuICAgICAgICAvLyBTaWduYXR1cmUgbWFuYWdlbWVudFxuICAgICAgICBzaWduYXR1cmVJbmRpY2VzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB1dHhvLnRocmVzaG9sZCB9LCAoXywgaSkgPT4gaSksXG4gICAgICAgIHNpZ25hdHVyZXM6IFtdIGFzIEJ1ZmZlcltdLCAvLyBXaWxsIGJlIHBvcHVsYXRlZCBkdXJpbmcgc2lnbmluZ1xuXG4gICAgICAgIC8vIEZsYXJlSlMgY29tcGF0aWJpbGl0eSBtYXJrZXJzXG4gICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgIF90eXBlOiBDUkVERU5USUFMX1RZUEUsXG5cbiAgICAgICAgLy8gTWV0aG9kcyBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICAgIGFkZFNpZ25hdHVyZTogKHNpZ25hdHVyZTogQnVmZmVyKSA9PiBlbmhhbmNlZENyZWRlbnRpYWwuc2lnbmF0dXJlcy5wdXNoKHNpZ25hdHVyZSksXG4gICAgICAgIGdldFNpZ25hdHVyZUluZGljZXM6ICgpID0+IGVuaGFuY2VkQ3JlZGVudGlhbC5zaWduYXR1cmVJbmRpY2VzLFxuICAgICAgICBzZXJpYWxpemU6ICgpID0+IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgIH07XG5cbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goZW5oYW5jZWRDcmVkZW50aWFsIGFzIHVua25vd24gYXMgQ3JlZGVudGlhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5wdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgICBhbW91bnQ6IHRvdGFsQW1vdW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIGltcG9ydCB0cmFuc2FjdGlvbiBmZWUgdXNpbmcgRmxhcmVKU1xuICAgKiBAcGFyYW0ge1RyYW5zZmVyYWJsZUlucHV0W119IGlucHV0cyAtIFRyYW5zYWN0aW9uIGlucHV0c1xuICAgKiBAcmV0dXJucyB7QmlnTnVtYmVyfSAtIENhbGN1bGF0ZWQgZmVlIGFtb3VudFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY2FsY3VsYXRlSW1wb3J0RmVlKGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSk6IEJpZ051bWJlciB7XG4gICAgLy8gSW1wbGVtZW50IEZsYXJlSlMtY29tcGF0aWJsZSBmZWUgY2FsY3VsYXRpb25cbiAgICAvLyBUaGlzIGZvbGxvd3MgRmxhcmVKUyBmZWUgY2FsY3VsYXRpb24gcGF0dGVybnMgZm9yIEMtY2hhaW4gaW1wb3J0c1xuXG4gICAgY29uc3QgYmFzZUZlZSA9IG5ldyBCaWdOdW1iZXIodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZVJhdGUgfHwgREVGQVVMVF9CQVNFX0ZFRSk7IC8vIDFNIG5hbm9GTFIgZGVmYXVsdFxuICAgIGNvbnN0IGlucHV0Q291bnQgPSBpbnB1dHMubGVuZ3RoO1xuICAgIGNvbnN0IG91dHB1dENvdW50ID0gMTsgLy8gU2luZ2xlIEMtY2hhaW4gb3V0cHV0XG5cbiAgICAvLyBGbGFyZUpTLXN0eWxlIGZlZSBjYWxjdWxhdGlvbiBmb3IgaW1wb3J0IHRyYW5zYWN0aW9uc1xuICAgIC8vIEJhc2UgZmVlIGNvdmVycyB0cmFuc2FjdGlvbiBvdmVyaGVhZFxuICAgIC8vIElucHV0IGZlZXMgY292ZXIgVVRYTyBwcm9jZXNzaW5nXG4gICAgLy8gT3V0cHV0IGZlZXMgY292ZXIgcmVzdWx0IGdlbmVyYXRpb25cblxuICAgIGNvbnN0IGlucHV0RmVlID0gbmV3IEJpZ051bWJlcihJTlBVVF9GRUUpOyAvLyAxMDBLIG5hbm9GTFIgcGVyIGlucHV0IChGbGFyZUpTIHN0YW5kYXJkKVxuICAgIGNvbnN0IG91dHB1dEZlZSA9IG5ldyBCaWdOdW1iZXIoT1VUUFVUX0ZFRSk7IC8vIDUwSyBuYW5vRkxSIHBlciBvdXRwdXQgKEZsYXJlSlMgc3RhbmRhcmQpXG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgZmVlOiBiYXNlICsgaW5wdXRzICsgb3V0cHV0c1xuICAgIGNvbnN0IHRvdGFsRmVlID0gYmFzZUZlZVxuICAgICAgLnBsdXMobmV3IEJpZ051bWJlcihpbnB1dENvdW50KS50aW1lcyhpbnB1dEZlZSkpXG4gICAgICAucGx1cyhuZXcgQmlnTnVtYmVyKG91dHB1dENvdW50KS50aW1lcyhvdXRwdXRGZWUpKTtcblxuICAgIC8vIEFkZCBDLWNoYWluIHNwZWNpZmljIGZlZXMgKEVWTSBnYXMgY29uc2lkZXJhdGlvbilcbiAgICBjb25zdCBldm1HYXNGZWUgPSBuZXcgQmlnTnVtYmVyKERFRkFVTFRfRVZNX0dBU19GRUUpOyAvLyBTdGFuZGFyZCBFVk0gdHJhbnNmZXIgZ2FzXG4gICAgY29uc3QgZmluYWxGZWUgPSB0b3RhbEZlZS5wbHVzKGV2bUdhc0ZlZSk7XG5cbiAgICAvLyBFbnN1cmUgbWluaW11bSBmZWUgdGhyZXNob2xkXG4gICAgY29uc3QgbWluaW11bUZlZSA9IG5ldyBCaWdOdW1iZXIoTUlOSU1VTV9GRUUpOyAvLyAxTSBuYW5vRkxSIG1pbmltdW1cbiAgICByZXR1cm4gQmlnTnVtYmVyLm1heChmaW5hbEZlZSwgbWluaW11bUZlZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIFVUWE9zIHRvIGJlIHVzZWQgYXMgaW5wdXRzIGZvciB0aGUgaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFV0eG9PYmpbXX0gdXR4b3MgLSBVVFhPcyBmcm9tIFAtY2hhaW4gdG8gaW1wb3J0XG4gICAqL1xuICBhZGRVdHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1dHhvcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICB0aGlzLl91dHhvcyA9IFsuLi50aGlzLl91dHhvcywgLi4udXR4b3NdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNoYWluIGZvciB0aGUgaW1wb3J0ICh0eXBpY2FsbHkgUC1jaGFpbilcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluSWQgLSBTb3VyY2UgY2hhaW4gSURcbiAgICovXG4gIHNvdXJjZUNoYWluKGNoYWluSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIC8vIFZhbGlkYXRlIGFuZCBzZXQgc291cmNlIGNoYWluIElEIGZvciBDLWNoYWluIGltcG9ydHNcbiAgICBpZiAoIWNoYWluSWQgfHwgdHlwZW9mIGNoYWluSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdTb3VyY2UgY2hhaW4gSUQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZCBzb3VyY2UgY2hhaW5zIGZvciBDLWNoYWluIGltcG9ydHMgaW4gRmxhcmUgbmV0d29ya1xuICAgIGNvbnN0IHZhbGlkU291cmNlQ2hhaW5zID0gVkFMSURfSU1QT1JUX1NPVVJDRV9DSEFJTlM7XG4gICAgY29uc3QgY2hhaW5JZE5vcm1hbGl6ZWQgPSBjaGFpbklkLnJlcGxhY2UoJy1jaGFpbicsICcnKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIHByZWRlZmluZWQgY2hhaW4gaWRlbnRpZmllclxuICAgIGlmICh2YWxpZFNvdXJjZUNoYWlucy5zb21lKChjaGFpbikgPT4gY2hhaW4ucmVwbGFjZSgnLWNoYWluJywgJycpLnRvVXBwZXJDYXNlKCkgPT09IGNoYWluSWROb3JtYWxpemVkKSkge1xuICAgICAgLy8gU3RvcmUgbm9ybWFsaXplZCBjaGFpbiBJRCAoZS5nLiwgJ1AnIGZvciBQLWNoYWluKVxuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmZyb20oY2hhaW5JZE5vcm1hbGl6ZWQsIFVURjhfRU5DT0RJTkcpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGhleC1lbmNvZGVkIGNoYWluIElEIChDSEFJTl9JRF9IRVhfTEVOR1RIIGNoYXJhY3RlcnMgZm9yIEZsYXJlSlMpXG4gICAgaWYgKGNyZWF0ZUhleFJlZ2V4KENIQUlOX0lEX0hFWF9MRU5HVEgpLnRlc3QoY2hhaW5JZCkpIHtcbiAgICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IEJ1ZmZlci5mcm9tKGNoYWluSWQsICdoZXgnKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBDQjU4LWVuY29kZWQgY2hhaW4gSUQgKEZsYXJlSlMgZm9ybWF0KVxuICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhjaGFpbklkKSkge1xuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gdXRpbHMuY2I1OERlY29kZShjaGFpbklkKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIElmIG5vbmUgb2YgdGhlIGFib3ZlLCB0cnkgdG8gZGVjb2RlIGFzIGhleCBvciB1c2UgYXMtaXNcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmZyb20oY2hhaW5JZCwgJ2hleCcpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuZnJvbShjaGFpbklkLCBVVEY4X0VOQ09ESU5HKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,73 @@
|
|
|
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, TransferableOutput, Credential } from '@flarenetwork/flarejs';
|
|
5
|
+
import { Tx, DecodedUtxoObj } from './iface';
|
|
6
|
+
import BigNumber from 'bignumber.js';
|
|
7
|
+
/**
|
|
8
|
+
* Flare P-chain Import Transaction Builder
|
|
9
|
+
* Builds import transactions within P-chain (typically from C-chain to P-chain) using FlareJS
|
|
10
|
+
*/
|
|
11
|
+
export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
|
|
12
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
13
|
+
protected get transactionType(): TransactionType;
|
|
14
|
+
/**
|
|
15
|
+
* Initialize builder from existing FlareJS P-chain import transaction
|
|
16
|
+
* @param {Tx} tx - FlareJS UnsignedTx or signed transaction to initialize from
|
|
17
|
+
*/
|
|
18
|
+
initBuilder(tx: Tx): this;
|
|
19
|
+
/**
|
|
20
|
+
* Verify transaction type for FlareJS P-chain import transactions
|
|
21
|
+
* @param {unknown} unsignedTx - FlareJS UnsignedTx
|
|
22
|
+
* @returns {boolean} - Whether transaction is valid P-chain import type
|
|
23
|
+
*/
|
|
24
|
+
static verifyTxType(unsignedTx: unknown): boolean;
|
|
25
|
+
verifyTxType(unsignedTx: unknown): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Build the P-chain import transaction using FlareJS pvm.newImportTx
|
|
28
|
+
* @protected
|
|
29
|
+
*/
|
|
30
|
+
protected buildFlareTransaction(): void;
|
|
31
|
+
/**
|
|
32
|
+
* Calculate total amount from UTXOs
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
private calculateTotalAmount;
|
|
36
|
+
/**
|
|
37
|
+
* Create inputs and outputs for P-chain import transaction
|
|
38
|
+
* @param {bigint} total - Total amount to import
|
|
39
|
+
* @returns {Object} - Inputs, outputs, and credentials
|
|
40
|
+
* @protected
|
|
41
|
+
*/
|
|
42
|
+
protected createInputOutput(total: bigint): {
|
|
43
|
+
inputs: TransferableInput[];
|
|
44
|
+
outputs: TransferableOutput[];
|
|
45
|
+
credentials: Credential[];
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Add UTXOs to be used as inputs for the P-chain import transaction
|
|
49
|
+
* @param {DecodedUtxoObj[]} utxos - UTXOs from C-chain to import to P-chain
|
|
50
|
+
*/
|
|
51
|
+
addUtxos(utxos: DecodedUtxoObj[]): this;
|
|
52
|
+
/**
|
|
53
|
+
* Set the source chain for the import (typically C-chain)
|
|
54
|
+
* @param {string} chainId - Source chain ID
|
|
55
|
+
*/
|
|
56
|
+
sourceChain(chainId: string): this;
|
|
57
|
+
/**
|
|
58
|
+
* Set fee for the P-chain import transaction
|
|
59
|
+
* @param {string | number | BigNumber} fee - Fee amount in nanoFLR
|
|
60
|
+
*/
|
|
61
|
+
fee(fee: string | number | BigNumber): this;
|
|
62
|
+
/**
|
|
63
|
+
* Set locktime for the P-chain import transaction
|
|
64
|
+
* @param {number | bigint} locktime - Locktime value
|
|
65
|
+
*/
|
|
66
|
+
locktime(locktime: number | bigint): this;
|
|
67
|
+
/**
|
|
68
|
+
* Set threshold for the P-chain import transaction
|
|
69
|
+
* @param {number} threshold - Signature threshold
|
|
70
|
+
*/
|
|
71
|
+
threshold(threshold: number): this;
|
|
72
|
+
}
|
|
73
|
+
//# 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,EAAyB,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,EAA4B,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGpH,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,SAAS,MAAM,cAAc,CAAC;AAqBrC;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAW7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED;;;OAGG;IACH,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI;IAyFzB;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO;IA2DjD,YAAY,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO;IAI1C;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAgGvC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IAwFD;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IASvC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA6ClC;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI;IAY3C;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKzC;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAQnC"}
|