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