@bitgo-beta/sdk-coin-cosmos 1.0.1-alpha.7 → 1.0.1-alpha.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/cosmosSharedCoin.d.ts +28 -3
- package/dist/src/cosmosSharedCoin.d.ts.map +1 -1
- package/dist/src/cosmosSharedCoin.js +69 -5
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +18 -4
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +13 -0
- package/dist/src/lib/keyPair.d.ts +19 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +38 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +32 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +81 -0
- package/dist/src/lib/utils.d.ts +19 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +48 -0
- package/dist/src/register.d.ts +7 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +17 -0
- package/dist/test/resources/mantra.d.ts +70 -0
- package/dist/test/resources/mantra.d.ts.map +1 -0
- package/dist/test/resources/mantra.js +80 -0
- package/dist/test/testUtils/generators.d.ts +54 -0
- package/dist/test/testUtils/generators.d.ts.map +1 -0
- package/dist/test/testUtils/generators.js +183 -0
- package/dist/test/testUtils/index.d.ts +8 -0
- package/dist/test/testUtils/index.d.ts.map +1 -0
- package/dist/test/testUtils/index.js +25 -0
- package/dist/test/testUtils/types.d.ts +203 -0
- package/dist/test/testUtils/types.d.ts.map +1 -0
- package/dist/test/testUtils/types.js +7 -0
- package/dist/test/testUtils/utils.d.ts +43 -0
- package/dist/test/testUtils/utils.d.ts.map +1 -0
- package/dist/test/testUtils/utils.js +122 -0
- package/dist/test/unit/cosmosSharedCoin.d.ts +2 -0
- package/dist/test/unit/cosmosSharedCoin.d.ts.map +1 -0
- package/dist/test/unit/cosmosSharedCoin.js +300 -0
- package/dist/test/unit/keyPair.d.ts +2 -0
- package/dist/test/unit/keyPair.d.ts.map +1 -0
- package/dist/test/unit/keyPair.js +73 -0
- package/dist/test/unit/register.d.ts +2 -0
- package/dist/test/unit/register.d.ts.map +1 -0
- package/dist/test/unit/register.js +48 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilder.js +46 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +186 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +82 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +18 -6
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -10
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for Cosmos SDK test data
|
|
3
|
+
* This file contains utility functions for test data
|
|
4
|
+
*/
|
|
5
|
+
import { TransactionBuilderFactory } from '../../src/lib/transactionBuilderFactory';
|
|
6
|
+
import { CoinTestData } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Get all available test coins
|
|
9
|
+
* @returns {string[]} Array of coin names that have test data
|
|
10
|
+
*/
|
|
11
|
+
export declare const getAvailableTestCoins: () => string[];
|
|
12
|
+
/**
|
|
13
|
+
* Load test data for a specific coin
|
|
14
|
+
*
|
|
15
|
+
* This utility abstracts away the path resolution logic,
|
|
16
|
+
* making it easier to load test data from anywhere in the test suite.
|
|
17
|
+
*
|
|
18
|
+
* @param {string} coinName - The coin name (e.g., 'cosmos', 'cronos')
|
|
19
|
+
* @returns {CoinTestData} The test data for the coin
|
|
20
|
+
* @throws {Error} If the test data for the coin is not found
|
|
21
|
+
*/
|
|
22
|
+
export declare const getTestData: (coinName: string) => CoinTestData;
|
|
23
|
+
/**
|
|
24
|
+
* Get test data for all available coins
|
|
25
|
+
*
|
|
26
|
+
* @returns {Record<string, CoinTestData>} An object mapping coin names to their test data
|
|
27
|
+
*/
|
|
28
|
+
export declare const getAllTestData: () => Record<string, CoinTestData>;
|
|
29
|
+
/**
|
|
30
|
+
* Get the builder factory for a specific coin
|
|
31
|
+
* @param {string} coin - The coin name
|
|
32
|
+
* @returns {TransactionBuilderFactory} The transaction builder factory
|
|
33
|
+
*/
|
|
34
|
+
export declare const getBuilderFactory: (coin: string) => TransactionBuilderFactory;
|
|
35
|
+
/**
|
|
36
|
+
* Ensures that all required properties are present in the test transaction data
|
|
37
|
+
* This is useful for TypeScript type checking in test files
|
|
38
|
+
*
|
|
39
|
+
* @param {T} tx - The transaction data that might have optional properties
|
|
40
|
+
* @returns {Required<T>} The same transaction data but with TypeScript treating all properties as non-optional
|
|
41
|
+
*/
|
|
42
|
+
export declare function ensureTransaction<T>(tx: T): Required<T>;
|
|
43
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/testUtils/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAAO,MAAM,EAa9C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,aAAc,MAAM,KAAG,YAO9C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,QAAO,MAAM,CAAC,MAAM,EAAE,YAAY,CAO5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,SAAU,MAAM,8BAG7C,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAIvD"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for Cosmos SDK test data
|
|
4
|
+
* This file contains utility functions for test data
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.getBuilderFactory = exports.getAllTestData = exports.getTestData = exports.getAvailableTestCoins = void 0;
|
|
41
|
+
exports.ensureTransaction = ensureTransaction;
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
45
|
+
const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
|
|
46
|
+
/**
|
|
47
|
+
* Get all available test coins
|
|
48
|
+
* @returns {string[]} Array of coin names that have test data
|
|
49
|
+
*/
|
|
50
|
+
const getAvailableTestCoins = () => {
|
|
51
|
+
try {
|
|
52
|
+
// Get the resources directory path
|
|
53
|
+
const resourcesDir = path.join(__dirname, '../resources');
|
|
54
|
+
// Read all files in the resources directory
|
|
55
|
+
const files = fs.readdirSync(resourcesDir);
|
|
56
|
+
// Extract coin names by removing the .ts extension
|
|
57
|
+
return files.map((file) => file.replace('.ts', ''));
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Fallback to hardcoded list if there's an error
|
|
61
|
+
console.warn('Failed to dynamically discover test coins:', error);
|
|
62
|
+
return ['cosmos', 'cronos'];
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
exports.getAvailableTestCoins = getAvailableTestCoins;
|
|
66
|
+
/**
|
|
67
|
+
* Load test data for a specific coin
|
|
68
|
+
*
|
|
69
|
+
* This utility abstracts away the path resolution logic,
|
|
70
|
+
* making it easier to load test data from anywhere in the test suite.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} coinName - The coin name (e.g., 'cosmos', 'cronos')
|
|
73
|
+
* @returns {CoinTestData} The test data for the coin
|
|
74
|
+
* @throws {Error} If the test data for the coin is not found
|
|
75
|
+
*/
|
|
76
|
+
const getTestData = (coinName) => {
|
|
77
|
+
try {
|
|
78
|
+
// Dynamic import of the coin-specific test data
|
|
79
|
+
return require(`../resources/${coinName}`).default;
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
throw new Error(`Test data for coin ${coinName} not found: ${e}`);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.getTestData = getTestData;
|
|
86
|
+
/**
|
|
87
|
+
* Get test data for all available coins
|
|
88
|
+
*
|
|
89
|
+
* @returns {Record<string, CoinTestData>} An object mapping coin names to their test data
|
|
90
|
+
*/
|
|
91
|
+
const getAllTestData = () => {
|
|
92
|
+
const availableCoins = (0, exports.getAvailableTestCoins)();
|
|
93
|
+
const result = {};
|
|
94
|
+
for (const coin of availableCoins) {
|
|
95
|
+
result[coin] = (0, exports.getTestData)(coin);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
98
|
+
};
|
|
99
|
+
exports.getAllTestData = getAllTestData;
|
|
100
|
+
/**
|
|
101
|
+
* Get the builder factory for a specific coin
|
|
102
|
+
* @param {string} coin - The coin name
|
|
103
|
+
* @returns {TransactionBuilderFactory} The transaction builder factory
|
|
104
|
+
*/
|
|
105
|
+
const getBuilderFactory = (coin) => {
|
|
106
|
+
const coinConfig = statics_1.coins.get(coin);
|
|
107
|
+
return new transactionBuilderFactory_1.TransactionBuilderFactory(coinConfig);
|
|
108
|
+
};
|
|
109
|
+
exports.getBuilderFactory = getBuilderFactory;
|
|
110
|
+
/**
|
|
111
|
+
* Ensures that all required properties are present in the test transaction data
|
|
112
|
+
* This is useful for TypeScript type checking in test files
|
|
113
|
+
*
|
|
114
|
+
* @param {T} tx - The transaction data that might have optional properties
|
|
115
|
+
* @returns {Required<T>} The same transaction data but with TypeScript treating all properties as non-optional
|
|
116
|
+
*/
|
|
117
|
+
function ensureTransaction(tx) {
|
|
118
|
+
// This function doesn't actually modify the data
|
|
119
|
+
// It just tells TypeScript that all properties are present
|
|
120
|
+
return tx;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3Rlc3RVdGlscy91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE2RUgsOENBSUM7QUEvRUQsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUM3QixpREFBNEM7QUFDNUMsdUZBQW9GO0FBR3BGOzs7R0FHRztBQUNJLE1BQU0scUJBQXFCLEdBQUcsR0FBYSxFQUFFO0lBQ2xELElBQUksQ0FBQztRQUNILG1DQUFtQztRQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUMxRCw0Q0FBNEM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzQyxtREFBbUQ7UUFDbkQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsaURBQWlEO1FBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsNENBQTRDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBYlcsUUFBQSxxQkFBcUIseUJBYWhDO0FBRUY7Ozs7Ozs7OztHQVNHO0FBQ0ksTUFBTSxXQUFXLEdBQUcsQ0FBQyxRQUFnQixFQUFnQixFQUFFO0lBQzVELElBQUksQ0FBQztRQUNILGdEQUFnRDtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDckQsQ0FBQztJQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixRQUFRLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBUFcsUUFBQSxXQUFXLGVBT3RCO0FBRUY7Ozs7R0FJRztBQUNJLE1BQU0sY0FBYyxHQUFHLEdBQWlDLEVBQUU7SUFDL0QsTUFBTSxjQUFjLEdBQUcsSUFBQSw2QkFBcUIsR0FBRSxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFpQyxFQUFFLENBQUM7SUFDaEQsS0FBSyxNQUFNLElBQUksSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBQSxtQkFBVyxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFQVyxRQUFBLGNBQWMsa0JBT3pCO0FBRUY7Ozs7R0FJRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtJQUNoRCxNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLE9BQU8sSUFBSSxxREFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRCxDQUFDLENBQUM7QUFIVyxRQUFBLGlCQUFpQixxQkFHNUI7QUFFRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixpQkFBaUIsQ0FBSSxFQUFLO0lBQ3hDLGlEQUFpRDtJQUNqRCwyREFBMkQ7SUFDM0QsT0FBTyxFQUFpQixDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBDb3Ntb3MgU0RLIHRlc3QgZGF0YVxuICogVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0ZXN0IGRhdGFcbiAqL1xuXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgQ29pblRlc3REYXRhIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogR2V0IGFsbCBhdmFpbGFibGUgdGVzdCBjb2luc1xuICogQHJldHVybnMge3N0cmluZ1tdfSBBcnJheSBvZiBjb2luIG5hbWVzIHRoYXQgaGF2ZSB0ZXN0IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEF2YWlsYWJsZVRlc3RDb2lucyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gR2V0IHRoZSByZXNvdXJjZXMgZGlyZWN0b3J5IHBhdGhcbiAgICBjb25zdCByZXNvdXJjZXNEaXIgPSBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vcmVzb3VyY2VzJyk7XG4gICAgLy8gUmVhZCBhbGwgZmlsZXMgaW4gdGhlIHJlc291cmNlcyBkaXJlY3RvcnlcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKHJlc291cmNlc0Rpcik7XG4gICAgLy8gRXh0cmFjdCBjb2luIG5hbWVzIGJ5IHJlbW92aW5nIHRoZSAudHMgZXh0ZW5zaW9uXG4gICAgcmV0dXJuIGZpbGVzLm1hcCgoZmlsZSkgPT4gZmlsZS5yZXBsYWNlKCcudHMnLCAnJykpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZhbGxiYWNrIHRvIGhhcmRjb2RlZCBsaXN0IGlmIHRoZXJlJ3MgYW4gZXJyb3JcbiAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBkeW5hbWljYWxseSBkaXNjb3ZlciB0ZXN0IGNvaW5zOicsIGVycm9yKTtcbiAgICByZXR1cm4gWydjb3Ntb3MnLCAnY3Jvbm9zJ107XG4gIH1cbn07XG5cbi8qKlxuICogTG9hZCB0ZXN0IGRhdGEgZm9yIGEgc3BlY2lmaWMgY29pblxuICpcbiAqIFRoaXMgdXRpbGl0eSBhYnN0cmFjdHMgYXdheSB0aGUgcGF0aCByZXNvbHV0aW9uIGxvZ2ljLFxuICogbWFraW5nIGl0IGVhc2llciB0byBsb2FkIHRlc3QgZGF0YSBmcm9tIGFueXdoZXJlIGluIHRoZSB0ZXN0IHN1aXRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb2luTmFtZSAtIFRoZSBjb2luIG5hbWUgKGUuZy4sICdjb3Ntb3MnLCAnY3Jvbm9zJylcbiAqIEByZXR1cm5zIHtDb2luVGVzdERhdGF9IFRoZSB0ZXN0IGRhdGEgZm9yIHRoZSBjb2luXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHRlc3QgZGF0YSBmb3IgdGhlIGNvaW4gaXMgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRUZXN0RGF0YSA9IChjb2luTmFtZTogc3RyaW5nKTogQ29pblRlc3REYXRhID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBEeW5hbWljIGltcG9ydCBvZiB0aGUgY29pbi1zcGVjaWZpYyB0ZXN0IGRhdGFcbiAgICByZXR1cm4gcmVxdWlyZShgLi4vcmVzb3VyY2VzLyR7Y29pbk5hbWV9YCkuZGVmYXVsdDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGVzdCBkYXRhIGZvciBjb2luICR7Y29pbk5hbWV9IG5vdCBmb3VuZDogJHtlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0ZXN0IGRhdGEgZm9yIGFsbCBhdmFpbGFibGUgY29pbnNcbiAqXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgQ29pblRlc3REYXRhPn0gQW4gb2JqZWN0IG1hcHBpbmcgY29pbiBuYW1lcyB0byB0aGVpciB0ZXN0IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsbFRlc3REYXRhID0gKCk6IFJlY29yZDxzdHJpbmcsIENvaW5UZXN0RGF0YT4gPT4ge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIENvaW5UZXN0RGF0YT4gPSB7fTtcbiAgZm9yIChjb25zdCBjb2luIG9mIGF2YWlsYWJsZUNvaW5zKSB7XG4gICAgcmVzdWx0W2NvaW5dID0gZ2V0VGVzdERhdGEoY29pbik7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBidWlsZGVyIGZhY3RvcnkgZm9yIGEgc3BlY2lmaWMgY29pblxuICogQHBhcmFtIHtzdHJpbmd9IGNvaW4gLSBUaGUgY29pbiBuYW1lXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeX0gVGhlIHRyYW5zYWN0aW9uIGJ1aWxkZXIgZmFjdG9yeVxuICovXG5leHBvcnQgY29uc3QgZ2V0QnVpbGRlckZhY3RvcnkgPSAoY29pbjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNvaW5Db25maWcgPSBjb2lucy5nZXQoY29pbik7XG4gIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbn07XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSBwcmVzZW50IGluIHRoZSB0ZXN0IHRyYW5zYWN0aW9uIGRhdGFcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBUeXBlU2NyaXB0IHR5cGUgY2hlY2tpbmcgaW4gdGVzdCBmaWxlc1xuICpcbiAqIEBwYXJhbSB7VH0gdHggLSBUaGUgdHJhbnNhY3Rpb24gZGF0YSB0aGF0IG1pZ2h0IGhhdmUgb3B0aW9uYWwgcHJvcGVydGllc1xuICogQHJldHVybnMge1JlcXVpcmVkPFQ+fSBUaGUgc2FtZSB0cmFuc2FjdGlvbiBkYXRhIGJ1dCB3aXRoIFR5cGVTY3JpcHQgdHJlYXRpbmcgYWxsIHByb3BlcnRpZXMgYXMgbm9uLW9wdGlvbmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVUcmFuc2FjdGlvbjxUPih0eDogVCk6IFJlcXVpcmVkPFQ+IHtcbiAgLy8gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IG1vZGlmeSB0aGUgZGF0YVxuICAvLyBJdCBqdXN0IHRlbGxzIFR5cGVTY3JpcHQgdGhhdCBhbGwgcHJvcGVydGllcyBhcmUgcHJlc2VudFxuICByZXR1cm4gdHggYXMgUmVxdWlyZWQ8VD47XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cosmosSharedCoin.d.ts","sourceRoot":"","sources":["../../../test/unit/cosmosSharedCoin.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,300 @@
|
|
|
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
|
+
const should_1 = __importDefault(require("should"));
|
|
7
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
8
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
9
|
+
const encoding_1 = require("@cosmjs/encoding");
|
|
10
|
+
const sdk_test_1 = require("@bitgo-beta/sdk-test");
|
|
11
|
+
const sdk_api_1 = require("@bitgo-beta/sdk-api");
|
|
12
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
13
|
+
const src_1 = require("../../src");
|
|
14
|
+
const testUtils_1 = require("../testUtils");
|
|
15
|
+
describe('Cosmos Shared Coin', function () {
|
|
16
|
+
const availableCoins = (0, testUtils_1.getAvailableTestCoins)();
|
|
17
|
+
// TODO: COIN-5039 - Running tests for each coin in parallel to improve test performance
|
|
18
|
+
// Loop through each available coin and run tests
|
|
19
|
+
availableCoins.forEach((coinName) => {
|
|
20
|
+
describe(`${coinName.toUpperCase()} Cosmos Shared Coin`, function () {
|
|
21
|
+
let bitgo;
|
|
22
|
+
let cosmosCoin;
|
|
23
|
+
let utils;
|
|
24
|
+
const testData = (0, testUtils_1.getTestData)(coinName);
|
|
25
|
+
const testTx = testData.testSendTx;
|
|
26
|
+
const testTxWithMemo = testData.testTxWithMemo;
|
|
27
|
+
const coin = statics_1.coins.get(testData.testnetCoin);
|
|
28
|
+
const network = coin.network;
|
|
29
|
+
before(function () {
|
|
30
|
+
bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
31
|
+
bitgo.safeRegister(testData.testnetCoin, src_1.CosmosSharedCoin.createInstance);
|
|
32
|
+
bitgo.safeRegister(testData.mainnetCoin, src_1.CosmosSharedCoin.createInstance);
|
|
33
|
+
bitgo.initializeTestVars();
|
|
34
|
+
cosmosCoin = bitgo.coin(testData.testnetCoin);
|
|
35
|
+
utils = new src_1.Utils(network);
|
|
36
|
+
});
|
|
37
|
+
it('should instantiate the coin', function () {
|
|
38
|
+
should_1.default.exist(cosmosCoin);
|
|
39
|
+
cosmosCoin.should.be.an.instanceof(src_1.CosmosSharedCoin);
|
|
40
|
+
});
|
|
41
|
+
it('should return the right info', function () {
|
|
42
|
+
const testCoin = bitgo.coin(testData.testnetCoin);
|
|
43
|
+
const mainnetCoin = bitgo.coin(testData.mainnetCoin);
|
|
44
|
+
testCoin.getChain().should.equal(testData.testnetCoin);
|
|
45
|
+
testCoin.getFamily().should.equal(testData.family);
|
|
46
|
+
testCoin.getFullName().should.equal(testData.testnetName);
|
|
47
|
+
testCoin.getBaseFactor().should.equal(Math.pow(10, testData.decimalPlaces));
|
|
48
|
+
mainnetCoin.getChain().should.equal(testData.mainnetCoin);
|
|
49
|
+
mainnetCoin.getFamily().should.equal(testData.family);
|
|
50
|
+
mainnetCoin.getFullName().should.equal(testData.mainnetName);
|
|
51
|
+
mainnetCoin.getBaseFactor().should.equal(Math.pow(10, testData.decimalPlaces));
|
|
52
|
+
});
|
|
53
|
+
it('should throw if instantiated without a staticsCoin', function () {
|
|
54
|
+
const tempBitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
55
|
+
(0, should_1.default)(() => src_1.CosmosSharedCoin.createInstance(tempBitgo)).throwError('missing required constructor parameter staticsCoin');
|
|
56
|
+
});
|
|
57
|
+
it('should throw if instantiated with invalid network configuration', function () {
|
|
58
|
+
const tempBitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
|
|
59
|
+
const invalidCoin = Object.assign({}, coin, { network: {} });
|
|
60
|
+
(0, should_1.default)(() => src_1.CosmosSharedCoin.createInstance(tempBitgo, invalidCoin)).throwError('Invalid network configuration: missing required Cosmos network parameters');
|
|
61
|
+
});
|
|
62
|
+
describe('getBaseFactor', function () {
|
|
63
|
+
it('should return the correct base factor', function () {
|
|
64
|
+
const baseFactor = cosmosCoin.getBaseFactor();
|
|
65
|
+
should_1.default.equal(baseFactor, Math.pow(10, testData.decimalPlaces));
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('getBuilder', function () {
|
|
69
|
+
it('should return a transaction builder', function () {
|
|
70
|
+
const builder = cosmosCoin.getBuilder();
|
|
71
|
+
should_1.default.exist(builder);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
describe('getDenomination', function () {
|
|
75
|
+
it('should return the correct denomination', function () {
|
|
76
|
+
should_1.default.equal(cosmosCoin.getDenomination(), network.denom);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
describe('getGasAmountDetails', function () {
|
|
80
|
+
it('should return the correct gas amount details', function () {
|
|
81
|
+
const gasAmountDetails = cosmosCoin.getGasAmountDetails();
|
|
82
|
+
should_1.default.deepEqual(gasAmountDetails, {
|
|
83
|
+
gasAmount: network.gasAmount,
|
|
84
|
+
gasLimit: network.gasLimit,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('getNetwork', function () {
|
|
89
|
+
it('should return the correct network', function () {
|
|
90
|
+
const returnedNetwork = cosmosCoin.getNetwork();
|
|
91
|
+
should_1.default.deepEqual(returnedNetwork, network);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('getKeyPair', function () {
|
|
95
|
+
it('should return a key pair', function () {
|
|
96
|
+
const keyPair = cosmosCoin.getKeyPair((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testData.pubKey)));
|
|
97
|
+
should_1.default.exist(keyPair);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('getAddressFromPublicKey', function () {
|
|
101
|
+
it('should return the correct address', function () {
|
|
102
|
+
const address = cosmosCoin.getAddressFromPublicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testData.pubKey)));
|
|
103
|
+
should_1.default.equal(address, testData.senderAddress);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
describe('Address Validation', () => {
|
|
107
|
+
it('should get address details without memoId', function () {
|
|
108
|
+
const addressDetails = cosmosCoin.getAddressDetails(testData.addresses.noMemoIdAddress);
|
|
109
|
+
addressDetails.address.should.equal(testData.addresses.noMemoIdAddress);
|
|
110
|
+
should_1.default.not.exist(addressDetails.memoId);
|
|
111
|
+
});
|
|
112
|
+
it('should get address details with memoId', function () {
|
|
113
|
+
const addressDetails = cosmosCoin.getAddressDetails(testData.addresses.validMemoIdAddress);
|
|
114
|
+
addressDetails.address.should.equal(testData.addresses.validMemoIdAddress.split('?')[0]);
|
|
115
|
+
if (addressDetails.memoId) {
|
|
116
|
+
addressDetails.memoId.should.equal('2');
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
should_1.default.fail('Expected memoId to be defined', null);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
it('should throw on invalid memo id address', () => {
|
|
123
|
+
(() => {
|
|
124
|
+
cosmosCoin.getAddressDetails(testData.addresses.invalidMemoIdAddress);
|
|
125
|
+
}).should.throw();
|
|
126
|
+
});
|
|
127
|
+
it('should throw on multiple memo id address', () => {
|
|
128
|
+
(() => {
|
|
129
|
+
cosmosCoin.getAddressDetails(testData.addresses.multipleMemoIdAddress);
|
|
130
|
+
}).should.throw();
|
|
131
|
+
});
|
|
132
|
+
it('should validate wallet receive address', async function () {
|
|
133
|
+
const receiveAddress = {
|
|
134
|
+
address: `${testData.addresses.address1}?memoId=7`,
|
|
135
|
+
coinSpecific: {
|
|
136
|
+
rootAddress: testData.addresses.address1,
|
|
137
|
+
memoID: '7',
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
// as VerifyTransactionOptions
|
|
141
|
+
const isValid = await cosmosCoin.isWalletAddress(receiveAddress);
|
|
142
|
+
isValid.should.equal(true);
|
|
143
|
+
});
|
|
144
|
+
it('should validate account addresses correctly', () => {
|
|
145
|
+
should_1.default.equal(utils.isValidAddress(testData.addresses.address1), true);
|
|
146
|
+
should_1.default.equal(utils.isValidAddress(testData.addresses.address2), true);
|
|
147
|
+
should_1.default.equal(utils.isValidAddress('dfjk35y'), false);
|
|
148
|
+
should_1.default.equal(utils.isValidAddress(undefined), false);
|
|
149
|
+
should_1.default.equal(utils.isValidAddress(''), false);
|
|
150
|
+
should_1.default.equal(utils.isValidAddress(testData.addresses.validMemoIdAddress), true);
|
|
151
|
+
should_1.default.equal(utils.isValidAddress(testData.addresses.invalidMemoIdAddress), false);
|
|
152
|
+
should_1.default.equal(utils.isValidAddress(testData.addresses.multipleMemoIdAddress), false);
|
|
153
|
+
});
|
|
154
|
+
it('should validate validator addresses correctly', () => {
|
|
155
|
+
should_1.default.equal(utils.isValidValidatorAddress(testData.addresses.validatorAddress1), true);
|
|
156
|
+
should_1.default.equal(utils.isValidValidatorAddress(testData.addresses.validatorAddress2), true);
|
|
157
|
+
should_1.default.equal(utils.isValidValidatorAddress('dfjk35y'), false);
|
|
158
|
+
should_1.default.equal(utils.isValidValidatorAddress(undefined), false);
|
|
159
|
+
should_1.default.equal(utils.isValidValidatorAddress(''), false);
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
describe('Verify transaction: ', () => {
|
|
163
|
+
it('should succeed to verify transaction', async function () {
|
|
164
|
+
const txPrebuild = {
|
|
165
|
+
txHex: testTx.signedTxBase64,
|
|
166
|
+
txInfo: {},
|
|
167
|
+
};
|
|
168
|
+
const txParams = {
|
|
169
|
+
recipients: [
|
|
170
|
+
{
|
|
171
|
+
address: testTx.recipient,
|
|
172
|
+
amount: testTx.sendAmount,
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
};
|
|
176
|
+
const verification = {};
|
|
177
|
+
const isTransactionVerified = await cosmosCoin.verifyTransaction({
|
|
178
|
+
txParams,
|
|
179
|
+
txPrebuild,
|
|
180
|
+
verification,
|
|
181
|
+
});
|
|
182
|
+
isTransactionVerified.should.equal(true);
|
|
183
|
+
});
|
|
184
|
+
it('should succeed to verify sendMany transaction', async function () {
|
|
185
|
+
const txPrebuild = {
|
|
186
|
+
txHex: testTx.signedTxBase64,
|
|
187
|
+
txInfo: {},
|
|
188
|
+
};
|
|
189
|
+
const txParams = {
|
|
190
|
+
recipients: [
|
|
191
|
+
{
|
|
192
|
+
address: testTx.recipient,
|
|
193
|
+
amount: testTx.sendAmount,
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
};
|
|
197
|
+
const verification = {};
|
|
198
|
+
const isTransactionVerified = await cosmosCoin.verifyTransaction({
|
|
199
|
+
txParams,
|
|
200
|
+
txPrebuild,
|
|
201
|
+
verification,
|
|
202
|
+
});
|
|
203
|
+
isTransactionVerified.should.equal(true);
|
|
204
|
+
});
|
|
205
|
+
it('should fail to verify transaction with invalid param', async function () {
|
|
206
|
+
const txPrebuild = {};
|
|
207
|
+
const txParams = { recipients: undefined };
|
|
208
|
+
await cosmosCoin
|
|
209
|
+
.verifyTransaction({ txParams, txPrebuild })
|
|
210
|
+
.should.be.rejectedWith('missing required tx prebuild property txHex');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe('Explain Transaction: ', () => {
|
|
214
|
+
it('should explain a transfer transaction', async function () {
|
|
215
|
+
const explainedTransaction = await cosmosCoin.explainTransaction({
|
|
216
|
+
txHex: testTx.signedTxBase64,
|
|
217
|
+
});
|
|
218
|
+
explainedTransaction.should.deepEqual({
|
|
219
|
+
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
|
|
220
|
+
id: testTx.hash,
|
|
221
|
+
outputs: [
|
|
222
|
+
{
|
|
223
|
+
address: testTx.recipient,
|
|
224
|
+
amount: testTx.sendAmount,
|
|
225
|
+
},
|
|
226
|
+
],
|
|
227
|
+
outputAmount: testTx.sendAmount,
|
|
228
|
+
changeOutputs: [],
|
|
229
|
+
changeAmount: '0',
|
|
230
|
+
fee: { fee: testTx.feeAmount },
|
|
231
|
+
type: 0,
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
it('should explain a transfer transaction with memo', async function () {
|
|
235
|
+
const explainedTransaction = await cosmosCoin.explainTransaction({
|
|
236
|
+
txHex: testTxWithMemo.signedTxBase64,
|
|
237
|
+
});
|
|
238
|
+
explainedTransaction.should.deepEqual({
|
|
239
|
+
displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
|
|
240
|
+
id: testTxWithMemo.hash,
|
|
241
|
+
outputs: [
|
|
242
|
+
{
|
|
243
|
+
address: testTxWithMemo.recipient,
|
|
244
|
+
amount: testTxWithMemo.sendAmount,
|
|
245
|
+
memo: testTxWithMemo.memo,
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
outputAmount: testTxWithMemo.sendAmount,
|
|
249
|
+
changeOutputs: [],
|
|
250
|
+
changeAmount: '0',
|
|
251
|
+
fee: { fee: testTxWithMemo.feeAmount },
|
|
252
|
+
type: 0,
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
it('should fail to explain transaction with missing params', async function () {
|
|
256
|
+
try {
|
|
257
|
+
await cosmosCoin.explainTransaction({ txHex: '' });
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
should_1.default.equal(error.message, 'missing required txHex parameter');
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
it('should fail to explain transaction with invalid params', async function () {
|
|
264
|
+
try {
|
|
265
|
+
await cosmosCoin.explainTransaction({ txHex: 'randomString' });
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
should_1.default.equal(error.message.startsWith('Invalid transaction:'), true);
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
describe('Parse Transactions: ', () => {
|
|
273
|
+
const transferInputsResponse = {
|
|
274
|
+
address: testTx.recipient,
|
|
275
|
+
amount: new bignumber_js_1.default(testTx.sendAmount).plus(testTx.feeAmount).toFixed(),
|
|
276
|
+
};
|
|
277
|
+
const transferOutputsResponse = {
|
|
278
|
+
address: testTx.recipient,
|
|
279
|
+
amount: testTx.sendAmount,
|
|
280
|
+
};
|
|
281
|
+
it('should parse a transfer transaction', async function () {
|
|
282
|
+
const parsedTransaction = await cosmosCoin.parseTransaction({ txHex: testTx.signedTxBase64 });
|
|
283
|
+
parsedTransaction.should.deepEqual({
|
|
284
|
+
inputs: [transferInputsResponse],
|
|
285
|
+
outputs: [transferOutputsResponse],
|
|
286
|
+
});
|
|
287
|
+
});
|
|
288
|
+
it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
|
|
289
|
+
const stub = sinon_1.default.stub(src_1.CosmosSharedCoin.prototype, 'explainTransaction');
|
|
290
|
+
stub.resolves(undefined);
|
|
291
|
+
await cosmosCoin
|
|
292
|
+
.parseTransaction({ txHex: testTx.signedTxBase64 })
|
|
293
|
+
.should.be.rejectedWith('Invalid transaction');
|
|
294
|
+
stub.restore();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zbW9zU2hhcmVkQ29pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9jb3Ntb3NTaGFyZWRDb2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUNyQyxrREFBMEI7QUFDMUIsK0NBQXFEO0FBRXJELG1EQUErRDtBQUMvRCxpREFBK0M7QUFDL0MsaURBQTJEO0FBQzNELG1DQUFvRDtBQUNwRCw0Q0FBa0U7QUFFbEUsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLE1BQU0sY0FBYyxHQUFHLElBQUEsaUNBQXFCLEdBQUUsQ0FBQztJQUMvQyx5RkFBeUY7SUFDekYsaURBQWlEO0lBQ2pELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFO1lBQ3ZELElBQUksS0FBbUIsQ0FBQztZQUN4QixJQUFJLFVBQTRCLENBQUM7WUFDakMsSUFBSSxLQUFZLENBQUM7WUFDakIsTUFBTSxRQUFRLEdBQUcsSUFBQSx1QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFrRCxDQUFDO1lBQzNFLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUEwRCxDQUFDO1lBQzNGLE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUF3QixDQUFDO1lBRTlDLE1BQU0sQ0FBQztnQkFDTCxLQUFLLEdBQUcsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUN0RCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFX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SCxFQUFFLENBQUMsMkZBQTJGLEVBQUUsS0FBSztvQkFDbkcsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLElBQUksQ0FBQyxzQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztvQkFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekIsTUFBTSxVQUFVO3lCQUNiLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQzt5QkFDbEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztvQkFDakQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IGZyb21CYXNlNjQsIHRvSGV4IH0gZnJvbSAnQGNvc21qcy9lbmNvZGluZyc7XG5pbXBvcnQgeyBWZXJpZnlBZGRyZXNzT3B0aW9ucywgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgVGVzdEJpdEdvLCBUZXN0Qml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstdGVzdCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgY29pbnMsIENvc21vc05ldHdvcmsgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IENvc21vc1NoYXJlZENvaW4sIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCB7IGdldEF2YWlsYWJsZVRlc3RDb2lucywgZ2V0VGVzdERhdGEgfSBmcm9tICcuLi90ZXN0VXRpbHMnO1xuXG5kZXNjcmliZSgnQ29zbW9zIFNoYXJlZCBDb2luJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICAvLyBUT0RPOiBDT0lOLTUwMzkgLSAgUnVubmluZyB0ZXN0cyBmb3IgZWFjaCBjb2luIGluIHBhcmFsbGVsIHRvIGltcHJvdmUgdGVzdCBwZXJmb3JtYW5jZVxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBhdmFpbGFibGUgY29pbiBhbmQgcnVuIHRlc3RzXG4gIGF2YWlsYWJsZUNvaW5zLmZvckVhY2goKGNvaW5OYW1lKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbk5hbWUudG9VcHBlckNhc2UoKX0gQ29zbW9zIFNoYXJlZCBDb2luYCwgZnVuY3Rpb24gKCkge1xuICAgICAgbGV0IGJpdGdvOiBUZXN0Qml0R29BUEk7XG4gICAgICBsZXQgY29zbW9zQ29pbjogQ29zbW9zU2hhcmVkQ29pbjtcbiAgICAgIGxldCB1dGlsczogVXRpbHM7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IGdldFRlc3REYXRhKGNvaW5OYW1lKTtcbiAgICAgIGNvbnN0IHRlc3RUeCA9IHRlc3REYXRhLnRlc3RTZW5kVHggYXMgUmVxdWlyZWQ8dHlwZW9mIHRlc3REYXRhLnRlc3RTZW5kVHg+O1xuICAgICAgY29uc3QgdGVzdFR4V2l0aE1lbW8gPSB0ZXN0RGF0YS50ZXN0VHhXaXRoTWVtbyBhcyBSZXF1aXJlZDx0eXBlb2YgdGVzdERhdGEudGVzdFR4V2l0aE1lbW8+O1xuICAgICAgY29uc3QgY29pbiA9IGNvaW5zLmdldCh0ZXN0RGF0YS50ZXN0bmV0Q29pbik7XG4gICAgICBjb25zdCBuZXR3b3JrID0gY29pbi5uZXR3b3JrIGFzIENvc21vc05ldHdvcms7XG5cbiAgICAgIGJlZm9yZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICAgICAgICBiaXRnby5zYWZlUmVnaXN0ZXIodGVzdERhdGEudGVzdG5ldENvaW4sIENvc21vc1NoYXJlZENvaW4uY3JlYXRlSW5zdGFuY2UpO1xuICAgICAgICBiaXRnby5zYWZlUmVnaXN0ZXIodGVzdERhdGEubWFpbm5ldENvaW4sIENvc21vc1NoYXJlZENvaW4uY3JlYXRlSW5zdGFuY2UpO1xuICAgICAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICAgICAgY29zbW9zQ29pbiA9IGJpdGdvLmNvaW4odGVzdERhdGEudGVzdG5ldENvaW4pIGFzIENvc21vc1NoYXJlZENvaW47XG4gICAgICAgIHV0aWxzID0gbmV3IFV0aWxzKG5ldHdvcmspO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgdGhlIGNvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNob3VsZC5leGlzdChjb3Ntb3NDb2luKTtcbiAgICAgICAgY29zbW9zQ29pbi5zaG91bGQuYmUuYW4uaW5zdGFuY2VvZihDb3Ntb3NTaGFyZWRDb2luKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgcmlnaHQgaW5mbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdGVzdENvaW4gPSBiaXRnby5jb2luKHRlc3REYXRhLnRlc3RuZXRDb2luKTtcbiAgICAgICAgY29uc3QgbWFpbm5ldENvaW4gPSBiaXRnby5jb2luKHRlc3REYXRhLm1haW5uZXRDb2luKTtcbiAgICAgICAgdGVzdENvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodGVzdERhdGEudGVzdG5ldENvaW4pO1xuICAgICAgICB0ZXN0Q29pbi5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuZmFtaWx5KTtcbiAgICAgICAgdGVzdENvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwodGVzdERhdGEudGVzdG5ldE5hbWUpO1xuICAgICAgICB0ZXN0Q29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKE1hdGgucG93KDEwLCB0ZXN0RGF0YS5kZWNpbWFsUGxhY2VzKSk7XG5cbiAgICAgICAgbWFpbm5ldENvaW4uZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwodGVzdERhdGEubWFpbm5ldENvaW4pO1xuICAgICAgICBtYWlubmV0Q29pbi5nZXRGYW1pbHkoKS5zaG91bGQuZXF1YWwodGVzdERhdGEuZmFtaWx5KTtcbiAgICAgICAgbWFpbm5ldENvaW4uZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwodGVzdERhdGEubWFpbm5ldE5hbWUpO1xuICAgICAgICBtYWlubmV0Q29pbi5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKE1hdGgucG93KDEwLCB0ZXN0RGF0YS5kZWNpbWFsUGxhY2VzKSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBpbnN0YW50aWF0ZWQgd2l0aG91dCBhIHN0YXRpY3NDb2luJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0ZW1wQml0Z28gPSBUZXN0Qml0R28uZGVjb3JhdGUoQml0R29BUEksIHsgZW52OiAndGVzdCcgfSk7XG4gICAgICAgIHNob3VsZCgoKSA9PiBDb3Ntb3NTaGFyZWRDb2luLmNyZWF0ZUluc3RhbmNlKHRlbXBCaXRnbykpLnRocm93RXJyb3IoXG4gICAgICAgICAgJ21pc3NpbmcgcmVxdWlyZWQgY29uc3RydWN0b3IgcGFyYW1ldGVyIHN0YXRpY3NDb2luJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgaWYgaW5zdGFudGlhdGVkIHdpdGggaW52YWxpZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHRlbXBCaXRnbyA9IFRlc3RCaXRHby5kZWNvcmF0ZShCaXRHb0FQSSwgeyBlbnY6ICd0ZXN0JyB9KTtcbiAgICAgICAgY29uc3QgaW52YWxpZENvaW4gPSBPYmplY3QuYXNzaWduKHt9LCBjb2luLCB7IG5ldHdvcms6IHt9IH0pO1xuICAgICAgICBzaG91bGQoKCkgPT4gQ29zbW9zU2hhcmVkQ29pbi5jcmVhdGVJbnN0YW5jZSh0ZW1wQml0Z28sIGludmFsaWRDb2luKSkudGhyb3dFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBuZXR3b3JrIGNvbmZpZ3VyYXRpb246IG1pc3NpbmcgcmVxdWlyZWQgQ29zbW9zIG5ldHdvcmsgcGFyYW1ldGVycydcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZ2V0QmFzZUZhY3RvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgYmFzZSBmYWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYmFzZUZhY3RvciA9IGNvc21vc0NvaW4uZ2V0QmFzZUZhY3RvcigpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChiYXNlRmFjdG9yLCBNYXRoLnBvdygxMCwgdGVzdERhdGEuZGVjaW1hbFBsYWNlcykpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZ2V0QnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB0cmFuc2FjdGlvbiBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBjb3Ntb3NDb2luLmdldEJ1aWxkZXIoKTtcbiAgICAgICAgICBzaG91bGQuZXhpc3QoYnVpbGRlcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdnZXREZW5vbWluYXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGRlbm9taW5hdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoY29zbW9zQ29pbi5nZXREZW5vbWluYXRpb24oKSwgbmV0d29yay5kZW5vbSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdnZXRHYXNBbW91bnREZXRhaWxzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBnYXMgYW1vdW50IGRldGFpbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgZ2FzQW1vdW50RGV0YWlscyA9IGNvc21vc0NvaW4uZ2V0R2FzQW1vdW50RGV0YWlscygpO1xuICAgICAgICAgIHNob3VsZC5kZWVwRXF1YWwoZ2FzQW1vdW50RGV0YWlscywge1xuICAgICAgICAgICAgZ2FzQW1vdW50OiBuZXR3b3JrLmdhc0Ftb3VudCxcbiAgICAgICAgICAgIGdhc0xpbWl0OiBuZXR3b3JrLmdhc0xpbWl0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZ2V0TmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgbmV0d29yaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCByZXR1cm5lZE5ldHdvcmsgPSBjb3Ntb3NDb2luLmdldE5ldHdvcmsoKTtcbiAgICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHJldHVybmVkTmV0d29yaywgbmV0d29yayk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdnZXRLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIGtleSBwYWlyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGtleVBhaXIgPSBjb3Ntb3NDb2luLmdldEtleVBhaXIodG9IZXgoZnJvbUJhc2U2NCh0ZXN0RGF0YS5wdWJLZXkpKSk7XG4gICAgICAgICAgc2hvdWxkLmV4aXN0KGtleVBhaXIpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXknLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IGNvc21vc0NvaW4uZ2V0QWRkcmVzc0Zyb21QdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0RGF0YS5wdWJLZXkpKSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKGFkZHJlc3MsIHRlc3REYXRhLnNlbmRlckFkZHJlc3MpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnQWRkcmVzcyBWYWxpZGF0aW9uJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGdldCBhZGRyZXNzIGRldGFpbHMgd2l0aG91dCBtZW1vSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSBjb3Ntb3NDb2luLmdldEFkZHJlc3NEZXRhaWxzKHRlc3REYXRhLmFkZHJlc3Nlcy5ub01lbW9JZEFkZHJlc3MpO1xuICAgICAgICAgIGFkZHJlc3NEZXRhaWxzLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLmFkZHJlc3Nlcy5ub01lbW9JZEFkZHJlc3MpO1xuICAgICAgICAgIHNob3VsZC5ub3QuZXhpc3QoYWRkcmVzc0RldGFpbHMubWVtb0lkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCBnZXQgYWRkcmVzcyBkZXRhaWxzIHdpdGggbWVtb0lkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gY29zbW9zQ29pbi5nZXRBZGRyZXNzRGV0YWlscyh0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRNZW1vSWRBZGRyZXNzKTtcbiAgICAgICAgICBhZGRyZXNzRGV0YWlscy5hZGRyZXNzLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRNZW1vSWRBZGRyZXNzLnNwbGl0KCc/JylbMF0pO1xuICAgICAgICAgIGlmIChhZGRyZXNzRGV0YWlscy5tZW1vSWQpIHtcbiAgICAgICAgICAgIGFkZHJlc3NEZXRhaWxzLm1lbW9JZC5zaG91bGQuZXF1YWwoJzInKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvdWxkLmZhaWwoJ0V4cGVjdGVkIG1lbW9JZCB0byBiZSBkZWZpbmVkJywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IG9uIGludmFsaWQgbWVtbyBpZCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICBjb3Ntb3NDb2luLmdldEFkZHJlc3NEZXRhaWxzKHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkTWVtb0lkQWRkcmVzcyk7XG4gICAgICAgICAgfSkuc2hvdWxkLnRocm93KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgb24gbXVsdGlwbGUgbWVtbyBpZCBhZGRyZXNzJywgKCkgPT4ge1xuICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICBjb3Ntb3NDb2luLmdldEFkZHJlc3NEZXRhaWxzKHRlc3REYXRhLmFkZHJlc3Nlcy5tdWx0aXBsZU1lbW9JZEFkZHJlc3MpO1xuICAgICAgICAgIH0pLnNob3VsZC50aHJvdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdhbGxldCByZWNlaXZlIGFkZHJlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcmVjZWl2ZUFkZHJlc3MgPSB7XG4gICAgICAgICAgICBhZGRyZXNzOiBgJHt0ZXN0RGF0YS5hZGRyZXNzZXMuYWRkcmVzczF9P21lbW9JZD03YCxcbiAgICAgICAgICAgIGNvaW5TcGVjaWZpYzoge1xuICAgICAgICAgICAgICByb290QWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLmFkZHJlc3MxLFxuICAgICAgICAgICAgICBtZW1vSUQ6ICc3JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICAvLyBhcyBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnNcbiAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gYXdhaXQgY29zbW9zQ29pbi5pc1dhbGxldEFkZHJlc3MocmVjZWl2ZUFkZHJlc3MgYXMgVmVyaWZ5QWRkcmVzc09wdGlvbnMpO1xuICAgICAgICAgIGlzVmFsaWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFjY291bnQgYWRkcmVzc2VzIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLmFkZHJlc3MxKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHRlc3REYXRhLmFkZHJlc3Nlcy5hZGRyZXNzMiksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnZGZqazM1eScpLCBmYWxzZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHN0cmluZyksIGZhbHNlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoJycpLCBmYWxzZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZE1lbW9JZEFkZHJlc3MpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLmludmFsaWRNZW1vSWRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh0ZXN0RGF0YS5hZGRyZXNzZXMubXVsdGlwbGVNZW1vSWRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHZhbGlkYXRvciBhZGRyZXNzZXMgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyh0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRhdG9yQWRkcmVzczEpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3ModGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkYXRvckFkZHJlc3MyKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKCdkZmprMzV5JyksIGZhbHNlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3ModW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nKSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcygnJyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ1ZlcmlmeSB0cmFuc2FjdGlvbjogJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgICB0eEhleDogdGVzdFR4LnNpZ25lZFR4QmFzZTY0LFxuICAgICAgICAgICAgdHhJbmZvOiB7fSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4LnJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRlc3RUeC5zZW5kQW1vdW50LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGNvc21vc0NvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICAgIH0gYXMgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHNlbmRNYW55IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSB7XG4gICAgICAgICAgICB0eEhleDogdGVzdFR4LnNpZ25lZFR4QmFzZTY0LFxuICAgICAgICAgICAgdHhJbmZvOiB7fSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHR4UGFyYW1zID0ge1xuICAgICAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4LnJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICBhbW91bnQ6IHRlc3RUeC5zZW5kQW1vdW50LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGNvc21vc0NvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgICB0eFByZWJ1aWxkLFxuICAgICAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICAgIH0gYXMgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTtcbiAgICAgICAgICBpc1RyYW5zYWN0aW9uVmVyaWZpZWQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uIHdpdGggaW52YWxpZCBwYXJhbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCB0eFByZWJ1aWxkID0ge307XG4gICAgICAgICAgY29uc3QgdHhQYXJhbXMgPSB7IHJlY2lwaWVudHM6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgIGF3YWl0IGNvc21vc0NvaW5cbiAgICAgICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkIH0gYXMgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKVxuICAgICAgICAgICAgLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ0V4cGxhaW4gVHJhbnNhY3Rpb246ICcsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBjb3Ntb3NDb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eEhleDogdGVzdFR4LnNpZ25lZFR4QmFzZTY0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV4cGxhaW5lZFRyYW5zYWN0aW9uLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgICAgICBpZDogdGVzdFR4Lmhhc2gsXG4gICAgICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB0ZXN0VHgucmVjaXBpZW50LFxuICAgICAgICAgICAgICAgIGFtb3VudDogdGVzdFR4LnNlbmRBbW91bnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgb3V0cHV0QW1vdW50OiB0ZXN0VHguc2VuZEFtb3VudCxcbiAgICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgICAgICBmZWU6IHsgZmVlOiB0ZXN0VHguZmVlQW1vdW50IH0sXG4gICAgICAgICAgICB0eXBlOiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aXRoIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgZXhwbGFpbmVkVHJhbnNhY3Rpb24gPSBhd2FpdCBjb3Ntb3NDb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICAgICAgICB0eEhleDogdGVzdFR4V2l0aE1lbW8uc2lnbmVkVHhCYXNlNjQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXhwbGFpbmVkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlT3V0cHV0cycsICdjaGFuZ2VBbW91bnQnLCAnZmVlJywgJ3R5cGUnXSxcbiAgICAgICAgICAgIGlkOiB0ZXN0VHhXaXRoTWVtby5oYXNoLFxuICAgICAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4V2l0aE1lbW8ucmVjaXBpZW50LFxuICAgICAgICAgICAgICAgIGFtb3VudDogdGVzdFR4V2l0aE1lbW8uc2VuZEFtb3VudCxcbiAgICAgICAgICAgICAgICBtZW1vOiB0ZXN0VHhXaXRoTWVtby5tZW1vLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIG91dHB1dEFtb3VudDogdGVzdFR4V2l0aE1lbW8uc2VuZEFtb3VudCxcbiAgICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgICAgICBmZWU6IHsgZmVlOiB0ZXN0VHhXaXRoTWVtby5mZWVBbW91bnQgfSxcbiAgICAgICAgICAgIHR5cGU6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIHRyYW5zYWN0aW9uIHdpdGggbWlzc2luZyBwYXJhbXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGNvc21vc0NvaW4uZXhwbGFpblRyYW5zYWN0aW9uKHsgdHhIZXg6ICcnIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBzaG91bGQuZXF1YWwoZXJyb3IubWVzc2FnZSwgJ21pc3NpbmcgcmVxdWlyZWQgdHhIZXggcGFyYW1ldGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcGFyYW1zJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb3Ntb3NDb2luLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4OiAncmFuZG9tU3RyaW5nJyB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgc2hvdWxkLmVxdWFsKGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSW52YWxpZCB0cmFuc2FjdGlvbjonKSwgdHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnUGFyc2UgVHJhbnNhY3Rpb25zOiAnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVySW5wdXRzUmVzcG9uc2UgPSB7XG4gICAgICAgICAgYWRkcmVzczogdGVzdFR4LnJlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnQ6IG5ldyBCaWdOdW1iZXIodGVzdFR4LnNlbmRBbW91bnQpLnBsdXModGVzdFR4LmZlZUFtb3VudCkudG9GaXhlZCgpLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyT3V0cHV0c1Jlc3BvbnNlID0ge1xuICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeC5yZWNpcGllbnQsXG4gICAgICAgICAgYW1vdW50OiB0ZXN0VHguc2VuZEFtb3VudCxcbiAgICAgICAgfTtcblxuICAgICAgICBpdCgnc2hvdWxkIHBhcnNlIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkVHJhbnNhY3Rpb24gPSBhd2FpdCBjb3Ntb3NDb2luLnBhcnNlVHJhbnNhY3Rpb24oeyB0eEhleDogdGVzdFR4LnNpZ25lZFR4QmFzZTY0IH0pO1xuXG4gICAgICAgICAgcGFyc2VkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgICAgICBpbnB1dHM6IFt0cmFuc2ZlcklucHV0c1Jlc3BvbnNlXSxcbiAgICAgICAgICAgIG91dHB1dHM6IFt0cmFuc2Zlck91dHB1dHNSZXNwb25zZV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgZmFpbCB0byBwYXJzZSBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHdoZW4gZXhwbGFpblRyYW5zYWN0aW9uIHJlc3BvbnNlIGlzIHVuZGVmaW5lZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YihDb3Ntb3NTaGFyZWRDb2luLnByb3RvdHlwZSwgJ2V4cGxhaW5UcmFuc2FjdGlvbicpO1xuICAgICAgICAgIHN0dWIucmVzb2x2ZXModW5kZWZpbmVkKTtcbiAgICAgICAgICBhd2FpdCBjb3Ntb3NDb2luXG4gICAgICAgICAgICAucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0VHguc2lnbmVkVHhCYXNlNjQgfSlcbiAgICAgICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICAgICAgc3R1Yi5yZXN0b3JlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
|