@bitgo-beta/sdk-coin-cosmos 1.0.1-alpha.56 → 1.0.1-alpha.57

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 (38) hide show
  1. package/dist/test/resources/mantra.d.ts +70 -0
  2. package/dist/test/resources/mantra.d.ts.map +1 -0
  3. package/dist/test/resources/mantra.js +80 -0
  4. package/dist/test/testUtils/generators.d.ts +54 -0
  5. package/dist/test/testUtils/generators.d.ts.map +1 -0
  6. package/dist/test/testUtils/generators.js +183 -0
  7. package/dist/test/testUtils/index.d.ts +8 -0
  8. package/dist/test/testUtils/index.d.ts.map +1 -0
  9. package/dist/test/testUtils/index.js +25 -0
  10. package/dist/test/testUtils/types.d.ts +203 -0
  11. package/dist/test/testUtils/types.d.ts.map +1 -0
  12. package/dist/test/testUtils/types.js +7 -0
  13. package/dist/test/testUtils/utils.d.ts +43 -0
  14. package/dist/test/testUtils/utils.d.ts.map +1 -0
  15. package/dist/test/testUtils/utils.js +122 -0
  16. package/dist/test/unit/cosmosSharedCoin.d.ts +2 -0
  17. package/dist/test/unit/cosmosSharedCoin.d.ts.map +1 -0
  18. package/dist/test/unit/cosmosSharedCoin.js +300 -0
  19. package/dist/test/unit/keyPair.d.ts +2 -0
  20. package/dist/test/unit/keyPair.d.ts.map +1 -0
  21. package/dist/test/unit/keyPair.js +73 -0
  22. package/dist/test/unit/register.d.ts +2 -0
  23. package/dist/test/unit/register.d.ts.map +1 -0
  24. package/dist/test/unit/register.js +48 -0
  25. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  26. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  27. package/dist/test/unit/transactionBuilder/transactionBuilder.js +46 -0
  28. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  29. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  30. package/dist/test/unit/transactionBuilder/transferBuilder.js +186 -0
  31. package/dist/test/unit/utils.d.ts +2 -0
  32. package/dist/test/unit/utils.d.ts.map +1 -0
  33. package/dist/test/unit/utils.js +82 -0
  34. package/dist/tsconfig.tsbuildinfo +1 -0
  35. package/package.json +11 -8
  36. package/.eslintignore +0 -5
  37. package/.mocharc.yml +0 -8
  38. package/CHANGELOG.md +0 -79
