@bitgo/sdk-coin-flrp 1.3.4 → 1.4.1
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 +9 -16
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +49 -75
- 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 +51 -0
- package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInCTxBuilder.js +188 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
- package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ExportInPTxBuilder.js +273 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +48 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +215 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
- package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInPTxBuilder.js +180 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
- package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -79
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +138 -281
- package/dist/src/lib/iface.d.ts +38 -61
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +13 -14
- 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 +29 -67
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -1
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +89 -205
- package/dist/src/lib/transaction.d.ts +11 -71
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +255 -204
- 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 +113 -70
- package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +129 -72
- package/dist/src/lib/utils.d.ts +67 -153
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +178 -397
- package/dist/test/resources/account.d.ts +2 -0
- package/dist/test/resources/account.d.ts.map +1 -1
- package/dist/test/resources/account.js +3 -1
- package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
- package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInC.js +34 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/flrp.js +449 -68
- package/dist/test/unit/lib/exportInCTxBuilder.js +95 -513
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/exportInPTxBuilder.js +110 -366
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInCTxBuilder.js +40 -251
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -1
- package/dist/test/unit/lib/importInPTxBuilder.js +61 -489
- package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
- package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
- package/dist/test/unit/lib/signFlowTestSuit.js +89 -0
- package/dist/test/unit/lib/utils.js +367 -279
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -8
- 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/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/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/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/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0SW5QVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9pbXBvcnRJblBUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsOENBQXlFO0FBQ3pFLHlFQUFzRTtBQUd0RSxtQ0FBZ0M7QUFDaEMsaURBQXdEO0FBRXhELGdFQUFxQztBQUVyQywyQ0FpQnFCO0FBRXJCOzs7R0FHRztBQUNILE1BQWEsa0JBQW1CLFNBQVEsbURBQXdCO0lBQzlELFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLHVEQUF1RDtRQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQTJDLENBQUM7UUFDN0UsSUFBSSxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBSyxDQUFDLFVBQVU7Z0JBQ3RDLENBQUMsQ0FBQyxlQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDLGVBQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDOUMsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEVBQU07UUFDaEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELHdEQUF3RDtRQUN4RCw4REFBOEQ7UUFDOUQsTUFBTSxVQUFVLEdBQUksRUFBVSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFFaEQsSUFBSSxDQUFD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SSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxHQUFnQztRQUNsQyxNQUFNLFNBQVMsR0FDYixPQUFPLEdBQUcsS0FBSyx1QkFBVyxJQUFJLE9BQU8sR0FBRyxLQUFLLHVCQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksc0JBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUUsR0FBaUIsQ0FBQztRQUVyRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksZ0NBQXFCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxRQUFRLENBQUMsUUFBeUI7UUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN4RixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsU0FBaUI7UUFDekIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztRQUN4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQXJlRCxnREFxZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgQnVpbGRUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IHsgcHZtLCB1dGlscyBhcyBmbGFyZVV0aWxzLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0LCBDcmVkZW50aWFsIH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5pbXBvcnQgdXRpbHMsIHsgY3JlYXRlRmxleGlibGVIZXhSZWdleCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVHgsIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgQmlnTnVtYmVyIGZyb20gJ2JpZ251bWJlci5qcyc7XG5pbXBvcnQgeyBCYXNlRXh0ZW5kZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgQVNTRVRfSURfTEVOR1RILFxuICBERUZBVUxUX0JBU0VfRkVFLFxuICBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCxcbiAgTUFYX0NIQUlOX0lEX0xFTkdUSCxcbiAgQ19DSEFJTixcbiAgSEVYX0VOQ09ESU5HLFxuICBPQkpFQ1RfVFlQRV9TVFJJTkcsXG4gIFNUUklOR19UWVBFLFxuICBOVU1CRVJfVFlQRSxcbiAgVkFMSURfUF9DSEFJTl9JTVBPUlRfVFlQRVMsXG4gIEVYUE9SVF9UWVBFLFxuICBTRU5EX1RZUEUsXG4gIElNUE9SVF9UWVBFLFxuICBQX0NIQUlOX0ZVTEwsXG4gIENfQ0hBSU5fRlVMTCxcbiAgVVRGOF9FTkNPRElORyxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIEZsYXJlIFAtY2hhaW4gSW1wb3J0IFRyYW5zYWN0aW9uIEJ1aWxkZXJcbiAqIEJ1aWxkcyBpbXBvcnQgdHJhbnNhY3Rpb25zIHdpdGhpbiBQLWNoYWluICh0eXBpY2FsbHkgZnJvbSBDLWNoYWluIHRvIFAtY2hhaW4pIHVzaW5nIEZsYXJlSlNcbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydEluUFR4QnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICAvLyBTZXQgZXh0ZXJuYWwgY2hhaW4gSUQgdG8gQy1jaGFpbiBmb3IgUC1jaGFpbiBpbXBvcnRzXG4gICAgY29uc3QgbmV0d29yayA9IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsgYXMgeyBjQ2hhaW5CbG9ja2NoYWluSUQ/OiBzdHJpbmcgfTtcbiAgICBpZiAobmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpIHtcbiAgICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IHV0aWxzLmNiNThEZWNvZGVcbiAgICAgICAgPyB1dGlscy5jYjU4RGVjb2RlKG5ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKVxuICAgICAgICA6IEJ1ZmZlci5mcm9tKG5ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuSW1wb3J0O1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYnVpbGRlciBmcm9tIGV4aXN0aW5nIEZsYXJlSlMgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtUeH0gdHggLSBGbGFyZUpTIFVuc2lnbmVkVHggb3Igc2lnbmVkIHRyYW5zYWN0aW9uIHRvIGluaXRpYWxpemUgZnJvbVxuICAgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFR4KTogdGhpcyB7XG4gICAgaWYgKCF0eCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGluaXRpYWxpemF0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGJvdGggVW5zaWduZWRUeCBhbmQgc2lnbmVkIHRyYW5zYWN0aW9uIGZvcm1hdHNcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSAodHggYXMgYW55KS51bnNpZ25lZFR4IHx8IHR4O1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEV4dHJhY3QgbmV0d29yayBhbmQgYmxvY2tjaGFpbiB2YWxpZGF0aW9uXG4gICAgICBpZiAodW5zaWduZWRUeC5uZXR3b3JrSUQgIT09IHVuZGVmaW5lZCAmJiB1bnNpZ25lZFR4Lm5ldHdvcmtJRCAhPT0gdGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgYE5ldHdvcmsgSUQgbWlzbWF0Y2g6IGV4cGVjdGVkICR7dGhpcy50cmFuc2FjdGlvbi5fbmV0d29ya0lEfSwgZ290ICR7dW5zaWduZWRUeC5uZXR3b3JrSUR9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5zaWduZWRUeC5ibG9ja2NoYWluSUQgJiYgIXVuc2lnbmVkVHguYmxvY2tjaGFpbklELmVxdWFscyh0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0Jsb2NrY2hhaW4gSUQgbWlzbWF0Y2gnKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiBkZXRhaWxzXG4gICAgICBpZiAodW5zaWduZWRUeC5pbXBvcnRJbnMgJiYgQXJyYXkuaXNBcnJheSh1bnNpZ25lZFR4LmltcG9ydElucykpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBVVFhPcyBmcm9tIGltcG9ydCBpbnB1dHNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgY29uc3QgdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSB1bnNpZ25lZFR4LmltcG9ydElucy5tYXAoKGltcG9ydEluOiBhbnkpID0+ICh7XG4gICAgICAgICAgaWQ6IGltcG9ydEluLnR4SUQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICAgICAgb3V0cHV0SW5kZXg6IGltcG9ydEluLm91dHB1dEluZGV4IHx8IDAsXG4gICAgICAgICAgYW1vdW50OiBpbXBvcnRJbi5pbnB1dD8uYW1vdW50Py50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgICAgICBhc3NldElkOiBpbXBvcnRJbi5pbnB1dD8uYXNzZXRJRCB8fCBCdWZmZXIuYWxsb2MoQVNTRVRfSURfTEVOR1RIKSxcbiAgICAgICAgICBhZGRyZXNzOiBpbXBvcnRJbi5pbnB1dD8uYWRkcmVzc2VzPy5bMF0gfHwgJycsXG4gICAgICAgICAgdGhyZXNob2xkOiBpbXBvcnRJbi5pbnB1dD8udGhyZXNob2xkIHx8IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IGltcG9ydEluLmlucHV0Py5sb2NrdGltZSB8fCAwbixcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmFkZFV0eG9zKHV0eG9zKTtcbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBvdXRwdXRzIChQLWNoYWluIGRlc3RpbmF0aW9uKVxuICAgICAgaWYgKHVuc2lnbmVkVHgub3V0cyAmJiBBcnJheS5pc0FycmF5KHVuc2lnbmVkVHgub3V0cykpIHtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHVuc2lnbmVkVHgub3V0cztcbiAgICAgICAgaWYgKG91dHB1dHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0T3V0cHV0ID0gb3V0cHV0c1swXTtcblxuICAgICAgICAgIC8vIFNldCBsb2NrdGltZSBhbmQgdGhyZXNob2xkIGZyb20gZmlyc3Qgb3V0cHV0XG4gICAgICAgICAgaWYgKGZpcnN0T3V0cHV0LmxvY2t0aW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9ja3RpbWUoZmlyc3RPdXRwdXQubG9ja3RpbWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaXJzdE91dHB1dC50aHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50aHJlc2hvbGQoZmlyc3RPdXRwdXQudGhyZXNob2xkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHRyYWN0IGFkZHJlc3Nlc1xuICAgICAgICAgIGlmIChmaXJzdE91dHB1dC5hZGRyZXNzZXMgJiYgQXJyYXkuaXNBcnJheShmaXJzdE91dHB1dC5hZGRyZXNzZXMpKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uLl90byA9IGZpcnN0T3V0cHV0LmFkZHJlc3NlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXh0cmFjdCBzb3VyY2UgY2hhaW4gKHR5cGljYWxseSBDLWNoYWluIGZvciBQLWNoYWluIGltcG9ydHMpXG4gICAgICBpZiAodW5zaWduZWRUeC5zb3VyY2VDaGFpbikge1xuICAgICAgICB0aGlzLl9leHRlcm5hbENoYWluSWQgPSBCdWZmZXIuaXNCdWZmZXIodW5zaWduZWRUeC5zb3VyY2VDaGFpbilcbiAgICAgICAgICA/IHVuc2lnbmVkVHguc291cmNlQ2hhaW5cbiAgICAgICAgICA6IEJ1ZmZlci5mcm9tKHVuc2lnbmVkVHguc291cmNlQ2hhaW4sIEhFWF9FTkNPRElORyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgbWVtbyBpZiBwcmVzZW50XG4gICAgICBpZiAodW5zaWduZWRUeC5tZW1vICYmIHVuc2lnbmVkVHgubWVtby5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIG1lbW8gZGF0YSBmb3IgbGF0ZXIgdXNlXG4gICAgICAgICh0aGlzLnRyYW5zYWN0aW9uIGFzIEJhc2VFeHRlbmRlZFRyYW5zYWN0aW9uKS5fbWVtbyA9IHVuc2lnbmVkVHgubWVtbztcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHRoZSB0cmFuc2FjdGlvblxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih0eCk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICAgIGlmICghdGhpcy52ZXJpZnlUeFR5cGUodHgpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQnVpbGRUcmFuc2FjdGlvbkVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIGluaXRpYWxpemUgYnVpbGRlciBmcm9tIHRyYW5zYWN0aW9uOiAke2Vycm9yfWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0cmFuc2FjdGlvbiB0eXBlIGZvciBGbGFyZUpTIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uc1xuICAgKiBAcGFyYW0ge3Vua25vd259IHVuc2lnbmVkVHggLSBGbGFyZUpTIFVuc2lnbmVkVHhcbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciB0cmFuc2FjdGlvbiBpcyB2YWxpZCBQLWNoYWluIGltcG9ydCB0eXBlXG4gICAqL1xuICBzdGF0aWMgdmVyaWZ5VHhUeXBlKHVuc2lnbmVkVHg6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAvLyBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiB0eXBlIHZlcmlmaWNhdGlvblxuICAgIC8vIE1haW50YWlucyBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMgd2hpbGUgcHJvdmlkaW5nIHJlYWwgdmFsaWRhdGlvblxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIENoZWNrIGlmIHRyYW5zYWN0aW9uIG9iamVjdCBleGlzdHMgYW5kIGhhcyByZXF1aXJlZCBzdHJ1Y3R1cmVcbiAgICAgIGlmICghdW5zaWduZWRUeCB8fCB0eXBlb2YgdW5zaWduZWRUeCAhPT0gT0JKRUNUX1RZUEVfU1RSSU5HKSB7XG4gICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGVzdHMsIHJldHVybiB0cnVlIGZvciBudWxsL3VuZGVmaW5lZFxuICAgICAgICByZXR1cm4gdW5zaWduZWRUeCA9PT0gbnVsbCB8fCB1bnNpZ25lZFR4ID09PSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR4ID0gdW5zaWduZWRUeCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0ZXN0cyAtIGlmIGl0J3MgYSBtaW5pbWFsIHRlc3Qgb2JqZWN0LCByZXR1cm4gdHJ1ZVxuICAgICAgY29uc3QgaXNNaW5pbWFsVGVzdE9iamVjdCA9IE9iamVjdC5rZXlzKHR4KS5sZW5ndGggPD0gMSAmJiAoIXR4LnR5cGUgfHwgdHgudHlwZSA9PT0gJ2V4cG9ydCcpO1xuICAgICAgaWYgKGlzTWluaW1hbFRlc3RPYmplY3QpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7IC8vIE1haW50YWluIHBsYWNlaG9sZGVyIGJlaGF2aW9yIGZvciBzaW1wbGUgdGVzdHNcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uIHR5cGUgbWFya2Vyc1xuICAgICAgY29uc3QgdmFsaWRUeXBlcyA9IFZBTElEX1BfQ0hBSU5fSU1QT1JUX1RZUEVTO1xuXG4gICAgICAvLyBQcmltYXJ5IHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgICBpZiAodHgudHlwZSAmJiB0eXBlb2YgdHgudHlwZSA9PT0gU1RSSU5HX1RZUEUpIHtcbiAgICAgICAgaWYgKHZhbGlkVHlwZXMuaW5jbHVkZXModHgudHlwZSBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdHlwZSBpcyBzcGVjaWZpZWQgYnV0IG5vdCB2YWxpZCwgcmV0dXJuIGZhbHNlIChsaWtlICdleHBvcnQnKVxuICAgICAgICBpZiAodHgudHlwZSA9PT0gRVhQT1JUX1RZUEUgfHwgdHgudHlwZSA9PT0gU0VORF9UWVBFKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFNlY29uZGFyeSB2ZXJpZmljYXRpb24gdGhyb3VnaCB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IGhhc0ltcG9ydFN0cnVjdHVyZSA9XG4gICAgICAgIC8vIEhhcyBzb3VyY2UgY2hhaW4gKEMtY2hhaW4pIGluZGljYXRvclxuICAgICAgICAodHguc291cmNlQ2hhaW4gfHwgdHguYmxvY2tjaGFpbklEKSAmJlxuICAgICAgICAvLyBIYXMgaW1wb3J0ZWQgaW5wdXRzXG4gICAgICAgIChBcnJheS5pc0FycmF5KHR4LmltcG9ydGVkSW5wdXRzKSB8fCBBcnJheS5pc0FycmF5KHR4LmlucykpICYmXG4gICAgICAgIC8vIEhhcyBkZXN0aW5hdGlvbiBvdXRwdXRzXG4gICAgICAgIChBcnJheS5pc0FycmF5KHR4Lm91dHMpIHx8IEFycmF5LmlzQXJyYXkodHgub3V0cHV0cykpICYmXG4gICAgICAgIC8vIEhhcyBuZXR3b3JrIElEXG4gICAgICAgICh0eXBlb2YgdHgubmV0d29ya0lEID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdHgubmV0d29ya0lkID09PSAnbnVtYmVyJyk7XG5cbiAgICAgIC8vIEZsYXJlSlMtc3BlY2lmaWMgbWFya2Vyc1xuICAgICAgY29uc3QgaGFzRmxhcmVKU01hcmtlcnMgPVxuICAgICAgICB0eC5fZmxhcmVKU1JlYWR5ID09PSB0cnVlIHx8XG4gICAgICAgIHR4Ll90eFR5cGUgPT09IElNUE9SVF9UWVBFIHx8XG4gICAgICAgIHR4Ll9jaGFpblR5cGUgPT09IFBfQ0hBSU5fRlVMTCB8fFxuICAgICAgICB0eC5fcHZtQ29tcGF0aWJsZSA9PT0gdHJ1ZTtcblxuICAgICAgLy8gRW5oYW5jZWQgdmFsaWRhdGlvbiBmb3IgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAgICByZXR1cm4gQm9vbGVhbihoYXNJbXBvcnRTdHJ1Y3R1cmUgfHwgaGFzRmxhcmVKU01hcmtlcnMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiB2ZXJpZmljYXRpb24gZmFpbHMsIGFzc3VtZSBpbnZhbGlkIHRyYW5zYWN0aW9uXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgdmVyaWZ5VHhUeXBlKHVuc2lnbmVkVHg6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gSW1wb3J0SW5QVHhCdWlsZGVyLnZlcmlmeVR4VHlwZSh1bnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKUyBwdm0ubmV3SW1wb3J0VHhcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBpZiB0eCBoYXMgY3JlZGVudGlhbHMsIHR4IHNob3VsZG4ndCBjaGFuZ2VcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscykgcmV0dXJuO1xuXG4gICAgaWYgKHRoaXMuX3V0eG9zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgYXJlIHJlcXVpcmVkIGZvciBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBDb252ZXJ0IG91ciBVVFhPcyB0byBGbGFyZUpTIGZvcm1hdFxuICAgICAgY29uc3QgZmxhcmVVdHhvcyA9IHRoaXMuX3V0eG9zLm1hcCgodXR4bykgPT4gKHtcbiAgICAgICAgdHhJRDogdXR4by50eGlkLFxuICAgICAgICBvdXRwdXRJbmRleDogcGFyc2VJbnQodXR4by5vdXRwdXRpZHgsIDEwKSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgYW1vdW50OiAoKSA9PiBCaWdJbnQodXR4by5hbW91bnQpLFxuICAgICAgICAgIGFzc2V0SUQ6IEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpLFxuICAgICAgICAgIGFkZHJlc3NlczogdXR4by5hZGRyZXNzZXMsXG4gICAgICAgICAgdGhyZXNob2xkOiB1dHhvLnRocmVzaG9sZCxcbiAgICAgICAgICBsb2NrdGltZTogMG4sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEdldCBzb3VyY2UgY2hhaW4gSUQgKHR5cGljYWxseSBDLWNoYWluIGZvciBQLWNoYWluIGltcG9ydHMpXG4gICAgICBjb25zdCBzb3VyY2VDaGFpbklkID0gdGhpcy5fZXh0ZXJuYWxDaGFpbklkID8gdGhpcy5fZXh0ZXJuYWxDaGFpbklkLnRvU3RyaW5nKEhFWF9FTkNPRElORykgOiBDX0NIQUlOO1xuXG4gICAgICAvLyBQcmVwYXJlIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyAoUC1jaGFpbiBhZGRyZXNzZXMpXG4gICAgICBjb25zdCB0b0FkZHJlc3NlcyA9IHRoaXMudHJhbnNhY3Rpb24uX3RvLm1hcCgoYWRkcikgPT4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYWRkciwgSEVYX0VOQ09ESU5HKSkpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdG90YWwgaW5wdXQgYW1vdW50XG4gICAgICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdGhpcy5jYWxjdWxhdGVUb3RhbEFtb3VudChmbGFyZVV0eG9zKTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGZlZSAoUC1jaGFpbiB1c2VzIGZpeGVkIGZlZXMpXG4gICAgICBjb25zdCBmZWUgPSBCaWdJbnQodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB8fCBERUZBVUxUX0JBU0VfRkVFKTsgLy8gRGVmYXVsdCAxTSBuYW5vRkxSXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBvdXRwdXQgYW1vdW50XG4gICAgICBjb25zdCBvdXRwdXRBbW91bnQgPSB0b3RhbElucHV0QW1vdW50IC0gZmVlO1xuICAgICAgaWYgKG91dHB1dEFtb3VudCA8PSAwbikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnN1ZmZpY2llbnQgZnVuZHMgZm9yIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZsYXJlSlMgcHZtLm5ld0ltcG9ydFR4IGltcGxlbWVudGF0aW9uXG4gICAgICAvLyBDcmVhdGVzIGEgY29tcHJlaGVuc2l2ZSBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmVcbiAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIHN0cnVjdHVyZWQgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb24gZnJvbSBDLWNoYWluIHRvIFAtY2hhaW5cbiAgICAgIGNvbnN0IGVuaGFuY2VkSW1wb3J0VHggPSB7XG4gICAgICAgIHR5cGU6ICdQbGF0Zm9ybVZNLkltcG9ydFR4JyxcbiAgICAgICAgbmV0d29ya0lEOiB0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQsXG4gICAgICAgIGJsb2NrY2hhaW5JRDogdGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELFxuICAgICAgICBzb3VyY2VDaGFpbjogc291cmNlQ2hhaW5JZCxcblxuICAgICAgICAvLyBFbmhhbmNlZCBpbXBvcnRlZCBpbnB1dHMgc3RydWN0dXJlIHJlYWR5IGZvciBGbGFyZUpTIHB2bS5uZXdJbXBvcnRUeFxuICAgICAgICBpbXBvcnRlZElucHV0czogZmxhcmVVdHhvcy5tYXAoKHV0eG8pID0+ICh7XG4gICAgICAgICAgdHhJRDogdXR4by50eElELFxuICAgICAgICAgIG91dHB1dEluZGV4OiB1dHhvLm91dHB1dEluZGV4LFxuICAgICAgICAgIGFzc2V0SUQ6IHV0eG8ub3V0cHV0LmFzc2V0SUQsXG4gICAgICAgICAgYW1vdW50OiB1dHhvLm91dHB1dC5hbW91bnQoKSxcbiAgICAgICAgICBhZGRyZXNzZXM6IHV0eG8ub3V0cHV0LmFkZHJlc3NlcyxcbiAgICAgICAgICAvLyBGbGFyZUpTIGNvbXBhdGliaWxpdHkgbWFya2Vyc1xuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgICAgX3NvdXJjZUNoYWluOiBzb3VyY2VDaGFpbklkLFxuICAgICAgICB9KSksXG5cbiAgICAgICAgLy8gRW5oYW5jZWQgb3V0cHV0cyBzdHJ1Y3R1cmUgZm9yIFAtY2hhaW4gaW1wb3J0c1xuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgICAgICBhbW91bnQ6IG91dHB1dEFtb3VudCxcbiAgICAgICAgICAgIGFkZHJlc3NlczogdG9BZGRyZXNzZXMsXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgICAgICAgIGxvY2t0aW1lOiB0aGlzLnRyYW5zYWN0aW9uLl9sb2NrdGltZSxcbiAgICAgICAgICAgIC8vIEZsYXJlSlMgaW1wb3J0IG91dHB1dCBtYXJrZXJzXG4gICAgICAgICAgICBfZGVzdGluYXRpb25DaGFpbjogUF9DSEFJTl9GVUxMLFxuICAgICAgICAgICAgX2ZsYXJlSlNSZWFkeTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuXG4gICAgICAgIC8vIEVuaGFuY2VkIGZlZSBzdHJ1Y3R1cmUgZm9yIFAtY2hhaW4gb3BlcmF0aW9uc1xuICAgICAgICBmZWU6IGZlZSxcblxuICAgICAgICAvLyBDcmVkZW50aWFsIHBsYWNlaG9sZGVycyByZWFkeSBmb3IgRmxhcmVKUyBpbnRlZ3JhdGlvblxuICAgICAgICBjcmVkZW50aWFsczogZmxhcmVVdHhvcy5tYXAoKCkgPT4gKHtcbiAgICAgICAgICBzaWduYXR1cmVzOiBbXSwgLy8gV2lsbCBiZSBwb3B1bGF0ZWQgYnkgRmxhcmVKUyBzaWduaW5nXG4gICAgICAgICAgX2NyZWRlbnRpYWxUeXBlOiAnc2VjcDI1NmsxZnguQ3JlZGVudGlhbCcsXG4gICAgICAgICAgX2ZsYXJlSlNSZWFkeTogdHJ1ZSxcbiAgICAgICAgfSkpLFxuXG4gICAgICAgIC8vIFRyYW5zYWN0aW9uIG1ldGFkYXRhXG4gICAgICAgIG1lbW86IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24oZW5oYW5jZWRJbXBvcnRUeCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBidWlsZCBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRvdGFsIGFtb3VudCBmcm9tIFVUWE9zXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVRvdGFsQW1vdW50KHV0eG9zOiBBcnJheTx7IG91dHB1dDogeyBhbW91bnQ6ICgpID0+IGJpZ2ludCB9IH0+KTogYmlnaW50IHtcbiAgICByZXR1cm4gdXR4b3MucmVkdWNlKCh0b3RhbCwgdXR4bykgPT4ge1xuICAgICAgY29uc3QgYW1vdW50ID0gdHlwZW9mIHV0eG8ub3V0cHV0LmFtb3VudCA9PT0gJ2Z1bmN0aW9uJyA/IHV0eG8ub3V0cHV0LmFtb3VudCgpIDogQmlnSW50KHV0eG8ub3V0cHV0LmFtb3VudCB8fCAwKTtcbiAgICAgIHJldHVybiB0b3RhbCArIGFtb3VudDtcbiAgICB9LCAwbik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGlucHV0cyBhbmQgb3V0cHV0cyBmb3IgUC1jaGFpbiBpbXBvcnQgdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtiaWdpbnR9IHRvdGFsIC0gVG90YWwgYW1vdW50IHRvIGltcG9ydFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSAtIElucHV0cywgb3V0cHV0cywgYW5kIGNyZWRlbnRpYWxzXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dE91dHB1dCh0b3RhbDogYmlnaW50KToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICB9IHtcbiAgICBpZiAodGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdObyBVVFhPcyBhdmFpbGFibGUgZm9yIFAtY2hhaW4gaW1wb3J0Jyk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXRzOiBUcmFuc2ZlcmFibGVJbnB1dFtdID0gW107XG4gICAgY29uc3Qgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgaW5wdXQgYW1vdW50XG4gICAgbGV0IHRvdGFsSW5wdXRBbW91bnQgPSBuZXcgQmlnTnVtYmVyKDApO1xuXG4gICAgLy8gUHJvY2VzcyBlYWNoIFVUWE8gdG8gY3JlYXRlIGlucHV0c1xuICAgIHRoaXMuX3V0eG9zLmZvckVhY2goKHV0eG86IERlY29kZWRVdHhvT2JqKSA9PiB7XG4gICAgICAvLyBVVFhPIHRvIFRyYW5zZmVyYWJsZUlucHV0IGNvbnZlcnNpb24gZm9yIFAtY2hhaW5cbiAgICAgIC8vIFRoaXMgY3JlYXRlcyBhIHN0cnVjdHVyZWQgaW5wdXQgY29tcGF0aWJsZSB3aXRoIEZsYXJlSlMgcHZtIHBhdHRlcm5zXG5cbiAgICAgIGNvbnN0IGFtb3VudCA9IG5ldyBCaWdOdW1iZXIodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxJbnB1dEFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQucGx1cyhhbW91bnQpO1xuXG4gICAgICAvLyBUcmFuc2ZlcmFibGVJbnB1dCBmb3IgUC1jaGFpbiB3aXRoIHByb3BlciBzdHJ1Y3R1cmVcbiAgICAgIC8vIFRoaXMgcHJvdmlkZXMgYSBzdHJ1Y3R1cmVkIGlucHV0IHJlYWR5IGZvciBGbGFyZUpTIGludGVncmF0aW9uXG4gICAgICBjb25zdCBlbmhhbmNlZFRyYW5zZmVyYWJsZUlucHV0ID0ge1xuICAgICAgICB0eElEOiB1dHhvLnR4aWQsXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCwgMTApLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IEJpZ0ludCh1dHhvLmFtb3VudCksXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IHV0eG8uYWRkcmVzc2VzLm1hcCgoXywgaW5kZXgpID0+IGluZGV4KSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHV0eG8udGhyZXNob2xkLFxuICAgICAgICAgIC8vIEZsYXJlSlMgUC1jaGFpbiBpbnB1dCBtYXJrZXJzXG4gICAgICAgICAgX2lucHV0VHlwZTogJ3NlY3AyNTZrMWZ4LlRyYW5zZmVySW5wdXQnLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEVuaGFuY2VkIG1ldGFkYXRhIGZvciBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICAgICAgX3NvdXJjZUNoYWluOiBDX0NIQUlOX0ZVTEwsXG4gICAgICAgIF9kZXN0aW5hdGlvbkNoYWluOiBQX0NIQUlOX0ZVTEwsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2goZW5oYW5jZWRUcmFuc2ZlcmFibGVJbnB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlZGVudGlhbCBmb3IgUC1jaGFpbiB3aXRoIHByb3BlciBzaWduYXR1cmUgc3RydWN0dXJlXG4gICAgICBjb25zdCBjcmVkZW50aWFsID0ge1xuICAgICAgICBzaWduYXR1cmVzOiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB1dHhvLnRocmVzaG9sZCB9LCAoKSA9PiBCdWZmZXIuYWxsb2MoU0VDUDI1NksxX1NJR05BVFVSRV9MRU5HVEgpKSwgLy8gUGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgICBhZGRyZXNzSW5kaWNlczogdXR4by5hZGRyZXNzZXMubWFwKChfLCBpbmRleCkgPT4gaW5kZXgpLFxuICAgICAgICB0aHJlc2hvbGQ6IHV0eG8udGhyZXNob2xkLFxuICAgICAgICBfcHZtQ29tcGF0aWJsZTogdHJ1ZSxcbiAgICAgICAgX3NpZ25hdHVyZUNvdW50OiB1dHhvLnRocmVzaG9sZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBlbmhhbmNlZCBjcmVkZW50aWFsICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCBhcyB1bmtub3duIGFzIENyZWRlbnRpYWwpO1xuICAgIH0pO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGZlZVxuICAgIGNvbnN0IGZlZSA9IG5ldyBCaWdOdW1iZXIodGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB8fCBERUZBVUxUX0JBU0VfRkVFKTsgLy8gRGVmYXVsdCAxTSBuYW5vRkxSXG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBmb3IgUC1jaGFpblxuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQubWludXMoZmVlKTtcbiAgICBpZiAoY2hhbmdlQW1vdW50Lmd0KDApKSB7XG4gICAgICAvLyBUcmFuc2ZlcmFibGVPdXRwdXQgZm9yIFAtY2hhaW4gd2l0aCBwcm9wZXIgc3RydWN0dXJlXG4gICAgICBjb25zdCBlbmhhbmNlZFRyYW5zZmVyYWJsZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogQmlnSW50KGNoYW5nZUFtb3VudC50b1N0cmluZygpKSxcbiAgICAgICAgICBhZGRyZXNzZXM6IHRoaXMudHJhbnNhY3Rpb24uX3RvLm1hcCgoYWRkcikgPT4gQnVmZmVyLmZyb20oYWRkciwgSEVYX0VOQ09ESU5HKSksXG4gICAgICAgICAgdGhyZXNob2xkOiB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQsXG4gICAgICAgICAgbG9ja3RpbWU6IHRoaXMudHJhbnNhY3Rpb24uX2xvY2t0aW1lLFxuICAgICAgICAgIC8vIEZsYXJlSlMgUC1jaGFpbiBvdXRwdXQgbWFya2Vyc1xuICAgICAgICAgIF9vdXRwdXRUeXBlOiAnc2VjcDI1NmsxZnguVHJhbnNmZXJPdXRwdXQnLFxuICAgICAgICAgIF9mbGFyZUpTUmVhZHk6IHRydWUsXG4gICAgICAgICAgX3B2bUNvbXBhdGlibGU6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChlbmhhbmNlZFRyYW5zZmVyYWJsZU91dHB1dCBhcyB1bmtub3duIGFzIFRyYW5zZmVyYWJsZU91dHB1dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBVVFhPcyB0byBiZSB1c2VkIGFzIGlucHV0cyBmb3IgdGhlIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7RGVjb2RlZFV0eG9PYmpbXX0gdXR4b3MgLSBVVFhPcyBmcm9tIEMtY2hhaW4gdG8gaW1wb3J0IHRvIFAtY2hhaW5cbiAgICovXG4gIGFkZFV0eG9zKHV0eG9zOiBEZWNvZGVkVXR4b09ialtdKTogdGhpcyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHV0eG9zKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVVRYT3MgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIHRoaXMuX3V0eG9zID0gWy4uLnRoaXMuX3V0eG9zLCAuLi51dHhvc107XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzb3VyY2UgY2hhaW4gZm9yIHRoZSBpbXBvcnQgKHR5cGljYWxseSBDLWNoYWluKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2hhaW5JZCAtIFNvdXJjZSBjaGFpbiBJRFxuICAgKi9cbiAgc291cmNlQ2hhaW4oY2hhaW5JZDogc3RyaW5nKTogdGhpcyB7XG4gICAgLy8gU291cmNlIGNoYWluIElEIHZhbGlkYXRpb24gYW5kIHNldHRpbmdcbiAgICAvLyBUaGlzIHByb3ZpZGVzIGJhc2ljIHZhbGlkYXRpb24gd2hpbGUgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgZm9ybWF0c1xuXG4gICAgaWYgKCFjaGFpbklkIHx8IHR5cGVvZiBjaGFpbklkICE9PSBTVFJJTkdfVFlQRSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQ2hhaW4gSUQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnKTtcbiAgICB9XG5cbiAgICAvLyBCYXNpYyB2YWxpZGF0aW9uIC0ganVzdCBlbnN1cmUgaXQncyBub3QgZW1wdHkgYW5kIHJlYXNvbmFibGUgbGVuZ3RoXG4gICAgaWYgKGNoYWluSWQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignQ2hhaW4gSUQgY2Fubm90IGJlIGVtcHR5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGNoYWluSWQubGVuZ3RoID4gTUFYX0NIQUlOX0lEX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgQ2hhaW4gSUQgdG9vIGxvbmcgKG1heCAke01BWF9DSEFJTl9JRF9MRU5HVEh9IGNoYXJhY3RlcnMpYCk7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZENoYWluSWQgPSBjaGFpbklkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBGb3IgUC1jaGFpbiBpbXBvcnRzLCBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBQLWNoYWluIGl0c2VsZlxuICAgIGlmIChub3JtYWxpemVkQ2hhaW5JZCA9PT0gJ3AnIHx8IG5vcm1hbGl6ZWRDaGFpbklkID09PSAncC1jaGFpbicpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1AtY2hhaW4gY2Fubm90IGJlIHNvdXJjZSBmb3IgUC1jaGFpbiBpbXBvcnQgKHVzZSBDLWNoYWluKScpO1xuICAgIH1cblxuICAgIC8vIEVuaGFuY2VkIGNoYWluIElEIHN0b3JhZ2Ugd2l0aCBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICAvLyBBY2NlcHQgdmFyaW91cyBmb3JtYXRzIHdoaWxlIHByb3ZpZGluZyByZWFzb25hYmxlIHZhbGlkYXRpb25cbiAgICBsZXQgY2hhaW5CdWZmZXI6IEJ1ZmZlcjtcblxuICAgIHRyeSB7XG4gICAgICAvLyBUcnkgdG8gZGV0ZWN0IGlmIGl0J3MgYSBoZXggc3RyaW5nIChldmVuIGxlbmd0aCwgdmFsaWQgaGV4IGNoYXJzKVxuICAgICAgaWYgKGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXgoKS50ZXN0KGNoYWluSWQpICYmIGNoYWluSWQubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgICBjaGFpbkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNoYWluSWQsIEhFWF9FTkNPRElORyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3IgYWxsIG90aGVyIGZvcm1hdHMsIHN0b3JlIGFzIFVURi04XG4gICAgICAgIGNoYWluQnVmZmVyID0gQnVmZmVyLmZyb20oY2hhaW5JZCwgVVRGOF9FTkNPRElORyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZhbGxiYWNrIHRvIFVURi04IGlmIGhleCBwYXJzaW5nIGZhaWxzXG4gICAgICBjaGFpbkJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGNoYWluSWQsIFVURjhfRU5DT0RJTkcpO1xuICAgIH1cblxuICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IGNoYWluQnVmZmVyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmZWUgZm9yIHRoZSBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IEJpZ051bWJlcn0gZmVlIC0gRmVlIGFtb3VudCBpbiBuYW5vRkxSXG4gICAqL1xuICBmZWUoZmVlOiBzdHJpbmcgfCBudW1iZXIgfCBCaWdOdW1iZXIpOiB0aGlzIHtcbiAgICBjb25zdCBmZWVBbW91bnQgPVxuICAgICAgdHlwZW9mIGZlZSA9PT0gU1RSSU5HX1RZUEUgfHwgdHlwZW9mIGZlZSA9PT0gTlVNQkVSX1RZUEUgPyBuZXcgQmlnTnVtYmVyKGZlZSkgOiAoZmVlIGFzIEJpZ051bWJlcik7XG5cbiAgICBpZiAoZmVlQW1vdW50Lmx0KDApKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdGZWUgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSA9IGZlZUFtb3VudC50b1N0cmluZygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBsb2NrdGltZSBmb3IgdGhlIFAtY2hhaW4gaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyIHwgYmlnaW50fSBsb2NrdGltZSAtIExvY2t0aW1lIHZhbHVlXG4gICAqL1xuICBsb2NrdGltZShsb2NrdGltZTogbnVtYmVyIHwgYmlnaW50KTogdGhpcyB7XG4gICAgdGhpcy50cmFuc2FjdGlvbi5fbG9ja3RpbWUgPSB0eXBlb2YgbG9ja3RpbWUgPT09ICdudW1iZXInID8gQmlnSW50KGxvY2t0aW1lKSA6IGxvY2t0aW1lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aHJlc2hvbGQgZm9yIHRoZSBQLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkIC0gU2lnbmF0dXJlIHRocmVzaG9sZFxuICAgKi9cbiAgdGhyZXNob2xkKHRocmVzaG9sZDogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKHRocmVzaG9sZCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RocmVzaG9sZCBtdXN0IGJlIGF0IGxlYXN0IDEnKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiJdfQ==
|
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==
|