@bitgo/sdk-coin-cosmos 1.6.1 → 1.6.3
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/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 +10 -7
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -83
|
@@ -0,0 +1,186 @@
|
|
|
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 encoding_1 = require("@cosmjs/encoding");
|
|
8
|
+
const sdk_core_1 = require("@bitgo/sdk-core");
|
|
9
|
+
const testUtils_1 = require("../../testUtils");
|
|
10
|
+
describe('Cosmos Transfer Builder', function () {
|
|
11
|
+
const availableCoins = (0, testUtils_1.getAvailableTestCoins)();
|
|
12
|
+
// TODO: COIN-5039 - Running tests for each coin in parallel to improve test performance
|
|
13
|
+
// Loop through each available coin and run tests
|
|
14
|
+
availableCoins.forEach((coinName) => {
|
|
15
|
+
describe(`${coinName.toUpperCase()} Transfer Builder`, function () {
|
|
16
|
+
const testData = (0, testUtils_1.getTestData)(coinName);
|
|
17
|
+
const factory = (0, testUtils_1.getBuilderFactory)(testData.testnetCoin);
|
|
18
|
+
const testTx = testData.testSendTx;
|
|
19
|
+
const testTx2 = testData.testSendTx2;
|
|
20
|
+
const testTxWithMemo = testData.testTxWithMemo;
|
|
21
|
+
const testSendManyTx = testData.testSendManyTx;
|
|
22
|
+
it('should build a Transfer tx with signature', async function () {
|
|
23
|
+
const txBuilder = factory.getTransferBuilder();
|
|
24
|
+
txBuilder.sequence(testTx.sequence);
|
|
25
|
+
txBuilder.gasBudget(testTx.gasBudget);
|
|
26
|
+
txBuilder.messages([testTx.sendMessage.value]);
|
|
27
|
+
txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
|
|
28
|
+
txBuilder.addSignature({ pub: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)) }, Buffer.from(testTx.signature, 'base64'));
|
|
29
|
+
const tx = await txBuilder.build();
|
|
30
|
+
const json = await (await txBuilder.build()).toJson();
|
|
31
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
32
|
+
should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
|
|
33
|
+
should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
|
|
34
|
+
should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
|
|
35
|
+
should_1.default.deepEqual(json.sequence, testTx.sequence);
|
|
36
|
+
const rawTx = tx.toBroadcastFormat();
|
|
37
|
+
should_1.default.equal(rawTx, testTx.signedTxBase64);
|
|
38
|
+
should_1.default.deepEqual(tx.inputs, [
|
|
39
|
+
{
|
|
40
|
+
address: testTx.sender,
|
|
41
|
+
value: testTx.sendMessage.value.amount[0].amount,
|
|
42
|
+
coin: testData.testnetCoin,
|
|
43
|
+
},
|
|
44
|
+
]);
|
|
45
|
+
should_1.default.deepEqual(tx.outputs, [
|
|
46
|
+
{
|
|
47
|
+
address: testTx.sendMessage.value.toAddress,
|
|
48
|
+
value: testTx.sendMessage.value.amount[0].amount,
|
|
49
|
+
coin: testData.testnetCoin,
|
|
50
|
+
},
|
|
51
|
+
]);
|
|
52
|
+
});
|
|
53
|
+
it('should build a Transfer tx with signature and memo', async function () {
|
|
54
|
+
const txBuilder = factory.getTransferBuilder();
|
|
55
|
+
txBuilder.sequence(testTxWithMemo.sequence);
|
|
56
|
+
txBuilder.gasBudget(testTxWithMemo.gasBudget);
|
|
57
|
+
txBuilder.messages([testTxWithMemo.sendMessage.value]);
|
|
58
|
+
txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)));
|
|
59
|
+
txBuilder.memo(testTxWithMemo.memo);
|
|
60
|
+
txBuilder.addSignature({ pub: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)) }, Buffer.from(testTxWithMemo.signature, 'base64'));
|
|
61
|
+
const tx = await txBuilder.build();
|
|
62
|
+
const json = await (await txBuilder.build()).toJson();
|
|
63
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
64
|
+
should_1.default.deepEqual(json.gasBudget, testTxWithMemo.gasBudget);
|
|
65
|
+
should_1.default.deepEqual(json.sendMessages, [testTxWithMemo.sendMessage]);
|
|
66
|
+
should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTxWithMemo.pubKey)));
|
|
67
|
+
should_1.default.deepEqual(json.sequence, testTxWithMemo.sequence);
|
|
68
|
+
should_1.default.equal(json.memo, testTxWithMemo.memo);
|
|
69
|
+
const rawTx = tx.toBroadcastFormat();
|
|
70
|
+
should_1.default.equal(rawTx, testTxWithMemo.signedTxBase64);
|
|
71
|
+
should_1.default.deepEqual(tx.inputs, [
|
|
72
|
+
{
|
|
73
|
+
address: testTxWithMemo.sender,
|
|
74
|
+
value: testTxWithMemo.sendMessage.value.amount[0].amount,
|
|
75
|
+
coin: testData.testnetCoin,
|
|
76
|
+
},
|
|
77
|
+
]);
|
|
78
|
+
should_1.default.deepEqual(tx.outputs, [
|
|
79
|
+
{
|
|
80
|
+
address: testTxWithMemo.sendMessage.value.toAddress,
|
|
81
|
+
value: testTxWithMemo.sendMessage.value.amount[0].amount,
|
|
82
|
+
coin: testData.testnetCoin,
|
|
83
|
+
},
|
|
84
|
+
]);
|
|
85
|
+
});
|
|
86
|
+
it('should build a Transfer tx without signature', async function () {
|
|
87
|
+
const txBuilder = factory.getTransferBuilder();
|
|
88
|
+
txBuilder.sequence(testTx.sequence);
|
|
89
|
+
txBuilder.gasBudget(testTx.gasBudget);
|
|
90
|
+
txBuilder.messages([testTx.sendMessage.value]);
|
|
91
|
+
txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
|
|
92
|
+
const tx = await txBuilder.build();
|
|
93
|
+
const json = await (await txBuilder.build()).toJson();
|
|
94
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
95
|
+
should_1.default.deepEqual(json.gasBudget, testTx.gasBudget);
|
|
96
|
+
should_1.default.deepEqual(json.sendMessages, [testTx.sendMessage]);
|
|
97
|
+
should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx.pubKey)));
|
|
98
|
+
should_1.default.deepEqual(json.sequence, testTx.sequence);
|
|
99
|
+
tx.toBroadcastFormat();
|
|
100
|
+
should_1.default.deepEqual(tx.inputs, [
|
|
101
|
+
{
|
|
102
|
+
address: testTx.sender,
|
|
103
|
+
value: testTx.sendMessage.value.amount[0].amount,
|
|
104
|
+
coin: testData.testnetCoin,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
should_1.default.deepEqual(tx.outputs, [
|
|
108
|
+
{
|
|
109
|
+
address: testTx.sendMessage.value.toAddress,
|
|
110
|
+
value: testTx.sendMessage.value.amount[0].amount,
|
|
111
|
+
coin: testData.testnetCoin,
|
|
112
|
+
},
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
it('should sign a Transfer tx', async function () {
|
|
116
|
+
const txBuilder = factory.getTransferBuilder();
|
|
117
|
+
txBuilder.sequence(testTx2.sequence);
|
|
118
|
+
txBuilder.gasBudget(testTx2.gasBudget);
|
|
119
|
+
txBuilder.messages([testTx2.sendMessage.value]);
|
|
120
|
+
txBuilder.accountNumber(testTx2.accountNumber);
|
|
121
|
+
txBuilder.chainId(testTx2.chainId);
|
|
122
|
+
txBuilder.sign({ key: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx2.privateKey)) });
|
|
123
|
+
const tx = await txBuilder.build();
|
|
124
|
+
const json = await (await txBuilder.build()).toJson();
|
|
125
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
126
|
+
should_1.default.deepEqual(json.gasBudget, testTx2.gasBudget);
|
|
127
|
+
should_1.default.deepEqual(json.sendMessages, [testTx2.sendMessage]);
|
|
128
|
+
should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx2.pubKey)));
|
|
129
|
+
should_1.default.deepEqual(json.sequence, testTx2.sequence);
|
|
130
|
+
const rawTx = tx.toBroadcastFormat();
|
|
131
|
+
should_1.default.equal(tx.signature[0], (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testTx2.signature)));
|
|
132
|
+
should_1.default.equal(rawTx, testTx2.signedTxBase64);
|
|
133
|
+
should_1.default.deepEqual(tx.inputs, [
|
|
134
|
+
{
|
|
135
|
+
address: testTx2.sender,
|
|
136
|
+
value: testTx2.sendMessage.value.amount[0].amount,
|
|
137
|
+
coin: testData.testnetCoin,
|
|
138
|
+
},
|
|
139
|
+
]);
|
|
140
|
+
should_1.default.deepEqual(tx.outputs, [
|
|
141
|
+
{
|
|
142
|
+
address: testTx2.sendMessage.value.toAddress,
|
|
143
|
+
value: testTx2.sendMessage.value.amount[0].amount,
|
|
144
|
+
coin: testData.testnetCoin,
|
|
145
|
+
},
|
|
146
|
+
]);
|
|
147
|
+
});
|
|
148
|
+
it('should build a sendMany Transfer tx', async function () {
|
|
149
|
+
const txBuilder = factory.getTransferBuilder();
|
|
150
|
+
txBuilder.sequence(testSendManyTx.sequence);
|
|
151
|
+
txBuilder.gasBudget(testSendManyTx.gasBudget);
|
|
152
|
+
txBuilder.messages(testSendManyTx.sendMessages.map((msg) => msg.value));
|
|
153
|
+
txBuilder.publicKey((0, encoding_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)));
|
|
154
|
+
txBuilder.chainId(testSendManyTx.chainId);
|
|
155
|
+
txBuilder.accountNumber(testSendManyTx.accountNumber);
|
|
156
|
+
txBuilder.memo(testSendManyTx.memo);
|
|
157
|
+
txBuilder.addSignature({ pub: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)) }, Buffer.from(testSendManyTx.signature, 'base64'));
|
|
158
|
+
const tx = await txBuilder.build();
|
|
159
|
+
const json = await (await txBuilder.build()).toJson();
|
|
160
|
+
should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
|
|
161
|
+
should_1.default.deepEqual(json.gasBudget, testSendManyTx.gasBudget);
|
|
162
|
+
should_1.default.deepEqual(json.sendMessages, testSendManyTx.sendMessages);
|
|
163
|
+
should_1.default.deepEqual(json.publicKey, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testSendManyTx.pubKey)));
|
|
164
|
+
should_1.default.deepEqual(json.sequence, testSendManyTx.sequence);
|
|
165
|
+
should_1.default.deepEqual(tx.inputs, testSendManyTx.sendMessages.map((msg) => {
|
|
166
|
+
return {
|
|
167
|
+
address: msg.value.fromAddress,
|
|
168
|
+
value: msg.value.amount[0].amount,
|
|
169
|
+
coin: testData.testnetCoin,
|
|
170
|
+
};
|
|
171
|
+
}));
|
|
172
|
+
should_1.default.deepEqual(tx.outputs, testSendManyTx.sendMessages.map((msg) => {
|
|
173
|
+
return {
|
|
174
|
+
address: msg.value.toAddress,
|
|
175
|
+
value: msg.value.amount[0].amount,
|
|
176
|
+
coin: testData.testnetCoin,
|
|
177
|
+
};
|
|
178
|
+
}));
|
|
179
|
+
should_1.default.equal(tx.id, testSendManyTx.hash);
|
|
180
|
+
const rawTx = tx.toBroadcastFormat();
|
|
181
|
+
should_1.default.equal(rawTx, testSendManyTx.signedTxBase64);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBQXFEO0FBQ3JELDhDQUFrRDtBQUNsRCwrQ0FBd0Y7QUFFeEYsUUFBUSxDQUFDLHlCQUF5QixFQUFFO0lBQ2xDLE1BQU0sY0FBYyxHQUFHLElBQUEsaUNBQXFCLEdBQUUsQ0FBQztJQUMvQyx5RkFBeUY7SUFDekYsaURBQWlEO0lBQ2pELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFO1lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUEsdUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsVUFBa0QsQ0FBQztZQUMzRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBb0QsQ0FBQztZQUM5RSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBMEQsQ0FBQztZQUMzRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBMEQsQ0FBQztZQUMzRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSztnQkFDbkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQy9DLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztnQkFDdkMsU0FBUyxDQUFDLFFBQVEsQ0FB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LEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTt3QkFDakMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXO3FCQUMzQixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgdG9IZXggfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBnZXRBdmFpbGFibGVUZXN0Q29pbnMsIGdldEJ1aWxkZXJGYWN0b3J5LCBnZXRUZXN0RGF0YSB9IGZyb20gJy4uLy4uL3Rlc3RVdGlscyc7XG5cbmRlc2NyaWJlKCdDb3Ntb3MgVHJhbnNmZXIgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYXZhaWxhYmxlQ29pbnMgPSBnZXRBdmFpbGFibGVUZXN0Q29pbnMoKTtcbiAgLy8gVE9ETzogQ09JTi01MDM5IC0gIFJ1bm5pbmcgdGVzdHMgZm9yIGVhY2ggY29pbiBpbiBwYXJhbGxlbCB0byBpbXByb3ZlIHRlc3QgcGVyZm9ybWFuY2VcbiAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggYXZhaWxhYmxlIGNvaW4gYW5kIHJ1biB0ZXN0c1xuICBhdmFpbGFibGVDb2lucy5mb3JFYWNoKChjb2luTmFtZSkgPT4ge1xuICAgIGRlc2NyaWJlKGAke2NvaW5OYW1lLnRvVXBwZXJDYXNlKCl9IFRyYW5zZmVyIEJ1aWxkZXJgLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IGdldFRlc3REYXRhKGNvaW5OYW1lKTtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSh0ZXN0RGF0YS50ZXN0bmV0Q29pbik7XG4gICAgICBjb25zdCB0ZXN0VHggPSB0ZXN0RGF0YS50ZXN0U2VuZFR4IGFzIFJlcXVpcmVkPHR5cGVvZiB0ZXN0RGF0YS50ZXN0U2VuZFR4PjtcbiAgICAgIGNvbnN0IHRlc3RUeDIgPSB0ZXN0RGF0YS50ZXN0U2VuZFR4MiBhcyBSZXF1aXJlZDx0eXBlb2YgdGVzdERhdGEudGVzdFNlbmRUeDI+O1xuICAgICAgY29uc3QgdGVzdFR4V2l0aE1lbW8gPSB0ZXN0RGF0YS50ZXN0VHhXaXRoTWVtbyBhcyBSZXF1aXJlZDx0eXBlb2YgdGVzdERhdGEudGVzdFR4V2l0aE1lbW8+O1xuICAgICAgY29uc3QgdGVzdFNlbmRNYW55VHggPSB0ZXN0RGF0YS50ZXN0U2VuZE1hbnlUeCBhcyBSZXF1aXJlZDx0eXBlb2YgdGVzdERhdGEudGVzdFNlbmRNYW55VHg+O1xuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIFRyYW5zZmVyIHR4IHdpdGggc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFR4LnNlcXVlbmNlKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0ISk7XG4gICAgICAgIHR4QnVpbGRlci5tZXNzYWdlcyhbdGVzdFR4LnNlbmRNZXNzYWdlIS52YWx1ZV0pO1xuICAgICAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSEpKSk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoeyBwdWI6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpIH0sIEJ1ZmZlci5mcm9tKHRlc3RUeC5zaWduYXR1cmUsICdiYXNlNjQnKSk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3RUeC5nYXNCdWRnZXQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCBbdGVzdFR4LnNlbmRNZXNzYWdlXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0VHguc2VxdWVuY2UpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdFR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0VHguc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGVzdERhdGEudGVzdG5ldENvaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgVHJhbnNmZXIgdHggd2l0aCBzaWduYXR1cmUgYW5kIG1lbW8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZSh0ZXN0VHhXaXRoTWVtby5zZXF1ZW5jZSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFR4V2l0aE1lbW8uZ2FzQnVkZ2V0KTtcbiAgICAgICAgdHhCdWlsZGVyLm1lc3NhZ2VzKFt0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgICAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFR4V2l0aE1lbW8ucHViS2V5KSkpO1xuICAgICAgICB0eEJ1aWxkZXIubWVtbyh0ZXN0VHhXaXRoTWVtby5tZW1vKTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZShcbiAgICAgICAgICB7IHB1YjogdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHhXaXRoTWVtby5wdWJLZXkpKSB9LFxuICAgICAgICAgIEJ1ZmZlci5mcm9tKHRlc3RUeFdpdGhNZW1vLnNpZ25hdHVyZSwgJ2Jhc2U2NCcpXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3RUeFdpdGhNZW1vLmdhc0J1ZGdldCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZW5kTWVzc2FnZXMsIFt0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZV0pO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RUeFdpdGhNZW1vLnB1YktleSkpKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0VHhXaXRoTWVtby5zZXF1ZW5jZSk7XG4gICAgICAgIHNob3VsZC5lcXVhbChqc29uLm1lbW8sIHRlc3RUeFdpdGhNZW1vLm1lbW8pO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdFR4V2l0aE1lbW8uc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeFdpdGhNZW1vLnNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGVzdERhdGEudGVzdG5ldENvaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHhXaXRoTWVtby5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGVzdERhdGEudGVzdG5ldENvaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIFRyYW5zZmVyIHR4IHdpdGhvdXQgc2lnbmF0dXJlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFR4LnNlcXVlbmNlKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICAgICAgdHhCdWlsZGVyLm1lc3NhZ2VzKFt0ZXN0VHguc2VuZE1lc3NhZ2UudmFsdWVdKTtcbiAgICAgICAgdHhCdWlsZGVyLnB1YmxpY0tleSh0b0hleChmcm9tQmFzZTY0KHRlc3RUeC5wdWJLZXkpKSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0VHguZ2FzQnVkZ2V0KTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgW3Rlc3RUeC5zZW5kTWVzc2FnZV0pO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RUeC5wdWJLZXkpKSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFR4LnNlcXVlbmNlKTtcbiAgICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0VHguc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGVzdERhdGEudGVzdG5ldENvaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHgub3V0cHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHNpZ24gYSBUcmFuc2ZlciB0eCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeDIuc2VxdWVuY2UpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzQnVkZ2V0KHRlc3RUeDIuZ2FzQnVkZ2V0KTtcbiAgICAgICAgdHhCdWlsZGVyLm1lc3NhZ2VzKFt0ZXN0VHgyLnNlbmRNZXNzYWdlLnZhbHVlXSk7XG4gICAgICAgIHR4QnVpbGRlci5hY2NvdW50TnVtYmVyKHRlc3RUeDIuYWNjb3VudE51bWJlcik7XG4gICAgICAgIHR4QnVpbGRlci5jaGFpbklkKHRlc3RUeDIuY2hhaW5JZCk7XG4gICAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB0b0hleChmcm9tQmFzZTY0KHRlc3RUeDIucHJpdmF0ZUtleSkpIH0pO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4Mi5nYXNCdWRnZXQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCBbdGVzdFR4Mi5zZW5kTWVzc2FnZV0pO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RUeDIucHViS2V5KSkpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeDIuc2VxdWVuY2UpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC5zaWduYXR1cmVbMF0sIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4Mi5zaWduYXR1cmUpKSk7XG5cbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0VHgyLnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5pbnB1dHMsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0VHgyLnNlbmRlcixcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHgyLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4Mi5zZW5kTWVzc2FnZS52YWx1ZS50b0FkZHJlc3MsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdFR4Mi5zZW5kTWVzc2FnZS52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgY29pbjogdGVzdERhdGEudGVzdG5ldENvaW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBidWlsZCBhIHNlbmRNYW55IFRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFNlbmRNYW55VHguc2VxdWVuY2UpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzQnVkZ2V0KHRlc3RTZW5kTWFueVR4Lmdhc0J1ZGdldCk7XG4gICAgICAgIHR4QnVpbGRlci5tZXNzYWdlcyh0ZXN0U2VuZE1hbnlUeC5zZW5kTWVzc2FnZXMubWFwKChtc2cpID0+IG1zZy52YWx1ZSkpO1xuICAgICAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkpO1xuICAgICAgICB0eEJ1aWxkZXIuY2hhaW5JZCh0ZXN0U2VuZE1hbnlUeC5jaGFpbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLmFjY291bnROdW1iZXIodGVzdFNlbmRNYW55VHguYWNjb3VudE51bWJlcik7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKHRlc3RTZW5kTWFueVR4Lm1lbW8pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKFxuICAgICAgICAgIHsgcHViOiB0b0hleChmcm9tQmFzZTY0KHRlc3RTZW5kTWFueVR4LnB1YktleSkpIH0sXG4gICAgICAgICAgQnVmZmVyLmZyb20odGVzdFNlbmRNYW55VHguc2lnbmF0dXJlLCAnYmFzZTY0JylcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFNlbmRNYW55VHguZ2FzQnVkZ2V0KTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0U2VuZE1hbnlUeC5wdWJLZXkpKSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFNlbmRNYW55VHguc2VxdWVuY2UpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4LmlucHV0cyxcbiAgICAgICAgICB0ZXN0U2VuZE1hbnlUeC5zZW5kTWVzc2FnZXMubWFwKChtc2cpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IG1zZy52YWx1ZS5mcm9tQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IG1zZy52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChcbiAgICAgICAgICB0eC5vdXRwdXRzLFxuICAgICAgICAgIHRlc3RTZW5kTWFueVR4LnNlbmRNZXNzYWdlcy5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogbXNnLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgICAgdmFsdWU6IG1zZy52YWx1ZS5hbW91bnRbMF0uYW1vdW50LFxuICAgICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LmlkLCB0ZXN0U2VuZE1hbnlUeC5oYXNoKTtcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RTZW5kTWFueVR4LnNpZ25lZFR4QmFzZTY0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,82 @@
|
|
|
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 statics_1 = require("@bitgo/statics");
|
|
8
|
+
const testUtils_1 = require("../testUtils");
|
|
9
|
+
const src_1 = require("../../src");
|
|
10
|
+
describe('Cosmos Utils', function () {
|
|
11
|
+
const availableCoins = (0, testUtils_1.getAvailableTestCoins)();
|
|
12
|
+
// TODO: COIN-5039 - Running tests for each coin in parallel to improve test performance
|
|
13
|
+
// Loop through each available coin and run tests
|
|
14
|
+
availableCoins.forEach((coinName) => {
|
|
15
|
+
describe(`${coinName} Utils`, function () {
|
|
16
|
+
const testData = (0, testUtils_1.getTestData)(coinName);
|
|
17
|
+
const addresses = testData.addresses;
|
|
18
|
+
const coin = statics_1.coins.get(testData.testnetCoin);
|
|
19
|
+
const network = coin.network;
|
|
20
|
+
const utils = new src_1.Utils(network);
|
|
21
|
+
describe('isValidAddress', function () {
|
|
22
|
+
it('should return true for valid address', function () {
|
|
23
|
+
should_1.default.equal(utils.isValidAddress(addresses.address1), true);
|
|
24
|
+
should_1.default.equal(utils.isValidAddress(addresses.address2), true);
|
|
25
|
+
});
|
|
26
|
+
it('should return false for invalid address', function () {
|
|
27
|
+
should_1.default.equal(utils.isValidAddress(addresses.address6), false);
|
|
28
|
+
should_1.default.equal(utils.isValidAddress('invalid'), false);
|
|
29
|
+
});
|
|
30
|
+
it('should validate memo id addresses correctly', function () {
|
|
31
|
+
should_1.default.equal(utils.isValidAddress(addresses.noMemoIdAddress), true);
|
|
32
|
+
should_1.default.equal(utils.isValidAddress(addresses.validMemoIdAddress), true);
|
|
33
|
+
should_1.default.equal(utils.isValidAddress(addresses.invalidMemoIdAddress), false);
|
|
34
|
+
should_1.default.equal(utils.isValidAddress(addresses.multipleMemoIdAddress), false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe('isValidValidatorAddress', function () {
|
|
38
|
+
it('should return true for valid validator address', function () {
|
|
39
|
+
should_1.default.equal(utils.isValidValidatorAddress(addresses.validatorAddress1), true);
|
|
40
|
+
should_1.default.equal(utils.isValidValidatorAddress(addresses.validatorAddress2), true);
|
|
41
|
+
});
|
|
42
|
+
it('should return false for invalid validator address', function () {
|
|
43
|
+
should_1.default.equal(utils.isValidValidatorAddress(addresses.address1), false);
|
|
44
|
+
should_1.default.equal(utils.isValidValidatorAddress('invalid'), false);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
describe('isValidContractAddress', function () {
|
|
48
|
+
it('should return true for valid contract address', function () {
|
|
49
|
+
// Contract addresses follow the same format as regular addresses
|
|
50
|
+
should_1.default.equal(utils.isValidContractAddress(addresses.address1), true);
|
|
51
|
+
should_1.default.equal(utils.isValidContractAddress(addresses.address2), true);
|
|
52
|
+
});
|
|
53
|
+
it('should return false for invalid contract address', function () {
|
|
54
|
+
should_1.default.equal(utils.isValidContractAddress(addresses.address6), false);
|
|
55
|
+
should_1.default.equal(utils.isValidContractAddress('invalid'), false);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
describe('validateAmount', function () {
|
|
59
|
+
it('should not throw for valid amount', function () {
|
|
60
|
+
should_1.default.doesNotThrow(() => {
|
|
61
|
+
utils.validateAmount(testData.coinAmounts.amount1);
|
|
62
|
+
utils.validateAmount(testData.coinAmounts.amount2);
|
|
63
|
+
utils.validateAmount(testData.coinAmounts.amount3);
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
it('should throw for invalid amount', function () {
|
|
67
|
+
(0, should_1.default)(() => utils.validateAmount(testData.coinAmounts.amount4)).throwError(`Invalid amount: '${testData.coinAmounts.amount4.amount}' is not a valid positive integer`);
|
|
68
|
+
});
|
|
69
|
+
it('should throw for invalid denom', function () {
|
|
70
|
+
(0, should_1.default)(() => utils.validateAmount({ denom: 'invalid', amount: '100' })).throwError(`Invalid amount: denom 'invalid' is not a valid denomination`);
|
|
71
|
+
});
|
|
72
|
+
it('should throw for missing denom', function () {
|
|
73
|
+
(0, should_1.default)(() => utils.validateAmount({ amount: '100' })).throwError(`Invalid amount: missing denom`);
|
|
74
|
+
});
|
|
75
|
+
it('should throw for missing amount', function () {
|
|
76
|
+
should_1.default.throws(() => utils.validateAmount({ denom: testData.baseDenom }), 'Invalid amount: missing amount');
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsNENBQXNEO0FBQ3RELDRDQUFrRTtBQUNsRSxtQ0FBa0M7QUFFbEMsUUFBUSxDQUFDLGNBQWMsRUFBRTtJQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFBLGlDQUFxQixHQUFFLENBQUM7SUFDL0MseUZBQXlGO0lBQ3pGLGlEQUFpRDtJQUNqRCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDbEMsUUFBUSxDQUFDLEdBQUcsUUFBUSxRQUFRLEVBQUU7WUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBQSx1QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFnRCxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUF3QixDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWpDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO29CQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDN0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtvQkFDNUMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzlELGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZELENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtvQkFDaEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3BFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ3ZFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzFFLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzdFLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMseUJBQXlCLEVBQUU7Z0JBQ2xDLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtvQkFDbkQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMvRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pGLENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRTtvQkFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDdkUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUNoRSxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsUUFBUSxDQUFDLHdCQUF3QixFQUFFO2dCQUNqQyxFQUFFLENBQUMsK0NBQStDLEVBQUU7b0JBQ2xELGlFQUFpRTtvQkFDakUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdkUsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO29CQUNyRCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUN0RSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtvQkFDdEMsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFO3dCQUN2QixLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQ25ELEtBQUssQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDbkQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUNyRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7b0JBQ3BDLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQ3pFLG9CQUFvQixRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLG1DQUFtQyxDQUMzRixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBRTtvQkFDbkMsSUFBQSxnQkFBTSxFQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUNoRiw2REFBNkQsQ0FDOUQsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7b0JBQ25DLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDM0csQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLGlDQUFpQyxFQUFFO29CQUNwQyxnQkFBTSxDQUFDLE1BQU0sQ0FDWCxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQVMsQ0FBQyxFQUNoRSxnQ0FBZ0MsQ0FDakMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMsIENvc21vc05ldHdvcmsgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBnZXRBdmFpbGFibGVUZXN0Q29pbnMsIGdldFRlc3REYXRhIH0gZnJvbSAnLi4vdGVzdFV0aWxzJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuZGVzY3JpYmUoJ0Nvc21vcyBVdGlscycsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgYXZhaWxhYmxlQ29pbnMgPSBnZXRBdmFpbGFibGVUZXN0Q29pbnMoKTtcbiAgLy8gVE9ETzogQ09JTi01MDM5IC0gIFJ1bm5pbmcgdGVzdHMgZm9yIGVhY2ggY29pbiBpbiBwYXJhbGxlbCB0byBpbXByb3ZlIHRlc3QgcGVyZm9ybWFuY2VcbiAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggYXZhaWxhYmxlIGNvaW4gYW5kIHJ1biB0ZXN0c1xuICBhdmFpbGFibGVDb2lucy5mb3JFYWNoKChjb2luTmFtZSkgPT4ge1xuICAgIGRlc2NyaWJlKGAke2NvaW5OYW1lfSBVdGlsc2AsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gZ2V0VGVzdERhdGEoY29pbk5hbWUpO1xuICAgICAgY29uc3QgYWRkcmVzc2VzID0gdGVzdERhdGEuYWRkcmVzc2VzIGFzIFJlcXVpcmVkPHR5cGVvZiB0ZXN0RGF0YS5hZGRyZXNzZXM+O1xuICAgICAgY29uc3QgY29pbiA9IGNvaW5zLmdldCh0ZXN0RGF0YS50ZXN0bmV0Q29pbik7XG4gICAgICBjb25zdCBuZXR3b3JrID0gY29pbi5uZXR3b3JrIGFzIENvc21vc05ldHdvcms7XG4gICAgICBjb25zdCB1dGlscyA9IG5ldyBVdGlscyhuZXR3b3JrKTtcblxuICAgICAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczEpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3MyKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBpbnZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Nlcy5hZGRyZXNzNiksIGZhbHNlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoJ2ludmFsaWQnKSwgZmFsc2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIG1lbW8gaWQgYWRkcmVzc2VzIGNvcnJlY3RseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc2VzLm5vTWVtb0lkQWRkcmVzcyksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzZXMudmFsaWRNZW1vSWRBZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Nlcy5pbnZhbGlkTWVtb0lkQWRkcmVzcyksIGZhbHNlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc2VzLm11bHRpcGxlTWVtb0lkQWRkcmVzcyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2lzVmFsaWRWYWxpZGF0b3JBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB2YWxpZCB2YWxpZGF0b3IgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzc2VzLnZhbGlkYXRvckFkZHJlc3MxKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKGFkZHJlc3Nlcy52YWxpZGF0b3JBZGRyZXNzMiksIHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgaW52YWxpZCB2YWxpZGF0b3IgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3MxKSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcygnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdpc1ZhbGlkQ29udHJhY3RBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB2YWxpZCBjb250cmFjdCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIENvbnRyYWN0IGFkZHJlc3NlcyBmb2xsb3cgdGhlIHNhbWUgZm9ybWF0IGFzIHJlZ3VsYXIgYWRkcmVzc2VzXG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3MxKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3MyKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBpbnZhbGlkIGNvbnRyYWN0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3M2KSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQ29udHJhY3RBZGRyZXNzKCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3ZhbGlkYXRlQW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpdCgnc2hvdWxkIG5vdCB0aHJvdyBmb3IgdmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgICAgdXRpbHMudmFsaWRhdGVBbW91bnQodGVzdERhdGEuY29pbkFtb3VudHMuYW1vdW50MSk7XG4gICAgICAgICAgICB1dGlscy52YWxpZGF0ZUFtb3VudCh0ZXN0RGF0YS5jb2luQW1vdW50cy5hbW91bnQyKTtcbiAgICAgICAgICAgIHV0aWxzLnZhbGlkYXRlQW1vdW50KHRlc3REYXRhLmNvaW5BbW91bnRzLmFtb3VudDMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQoKCkgPT4gdXRpbHMudmFsaWRhdGVBbW91bnQodGVzdERhdGEuY29pbkFtb3VudHMuYW1vdW50NCkpLnRocm93RXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBhbW91bnQ6ICcke3Rlc3REYXRhLmNvaW5BbW91bnRzLmFtb3VudDQuYW1vdW50fScgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdlcmBcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGRlbm9tJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZCgoKSA9PiB1dGlscy52YWxpZGF0ZUFtb3VudCh7IGRlbm9tOiAnaW52YWxpZCcsIGFtb3VudDogJzEwMCcgfSkpLnRocm93RXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCBhbW91bnQ6IGRlbm9tICdpbnZhbGlkJyBpcyBub3QgYSB2YWxpZCBkZW5vbWluYXRpb25gXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgbWlzc2luZyBkZW5vbScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQoKCkgPT4gdXRpbHMudmFsaWRhdGVBbW91bnQoeyBhbW91bnQ6ICcxMDAnIH0gYXMgYW55KSkudGhyb3dFcnJvcihgSW52YWxpZCBhbW91bnQ6IG1pc3NpbmcgZGVub21gKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCB0aHJvdyBmb3IgbWlzc2luZyBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkLnRocm93cyhcbiAgICAgICAgICAgICgpID0+IHV0aWxzLnZhbGlkYXRlQW1vdW50KHsgZGVub206IHRlc3REYXRhLmJhc2VEZW5vbSB9IGFzIGFueSksXG4gICAgICAgICAgICAnSW52YWxpZCBhbW91bnQ6IG1pc3NpbmcgYW1vdW50J1xuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|