@bitgo-beta/sdk-coin-cosmos 1.0.1-alpha.8 → 1.0.1-alpha.80

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.
Files changed (59) hide show
  1. package/dist/src/cosmosSharedCoin.d.ts +28 -3
  2. package/dist/src/cosmosSharedCoin.d.ts.map +1 -1
  3. package/dist/src/cosmosSharedCoin.js +69 -5
  4. package/dist/src/index.d.ts +3 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +18 -4
  7. package/dist/src/lib/index.d.ts +5 -0
  8. package/dist/src/lib/index.d.ts.map +1 -0
  9. package/dist/src/lib/index.js +13 -0
  10. package/dist/src/lib/keyPair.d.ts +19 -0
  11. package/dist/src/lib/keyPair.d.ts.map +1 -0
  12. package/dist/src/lib/keyPair.js +38 -0
  13. package/dist/src/lib/transactionBuilderFactory.d.ts +32 -0
  14. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  15. package/dist/src/lib/transactionBuilderFactory.js +81 -0
  16. package/dist/src/lib/utils.d.ts +19 -0
  17. package/dist/src/lib/utils.d.ts.map +1 -0
  18. package/dist/src/lib/utils.js +48 -0
  19. package/dist/src/register.d.ts +7 -0
  20. package/dist/src/register.d.ts.map +1 -0
  21. package/dist/src/register.js +17 -0
  22. package/dist/test/resources/mantra.d.ts +70 -0
  23. package/dist/test/resources/mantra.d.ts.map +1 -0
  24. package/dist/test/resources/mantra.js +80 -0
  25. package/dist/test/testUtils/generators.d.ts +54 -0
  26. package/dist/test/testUtils/generators.d.ts.map +1 -0
  27. package/dist/test/testUtils/generators.js +183 -0
  28. package/dist/test/testUtils/index.d.ts +8 -0
  29. package/dist/test/testUtils/index.d.ts.map +1 -0
  30. package/dist/test/testUtils/index.js +25 -0
  31. package/dist/test/testUtils/types.d.ts +203 -0
  32. package/dist/test/testUtils/types.d.ts.map +1 -0
  33. package/dist/test/testUtils/types.js +7 -0
  34. package/dist/test/testUtils/utils.d.ts +43 -0
  35. package/dist/test/testUtils/utils.d.ts.map +1 -0
  36. package/dist/test/testUtils/utils.js +122 -0
  37. package/dist/test/unit/cosmosSharedCoin.d.ts +2 -0
  38. package/dist/test/unit/cosmosSharedCoin.d.ts.map +1 -0
  39. package/dist/test/unit/cosmosSharedCoin.js +300 -0
  40. package/dist/test/unit/keyPair.d.ts +2 -0
  41. package/dist/test/unit/keyPair.d.ts.map +1 -0
  42. package/dist/test/unit/keyPair.js +73 -0
  43. package/dist/test/unit/register.d.ts +2 -0
  44. package/dist/test/unit/register.d.ts.map +1 -0
  45. package/dist/test/unit/register.js +48 -0
  46. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  47. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  48. package/dist/test/unit/transactionBuilder/transactionBuilder.js +46 -0
  49. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  50. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  51. package/dist/test/unit/transactionBuilder/transferBuilder.js +186 -0
  52. package/dist/test/unit/utils.d.ts +2 -0
  53. package/dist/test/unit/utils.d.ts.map +1 -0
  54. package/dist/test/unit/utils.js +82 -0
  55. package/dist/tsconfig.tsbuildinfo +1 -0
  56. package/package.json +18 -6
  57. package/.eslintignore +0 -5
  58. package/.mocharc.yml +0 -8
  59. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cosmosSharedCoin.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyPair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}