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