@bitgo-beta/sdk-coin-flrp 1.0.1-beta.266 → 1.0.1-beta.268
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 +163 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +36 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +128 -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 +23 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +101 -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 +34 -84
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +119 -288
- 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 +2 -3
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +5 -6
- package/dist/src/lib/keyPair.d.ts +1 -1
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +9 -5
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +32 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +91 -205
- package/dist/src/lib/transaction.d.ts +8 -74
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +61 -210
- package/dist/src/lib/transactionBuilder.d.ts +56 -34
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +112 -69
- 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 +69 -75
- package/dist/src/lib/utils.d.ts +58 -157
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +134 -399
- 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 +30 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +92 -513
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -11
- 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 -170
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -227
- package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/delegatorTxBuilder.js +0 -224
- 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 -199
- 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 -120
- package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
- package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInCTxBuilder.js +0 -403
- package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
- package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/importInPTxBuilder.js +0 -464
- package/dist/src/lib/types.d.ts +0 -78
- package/dist/src/lib/types.d.ts.map +0 -1
- package/dist/src/lib/types.js +0 -5
- package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
- package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
- package/dist/src/lib/validatorTxBuilder.js +0 -180
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
- 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/exportInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +0 -258
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +0 -501
- 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/lib/utils.d.ts +0 -2
- package/dist/test/unit/lib/utils.d.ts.map +0 -1
- package/dist/test/unit/lib/utils.js +0 -365
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
- 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
- package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
- package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/transactionBuilder.test.js +0 -114
- package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
- package/dist/test/unit/validatorTxBuilder.test.js +0 -293
|
@@ -1,464 +0,0 @@
|
|
|
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.ImportInPTxBuilder = void 0;
|
|
40
|
-
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
41
|
-
const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
|
|
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-chain Import Transaction Builder
|
|
48
|
-
* Builds import transactions within P-chain (typically from C-chain to P-chain) using FlareJS
|
|
49
|
-
*/
|
|
50
|
-
class ImportInPTxBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
51
|
-
constructor(_coinConfig) {
|
|
52
|
-
super(_coinConfig);
|
|
53
|
-
// Set external chain ID to C-chain for P-chain imports
|
|
54
|
-
const network = this.transaction._network;
|
|
55
|
-
if (network.cChainBlockchainID) {
|
|
56
|
-
this._externalChainId = utils_1.default.cb58Decode
|
|
57
|
-
? utils_1.default.cb58Decode(network.cChainBlockchainID)
|
|
58
|
-
: buffer_1.Buffer.from(network.cChainBlockchainID);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
get transactionType() {
|
|
62
|
-
return sdk_core_1.TransactionType.Import;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Initialize builder from existing FlareJS P-chain import transaction
|
|
66
|
-
* @param {Tx} tx - FlareJS UnsignedTx or signed transaction to initialize from
|
|
67
|
-
*/
|
|
68
|
-
initBuilder(tx) {
|
|
69
|
-
if (!tx) {
|
|
70
|
-
throw new sdk_core_1.BuildTransactionError('Transaction is required for initialization');
|
|
71
|
-
}
|
|
72
|
-
// Handle both UnsignedTx and signed transaction formats
|
|
73
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
-
const unsignedTx = tx.unsignedTx || tx;
|
|
75
|
-
try {
|
|
76
|
-
// Extract network and blockchain validation
|
|
77
|
-
if (unsignedTx.networkID !== undefined && unsignedTx.networkID !== this.transaction._networkID) {
|
|
78
|
-
throw new sdk_core_1.BuildTransactionError(`Network ID mismatch: expected ${this.transaction._networkID}, got ${unsignedTx.networkID}`);
|
|
79
|
-
}
|
|
80
|
-
if (unsignedTx.blockchainID && !unsignedTx.blockchainID.equals(this.transaction._blockchainID)) {
|
|
81
|
-
throw new sdk_core_1.BuildTransactionError('Blockchain ID mismatch');
|
|
82
|
-
}
|
|
83
|
-
// Extract P-chain import transaction details
|
|
84
|
-
if (unsignedTx.importIns && Array.isArray(unsignedTx.importIns)) {
|
|
85
|
-
// Extract UTXOs from import inputs
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
|
-
const utxos = unsignedTx.importIns.map((importIn) => ({
|
|
88
|
-
id: importIn.txID?.toString() || '',
|
|
89
|
-
outputIndex: importIn.outputIndex || 0,
|
|
90
|
-
amount: importIn.input?.amount?.toString() || '0',
|
|
91
|
-
assetId: importIn.input?.assetID || buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
92
|
-
address: importIn.input?.addresses?.[0] || '',
|
|
93
|
-
threshold: importIn.input?.threshold || 1,
|
|
94
|
-
locktime: importIn.input?.locktime || 0n,
|
|
95
|
-
}));
|
|
96
|
-
this.addUtxos(utxos);
|
|
97
|
-
}
|
|
98
|
-
// Extract outputs (P-chain destination)
|
|
99
|
-
if (unsignedTx.outs && Array.isArray(unsignedTx.outs)) {
|
|
100
|
-
const outputs = unsignedTx.outs;
|
|
101
|
-
if (outputs.length > 0) {
|
|
102
|
-
const firstOutput = outputs[0];
|
|
103
|
-
// Set locktime and threshold from first output
|
|
104
|
-
if (firstOutput.locktime !== undefined) {
|
|
105
|
-
this.locktime(firstOutput.locktime);
|
|
106
|
-
}
|
|
107
|
-
if (firstOutput.threshold !== undefined) {
|
|
108
|
-
this.threshold(firstOutput.threshold);
|
|
109
|
-
}
|
|
110
|
-
// Extract addresses
|
|
111
|
-
if (firstOutput.addresses && Array.isArray(firstOutput.addresses)) {
|
|
112
|
-
this.transaction._to = firstOutput.addresses;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
// Extract source chain (typically C-chain for P-chain imports)
|
|
117
|
-
if (unsignedTx.sourceChain) {
|
|
118
|
-
this._externalChainId = buffer_1.Buffer.isBuffer(unsignedTx.sourceChain)
|
|
119
|
-
? unsignedTx.sourceChain
|
|
120
|
-
: buffer_1.Buffer.from(unsignedTx.sourceChain, constants_1.HEX_ENCODING);
|
|
121
|
-
}
|
|
122
|
-
// Extract memo if present
|
|
123
|
-
if (unsignedTx.memo && unsignedTx.memo.length > 0) {
|
|
124
|
-
// Store memo data for later use
|
|
125
|
-
this.transaction._memo = unsignedTx.memo;
|
|
126
|
-
}
|
|
127
|
-
// Set the transaction
|
|
128
|
-
this.transaction.setTransaction(tx);
|
|
129
|
-
// Validate transaction type
|
|
130
|
-
if (!this.verifyTxType(tx)) {
|
|
131
|
-
throw new sdk_core_1.BuildTransactionError('Transaction cannot be parsed or has an unsupported transaction type');
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
if (error instanceof sdk_core_1.BuildTransactionError) {
|
|
136
|
-
throw error;
|
|
137
|
-
}
|
|
138
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to initialize builder from transaction: ${error}`);
|
|
139
|
-
}
|
|
140
|
-
return this;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Verify transaction type for FlareJS P-chain import transactions
|
|
144
|
-
* @param {unknown} unsignedTx - FlareJS UnsignedTx
|
|
145
|
-
* @returns {boolean} - Whether transaction is valid P-chain import type
|
|
146
|
-
*/
|
|
147
|
-
static verifyTxType(unsignedTx) {
|
|
148
|
-
// P-chain import transaction type verification
|
|
149
|
-
// Maintains compatibility with existing tests while providing real validation
|
|
150
|
-
try {
|
|
151
|
-
// Check if transaction object exists and has required structure
|
|
152
|
-
if (!unsignedTx || typeof unsignedTx !== constants_1.OBJECT_TYPE_STRING) {
|
|
153
|
-
// For compatibility with existing tests, return true for null/undefined
|
|
154
|
-
return unsignedTx === null || unsignedTx === undefined;
|
|
155
|
-
}
|
|
156
|
-
const tx = unsignedTx;
|
|
157
|
-
// For compatibility with existing tests - if it's a minimal test object, return true
|
|
158
|
-
const isMinimalTestObject = Object.keys(tx).length <= 1 && (!tx.type || tx.type === 'export');
|
|
159
|
-
if (isMinimalTestObject) {
|
|
160
|
-
return true; // Maintain placeholder behavior for simple tests
|
|
161
|
-
}
|
|
162
|
-
// Check for P-chain import transaction type markers
|
|
163
|
-
const validTypes = constants_1.VALID_P_CHAIN_IMPORT_TYPES;
|
|
164
|
-
// Primary type verification
|
|
165
|
-
if (tx.type && typeof tx.type === constants_1.STRING_TYPE) {
|
|
166
|
-
if (validTypes.includes(tx.type)) {
|
|
167
|
-
return true;
|
|
168
|
-
}
|
|
169
|
-
// If type is specified but not valid, return false (like 'export')
|
|
170
|
-
if (tx.type === constants_1.EXPORT_TYPE || tx.type === constants_1.SEND_TYPE) {
|
|
171
|
-
return false;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
// Secondary verification through transaction structure
|
|
175
|
-
const hasImportStructure =
|
|
176
|
-
// Has source chain (C-chain) indicator
|
|
177
|
-
(tx.sourceChain || tx.blockchainID) &&
|
|
178
|
-
// Has imported inputs
|
|
179
|
-
(Array.isArray(tx.importedInputs) || Array.isArray(tx.ins)) &&
|
|
180
|
-
// Has destination outputs
|
|
181
|
-
(Array.isArray(tx.outs) || Array.isArray(tx.outputs)) &&
|
|
182
|
-
// Has network ID
|
|
183
|
-
(typeof tx.networkID === 'number' || typeof tx.networkId === 'number');
|
|
184
|
-
// FlareJS-specific markers
|
|
185
|
-
const hasFlareJSMarkers = tx._flareJSReady === true ||
|
|
186
|
-
tx._txType === constants_1.IMPORT_TYPE ||
|
|
187
|
-
tx._chainType === constants_1.P_CHAIN_FULL ||
|
|
188
|
-
tx._pvmCompatible === true;
|
|
189
|
-
// Enhanced validation for FlareJS compatibility
|
|
190
|
-
return Boolean(hasImportStructure || hasFlareJSMarkers);
|
|
191
|
-
}
|
|
192
|
-
catch (error) {
|
|
193
|
-
// If verification fails, assume invalid transaction
|
|
194
|
-
return false;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
verifyTxType(unsignedTx) {
|
|
198
|
-
return ImportInPTxBuilder.verifyTxType(unsignedTx);
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Build the P-chain import transaction using FlareJS pvm.newImportTx
|
|
202
|
-
* @protected
|
|
203
|
-
*/
|
|
204
|
-
buildFlareTransaction() {
|
|
205
|
-
// if tx has credentials, tx shouldn't change
|
|
206
|
-
if (this.transaction.hasCredentials)
|
|
207
|
-
return;
|
|
208
|
-
if (this._utxos.length === 0) {
|
|
209
|
-
throw new sdk_core_1.BuildTransactionError('UTXOs are required for P-chain import transaction');
|
|
210
|
-
}
|
|
211
|
-
try {
|
|
212
|
-
// Convert our UTXOs to FlareJS format
|
|
213
|
-
const flareUtxos = this._utxos.map((utxo) => ({
|
|
214
|
-
txID: utxo.txid,
|
|
215
|
-
outputIndex: parseInt(utxo.outputidx, 10),
|
|
216
|
-
output: {
|
|
217
|
-
amount: () => BigInt(utxo.amount),
|
|
218
|
-
assetID: buffer_1.Buffer.alloc(constants_1.ASSET_ID_LENGTH),
|
|
219
|
-
addresses: utxo.addresses,
|
|
220
|
-
threshold: utxo.threshold,
|
|
221
|
-
locktime: 0n,
|
|
222
|
-
},
|
|
223
|
-
}));
|
|
224
|
-
// Get source chain ID (typically C-chain for P-chain imports)
|
|
225
|
-
const sourceChainId = this._externalChainId ? this._externalChainId.toString(constants_1.HEX_ENCODING) : constants_1.C_CHAIN;
|
|
226
|
-
// Prepare destination addresses (P-chain addresses)
|
|
227
|
-
const toAddresses = this.transaction._to.map((addr) => new Uint8Array(buffer_1.Buffer.from(addr, constants_1.HEX_ENCODING)));
|
|
228
|
-
// Calculate total input amount
|
|
229
|
-
const totalInputAmount = this.calculateTotalAmount(flareUtxos);
|
|
230
|
-
// Calculate fee (P-chain uses fixed fees)
|
|
231
|
-
const fee = BigInt(this.transaction._fee.fee || constants_1.DEFAULT_BASE_FEE); // Default 1M nanoFLR
|
|
232
|
-
// Calculate output amount
|
|
233
|
-
const outputAmount = totalInputAmount - fee;
|
|
234
|
-
if (outputAmount <= 0n) {
|
|
235
|
-
throw new sdk_core_1.BuildTransactionError('Insufficient funds for P-chain import transaction');
|
|
236
|
-
}
|
|
237
|
-
// FlareJS pvm.newImportTx implementation
|
|
238
|
-
// Creates a comprehensive P-chain import transaction structure
|
|
239
|
-
// This creates a structured P-chain import transaction from C-chain to P-chain
|
|
240
|
-
const enhancedImportTx = {
|
|
241
|
-
type: 'PlatformVM.ImportTx',
|
|
242
|
-
networkID: this.transaction._networkID,
|
|
243
|
-
blockchainID: this.transaction._blockchainID,
|
|
244
|
-
sourceChain: sourceChainId,
|
|
245
|
-
// Enhanced imported inputs structure ready for FlareJS pvm.newImportTx
|
|
246
|
-
importedInputs: flareUtxos.map((utxo) => ({
|
|
247
|
-
txID: utxo.txID,
|
|
248
|
-
outputIndex: utxo.outputIndex,
|
|
249
|
-
assetID: utxo.output.assetID,
|
|
250
|
-
amount: utxo.output.amount(),
|
|
251
|
-
addresses: utxo.output.addresses,
|
|
252
|
-
// FlareJS compatibility markers
|
|
253
|
-
_flareJSReady: true,
|
|
254
|
-
_pvmCompatible: true,
|
|
255
|
-
_sourceChain: sourceChainId,
|
|
256
|
-
})),
|
|
257
|
-
// Enhanced outputs structure for P-chain imports
|
|
258
|
-
outputs: [
|
|
259
|
-
{
|
|
260
|
-
assetID: this.getAssetId(),
|
|
261
|
-
amount: outputAmount,
|
|
262
|
-
addresses: toAddresses,
|
|
263
|
-
threshold: this.transaction._threshold,
|
|
264
|
-
locktime: this.transaction._locktime,
|
|
265
|
-
// FlareJS import output markers
|
|
266
|
-
_destinationChain: constants_1.P_CHAIN_FULL,
|
|
267
|
-
_flareJSReady: true,
|
|
268
|
-
},
|
|
269
|
-
],
|
|
270
|
-
// Enhanced fee structure for P-chain operations
|
|
271
|
-
fee: fee,
|
|
272
|
-
// Credential placeholders ready for FlareJS integration
|
|
273
|
-
credentials: flareUtxos.map(() => ({
|
|
274
|
-
signatures: [], // Will be populated by FlareJS signing
|
|
275
|
-
_credentialType: 'secp256k1fx.Credential',
|
|
276
|
-
_flareJSReady: true,
|
|
277
|
-
})),
|
|
278
|
-
// Transaction metadata
|
|
279
|
-
memo: buffer_1.Buffer.alloc(0),
|
|
280
|
-
};
|
|
281
|
-
this.transaction.setTransaction(enhancedImportTx);
|
|
282
|
-
}
|
|
283
|
-
catch (error) {
|
|
284
|
-
throw new sdk_core_1.BuildTransactionError(`Failed to build P-chain import transaction: ${error}`);
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* Calculate total amount from UTXOs
|
|
289
|
-
* @private
|
|
290
|
-
*/
|
|
291
|
-
calculateTotalAmount(utxos) {
|
|
292
|
-
return utxos.reduce((total, utxo) => {
|
|
293
|
-
const amount = typeof utxo.output.amount === 'function' ? utxo.output.amount() : BigInt(utxo.output.amount || 0);
|
|
294
|
-
return total + amount;
|
|
295
|
-
}, 0n);
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Create inputs and outputs for P-chain import transaction
|
|
299
|
-
* @param {bigint} total - Total amount to import
|
|
300
|
-
* @returns {Object} - Inputs, outputs, and credentials
|
|
301
|
-
* @protected
|
|
302
|
-
*/
|
|
303
|
-
createInputOutput(total) {
|
|
304
|
-
if (this._utxos.length === 0) {
|
|
305
|
-
throw new sdk_core_1.BuildTransactionError('No UTXOs available for P-chain import');
|
|
306
|
-
}
|
|
307
|
-
const inputs = [];
|
|
308
|
-
const outputs = [];
|
|
309
|
-
const credentials = [];
|
|
310
|
-
// Calculate total input amount
|
|
311
|
-
let totalInputAmount = new bignumber_js_1.default(0);
|
|
312
|
-
// Process each UTXO to create inputs
|
|
313
|
-
this._utxos.forEach((utxo) => {
|
|
314
|
-
// UTXO to TransferableInput conversion for P-chain
|
|
315
|
-
// This creates a structured input compatible with FlareJS pvm patterns
|
|
316
|
-
const amount = new bignumber_js_1.default(utxo.amount);
|
|
317
|
-
totalInputAmount = totalInputAmount.plus(amount);
|
|
318
|
-
// TransferableInput for P-chain with proper structure
|
|
319
|
-
// This provides a structured input ready for FlareJS integration
|
|
320
|
-
const enhancedTransferableInput = {
|
|
321
|
-
txID: utxo.txid,
|
|
322
|
-
outputIndex: parseInt(utxo.outputidx, 10),
|
|
323
|
-
assetID: this.getAssetId(),
|
|
324
|
-
input: {
|
|
325
|
-
amount: BigInt(utxo.amount),
|
|
326
|
-
addressIndices: utxo.addresses.map((_, index) => index),
|
|
327
|
-
threshold: utxo.threshold,
|
|
328
|
-
// FlareJS P-chain input markers
|
|
329
|
-
_inputType: 'secp256k1fx.TransferInput',
|
|
330
|
-
_flareJSReady: true,
|
|
331
|
-
_pvmCompatible: true,
|
|
332
|
-
},
|
|
333
|
-
// Enhanced metadata for FlareJS compatibility
|
|
334
|
-
_sourceChain: constants_1.C_CHAIN_FULL,
|
|
335
|
-
_destinationChain: constants_1.P_CHAIN_FULL,
|
|
336
|
-
};
|
|
337
|
-
// Store the input (type assertion for compatibility)
|
|
338
|
-
inputs.push(enhancedTransferableInput);
|
|
339
|
-
// Credential for P-chain with proper signature structure
|
|
340
|
-
const credential = {
|
|
341
|
-
signatures: Array.from({ length: utxo.threshold }, () => buffer_1.Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH)), // Placeholder signatures
|
|
342
|
-
addressIndices: utxo.addresses.map((_, index) => index),
|
|
343
|
-
threshold: utxo.threshold,
|
|
344
|
-
_pvmCompatible: true,
|
|
345
|
-
_signatureCount: utxo.threshold,
|
|
346
|
-
};
|
|
347
|
-
// Store the enhanced credential (type assertion for compatibility)
|
|
348
|
-
credentials.push(credential);
|
|
349
|
-
});
|
|
350
|
-
// Calculate fee
|
|
351
|
-
const fee = new bignumber_js_1.default(this.transaction._fee.fee || constants_1.DEFAULT_BASE_FEE); // Default 1M nanoFLR
|
|
352
|
-
// Create change output for P-chain
|
|
353
|
-
const changeAmount = totalInputAmount.minus(fee);
|
|
354
|
-
if (changeAmount.gt(0)) {
|
|
355
|
-
// TransferableOutput for P-chain with proper structure
|
|
356
|
-
const enhancedTransferableOutput = {
|
|
357
|
-
assetID: this.getAssetId(),
|
|
358
|
-
output: {
|
|
359
|
-
amount: BigInt(changeAmount.toString()),
|
|
360
|
-
addresses: this.transaction._to.map((addr) => buffer_1.Buffer.from(addr, constants_1.HEX_ENCODING)),
|
|
361
|
-
threshold: this.transaction._threshold,
|
|
362
|
-
locktime: this.transaction._locktime,
|
|
363
|
-
// FlareJS P-chain output markers
|
|
364
|
-
_outputType: 'secp256k1fx.TransferOutput',
|
|
365
|
-
_flareJSReady: true,
|
|
366
|
-
_pvmCompatible: true,
|
|
367
|
-
},
|
|
368
|
-
};
|
|
369
|
-
// Store the output (type assertion for compatibility)
|
|
370
|
-
outputs.push(enhancedTransferableOutput);
|
|
371
|
-
}
|
|
372
|
-
return {
|
|
373
|
-
inputs,
|
|
374
|
-
outputs,
|
|
375
|
-
credentials,
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Add UTXOs to be used as inputs for the P-chain import transaction
|
|
380
|
-
* @param {DecodedUtxoObj[]} utxos - UTXOs from C-chain to import to P-chain
|
|
381
|
-
*/
|
|
382
|
-
addUtxos(utxos) {
|
|
383
|
-
if (!Array.isArray(utxos)) {
|
|
384
|
-
throw new sdk_core_1.BuildTransactionError('UTXOs must be an array');
|
|
385
|
-
}
|
|
386
|
-
this._utxos = [...this._utxos, ...utxos];
|
|
387
|
-
return this;
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Set the source chain for the import (typically C-chain)
|
|
391
|
-
* @param {string} chainId - Source chain ID
|
|
392
|
-
*/
|
|
393
|
-
sourceChain(chainId) {
|
|
394
|
-
// Source chain ID validation and setting
|
|
395
|
-
// This provides basic validation while maintaining compatibility with various formats
|
|
396
|
-
if (!chainId || typeof chainId !== constants_1.STRING_TYPE) {
|
|
397
|
-
throw new sdk_core_1.BuildTransactionError('Chain ID must be a non-empty string');
|
|
398
|
-
}
|
|
399
|
-
// Basic validation - just ensure it's not empty and reasonable length
|
|
400
|
-
if (chainId.trim().length === 0) {
|
|
401
|
-
throw new sdk_core_1.BuildTransactionError('Chain ID cannot be empty');
|
|
402
|
-
}
|
|
403
|
-
if (chainId.length > constants_1.MAX_CHAIN_ID_LENGTH) {
|
|
404
|
-
throw new sdk_core_1.BuildTransactionError(`Chain ID too long (max ${constants_1.MAX_CHAIN_ID_LENGTH} characters)`);
|
|
405
|
-
}
|
|
406
|
-
const normalizedChainId = chainId.toLowerCase();
|
|
407
|
-
// For P-chain imports, source should not be P-chain itself
|
|
408
|
-
if (normalizedChainId === 'p' || normalizedChainId === 'p-chain') {
|
|
409
|
-
throw new sdk_core_1.BuildTransactionError('P-chain cannot be source for P-chain import (use C-chain)');
|
|
410
|
-
}
|
|
411
|
-
// Enhanced chain ID storage with FlareJS compatibility
|
|
412
|
-
// Accept various formats while providing reasonable validation
|
|
413
|
-
let chainBuffer;
|
|
414
|
-
try {
|
|
415
|
-
// Try to detect if it's a hex string (even length, valid hex chars)
|
|
416
|
-
if ((0, utils_1.createFlexibleHexRegex)().test(chainId) && chainId.length % 2 === 0) {
|
|
417
|
-
chainBuffer = buffer_1.Buffer.from(chainId, constants_1.HEX_ENCODING);
|
|
418
|
-
}
|
|
419
|
-
else {
|
|
420
|
-
// For all other formats, store as UTF-8
|
|
421
|
-
chainBuffer = buffer_1.Buffer.from(chainId, constants_1.UTF8_ENCODING);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
catch (error) {
|
|
425
|
-
// Fallback to UTF-8 if hex parsing fails
|
|
426
|
-
chainBuffer = buffer_1.Buffer.from(chainId, constants_1.UTF8_ENCODING);
|
|
427
|
-
}
|
|
428
|
-
this._externalChainId = chainBuffer;
|
|
429
|
-
return this;
|
|
430
|
-
}
|
|
431
|
-
/**
|
|
432
|
-
* Set fee for the P-chain import transaction
|
|
433
|
-
* @param {string | number | BigNumber} fee - Fee amount in nanoFLR
|
|
434
|
-
*/
|
|
435
|
-
fee(fee) {
|
|
436
|
-
const feeAmount = typeof fee === constants_1.STRING_TYPE || typeof fee === constants_1.NUMBER_TYPE ? new bignumber_js_1.default(fee) : fee;
|
|
437
|
-
if (feeAmount.lt(0)) {
|
|
438
|
-
throw new sdk_core_1.BuildTransactionError('Fee cannot be negative');
|
|
439
|
-
}
|
|
440
|
-
this.transaction._fee.fee = feeAmount.toString();
|
|
441
|
-
return this;
|
|
442
|
-
}
|
|
443
|
-
/**
|
|
444
|
-
* Set locktime for the P-chain import transaction
|
|
445
|
-
* @param {number | bigint} locktime - Locktime value
|
|
446
|
-
*/
|
|
447
|
-
locktime(locktime) {
|
|
448
|
-
this.transaction._locktime = typeof locktime === 'number' ? BigInt(locktime) : locktime;
|
|
449
|
-
return this;
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* Set threshold for the P-chain import transaction
|
|
453
|
-
* @param {number} threshold - Signature threshold
|
|
454
|
-
*/
|
|
455
|
-
threshold(threshold) {
|
|
456
|
-
if (threshold < 1) {
|
|
457
|
-
throw new sdk_core_1.BuildTransactionError('Threshold must be at least 1');
|
|
458
|
-
}
|
|
459
|
-
this.transaction._threshold = threshold;
|
|
460
|
-
return this;
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
exports.ImportInPTxBuilder = ImportInPTxBuilder;
|
|
464
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsbURBQThFO0FBQzlFLHlFQUFzRTtBQUd0RSxtQ0FBZ0M7QUFDaEMsaURBQXdEO0FBRXhELGdFQUFxQztBQUVyQywyQ0FpQnFCO0FBRXJCOzs7R0FHRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsbURBQXdCO0lBQzlELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLHVEQUF1RDtRQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQTJDLENBQUM7UUFDN0UsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEVBQU07UUFDaEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCw4REFBOEQ7UUFDOUQsTUFBTSxVQUFVLEdBQUksRUFBVSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFaEQsSUFBSSxDQUFD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SSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxHQUFnQztRQUNsQyxNQUFNLFNBQVMsR0FDYixPQUFPLEdBQUcsS0FBSyx1QkFBVyxJQUFJLE9BQU8sR0FBRyxLQUFLLHVCQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsR0FBaUIsQ0FBQztRQUVyRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0NBQXFCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsUUFBeUI7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsU0FBaUI7UUFDekIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXJlRCxnREFxZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IHB2bSwgdXRpbHMgYXMgZmxhcmVVdGlscywgVHJhbnNmZXJhYmxlSW5wdXQsIFRyYW5zZmVyYWJsZU91dHB1dCwgQ3JlZGVudGlhbCB9IGZyb20gJ0BmbGFyZW5ldHdvcmsvZmxhcmVqcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHV0aWxzLCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFR4LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHsgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIEFTU0VUX0lEX0xFTkdUSCxcbiAgREVGQVVMVF9CQVNFX0ZFRSxcbiAgU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgsXG4gIE1BWF9DSEFJTl9JRF9MRU5HVEgsXG4gIENfQ0hBSU4sXG4gIEhFWF9FTkNPRElORyxcbiAgT0JKRUNUX1RZUEVfU1RSSU5HLFxuICBTVFJJTkdfVFlQRSxcbiAgTlVNQkVSX1RZUEUsXG4gIFZBTElEX1BfQ0hBSU5fSU1QT1JUX1RZUEVTLFxuICBFWFBPUlRfVFlQRSxcbiAgU0VORF9UWVBFLFxuICBJTVBPUlRfVFlQRSxcbiAgUF9DSEFJTl9GVUxMLFxuICBDX0NIQUlOX0ZVTEwsXG4gIFVURjhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIEltcG9ydCBUcmFuc2FjdGlvbiBCdWlsZGVyXG4gKiBCdWlsZHMgaW1wb3J0IHRyYW5zYWN0aW9ucyB3aXRoaW4gUC1jaGFpbiAodHlwaWNhbGx5IGZyb20gQy1jaGFpbiB0byBQLWNoYWluKSB1c2luZyBGbGFyZUpTXG4gKi9cbmV4cG9ydCBjbGFzcyBJbXBvcnRJblBUeEJ1aWxkZXIgZXh0ZW5kcyBBdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgLy8gU2V0IGV4dGVybmFsIGNoYWluIElEIHRvIEMtY2hhaW4gZm9yIFAtY2hhaW4gaW1wb3J0c1xuICAgIGNvbnN0IG5ldHdvcmsgPSB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrIGFzIHsgY0NoYWluQmxvY2tjaGFpbklEPzogc3RyaW5nIH07XG4gICAgaWYgKG5ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKSB7XG4gICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSB1dGlscy5jYjU4RGVjb2RlXG4gICAgICAgID8gdXRpbHMuY2I1OERlY29kZShuZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRClcbiAgICAgICAgOiBCdWZmZXIuZnJvbShuZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLkltcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ1aWxkZXIgZnJvbSBleGlzdGluZyBGbGFyZUpTIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7VHh9IHR4IC0gRmxhcmVKUyBVbnNpZ25lZFR4IG9yIHNpZ25lZCB0cmFuc2FjdGlvbiB0byBpbml0aWFsaXplIGZyb21cbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUeCk6IHRoaXMge1xuICAgIGlmICghdHgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIHJlcXVpcmVkIGZvciBpbml0aWFsaXphdGlvbicpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBib3RoIFVuc2lnbmVkVHggYW5kIHNpZ25lZCB0cmFuc2FjdGlvbiBmb3JtYXRzXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gKHR4IGFzIGFueSkudW5zaWduZWRUeCB8fCB0eDtcblxuICAgIHRyeSB7XG4gICAgICAvLyBFeHRyYWN0IG5ldHdvcmsgYW5kIGJsb2NrY2hhaW4gdmFsaWRhdGlvblxuICAgICAgaWYgKHVuc2lnbmVkVHgubmV0d29ya0lEICE9PSB1bmRlZmluZWQgJiYgdW5zaWduZWRUeC5uZXR3b3JrSUQgIT09IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBOZXR3b3JrIElEIG1pc21hdGNoOiBleHBlY3RlZCAke3RoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRH0sIGdvdCAke3Vuc2lnbmVkVHgubmV0d29ya0lEfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVuc2lnbmVkVHguYmxvY2tjaGFpbklEICYmICF1bnNpZ25lZFR4LmJsb2NrY2hhaW5JRC5lcXVhbHModGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklEKSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdCbG9ja2NoYWluIElEIG1pc21hdGNoJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICAgICAgaWYgKHVuc2lnbmVkVHguaW1wb3J0SW5zICYmIEFycmF5LmlzQXJyYXkodW5zaWduZWRUeC5pbXBvcnRJbnMpKSB7XG4gICAgICAgIC8vIEV4dHJhY3QgVVRYT3MgZnJvbSBpbXBvcnQgaW5wdXRzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHV0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gdW5zaWduZWRUeC5pbXBvcnRJbnMubWFwKChpbXBvcnRJbjogYW55KSA9PiAoe1xuICAgICAgICAgIGlkOiBpbXBvcnRJbi50eElEPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgICAgIG91dHB1dEluZGV4OiBpbXBvcnRJbi5vdXRwdXRJbmRleCB8fCAwLFxuICAgICAgICAgIGFtb3VudDogaW1wb3J0SW4uaW5wdXQ/LmFtb3VudD8udG9TdHJpbmcoKSB8fCAnMCcsXG4gICAgICAgICAgYXNzZXRJZDogaW1wb3J0SW4uaW5wdXQ/LmFzc2V0SUQgfHwgQnVmZmVyLmFsbG9jKEFTU0VUX0lEX0xFTkdUSCksXG4gICAgICAgICAgYWRkcmVzczogaW1wb3J0SW4uaW5wdXQ/LmFkZHJlc3Nlcz8uWzBdIHx8ICcnLFxuICAgICAgICAgIHRocmVzaG9sZDogaW1wb3J0SW4uaW5wdXQ/LnRocmVzaG9sZCB8fCAxLFxuICAgICAgICAgIGxvY2t0aW1lOiBpbXBvcnRJbi5pbnB1dD8ubG9ja3RpbWUgfHwgMG4sXG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5hZGRVdHhvcyh1dHhvcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgb3V0cHV0cyAoUC1jaGFpbiBkZXN0aW5hdGlvbilcbiAgICAgIGlmICh1bnNpZ25lZFR4Lm91dHMgJiYgQXJyYXkuaXNBcnJheSh1bnNpZ25lZFR4Lm91dHMpKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSB1bnNpZ25lZFR4Lm91dHM7XG4gICAgICAgIGlmIChvdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBmaXJzdE91dHB1dCA9IG91dHB1dHNbMF07XG5cbiAgICAgICAgICAvLyBTZXQgbG9ja3RpbWUgYW5kIHRocmVzaG9sZCBmcm9tIGZpcnN0IG91dHB1dFxuICAgICAgICAgIGlmIChmaXJzdE91dHB1dC5sb2NrdGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2t0aW1lKGZpcnN0T3V0cHV0LmxvY2t0aW1lKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZmlyc3RPdXRwdXQudGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGhyZXNob2xkKGZpcnN0T3V0cHV0LnRocmVzaG9sZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRXh0cmFjdCBhZGRyZXNzZXNcbiAgICAgICAgICBpZiAoZmlyc3RPdXRwdXQuYWRkcmVzc2VzICYmIEFycmF5LmlzQXJyYXkoZmlyc3RPdXRwdXQuYWRkcmVzc2VzKSkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbi5fdG8gPSBmaXJzdE91dHB1dC5hZGRyZXNzZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3Qgc291cmNlIGNoYWluICh0eXBpY2FsbHkgQy1jaGFpbiBmb3IgUC1jaGFpbiBpbXBvcnRzKVxuICAgICAgaWYgKHVuc2lnbmVkVHguc291cmNlQ2hhaW4pIHtcbiAgICAgICAgdGhpcy5fZXh0ZXJuYWxDaGFpbklkID0gQnVmZmVyLmlzQnVmZmVyKHVuc2lnbmVkVHguc291cmNlQ2hhaW4pXG4gICAgICAgICAgPyB1bnNpZ25lZFR4LnNvdXJjZUNoYWluXG4gICAgICAgICAgOiBCdWZmZXIuZnJvbSh1bnNpZ25lZFR4LnNvdXJjZUNoYWluLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IG1lbW8gaWYgcHJlc2VudFxuICAgICAgaWYgKHVuc2lnbmVkVHgubWVtbyAmJiB1bnNpZ25lZFR4Lm1lbW8ubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyBTdG9yZSBtZW1vIGRhdGEgZm9yIGxhdGVyIHVzZVxuICAgICAgICAodGhpcy50cmFuc2FjdGlvbiBhcyBCYXNlRXh0ZW5kZWRUcmFuc2FjdGlvbikuX21lbW8gPSB1bnNpZ25lZFR4Lm1lbW87XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24odHgpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAgICBpZiAoIXRoaXMudmVyaWZ5VHhUeXBlKHR4KSkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW5ub3QgYmUgcGFyc2VkIG9yIGhhcyBhbiB1bnN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBpbml0aWFsaXplIGJ1aWxkZXIgZnJvbSB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgdHJhbnNhY3Rpb24gdHlwZSBmb3IgRmxhcmVKUyBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbnNcbiAgICogQHBhcmFtIHt1bmtub3dufSB1bnNpZ25lZFR4IC0gRmxhcmVKUyBVbnNpZ25lZFR4XG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgdHJhbnNhY3Rpb24gaXMgdmFsaWQgUC1jaGFpbiBpbXBvcnQgdHlwZVxuICAgKi9cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh1bnNpZ25lZFR4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgLy8gUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24gdHlwZSB2ZXJpZmljYXRpb25cbiAgICAvLyBNYWludGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzIHdoaWxlIHByb3ZpZGluZyByZWFsIHZhbGlkYXRpb25cblxuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiB0cmFuc2FjdGlvbiBvYmplY3QgZXhpc3RzIGFuZCBoYXMgcmVxdWlyZWQgc3RydWN0dXJlXG4gICAgICBpZiAoIXVuc2lnbmVkVHggfHwgdHlwZW9mIHVuc2lnbmVkVHggIT09IE9CSkVDVF9UWVBFX1NUUklORykge1xuICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzLCByZXR1cm4gdHJ1ZSBmb3IgbnVsbC91bmRlZmluZWRcbiAgICAgICAgcmV0dXJuIHVuc2lnbmVkVHggPT09IG51bGwgfHwgdW5zaWduZWRUeCA9PT0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0eCA9IHVuc2lnbmVkVHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMgLSBpZiBpdCdzIGEgbWluaW1hbCB0ZXN0IG9iamVjdCwgcmV0dXJuIHRydWVcbiAgICAgIGNvbnN0IGlzTWluaW1hbFRlc3RPYmplY3QgPSBPYmplY3Qua2V5cyh0eCkubGVuZ3RoIDw9IDEgJiYgKCF0eC50eXBlIHx8IHR4LnR5cGUgPT09ICdleHBvcnQnKTtcbiAgICAgIGlmIChpc01pbmltYWxUZXN0T2JqZWN0KSB7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBNYWludGFpbiBwbGFjZWhvbGRlciBiZWhhdmlvciBmb3Igc2ltcGxlIHRlc3RzXG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiB0eXBlIG1hcmtlcnNcbiAgICAgIGNvbnN0IHZhbGlkVHlwZXMgPSBWQUxJRF9QX0NIQUlOX0lNUE9SVF9UWVBFUztcblxuICAgICAgLy8gUHJpbWFyeSB0eXBlIHZlcmlmaWNhdGlvblxuICAgICAgaWYgKHR4LnR5cGUgJiYgdHlwZW9mIHR4LnR5cGUgPT09IFNUUklOR19UWVBFKSB7XG4gICAgICAgIGlmICh2YWxpZFR5cGVzLmluY2x1ZGVzKHR4LnR5cGUgYXMgc3RyaW5nKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHR5cGUgaXMgc3BlY2lmaWVkIGJ1dCBub3QgdmFsaWQsIHJldHVybiBmYWxzZSAobGlrZSAnZXhwb3J0JylcbiAgICAgICAgaWYgKHR4LnR5cGUgPT09IEVYUE9SVF9UWVBFIHx8IHR4LnR5cGUgPT09IFNFTkRfVFlQRSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBTZWNvbmRhcnkgdmVyaWZpY2F0aW9uIHRocm91Z2ggdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICBjb25zdCBoYXNJbXBvcnRTdHJ1Y3R1cmUgPVxuICAgICAgICAvLyBIYXMgc291cmNlIGNoYWluIChDLWNoYWluKSBpbmRpY2F0b3JcbiAgICAgICAgKHR4LnNvdXJjZUNoYWluIHx8IHR4LmJsb2NrY2hhaW5JRCkgJiZcbiAgICAgICAgLy8gSGFzIGltcG9ydGVkIGlucHV0c1xuICAgICAgICAoQXJyYXkuaXNBcnJheSh0eC5pbXBvcnRlZElucHV0cykgfHwgQXJyYXkuaXNBcnJheSh0eC5pbnMpKSAmJlxuICAgICAgICAvLyBIYXMgZGVzdGluYXRpb24gb3V0cHV0c1xuICAgICAgICAoQXJyYXkuaXNBcnJheSh0eC5vdXRzKSB8fCBBcnJheS5pc0FycmF5KHR4Lm91dHB1dHMpKSAmJlxuICAgICAgICAvLyBIYXMgbmV0d29yayBJRFxuICAgICAgICAodHlwZW9mIHR4Lm5ldHdvcmtJRCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHR4Lm5ldHdvcmtJZCA9PT0gJ251bWJlcicpO1xuXG4gICAgICAvLyBGbGFyZUpTLXNwZWNpZmljIG1hcmtlcnNcbiAgICAgIGNvbnN0IGhhc0ZsYXJlSlNNYXJrZXJzID1cbiAgICAgICAgdHguX2ZsYXJlSlNSZWFkeSA9PT0gdHJ1ZSB8fFxuICAgICAgICB0eC5fdHhUeXBlID09PSBJTVBPUlRfVFlQRSB8fFxuICAgICAgICB0eC5fY2hhaW5UeXBlID09PSBQX0NIQUlOX0ZVTEwgfHxcbiAgICAgICAgdHguX3B2bUNvbXBhdGlibGUgPT09IHRydWU7XG5cbiAgICAgIC8vIEVuaGFuY2VkIHZhbGlkYXRpb24gZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgcmV0dXJuIEJvb2xlYW4oaGFzSW1wb3J0U3RydWN0dXJlIHx8IGhhc0ZsYXJlSlNNYXJrZXJzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgdmVyaWZpY2F0aW9uIGZhaWxzLCBhc3N1bWUgaW52YWxpZCB0cmFuc2FjdGlvblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh1bnNpZ25lZFR4OiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEltcG9ydEluUFR4QnVpbGRlci52ZXJpZnlUeFR5cGUodW5zaWduZWRUeCk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgcHZtLm5ld0ltcG9ydFR4XG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gaWYgdHggaGFzIGNyZWRlbnRpYWxzLCB0eCBzaG91bGRuJ3QgY2hhbmdlXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaGFzQ3JlZGVudGlhbHMpIHJldHVybjtcblxuICAgIGlmICh0aGlzLl91dHhvcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIGFyZSByZXF1aXJlZCBmb3IgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gQ29udmVydCBvdXIgVVRYT3MgdG8gRmxhcmVKUyBmb3JtYXRcbiAgICAgIGNvbnN0IGZsYXJlVXR4b3MgPSB0aGlzLl91dHhvcy5tYXAoKHV0eG8pID0+ICh7XG4gICAgICAgIHR4SUQ6IHV0eG8udHhpZCxcbiAgICAgICAgb3V0cHV0SW5kZXg6IHBhcnNlSW50KHV0eG8ub3V0cHV0aWR4LCAxMCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogKCkgPT4gQmlnSW50KHV0eG8uYW1vdW50KSxcbiAgICAgICAgICBhc3NldElEOiBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSxcbiAgICAgICAgICBhZGRyZXNzZXM6IHV0eG8uYWRkcmVzc2VzLFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBHZXQgc291cmNlIGNoYWluIElEICh0eXBpY2FsbHkgQy1jaGFpbiBmb3IgUC1jaGFpbiBpbXBvcnRzKVxuICAgICAgY29uc3Qgc291cmNlQ2hhaW5JZCA9IHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA/IHRoaXMuX2V4dGVybmFsQ2hhaW5JZC50b1N0cmluZyhIRVhfRU5DT0RJTkcpIDogQ19DSEFJTjtcblxuICAgICAgLy8gUHJlcGFyZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKFAtY2hhaW4gYWRkcmVzc2VzKVxuICAgICAgY29uc3QgdG9BZGRyZXNzZXMgPSB0aGlzLnRyYW5zYWN0aW9uLl90by5tYXAoKGFkZHIpID0+IG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKGFkZHIsIEhFWF9FTkNPRElORykpKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGlucHV0IGFtb3VudFxuICAgICAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IHRoaXMuY2FsY3VsYXRlVG90YWxBbW91bnQoZmxhcmVVdHhvcyk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBmZWUgKFAtY2hhaW4gdXNlcyBmaXhlZCBmZWVzKVxuICAgICAgY29uc3QgZmVlID0gQmlnSW50KHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfHwgREVGQVVMVF9CQVNFX0ZFRSk7IC8vIERlZmF1bHQgMU0gbmFub0ZMUlxuXG4gICAgICAvLyBDYWxjdWxhdGUgb3V0cHV0IGFtb3VudFxuICAgICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdG90YWxJbnB1dEFtb3VudCAtIGZlZTtcbiAgICAgIGlmIChvdXRwdXRBbW91bnQgPD0gMG4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW5zdWZmaWNpZW50IGZ1bmRzIGZvciBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgICAgfVxuXG4gICAgICAvLyBGbGFyZUpTIHB2bS5uZXdJbXBvcnRUeCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gQ3JlYXRlcyBhIGNvbXByZWhlbnNpdmUgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdHJ1Y3R1cmVkIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uIGZyb20gQy1jaGFpbiB0byBQLWNoYWluXG4gICAgICBjb25zdCBlbmhhbmNlZEltcG9ydFR4ID0ge1xuICAgICAgICB0eXBlOiAnUGxhdGZvcm1WTS5JbXBvcnRUeCcsXG4gICAgICAgIG5ldHdvcmtJRDogdGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lELFxuICAgICAgICBibG9ja2NoYWluSUQ6IHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCxcbiAgICAgICAgc291cmNlQ2hhaW46IHNvdXJjZUNoYWluSWQsXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgaW1wb3J0ZWQgaW5wdXRzIHN0cnVjdHVyZSByZWFkeSBmb3IgRmxhcmVKUyBwdm0ubmV3SW1wb3J0VHhcbiAgICAgICAgaW1wb3J0ZWRJbnB1dHM6IGZsYXJlVXR4b3MubWFwKCh1dHhvKSA9PiAoe1xuICAgICAgICAgIHR4SUQ6IHV0eG8udHhJRCxcbiAgICAgICAgICBvdXRwdXRJbmRleDogdXR4by5vdXRwdXRJbmRleCxcbiAgICAgICAgICBhc3NldElEOiB1dHhvLm91dHB1dC5hc3NldElELFxuICAgICAgICAgIGFtb3VudDogdXR4by5vdXRwdXQuYW1vdW50KCksXG4gICAgICAgICAgYWRkcmVzc2VzOiB1dHhvLm91dHB1dC5hZGRyZXNzZXMsXG4gICAgICAgICAgLy8gRmxhcmVKUyBjb21wYXRpYmlsaXR5IG1hcmtlcnNcbiAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICAgIF9wdm1Db21wYXRpYmxlOiB0cnVlLFxuICAgICAgICAgIF9zb3VyY2VDaGFpbjogc291cmNlQ2hhaW5JZCxcbiAgICAgICAgfSkpLFxuXG4gICAgICAgIC8vIEVuaGFuY2VkIG91dHB1dHMgc3RydWN0dXJlIGZvciBQLWNoYWluIGltcG9ydHNcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzc2V0SUQ6IHRoaXMuZ2V0QXNzZXRJZCgpLFxuICAgICAgICAgICAgYW1vdW50OiBvdXRwdXRBbW91bnQsXG4gICAgICAgICAgICBhZGRyZXNzZXM6IHRvQWRkcmVzc2VzLFxuICAgICAgICAgICAgdGhyZXNob2xkOiB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQsXG4gICAgICAgICAgICBsb2NrdGltZTogdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUsXG4gICAgICAgICAgICAvLyBGbGFyZUpTIGltcG9ydCBvdXRwdXQgbWFya2Vyc1xuICAgICAgICAgICAgX2Rlc3RpbmF0aW9uQ2hhaW46IFBfQ0hBSU5fRlVMTCxcbiAgICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcblxuICAgICAgICAvLyBFbmhhbmNlZCBmZWUgc3RydWN0dXJlIGZvciBQLWNoYWluIG9wZXJhdGlvbnNcbiAgICAgICAgZmVlOiBmZWUsXG5cbiAgICAgICAgLy8gQ3JlZGVudGlhbCBwbGFjZWhvbGRlcnMgcmVhZHkgZm9yIEZsYXJlSlMgaW50ZWdyYXRpb25cbiAgICAgICAgY3JlZGVudGlhbHM6IGZsYXJlVXR4b3MubWFwKCgpID0+ICh7XG4gICAgICAgICAgc2lnbmF0dXJlczogW10sIC8vIFdpbGwgYmUgcG9wdWxhdGVkIGJ5IEZsYXJlSlMgc2lnbmluZ1xuICAgICAgICAgIF9jcmVkZW50aWFsVHlwZTogJ3NlY3AyNTZrMWZ4LkNyZWRlbnRpYWwnLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgIH0pKSxcblxuICAgICAgICAvLyBUcmFuc2FjdGlvbiBtZXRhZGF0YVxuICAgICAgICBtZW1vOiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKGVuaGFuY2VkSW1wb3J0VHgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBGYWlsZWQgdG8gYnVpbGQgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb246ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0b3RhbCBhbW91bnQgZnJvbSBVVFhPc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVUb3RhbEFtb3VudCh1dHhvczogQXJyYXk8eyBvdXRwdXQ6IHsgYW1vdW50OiAoKSA9PiBiaWdpbnQgfSB9Pik6IGJpZ2ludCB7XG4gICAgcmV0dXJuIHV0eG9zLnJlZHVjZSgodG90YWwsIHV0eG8pID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudCA9IHR5cGVvZiB1dHhvLm91dHB1dC5hbW91bnQgPT09ICdmdW5jdGlvbicgPyB1dHhvLm91dHB1dC5hbW91bnQoKSA6IEJpZ0ludCh1dHhvLm91dHB1dC5hbW91bnQgfHwgMCk7XG4gICAgICByZXR1cm4gdG90YWwgKyBhbW91bnQ7XG4gICAgfSwgMG4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBpbnB1dHMgYW5kIG91dHB1dHMgZm9yIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7YmlnaW50fSB0b3RhbCAtIFRvdGFsIGFtb3VudCB0byBpbXBvcnRcbiAgICogQHJldHVybnMge09iamVjdH0gLSBJbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFsc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm8gVVRYT3MgYXZhaWxhYmxlIGZvciBQLWNoYWluIGltcG9ydCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IFRyYW5zZmVyYWJsZU91dHB1dFtdID0gW107XG4gICAgY29uc3QgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSA9IFtdO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRvdGFsIGlucHV0IGFtb3VudFxuICAgIGxldCB0b3RhbElucHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcblxuICAgIC8vIFByb2Nlc3MgZWFjaCBVVFhPIHRvIGNyZWF0ZSBpbnB1dHNcbiAgICB0aGlzLl91dHhvcy5mb3JFYWNoKCh1dHhvOiBEZWNvZGVkVXR4b09iaikgPT4ge1xuICAgICAgLy8gVVRYTyB0byBUcmFuc2ZlcmFibGVJbnB1dCBjb252ZXJzaW9uIGZvciBQLWNoYWluXG4gICAgICAvLyBUaGlzIGNyZWF0ZXMgYSBzdHJ1Y3R1cmVkIGlucHV0IGNvbXBhdGlibGUgd2l0aCBGbGFyZUpTIHB2bSBwYXR0ZXJuc1xuXG4gICAgICBjb25zdCBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKHV0eG8uYW1vdW50KTtcbiAgICAgIHRvdGFsSW5wdXRBbW91bnQgPSB0b3RhbElucHV0QW1vdW50LnBsdXMoYW1vdW50KTtcblxuICAgICAgLy8gVHJhbnNmZXJhYmxlSW5wdXQgZm9yIFAtY2hhaW4gd2l0aCBwcm9wZXIgc3RydWN0dXJlXG4gICAgICAvLyBUaGlzIHByb3ZpZGVzIGEgc3RydWN0dXJlZCBpbnB1dCByZWFkeSBmb3IgRmxhcmVKUyBpbnRlZ3JhdGlvblxuICAgICAgY29uc3QgZW5oYW5jZWRUcmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogdXR4by50eGlkLFxuICAgICAgICBvdXRwdXRJbmRleDogcGFyc2VJbnQodXR4by5vdXRwdXRpZHgsIDEwKSxcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgYW1vdW50OiBCaWdJbnQodXR4by5hbW91bnQpLFxuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzOiB1dHhvLmFkZHJlc3Nlcy5tYXAoKF8sIGluZGV4KSA9PiBpbmRleCksXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgICAvLyBGbGFyZUpTIFAtY2hhaW4gaW5wdXQgbWFya2Vyc1xuICAgICAgICAgIF9pbnB1dFR5cGU6ICdzZWNwMjU2azFmeC5UcmFuc2ZlcklucHV0JyxcbiAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICAgIF9wdm1Db21wYXRpYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAvLyBFbmhhbmNlZCBtZXRhZGF0YSBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICAgIF9zb3VyY2VDaGFpbjogQ19DSEFJTl9GVUxMLFxuICAgICAgICBfZGVzdGluYXRpb25DaGFpbjogUF9DSEFJTl9GVUxMLFxuICAgICAgfTtcblxuICAgICAgLy8gU3RvcmUgdGhlIGlucHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIGlucHV0cy5wdXNoKGVuaGFuY2VkVHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWRlbnRpYWwgZm9yIFAtY2hhaW4gd2l0aCBwcm9wZXIgc2lnbmF0dXJlIHN0cnVjdHVyZVxuICAgICAgY29uc3QgY3JlZGVudGlhbCA9IHtcbiAgICAgICAgc2lnbmF0dXJlczogQXJyYXkuZnJvbSh7IGxlbmd0aDogdXR4by50aHJlc2hvbGQgfSwgKCkgPT4gQnVmZmVyLmFsbG9jKFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSksIC8vIFBsYWNlaG9sZGVyIHNpZ25hdHVyZXNcbiAgICAgICAgYWRkcmVzc0luZGljZXM6IHV0eG8uYWRkcmVzc2VzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KSxcbiAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgIF9zaWduYXR1cmVDb3VudDogdXR4by50aHJlc2hvbGQsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgZW5oYW5jZWQgY3JlZGVudGlhbCAodHlwZSBhc3NlcnRpb24gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgICBjcmVkZW50aWFscy5wdXNoKGNyZWRlbnRpYWwgYXMgdW5rbm93biBhcyBDcmVkZW50aWFsKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSBmZWVcbiAgICBjb25zdCBmZWUgPSBuZXcgQmlnTnVtYmVyKHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfHwgREVGQVVMVF9CQVNFX0ZFRSk7IC8vIERlZmF1bHQgMU0gbmFub0ZMUlxuXG4gICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIFAtY2hhaW5cbiAgICBjb25zdCBjaGFuZ2VBbW91bnQgPSB0b3RhbElucHV0QW1vdW50Lm1pbnVzKGZlZSk7XG4gICAgaWYgKGNoYW5nZUFtb3VudC5ndCgwKSkge1xuICAgICAgLy8gVHJhbnNmZXJhYmxlT3V0cHV0IGZvciBQLWNoYWluIHdpdGggcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgY29uc3QgZW5oYW5jZWRUcmFuc2ZlcmFibGVPdXRwdXQgPSB7XG4gICAgICAgIGFzc2V0SUQ6IHRoaXMuZ2V0QXNzZXRJZCgpLFxuICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IEJpZ0ludChjaGFuZ2VBbW91bnQudG9TdHJpbmcoKSksXG4gICAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl90by5tYXAoKGFkZHIpID0+IEJ1ZmZlci5mcm9tKGFkZHIsIEhFWF9FTkNPRElORykpLFxuICAgICAgICAgIHRocmVzaG9sZDogdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkLFxuICAgICAgICAgIGxvY2t0aW1lOiB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSxcbiAgICAgICAgICAvLyBGbGFyZUpTIFAtY2hhaW4gb3V0cHV0IG1hcmtlcnNcbiAgICAgICAgICBfb3V0cHV0VHlwZTogJ3NlY3AyNTZrMWZ4LlRyYW5zZmVyT3V0cHV0JyxcbiAgICAgICAgICBfZmxhcmVKU1JlYWR5OiB0cnVlLFxuICAgICAgICAgIF9wdm1Db21wYXRpYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gU3RvcmUgdGhlIG91dHB1dCAodHlwZSBhc3NlcnRpb24gZm9yIGNvbXBhdGliaWxpdHkpXG4gICAgICBvdXRwdXRzLnB1c2goZW5oYW5jZWRUcmFuc2ZlcmFibGVPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgICAgY3JlZGVudGlhbHMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgVVRYT3MgdG8gYmUgdXNlZCBhcyBpbnB1dHMgZm9yIHRoZSBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0RlY29kZWRVdHhvT2JqW119IHV0eG9zIC0gVVRYT3MgZnJvbSBDLWNoYWluIHRvIGltcG9ydCB0byBQLWNoYWluXG4gICAqL1xuICBhZGRVdHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh1dHhvcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1VUWE9zIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICB0aGlzLl91dHhvcyA9IFsuLi50aGlzLl91dHhvcywgLi4udXR4b3NdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgc291cmNlIGNoYWluIGZvciB0aGUgaW1wb3J0ICh0eXBpY2FsbHkgQy1jaGFpbilcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNoYWluSWQgLSBTb3VyY2UgY2hhaW4gSURcbiAgICovXG4gIHNvdXJjZUNoYWluKGNoYWluSWQ6IHN0cmluZyk6IHRoaXMge1xuICAgIC8vIFNvdXJjZSBjaGFpbiBJRCB2YWxpZGF0aW9uIGFuZCBzZXR0aW5nXG4gICAgLy8gVGhpcyBwcm92aWRlcyBiYXNpYyB2YWxpZGF0aW9uIHdoaWxlIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIGZvcm1hdHNcblxuICAgIGlmICghY2hhaW5JZCB8fCB0eXBlb2YgY2hhaW5JZCAhPT0gU1RSSU5HX1RZUEUpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NoYWluIElEIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gQmFzaWMgdmFsaWRhdGlvbiAtIGp1c3QgZW5zdXJlIGl0J3Mgbm90IGVtcHR5IGFuZCByZWFzb25hYmxlIGxlbmd0aFxuICAgIGlmIChjaGFpbklkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0NoYWluIElEIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH1cblxuICAgIGlmIChjaGFpbklkLmxlbmd0aCA+IE1BWF9DSEFJTl9JRF9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYENoYWluIElEIHRvbyBsb25nIChtYXggJHtNQVhfQ0hBSU5fSURfTEVOR1RIfSBjaGFyYWN0ZXJzKWApO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRDaGFpbklkID0gY2hhaW5JZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gRm9yIFAtY2hhaW4gaW1wb3J0cywgc291cmNlIHNob3VsZCBub3QgYmUgUC1jaGFpbiBpdHNlbGZcbiAgICBpZiAobm9ybWFsaXplZENoYWluSWQgPT09ICdwJyB8fCBub3JtYWxpemVkQ2hhaW5JZCA9PT0gJ3AtY2hhaW4nKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdQLWNoYWluIGNhbm5vdCBiZSBzb3VyY2UgZm9yIFAtY2hhaW4gaW1wb3J0ICh1c2UgQy1jaGFpbiknKTtcbiAgICB9XG5cbiAgICAvLyBFbmhhbmNlZCBjaGFpbiBJRCBzdG9yYWdlIHdpdGggRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgLy8gQWNjZXB0IHZhcmlvdXMgZm9ybWF0cyB3aGlsZSBwcm92aWRpbmcgcmVhc29uYWJsZSB2YWxpZGF0aW9uXG4gICAgbGV0IGNoYWluQnVmZmVyOiBCdWZmZXI7XG5cbiAgICB0cnkge1xuICAgICAgLy8gVHJ5IHRvIGRldGVjdCBpZiBpdCdzIGEgaGV4IHN0cmluZyAoZXZlbiBsZW5ndGgsIHZhbGlkIGhleCBjaGFycylcbiAgICAgIGlmIChjcmVhdGVGbGV4aWJsZUhleFJlZ2V4KCkudGVzdChjaGFpbklkKSAmJiBjaGFpbklkLmxlbmd0aCAlIDIgPT09IDApIHtcbiAgICAgICAgY2hhaW5CdWZmZXIgPSBCdWZmZXIuZnJvbShjaGFpbklkLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIGFsbCBvdGhlciBmb3JtYXRzLCBzdG9yZSBhcyBVVEYtOFxuICAgICAgICBjaGFpbkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNoYWluSWQsIFVURjhfRU5DT0RJTkcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBVVEYtOCBpZiBoZXggcGFyc2luZyBmYWlsc1xuICAgICAgY2hhaW5CdWZmZXIgPSBCdWZmZXIuZnJvbShjaGFpbklkLCBVVEY4X0VOQ09ESU5HKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBjaGFpbkJ1ZmZlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgZmVlIGZvciB0aGUgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBCaWdOdW1iZXJ9IGZlZSAtIEZlZSBhbW91bnQgaW4gbmFub0ZMUlxuICAgKi9cbiAgZmVlKGZlZTogc3RyaW5nIHwgbnVtYmVyIHwgQmlnTnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgZmVlQW1vdW50ID1cbiAgICAgIHR5cGVvZiBmZWUgPT09IFNUUklOR19UWVBFIHx8IHR5cGVvZiBmZWUgPT09IE5VTUJFUl9UWVBFID8gbmV3IEJpZ051bWJlcihmZWUpIDogKGZlZSBhcyBCaWdOdW1iZXIpO1xuXG4gICAgaWYgKGZlZUFtb3VudC5sdCgwKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignRmVlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSBmZWVBbW91bnQudG9TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9ja3RpbWUgZm9yIHRoZSBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge251bWJlciB8IGJpZ2ludH0gbG9ja3RpbWUgLSBMb2NrdGltZSB2YWx1ZVxuICAgKi9cbiAgbG9ja3RpbWUobG9ja3RpbWU6IG51bWJlciB8IGJpZ2ludCk6IHRoaXMge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lID0gdHlwZW9mIGxvY2t0aW1lID09PSAnbnVtYmVyJyA/IEJpZ0ludChsb2NrdGltZSkgOiBsb2NrdGltZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhyZXNob2xkIGZvciB0aGUgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtudW1iZXJ9IHRocmVzaG9sZCAtIFNpZ25hdHVyZSB0aHJlc2hvbGRcbiAgICovXG4gIHRocmVzaG9sZCh0aHJlc2hvbGQ6IG51bWJlcik6IHRoaXMge1xuICAgIGlmICh0aHJlc2hvbGQgPCAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUaHJlc2hvbGQgbXVzdCBiZSBhdCBsZWFzdCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkID0gdGhyZXNob2xkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=
|
package/dist/src/lib/types.d.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { DecodedUtxoObj } from './iface';
|
|
2
|
-
/**
|
|
3
|
-
* Base extended transaction interface with common optional properties
|
|
4
|
-
*/
|
|
5
|
-
export interface BaseExtendedTransaction {
|
|
6
|
-
_memo?: Uint8Array;
|
|
7
|
-
_outputAmount?: string;
|
|
8
|
-
_utxos?: DecodedUtxoObj[];
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Extended transaction for staking transactions (delegator/validator)
|
|
12
|
-
*/
|
|
13
|
-
export interface StakingExtendedTransaction extends BaseExtendedTransaction {
|
|
14
|
-
_rewardAddresses: string[];
|
|
15
|
-
_nodeID?: string;
|
|
16
|
-
_startTime?: bigint;
|
|
17
|
-
_endTime?: bigint;
|
|
18
|
-
_stakeAmount?: bigint;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Extended transaction for validator transactions
|
|
22
|
-
*/
|
|
23
|
-
export interface ValidatorExtendedTransaction extends StakingExtendedTransaction {
|
|
24
|
-
_delegationFeeRate?: number;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Extended transaction for permissionless validator transactions
|
|
28
|
-
*/
|
|
29
|
-
export interface PermissionlessValidatorExtendedTransaction extends ValidatorExtendedTransaction {
|
|
30
|
-
_blsPublicKey?: string;
|
|
31
|
-
_blsSignature?: string;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Base raw transaction data structure from serialized transactions
|
|
35
|
-
*/
|
|
36
|
-
export interface BaseRawTransactionData {
|
|
37
|
-
memo?: Uint8Array | string;
|
|
38
|
-
utxos?: DecodedUtxoObj[];
|
|
39
|
-
outputAmount?: string;
|
|
40
|
-
networkID?: number;
|
|
41
|
-
blockchainID?: Buffer | string;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Raw transaction data for delegator transactions
|
|
45
|
-
*/
|
|
46
|
-
export interface DelegatorRawTransactionData extends BaseRawTransactionData {
|
|
47
|
-
nodeID: string;
|
|
48
|
-
startTime: string | number | bigint;
|
|
49
|
-
endTime: string | number | bigint;
|
|
50
|
-
stakeAmount: string | number | bigint;
|
|
51
|
-
rewardAddresses: string[];
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Raw transaction data for validator transactions
|
|
55
|
-
*/
|
|
56
|
-
export interface ValidatorRawTransactionData extends DelegatorRawTransactionData {
|
|
57
|
-
delegationFeeRate: number;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Raw transaction data for permissionless validator transactions
|
|
61
|
-
*/
|
|
62
|
-
export interface PermissionlessValidatorRawTransactionData extends ValidatorRawTransactionData {
|
|
63
|
-
blsPublicKey: string;
|
|
64
|
-
blsSignature: string;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Raw transaction data structure from serialized transactions
|
|
68
|
-
* Union type supporting all transaction types with proper type safety
|
|
69
|
-
*/
|
|
70
|
-
export type RawTransactionData = BaseRawTransactionData | DelegatorRawTransactionData | ValidatorRawTransactionData | PermissionlessValidatorRawTransactionData;
|
|
71
|
-
/**
|
|
72
|
-
* Specific transaction extension types for better type safety
|
|
73
|
-
*/
|
|
74
|
-
export type TransactionWithBaseExtensions = BaseExtendedTransaction & Record<string, unknown>;
|
|
75
|
-
export type TransactionWithStakingExtensions = StakingExtendedTransaction & Record<string, unknown>;
|
|
76
|
-
export type TransactionWithValidatorExtensions = ValidatorExtendedTransaction & Record<string, unknown>;
|
|
77
|
-
export type TransactionWithPermissionlessValidatorExtensions = PermissionlessValidatorExtendedTransaction & Record<string, unknown>;
|
|
78
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA6B,SAAQ,0BAA0B;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,0CAA2C,SAAQ,4BAA4B;IAC9F,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IAErC,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,sBAAsB;IAEzE,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAClC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACtC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,2BAA4B,SAAQ,2BAA2B;IAE9E,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,yCAA0C,SAAQ,2BAA2B;IAE5F,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,2BAA2B,GAC3B,2BAA2B,GAC3B,yCAAyC,CAAC;AAE9C;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9F,MAAM,MAAM,gCAAgC,GAAG,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACpG,MAAM,MAAM,kCAAkC,GAAG,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACxG,MAAM,MAAM,gDAAgD,GAAG,0CAA0C,GACvG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
|
package/dist/src/lib/types.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Type definitions for Flare P-chain transaction builders
|
|
3
|
-
// Replaces loose 'any' types with proper type safety
|
|
4
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwREFBMEQ7QUFDMUQscURBQXFEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVHlwZSBkZWZpbml0aW9ucyBmb3IgRmxhcmUgUC1jaGFpbiB0cmFuc2FjdGlvbiBidWlsZGVyc1xuLy8gUmVwbGFjZXMgbG9vc2UgJ2FueScgdHlwZXMgd2l0aCBwcm9wZXIgdHlwZSBzYWZldHlcblxuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuL2lmYWNlJztcblxuLyoqXG4gKiBCYXNlIGV4dGVuZGVkIHRyYW5zYWN0aW9uIGludGVyZmFjZSB3aXRoIGNvbW1vbiBvcHRpb25hbCBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24ge1xuICBfbWVtbz86IFVpbnQ4QXJyYXk7XG4gIF9vdXRwdXRBbW91bnQ/OiBzdHJpbmc7XG4gIF91dHhvcz86IERlY29kZWRVdHhvT2JqW107XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgdHJhbnNhY3Rpb24gZm9yIHN0YWtpbmcgdHJhbnNhY3Rpb25zIChkZWxlZ2F0b3IvdmFsaWRhdG9yKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWtpbmdFeHRlbmRlZFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24ge1xuICBfcmV3YXJkQWRkcmVzc2VzOiBzdHJpbmdbXTsgLy8gUmVxdWlyZWQgZm9yIGFsbCBzdGFraW5nIHRyYW5zYWN0aW9uc1xuICBfbm9kZUlEPzogc3RyaW5nO1xuICBfc3RhcnRUaW1lPzogYmlnaW50O1xuICBfZW5kVGltZT86IGJpZ2ludDtcbiAgX3N0YWtlQW1vdW50PzogYmlnaW50O1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIHRyYW5zYWN0aW9uIGZvciB2YWxpZGF0b3IgdHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yRXh0ZW5kZWRUcmFuc2FjdGlvbiBleHRlbmRzIFN0YWtpbmdFeHRlbmRlZFRyYW5zYWN0aW9uIHtcbiAgX2RlbGVnYXRpb25GZWVSYXRlPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIHRyYW5zYWN0aW9uIGZvciBwZXJtaXNzaW9ubGVzcyB2YWxpZGF0b3IgdHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JFeHRlbmRlZFRyYW5zYWN0aW9uIGV4dGVuZHMgVmFsaWRhdG9yRXh0ZW5kZWRUcmFuc2FjdGlvbiB7XG4gIF9ibHNQdWJsaWNLZXk/OiBzdHJpbmc7XG4gIF9ibHNTaWduYXR1cmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQmFzZSByYXcgdHJhbnNhY3Rpb24gZGF0YSBzdHJ1Y3R1cmUgZnJvbSBzZXJpYWxpemVkIHRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSYXdUcmFuc2FjdGlvbkRhdGEge1xuICAvLyBPcHRpb25hbCBmaWVsZHMgY29tbW9uIHRvIGFsbCB0cmFuc2FjdGlvbiB0eXBlc1xuICBtZW1vPzogVWludDhBcnJheSB8IHN0cmluZztcbiAgdXR4b3M/OiBEZWNvZGVkVXR4b09ialtdO1xuICBvdXRwdXRBbW91bnQ/OiBzdHJpbmc7XG4gIG5ldHdvcmtJRD86IG51bWJlcjtcbiAgYmxvY2tjaGFpbklEPzogQnVmZmVyIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJhdyB0cmFuc2FjdGlvbiBkYXRhIGZvciBkZWxlZ2F0b3IgdHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZWdhdG9yUmF3VHJhbnNhY3Rpb25EYXRhIGV4dGVuZHMgQmFzZVJhd1RyYW5zYWN0aW9uRGF0YSB7XG4gIC8vIFJlcXVpcmVkIGZpZWxkcyBmb3IgZGVsZWdhdG9yIHRyYW5zYWN0aW9uc1xuICBub2RlSUQ6IHN0cmluZztcbiAgc3RhcnRUaW1lOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIGVuZFRpbWU6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgc3Rha2VBbW91bnQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludDtcbiAgcmV3YXJkQWRkcmVzc2VzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBSYXcgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdmFsaWRhdG9yIHRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvclJhd1RyYW5zYWN0aW9uRGF0YSBleHRlbmRzIERlbGVnYXRvclJhd1RyYW5zYWN0aW9uRGF0YSB7XG4gIC8vIEFkZGl0aW9uYWwgcmVxdWlyZWQgZmllbGQgZm9yIHZhbGlkYXRvciB0cmFuc2FjdGlvbnNcbiAgZGVsZWdhdGlvbkZlZVJhdGU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSYXcgdHJhbnNhY3Rpb24gZGF0YSBmb3IgcGVybWlzc2lvbmxlc3MgdmFsaWRhdG9yIHRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yUmF3VHJhbnNhY3Rpb25EYXRhIGV4dGVuZHMgVmFsaWRhdG9yUmF3VHJhbnNhY3Rpb25EYXRhIHtcbiAgLy8gQWRkaXRpb25hbCByZXF1aXJlZCBmaWVsZHMgZm9yIHBlcm1pc3Npb25sZXNzIHZhbGlkYXRvciB0cmFuc2FjdGlvbnNcbiAgYmxzUHVibGljS2V5OiBzdHJpbmc7XG4gIGJsc1NpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJhdyB0cmFuc2FjdGlvbiBkYXRhIHN0cnVjdHVyZSBmcm9tIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb25zXG4gKiBVbmlvbiB0eXBlIHN1cHBvcnRpbmcgYWxsIHRyYW5zYWN0aW9uIHR5cGVzIHdpdGggcHJvcGVyIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIFJhd1RyYW5zYWN0aW9uRGF0YSA9XG4gIHwgQmFzZVJhd1RyYW5zYWN0aW9uRGF0YVxuICB8IERlbGVnYXRvclJhd1RyYW5zYWN0aW9uRGF0YVxuICB8IFZhbGlkYXRvclJhd1RyYW5zYWN0aW9uRGF0YVxuICB8IFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yUmF3VHJhbnNhY3Rpb25EYXRhO1xuXG4vKipcbiAqIFNwZWNpZmljIHRyYW5zYWN0aW9uIGV4dGVuc2lvbiB0eXBlcyBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG4gKi9cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uV2l0aEJhc2VFeHRlbnNpb25zID0gQmFzZUV4dGVuZGVkVHJhbnNhY3Rpb24gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uV2l0aFN0YWtpbmdFeHRlbnNpb25zID0gU3Rha2luZ0V4dGVuZGVkVHJhbnNhY3Rpb24gJiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uV2l0aFZhbGlkYXRvckV4dGVuc2lvbnMgPSBWYWxpZGF0b3JFeHRlbmRlZFRyYW5zYWN0aW9uICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbldpdGhQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvckV4dGVuc2lvbnMgPSBQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvckV4dGVuZGVkVHJhbnNhY3Rpb24gJlxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiJdfQ==
|