@bitgo-beta/sdk-coin-flrp 1.0.1-beta.35 → 1.0.1-beta.350
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 +10 -17
- package/dist/src/flrp.d.ts.map +1 -1
- package/dist/src/flrp.js +51 -77
- 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 +190 -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 +277 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts +63 -0
- package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/ImportInCTxBuilder.js +280 -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 +192 -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 +57 -71
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/atomicTransactionBuilder.js +246 -209
- package/dist/src/lib/iface.d.ts +38 -61
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +13 -14
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +12 -2
- package/dist/src/lib/keyPair.d.ts +5 -5
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +17 -9
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +43 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +132 -0
- package/dist/src/lib/transaction.d.ts +25 -65
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +341 -199
- package/dist/src/lib/transactionBuilder.d.ts +107 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +210 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +50 -30
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +129 -72
- package/dist/src/lib/utils.d.ts +78 -147
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +238 -324
- package/dist/test/resources/account.d.ts +51 -0
- package/dist/test/resources/account.d.ts.map +1 -0
- package/dist/test/resources/account.js +54 -0
- 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 +39 -0
- package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
- package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/exportInP.js +140 -0
- package/dist/test/resources/transactionData/importInC.d.ts +27 -0
- package/dist/test/resources/transactionData/importInC.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInC.js +44 -0
- package/dist/test/resources/transactionData/importInP.d.ts +35 -0
- package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
- package/dist/test/resources/transactionData/importInP.js +58 -0
- package/dist/test/unit/flrp.js +446 -68
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInCTxBuilder.js +192 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/exportInPTxBuilder.js +325 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInCTxBuilder.js +307 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
- package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/importInPTxBuilder.js +307 -0
- package/dist/test/unit/lib/keyPair.d.ts +2 -0
- package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
- package/dist/test/unit/lib/keyPair.js +158 -0
- 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 +83 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/lib/transactionBuilderFactory.js +60 -0
- package/dist/test/unit/lib/utils.js +539 -207
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -10
- package/.eslintignore +0 -5
- package/.eslintrc.json +0 -7
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -0
- 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 -11
- package/dist/src/lib/constants.d.ts.map +0 -1
- package/dist/src/lib/constants.js +0 -17
- 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 -170
- 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 -56
- 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/exportTxBuilder.d.ts +0 -2
- package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
- package/dist/test/unit/lib/exportTxBuilder.js +0 -45
- 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/smoke.d.ts +0 -2
- package/dist/test/unit/smoke.d.ts.map +0 -1
- package/dist/test/unit/smoke.js +0 -23
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { AtomicInCTransactionBuilder } from './atomicInCTransactionBuilder';
|
|
4
|
+
import { Credential, TransferableInput } from '@flarenetwork/flarejs';
|
|
5
|
+
import { Tx } from './iface';
|
|
6
|
+
export declare class ImportInCTxBuilder extends AtomicInCTransactionBuilder {
|
|
7
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
8
|
+
/**
|
|
9
|
+
* C-chain address who is target of the import.
|
|
10
|
+
* Address format is eth like
|
|
11
|
+
* @param {string} cAddress
|
|
12
|
+
*/
|
|
13
|
+
to(cAddress: string): this;
|
|
14
|
+
protected get transactionType(): TransactionType;
|
|
15
|
+
initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
|
|
16
|
+
static verifyTxType(txnType: string): boolean;
|
|
17
|
+
verifyTxType(txnType: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Build the import in C-chain transaction
|
|
20
|
+
* @protected
|
|
21
|
+
*/
|
|
22
|
+
protected buildFlareTransaction(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Create inputs from UTXOs
|
|
25
|
+
* @return {
|
|
26
|
+
* inputs: TransferableInput[];
|
|
27
|
+
* credentials: Credential[];
|
|
28
|
+
* amount: bigint;
|
|
29
|
+
* }
|
|
30
|
+
*/
|
|
31
|
+
protected createInputs(): {
|
|
32
|
+
inputs: TransferableInput[];
|
|
33
|
+
credentials: Credential[];
|
|
34
|
+
amount: bigint;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Calculate the import cost for C-chain import transactions
|
|
38
|
+
* Matches AVAXP's costImportTx formula:
|
|
39
|
+
* - Base byte cost: transactionSize * txBytesGas (1 gas per byte)
|
|
40
|
+
* - Per-input cost: numInputs * costPerSignature (1000 per signature) * threshold
|
|
41
|
+
* - Fixed fee: 10000
|
|
42
|
+
*
|
|
43
|
+
* This returns cost "units" to be multiplied by feeRate, matching AVAXP's approach:
|
|
44
|
+
* AVAXP: fee = feeRate.muln(costImportTx(tx))
|
|
45
|
+
* FLRP: fee = feeRate * calculateImportCost(tx)
|
|
46
|
+
*
|
|
47
|
+
* @param tx The ImportTx to calculate the cost for
|
|
48
|
+
* @returns The total cost units
|
|
49
|
+
*/
|
|
50
|
+
private calculateImportCost;
|
|
51
|
+
/**
|
|
52
|
+
* Calculate the fee size for the transaction (for backwards compatibility)
|
|
53
|
+
* For C-chain imports, the feeRate is treated as an absolute fee value
|
|
54
|
+
*/
|
|
55
|
+
private calculateFeeSize;
|
|
56
|
+
/**
|
|
57
|
+
* Recover UTXOs from imported inputs
|
|
58
|
+
* @param importedInputs Array of transferable inputs
|
|
59
|
+
* @returns Array of decoded UTXO objects
|
|
60
|
+
*/
|
|
61
|
+
private recoverUtxos;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ImportInCTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportInCTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInCTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAGL,UAAU,EAIV,iBAAiB,EAIlB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,2BAA2B;gBACrD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;;OAIG;IACH,EAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK1B,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IAyG9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IA0EvC;;;;;;;OAOG;IACH,SAAS,CAAC,YAAY,IAAI;QACxB,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;IAqDD;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ImportInCTxBuilder = void 0;
|
|
7
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
8
|
+
const atomicInCTransactionBuilder_1 = require("./atomicInCTransactionBuilder");
|
|
9
|
+
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
10
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
11
|
+
const iface_1 = require("./iface");
|
|
12
|
+
class ImportInCTxBuilder extends atomicInCTransactionBuilder_1.AtomicInCTransactionBuilder {
|
|
13
|
+
constructor(_coinConfig) {
|
|
14
|
+
super(_coinConfig);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* C-chain address who is target of the import.
|
|
18
|
+
* Address format is eth like
|
|
19
|
+
* @param {string} cAddress
|
|
20
|
+
*/
|
|
21
|
+
to(cAddress) {
|
|
22
|
+
this.transaction._to = [utils_1.default.parseAddress(cAddress)];
|
|
23
|
+
return this;
|
|
24
|
+
}
|
|
25
|
+
get transactionType() {
|
|
26
|
+
return sdk_core_1.TransactionType.Import;
|
|
27
|
+
}
|
|
28
|
+
initBuilder(tx, rawBytes, parsedCredentials) {
|
|
29
|
+
const baseTx = tx;
|
|
30
|
+
if (!this.verifyTxType(baseTx._type)) {
|
|
31
|
+
throw new sdk_core_1.NotSupported('Transaction cannot be parsed or has an unsupported transaction type');
|
|
32
|
+
}
|
|
33
|
+
// The outputs is a single C-Chain address result.
|
|
34
|
+
// It's expected to have only one output to the destination C-Chain address.
|
|
35
|
+
const outputs = baseTx.Outs;
|
|
36
|
+
if (outputs.length !== 1) {
|
|
37
|
+
throw new sdk_core_1.BuildTransactionError('Transaction can have one output');
|
|
38
|
+
}
|
|
39
|
+
const output = outputs[0];
|
|
40
|
+
if (Buffer.from(output.assetId.toBytes()).toString('hex') !== this.transaction._assetId) {
|
|
41
|
+
throw new Error('AssetID are not equals');
|
|
42
|
+
}
|
|
43
|
+
this.transaction._to = [Buffer.from(output.address.toBytes())];
|
|
44
|
+
const inputs = baseTx.importedInputs;
|
|
45
|
+
this.transaction._utxos = this.recoverUtxos(inputs);
|
|
46
|
+
// Calculate total input and output amounts
|
|
47
|
+
const totalInputAmount = inputs.reduce((t, i) => t + i.amount(), BigInt(0));
|
|
48
|
+
const totalOutputAmount = output.amount.value();
|
|
49
|
+
// Calculate fee based on input/output difference
|
|
50
|
+
const fee = totalInputAmount - totalOutputAmount;
|
|
51
|
+
const feeSize = this.calculateFeeSize(baseTx);
|
|
52
|
+
// Use integer division to ensure feeRate can be converted back to BigInt
|
|
53
|
+
const feeRate = Math.floor(Number(fee) / feeSize);
|
|
54
|
+
this.transaction._fee = {
|
|
55
|
+
fee: fee.toString(),
|
|
56
|
+
feeRate: feeRate,
|
|
57
|
+
size: feeSize,
|
|
58
|
+
};
|
|
59
|
+
// Use credentials passed from TransactionBuilderFactory (properly extracted using codec)
|
|
60
|
+
const credentials = parsedCredentials || [];
|
|
61
|
+
const hasCredentials = credentials.length > 0;
|
|
62
|
+
// If it's a signed transaction, store the original raw bytes to preserve exact format
|
|
63
|
+
if (hasCredentials && rawBytes) {
|
|
64
|
+
this.transaction._rawSignedBytes = rawBytes;
|
|
65
|
+
}
|
|
66
|
+
// Extract threshold from first input's sigIndicies (number of required signatures)
|
|
67
|
+
const firstInput = inputs[0];
|
|
68
|
+
const inputThreshold = firstInput.sigIndicies().length || this.transaction._threshold;
|
|
69
|
+
this.transaction._threshold = inputThreshold;
|
|
70
|
+
// Create AddressMaps based on signature slot order (matching credential order), not sorted addresses
|
|
71
|
+
// This matches the approach used in credentials: addressesIndex determines signature order
|
|
72
|
+
// AddressMaps should map addresses to signature slots in the same order as credentials
|
|
73
|
+
// If _fromAddresses is available, create AddressMap based on UTXO order (matching credential order)
|
|
74
|
+
// Otherwise, fall back to mapping just the output address
|
|
75
|
+
const firstUtxo = this.transaction._utxos[0];
|
|
76
|
+
let addressMap;
|
|
77
|
+
if (firstUtxo &&
|
|
78
|
+
firstUtxo.addresses &&
|
|
79
|
+
firstUtxo.addresses.length > 0 &&
|
|
80
|
+
this.transaction._fromAddresses &&
|
|
81
|
+
this.transaction._fromAddresses.length >= this.transaction._threshold) {
|
|
82
|
+
// Use centralized method for AddressMap creation
|
|
83
|
+
addressMap = this.createAddressMapForUtxo(firstUtxo, this.transaction._threshold);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Fallback: map output address to slot 0 (for C-chain imports, output is the destination)
|
|
87
|
+
// Or map addresses sequentially if _fromAddresses is available but UTXO addresses are not
|
|
88
|
+
addressMap = new flarejs_1.utils.AddressMap();
|
|
89
|
+
if (this.transaction._fromAddresses && this.transaction._fromAddresses.length >= this.transaction._threshold) {
|
|
90
|
+
this.transaction._fromAddresses.slice(0, this.transaction._threshold).forEach((addr, i) => {
|
|
91
|
+
addressMap.set(new flarejs_1.Address(addr), i);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
// Last resort: map output address
|
|
96
|
+
const toAddress = new flarejs_1.Address(output.address.toBytes());
|
|
97
|
+
addressMap.set(toAddress, 0);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
|
|
101
|
+
// When credentials were extracted, use them directly to preserve existing signatures
|
|
102
|
+
// For initBuilder, _fromAddresses may not be set yet, so use all zeros for credential slots
|
|
103
|
+
let txCredentials;
|
|
104
|
+
if (credentials.length > 0) {
|
|
105
|
+
txCredentials = credentials;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Create empty credential with threshold number of signature slots (all zeros)
|
|
109
|
+
const emptySignatures = [];
|
|
110
|
+
for (let i = 0; i < inputThreshold; i++) {
|
|
111
|
+
emptySignatures.push(utils_1.default.createNewSig(''));
|
|
112
|
+
}
|
|
113
|
+
txCredentials = [new flarejs_1.Credential(emptySignatures)];
|
|
114
|
+
}
|
|
115
|
+
const unsignedTx = new flarejs_1.UnsignedTx(baseTx, [], addressMaps, txCredentials);
|
|
116
|
+
this.transaction.setTransaction(unsignedTx);
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
static verifyTxType(txnType) {
|
|
120
|
+
return txnType === iface_1.FlareTransactionType.EvmImportTx;
|
|
121
|
+
}
|
|
122
|
+
verifyTxType(txnType) {
|
|
123
|
+
return ImportInCTxBuilder.verifyTxType(txnType);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build the import in C-chain transaction
|
|
127
|
+
* @protected
|
|
128
|
+
*/
|
|
129
|
+
buildFlareTransaction() {
|
|
130
|
+
// if tx has credentials or was already recovered from raw, tx shouldn't change
|
|
131
|
+
if (this.transaction.hasCredentials)
|
|
132
|
+
return;
|
|
133
|
+
if (this.transaction._to.length !== 1) {
|
|
134
|
+
throw new Error('to is required');
|
|
135
|
+
}
|
|
136
|
+
if (!this.transaction._fee.feeRate) {
|
|
137
|
+
throw new Error('fee rate is required');
|
|
138
|
+
}
|
|
139
|
+
const { inputs, amount, credentials } = this.createInputs();
|
|
140
|
+
// Calculate import cost units (matching AVAXP's costImportTx approach)
|
|
141
|
+
// Create a temporary transaction to calculate the actual cost units
|
|
142
|
+
const tempOutput = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
|
|
143
|
+
const tempImportTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [tempOutput]);
|
|
144
|
+
// Calculate the import cost units (matches AVAXP's feeSize from costImportTx)
|
|
145
|
+
const feeSize = this.calculateImportCost(tempImportTx);
|
|
146
|
+
// Multiply feeRate by cost units (matching AVAXP: fee = feeRate.muln(feeSize))
|
|
147
|
+
const feeRate = BigInt(this.transaction._fee.feeRate);
|
|
148
|
+
const fee = feeRate * BigInt(feeSize);
|
|
149
|
+
this.transaction._fee.fee = fee.toString();
|
|
150
|
+
this.transaction._fee.size = feeSize;
|
|
151
|
+
// Create EVM output using proper FlareJS class with amount minus fee
|
|
152
|
+
const output = new flarejs_1.evmSerial.Output(new flarejs_1.Address(this.transaction._to[0]), new flarejs_1.BigIntPr(amount - fee), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._assetId, 'hex'))));
|
|
153
|
+
// Create the import transaction
|
|
154
|
+
const importTx = new flarejs_1.evmSerial.ImportTx(new flarejs_1.Int(this.transaction._networkID), new flarejs_1.Id(new Uint8Array(Buffer.from(this.transaction._blockchainID, 'hex'))), new flarejs_1.Id(new Uint8Array(this._externalChainId)), inputs, [output]);
|
|
155
|
+
// Create AddressMaps based on signature slot order (matching credential order), not sorted addresses
|
|
156
|
+
// This matches the approach used in credentials: addressesIndex determines signature order
|
|
157
|
+
// AddressMaps should map addresses to signature slots in the same order as credentials
|
|
158
|
+
// For C-chain imports, we typically have one input, so use the first UTXO
|
|
159
|
+
// Use centralized method for AddressMap creation
|
|
160
|
+
const firstUtxo = this.transaction._utxos[0];
|
|
161
|
+
const addressMap = firstUtxo
|
|
162
|
+
? this.createAddressMapForUtxo(firstUtxo, this.transaction._threshold)
|
|
163
|
+
: new flarejs_1.utils.AddressMap();
|
|
164
|
+
const addressMaps = new flarejs_1.utils.AddressMaps([addressMap]);
|
|
165
|
+
const unsignedTx = new flarejs_1.UnsignedTx(importTx, [], // Empty UTXOs array, will be filled during processing
|
|
166
|
+
addressMaps, credentials);
|
|
167
|
+
this.transaction.setTransaction(unsignedTx);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Create inputs from UTXOs
|
|
171
|
+
* @return {
|
|
172
|
+
* inputs: TransferableInput[];
|
|
173
|
+
* credentials: Credential[];
|
|
174
|
+
* amount: bigint;
|
|
175
|
+
* }
|
|
176
|
+
*/
|
|
177
|
+
createInputs() {
|
|
178
|
+
const sender = this.transaction._fromAddresses.slice();
|
|
179
|
+
if (this.recoverSigner) {
|
|
180
|
+
// switch first and last signer
|
|
181
|
+
const tmp = sender.pop();
|
|
182
|
+
sender.push(sender[0]);
|
|
183
|
+
if (tmp) {
|
|
184
|
+
sender[0] = tmp;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
let totalAmount = BigInt(0);
|
|
188
|
+
const inputs = [];
|
|
189
|
+
const credentials = [];
|
|
190
|
+
this.transaction._utxos.forEach((utxo) => {
|
|
191
|
+
const amount = BigInt(utxo.amount);
|
|
192
|
+
totalAmount += amount;
|
|
193
|
+
// Create signature indices for threshold
|
|
194
|
+
const sigIndices = [];
|
|
195
|
+
for (let i = 0; i < this.transaction._threshold; i++) {
|
|
196
|
+
sigIndices.push(i);
|
|
197
|
+
}
|
|
198
|
+
// Use fromNative to create TransferableInput (same pattern as ImportInPTxBuilder)
|
|
199
|
+
// fromNative expects cb58-encoded strings for txId and assetId
|
|
200
|
+
const txIdCb58 = utxo.txid; // Already cb58 encoded
|
|
201
|
+
const assetIdCb58 = utils_1.default.cb58Encode(Buffer.from(this.transaction._assetId, 'hex'));
|
|
202
|
+
const transferableInput = flarejs_1.TransferableInput.fromNative(txIdCb58, Number(utxo.outputidx), assetIdCb58, amount, sigIndices);
|
|
203
|
+
inputs.push(transferableInput);
|
|
204
|
+
// Create credential with empty signatures for slot identification
|
|
205
|
+
// Match avaxp behavior: dynamic ordering based on addressesIndex from UTXO
|
|
206
|
+
// Use centralized method for credential creation
|
|
207
|
+
credentials.push(this.createCredentialForUtxo(utxo, this.transaction._threshold));
|
|
208
|
+
});
|
|
209
|
+
return {
|
|
210
|
+
inputs,
|
|
211
|
+
credentials,
|
|
212
|
+
amount: totalAmount,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Calculate the import cost for C-chain import transactions
|
|
217
|
+
* Matches AVAXP's costImportTx formula:
|
|
218
|
+
* - Base byte cost: transactionSize * txBytesGas (1 gas per byte)
|
|
219
|
+
* - Per-input cost: numInputs * costPerSignature (1000 per signature) * threshold
|
|
220
|
+
* - Fixed fee: 10000
|
|
221
|
+
*
|
|
222
|
+
* This returns cost "units" to be multiplied by feeRate, matching AVAXP's approach:
|
|
223
|
+
* AVAXP: fee = feeRate.muln(costImportTx(tx))
|
|
224
|
+
* FLRP: fee = feeRate * calculateImportCost(tx)
|
|
225
|
+
*
|
|
226
|
+
* @param tx The ImportTx to calculate the cost for
|
|
227
|
+
* @returns The total cost units
|
|
228
|
+
*/
|
|
229
|
+
calculateImportCost(tx) {
|
|
230
|
+
const codec = flarejs_1.avmSerial.getAVMManager().getDefaultCodec();
|
|
231
|
+
const txBytes = tx.toBytes(codec);
|
|
232
|
+
// Base byte cost: 1 gas per byte (matching AVAX txBytesGas)
|
|
233
|
+
const txBytesGas = 1;
|
|
234
|
+
let bytesCost = txBytes.length * txBytesGas;
|
|
235
|
+
// Per-input cost: costPerSignature (1000) per signature
|
|
236
|
+
const costPerSignature = 1000;
|
|
237
|
+
const numInputs = tx.importedInputs.length;
|
|
238
|
+
const numSignatures = this.transaction._threshold; // Each input requires threshold signatures
|
|
239
|
+
const inputCost = numInputs * costPerSignature * numSignatures;
|
|
240
|
+
bytesCost += inputCost;
|
|
241
|
+
// Fixed fee component
|
|
242
|
+
const fixedFee = 10000;
|
|
243
|
+
const totalCost = bytesCost + fixedFee;
|
|
244
|
+
return totalCost;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Calculate the fee size for the transaction (for backwards compatibility)
|
|
248
|
+
* For C-chain imports, the feeRate is treated as an absolute fee value
|
|
249
|
+
*/
|
|
250
|
+
calculateFeeSize(tx) {
|
|
251
|
+
// If tx is provided, calculate based on actual transaction size
|
|
252
|
+
if (tx) {
|
|
253
|
+
const codec = flarejs_1.avmSerial.getAVMManager().getDefaultCodec();
|
|
254
|
+
return tx.toBytes(codec).length;
|
|
255
|
+
}
|
|
256
|
+
// For C-chain imports, treat feeRate as the absolute fee (multiplier of 1)
|
|
257
|
+
return 1;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Recover UTXOs from imported inputs
|
|
261
|
+
* @param importedInputs Array of transferable inputs
|
|
262
|
+
* @returns Array of decoded UTXO objects
|
|
263
|
+
*/
|
|
264
|
+
recoverUtxos(importedInputs) {
|
|
265
|
+
return importedInputs.map((input) => {
|
|
266
|
+
const txid = input.utxoID.toString();
|
|
267
|
+
const outputidx = input.utxoID.outputIdx.toString();
|
|
268
|
+
return {
|
|
269
|
+
outputID: iface_1.SECP256K1_Transfer_Output,
|
|
270
|
+
amount: input.amount().toString(),
|
|
271
|
+
txid: utils_1.default.cb58Encode(Buffer.from(txid, 'hex')),
|
|
272
|
+
outputidx: outputidx,
|
|
273
|
+
threshold: this.transaction._threshold,
|
|
274
|
+
addresses: this.transaction._fromAddresses.map((addr) => utils_1.default.addressToString(this.transaction._network.hrp, this.transaction._network.alias, Buffer.from(addr))),
|
|
275
|
+
};
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
exports.ImportInCTxBuilder = ImportInCTxBuilder;
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1wb3J0SW5DVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9JbXBvcnRJbkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBQTRGO0FBQzVGLCtFQUE0RTtBQUM1RSxtREFXK0I7QUFDL0Isb0RBQTRCO0FBQzVCLG1DQUE4RjtBQUU5RixNQUFhLGtCQUFtQixTQUFRLHlEQUEyQjtJQUNqRSxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBQyxRQUFnQjtRQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLGVBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUN0RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLE1BQU0sQ0FBQztJQUNoQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQU0sRUFBRSxRQUFpQixFQUFFLGlCQUFnQztRQUNyRSxNQUFNLE1BQU0sR0FBRyxFQUF3QixDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx1QkFBWSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDaEcsQ0FBQztRQUVELGtEQUFrRDtRQUNsRCw0RUFBNEU7UUFDNUUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM1QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENB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RUFBRSxpQ0FBeUI7Z0JBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO2dCQUNqQyxJQUFJLEVBQUUsZUFBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDaEQsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVU7Z0JBQ3RDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN0RCxlQUFLLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUN6RzthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQTVWRCxnREE0VkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIE5vdFN1cHBvcnRlZCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi9hdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXInO1xuaW1wb3J0IHtcbiAgZXZtU2VyaWFsLFxuICBVbnNpZ25lZFR4LFxuICBDcmVkZW50aWFsLFxuICBCaWdJbnRQcixcbiAgSW50LFxuICBJZCxcbiAgVHJhbnNmZXJhYmxlSW5wdXQsXG4gIEFkZHJlc3MsXG4gIHV0aWxzIGFzIEZsYXJlVXRpbHMsXG4gIGF2bVNlcmlhbCxcbn0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IERlY29kZWRVdHhvT2JqLCBGbGFyZVRyYW5zYWN0aW9uVHlwZSwgU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCwgVHggfSBmcm9tICcuL2lmYWNlJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydEluQ1R4QnVpbGRlciBleHRlbmRzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDLWNoYWluIGFkZHJlc3Mgd2hvIGlzIHRhcmdldCBvZiB0aGUgaW1wb3J0LlxuICAgKiBBZGRyZXNzIGZvcm1hdCBpcyBldGggbGlrZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY0FkZHJlc3NcbiAgICovXG4gIHRvKGNBZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90byA9IFt1dGlscy5wYXJzZUFkZHJlc3MoY0FkZHJlc3MpXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNhY3Rpb25UeXBlKCk6IFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICBpbml0QnVpbGRlcih0eDogVHgsIHJhd0J5dGVzPzogQnVmZmVyLCBwYXJzZWRDcmVkZW50aWFscz86IENyZWRlbnRpYWxbXSk6IHRoaXMge1xuICAgIGNvbnN0IGJhc2VUeCA9IHR4IGFzIGV2bVNlcmlhbC5JbXBvcnRUeDtcbiAgICBpZiAoIXRoaXMudmVyaWZ5VHhUeXBlKGJhc2VUeC5fdHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ1RyYW5zYWN0aW9uIGNhbm5vdCBiZSBwYXJzZWQgb3IgaGFzIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHR5cGUnKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgb3V0cHV0cyBpcyBhIHNpbmdsZSBDLUNoYWluIGFkZHJlc3MgcmVzdWx0LlxuICAgIC8vIEl0J3MgZXhwZWN0ZWQgdG8gaGF2ZSBvbmx5IG9uZSBvdXRwdXQgdG8gdGhlIGRlc3RpbmF0aW9uIEMtQ2hhaW4gYWRkcmVzcy5cbiAgICBjb25zdCBvdXRwdXRzID0gYmFzZVR4Lk91dHM7XG4gICAgaWYgKG91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiBjYW4gaGF2ZSBvbmUgb3V0cHV0Jyk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbMF07XG5cbiAgICBpZiAoQnVmZmVyLmZyb20ob3V0cHV0LmFzc2V0SWQudG9CeXRlcygpKS50b1N0cmluZygnaGV4JykgIT09IHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXNzZXRJRCBhcmUgbm90IGVxdWFscycpO1xuICAgIH1cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90byA9IFtCdWZmZXIuZnJvbShvdXRwdXQuYWRkcmVzcy50b0J5dGVzKCkpXTtcblxuICAgIGNvbnN0IGlucHV0cyA9IGJhc2VUeC5pbXBvcnRlZElucHV0cztcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcyA9IHRoaXMucmVjb3ZlclV0eG9zKGlucHV0cyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgaW5wdXQgYW5kIG91dHB1dCBhbW91bnRzXG4gICAgY29uc3QgdG90YWxJbnB1dEFtb3VudCA9IGlucHV0cy5yZWR1Y2UoKHQsIGkpID0+IHQgKyBpLmFtb3VudCgpLCBCaWdJbnQoMCkpO1xuICAgIGNvbnN0IHRvdGFsT3V0cHV0QW1vdW50ID0gb3V0cHV0LmFtb3VudC52YWx1ZSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGZlZSBiYXNlZCBvbiBpbnB1dC9vdXRwdXQgZGlmZmVyZW5jZVxuICAgIGNvbnN0IGZlZSA9IHRvdGFsSW5wdXRBbW91bnQgLSB0b3RhbE91dHB1dEFtb3VudDtcbiAgICBjb25zdCBmZWVTaXplID0gdGhpcy5jYWxjdWxhdGVGZWVTaXplKGJhc2VUeCk7XG4gICAgLy8gVXNlIGludGVnZXIgZGl2aXNpb24gdG8gZW5zdXJlIGZlZVJhdGUgY2FuIGJlIGNvbnZlcnRlZCBiYWNrIHRvIEJpZ0ludFxuICAgIGNvbnN0IGZlZVJhdGUgPSBNYXRoLmZsb29yKE51bWJlcihmZWUpIC8gZmVlU2l6ZSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUgPSB7XG4gICAgICBmZWU6IGZlZS50b1N0cmluZygpLFxuICAgICAgZmVlUmF0ZTogZmVlUmF0ZSxcbiAgICAgIHNpemU6IGZlZVNpemUsXG4gICAgfTtcblxuICAgIC8vIFVzZSBjcmVkZW50aWFscyBwYXNzZWQgZnJvbSBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5IChwcm9wZXJseSBleHRyYWN0ZWQgdXNpbmcgY29kZWMpXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSBwYXJzZWRDcmVkZW50aWFscyB8fCBbXTtcbiAgICBjb25zdCBoYXNDcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG5cbiAgICAvLyBJZiBpdCdzIGEgc2lnbmVkIHRyYW5zYWN0aW9uLCBzdG9yZSB0aGUgb3JpZ2luYWwgcmF3IGJ5dGVzIHRvIHByZXNlcnZlIGV4YWN0IGZvcm1hdFxuICAgIGlmIChoYXNDcmVkZW50aWFscyAmJiByYXdCeXRlcykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fcmF3U2lnbmVkQnl0ZXMgPSByYXdCeXRlcztcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IHRocmVzaG9sZCBmcm9tIGZpcnN0IGlucHV0J3Mgc2lnSW5kaWNpZXMgKG51bWJlciBvZiByZXF1aXJlZCBzaWduYXR1cmVzKVxuICAgIGNvbnN0IGZpcnN0SW5wdXQgPSBpbnB1dHNbMF07XG4gICAgY29uc3QgaW5wdXRUaHJlc2hvbGQgPSBmaXJzdElucHV0LnNpZ0luZGljaWVzKCkubGVuZ3RoIHx8IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQgPSBpbnB1dFRocmVzaG9sZDtcblxuICAgIC8vIENyZWF0ZSBBZGRyZXNzTWFwcyBiYXNlZCBvbiBzaWduYXR1cmUgc2xvdCBvcmRlciAobWF0Y2hpbmcgY3JlZGVudGlhbCBvcmRlciksIG5vdCBzb3J0ZWQgYWRkcmVzc2VzXG4gICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBhcHByb2FjaCB1c2VkIGluIGNyZWRlbnRpYWxzOiBhZGRyZXNzZXNJbmRleCBkZXRlcm1pbmVzIHNpZ25hdHVyZSBvcmRlclxuICAgIC8vIEFkZHJlc3NNYXBzIHNob3VsZCBtYXAgYWRkcmVzc2VzIHRvIHNpZ25hdHVyZSBzbG90cyBpbiB0aGUgc2FtZSBvcmRlciBhcyBjcmVkZW50aWFsc1xuICAgIC8vIElmIF9mcm9tQWRkcmVzc2VzIGlzIGF2YWlsYWJsZSwgY3JlYXRlIEFkZHJlc3NNYXAgYmFzZWQgb24gVVRYTyBvcmRlciAobWF0Y2hpbmcgY3JlZGVudGlhbCBvcmRlcilcbiAgICAvLyBPdGhlcndpc2UsIGZhbGwgYmFjayB0byBtYXBwaW5nIGp1c3QgdGhlIG91dHB1dCBhZGRyZXNzXG4gICAgY29uc3QgZmlyc3RVdHhvID0gdGhpcy50cmFuc2FjdGlvbi5fdXR4b3NbMF07XG4gICAgbGV0IGFkZHJlc3NNYXA6IEZsYXJlVXRpbHMuQWRkcmVzc01hcDtcbiAgICBpZiAoXG4gICAgICBmaXJzdFV0eG8gJiZcbiAgICAgIGZpcnN0VXR4by5hZGRyZXNzZXMgJiZcbiAgICAgIGZpcnN0VXR4by5hZGRyZXNzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyAmJlxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGggPj0gdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkXG4gICAgKSB7XG4gICAgICAvLyBVc2UgY2VudHJhbGl6ZWQgbWV0aG9kIGZvciBBZGRyZXNzTWFwIGNyZWF0aW9uXG4gICAgICBhZGRyZXNzTWFwID0gdGhpcy5jcmVhdGVBZGRyZXNzTWFwRm9yVXR4byhmaXJzdFV0eG8sIHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBtYXAgb3V0cHV0IGFkZHJlc3MgdG8gc2xvdCAwIChmb3IgQy1jaGFpbiBpbXBvcnRzLCBvdXRwdXQgaXMgdGhlIGRlc3RpbmF0aW9uKVxuICAgICAgLy8gT3IgbWFwIGFkZHJlc3NlcyBzZXF1ZW50aWFsbHkgaWYgX2Zyb21BZGRyZXNzZXMgaXMgYXZhaWxhYmxlIGJ1dCBVVFhPIGFkZHJlc3NlcyBhcmUgbm90XG4gICAgICBhZGRyZXNzTWFwID0gbmV3IEZsYXJlVXRpbHMuQWRkcmVzc01hcCgpO1xuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMgJiYgdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3Nlcy5sZW5ndGggPj0gdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb24uX2Zyb21BZGRyZXNzZXMuc2xpY2UoMCwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkKS5mb3JFYWNoKChhZGRyLCBpKSA9PiB7XG4gICAgICAgICAgYWRkcmVzc01hcC5zZXQobmV3IEFkZHJlc3MoYWRkciksIGkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIExhc3QgcmVzb3J0OiBtYXAgb3V0cHV0IGFkZHJlc3NcbiAgICAgICAgY29uc3QgdG9BZGRyZXNzID0gbmV3IEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MudG9CeXRlcygpKTtcbiAgICAgICAgYWRkcmVzc01hcC5zZXQodG9BZGRyZXNzLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKFthZGRyZXNzTWFwXSk7XG5cbiAgICAvLyBXaGVuIGNyZWRlbnRpYWxzIHdlcmUgZXh0cmFjdGVkLCB1c2UgdGhlbSBkaXJlY3RseSB0byBwcmVzZXJ2ZSBleGlzdGluZyBzaWduYXR1cmVzXG4gICAgLy8gRm9yIGluaXRCdWlsZGVyLCBfZnJvbUFkZHJlc3NlcyBtYXkgbm90IGJlIHNldCB5ZXQsIHNvIHVzZSBhbGwgemVyb3MgZm9yIGNyZWRlbnRpYWwgc2xvdHNcbiAgICBsZXQgdHhDcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgIGlmIChjcmVkZW50aWFscy5sZW5ndGggPiAwKSB7XG4gICAgICB0eENyZWRlbnRpYWxzID0gY3JlZGVudGlhbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBlbXB0eSBjcmVkZW50aWFsIHdpdGggdGhyZXNob2xkIG51bWJlciBvZiBzaWduYXR1cmUgc2xvdHMgKGFsbCB6ZXJvcylcbiAgICAgIGNvbnN0IGVtcHR5U2lnbmF0dXJlczogUmV0dXJuVHlwZTx0eXBlb2YgdXRpbHMuY3JlYXRlTmV3U2lnPltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0VGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgZW1wdHlTaWduYXR1cmVzLnB1c2godXRpbHMuY3JlYXRlTmV3U2lnKCcnKSk7XG4gICAgICB9XG4gICAgICB0eENyZWRlbnRpYWxzID0gW25ldyBDcmVkZW50aWFsKGVtcHR5U2lnbmF0dXJlcyldO1xuICAgIH1cblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgsIFtdLCBhZGRyZXNzTWFwcywgdHhDcmVkZW50aWFscyk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uKHVuc2lnbmVkVHgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc3RhdGljIHZlcmlmeVR4VHlwZSh0eG5UeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHhuVHlwZSA9PT0gRmxhcmVUcmFuc2FjdGlvblR5cGUuRXZtSW1wb3J0VHg7XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodHhuVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEltcG9ydEluQ1R4QnVpbGRlci52ZXJpZnlUeFR5cGUodHhuVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIGltcG9ydCBpbiBDLWNoYWluIHRyYW5zYWN0aW9uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBidWlsZEZsYXJlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgLy8gaWYgdHggaGFzIGNyZWRlbnRpYWxzIG9yIHdhcyBhbHJlYWR5IHJlY292ZXJlZCBmcm9tIHJhdywgdHggc2hvdWxkbid0IGNoYW5nZVxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmhhc0NyZWRlbnRpYWxzKSByZXR1cm47XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX3RvLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0byBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWVSYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZlZSByYXRlIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpbnB1dHMsIGFtb3VudCwgY3JlZGVudGlhbHMgfSA9IHRoaXMuY3JlYXRlSW5wdXRzKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgaW1wb3J0IGNvc3QgdW5pdHMgKG1hdGNoaW5nIEFWQVhQJ3MgY29zdEltcG9ydFR4IGFwcHJvYWNoKVxuICAgIC8vIENyZWF0ZSBhIHRlbXBvcmFyeSB0cmFuc2FjdGlvbiB0byBjYWxjdWxhdGUgdGhlIGFjdHVhbCBjb3N0IHVuaXRzXG4gICAgY29uc3QgdGVtcE91dHB1dCA9IG5ldyBldm1TZXJpYWwuT3V0cHV0KFxuICAgICAgbmV3IEFkZHJlc3ModGhpcy50cmFuc2FjdGlvbi5fdG9bMF0pLFxuICAgICAgbmV3IEJpZ0ludFByKGFtb3VudCksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZCwgJ2hleCcpKSlcbiAgICApO1xuICAgIGNvbnN0IHRlbXBJbXBvcnRUeCA9IG5ldyBldm1TZXJpYWwuSW1wb3J0VHgoXG4gICAgICBuZXcgSW50KHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmtJRCksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20odGhpcy50cmFuc2FjdGlvbi5fYmxvY2tjaGFpbklELCAnaGV4JykpKSxcbiAgICAgIG5ldyBJZChuZXcgVWludDhBcnJheSh0aGlzLl9leHRlcm5hbENoYWluSWQpKSxcbiAgICAgIGlucHV0cyxcbiAgICAgIFt0ZW1wT3V0cHV0XVxuICAgICk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGltcG9ydCBjb3N0IHVuaXRzIChtYXRjaGVzIEFWQVhQJ3MgZmVlU2l6ZSBmcm9tIGNvc3RJbXBvcnRUeClcbiAgICBjb25zdCBmZWVTaXplID0gdGhpcy5jYWxjdWxhdGVJbXBvcnRDb3N0KHRlbXBJbXBvcnRUeCk7XG5cbiAgICAvLyBNdWx0aXBseSBmZWVSYXRlIGJ5IGNvc3QgdW5pdHMgKG1hdGNoaW5nIEFWQVhQOiBmZWUgPSBmZWVSYXRlLm11bG4oZmVlU2l6ZSkpXG4gICAgY29uc3QgZmVlUmF0ZSA9IEJpZ0ludCh0aGlzLnRyYW5zYWN0aW9uLl9mZWUuZmVlUmF0ZSk7XG4gICAgY29uc3QgZmVlID0gZmVlUmF0ZSAqIEJpZ0ludChmZWVTaXplKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgPSBmZWUudG9TdHJpbmcoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLl9mZWUuc2l6ZSA9IGZlZVNpemU7XG5cbiAgICAvLyBDcmVhdGUgRVZNIG91dHB1dCB1c2luZyBwcm9wZXIgRmxhcmVKUyBjbGFzcyB3aXRoIGFtb3VudCBtaW51cyBmZWVcbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgZXZtU2VyaWFsLk91dHB1dChcbiAgICAgIG5ldyBBZGRyZXNzKHRoaXMudHJhbnNhY3Rpb24uX3RvWzBdKSxcbiAgICAgIG5ldyBCaWdJbnRQcihhbW91bnQgLSBmZWUpLFxuICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSkpXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSB0aGUgaW1wb3J0IHRyYW5zYWN0aW9uXG4gICAgY29uc3QgaW1wb3J0VHggPSBuZXcgZXZtU2VyaWFsLkltcG9ydFR4KFxuICAgICAgbmV3IEludCh0aGlzLnRyYW5zYWN0aW9uLl9uZXR3b3JrSUQpLFxuICAgICAgbmV3IElkKG5ldyBVaW50OEFycmF5KEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Jsb2NrY2hhaW5JRCwgJ2hleCcpKSksXG4gICAgICBuZXcgSWQobmV3IFVpbnQ4QXJyYXkodGhpcy5fZXh0ZXJuYWxDaGFpbklkKSksXG4gICAgICBpbnB1dHMsXG4gICAgICBbb3V0cHV0XVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgQWRkcmVzc01hcHMgYmFzZWQgb24gc2lnbmF0dXJlIHNsb3Qgb3JkZXIgKG1hdGNoaW5nIGNyZWRlbnRpYWwgb3JkZXIpLCBub3Qgc29ydGVkIGFkZHJlc3Nlc1xuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgYXBwcm9hY2ggdXNlZCBpbiBjcmVkZW50aWFsczogYWRkcmVzc2VzSW5kZXggZGV0ZXJtaW5lcyBzaWduYXR1cmUgb3JkZXJcbiAgICAvLyBBZGRyZXNzTWFwcyBzaG91bGQgbWFwIGFkZHJlc3NlcyB0byBzaWduYXR1cmUgc2xvdHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgY3JlZGVudGlhbHNcbiAgICAvLyBGb3IgQy1jaGFpbiBpbXBvcnRzLCB3ZSB0eXBpY2FsbHkgaGF2ZSBvbmUgaW5wdXQsIHNvIHVzZSB0aGUgZmlyc3QgVVRYT1xuICAgIC8vIFVzZSBjZW50cmFsaXplZCBtZXRob2QgZm9yIEFkZHJlc3NNYXAgY3JlYXRpb25cbiAgICBjb25zdCBmaXJzdFV0eG8gPSB0aGlzLnRyYW5zYWN0aW9uLl91dHhvc1swXTtcbiAgICBjb25zdCBhZGRyZXNzTWFwID0gZmlyc3RVdHhvXG4gICAgICA/IHRoaXMuY3JlYXRlQWRkcmVzc01hcEZvclV0eG8oZmlyc3RVdHhvLCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpXG4gICAgICA6IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXAoKTtcbiAgICBjb25zdCBhZGRyZXNzTWFwcyA9IG5ldyBGbGFyZVV0aWxzLkFkZHJlc3NNYXBzKFthZGRyZXNzTWFwXSk7XG5cbiAgICBjb25zdCB1bnNpZ25lZFR4ID0gbmV3IFVuc2lnbmVkVHgoXG4gICAgICBpbXBvcnRUeCxcbiAgICAgIFtdLCAvLyBFbXB0eSBVVFhPcyBhcnJheSwgd2lsbCBiZSBmaWxsZWQgZHVyaW5nIHByb2Nlc3NpbmdcbiAgICAgIGFkZHJlc3NNYXBzLFxuICAgICAgY3JlZGVudGlhbHNcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbi5zZXRUcmFuc2FjdGlvbih1bnNpZ25lZFR4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgaW5wdXRzIGZyb20gVVRYT3NcbiAgICogQHJldHVybiB7XG4gICAqICAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAqICAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgKiAgICAgYW1vdW50OiBiaWdpbnQ7XG4gICAqIH1cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnB1dHMoKToge1xuICAgIGlucHV0czogVHJhbnNmZXJhYmxlSW5wdXRbXTtcbiAgICBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdO1xuICAgIGFtb3VudDogYmlnaW50O1xuICB9IHtcbiAgICBjb25zdCBzZW5kZXIgPSB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLnNsaWNlKCk7XG4gICAgaWYgKHRoaXMucmVjb3ZlclNpZ25lcikge1xuICAgICAgLy8gc3dpdGNoIGZpcnN0IGFuZCBsYXN0IHNpZ25lclxuICAgICAgY29uc3QgdG1wID0gc2VuZGVyLnBvcCgpO1xuICAgICAgc2VuZGVyLnB1c2goc2VuZGVyWzBdKTtcbiAgICAgIGlmICh0bXApIHtcbiAgICAgICAgc2VuZGVyWzBdID0gdG1wO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0b3RhbEFtb3VudCA9IEJpZ0ludCgwKTtcbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBjcmVkZW50aWFsczogQ3JlZGVudGlhbFtdID0gW107XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLl91dHhvcy5mb3JFYWNoKCh1dHhvKSA9PiB7XG4gICAgICBjb25zdCBhbW91bnQgPSBCaWdJbnQodXR4by5hbW91bnQpO1xuICAgICAgdG90YWxBbW91bnQgKz0gYW1vdW50O1xuXG4gICAgICAvLyBDcmVhdGUgc2lnbmF0dXJlIGluZGljZXMgZm9yIHRocmVzaG9sZFxuICAgICAgY29uc3Qgc2lnSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50cmFuc2FjdGlvbi5fdGhyZXNob2xkOyBpKyspIHtcbiAgICAgICAgc2lnSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2UgZnJvbU5hdGl2ZSB0byBjcmVhdGUgVHJhbnNmZXJhYmxlSW5wdXQgKHNhbWUgcGF0dGVybiBhcyBJbXBvcnRJblBUeEJ1aWxkZXIpXG4gICAgICAvLyBmcm9tTmF0aXZlIGV4cGVjdHMgY2I1OC1lbmNvZGVkIHN0cmluZ3MgZm9yIHR4SWQgYW5kIGFzc2V0SWRcbiAgICAgIGNvbnN0IHR4SWRDYjU4ID0gdXR4by50eGlkOyAvLyBBbHJlYWR5IGNiNTggZW5jb2RlZFxuICAgICAgY29uc3QgYXNzZXRJZENiNTggPSB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQsICdoZXgnKSk7XG5cbiAgICAgIGNvbnN0IHRyYW5zZmVyYWJsZUlucHV0ID0gVHJhbnNmZXJhYmxlSW5wdXQuZnJvbU5hdGl2ZShcbiAgICAgICAgdHhJZENiNTgsXG4gICAgICAgIE51bWJlcih1dHhvLm91dHB1dGlkeCksXG4gICAgICAgIGFzc2V0SWRDYjU4LFxuICAgICAgICBhbW91bnQsXG4gICAgICAgIHNpZ0luZGljZXNcbiAgICAgICk7XG5cbiAgICAgIGlucHV0cy5wdXNoKHRyYW5zZmVyYWJsZUlucHV0KTtcblxuICAgICAgLy8gQ3JlYXRlIGNyZWRlbnRpYWwgd2l0aCBlbXB0eSBzaWduYXR1cmVzIGZvciBzbG90IGlkZW50aWZpY2F0aW9uXG4gICAgICAvLyBNYXRjaCBhdmF4cCBiZWhhdmlvcjogZHluYW1pYyBvcmRlcmluZyBiYXNlZCBvbiBhZGRyZXNzZXNJbmRleCBmcm9tIFVUWE9cbiAgICAgIC8vIFVzZSBjZW50cmFsaXplZCBtZXRob2QgZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIGNyZWRlbnRpYWxzLnB1c2godGhpcy5jcmVhdGVDcmVkZW50aWFsRm9yVXR4byh1dHhvLCB0aGlzLnRyYW5zYWN0aW9uLl90aHJlc2hvbGQpKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBpbnB1dHMsXG4gICAgICBjcmVkZW50aWFscyxcbiAgICAgIGFtb3VudDogdG90YWxBbW91bnQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGltcG9ydCBjb3N0IGZvciBDLWNoYWluIGltcG9ydCB0cmFuc2FjdGlvbnNcbiAgICogTWF0Y2hlcyBBVkFYUCdzIGNvc3RJbXBvcnRUeCBmb3JtdWxhOlxuICAgKiAtIEJhc2UgYnl0ZSBjb3N0OiB0cmFuc2FjdGlvblNpemUgKiB0eEJ5dGVzR2FzICgxIGdhcyBwZXIgYnl0ZSlcbiAgICogLSBQZXItaW5wdXQgY29zdDogbnVtSW5wdXRzICogY29zdFBlclNpZ25hdHVyZSAoMTAwMCBwZXIgc2lnbmF0dXJlKSAqIHRocmVzaG9sZFxuICAgKiAtIEZpeGVkIGZlZTogMTAwMDBcbiAgICpcbiAgICogVGhpcyByZXR1cm5zIGNvc3QgXCJ1bml0c1wiIHRvIGJlIG11bHRpcGxpZWQgYnkgZmVlUmF0ZSwgbWF0Y2hpbmcgQVZBWFAncyBhcHByb2FjaDpcbiAgICogQVZBWFA6IGZlZSA9IGZlZVJhdGUubXVsbihjb3N0SW1wb3J0VHgodHgpKVxuICAgKiBGTFJQOiAgZmVlID0gZmVlUmF0ZSAqIGNhbGN1bGF0ZUltcG9ydENvc3QodHgpXG4gICAqXG4gICAqIEBwYXJhbSB0eCBUaGUgSW1wb3J0VHggdG8gY2FsY3VsYXRlIHRoZSBjb3N0IGZvclxuICAgKiBAcmV0dXJucyBUaGUgdG90YWwgY29zdCB1bml0c1xuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVJbXBvcnRDb3N0KHR4OiBldm1TZXJpYWwuSW1wb3J0VHgpOiBudW1iZXIge1xuICAgIGNvbnN0IGNvZGVjID0gYXZtU2VyaWFsLmdldEFWTU1hbmFnZXIoKS5nZXREZWZhdWx0Q29kZWMoKTtcbiAgICBjb25zdCB0eEJ5dGVzID0gdHgudG9CeXRlcyhjb2RlYyk7XG5cbiAgICAvLyBCYXNlIGJ5dGUgY29zdDogMSBnYXMgcGVyIGJ5dGUgKG1hdGNoaW5nIEFWQVggdHhCeXRlc0dhcylcbiAgICBjb25zdCB0eEJ5dGVzR2FzID0gMTtcbiAgICBsZXQgYnl0ZXNDb3N0ID0gdHhCeXRlcy5sZW5ndGggKiB0eEJ5dGVzR2FzO1xuXG4gICAgLy8gUGVyLWlucHV0IGNvc3Q6IGNvc3RQZXJTaWduYXR1cmUgKDEwMDApIHBlciBzaWduYXR1cmVcbiAgICBjb25zdCBjb3N0UGVyU2lnbmF0dXJlID0gMTAwMDtcbiAgICBjb25zdCBudW1JbnB1dHMgPSB0eC5pbXBvcnRlZElucHV0cy5sZW5ndGg7XG4gICAgY29uc3QgbnVtU2lnbmF0dXJlcyA9IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZDsgLy8gRWFjaCBpbnB1dCByZXF1aXJlcyB0aHJlc2hvbGQgc2lnbmF0dXJlc1xuICAgIGNvbnN0IGlucHV0Q29zdCA9IG51bUlucHV0cyAqIGNvc3RQZXJTaWduYXR1cmUgKiBudW1TaWduYXR1cmVzO1xuICAgIGJ5dGVzQ29zdCArPSBpbnB1dENvc3Q7XG5cbiAgICAvLyBGaXhlZCBmZWUgY29tcG9uZW50XG4gICAgY29uc3QgZml4ZWRGZWUgPSAxMDAwMDtcbiAgICBjb25zdCB0b3RhbENvc3QgPSBieXRlc0Nvc3QgKyBmaXhlZEZlZTtcblxuICAgIHJldHVybiB0b3RhbENvc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBmZWUgc2l6ZSBmb3IgdGhlIHRyYW5zYWN0aW9uIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gICAqIEZvciBDLWNoYWluIGltcG9ydHMsIHRoZSBmZWVSYXRlIGlzIHRyZWF0ZWQgYXMgYW4gYWJzb2x1dGUgZmVlIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUZlZVNpemUodHg/OiBldm1TZXJpYWwuSW1wb3J0VHgpOiBudW1iZXIge1xuICAgIC8vIElmIHR4IGlzIHByb3ZpZGVkLCBjYWxjdWxhdGUgYmFzZWQgb24gYWN0dWFsIHRyYW5zYWN0aW9uIHNpemVcbiAgICBpZiAodHgpIHtcbiAgICAgIGNvbnN0IGNvZGVjID0gYXZtU2VyaWFsLmdldEFWTU1hbmFnZXIoKS5nZXREZWZhdWx0Q29kZWMoKTtcbiAgICAgIHJldHVybiB0eC50b0J5dGVzKGNvZGVjKS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gRm9yIEMtY2hhaW4gaW1wb3J0cywgdHJlYXQgZmVlUmF0ZSBhcyB0aGUgYWJzb2x1dGUgZmVlIChtdWx0aXBsaWVyIG9mIDEpXG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3ZlciBVVFhPcyBmcm9tIGltcG9ydGVkIGlucHV0c1xuICAgKiBAcGFyYW0gaW1wb3J0ZWRJbnB1dHMgQXJyYXkgb2YgdHJhbnNmZXJhYmxlIGlucHV0c1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKi9cbiAgcHJpdmF0ZSByZWNvdmVyVXR4b3MoaW1wb3J0ZWRJbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10pOiBEZWNvZGVkVXR4b09ialtdIHtcbiAgICByZXR1cm4gaW1wb3J0ZWRJbnB1dHMubWFwKChpbnB1dCkgPT4ge1xuICAgICAgY29uc3QgdHhpZCA9IGlucHV0LnV0eG9JRC50b1N0cmluZygpO1xuICAgICAgY29uc3Qgb3V0cHV0aWR4ID0gaW5wdXQudXR4b0lELm91dHB1dElkeC50b1N0cmluZygpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvdXRwdXRJRDogU0VDUDI1NksxX1RyYW5zZmVyX091dHB1dCxcbiAgICAgICAgYW1vdW50OiBpbnB1dC5hbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICB0eGlkOiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlci5mcm9tKHR4aWQsICdoZXgnKSksXG4gICAgICAgIG91dHB1dGlkeDogb3V0cHV0aWR4LFxuICAgICAgICB0aHJlc2hvbGQ6IHRoaXMudHJhbnNhY3Rpb24uX3RocmVzaG9sZCxcbiAgICAgICAgYWRkcmVzc2VzOiB0aGlzLnRyYW5zYWN0aW9uLl9mcm9tQWRkcmVzc2VzLm1hcCgoYWRkcikgPT5cbiAgICAgICAgICB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbi5fbmV0d29yay5ocnAsIHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsuYWxpYXMsIEJ1ZmZlci5mcm9tKGFkZHIpKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { TransactionType } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { AtomicTransactionBuilder } from './atomicTransactionBuilder';
|
|
4
|
+
import { TransferableInput, Credential } from '@flarenetwork/flarejs';
|
|
5
|
+
import { Tx } from './iface';
|
|
6
|
+
export declare class ImportInPTxBuilder extends AtomicTransactionBuilder {
|
|
7
|
+
constructor(_coinConfig: Readonly<CoinConfig>);
|
|
8
|
+
protected get transactionType(): TransactionType;
|
|
9
|
+
initBuilder(tx: Tx, rawBytes?: Buffer, parsedCredentials?: Credential[]): this;
|
|
10
|
+
static verifyTxType(txnType: string): boolean;
|
|
11
|
+
verifyTxType(txnType: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Build the import transaction for P-chain
|
|
14
|
+
* @protected
|
|
15
|
+
*/
|
|
16
|
+
protected buildFlareTransaction(): void;
|
|
17
|
+
/**
|
|
18
|
+
* Create inputs from UTXOs for P-chain import
|
|
19
|
+
* @returns inputs, credentials, and total amount
|
|
20
|
+
*/
|
|
21
|
+
protected createImportInputs(): {
|
|
22
|
+
inputs: TransferableInput[];
|
|
23
|
+
credentials: Credential[];
|
|
24
|
+
totalAmount: bigint;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Recover UTXOs from imported inputs
|
|
28
|
+
* @param importedInputs Array of transferable inputs
|
|
29
|
+
* @returns Array of decoded UTXO objects
|
|
30
|
+
*/
|
|
31
|
+
private recoverUtxos;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ImportInPTxBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportInPTxBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/ImportInPTxBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAuC,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAML,iBAAiB,EAQjB,UAAU,EAEX,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAmE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE9F,qBAAa,kBAAmB,SAAQ,wBAAwB;gBAClD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAY7C,SAAS,KAAK,eAAe,IAAI,eAAe,CAE/C;IAED,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI;IA0E9E,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI7C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItC;;;OAGG;IACH,SAAS,CAAC,qBAAqB,IAAI,IAAI;IAkEvC;;;OAGG;IACH,SAAS,CAAC,kBAAkB,IAAI;QAC9B,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,WAAW,EAAE,UAAU,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB;IAqDD;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
|