@bitgo-beta/sdk-coin-cosmos 1.0.1-alpha.7 → 1.0.1-alpha.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,73 @@
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 assert_1 = __importDefault(require("assert"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const encoding_1 = require("@cosmjs/encoding");
9
+ const statics_1 = require("@bitgo-beta/statics");
10
+ const src_1 = require("../../src");
11
+ const testUtils_1 = require("../testUtils");
12
+ describe('Cosmos KeyPair', function () {
13
+ const availableCoins = (0, testUtils_1.getAvailableTestCoins)();
14
+ // TODO: COIN-5039 - Running tests for each coin in parallel to improve test performance
15
+ // Loop through each available coin and run tests
16
+ availableCoins.forEach((coinName) => {
17
+ describe(`${coinName} KeyPair`, function () {
18
+ const testData = (0, testUtils_1.getTestData)(coinName);
19
+ const coin = statics_1.coins.get(testData.testnetCoin);
20
+ describe('should create a valid KeyPair', () => {
21
+ it('from an empty value', () => {
22
+ const keyPairObj = new src_1.KeyPair();
23
+ const keys = keyPairObj.getKeys();
24
+ should_1.default.exists(keys.prv);
25
+ should_1.default.exists(keys.pub);
26
+ should_1.default.equal(keys.prv?.length, 64);
27
+ should_1.default.equal(keys.pub.length, 66);
28
+ const extendedKeys = keyPairObj.getExtendedKeys();
29
+ should_1.default.exists(extendedKeys.xprv);
30
+ should_1.default.exists(extendedKeys.xpub);
31
+ });
32
+ it('from a private key', () => {
33
+ const privateKey = testData.privateKey;
34
+ const keyPairObj = new src_1.KeyPair({ prv: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(privateKey)) }, coin);
35
+ const keys = keyPairObj.getKeys();
36
+ should_1.default.exists(keys.prv);
37
+ should_1.default.exists(keys.pub);
38
+ should_1.default.equal(keys.prv, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testData.privateKey)));
39
+ should_1.default.equal(keys.pub, (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testData.pubKey)));
40
+ should_1.default.equal(keyPairObj.getAddress(), testData.senderAddress);
41
+ assert_1.default.throws(() => keyPairObj.getExtendedKeys());
42
+ });
43
+ });
44
+ describe('should fail to create a KeyPair', () => {
45
+ it('from an invalid privateKey', () => {
46
+ assert_1.default.throws(() => new src_1.KeyPair({ prv: '' }, coin), (e) => e.message === 'Unsupported private key');
47
+ });
48
+ it('from an invalid publicKey', () => {
49
+ assert_1.default.throws(() => new src_1.KeyPair({ pub: '' }, coin), (e) => e.message.startsWith('Unsupported public key'));
50
+ });
51
+ it('from an undefined seed', () => {
52
+ const undefinedBuffer = undefined;
53
+ assert_1.default.throws(() => new src_1.KeyPair({ seed: undefinedBuffer }, coin), (e) => e.message.startsWith('Invalid key pair options'));
54
+ });
55
+ it('from an undefined private key', () => {
56
+ const undefinedStr = undefined;
57
+ assert_1.default.throws(() => new src_1.KeyPair({ prv: undefinedStr }, coin), (e) => e.message.startsWith('Invalid key pair options'));
58
+ });
59
+ it('from an undefined public key', () => {
60
+ const undefinedStr = undefined;
61
+ assert_1.default.throws(() => new src_1.KeyPair({ pub: undefinedStr }, coin), (e) => e.message.startsWith('Invalid key pair options'));
62
+ });
63
+ });
64
+ describe('get unique address ', () => {
65
+ it('from a private key', () => {
66
+ const keyPair = new src_1.KeyPair({ prv: (0, encoding_1.toHex)((0, encoding_1.fromBase64)(testData.privateKey)) }, coin);
67
+ should_1.default.equal(keyPair.getAddress(), testData.senderAddress);
68
+ });
69
+ });
70
+ });
71
+ });
72
+ });
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUM1QiwrQ0FBcUQ7QUFDckQsaURBQTRDO0FBQzVDLG1DQUFvQztBQUNwQyw0Q0FBa0U7QUFFbEUsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLE1BQU0sY0FBYyxHQUFHLElBQUEsaUNBQXFCLEdBQUUsQ0FBQztJQUMvQyx5RkFBeUY7SUFDekYsaURBQWlEO0lBQ2pELGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtRQUNsQyxRQUFRLENBQUMsR0FBRyxRQUFRLFVBQVUsRUFBRTtZQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFBLHVCQUFXLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7WUFFN0MsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtnQkFDN0MsRUFBRSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRTtvQkFDN0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxhQUFPLEVBQUUsQ0FBQztvQkFDakMsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNsQyxnQkFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLGdCQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDeEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVB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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IGZyb21CYXNlNjQsIHRvSGV4IH0gZnJvbSAnQGNvc21qcy9lbmNvZGluZyc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBnZXRBdmFpbGFibGVUZXN0Q29pbnMsIGdldFRlc3REYXRhIH0gZnJvbSAnLi4vdGVzdFV0aWxzJztcblxuZGVzY3JpYmUoJ0Nvc21vcyBLZXlQYWlyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICAvLyBUT0RPOiBDT0lOLTUwMzkgLSAgUnVubmluZyB0ZXN0cyBmb3IgZWFjaCBjb2luIGluIHBhcmFsbGVsIHRvIGltcHJvdmUgdGVzdCBwZXJmb3JtYW5jZVxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBhdmFpbGFibGUgY29pbiBhbmQgcnVuIHRlc3RzXG4gIGF2YWlsYWJsZUNvaW5zLmZvckVhY2goKGNvaW5OYW1lKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbk5hbWV9IEtleVBhaXJgLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0ZXN0RGF0YSA9IGdldFRlc3REYXRhKGNvaW5OYW1lKTtcbiAgICAgIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQodGVzdERhdGEudGVzdG5ldENvaW4pO1xuXG4gICAgICBkZXNjcmliZSgnc2hvdWxkIGNyZWF0ZSBhIHZhbGlkIEtleVBhaXInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdmcm9tIGFuIGVtcHR5IHZhbHVlJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleVBhaXJPYmogPSBuZXcgS2V5UGFpcigpO1xuICAgICAgICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyT2JqLmdldEtleXMoKTtcbiAgICAgICAgICBzaG91bGQuZXhpc3RzKGtleXMucHJ2KTtcbiAgICAgICAgICBzaG91bGQuZXhpc3RzKGtleXMucHViKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoa2V5cy5wcnY/Lmxlbmd0aCwgNjQpO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChrZXlzLnB1Yi5sZW5ndGgsIDY2KTtcblxuICAgICAgICAgIGNvbnN0IGV4dGVuZGVkS2V5cyA9IGtleVBhaXJPYmouZ2V0RXh0ZW5kZWRLZXlzKCk7XG4gICAgICAgICAgc2hvdWxkLmV4aXN0cyhleHRlbmRlZEtleXMueHBydik7XG4gICAgICAgICAgc2hvdWxkLmV4aXN0cyhleHRlbmRlZEtleXMueHB1Yik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdmcm9tIGEgcHJpdmF0ZSBrZXknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IHRlc3REYXRhLnByaXZhdGVLZXk7XG4gICAgICAgICAgY29uc3Qga2V5UGFpck9iaiA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0b0hleChmcm9tQmFzZTY0KHByaXZhdGVLZXkpKSB9LCBjb2luKTtcbiAgICAgICAgICBjb25zdCBrZXlzID0ga2V5UGFpck9iai5nZXRLZXlzKCk7XG4gICAgICAgICAgc2hvdWxkLmV4aXN0cyhrZXlzLnBydik7XG4gICAgICAgICAgc2hvdWxkLmV4aXN0cyhrZXlzLnB1Yik7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKGtleXMucHJ2LCB0b0hleChmcm9tQmFzZTY0KHRlc3REYXRhLnByaXZhdGVLZXkpKSk7XG4gICAgICAgICAgc2hvdWxkLmVxdWFsKGtleXMucHViLCB0b0hleChmcm9tQmFzZTY0KHRlc3REYXRhLnB1YktleSkpKTtcbiAgICAgICAgICBzaG91bGQuZXF1YWwoa2V5UGFpck9iai5nZXRBZGRyZXNzKCksIHRlc3REYXRhLnNlbmRlckFkZHJlc3MpO1xuXG4gICAgICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBrZXlQYWlyT2JqLmdldEV4dGVuZGVkS2V5cygpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCAoKSA9PiB7XG4gICAgICAgIGl0KCdmcm9tIGFuIGludmFsaWQgcHJpdmF0ZUtleScsICgpID0+IHtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAgICAgKCkgPT4gbmV3IEtleVBhaXIoeyBwcnY6ICcnIH0sIGNvaW4pLFxuICAgICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSAnVW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXknXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWNLZXknLCAoKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAgICgpID0+IG5ldyBLZXlQYWlyKHsgcHViOiAnJyB9LCBjb2luKSxcbiAgICAgICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZS5zdGFydHNXaXRoKCdVbnN1cHBvcnRlZCBwdWJsaWMga2V5JylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnZnJvbSBhbiB1bmRlZmluZWQgc2VlZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCB1bmRlZmluZWRCdWZmZXIgPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBCdWZmZXI7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAgICgpID0+IG5ldyBLZXlQYWlyKHsgc2VlZDogdW5kZWZpbmVkQnVmZmVyIH0sIGNvaW4pLFxuICAgICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0ludmFsaWQga2V5IHBhaXIgb3B0aW9ucycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2Zyb20gYW4gdW5kZWZpbmVkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVuZGVmaW5lZFN0cjogc3RyaW5nID0gdW5kZWZpbmVkIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgICAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICAgICAoKSA9PiBuZXcgS2V5UGFpcih7IHBydjogdW5kZWZpbmVkU3RyIH0sIGNvaW4pLFxuICAgICAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlLnN0YXJ0c1dpdGgoJ0ludmFsaWQga2V5IHBhaXIgb3B0aW9ucycpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ2Zyb20gYW4gdW5kZWZpbmVkIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdW5kZWZpbmVkU3RyOiBzdHJpbmcgPSB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBzdHJpbmc7XG4gICAgICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgICAgICgpID0+IG5ldyBLZXlQYWlyKHsgcHViOiB1bmRlZmluZWRTdHIgfSwgY29pbiksXG4gICAgICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZ2V0IHVuaXF1ZSBhZGRyZXNzICcsICgpID0+IHtcbiAgICAgICAgaXQoJ2Zyb20gYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRvSGV4KGZyb21CYXNlNjQodGVzdERhdGEucHJpdmF0ZUtleSkpIH0sIGNvaW4pO1xuICAgICAgICAgIHNob3VsZC5lcXVhbChrZXlQYWlyLmdldEFkZHJlc3MoKSwgdGVzdERhdGEuc2VuZGVyQWRkcmVzcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../test/unit/register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
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 sinon_1 = __importDefault(require("sinon"));
7
+ const should_1 = __importDefault(require("should"));
8
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
9
+ const statics_1 = require("@bitgo-beta/statics");
10
+ const src_1 = require("../../src");
11
+ describe('Cosmos Register', function () {
12
+ let bitgo;
13
+ let registerSpy;
14
+ let cosmosCoins;
15
+ before(function () {
16
+ // Get all coins with the SHARED_COSMOS_SDK feature
17
+ cosmosCoins = new Set(statics_1.coins.filter((coin) => coin.features.includes(statics_1.CoinFeature.SHARED_COSMOS_SDK)).map((coin) => coin.name));
18
+ });
19
+ beforeEach(function () {
20
+ bitgo = new sdk_api_1.BitGoAPI({ env: 'test' });
21
+ registerSpy = sinon_1.default.spy(bitgo, 'register');
22
+ });
23
+ afterEach(function () {
24
+ registerSpy.restore();
25
+ });
26
+ it('should register all cosmos coins', function () {
27
+ (0, src_1.register)(bitgo);
28
+ // Verify that register was called for each cosmos coin
29
+ should_1.default.equal(registerSpy.callCount, cosmosCoins.size);
30
+ // Verify that each call was for a cosmos coin with the correct factory
31
+ for (let i = 0; i < registerSpy.callCount; i++) {
32
+ const call = registerSpy.getCall(i);
33
+ const coinName = call.args[0];
34
+ const factory = call.args[1];
35
+ should_1.default.ok(cosmosCoins.has(coinName), `${coinName} should be a cosmos coin`);
36
+ should_1.default.equal(factory, src_1.CosmosSharedCoin.createInstance);
37
+ }
38
+ });
39
+ it('should register each coin only once', function () {
40
+ (0, src_1.register)(bitgo);
41
+ // Get the list of registered coins
42
+ const registeredCoins = registerSpy.getCalls().map((call) => call.args[0]);
43
+ // Check for duplicates
44
+ const uniqueCoins = new Set(registeredCoins);
45
+ should_1.default.equal(uniqueCoins.size, registeredCoins.length, 'There should be no duplicate coin registrations');
46
+ });
47
+ });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLGlEQUErQztBQUMvQyxpREFBeUQ7QUFDekQsbUNBQXVEO0FBRXZELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtJQUMxQixJQUFJLEtBQWUsQ0FBQztJQUNwQixJQUFJLFdBQTJCLENBQUM7SUFDaEMsSUFBSSxXQUF3QixDQUFDO0lBRTdCLE1BQU0sQ0FBQztRQUNMLG1EQUFtRDtRQUNuRCxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQ25CLGVBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUN2RyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxVQUFVLENBQUM7UUFDVCxLQUFLLEdBQUcsSUFBSSxrQkFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEMsV0FBVyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDO0lBRUgsU0FBUyxDQUFDO1FBQ1IsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLGtDQUFrQyxFQUFFO1FBQ3JDLElBQUEsY0FBUSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhCLHVEQUF1RDtRQUN2RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV0RCx1RUFBdUU7UUFDdkUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU3QixnQkFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsUUFBUSwwQkFBMEIsQ0FBQyxDQUFDO1lBQzVFLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxzQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsSUFBQSxjQUFRLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEIsbUNBQW1DO1FBQ25DLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRSx1QkFBdUI7UUFDdkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsTUFBTSxFQUFFLGlEQUFpRCxDQUFDLENBQUM7SUFDNUcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBCaXRHb0FQSSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1hcGknO1xuaW1wb3J0IHsgQ29pbkZlYXR1cmUsIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyByZWdpc3RlciwgQ29zbW9zU2hhcmVkQ29pbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5cbmRlc2NyaWJlKCdDb3Ntb3MgUmVnaXN0ZXInLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogQml0R29BUEk7XG4gIGxldCByZWdpc3RlclNweTogc2lub24uU2lub25TcHk7XG4gIGxldCBjb3Ntb3NDb2luczogU2V0PHN0cmluZz47XG5cbiAgYmVmb3JlKGZ1bmN0aW9uICgpIHtcbiAgICAvLyBHZXQgYWxsIGNvaW5zIHdpdGggdGhlIFNIQVJFRF9DT1NNT1NfU0RLIGZlYXR1cmVcbiAgICBjb3Ntb3NDb2lucyA9IG5ldyBTZXQoXG4gICAgICBjb2lucy5maWx0ZXIoKGNvaW4pID0+IGNvaW4uZmVhdHVyZXMuaW5jbHVkZXMoQ29pbkZlYXR1cmUuU0hBUkVEX0NPU01PU19TREspKS5tYXAoKGNvaW4pID0+IGNvaW4ubmFtZSlcbiAgICApO1xuICB9KTtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBiaXRnbyA9IG5ldyBCaXRHb0FQSSh7IGVudjogJ3Rlc3QnIH0pO1xuICAgIHJlZ2lzdGVyU3B5ID0gc2lub24uc3B5KGJpdGdvLCAncmVnaXN0ZXInKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICByZWdpc3RlclNweS5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmVnaXN0ZXIgYWxsIGNvc21vcyBjb2lucycsIGZ1bmN0aW9uICgpIHtcbiAgICByZWdpc3RlcihiaXRnbyk7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCByZWdpc3RlciB3YXMgY2FsbGVkIGZvciBlYWNoIGNvc21vcyBjb2luXG4gICAgc2hvdWxkLmVxdWFsKHJlZ2lzdGVyU3B5LmNhbGxDb3VudCwgY29zbW9zQ29pbnMuc2l6ZSk7XG5cbiAgICAvLyBWZXJpZnkgdGhhdCBlYWNoIGNhbGwgd2FzIGZvciBhIGNvc21vcyBjb2luIHdpdGggdGhlIGNvcnJlY3QgZmFjdG9yeVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVnaXN0ZXJTcHkuY2FsbENvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGNhbGwgPSByZWdpc3RlclNweS5nZXRDYWxsKGkpO1xuICAgICAgY29uc3QgY29pbk5hbWUgPSBjYWxsLmFyZ3NbMF07XG4gICAgICBjb25zdCBmYWN0b3J5ID0gY2FsbC5hcmdzWzFdO1xuXG4gICAgICBzaG91bGQub2soY29zbW9zQ29pbnMuaGFzKGNvaW5OYW1lKSwgYCR7Y29pbk5hbWV9IHNob3VsZCBiZSBhIGNvc21vcyBjb2luYCk7XG4gICAgICBzaG91bGQuZXF1YWwoZmFjdG9yeSwgQ29zbW9zU2hhcmVkQ29pbi5jcmVhdGVJbnN0YW5jZSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIHJlZ2lzdGVyIGVhY2ggY29pbiBvbmx5IG9uY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgcmVnaXN0ZXIoYml0Z28pO1xuXG4gICAgLy8gR2V0IHRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQgY29pbnNcbiAgICBjb25zdCByZWdpc3RlcmVkQ29pbnMgPSByZWdpc3RlclNweS5nZXRDYWxscygpLm1hcCgoY2FsbCkgPT4gY2FsbC5hcmdzWzBdKTtcblxuICAgIC8vIENoZWNrIGZvciBkdXBsaWNhdGVzXG4gICAgY29uc3QgdW5pcXVlQ29pbnMgPSBuZXcgU2V0KHJlZ2lzdGVyZWRDb2lucyk7XG4gICAgc2hvdWxkLmVxdWFsKHVuaXF1ZUNvaW5zLnNpemUsIHJlZ2lzdGVyZWRDb2lucy5sZW5ndGgsICdUaGVyZSBzaG91bGQgYmUgbm8gZHVwbGljYXRlIGNvaW4gcmVnaXN0cmF0aW9ucycpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transactionBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transactionBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
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 sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const testUtils_1 = require("../../testUtils");
9
+ describe('Cosmos Transaction Builder', function () {
10
+ const availableCoins = (0, testUtils_1.getAvailableTestCoins)();
11
+ // TODO: COIN-5039 - Running tests for each coin in parallel to improve test performance
12
+ // Loop through each available coin and run tests
13
+ availableCoins.forEach((coinName) => {
14
+ describe(`${coinName.toUpperCase()} Transaction Builder`, function () {
15
+ const testData = (0, testUtils_1.getTestData)(coinName);
16
+ const factory = (0, testUtils_1.getBuilderFactory)(testData.testnetCoin);
17
+ const testTx = testData.testSendTx;
18
+ it('should build a signed tx from signed tx data', async function () {
19
+ const txBuilder = factory.from(testTx.signedTxBase64);
20
+ const tx = await txBuilder.build();
21
+ should_1.default.equal(tx.type, sdk_core_1.TransactionType.Send);
22
+ // Should recreate the same raw tx data when re-build and turned to broadcast format
23
+ const rawTx = tx.toBroadcastFormat();
24
+ should_1.default.equal(rawTx, testTx.signedTxBase64);
25
+ });
26
+ describe('gasBudget tests', async () => {
27
+ it('should succeed for valid gasBudget', function () {
28
+ const builder = factory.getTransferBuilder();
29
+ should_1.default.doesNotThrow(() => builder.gasBudget(testTx.gasBudget));
30
+ });
31
+ it('should throw for invalid gasBudget', function () {
32
+ const builder = factory.getTransferBuilder();
33
+ const invalidGasBudget = { amount: testTx.gasBudget.amount, gasLimit: 0 };
34
+ (0, should_1.default)(() => builder.gasBudget(invalidGasBudget)).throw('Invalid gas limit 0');
35
+ });
36
+ });
37
+ it('validateAddress', function () {
38
+ const builder = factory.getTransferBuilder();
39
+ const invalidAddress = { address: 'randomString' };
40
+ should_1.default.doesNotThrow(() => builder.validateAddress({ address: testTx.sender }));
41
+ (0, should_1.default)(() => builder.validateAddress(invalidAddress)).throwError('transactionBuilder: address isValidAddress check failed: ' + invalidAddress.address);
42
+ });
43
+ });
44
+ });
45
+ });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbURBQXVEO0FBRXZELCtDQUF3RjtBQUV4RixRQUFRLENBQUMsNEJBQTRCLEVBQUU7SUFDckMsTUFBTSxjQUFjLEdBQUcsSUFBQSxpQ0FBcUIsR0FBRSxDQUFDO0lBQy9DLHlGQUF5RjtJQUN6RixpREFBaUQ7SUFDakQsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1FBQ2xDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsc0JBQXNCLEVBQUU7WUFDeEQsTUFBTSxRQUFRLEdBQUcsSUFBQSx1QkFBVyxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUEsNkJBQWlCLEVBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3hELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxVQUFrRCxDQUFDO1lBRTNFLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxLQUFLO2dCQUN0RCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDdEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ25DLGdCQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsb0ZBQW9GO2dCQUNwRixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDckMsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLElBQUksRUFBRTtnQkFDckMsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO29CQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDN0MsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBVSxDQUFDLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO29CQUN2QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDN0MsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7b0JBQzNFLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztnQkFDakYsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDcEIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzdDLE1BQU0sY0FBYyxHQUFHLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxDQUFDO2dCQUNuRCxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQy9FLElBQUEsZ0JBQU0sRUFBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUM5RCwyREFBMkQsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUNyRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IGdldEF2YWlsYWJsZVRlc3RDb2lucywgZ2V0QnVpbGRlckZhY3RvcnksIGdldFRlc3REYXRhIH0gZnJvbSAnLi4vLi4vdGVzdFV0aWxzJztcblxuZGVzY3JpYmUoJ0Nvc21vcyBUcmFuc2FjdGlvbiBCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBhdmFpbGFibGVDb2lucyA9IGdldEF2YWlsYWJsZVRlc3RDb2lucygpO1xuICAvLyBUT0RPOiBDT0lOLTUwMzkgLSAgUnVubmluZyB0ZXN0cyBmb3IgZWFjaCBjb2luIGluIHBhcmFsbGVsIHRvIGltcHJvdmUgdGVzdCBwZXJmb3JtYW5jZVxuICAvLyBMb29wIHRocm91Z2ggZWFjaCBhdmFpbGFibGUgY29pbiBhbmQgcnVuIHRlc3RzXG4gIGF2YWlsYWJsZUNvaW5zLmZvckVhY2goKGNvaW5OYW1lKSA9PiB7XG4gICAgZGVzY3JpYmUoYCR7Y29pbk5hbWUudG9VcHBlckNhc2UoKX0gVHJhbnNhY3Rpb24gQnVpbGRlcmAsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRlc3REYXRhID0gZ2V0VGVzdERhdGEoY29pbk5hbWUpO1xuICAgICAgY29uc3QgZmFjdG9yeSA9IGdldEJ1aWxkZXJGYWN0b3J5KHRlc3REYXRhLnRlc3RuZXRDb2luKTtcbiAgICAgIGNvbnN0IHRlc3RUeCA9IHRlc3REYXRhLnRlc3RTZW5kVHggYXMgUmVxdWlyZWQ8dHlwZW9mIHRlc3REYXRhLnRlc3RTZW5kVHg+O1xuXG4gICAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgc2lnbmVkIHR4IGZyb20gc2lnbmVkIHR4IGRhdGEnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbSh0ZXN0VHguc2lnbmVkVHhCYXNlNjQpO1xuICAgICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwodHgudHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgICAvLyBTaG91bGQgcmVjcmVhdGUgdGhlIHNhbWUgcmF3IHR4IGRhdGEgd2hlbiByZS1idWlsZCBhbmQgdHVybmVkIHRvIGJyb2FkY2FzdCBmb3JtYXRcbiAgICAgICAgY29uc3QgcmF3VHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuICAgICAgICBzaG91bGQuZXF1YWwocmF3VHgsIHRlc3RUeC5zaWduZWRUeEJhc2U2NCk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2dhc0J1ZGdldCB0ZXN0cycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCBzdWNjZWVkIGZvciB2YWxpZCBnYXNCdWRnZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLmdhc0J1ZGdldCh0ZXN0VHguZ2FzQnVkZ2V0ISkpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHRocm93IGZvciBpbnZhbGlkIGdhc0J1ZGdldCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgICAgICBjb25zdCBpbnZhbGlkR2FzQnVkZ2V0ID0geyBhbW91bnQ6IHRlc3RUeC5nYXNCdWRnZXQhLmFtb3VudCwgZ2FzTGltaXQ6IDAgfTtcbiAgICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci5nYXNCdWRnZXQoaW52YWxpZEdhc0J1ZGdldCkpLnRocm93KCdJbnZhbGlkIGdhcyBsaW1pdCAwJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCd2YWxpZGF0ZUFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgICBjb25zdCBpbnZhbGlkQWRkcmVzcyA9IHsgYWRkcmVzczogJ3JhbmRvbVN0cmluZycgfTtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiBidWlsZGVyLnZhbGlkYXRlQWRkcmVzcyh7IGFkZHJlc3M6IHRlc3RUeC5zZW5kZXIgfSkpO1xuICAgICAgICBzaG91bGQoKCkgPT4gYnVpbGRlci52YWxpZGF0ZUFkZHJlc3MoaW52YWxpZEFkZHJlc3MpKS50aHJvd0Vycm9yKFxuICAgICAgICAgICd0cmFuc2FjdGlvbkJ1aWxkZXI6IGFkZHJlc3MgaXNWYWxpZEFkZHJlc3MgY2hlY2sgZmFpbGVkOiAnICsgaW52YWxpZEFkZHJlc3MuYWRkcmVzc1xuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=transferBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transferBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/transactionBuilder/transferBuilder.ts"],"names":[],"mappings":""}
@@ -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==