@@ -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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2ZlckJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsK0NBQXFEO0FBQ3JELG1EQUF1RDtBQUN2RCwrQ0FBd0Y7QUFFeEYsUUFBUSxDQUFDLHlCQUF5QixFQUFFO0lBQ2xDLE1BQU0sY0FBYyxHQUFHLElBQUEsaUNBQXFCLEdBQUUsQ0FBQztJQUMvQyx5RkFBeUY7SUFDekYsaURBQWlEO0lBQ2pELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLG1CQUFtQixFQUFFO1lBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUEsdUJBQVcsRUFBQyxRQUFRLENBQUMsQ0FBQztZQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsVUFBa0QsQ0FBQztZQUMzRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsV0FBb0QsQ0FBQztZQUM5RSxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBMEQsQ0FBQztZQUMzRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBMEQsQ0FBQztZQUMzRixFQUFFLENBQUMsMkNBQTJDLEVBQUUsS0FBSztnQkFDbkQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQy9DLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNwQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFVLENBQUMsQ0FBQztnQkFDdkMsU0FBUyxDQUFDLFFBQVEsQ0FB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LEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTt3QkFDakMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxXQUFXO3FCQUMzQixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7Z0JBQ0YsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2dCQUNyQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgZnJvbUJhc2U2NCwgdG9IZXggfSBmcm9tICdAY29zbWpzL2VuY29kaW5nJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IGdldEF2YWlsYWJsZVRlc3RDb2lucywgZ2V0QnVpbGRlckZhY3RvcnksIGdldFRlc3REYXRhIH0gZnJvbSAnLi4vLi4vdGVzdFV0aWxzJztcblxuZGVzY3JpYmUoJ0Nvc21vcyBUcmFuc2ZlciBCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICAvLyBUT0RPOiBDT0lOLTUwMzkgLSAgUnVubmluZyB0ZXN0cyBmb3IgZWFjaCBjb2luIGluIHBhcmFsbGVsIHRvIGltcHJvdmUgdGVzdCBwZXJmb3JtYW5jZVxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBhdmFpbGFibGUgY29pbiBhbmQgcnVuIHRlc3RzXG4gIGF2YWlsYWJsZUNvaW5zLmZvckVhY2goKGNvaW5OYW1lKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbk5hbWUudG9VcHBlckNhc2UoKX0gVHJhbnNmZXIgQnVpbGRlcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gZ2V0VGVzdERhdGEoY29pbk5hbWUpO1xuICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KHRlc3REYXRhLnRlc3RuZXRDb2luKTtcbiAgICAgIGNvbnN0IHRlc3RUeCA9IHRlc3REYXRhLnRlc3RTZW5kVHggYXMgUmVxdWlyZWQ8dHlwZW9mIHRlc3REYXRhLnRlc3RTZW5kVHg+O1xuICAgICAgY29uc3QgdGVzdFR4MiA9IHRlc3REYXRhLnRlc3RTZW5kVHgyIGFzIFJlcXVpcmVkPHR5cGVvZiB0ZXN0RGF0YS50ZXN0U2VuZFR4Mj47XG4gICAgICBjb25zdCB0ZXN0VHhXaXRoTWVtbyA9IHRlc3REYXRhLnRlc3RUeFdpdGhNZW1vIGFzIFJlcXVpcmVkPHR5cGVvZiB0ZXN0RGF0YS50ZXN0VHhXaXRoTWVtbz47XG4gICAgICBjb25zdCB0ZXN0U2VuZE1hbnlUeCA9IHRlc3REYXRhLnRlc3RTZW5kTWFueVR4IGFzIFJlcXVpcmVkPHR5cGVvZiB0ZXN0RGF0YS50ZXN0U2VuZE1hbnlUeD47XG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgVHJhbnNmZXIgdHggd2l0aCBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZSh0ZXN0VHguc2VxdWVuY2UpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzQnVkZ2V0KHRlc3RUeC5nYXNCdWRnZXQhKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lc3NhZ2VzKFt0ZXN0VHguc2VuZE1lc3NhZ2UhLnZhbHVlXSk7XG4gICAgICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5ISkpKTtcbiAgICAgICAgdHhCdWlsZGVyLmFkZFNpZ25hdHVyZSh7IHB1YjogdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkgfSwgQnVmZmVyLmZyb20odGVzdFR4LnNpZ25hdHVyZSwgJ2Jhc2U2NCcpKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4Lmdhc0J1ZGdldCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZW5kTWVzc2FnZXMsIFt0ZXN0VHguc2VuZE1lc3NhZ2VdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnB1YmxpY0tleSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgucHViS2V5KSkpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeC5zZXF1ZW5jZSk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0VHguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeC5zZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRlc3REYXRhLnRlc3RuZXRDb2luLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgYnVpbGQgYSBUcmFuc2ZlciB0eCB3aXRoIHNpZ25hdHVyZSBhbmQgbWVtbycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgdHhCdWlsZGVyLnNlcXVlbmNlKHRlc3RUeFdpdGhNZW1vLnNlcXVlbmNlKTtcbiAgICAgICAgdHhCdWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHhXaXRoTWVtby5nYXNCdWRnZXQpO1xuICAgICAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlXSk7XG4gICAgICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHhXaXRoTWVtby5wdWJLZXkpKSk7XG4gICAgICAgIHR4QnVpbGRlci5tZW1vKHRlc3RUeFdpdGhNZW1vLm1lbW8pO1xuICAgICAgICB0eEJ1aWxkZXIuYWRkU2lnbmF0dXJlKFxuICAgICAgICAgIHsgcHViOiB0b0hleChmcm9tQmFzZTY0KHRlc3RUeFdpdGhNZW1vLnB1YktleSkpIH0sXG4gICAgICAgICAgQnVmZmVyLmZyb20odGVzdFR4V2l0aE1lbW8uc2lnbmF0dXJlLCAnYmFzZTY0JylcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgKGF3YWl0IHR4QnVpbGRlci5idWlsZCgpKS50b0pzb24oKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5TZW5kKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLmdhc0J1ZGdldCwgdGVzdFR4V2l0aE1lbW8uZ2FzQnVkZ2V0KTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlbmRNZXNzYWdlcywgW3Rlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4V2l0aE1lbW8ucHViS2V5KSkpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VxdWVuY2UsIHRlc3RUeFdpdGhNZW1vLnNlcXVlbmNlKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKGpzb24ubWVtbywgdGVzdFR4V2l0aE1lbW8ubWVtbyk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHJhd1R4LCB0ZXN0VHhXaXRoTWVtby5zaWduZWRUeEJhc2U2NCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwodHguaW5wdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4V2l0aE1lbW8uc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4V2l0aE1lbW8uc2VuZE1lc3NhZ2UudmFsdWUudG9BZGRyZXNzLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RUeFdpdGhNZW1vLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgVHJhbnNmZXIgdHggd2l0aG91dCBzaWduYXR1cmUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZSh0ZXN0VHguc2VxdWVuY2UpO1xuICAgICAgICB0eEJ1aWxkZXIuZ2FzQnVkZ2V0KHRlc3RUeC5nYXNCdWRnZXQpO1xuICAgICAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeC5zZW5kTWVzc2FnZS52YWx1ZV0pO1xuICAgICAgICB0eEJ1aWxkZXIucHVibGljS2V5KHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IChhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKSkudG9Kc29uKCk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh0eC50eXBlLCBUcmFuc2FjdGlvblR5cGUuU2VuZCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5nYXNCdWRnZXQsIHRlc3RUeC5nYXNCdWRnZXQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCBbdGVzdFR4LnNlbmRNZXNzYWdlXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4LnB1YktleSkpKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0VHguc2VxdWVuY2UpO1xuICAgICAgICB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeC5zZW5kZXIsXG4gICAgICAgICAgICB2YWx1ZTogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbCh0eC5vdXRwdXRzLCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdFR4LnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHguc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRlc3REYXRhLnRlc3RuZXRDb2luLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgc2lnbiBhIFRyYW5zZmVyIHR4JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICB0eEJ1aWxkZXIuc2VxdWVuY2UodGVzdFR4Mi5zZXF1ZW5jZSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFR4Mi5nYXNCdWRnZXQpO1xuICAgICAgICB0eEJ1aWxkZXIubWVzc2FnZXMoW3Rlc3RUeDIuc2VuZE1lc3NhZ2UudmFsdWVdKTtcbiAgICAgICAgdHhCdWlsZGVyLmFjY291bnROdW1iZXIodGVzdFR4Mi5hY2NvdW50TnVtYmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLmNoYWluSWQodGVzdFR4Mi5jaGFpbklkKTtcbiAgICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHRvSGV4KGZyb21CYXNlNjQodGVzdFR4Mi5wcml2YXRlS2V5KSkgfSk7XG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0VHgyLmdhc0J1ZGdldCk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZW5kTWVzc2FnZXMsIFt0ZXN0VHgyLnNlbmRNZXNzYWdlXSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5wdWJsaWNLZXksIHRvSGV4KGZyb21CYXNlNjQodGVzdFR4Mi5wdWJLZXkpKSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoanNvbi5zZXF1ZW5jZSwgdGVzdFR4Mi5zZXF1ZW5jZSk7XG4gICAgICAgIGNvbnN0IHJhd1R4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHR4LnNpZ25hdHVyZVswXSwgdG9IZXgoZnJvbUJhc2U2NCh0ZXN0VHgyLnNpZ25hdHVyZSkpKTtcblxuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RUeDIuc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4LmlucHV0cywgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3RUeDIuc2VuZGVyLFxuICAgICAgICAgICAgdmFsdWU6IHRlc3RUeDIuc2VuZE1lc3NhZ2UudmFsdWUuYW1vdW50WzBdLmFtb3VudCxcbiAgICAgICAgICAgIGNvaW46IHRlc3REYXRhLnRlc3RuZXRDb2luLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKHR4Lm91dHB1dHMsIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0ZXN0VHgyLnNlbmRNZXNzYWdlLnZhbHVlLnRvQWRkcmVzcyxcbiAgICAgICAgICAgIHZhbHVlOiB0ZXN0VHgyLnNlbmRNZXNzYWdlLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICBjb2luOiB0ZXN0RGF0YS50ZXN0bmV0Q29pbixcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2VuZE1hbnkgVHJhbnNmZXIgdHgnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgIHR4QnVpbGRlci5zZXF1ZW5jZSh0ZXN0U2VuZE1hbnlUeC5zZXF1ZW5jZSk7XG4gICAgICAgIHR4QnVpbGRlci5nYXNCdWRnZXQodGVzdFNlbmRNYW55VHguZ2FzQnVkZ2V0KTtcbiAgICAgICAgdHhCdWlsZGVyLm1lc3NhZ2VzKHRlc3RTZW5kTWFueVR4LnNlbmRNZXNzYWdlcy5tYXAoKG1zZykgPT4gbXNnLnZhbHVlKSk7XG4gICAgICAgIHR4QnVpbGRlci5wdWJsaWNLZXkodG9IZXgoZnJvbUJhc2U2NCh0ZXN0U2VuZE1hbnlUeC5wdWJLZXkpKSk7XG4gICAgICAgIHR4QnVpbGRlci5jaGFpbklkKHRlc3RTZW5kTWFueVR4LmNoYWluSWQpO1xuICAgICAgICB0eEJ1aWxkZXIuYWNjb3VudE51bWJlcih0ZXN0U2VuZE1hbnlUeC5hY2NvdW50TnVtYmVyKTtcbiAgICAgICAgdHhCdWlsZGVyLm1lbW8odGVzdFNlbmRNYW55VHgubWVtbyk7XG4gICAgICAgIHR4QnVpbGRlci5hZGRTaWduYXR1cmUoXG4gICAgICAgICAgeyBwdWI6IHRvSGV4KGZyb21CYXNlNjQodGVzdFNlbmRNYW55VHgucHViS2V5KSkgfSxcbiAgICAgICAgICBCdWZmZXIuZnJvbSh0ZXN0U2VuZE1hbnlUeC5zaWduYXR1cmUsICdiYXNlNjQnKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCAoYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCkpLnRvSnNvbigpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uZ2FzQnVkZ2V0LCB0ZXN0U2VuZE1hbnlUeC5nYXNCdWRnZXQpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24uc2VuZE1lc3NhZ2VzLCB0ZXN0U2VuZE1hbnlUeC5zZW5kTWVzc2FnZXMpO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKGpzb24ucHVibGljS2V5LCB0b0hleChmcm9tQmFzZTY0KHRlc3RTZW5kTWFueVR4LnB1YktleSkpKTtcbiAgICAgICAgc2hvdWxkLmRlZXBFcXVhbChqc29uLnNlcXVlbmNlLCB0ZXN0U2VuZE1hbnlUeC5zZXF1ZW5jZSk7XG4gICAgICAgIHNob3VsZC5kZWVwRXF1YWwoXG4gICAgICAgICAgdHguaW5wdXRzLFxuICAgICAgICAgIHRlc3RTZW5kTWFueVR4LnNlbmRNZXNzYWdlcy5tYXAoKG1zZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgYWRkcmVzczogbXNnLnZhbHVlLmZyb21BZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogbXNnLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRlc3REYXRhLnRlc3RuZXRDb2luLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZGVlcEVxdWFsKFxuICAgICAgICAgIHR4Lm91dHB1dHMsXG4gICAgICAgICAgdGVzdFNlbmRNYW55VHguc2VuZE1lc3NhZ2VzLm1hcCgobXNnKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBtc2cudmFsdWUudG9BZGRyZXNzLFxuICAgICAgICAgICAgICB2YWx1ZTogbXNnLnZhbHVlLmFtb3VudFswXS5hbW91bnQsXG4gICAgICAgICAgICAgIGNvaW46IHRlc3REYXRhLnRlc3RuZXRDb2luLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICBzaG91bGQuZXF1YWwodHguaWQsIHRlc3RTZW5kTWFueVR4Lmhhc2gpO1xuICAgICAgICBjb25zdCByYXdUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICAgIHNob3VsZC5lcXVhbChyYXdUeCwgdGVzdFNlbmRNYW55VHguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsaURBQTJEO0FBQzNELDRDQUFrRTtBQUNsRSxtQ0FBa0M7QUFFbEMsUUFBUSxDQUFDLGNBQWMsRUFBRTtJQUN2QixNQUFNLGNBQWMsR0FBRyxJQUFBLGlDQUFxQixHQUFFLENBQUM7SUFDL0MseUZBQXlGO0lBQ3pGLGlEQUFpRDtJQUNqRCxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDbEMsUUFBUSxDQUFDLEdBQUcsUUFBUSxRQUFRLEVBQUU7WUFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBQSx1QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFnRCxDQUFDO1lBQzVFLE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUF3QixDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRWpDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDekIsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO29CQUN6QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDN0QsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxDQUFDO2dCQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtvQkFDNUMsZ0JBQU0sQ0FBQyxL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QUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgY29pbnMsIENvc21vc05ldHdvcmsgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IGdldEF2YWlsYWJsZVRlc3RDb2lucywgZ2V0VGVzdERhdGEgfSBmcm9tICcuLi90ZXN0VXRpbHMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnQ29zbW9zIFV0aWxzJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICAvLyBUT0RPOiBDT0lOLTUwMzkgLSAgUnVubmluZyB0ZXN0cyBmb3IgZWFjaCBjb2luIGluIHBhcmFsbGVsIHRvIGltcHJvdmUgdGVzdCBwZXJmb3JtYW5jZVxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBhdmFpbGFibGUgY29pbiBhbmQgcnVuIHRlc3RzXG4gIGF2YWlsYWJsZUNvaW5zLmZvckVhY2goKGNvaW5OYW1lKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IFV0aWxzYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGVzdERhdGEgPSBnZXRUZXN0RGF0YShjb2luTmFtZSk7XG4gICAgICBjb25zdCBhZGRyZXNzZXMgPSB0ZXN0RGF0YS5hZGRyZXNzZXMgYXMgUmVxdWlyZWQ8dHlwZW9mIHRlc3REYXRhLmFkZHJlc3Nlcz47XG4gICAgICBjb25zdCBjb2luID0gY29pbnMuZ2V0KHRlc3REYXRhLnRlc3RuZXRDb2luKTtcbiAgICAgIGNvbnN0IG5ldHdvcmsgPSBjb2luLm5ldHdvcmsgYXMgQ29zbW9zTmV0d29yaztcbiAgICAgIGNvbnN0IHV0aWxzID0gbmV3IFV0aWxzKG5ldHdvcmspO1xuXG4gICAgICBkZXNjcmliZSgnaXNWYWxpZEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Nlcy5hZGRyZXNzMSksIHRydWUpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczIpLCB0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGludmFsaWQgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc2VzLmFkZHJlc3M2KSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcygnaW52YWxpZCcpLCBmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgbWVtbyBpZCBhZGRyZXNzZXMgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzZXMubm9NZW1vSWRBZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3Nlcy52YWxpZE1lbW9JZEFkZHJlc3MpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzc2VzLmludmFsaWRNZW1vSWRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzZXMubXVsdGlwbGVNZW1vSWRBZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIHZhbGlkYXRvciBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzZXMudmFsaWRhdG9yQWRkcmVzczEpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFZhbGlkYXRvckFkZHJlc3MoYWRkcmVzc2VzLnZhbGlkYXRvckFkZHJlc3MyKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBpbnZhbGlkIHZhbGlkYXRvciBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkVmFsaWRhdG9yQWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczEpLCBmYWxzZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRWYWxpZGF0b3JBZGRyZXNzKCdpbnZhbGlkJyksIGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2lzVmFsaWRDb250cmFjdEFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIGNvbnRyYWN0IGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQ29udHJhY3QgYWRkcmVzc2VzIGZvbGxvdyB0aGUgc2FtZSBmb3JtYXQgYXMgcmVndWxhciBhZGRyZXNzZXNcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczEpLCB0cnVlKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczIpLCB0cnVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIGludmFsaWQgY29udHJhY3QgYWRkcmVzcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzZXMuYWRkcmVzczYpLCBmYWxzZSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRDb250cmFjdEFkZHJlc3MoJ2ludmFsaWQnKSwgZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgndmFsaWRhdGVBbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGl0KCdzaG91bGQgbm90IHRocm93IGZvciB2YWxpZCBhbW91bnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgICAgICB1dGlscy52YWxpZGF0ZUFtb3VudCh0ZXN0RGF0YS5jb2luQW1vdW50cy5hbW91bnQxKTtcbiAgICAgICAgICAgIHV0aWxzLnZhbGlkYXRlQW1vdW50KHRlc3REYXRhLmNvaW5BbW91bnRzLmFtb3VudDIpO1xuICAgICAgICAgICAgdXRpbHMudmFsaWRhdGVBbW91bnQodGVzdERhdGEuY29pbkFtb3VudHMuYW1vdW50Myk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgYW1vdW50JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZCgoKSA9PiB1dGlscy52YWxpZGF0ZUFtb3VudCh0ZXN0RGF0YS5jb2luQW1vdW50cy5hbW91bnQ0KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIGFtb3VudDogJyR7dGVzdERhdGEuY29pbkFtb3VudHMuYW1vdW50NC5hbW91bnR9JyBpcyBub3QgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyYFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgZGVub20nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgc2hvdWxkKCgpID0+IHV0aWxzLnZhbGlkYXRlQW1vdW50KHsgZGVub206ICdpbnZhbGlkJywgYW1vdW50OiAnMTAwJyB9KSkudGhyb3dFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIGFtb3VudDogZGVub20gJ2ludmFsaWQnIGlzIG5vdCBhIHZhbGlkIGRlbm9taW5hdGlvbmBcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBtaXNzaW5nIGRlbm9tJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNob3VsZCgoKSA9PiB1dGlscy52YWxpZGF0ZUFtb3VudCh7IGFtb3VudDogJzEwMCcgfSBhcyBhbnkpKS50aHJvd0Vycm9yKGBJbnZhbGlkIGFtb3VudDogbWlzc2luZyBkZW5vbWApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBtaXNzaW5nIGFtb3VudCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAgICAgKCkgPT4gdXRpbHMudmFsaWRhdGVBbW91bnQoeyBkZW5vbTogdGVzdERhdGEuYmFzZURlbm9tIH0gYXMgYW55KSxcbiAgICAgICAgICAgICdJbnZhbGlkIGFtb3VudDogbWlzc2luZyBhbW91bnQnXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==