@bitgo-beta/sdk-coin-flrp 1.0.1-beta.69 → 1.0.1-beta.70
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 +91 -0
- package/dist/src/flrp.d.ts.map +1 -0
- package/dist/src/flrp.js +343 -0
- package/dist/src/iface.d.ts +25 -0
- package/dist/src/iface.d.ts.map +1 -0
- package/dist/src/iface.js +3 -0
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +45 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts +26 -0
- package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicInCTransactionBuilder.js +64 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts +96 -0
- package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/atomicTransactionBuilder.js +318 -0
- package/dist/src/lib/constants.d.ts +170 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +227 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
- package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/delegatorTxBuilder.js +224 -0
- package/dist/src/lib/errors.d.ts +8 -0
- package/dist/src/lib/errors.d.ts.map +1 -0
- package/dist/src/lib/errors.js +19 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts +77 -0
- package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportInCTxBuilder.js +199 -0
- package/dist/src/lib/exportInPTxBuilder.d.ts +30 -0
- package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/exportInPTxBuilder.js +120 -0
- package/dist/src/lib/iface.d.ts +119 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +22 -0
- package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
- package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInCTxBuilder.js +403 -0
- package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
- package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/importInPTxBuilder.js +464 -0
- package/dist/src/lib/index.d.ts +12 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +39 -0
- package/dist/src/lib/keyPair.d.ts +58 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +142 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
- package/dist/src/lib/transaction.d.ts +111 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +322 -0
- package/dist/src/lib/transactionBuilder.d.ts +85 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +167 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +91 -0
- package/dist/src/lib/types.d.ts +78 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +5 -0
- package/dist/src/lib/utils.d.ts +217 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +498 -0
- package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
- package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
- package/dist/src/lib/validatorTxBuilder.js +180 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +11 -0
- package/dist/src/tflrp.d.ts +8 -0
- package/dist/src/tflrp.d.ts.map +1 -0
- package/dist/src/tflrp.js +14 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
- package/dist/test/unit/flrp.d.ts +2 -0
- package/dist/test/unit/flrp.d.ts.map +1 -0
- package/dist/test/unit/flrp.js +118 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +2 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/lib/atomicTransactionBuilder.js +222 -0
- 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 +584 -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 +377 -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 +257 -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 +500 -0
- package/dist/test/unit/lib/transaction.d.ts +2 -0
- package/dist/test/unit/lib/transaction.d.ts.map +1 -0
- package/dist/test/unit/lib/transaction.js +460 -0
- package/dist/test/unit/lib/utils.d.ts +2 -0
- package/dist/test/unit/lib/utils.d.ts.map +1 -0
- package/dist/test/unit/lib/utils.js +286 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
- package/dist/test/unit/smoke.d.ts +2 -0
- package/dist/test/unit/smoke.d.ts.map +1 -0
- package/dist/test/unit/smoke.js +23 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +114 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
- package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/validatorTxBuilder.test.js +293 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,64 @@
|
|
|
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.AtomicInCTransactionBuilder = void 0;
|
|
7
|
+
const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
|
|
8
|
+
const utils_1 = __importDefault(require("./utils"));
|
|
9
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
10
|
+
/**
|
|
11
|
+
* Flare P->C atomic import/export style builder (C-chain context). This adapts the AVAXP logic
|
|
12
|
+
* removing direct Avalanche SDK dependencies. Network / chain ids are expected to be provided
|
|
13
|
+
* in the transaction._network object by a higher-level factory once Flare network constants
|
|
14
|
+
* are finalized. For now we CB58-decode placeholders if present and default to zero buffers.
|
|
15
|
+
*/
|
|
16
|
+
class AtomicInCTransactionBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
|
|
17
|
+
constructor(_coinConfig) {
|
|
18
|
+
super(_coinConfig);
|
|
19
|
+
// Placeholder fixed fee (can be overridden by subclasses or network config)
|
|
20
|
+
this.fixedFee = 0n;
|
|
21
|
+
this.initializeChainIds();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Set base fee (already scaled to Flare C-chain native decimals). Accept bigint | number | string.
|
|
25
|
+
*/
|
|
26
|
+
feeRate(baseFee) {
|
|
27
|
+
const n = typeof baseFee === 'bigint' ? baseFee : BigInt(baseFee);
|
|
28
|
+
this.validateFee(n);
|
|
29
|
+
this.setFeeRate(n);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Recreate builder state from raw tx (hex). Flare C-chain support TBD; for now validate & stash.
|
|
34
|
+
*/
|
|
35
|
+
fromImplementation(rawTransaction) {
|
|
36
|
+
// If utils has validateRawTransaction use it; otherwise basic check
|
|
37
|
+
if (utils_1.default.validateRawTransaction) {
|
|
38
|
+
utils_1.default.validateRawTransaction(rawTransaction);
|
|
39
|
+
}
|
|
40
|
+
this.transaction.setTransaction(rawTransaction);
|
|
41
|
+
return this.transaction;
|
|
42
|
+
}
|
|
43
|
+
validateFee(fee) {
|
|
44
|
+
if (fee <= 0n) {
|
|
45
|
+
throw new sdk_core_1.BuildTransactionError('Fee must be greater than 0');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
initializeChainIds() {
|
|
49
|
+
const meta = this.transaction._network;
|
|
50
|
+
if (meta?.blockchainID) {
|
|
51
|
+
this._externalChainId = utils_1.default.cb58Decode(meta.blockchainID);
|
|
52
|
+
}
|
|
53
|
+
if (meta?.cChainBlockchainID) {
|
|
54
|
+
this.transaction._blockchainID = utils_1.default.cb58Decode(meta.cChainBlockchainID);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
setFeeRate(n) {
|
|
58
|
+
const currentContainer = this.transaction;
|
|
59
|
+
const current = currentContainer._fee || { fee: '0' };
|
|
60
|
+
currentContainer._fee = { ...current, feeRate: n.toString() };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.AtomicInCTransactionBuilder = AtomicInCTransactionBuilder;
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUVBQXNFO0FBRXRFLG9EQUE0QjtBQUM1QixtREFBNkQ7QUFhN0Q7Ozs7O0dBS0c7QUFDSCxNQUFzQiwyQkFBNEIsU0FBUSxtREFBd0I7SUFHaEYsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFIckIsNEVBQTRFO1FBQ2xFLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFHdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLE9BQWlDO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCLENBQUMsY0FBc0I7UUFDakQsb0VBQW9FO1FBQ3BFLElBQUssZUFBcUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2pHLGVBQW9FLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVyxDQUFDLEdBQVc7UUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksZ0NBQXFCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQWlDLENBQUM7UUFDaEUsSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0UsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsQ0FBUztRQUMxQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUE0QyxDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0RCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDaEUsQ0FBQztDQUNGO0FBbkRELGtFQW1EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW50ZXJmYWNlIEZsYXJlQ2hhaW5OZXR3b3JrTWV0YSB7XG4gIGJsb2NrY2hhaW5JRD86IHN0cmluZzsgLy8gUC1jaGFpbiBpZCAoZXh0ZXJuYWwpXG4gIGNDaGFpbkJsb2NrY2hhaW5JRD86IHN0cmluZzsgLy8gQy1jaGFpbiBpZCAobG9jYWwpXG4gIFtrOiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgRmVlU2hhcGUge1xuICBmZWU/OiBzdHJpbmc7IC8vIGxlZ2FjeVxuICBmZWVSYXRlPzogc3RyaW5nOyAvLyBwZXIgdW5pdCByYXRlXG59XG5cbi8qKlxuICogRmxhcmUgUC0+QyBhdG9taWMgaW1wb3J0L2V4cG9ydCBzdHlsZSBidWlsZGVyIChDLWNoYWluIGNvbnRleHQpLiBUaGlzIGFkYXB0cyB0aGUgQVZBWFAgbG9naWNcbiAqIHJlbW92aW5nIGRpcmVjdCBBdmFsYW5jaGUgU0RLIGRlcGVuZGVuY2llcy4gTmV0d29yayAvIGNoYWluIGlkcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcHJvdmlkZWRcbiAqIGluIHRoZSB0cmFuc2FjdGlvbi5fbmV0d29yayBvYmplY3QgYnkgYSBoaWdoZXItbGV2ZWwgZmFjdG9yeSBvbmNlIEZsYXJlIG5ldHdvcmsgY29uc3RhbnRzXG4gKiBhcmUgZmluYWxpemVkLiBGb3Igbm93IHdlIENCNTgtZGVjb2RlIHBsYWNlaG9sZGVycyBpZiBwcmVzZW50IGFuZCBkZWZhdWx0IHRvIHplcm8gYnVmZmVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIC8vIFBsYWNlaG9sZGVyIGZpeGVkIGZlZSAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyBvciBuZXR3b3JrIGNvbmZpZylcbiAgcHJvdGVjdGVkIGZpeGVkRmVlID0gMG47XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemVDaGFpbklkcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBiYXNlIGZlZSAoYWxyZWFkeSBzY2FsZWQgdG8gRmxhcmUgQy1jaGFpbiBuYXRpdmUgZGVjaW1hbHMpLiBBY2NlcHQgYmlnaW50IHwgbnVtYmVyIHwgc3RyaW5nLlxuICAgKi9cbiAgZmVlUmF0ZShiYXNlRmVlOiBiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIGJhc2VGZWUgPT09ICdiaWdpbnQnID8gYmFzZUZlZSA6IEJpZ0ludChiYXNlRmVlKTtcbiAgICB0aGlzLnZhbGlkYXRlRmVlKG4pO1xuICAgIHRoaXMuc2V0RmVlUmF0ZShuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNyZWF0ZSBidWlsZGVyIHN0YXRlIGZyb20gcmF3IHR4IChoZXgpLiBGbGFyZSBDLWNoYWluIHN1cHBvcnQgVEJEOyBmb3Igbm93IHZhbGlkYXRlICYgc3Rhc2guXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB7IF90eD86IHVua25vd24gfSB7XG4gICAgLy8gSWYgdXRpbHMgaGFzIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24gdXNlIGl0OyBvdGhlcndpc2UgYmFzaWMgY2hlY2tcbiAgICBpZiAoKHV0aWxzIGFzIHVua25vd24gYXMgeyB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uPzogKHI6IHN0cmluZykgPT4gdm9pZCB9KS52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICAodXRpbHMgYXMgdW5rbm93biBhcyB7IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb246IChyOiBzdHJpbmcpID0+IHZvaWQgfSkudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgfVxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZlZShmZWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChmZWUgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ZlZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhaW5JZHMoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsgYXMgRmxhcmVDaGFpbk5ldHdvcmtNZXRhO1xuICAgIGlmIChtZXRhPy5ibG9ja2NoYWluSUQpIHtcbiAgICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IHV0aWxzLmNiNThEZWNvZGUobWV0YS5ibG9ja2NoYWluSUQpO1xuICAgIH1cbiAgICBpZiAobWV0YT8uY0NoYWluQmxvY2tjaGFpbklEKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQgPSB1dGlscy5jYjU4RGVjb2RlKG1ldGEuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZlZVJhdGUobjogYmlnaW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHRoaXMudHJhbnNhY3Rpb24gYXMgdW5rbm93biBhcyB7IF9mZWU6IEZlZVNoYXBlIH07XG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRDb250YWluZXIuX2ZlZSB8fCB7IGZlZTogJzAnIH07XG4gICAgY3VycmVudENvbnRhaW5lci5fZmVlID0geyAuLi5jdXJyZW50LCBmZWVSYXRlOiBuLnRvU3RyaW5nKCkgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
2
|
+
import { TransactionType, BaseTransaction } from '@bitgo-beta/sdk-core';
|
|
3
|
+
import { Credential, TransferableInput, TransferableOutput } from '@flarenetwork/flarejs';
|
|
4
|
+
import { TransactionExplanation, DecodedUtxoObj } from './iface';
|
|
5
|
+
/**
|
|
6
|
+
* Flare P-chain atomic transaction builder with FlareJS credential support.
|
|
7
|
+
* This provides the foundation for building Flare P-chain transactions with proper
|
|
8
|
+
* credential handling using FlareJS Credential and Signature classes.
|
|
9
|
+
*/
|
|
10
|
+
export declare abstract class AtomicTransactionBuilder {
|
|
11
|
+
protected readonly _coinConfig: Readonly<CoinConfig>;
|
|
12
|
+
protected _externalChainId: Buffer | undefined;
|
|
13
|
+
protected _utxos: DecodedUtxoObj[];
|
|
14
|
+
protected transaction: {
|
|
15
|
+
_network: Record<string, unknown>;
|
|
16
|
+
_networkID: number;
|
|
17
|
+
_blockchainID: Buffer;
|
|
18
|
+
_assetId: Buffer;
|
|
19
|
+
_fromAddresses: string[];
|
|
20
|
+
_to: string[];
|
|
21
|
+
_locktime: bigint;
|
|
22
|
+
_threshold: number;
|
|
23
|
+
_fee: {
|
|
24
|
+
fee: string;
|
|
25
|
+
feeRate?: string;
|
|
26
|
+
size?: number;
|
|
27
|
+
};
|
|
28
|
+
hasCredentials: boolean;
|
|
29
|
+
_tx?: unknown;
|
|
30
|
+
_signature?: unknown;
|
|
31
|
+
setTransaction: (tx: unknown) => void;
|
|
32
|
+
};
|
|
33
|
+
constructor(coinConfig: Readonly<CoinConfig>);
|
|
34
|
+
protected abstract get transactionType(): TransactionType;
|
|
35
|
+
/**
|
|
36
|
+
* Get the asset ID for Flare network transactions
|
|
37
|
+
* @returns Buffer containing the asset ID
|
|
38
|
+
*/
|
|
39
|
+
protected getAssetId(): Buffer;
|
|
40
|
+
validateAmount(amount: bigint): void;
|
|
41
|
+
/**
|
|
42
|
+
* Validates that credentials array is properly formed
|
|
43
|
+
* @param credentials - Array of credentials to validate
|
|
44
|
+
*/
|
|
45
|
+
protected validateCredentials(credentials: Credential[]): void;
|
|
46
|
+
/**
|
|
47
|
+
* Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
|
|
48
|
+
* Based on AVAX P-chain implementation adapted for FlareJS.
|
|
49
|
+
*
|
|
50
|
+
* Note: This is a simplified implementation that creates the core structure.
|
|
51
|
+
* The FlareJS type system integration will be refined in future iterations.
|
|
52
|
+
*
|
|
53
|
+
* @param total - Total amount needed including fees
|
|
54
|
+
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
55
|
+
*/
|
|
56
|
+
protected createInputOutput(total: bigint): {
|
|
57
|
+
inputs: TransferableInput[];
|
|
58
|
+
outputs: TransferableOutput[];
|
|
59
|
+
credentials: Credential[];
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Set UTXOs for the transaction. This is required for creating inputs and outputs.
|
|
63
|
+
*
|
|
64
|
+
* @param utxos - Array of decoded UTXO objects
|
|
65
|
+
* @returns this builder instance for chaining
|
|
66
|
+
*/
|
|
67
|
+
utxos(utxos: DecodedUtxoObj[]): this;
|
|
68
|
+
/**
|
|
69
|
+
* Flare equivalent of Avalanche's SelectCredentialClass
|
|
70
|
+
* Creates a credential with the provided signatures
|
|
71
|
+
*
|
|
72
|
+
* @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
|
|
73
|
+
* @param signatures - Array of signature hex strings or empty strings for placeholders
|
|
74
|
+
* @returns Credential instance
|
|
75
|
+
*/
|
|
76
|
+
protected createFlareCredential(_credentialId: number, signatures: string[]): Credential;
|
|
77
|
+
/**
|
|
78
|
+
* Base initBuilder used by concrete builders. For now just returns this so fluent API works.
|
|
79
|
+
*/
|
|
80
|
+
initBuilder(_tx: unknown): this;
|
|
81
|
+
/**
|
|
82
|
+
* Sign transaction with private key using FlareJS compatibility
|
|
83
|
+
*/
|
|
84
|
+
sign(params: {
|
|
85
|
+
key: string;
|
|
86
|
+
}): this;
|
|
87
|
+
/**
|
|
88
|
+
* Build the transaction using FlareJS compatibility
|
|
89
|
+
*/
|
|
90
|
+
build(): Promise<BaseTransaction>;
|
|
91
|
+
/**
|
|
92
|
+
* Parse and explain a transaction from hex using FlareJS compatibility
|
|
93
|
+
*/
|
|
94
|
+
explainTransaction(): TransactionExplanation;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=atomicTransactionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAa,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAoCjE;;;;GAIG;AACH,8BAAsB,wBAAwB;IAC5C,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErD,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAM;IAExC,SAAS,CAAC,WAAW,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,cAAc,EAAE,OAAO,CAAC;QACxB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAcC;gBAEU,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D;;;OAGG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAY9B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAY9D;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IA8FD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU;IAmDxF;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA0BnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAyDvC;;OAEG;IACH,kBAAkB,IAAI,sBAAsB;CAoB7C"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AtomicTransactionBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const flarejs_1 = require("@flarenetwork/flarejs");
|
|
6
|
+
const constants_1 = require("./constants");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
/**
|
|
9
|
+
* Flare P-chain atomic transaction builder with FlareJS credential support.
|
|
10
|
+
* This provides the foundation for building Flare P-chain transactions with proper
|
|
11
|
+
* credential handling using FlareJS Credential and Signature classes.
|
|
12
|
+
*/
|
|
13
|
+
class AtomicTransactionBuilder {
|
|
14
|
+
constructor(coinConfig) {
|
|
15
|
+
this._utxos = [];
|
|
16
|
+
this.transaction = {
|
|
17
|
+
_network: {},
|
|
18
|
+
_networkID: constants_1.DEFAULT_NETWORK_ID,
|
|
19
|
+
_blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
20
|
+
_assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
|
|
21
|
+
_fromAddresses: [],
|
|
22
|
+
_to: [],
|
|
23
|
+
_locktime: constants_1.DEFAULT_LOCKTIME,
|
|
24
|
+
_threshold: constants_1.DEFAULT_THRESHOLD,
|
|
25
|
+
_fee: { fee: constants_1.AMOUNT_STRING_ZERO },
|
|
26
|
+
hasCredentials: false,
|
|
27
|
+
setTransaction: function (_tx) {
|
|
28
|
+
this._tx = _tx;
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
this._coinConfig = coinConfig;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get the asset ID for Flare network transactions
|
|
35
|
+
* @returns Buffer containing the asset ID
|
|
36
|
+
*/
|
|
37
|
+
getAssetId() {
|
|
38
|
+
// Use the asset ID from transaction if already set
|
|
39
|
+
if (this.transaction._assetId && this.transaction._assetId.length > 0) {
|
|
40
|
+
return this.transaction._assetId;
|
|
41
|
+
}
|
|
42
|
+
// For native FLR transactions, return zero-filled buffer as placeholder
|
|
43
|
+
// In a real implementation, this would be obtained from the network configuration
|
|
44
|
+
// or FlareJS API to get the actual native asset ID
|
|
45
|
+
return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
|
|
46
|
+
}
|
|
47
|
+
validateAmount(amount) {
|
|
48
|
+
if (amount <= constants_1.ZERO_BIGINT) {
|
|
49
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Validates that credentials array is properly formed
|
|
54
|
+
* @param credentials - Array of credentials to validate
|
|
55
|
+
*/
|
|
56
|
+
validateCredentials(credentials) {
|
|
57
|
+
if (!Array.isArray(credentials)) {
|
|
58
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_CREDENTIALS_ARRAY);
|
|
59
|
+
}
|
|
60
|
+
credentials.forEach((credential, index) => {
|
|
61
|
+
if (!(credential instanceof flarejs_1.Credential)) {
|
|
62
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid credential at index ${index}`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
|
|
68
|
+
* Based on AVAX P-chain implementation adapted for FlareJS.
|
|
69
|
+
*
|
|
70
|
+
* Note: This is a simplified implementation that creates the core structure.
|
|
71
|
+
* The FlareJS type system integration will be refined in future iterations.
|
|
72
|
+
*
|
|
73
|
+
* @param total - Total amount needed including fees
|
|
74
|
+
* @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
|
|
75
|
+
*/
|
|
76
|
+
createInputOutput(total) {
|
|
77
|
+
if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
|
|
78
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
|
|
79
|
+
}
|
|
80
|
+
const inputs = [];
|
|
81
|
+
const outputs = [];
|
|
82
|
+
const credentials = [];
|
|
83
|
+
let inputSum = 0n;
|
|
84
|
+
const addressIndices = {};
|
|
85
|
+
let nextAddressIndex = 0;
|
|
86
|
+
// Sort UTXOs by amount in descending order for optimal coin selection
|
|
87
|
+
const sortedUtxos = [...this._utxos].sort((a, b) => {
|
|
88
|
+
const amountA = BigInt(a.amount);
|
|
89
|
+
const amountB = BigInt(b.amount);
|
|
90
|
+
if (amountA > amountB)
|
|
91
|
+
return -1;
|
|
92
|
+
if (amountA < amountB)
|
|
93
|
+
return 1;
|
|
94
|
+
return 0;
|
|
95
|
+
});
|
|
96
|
+
// Process UTXOs to create inputs and credentials
|
|
97
|
+
for (const utxo of sortedUtxos) {
|
|
98
|
+
const utxoAmount = BigInt(utxo.amount);
|
|
99
|
+
if (inputSum >= total) {
|
|
100
|
+
break; // We have enough inputs
|
|
101
|
+
}
|
|
102
|
+
// Track input sum
|
|
103
|
+
inputSum += utxoAmount;
|
|
104
|
+
// Track address indices for signature ordering (mimics AVAX pattern)
|
|
105
|
+
const addressIndexArray = [];
|
|
106
|
+
for (const address of utxo.addresses) {
|
|
107
|
+
if (!(address in addressIndices)) {
|
|
108
|
+
addressIndices[address] = nextAddressIndex++;
|
|
109
|
+
}
|
|
110
|
+
addressIndexArray.push(addressIndices[address]);
|
|
111
|
+
}
|
|
112
|
+
// Store address indices on the UTXO for credential creation
|
|
113
|
+
utxo.addressesIndex = addressIndexArray;
|
|
114
|
+
// Create TransferableInput for atomic transactions
|
|
115
|
+
const transferableInput = {
|
|
116
|
+
txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
|
|
117
|
+
outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
|
|
118
|
+
assetID: this.getAssetId(),
|
|
119
|
+
input: {
|
|
120
|
+
amount: utxoAmount,
|
|
121
|
+
addressIndices: addressIndexArray,
|
|
122
|
+
threshold: utxo.threshold,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
// Store the input (type assertion for compatibility)
|
|
126
|
+
inputs.push(transferableInput);
|
|
127
|
+
// Create credential with placeholder signatures
|
|
128
|
+
// In a real implementation, these would be actual signatures
|
|
129
|
+
const signatures = Array.from({ length: utxo.threshold }, () => '');
|
|
130
|
+
const credential = this.createFlareCredential(0, signatures);
|
|
131
|
+
credentials.push(credential);
|
|
132
|
+
}
|
|
133
|
+
// Verify we have enough inputs
|
|
134
|
+
if (inputSum < total) {
|
|
135
|
+
throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
|
|
136
|
+
}
|
|
137
|
+
// Create change output if we have excess input amount
|
|
138
|
+
if (inputSum > total) {
|
|
139
|
+
const changeAmount = inputSum - total;
|
|
140
|
+
// Create change output for atomic transactions
|
|
141
|
+
const changeOutput = {
|
|
142
|
+
assetID: this.getAssetId(),
|
|
143
|
+
output: {
|
|
144
|
+
amount: changeAmount,
|
|
145
|
+
addresses: this.transaction._fromAddresses,
|
|
146
|
+
threshold: 1,
|
|
147
|
+
locktime: 0n,
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
// Add the change output (type assertion for compatibility)
|
|
151
|
+
outputs.push(changeOutput);
|
|
152
|
+
}
|
|
153
|
+
return { inputs, outputs, credentials };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Set UTXOs for the transaction. This is required for creating inputs and outputs.
|
|
157
|
+
*
|
|
158
|
+
* @param utxos - Array of decoded UTXO objects
|
|
159
|
+
* @returns this builder instance for chaining
|
|
160
|
+
*/
|
|
161
|
+
utxos(utxos) {
|
|
162
|
+
this._utxos = utxos;
|
|
163
|
+
return this;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Flare equivalent of Avalanche's SelectCredentialClass
|
|
167
|
+
* Creates a credential with the provided signatures
|
|
168
|
+
*
|
|
169
|
+
* @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
|
|
170
|
+
* @param signatures - Array of signature hex strings or empty strings for placeholders
|
|
171
|
+
* @returns Credential instance
|
|
172
|
+
*/
|
|
173
|
+
createFlareCredential(_credentialId, signatures) {
|
|
174
|
+
if (!Array.isArray(signatures)) {
|
|
175
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
|
|
176
|
+
}
|
|
177
|
+
if (signatures.length === constants_1.ZERO_NUMBER) {
|
|
178
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
|
|
179
|
+
}
|
|
180
|
+
const sigs = signatures.map((sig, index) => {
|
|
181
|
+
// Handle empty/placeholder signatures
|
|
182
|
+
if (!sig || sig.length === 0) {
|
|
183
|
+
return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
|
|
184
|
+
}
|
|
185
|
+
// Validate hex string format
|
|
186
|
+
const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
|
|
187
|
+
if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
|
|
188
|
+
throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
|
|
189
|
+
}
|
|
190
|
+
// Convert to buffer and validate length
|
|
191
|
+
const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
|
|
192
|
+
if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
|
|
193
|
+
throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
|
|
194
|
+
}
|
|
195
|
+
// Create fixed-length buffer and copy signature data
|
|
196
|
+
const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
|
|
197
|
+
sigBuffer.copy(fixedLengthBuffer);
|
|
198
|
+
try {
|
|
199
|
+
return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
|
|
200
|
+
}
|
|
201
|
+
catch (error) {
|
|
202
|
+
throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
try {
|
|
206
|
+
return new flarejs_1.Credential(sigs);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Base initBuilder used by concrete builders. For now just returns this so fluent API works.
|
|
214
|
+
*/
|
|
215
|
+
initBuilder(_tx) {
|
|
216
|
+
return this;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Sign transaction with private key using FlareJS compatibility
|
|
220
|
+
*/
|
|
221
|
+
sign(params) {
|
|
222
|
+
// FlareJS signing implementation with atomic transaction support
|
|
223
|
+
try {
|
|
224
|
+
// Validate private key format (placeholder implementation)
|
|
225
|
+
if (!params.key || params.key.length < constants_1.PRIVATE_KEY_HEX_LENGTH) {
|
|
226
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
|
|
227
|
+
}
|
|
228
|
+
// Create signature structure
|
|
229
|
+
const signature = {
|
|
230
|
+
privateKey: params.key,
|
|
231
|
+
signingMethod: constants_1.SIGNING_METHOD,
|
|
232
|
+
};
|
|
233
|
+
// Store signature for FlareJS compatibility
|
|
234
|
+
this.transaction._signature = signature;
|
|
235
|
+
this.transaction.hasCredentials = true;
|
|
236
|
+
return this;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Build the transaction using FlareJS compatibility
|
|
244
|
+
*/
|
|
245
|
+
async build() {
|
|
246
|
+
// FlareJS UnsignedTx creation with atomic transaction support
|
|
247
|
+
try {
|
|
248
|
+
// Validate transaction requirements
|
|
249
|
+
if (!this._utxos || this._utxos.length === 0) {
|
|
250
|
+
throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
|
|
251
|
+
}
|
|
252
|
+
// Create FlareJS transaction structure with atomic support
|
|
253
|
+
const transaction = {
|
|
254
|
+
_id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
255
|
+
_inputs: [],
|
|
256
|
+
_outputs: [],
|
|
257
|
+
_type: this.transactionType,
|
|
258
|
+
signature: [],
|
|
259
|
+
fromAddresses: this.transaction._fromAddresses,
|
|
260
|
+
validationErrors: [],
|
|
261
|
+
// FlareJS methods with atomic support
|
|
262
|
+
toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
|
|
263
|
+
toJson: () => ({
|
|
264
|
+
type: this.transactionType,
|
|
265
|
+
}),
|
|
266
|
+
explainTransaction: () => ({
|
|
267
|
+
type: this.transactionType,
|
|
268
|
+
inputs: [],
|
|
269
|
+
outputs: [],
|
|
270
|
+
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
271
|
+
rewardAddresses: [],
|
|
272
|
+
id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
273
|
+
changeOutputs: [],
|
|
274
|
+
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
275
|
+
fee: { fee: this.transaction._fee.fee },
|
|
276
|
+
}),
|
|
277
|
+
isTransactionForCChain: false,
|
|
278
|
+
loadInputsAndOutputs: () => {
|
|
279
|
+
/* FlareJS atomic transaction loading */
|
|
280
|
+
},
|
|
281
|
+
inputs: () => [],
|
|
282
|
+
outputs: () => [],
|
|
283
|
+
fee: () => ({ fee: this.transaction._fee.fee }),
|
|
284
|
+
feeRate: () => 0,
|
|
285
|
+
id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
|
|
286
|
+
type: this.transactionType,
|
|
287
|
+
};
|
|
288
|
+
return transaction;
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Parse and explain a transaction from hex using FlareJS compatibility
|
|
296
|
+
*/
|
|
297
|
+
explainTransaction() {
|
|
298
|
+
// FlareJS transaction parsing with atomic support
|
|
299
|
+
try {
|
|
300
|
+
return {
|
|
301
|
+
type: this.transactionType,
|
|
302
|
+
inputs: [],
|
|
303
|
+
outputs: [],
|
|
304
|
+
outputAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
305
|
+
rewardAddresses: [],
|
|
306
|
+
id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
|
|
307
|
+
changeOutputs: [],
|
|
308
|
+
changeAmount: constants_1.AMOUNT_STRING_ZERO,
|
|
309
|
+
fee: { fee: this.transaction._fee.fee },
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
|
|
318
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCwgU2lnbmF0dXJlLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBBU1NFVF9JRF9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEgsXG4gIFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgsXG4gIFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RILFxuICBUUkFOU0FDVElPTl9JRF9QUkVGSVgsXG4gIERFRkFVTFRfTkVUV09SS19JRCxcbiAgRU1QVFlfQlVGRkVSX1NJWkUsXG4gIEhFWF9QUkVGSVgsXG4gIEhFWF9QUkVGSVhfTEVOR1RILFxuICBERUNJTUFMX1JBRElYLFxuICBTSUdOSU5HX01FVEhPRCxcbiAgQU1PVU5UX1NUUklOR19aRVJPLFxuICBERUZBVUxUX0xPQ0tUSU1FLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBFUlJPUl9BTU9VTlRfUE9TSVRJVkUsXG4gIEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRCxcbiAgRVJST1JfU0lHTkFUVVJFU19BUlJBWSxcbiAgRVJST1JfU0lHTkFUVVJFU19FTVBUWSxcbiAgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSxcbiAgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQsXG4gIEVSUk9SX0VOSEFOQ0VEX0JVSUxEX0ZBSUxFRCxcbiAgRVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVELFxuICBFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVELFxuICBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQsXG4gIEVSUk9SX1VOS05PV04sXG4gIEZMQVJFX0FUT01JQ19QUkVGSVgsXG4gIEZMQVJFX0FUT01JQ19QQVJTRURfUFJFRklYLFxuICBIRVhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBfc2lnbmF0dXJlPzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiBERUZBVUxUX05FVFdPUktfSUQsXG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfZnJvbUFkZHJlc3NlczogW10sXG4gICAgX3RvOiBbXSxcbiAgICBfbG9ja3RpbWU6IERFRkFVTFRfTE9DS1RJTUUsXG4gICAgX3RocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgX2ZlZTogeyBmZWU6IEFNT1VOVF9TVFJJTkdfWkVSTyB9LFxuICAgIGhhc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBzZXRUcmFuc2FjdGlvbjogZnVuY3Rpb24gKF90eDogdW5rbm93bikge1xuICAgICAgdGhpcy5fdHggPSBfdHg7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFzc2V0IElEIGZvciBGbGFyZSBuZXR3b3JrIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgYXNzZXQgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NldElkKCk6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIHRoZSBhc3NldCBJRCBmcm9tIHRyYW5zYWN0aW9uIGlmIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQgJiYgdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbmF0aXZlIEZMUiB0cmFuc2FjdGlvbnMsIHJldHVybiB6ZXJvLWZpbGxlZCBidWZmZXIgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gb3IgRmxhcmVKUyBBUEkgdG8gZ2V0IHRoZSBhY3R1YWwgbmF0aXZlIGFzc2V0IElEXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpO1xuICB9XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IFpFUk9fQklHSU5UKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0FNT1VOVF9QT1NJVElWRSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGNyZWRlbnRpYWxzIGFycmF5IGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBcnJheSBvZiBjcmVkZW50aWFscyB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQ1JFREVOVElBTFNfQVJSQVkpO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxzLmZvckVhY2goKGNyZWRlbnRpYWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIShjcmVkZW50aWFsIGluc3RhbmNlb2YgQ3JlZGVudGlhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjcmVkZW50aWFsIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFscyBmb3IgRmxhcmUgUC1jaGFpbiBhdG9taWMgdHJhbnNhY3Rpb25zLlxuICAgKiBCYXNlZCBvbiBBVkFYIFAtY2hhaW4gaW1wbGVtZW50YXRpb24gYWRhcHRlZCBmb3IgRmxhcmVKUy5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHRoZSBjb3JlIHN0cnVjdHVyZS5cbiAgICogVGhlIEZsYXJlSlMgdHlwZSBzeXN0ZW0gaW50ZWdyYXRpb24gd2lsbCBiZSByZWZpbmVkIGluIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWwgLSBUb3RhbCBhbW91bnQgbmVlZGVkIGluY2x1ZGluZyBmZWVzXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIFRyYW5zZmVyYWJsZUlucHV0W10sIFRyYW5zZmVyYWJsZU91dHB1dFtdLCBhbmQgQ3JlZGVudGlhbFtdXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IGZvciBhdG9taWMgdHJhbnNhY3Rpb25zXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkIHx8IEFNT1VOVF9TVFJJTkdfWkVSTy5yZXBlYXQoVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCksIEhFWF9FTkNPRElORyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCB8fCBBTU9VTlRfU1RSSU5HX1pFUk8sIERFQ0lNQUxfUkFESVgpLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IGFkZHJlc3NJbmRleEFycmF5LFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGVzZSB3b3VsZCBiZSBhY3R1YWwgc2lnbmF0dXJlc1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHV0eG8udGhyZXNob2xkIH0sICgpID0+ICcnKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmNyZWF0ZUZsYXJlQ3JlZGVudGlhbCgwLCBzaWduYXR1cmVzKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGlucHV0c1xuICAgIGlmIChpbnB1dFN1bSA8IHRvdGFsKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgJHt0b3RhbH0sIGhhdmUgJHtpbnB1dFN1bX1gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB3ZSBoYXZlIGV4Y2VzcyBpbnB1dCBhbW91bnRcbiAgICBpZiAoaW5wdXRTdW0gPiB0b3RhbCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRTdW0gLSB0b3RhbDtcblxuICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBjaGFuZ2Ugb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfU0lHTkFUVVJFU19BUlJBWSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0VNUFRZKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKEhFWF9QUkVGSVgpID8gc2lnLnNsaWNlKEhFWF9QUkVGSVhfTEVOR1RIKSA6IHNpZztcbiAgICAgIGlmICghY3JlYXRlRmxleGlibGVIZXhSZWdleCgpLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgaWYgKHNpZ0J1ZmZlci5sZW5ndGggPiBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBTaWduYXR1cmUgdG9vIGxvbmcgYXQgaW5kZXggJHtpbmRleH06ICR7c2lnQnVmZmVyLmxlbmd0aH0gYnl0ZXMgKG1heCAke1NFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBmaXhlZC1sZW5ndGggYnVmZmVyIGFuZCBjb3B5IHNpZ25hdHVyZSBkYXRhXG4gICAgICBjb25zdCBmaXhlZExlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCk7XG4gICAgICBzaWdCdWZmZXIuY29weShmaXhlZExlbmd0aEJ1ZmZlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KGZpeGVkTGVuZ3RoQnVmZmVyKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChzaWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfQ1JFQVRFX0NSRURFTlRJQUxfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzaWduKHBhcmFtczogeyBrZXk6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgLy8gRmxhcmVKUyBzaWduaW5nIGltcGxlbWVudGF0aW9uIHdpdGggYXRvbWljIHRyYW5zYWN0aW9uIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbilcbiAgICAgIGlmICghcGFyYW1zLmtleSB8fCBwYXJhbXMua2V5Lmxlbmd0aCA8IFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcbiAgICAgICAgcHJpdmF0ZUtleTogcGFyYW1zLmtleSxcbiAgICAgICAgc2lnbmluZ01ldGhvZDogU0lHTklOR19NRVRIT0QsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSBzaWduYXR1cmUgZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBGbGFyZUpTIFVuc2lnbmVkVHggY3JlYXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiByZXF1aXJlbWVudHNcbiAgICAgIGlmICghdGhpcy5fdXR4b3MgfHwgdGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgRmxhcmVKUyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIF9pZDogYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBfaW5wdXRzOiBbXSxcbiAgICAgICAgX291dHB1dHM6IFtdLFxuICAgICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZTogW10gYXMgc3RyaW5nW10sXG5cbiAgICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogW10sXG5cbiAgICAgICAgLy8gRmxhcmVKUyBtZXRob2RzIHdpdGggYXRvbWljIHN1cHBvcnRcbiAgICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IGAke1RSQU5TQUNUSU9OX0lEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgdG9Kc29uOiAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICB9KSxcblxuICAgICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIGZlZTogeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgaXNUcmFuc2FjdGlvbkZvckNDaGFpbjogZmFsc2UsXG4gICAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgICAgLyogRmxhcmVKUyBhdG9taWMgdHJhbnNhY3Rpb24gbG9hZGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dHM6ICgpID0+IFtdLFxuICAgICAgICBvdXRwdXRzOiAoKSA9PiBbXSxcbiAgICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSksXG4gICAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICAgIGlkOiAoKSA9PiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBCYXNlVHJhbnNhY3Rpb247XG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHBhcnNpbmcgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICBpZDogYCR7RkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|