@bitgo-beta/abstract-cosmos 0.0.0-semantic-release-managed
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/.eslintignore +5 -0
- package/.mocharc.yml +8 -0
- package/CHANGELOG.md +1056 -0
- package/LICENSE +191 -0
- package/README.md +1 -0
- package/dist/resources/MsgCompiled.d.ts +1212 -0
- package/dist/resources/MsgCompiled.js +2761 -0
- package/dist/src/cosmosCoin.d.ts +196 -0
- package/dist/src/cosmosCoin.d.ts.map +1 -0
- package/dist/src/cosmosCoin.js +718 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/lib/ContractCallBuilder.d.ts +13 -0
- package/dist/src/lib/ContractCallBuilder.d.ts.map +1 -0
- package/dist/src/lib/ContractCallBuilder.js +61 -0
- package/dist/src/lib/StakingActivateBuilder.d.ts +13 -0
- package/dist/src/lib/StakingActivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/StakingActivateBuilder.js +61 -0
- package/dist/src/lib/StakingDeactivateBuilder.d.ts +13 -0
- package/dist/src/lib/StakingDeactivateBuilder.d.ts.map +1 -0
- package/dist/src/lib/StakingDeactivateBuilder.js +61 -0
- package/dist/src/lib/StakingRedelegateBuilder.d.ts +13 -0
- package/dist/src/lib/StakingRedelegateBuilder.d.ts.map +1 -0
- package/dist/src/lib/StakingRedelegateBuilder.js +61 -0
- package/dist/src/lib/StakingWithdrawRewardsBuilder.d.ts +13 -0
- package/dist/src/lib/StakingWithdrawRewardsBuilder.d.ts.map +1 -0
- package/dist/src/lib/StakingWithdrawRewardsBuilder.js +61 -0
- package/dist/src/lib/constants.d.ts +11 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +14 -0
- package/dist/src/lib/iface.d.ts +109 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +20 -0
- package/dist/src/lib/index.d.ts +14 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +63 -0
- package/dist/src/lib/keyPair.d.ts +18 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +51 -0
- package/dist/src/lib/transaction.d.ts +64 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +333 -0
- package/dist/src/lib/transactionBuilder.d.ts +86 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +181 -0
- package/dist/src/lib/transferBuilder.d.ts +13 -0
- package/dist/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/src/lib/transferBuilder.js +61 -0
- package/dist/src/lib/utils.d.ts +351 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +856 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +60 -0
- package/resources/MsgCompiled.d.ts +1212 -0
- package/resources/MsgCompiled.js +2761 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as CosmosConstants from './constants';
|
|
2
|
+
export * from './iface';
|
|
3
|
+
export { StakingActivateBuilder } from './StakingActivateBuilder';
|
|
4
|
+
export { StakingDeactivateBuilder } from './StakingDeactivateBuilder';
|
|
5
|
+
export { StakingWithdrawRewardsBuilder } from './StakingWithdrawRewardsBuilder';
|
|
6
|
+
export { ContractCallBuilder } from './ContractCallBuilder';
|
|
7
|
+
export { CosmosKeyPair } from './keyPair';
|
|
8
|
+
export { CosmosTransaction } from './transaction';
|
|
9
|
+
export { CosmosTransactionBuilder } from './transactionBuilder';
|
|
10
|
+
export { CosmosTransferBuilder } from './transferBuilder';
|
|
11
|
+
export { StakingRedelegateBuilder } from './StakingRedelegateBuilder';
|
|
12
|
+
export { CosmosUtils } from './utils';
|
|
13
|
+
export { CosmosConstants };
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,aAAa,CAAC;AAC/C,cAAc,SAAS,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CosmosConstants = exports.CosmosUtils = exports.StakingRedelegateBuilder = exports.CosmosTransferBuilder = exports.CosmosTransactionBuilder = exports.CosmosTransaction = exports.CosmosKeyPair = exports.ContractCallBuilder = exports.StakingWithdrawRewardsBuilder = exports.StakingDeactivateBuilder = exports.StakingActivateBuilder = void 0;
|
|
40
|
+
const CosmosConstants = __importStar(require("./constants"));
|
|
41
|
+
exports.CosmosConstants = CosmosConstants;
|
|
42
|
+
__exportStar(require("./iface"), exports);
|
|
43
|
+
var StakingActivateBuilder_1 = require("./StakingActivateBuilder");
|
|
44
|
+
Object.defineProperty(exports, "StakingActivateBuilder", { enumerable: true, get: function () { return StakingActivateBuilder_1.StakingActivateBuilder; } });
|
|
45
|
+
var StakingDeactivateBuilder_1 = require("./StakingDeactivateBuilder");
|
|
46
|
+
Object.defineProperty(exports, "StakingDeactivateBuilder", { enumerable: true, get: function () { return StakingDeactivateBuilder_1.StakingDeactivateBuilder; } });
|
|
47
|
+
var StakingWithdrawRewardsBuilder_1 = require("./StakingWithdrawRewardsBuilder");
|
|
48
|
+
Object.defineProperty(exports, "StakingWithdrawRewardsBuilder", { enumerable: true, get: function () { return StakingWithdrawRewardsBuilder_1.StakingWithdrawRewardsBuilder; } });
|
|
49
|
+
var ContractCallBuilder_1 = require("./ContractCallBuilder");
|
|
50
|
+
Object.defineProperty(exports, "ContractCallBuilder", { enumerable: true, get: function () { return ContractCallBuilder_1.ContractCallBuilder; } });
|
|
51
|
+
var keyPair_1 = require("./keyPair");
|
|
52
|
+
Object.defineProperty(exports, "CosmosKeyPair", { enumerable: true, get: function () { return keyPair_1.CosmosKeyPair; } });
|
|
53
|
+
var transaction_1 = require("./transaction");
|
|
54
|
+
Object.defineProperty(exports, "CosmosTransaction", { enumerable: true, get: function () { return transaction_1.CosmosTransaction; } });
|
|
55
|
+
var transactionBuilder_1 = require("./transactionBuilder");
|
|
56
|
+
Object.defineProperty(exports, "CosmosTransactionBuilder", { enumerable: true, get: function () { return transactionBuilder_1.CosmosTransactionBuilder; } });
|
|
57
|
+
var transferBuilder_1 = require("./transferBuilder");
|
|
58
|
+
Object.defineProperty(exports, "CosmosTransferBuilder", { enumerable: true, get: function () { return transferBuilder_1.CosmosTransferBuilder; } });
|
|
59
|
+
var StakingRedelegateBuilder_1 = require("./StakingRedelegateBuilder");
|
|
60
|
+
Object.defineProperty(exports, "StakingRedelegateBuilder", { enumerable: true, get: function () { return StakingRedelegateBuilder_1.StakingRedelegateBuilder; } });
|
|
61
|
+
var utils_1 = require("./utils");
|
|
62
|
+
Object.defineProperty(exports, "CosmosUtils", { enumerable: true, get: function () { return utils_1.CosmosUtils; } });
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZEQUErQztBQWF0QywwQ0FBZTtBQVp4QiwwQ0FBd0I7QUFFeEIsbUVBQWtFO0FBQXpELGdJQUFBLHNCQUFzQixPQUFBO0FBQy9CLHVFQUFzRTtBQUE3RCxvSUFBQSx3QkFBd0IsT0FBQTtBQUNqQyxpRkFBZ0Y7QUFBdkUsOElBQUEsNkJBQTZCLE9BQUE7QUFDdEMsNkRBQTREO0FBQW5ELDBIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHFDQUEwQztBQUFqQyx3R0FBQSxhQUFhLE9BQUE7QUFDdEIsNkNBQWtEO0FBQXpDLGdIQUFBLGlCQUFpQixPQUFBO0FBQzFCLDJEQUFnRTtBQUF2RCw4SEFBQSx3QkFBd0IsT0FBQTtBQUNqQyxxREFBMEQ7QUFBakQsd0hBQUEscUJBQXFCLE9BQUE7QUFDOUIsdUVBQXNFO0FBQTdELG9JQUFBLHdCQUF3QixPQUFBO0FBQ2pDLGlDQUFzQztBQUE3QixvR0FBQSxXQUFXLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBDb3Ntb3NDb25zdGFudHMgZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pZmFjZSc7XG5cbmV4cG9ydCB7IFN0YWtpbmdBY3RpdmF0ZUJ1aWxkZXIgfSBmcm9tICcuL1N0YWtpbmdBY3RpdmF0ZUJ1aWxkZXInO1xuZXhwb3J0IHsgU3Rha2luZ0RlYWN0aXZhdGVCdWlsZGVyIH0gZnJvbSAnLi9TdGFraW5nRGVhY3RpdmF0ZUJ1aWxkZXInO1xuZXhwb3J0IHsgU3Rha2luZ1dpdGhkcmF3UmV3YXJkc0J1aWxkZXIgfSBmcm9tICcuL1N0YWtpbmdXaXRoZHJhd1Jld2FyZHNCdWlsZGVyJztcbmV4cG9ydCB7IENvbnRyYWN0Q2FsbEJ1aWxkZXIgfSBmcm9tICcuL0NvbnRyYWN0Q2FsbEJ1aWxkZXInO1xuZXhwb3J0IHsgQ29zbW9zS2V5UGFpciB9IGZyb20gJy4va2V5UGFpcic7XG5leHBvcnQgeyBDb3Ntb3NUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgQ29zbW9zVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuZXhwb3J0IHsgQ29zbW9zVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi90cmFuc2ZlckJ1aWxkZXInO1xuZXhwb3J0IHsgU3Rha2luZ1JlZGVsZWdhdGVCdWlsZGVyIH0gZnJvbSAnLi9TdGFraW5nUmVkZWxlZ2F0ZUJ1aWxkZXInO1xuZXhwb3J0IHsgQ29zbW9zVXRpbHMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IENvc21vc0NvbnN0YW50cyB9O1xuIl19
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DefaultKeys, KeyPairOptions, Secp256k1ExtendedKeyPair } from '@bitgo-beta/sdk-core';
|
|
2
|
+
/**
|
|
3
|
+
* Cosmos keys and address management.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CosmosKeyPair extends Secp256k1ExtendedKeyPair {
|
|
6
|
+
/**
|
|
7
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
8
|
+
* @param { KeyPairOptions } source Either a master seed, a private key (extended or raw), or a public key
|
|
9
|
+
* (extended, compressed, or uncompressed)
|
|
10
|
+
*/
|
|
11
|
+
constructor(source?: KeyPairOptions);
|
|
12
|
+
/**
|
|
13
|
+
* Cosmos default keys format: raw private and compressed public key
|
|
14
|
+
* @returns { DefaultKeys } The keys in the protocol default key format
|
|
15
|
+
*/
|
|
16
|
+
getKeys(): DefaultKeys;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=keyPair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../src/lib/keyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAM9B;;GAEG;AACH,qBAAa,aAAc,SAAQ,wBAAwB;IACzD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,cAAc;IAoBnC;;;OAGG;IACH,OAAO,IAAI,WAAW;CAMvB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CosmosKeyPair = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const secp256k1_1 = require("@bitgo-beta/secp256k1");
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const constants_1 = require("./constants");
|
|
8
|
+
/**
|
|
9
|
+
* Cosmos keys and address management.
|
|
10
|
+
*/
|
|
11
|
+
class CosmosKeyPair extends sdk_core_1.Secp256k1ExtendedKeyPair {
|
|
12
|
+
/**
|
|
13
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
14
|
+
* @param { KeyPairOptions } source Either a master seed, a private key (extended or raw), or a public key
|
|
15
|
+
* (extended, compressed, or uncompressed)
|
|
16
|
+
*/
|
|
17
|
+
constructor(source) {
|
|
18
|
+
super(source);
|
|
19
|
+
if (!source) {
|
|
20
|
+
const seed = (0, crypto_1.randomBytes)(constants_1.DEFAULT_SEED_SIZE_BYTES);
|
|
21
|
+
this.hdNode = secp256k1_1.bip32.fromSeed(seed);
|
|
22
|
+
}
|
|
23
|
+
else if ((0, sdk_core_1.isSeed)(source)) {
|
|
24
|
+
this.hdNode = secp256k1_1.bip32.fromSeed(source.seed);
|
|
25
|
+
}
|
|
26
|
+
else if ((0, sdk_core_1.isPrivateKey)(source)) {
|
|
27
|
+
this.recordKeysFromPrivateKey(source.prv);
|
|
28
|
+
}
|
|
29
|
+
else if ((0, sdk_core_1.isPublicKey)(source)) {
|
|
30
|
+
this.recordKeysFromPublicKey(source.pub);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
throw new Error('Invalid key pair options');
|
|
34
|
+
}
|
|
35
|
+
if (this.hdNode) {
|
|
36
|
+
this.keyPair = sdk_core_1.Secp256k1ExtendedKeyPair.toKeyPair(this.hdNode);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Cosmos default keys format: raw private and compressed public key
|
|
41
|
+
* @returns { DefaultKeys } The keys in the protocol default key format
|
|
42
|
+
*/
|
|
43
|
+
getKeys() {
|
|
44
|
+
return {
|
|
45
|
+
pub: this.getPublicKey({ compressed: true }).toString('hex'),
|
|
46
|
+
prv: this.getPrivateKey()?.toString('hex'),
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.CosmosKeyPair = CosmosKeyPair;
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFPOEI7QUFDOUIscURBQThDO0FBQzlDLG1DQUFxQztBQUVyQywyQ0FBc0Q7QUFFdEQ7O0dBRUc7QUFDSCxNQUFhLGFBQWMsU0FBUSxtQ0FBd0I7SUFDekQ7Ozs7T0FJRztJQUNILFlBQVksTUFBdUI7UUFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLEdBQUcsSUFBQSxvQkFBVyxFQUFDLG1DQUF1QixDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxDQUFDO2FBQU0sSUFBSSxJQUFBLGlCQUFNLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sSUFBSSxJQUFBLHVCQUFZLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLElBQUEsc0JBQVcsRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsbUNBQXdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcENELHNDQW9DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERlZmF1bHRLZXlzLFxuICBpc1ByaXZhdGVLZXksXG4gIGlzUHVibGljS2V5LFxuICBpc1NlZWQsXG4gIEtleVBhaXJPcHRpb25zLFxuICBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGJpcDMyIH0gZnJvbSAnQGJpdGdvLWJldGEvc2VjcDI1NmsxJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgREVGQVVMVF9TRUVEX1NJWkVfQllURVMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQ29zbW9zIGtleXMgYW5kIGFkZHJlc3MgbWFuYWdlbWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvc21vc0tleVBhaXIgZXh0ZW5kcyBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIge1xuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0LCBjcmVhdGVzIGEga2V5IHBhaXIgd2l0aCBhIHJhbmRvbSBtYXN0ZXIgc2VlZC5cbiAgICogQHBhcmFtIHsgS2V5UGFpck9wdGlvbnMgfSBzb3VyY2UgRWl0aGVyIGEgbWFzdGVyIHNlZWQsIGEgcHJpdmF0ZSBrZXkgKGV4dGVuZGVkIG9yIHJhdyksIG9yIGEgcHVibGljIGtleVxuICAgKiAgICAgKGV4dGVuZGVkLCBjb21wcmVzc2VkLCBvciB1bmNvbXByZXNzZWQpXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIHN1cGVyKHNvdXJjZSk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyhERUZBVUxUX1NFRURfU0laRV9CWVRFUyk7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNTZWVkKHNvdXJjZSkpIHtcbiAgICAgIHRoaXMuaGROb2RlID0gYmlwMzIuZnJvbVNlZWQoc291cmNlLnNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHNvdXJjZS5wcnYpO1xuICAgIH0gZWxzZSBpZiAoaXNQdWJsaWNLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5yZWNvcmRLZXlzRnJvbVB1YmxpY0tleShzb3VyY2UucHViKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBwYWlyIG9wdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZE5vZGUpIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpci50b0tleVBhaXIodGhpcy5oZE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3Ntb3MgZGVmYXVsdCBrZXlzIGZvcm1hdDogcmF3IHByaXZhdGUgYW5kIGNvbXByZXNzZWQgcHVibGljIGtleVxuICAgKiBAcmV0dXJucyB7IERlZmF1bHRLZXlzIH0gVGhlIGtleXMgaW4gdGhlIHByb3RvY29sIGRlZmF1bHQga2V5IGZvcm1hdFxuICAgKi9cbiAgZ2V0S2V5cygpOiBEZWZhdWx0S2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHBydjogdGhpcy5nZXRQcml2YXRlS2V5KCk/LnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { BaseKey, BaseTransaction, TransactionType } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
|
|
3
|
+
import { CosmosLikeTransaction, TransactionExplanation, TxData } from './iface';
|
|
4
|
+
import { CosmosUtils } from './utils';
|
|
5
|
+
export declare class CosmosTransaction<CustomMessage = never> extends BaseTransaction {
|
|
6
|
+
protected _cosmosLikeTransaction: CosmosLikeTransaction<CustomMessage>;
|
|
7
|
+
protected _accountNumber: number;
|
|
8
|
+
protected _chainId: string;
|
|
9
|
+
protected _utils: CosmosUtils<CustomMessage>;
|
|
10
|
+
constructor(_coinConfig: Readonly<CoinConfig>, utils: CosmosUtils<CustomMessage>);
|
|
11
|
+
get cosmosLikeTransaction(): CosmosLikeTransaction<CustomMessage>;
|
|
12
|
+
set cosmosLikeTransaction(cosmosLikeTransaction: Readonly<CosmosLikeTransaction<CustomMessage>>);
|
|
13
|
+
get chainId(): string;
|
|
14
|
+
set chainId(chainId: string);
|
|
15
|
+
get accountNumber(): number;
|
|
16
|
+
set accountNumber(accountNumber: number);
|
|
17
|
+
/** @inheritDoc **/
|
|
18
|
+
get id(): string;
|
|
19
|
+
/** @inheritdoc */
|
|
20
|
+
canSign(key: BaseKey): boolean;
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
toBroadcastFormat(): string;
|
|
23
|
+
/** @inheritdoc */
|
|
24
|
+
toJson(): TxData<CustomMessage>;
|
|
25
|
+
/**
|
|
26
|
+
* Add a signature to the transaction
|
|
27
|
+
* @param {string} signature in hex format
|
|
28
|
+
*/
|
|
29
|
+
addSignature(signature: string): void;
|
|
30
|
+
/** @inheritDoc */
|
|
31
|
+
explainTransaction(): TransactionExplanation;
|
|
32
|
+
/**
|
|
33
|
+
* Set the transaction type.
|
|
34
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
35
|
+
*/
|
|
36
|
+
set transactionType(transactionType: TransactionType);
|
|
37
|
+
/**
|
|
38
|
+
* Serialize the transaction to a JSON string
|
|
39
|
+
* @returns {string} serialized base64 encoded transaction
|
|
40
|
+
*/
|
|
41
|
+
serialize(): string;
|
|
42
|
+
/** @inheritdoc **/
|
|
43
|
+
get signablePayload(): Buffer;
|
|
44
|
+
/**
|
|
45
|
+
* Returns a complete explanation for a transfer transaction
|
|
46
|
+
* Currently only supports one message per transfer.
|
|
47
|
+
* @param {TxData} json The transaction data in json format
|
|
48
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
49
|
+
* @returns {TransactionExplanation}
|
|
50
|
+
*/
|
|
51
|
+
explainTransactionInternal(json: TxData<CustomMessage>, explanationResult: TransactionExplanation): TransactionExplanation;
|
|
52
|
+
/**
|
|
53
|
+
* Load the input and output data on this transaction using the transaction json
|
|
54
|
+
* if there are outputs. For transactions without outputs (e.g. wallet initializations),
|
|
55
|
+
* this function will not do anything
|
|
56
|
+
*/
|
|
57
|
+
loadInputsAndOutputs(): void;
|
|
58
|
+
/**
|
|
59
|
+
* Sets this transaction payload
|
|
60
|
+
* @param rawTransaction raw transaction in base64 encoded string
|
|
61
|
+
*/
|
|
62
|
+
enrichTransactionDetailsFromRawTransaction(rawTransaction: string): void;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,eAAe,EAKf,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAK7D,OAAO,EACL,qBAAqB,EAKrB,sBAAsB,EACtB,MAAM,EAEP,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,qBAAa,iBAAiB,CAAC,aAAa,GAAG,KAAK,CAAE,SAAQ,eAAe;IAC3E,SAAS,CAAC,sBAAsB,EAAE,qBAAqB,CAAC,aAAa,CAAC,CAAC;IACvE,SAAS,CAAC,cAAc,EAAE,MAAM,CAAC;IACjC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE3B,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;gBAEjC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,aAAa,CAAC;IAKhF,IAAI,qBAAqB,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAEhE;IAED,IAAI,qBAAqB,CAAC,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC,EAE9F;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAE1B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,aAAa,CAAC,aAAa,EAAE,MAAM,EAEtC;IAED,mBAAmB;IACnB,IAAI,EAAE,IAAI,MAAM,CAOf;IAED,kBAAkB;IAClB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI9B,kBAAkB;IAClB,iBAAiB,IAAI,MAAM;IAO3B,kBAAkB;IAClB,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC;IAoB/B;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM;IAK9B,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IAkB5C;;;OAGG;IACH,IAAI,eAAe,CAAC,eAAe,EAAE,eAAe,EAEnD;IAED;;;OAGG;IACH,SAAS,IAAI,MAAM;IAanB,mBAAmB;IACnB,IAAI,eAAe,IAAI,MAAM,CAI5B;IAED;;;;;;OAMG;IACH,0BAA0B,CACxB,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,EAC3B,iBAAiB,EAAE,sBAAsB,GACxC,sBAAsB;IAyFzB;;;;OAIG;IACH,oBAAoB,IAAI,IAAI;IA2F5B;;;OAGG;IACH,0CAA0C,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;CAiBzE"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CosmosTransaction = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
6
|
+
const proto_signing_1 = require("@cosmjs/proto-signing");
|
|
7
|
+
const tx_1 = require("cosmjs-types/cosmos/tx/v1beta1/tx");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
class CosmosTransaction extends sdk_core_1.BaseTransaction {
|
|
10
|
+
constructor(_coinConfig, utils) {
|
|
11
|
+
super(_coinConfig);
|
|
12
|
+
this._utils = utils;
|
|
13
|
+
}
|
|
14
|
+
get cosmosLikeTransaction() {
|
|
15
|
+
return this._cosmosLikeTransaction;
|
|
16
|
+
}
|
|
17
|
+
set cosmosLikeTransaction(cosmosLikeTransaction) {
|
|
18
|
+
this._cosmosLikeTransaction = cosmosLikeTransaction;
|
|
19
|
+
}
|
|
20
|
+
get chainId() {
|
|
21
|
+
return this._chainId;
|
|
22
|
+
}
|
|
23
|
+
set chainId(chainId) {
|
|
24
|
+
this._chainId = chainId;
|
|
25
|
+
}
|
|
26
|
+
get accountNumber() {
|
|
27
|
+
return this._accountNumber;
|
|
28
|
+
}
|
|
29
|
+
set accountNumber(accountNumber) {
|
|
30
|
+
this._accountNumber = accountNumber;
|
|
31
|
+
}
|
|
32
|
+
/** @inheritDoc **/
|
|
33
|
+
get id() {
|
|
34
|
+
if (this._id) {
|
|
35
|
+
return this._id;
|
|
36
|
+
}
|
|
37
|
+
else if (this._cosmosLikeTransaction?.hash !== undefined) {
|
|
38
|
+
return this._cosmosLikeTransaction.hash;
|
|
39
|
+
}
|
|
40
|
+
return constants_1.UNAVAILABLE_TEXT;
|
|
41
|
+
}
|
|
42
|
+
/** @inheritdoc */
|
|
43
|
+
canSign(key) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
/** @inheritdoc */
|
|
47
|
+
toBroadcastFormat() {
|
|
48
|
+
if (!this._cosmosLikeTransaction) {
|
|
49
|
+
throw new sdk_core_1.InvalidTransactionError('Empty transaction');
|
|
50
|
+
}
|
|
51
|
+
return this.serialize();
|
|
52
|
+
}
|
|
53
|
+
/** @inheritdoc */
|
|
54
|
+
toJson() {
|
|
55
|
+
if (!this._cosmosLikeTransaction) {
|
|
56
|
+
throw new sdk_core_1.ParseTransactionError('Empty transaction');
|
|
57
|
+
}
|
|
58
|
+
const tx = this._cosmosLikeTransaction;
|
|
59
|
+
return {
|
|
60
|
+
id: this.id,
|
|
61
|
+
type: this._type,
|
|
62
|
+
sequence: tx.sequence,
|
|
63
|
+
sendMessages: tx.sendMessages,
|
|
64
|
+
gasBudget: tx.gasBudget,
|
|
65
|
+
publicKey: tx.publicKey,
|
|
66
|
+
signature: tx.signature,
|
|
67
|
+
accountNumber: this._accountNumber,
|
|
68
|
+
chainId: this._chainId,
|
|
69
|
+
hash: tx.hash,
|
|
70
|
+
memo: tx.memo,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Add a signature to the transaction
|
|
75
|
+
* @param {string} signature in hex format
|
|
76
|
+
*/
|
|
77
|
+
addSignature(signature) {
|
|
78
|
+
this._signatures = [];
|
|
79
|
+
this._signatures.push(signature);
|
|
80
|
+
}
|
|
81
|
+
/** @inheritDoc */
|
|
82
|
+
explainTransaction() {
|
|
83
|
+
const result = this.toJson();
|
|
84
|
+
const displayOrder = ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'];
|
|
85
|
+
const outputs = [];
|
|
86
|
+
const explanationResult = {
|
|
87
|
+
displayOrder,
|
|
88
|
+
id: this.id,
|
|
89
|
+
outputs,
|
|
90
|
+
outputAmount: '0',
|
|
91
|
+
changeOutputs: [],
|
|
92
|
+
changeAmount: '0',
|
|
93
|
+
fee: { fee: this.cosmosLikeTransaction.gasBudget.amount[0].amount },
|
|
94
|
+
type: this.type,
|
|
95
|
+
};
|
|
96
|
+
return this.explainTransactionInternal(result, explanationResult);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set the transaction type.
|
|
100
|
+
* @param {TransactionType} transactionType The transaction type to be set.
|
|
101
|
+
*/
|
|
102
|
+
set transactionType(transactionType) {
|
|
103
|
+
this._type = transactionType;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Serialize the transaction to a JSON string
|
|
107
|
+
* @returns {string} serialized base64 encoded transaction
|
|
108
|
+
*/
|
|
109
|
+
serialize() {
|
|
110
|
+
const txRaw = this._utils.createTxRawFromCosmosLikeTransaction(this.cosmosLikeTransaction);
|
|
111
|
+
if (this.cosmosLikeTransaction?.publicKey !== undefined && this._signatures.length > 0) {
|
|
112
|
+
const signedRawTx = this._utils.createSignedTxRaw(this.cosmosLikeTransaction.publicKey, this._signatures[0], txRaw);
|
|
113
|
+
return (0, encoding_1.toBase64)(tx_1.TxRaw.encode(signedRawTx).finish());
|
|
114
|
+
}
|
|
115
|
+
return (0, encoding_1.toBase64)(tx_1.TxRaw.encode(txRaw).finish());
|
|
116
|
+
}
|
|
117
|
+
/** @inheritdoc **/
|
|
118
|
+
get signablePayload() {
|
|
119
|
+
return Buffer.from((0, proto_signing_1.makeSignBytes)(this._utils.createSignDoc(this.cosmosLikeTransaction, this._accountNumber, this._chainId)));
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Returns a complete explanation for a transfer transaction
|
|
123
|
+
* Currently only supports one message per transfer.
|
|
124
|
+
* @param {TxData} json The transaction data in json format
|
|
125
|
+
* @param {TransactionExplanation} explanationResult The transaction explanation to be completed
|
|
126
|
+
* @returns {TransactionExplanation}
|
|
127
|
+
*/
|
|
128
|
+
explainTransactionInternal(json, explanationResult) {
|
|
129
|
+
let outputs;
|
|
130
|
+
let outputAmount;
|
|
131
|
+
switch (json.type) {
|
|
132
|
+
case sdk_core_1.TransactionType.Send:
|
|
133
|
+
explanationResult.type = sdk_core_1.TransactionType.Send;
|
|
134
|
+
outputAmount = BigInt(0);
|
|
135
|
+
outputs = json.sendMessages.map((message) => {
|
|
136
|
+
const sendMessage = message.value;
|
|
137
|
+
outputAmount = outputAmount + BigInt(sendMessage.amount[0].amount);
|
|
138
|
+
return {
|
|
139
|
+
address: sendMessage.toAddress,
|
|
140
|
+
amount: sendMessage.amount[0].amount,
|
|
141
|
+
};
|
|
142
|
+
});
|
|
143
|
+
break;
|
|
144
|
+
case sdk_core_1.TransactionType.StakingActivate:
|
|
145
|
+
explanationResult.type = sdk_core_1.TransactionType.StakingActivate;
|
|
146
|
+
outputAmount = BigInt(0);
|
|
147
|
+
outputs = json.sendMessages.map((message) => {
|
|
148
|
+
const delegateMessage = message.value;
|
|
149
|
+
outputAmount = outputAmount + BigInt(delegateMessage.amount.amount);
|
|
150
|
+
return {
|
|
151
|
+
address: delegateMessage.validatorAddress,
|
|
152
|
+
amount: delegateMessage.amount.amount,
|
|
153
|
+
};
|
|
154
|
+
});
|
|
155
|
+
break;
|
|
156
|
+
case sdk_core_1.TransactionType.StakingDeactivate:
|
|
157
|
+
explanationResult.type = sdk_core_1.TransactionType.StakingDeactivate;
|
|
158
|
+
outputAmount = BigInt(0);
|
|
159
|
+
outputs = json.sendMessages.map((message) => {
|
|
160
|
+
const delegateMessage = message.value;
|
|
161
|
+
outputAmount = outputAmount + BigInt(delegateMessage.amount.amount);
|
|
162
|
+
return {
|
|
163
|
+
address: delegateMessage.validatorAddress,
|
|
164
|
+
amount: delegateMessage.amount.amount,
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
break;
|
|
168
|
+
case sdk_core_1.TransactionType.StakingWithdraw:
|
|
169
|
+
explanationResult.type = sdk_core_1.TransactionType.StakingWithdraw;
|
|
170
|
+
outputs = json.sendMessages.map((message) => {
|
|
171
|
+
const withdrawMessage = message.value;
|
|
172
|
+
return {
|
|
173
|
+
address: withdrawMessage.validatorAddress,
|
|
174
|
+
amount: constants_1.UNAVAILABLE_TEXT,
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
break;
|
|
178
|
+
case sdk_core_1.TransactionType.ContractCall:
|
|
179
|
+
explanationResult.type = sdk_core_1.TransactionType.ContractCall;
|
|
180
|
+
outputAmount = BigInt(0);
|
|
181
|
+
outputs = json.sendMessages.map((message) => {
|
|
182
|
+
const executeContractMessage = message.value;
|
|
183
|
+
outputAmount = outputAmount + BigInt(executeContractMessage.funds?.[0]?.amount ?? '0');
|
|
184
|
+
return {
|
|
185
|
+
address: executeContractMessage.contract,
|
|
186
|
+
amount: executeContractMessage.funds?.[0]?.amount ?? '0',
|
|
187
|
+
};
|
|
188
|
+
});
|
|
189
|
+
break;
|
|
190
|
+
case sdk_core_1.TransactionType.StakingRedelegate:
|
|
191
|
+
explanationResult.type = sdk_core_1.TransactionType.StakingRedelegate;
|
|
192
|
+
outputAmount = BigInt(0);
|
|
193
|
+
outputs = json.sendMessages.map((message) => {
|
|
194
|
+
const redelegateMessage = message.value;
|
|
195
|
+
outputAmount = outputAmount + BigInt(redelegateMessage.amount.amount);
|
|
196
|
+
return {
|
|
197
|
+
address: redelegateMessage.validatorDstAddress,
|
|
198
|
+
amount: redelegateMessage.amount.amount,
|
|
199
|
+
};
|
|
200
|
+
});
|
|
201
|
+
break;
|
|
202
|
+
default:
|
|
203
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
|
|
204
|
+
}
|
|
205
|
+
if (json.memo) {
|
|
206
|
+
outputs.forEach((output) => {
|
|
207
|
+
output.memo = json.memo;
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return {
|
|
211
|
+
...explanationResult,
|
|
212
|
+
outputAmount: outputAmount?.toString(),
|
|
213
|
+
outputs,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Load the input and output data on this transaction using the transaction json
|
|
218
|
+
* if there are outputs. For transactions without outputs (e.g. wallet initializations),
|
|
219
|
+
* this function will not do anything
|
|
220
|
+
*/
|
|
221
|
+
loadInputsAndOutputs() {
|
|
222
|
+
if (this.type === undefined || !this.cosmosLikeTransaction) {
|
|
223
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction type or cosmosLikeTransaction is not set');
|
|
224
|
+
}
|
|
225
|
+
const outputs = [];
|
|
226
|
+
const inputs = [];
|
|
227
|
+
switch (this.type) {
|
|
228
|
+
case sdk_core_1.TransactionType.Send:
|
|
229
|
+
this.cosmosLikeTransaction.sendMessages.forEach((message) => {
|
|
230
|
+
const sendMessage = message.value;
|
|
231
|
+
inputs.push({
|
|
232
|
+
address: sendMessage.fromAddress,
|
|
233
|
+
value: sendMessage.amount[0].amount,
|
|
234
|
+
coin: this._coinConfig.name,
|
|
235
|
+
});
|
|
236
|
+
outputs.push({
|
|
237
|
+
address: sendMessage.toAddress,
|
|
238
|
+
value: sendMessage.amount[0].amount,
|
|
239
|
+
coin: this._coinConfig.name,
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
break;
|
|
243
|
+
case sdk_core_1.TransactionType.StakingActivate:
|
|
244
|
+
case sdk_core_1.TransactionType.StakingDeactivate:
|
|
245
|
+
this.cosmosLikeTransaction.sendMessages.forEach((message) => {
|
|
246
|
+
const delegateMessage = message.value;
|
|
247
|
+
inputs.push({
|
|
248
|
+
address: delegateMessage.delegatorAddress,
|
|
249
|
+
value: delegateMessage.amount.amount,
|
|
250
|
+
coin: this._coinConfig.name,
|
|
251
|
+
});
|
|
252
|
+
outputs.push({
|
|
253
|
+
address: delegateMessage.validatorAddress,
|
|
254
|
+
value: delegateMessage.amount.amount,
|
|
255
|
+
coin: this._coinConfig.name,
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
break;
|
|
259
|
+
case sdk_core_1.TransactionType.StakingWithdraw:
|
|
260
|
+
this.cosmosLikeTransaction.sendMessages.forEach((message) => {
|
|
261
|
+
const withdrawMessage = message.value;
|
|
262
|
+
inputs.push({
|
|
263
|
+
address: withdrawMessage.delegatorAddress,
|
|
264
|
+
value: constants_1.UNAVAILABLE_TEXT,
|
|
265
|
+
coin: this._coinConfig.name,
|
|
266
|
+
});
|
|
267
|
+
outputs.push({
|
|
268
|
+
address: withdrawMessage.validatorAddress,
|
|
269
|
+
value: constants_1.UNAVAILABLE_TEXT,
|
|
270
|
+
coin: this._coinConfig.name,
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
break;
|
|
274
|
+
case sdk_core_1.TransactionType.ContractCall:
|
|
275
|
+
this.cosmosLikeTransaction.sendMessages.forEach((message) => {
|
|
276
|
+
const executeContractMessage = message.value;
|
|
277
|
+
inputs.push({
|
|
278
|
+
address: executeContractMessage.sender,
|
|
279
|
+
value: executeContractMessage.funds?.[0]?.amount ?? '0',
|
|
280
|
+
coin: this._coinConfig.name,
|
|
281
|
+
});
|
|
282
|
+
outputs.push({
|
|
283
|
+
address: executeContractMessage.contract,
|
|
284
|
+
value: executeContractMessage.funds?.[0]?.amount ?? '0',
|
|
285
|
+
coin: this._coinConfig.name,
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
break;
|
|
289
|
+
case sdk_core_1.TransactionType.StakingRedelegate:
|
|
290
|
+
this.cosmosLikeTransaction.sendMessages.forEach((message) => {
|
|
291
|
+
const redelegateMessage = message.value;
|
|
292
|
+
inputs.push({
|
|
293
|
+
address: redelegateMessage.delegatorAddress,
|
|
294
|
+
value: redelegateMessage.amount.amount,
|
|
295
|
+
coin: this._coinConfig.name,
|
|
296
|
+
});
|
|
297
|
+
outputs.push({
|
|
298
|
+
address: redelegateMessage.validatorDstAddress,
|
|
299
|
+
value: redelegateMessage.amount.amount,
|
|
300
|
+
coin: this._coinConfig.name,
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
break;
|
|
304
|
+
default:
|
|
305
|
+
throw new sdk_core_1.InvalidTransactionError('Transaction type not supported');
|
|
306
|
+
}
|
|
307
|
+
this._inputs = inputs;
|
|
308
|
+
this._outputs = outputs;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Sets this transaction payload
|
|
312
|
+
* @param rawTransaction raw transaction in base64 encoded string
|
|
313
|
+
*/
|
|
314
|
+
enrichTransactionDetailsFromRawTransaction(rawTransaction) {
|
|
315
|
+
if (this._utils.isValidHexString(rawTransaction)) {
|
|
316
|
+
this.cosmosLikeTransaction = this._utils.deserializeTransaction((0, encoding_1.toBase64)((0, encoding_1.fromHex)(rawTransaction)));
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
this.cosmosLikeTransaction = this._utils.deserializeTransaction(rawTransaction);
|
|
320
|
+
}
|
|
321
|
+
if (this.cosmosLikeTransaction.signature) {
|
|
322
|
+
this.addSignature(Buffer.from(this.cosmosLikeTransaction.signature).toString('hex'));
|
|
323
|
+
}
|
|
324
|
+
const typeUrl = this.cosmosLikeTransaction.sendMessages[0].typeUrl;
|
|
325
|
+
const transactionType = this._utils.getTransactionTypeFromTypeUrl(typeUrl);
|
|
326
|
+
if (transactionType === undefined) {
|
|
327
|
+
throw new Error('Transaction type is not supported ' + typeUrl);
|
|
328
|
+
}
|
|
329
|
+
this.transactionType = transactionType;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
exports.CosmosTransaction = CosmosTransaction;
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1EQVE4QjtBQUU5QiwrQ0FBcUQ7QUFDckQseURBQXNEO0FBQ3RELDBEQUEwRDtBQUMxRCwyQ0FBK0M7QUFhL0MsTUFBYSxpQkFBeUMsU0FBUSwwQkFBZTtJQU8zRSxZQUFZLFdBQWlDLEVBQUUsS0FBaUM7UUFDOUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLHFCQUFxQjtRQUN2QixPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsQ0FBQyxxQkFBcUU7UUFDN0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLHFCQUFxQixDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLE9BQWU7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsYUFBcUI7UUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7SUFDdEMsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLEVBQUU7UUFDSixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUNsQixDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNELE9BQU8sSUFBSSxD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QUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFwV0QsOENBb1dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFBhcnNlVHJhbnNhY3Rpb25FcnJvcixcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgZnJvbUhleCwgdG9CYXNlNjQgfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7IG1ha2VTaWduQnl0ZXMgfSBmcm9tICdAY29zbWpzL3Byb3RvLXNpZ25pbmcnO1xuaW1wb3J0IHsgVHhSYXcgfSBmcm9tICdjb3NtanMtdHlwZXMvY29zbW9zL3R4L3YxYmV0YTEvdHgnO1xuaW1wb3J0IHsgVU5BVkFJTEFCTEVfVEVYVCB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIENvc21vc0xpa2VUcmFuc2FjdGlvbixcbiAgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlLFxuICBFeGVjdXRlQ29udHJhY3RNZXNzYWdlLFxuICBSZWRlbGVnYXRlTWVzc2FnZSxcbiAgU2VuZE1lc3NhZ2UsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4RGF0YSxcbiAgV2l0aGRyYXdEZWxlZ2F0b3JSZXdhcmRzTWVzc2FnZSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBDb3Ntb3NVdGlscyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQ29zbW9zVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZSA9IG5ldmVyPiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfY29zbW9zTGlrZVRyYW5zYWN0aW9uOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZT47XG4gIHByb3RlY3RlZCBfYWNjb3VudE51bWJlcjogbnVtYmVyO1xuICBwcm90ZWN0ZWQgX2NoYWluSWQ6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgX3V0aWxzOiBDb3Ntb3NVdGlsczxDdXN0b21NZXNzYWdlPjtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4sIHV0aWxzOiBDb3Ntb3NVdGlsczxDdXN0b21NZXNzYWdlPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl91dGlscyA9IHV0aWxzO1xuICB9XG5cbiAgZ2V0IGNvc21vc0xpa2VUcmFuc2FjdGlvbigpOiBDb3Ntb3NMaWtlVHJhbnNhY3Rpb248Q3VzdG9tTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLl9jb3Ntb3NMaWtlVHJhbnNhY3Rpb247XG4gIH1cblxuICBzZXQgY29zbW9zTGlrZVRyYW5zYWN0aW9uKGNvc21vc0xpa2VUcmFuc2FjdGlvbjogUmVhZG9ubHk8Q29zbW9zTGlrZVRyYW5zYWN0aW9uPEN1c3RvbU1lc3NhZ2U+Pikge1xuICAgIHRoaXMuX2Nvc21vc0xpa2VUcmFuc2FjdGlvbiA9IGNvc21vc0xpa2VUcmFuc2FjdGlvbjtcbiAgfVxuXG4gIGdldCBjaGFpbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYWluSWQ7XG4gIH1cblxuICBzZXQgY2hhaW5JZChjaGFpbklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jaGFpbklkID0gY2hhaW5JZDtcbiAgfVxuXG4gIGdldCBhY2NvdW50TnVtYmVyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY291bnROdW1iZXI7XG4gIH1cblxuICBzZXQgYWNjb3VudE51bWJlcihhY2NvdW50TnVtYmVyOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY2NvdW50TnVtYmVyID0gYWNjb3VudE51bWJlcjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqKi9cbiAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX2lkKSB7XG4gICAgICByZXR1cm4gdGhpcy5faWQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9jb3Ntb3NMaWtlVHJhbnNhY3Rpb24/Lmhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Nvc21vc0xpa2VUcmFuc2FjdGlvbi5oYXNoO1xuICAgIH1cbiAgICByZXR1cm4gVU5BVkFJTEFCTEVfVEVYVDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBjYW5TaWduKGtleTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9jb3Ntb3NMaWtlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplKCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IFR4RGF0YTxDdXN0b21NZXNzYWdlPiB7XG4gICAgaWYgKCF0aGlzLl9jb3Ntb3NMaWtlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHR4ID0gdGhpcy5fY29zbW9zTGlrZVRyYW5zYWN0aW9uO1xuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMuX3R5cGUsXG4gICAgICBzZXF1ZW5jZTogdHguc2VxdWVuY2UsXG4gICAgICBzZW5kTWVzc2FnZXM6IHR4LnNlbmRNZXNzYWdlcyxcbiAgICAgIGdhc0J1ZGdldDogdHguZ2FzQnVkZ2V0LFxuICAgICAgcHVibGljS2V5OiB0eC5wdWJsaWNLZXksXG4gICAgICBzaWduYXR1cmU6IHR4LnNpZ25hdHVyZSxcbiAgICAgIGFjY291bnROdW1iZXI6IHRoaXMuX2FjY291bnROdW1iZXIsXG4gICAgICBjaGFpbklkOiB0aGlzLl9jaGFpbklkLFxuICAgICAgaGFzaDogdHguaGFzaCxcbiAgICAgIG1lbW86IHR4Lm1lbW8sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzaWduYXR1cmUgdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduYXR1cmUgaW4gaGV4IGZvcm1hdFxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdO1xuICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRvSnNvbigpO1xuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3R5cGUnXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gW107XG5cbiAgICBjb25zdCBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogJzAnLFxuICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgIGZlZTogeyBmZWU6IHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uLmdhc0J1ZGdldC5hbW91bnRbMF0uYW1vdW50IH0sXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leHBsYWluVHJhbnNhY3Rpb25JbnRlcm5hbChyZXN1bHQsIGV4cGxhbmF0aW9uUmVzdWx0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGUuXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0LlxuICAgKi9cbiAgc2V0IHRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSkge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIHRoZSB0cmFuc2FjdGlvbiB0byBhIEpTT04gc3RyaW5nXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IHNlcmlhbGl6ZWQgYmFzZTY0IGVuY29kZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR4UmF3ID0gdGhpcy5fdXRpbHMuY3JlYXRlVHhSYXdGcm9tQ29zbW9zTGlrZVRyYW5zYWN0aW9uKHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uKTtcbiAgICBpZiAodGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24/LnB1YmxpY0tleSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX3NpZ25hdHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgc2lnbmVkUmF3VHggPSB0aGlzLl91dGlscy5jcmVhdGVTaWduZWRUeFJhdyhcbiAgICAgICAgdGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24ucHVibGljS2V5LFxuICAgICAgICB0aGlzLl9zaWduYXR1cmVzWzBdLFxuICAgICAgICB0eFJhd1xuICAgICAgKTtcbiAgICAgIHJldHVybiB0b0Jhc2U2NChUeFJhdy5lbmNvZGUoc2lnbmVkUmF3VHgpLmZpbmlzaCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRvQmFzZTY0KFR4UmF3LmVuY29kZSh0eFJhdykuZmluaXNoKCkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICoqL1xuICBnZXQgc2lnbmFibGVQYXlsb2FkKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKFxuICAgICAgbWFrZVNpZ25CeXRlcyh0aGlzLl91dGlscy5jcmVhdGVTaWduRG9jKHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uLCB0aGlzLl9hY2NvdW50TnVtYmVyLCB0aGlzLl9jaGFpbklkKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGV0ZSBleHBsYW5hdGlvbiBmb3IgYSB0cmFuc2ZlciB0cmFuc2FjdGlvblxuICAgKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBvbmUgbWVzc2FnZSBwZXIgdHJhbnNmZXIuXG4gICAqIEBwYXJhbSB7VHhEYXRhfSBqc29uIFRoZSB0cmFuc2FjdGlvbiBkYXRhIGluIGpzb24gZm9ybWF0XG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn0gZXhwbGFuYXRpb25SZXN1bHQgVGhlIHRyYW5zYWN0aW9uIGV4cGxhbmF0aW9uIHRvIGJlIGNvbXBsZXRlZFxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25FeHBsYW5hdGlvbn1cbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbkludGVybmFsKFxuICAgIGpzb246IFR4RGF0YTxDdXN0b21NZXNzYWdlPixcbiAgICBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBsZXQgb3V0cHV0czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgICBsZXQgb3V0cHV0QW1vdW50O1xuICAgIHN3aXRjaCAoanNvbi50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TZW5kOlxuICAgICAgICBleHBsYW5hdGlvblJlc3VsdC50eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgICAgIG91dHB1dEFtb3VudCA9IEJpZ0ludCgwKTtcbiAgICAgICAgb3V0cHV0cyA9IGpzb24uc2VuZE1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNlbmRNZXNzYWdlID0gbWVzc2FnZS52YWx1ZSBhcyBTZW5kTWVzc2FnZTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQgKyBCaWdJbnQoc2VuZE1lc3NhZ2UuYW1vdW50WzBdLmFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRNZXNzYWdlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogc2VuZE1lc3NhZ2UuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FjdGl2YXRlO1xuICAgICAgICBvdXRwdXRBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgICAgIG91dHB1dHMgPSBqc29uLnNlbmRNZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWxlZ2F0ZU1lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQgKyBCaWdJbnQoZGVsZWdhdGVNZXNzYWdlLmFtb3VudC5hbW91bnQpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRyZXNzOiBkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogZGVsZWdhdGVNZXNzYWdlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU6XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0RlYWN0aXZhdGU7XG4gICAgICAgIG91dHB1dEFtb3VudCA9IEJpZ0ludCgwKTtcbiAgICAgICAgb3V0cHV0cyA9IGpzb24uc2VuZE1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRlbGVnYXRlTWVzc2FnZSA9IG1lc3NhZ2UudmFsdWUgYXMgRGVsZWdhdGVPclVuZGVsZWdldGVNZXNzYWdlO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudCArIEJpZ0ludChkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50LmFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGRlbGVnYXRlTWVzc2FnZS52YWxpZGF0b3JBZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiBkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXc6XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1dpdGhkcmF3O1xuICAgICAgICBvdXRwdXRzID0ganNvbi5zZW5kTWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgd2l0aGRyYXdNZXNzYWdlID0gbWVzc2FnZS52YWx1ZSBhcyBXaXRoZHJhd0RlbGVnYXRvclJld2FyZHNNZXNzYWdlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRyZXNzOiB3aXRoZHJhd01lc3NhZ2UudmFsaWRhdG9yQWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogVU5BVkFJTEFCTEVfVEVYVCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5Db250cmFjdENhbGw6XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUgPSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsO1xuICAgICAgICBvdXRwdXRBbW91bnQgPSBCaWdJbnQoMCk7XG4gICAgICAgIG91dHB1dHMgPSBqc29uLnNlbmRNZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCBleGVjdXRlQ29udHJhY3RNZXNzYWdlID0gbWVzc2FnZS52YWx1ZSBhcyBFeGVjdXRlQ29udHJhY3RNZXNzYWdlO1xuICAgICAgICAgIG91dHB1dEFtb3VudCA9IG91dHB1dEFtb3VudCArIEJpZ0ludChleGVjdXRlQ29udHJhY3RNZXNzYWdlLmZ1bmRzPy5bMF0/LmFtb3VudCA/PyAnMCcpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRyZXNzOiBleGVjdXRlQ29udHJhY3RNZXNzYWdlLmNvbnRyYWN0LFxuICAgICAgICAgICAgYW1vdW50OiBleGVjdXRlQ29udHJhY3RNZXNzYWdlLmZ1bmRzPy5bMF0/LmFtb3VudCA/PyAnMCcsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGU6XG4gICAgICAgIGV4cGxhbmF0aW9uUmVzdWx0LnR5cGUgPSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGU7XG4gICAgICAgIG91dHB1dEFtb3VudCA9IEJpZ0ludCgwKTtcbiAgICAgICAgb3V0cHV0cyA9IGpzb24uc2VuZE1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlZGVsZWdhdGVNZXNzYWdlID0gbWVzc2FnZS52YWx1ZSBhcyBSZWRlbGVnYXRlTWVzc2FnZTtcbiAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQgKyBCaWdJbnQocmVkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50LmFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckRzdEFkZHJlc3MsXG4gICAgICAgICAgICBhbW91bnQ6IHJlZGVsZWdhdGVNZXNzYWdlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdUcmFuc2FjdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgaWYgKGpzb24ubWVtbykge1xuICAgICAgb3V0cHV0cy5mb3JFYWNoKChvdXRwdXQpID0+IHtcbiAgICAgICAgb3V0cHV0Lm1lbW8gPSBqc29uLm1lbW87XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQ/LnRvU3RyaW5nKCksXG4gICAgICBvdXRwdXRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG9uIHRoaXMgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHRyYW5zYWN0aW9uIGpzb25cbiAgICogaWYgdGhlcmUgYXJlIG91dHB1dHMuIEZvciB0cmFuc2FjdGlvbnMgd2l0aG91dCBvdXRwdXRzIChlLmcuIHdhbGxldCBpbml0aWFsaXphdGlvbnMpLFxuICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGRvIGFueXRoaW5nXG4gICAqL1xuICBsb2FkSW5wdXRzQW5kT3V0cHV0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlID09PSB1bmRlZmluZWQgfHwgIXRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgb3IgY29zbW9zTGlrZVRyYW5zYWN0aW9uIGlzIG5vdCBzZXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRzOiBFbnRyeVtdID0gW107XG4gICAgY29uc3QgaW5wdXRzOiBFbnRyeVtdID0gW107XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlNlbmQ6XG4gICAgICAgIHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNlbmRNZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VuZE1lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIFNlbmRNZXNzYWdlO1xuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRNZXNzYWdlLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IHNlbmRNZXNzYWdlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHNlbmRNZXNzYWdlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBzZW5kTWVzc2FnZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nQWN0aXZhdGU6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nRGVhY3RpdmF0ZTpcbiAgICAgICAgdGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VuZE1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCBkZWxlZ2F0ZU1lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIERlbGVnYXRlT3JVbmRlbGVnZXRlTWVzc2FnZTtcbiAgICAgICAgICBpbnB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBkZWxlZ2F0ZU1lc3NhZ2UuZGVsZWdhdG9yQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiBkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogZGVsZWdhdGVNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogZGVsZWdhdGVNZXNzYWdlLmFtb3VudC5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlN0YWtpbmdXaXRoZHJhdzpcbiAgICAgICAgdGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VuZE1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgICBjb25zdCB3aXRoZHJhd01lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIFdpdGhkcmF3RGVsZWdhdG9yUmV3YXJkc01lc3NhZ2U7XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogd2l0aGRyYXdNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogVU5BVkFJTEFCTEVfVEVYVCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogd2l0aGRyYXdNZXNzYWdlLnZhbGlkYXRvckFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogVU5BVkFJTEFCTEVfVEVYVCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQ29udHJhY3RDYWxsOlxuICAgICAgICB0aGlzLmNvc21vc0xpa2VUcmFuc2FjdGlvbi5zZW5kTWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV4ZWN1dGVDb250cmFjdE1lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIEV4ZWN1dGVDb250cmFjdE1lc3NhZ2U7XG4gICAgICAgICAgaW5wdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogZXhlY3V0ZUNvbnRyYWN0TWVzc2FnZS5zZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogZXhlY3V0ZUNvbnRyYWN0TWVzc2FnZS5mdW5kcz8uWzBdPy5hbW91bnQgPz8gJzAnLFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiBleGVjdXRlQ29udHJhY3RNZXNzYWdlLmNvbnRyYWN0LFxuICAgICAgICAgICAgdmFsdWU6IGV4ZWN1dGVDb250cmFjdE1lc3NhZ2UuZnVuZHM/LlswXT8uYW1vdW50ID8/ICcwJyxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1JlZGVsZWdhdGU6XG4gICAgICAgIHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNlbmRNZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVkZWxlZ2F0ZU1lc3NhZ2UgPSBtZXNzYWdlLnZhbHVlIGFzIFJlZGVsZWdhdGVNZXNzYWdlO1xuICAgICAgICAgIGlucHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlZGVsZWdhdGVNZXNzYWdlLmRlbGVnYXRvckFkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogcmVkZWxlZ2F0ZU1lc3NhZ2UuYW1vdW50LmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogcmVkZWxlZ2F0ZU1lc3NhZ2UudmFsaWRhdG9yRHN0QWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiByZWRlbGVnYXRlTWVzc2FnZS5hbW91bnQuYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGhpcy5fY29pbkNvbmZpZy5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHR5cGUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGlzIHRyYW5zYWN0aW9uIHBheWxvYWRcbiAgICogQHBhcmFtIHJhd1RyYW5zYWN0aW9uIHJhdyB0cmFuc2FjdGlvbiBpbiBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGVucmljaFRyYW5zYWN0aW9uRGV0YWlsc0Zyb21SYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3V0aWxzLmlzVmFsaWRIZXhTdHJpbmcocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICB0aGlzLmNvc21vc0xpa2VUcmFuc2FjdGlvbiA9IHRoaXMuX3V0aWxzLmRlc2VyaWFsaXplVHJhbnNhY3Rpb24odG9CYXNlNjQoZnJvbUhleChyYXdUcmFuc2FjdGlvbikpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24gPSB0aGlzLl91dGlscy5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY29zbW9zTGlrZVRyYW5zYWN0aW9uLnNpZ25hdHVyZSkge1xuICAgICAgdGhpcy5hZGRTaWduYXR1cmUoQnVmZmVyLmZyb20odGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2lnbmF0dXJlKS50b1N0cmluZygnaGV4JykpO1xuICAgIH1cbiAgICBjb25zdCB0eXBlVXJsID0gdGhpcy5jb3Ntb3NMaWtlVHJhbnNhY3Rpb24uc2VuZE1lc3NhZ2VzWzBdLnR5cGVVcmw7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25UeXBlID0gdGhpcy5fdXRpbHMuZ2V0VHJhbnNhY3Rpb25UeXBlRnJvbVR5cGVVcmwodHlwZVVybCk7XG5cbiAgICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkICcgKyB0eXBlVXJsKTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cbn1cbiJdfQ==
|