@bitgo-beta/sdk-coin-sol 2.4.3-beta.998 → 7.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/src/bigint-buffer-guard.d.ts +1 -0
  2. package/dist/src/bigint-buffer-guard.d.ts.map +1 -0
  3. package/dist/src/bigint-buffer-guard.js +29 -0
  4. package/dist/src/config/token2022StaticConfig.d.ts +3 -0
  5. package/dist/src/config/token2022StaticConfig.d.ts.map +1 -0
  6. package/dist/src/config/token2022StaticConfig.js +50 -0
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +2 -1
  10. package/dist/src/lib/constants.d.ts +35 -2
  11. package/dist/src/lib/constants.d.ts.map +1 -1
  12. package/dist/src/lib/constants.js +41 -2
  13. package/dist/src/lib/customInstructionBuilder.d.ts +72 -0
  14. package/dist/src/lib/customInstructionBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/customInstructionBuilder.js +289 -0
  16. package/dist/src/lib/iface.d.ts +79 -5
  17. package/dist/src/lib/iface.d.ts.map +1 -1
  18. package/dist/src/lib/iface.js +1 -1
  19. package/dist/src/lib/index.d.ts +1 -0
  20. package/dist/src/lib/index.d.ts.map +1 -1
  21. package/dist/src/lib/index.js +4 -2
  22. package/dist/src/lib/instructionParamsFactory.d.ts.map +1 -1
  23. package/dist/src/lib/instructionParamsFactory.js +364 -78
  24. package/dist/src/lib/jitoStakePoolOperations.d.ts +113 -0
  25. package/dist/src/lib/jitoStakePoolOperations.d.ts.map +1 -0
  26. package/dist/src/lib/jitoStakePoolOperations.js +200 -0
  27. package/dist/src/lib/solInstructionFactory.d.ts.map +1 -1
  28. package/dist/src/lib/solInstructionFactory.js +266 -69
  29. package/dist/src/lib/stakingActivateBuilder.d.ts +16 -5
  30. package/dist/src/lib/stakingActivateBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/stakingActivateBuilder.js +23 -10
  32. package/dist/src/lib/stakingDeactivateBuilder.d.ts +16 -5
  33. package/dist/src/lib/stakingDeactivateBuilder.d.ts.map +1 -1
  34. package/dist/src/lib/stakingDeactivateBuilder.js +43 -20
  35. package/dist/src/lib/token2022Config.d.ts +44 -0
  36. package/dist/src/lib/token2022Config.d.ts.map +1 -0
  37. package/dist/src/lib/token2022Config.js +27 -0
  38. package/dist/src/lib/tokenTransferBuilder.js +7 -7
  39. package/dist/src/lib/transaction.d.ts +31 -4
  40. package/dist/src/lib/transaction.d.ts.map +1 -1
  41. package/dist/src/lib/transaction.js +134 -46
  42. package/dist/src/lib/transactionBuilder.d.ts +18 -2
  43. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  44. package/dist/src/lib/transactionBuilder.js +78 -2
  45. package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
  46. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  47. package/dist/src/lib/transactionBuilderFactory.js +10 -1
  48. package/dist/src/lib/utils.d.ts +34 -1
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +88 -24
  51. package/dist/src/sol.d.ts +36 -13
  52. package/dist/src/sol.d.ts.map +1 -1
  53. package/dist/src/sol.js +230 -38
  54. package/dist/test/fixtures/sol.d.ts +1152 -0
  55. package/dist/test/fixtures/sol.d.ts.map +1 -0
  56. package/dist/test/fixtures/sol.js +1433 -0
  57. package/dist/test/resources/sol.d.ts +238 -0
  58. package/dist/test/resources/sol.d.ts.map +1 -0
  59. package/dist/test/resources/sol.js +320 -0
  60. package/dist/test/unit/fixtures/solBackupKey.d.ts +5 -0
  61. package/dist/test/unit/fixtures/solBackupKey.d.ts.map +1 -0
  62. package/dist/test/unit/fixtures/solBackupKey.js +8 -0
  63. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  64. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  65. package/dist/test/unit/getBuilderFactory.js +10 -0
  66. package/dist/test/unit/instructionParamsFactory.d.ts +2 -0
  67. package/dist/test/unit/instructionParamsFactory.d.ts.map +1 -0
  68. package/dist/test/unit/instructionParamsFactory.js +412 -0
  69. package/dist/test/unit/instructionParamsFactory.staking.d.ts +2 -0
  70. package/dist/test/unit/instructionParamsFactory.staking.d.ts.map +1 -0
  71. package/dist/test/unit/instructionParamsFactory.staking.js +1059 -0
  72. package/dist/test/unit/keyPair.d.ts +2 -0
  73. package/dist/test/unit/keyPair.d.ts.map +1 -0
  74. package/dist/test/unit/keyPair.js +177 -0
  75. package/dist/test/unit/messages/messageBuilderFactory.d.ts +2 -0
  76. package/dist/test/unit/messages/messageBuilderFactory.d.ts.map +1 -0
  77. package/dist/test/unit/messages/messageBuilderFactory.js +118 -0
  78. package/dist/test/unit/messages/simpleMessageBuilder.d.ts +2 -0
  79. package/dist/test/unit/messages/simpleMessageBuilder.d.ts.map +1 -0
  80. package/dist/test/unit/messages/simpleMessageBuilder.js +194 -0
  81. package/dist/test/unit/sol.d.ts +2 -0
  82. package/dist/test/unit/sol.d.ts.map +1 -0
  83. package/dist/test/unit/sol.js +3108 -0
  84. package/dist/test/unit/solInstructionFactory.d.ts +2 -0
  85. package/dist/test/unit/solInstructionFactory.d.ts.map +1 -0
  86. package/dist/test/unit/solInstructionFactory.js +454 -0
  87. package/dist/test/unit/solToken.d.ts +2 -0
  88. package/dist/test/unit/solToken.d.ts.map +1 -0
  89. package/dist/test/unit/solToken.js +31 -0
  90. package/dist/test/unit/transaction.d.ts +2 -0
  91. package/dist/test/unit/transaction.d.ts.map +1 -0
  92. package/dist/test/unit/transaction.js +983 -0
  93. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/StakingWithdrawBuilder.js +202 -0
  96. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/ataInitBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/ataInitBuilder.js +471 -0
  99. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/customInstructionBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/customInstructionBuilder.js +413 -0
  102. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/stakingActivateBuilder.js +430 -0
  105. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/stakingAuthorizeBuilder.js +157 -0
  108. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/stakingDeactivateBuilder.js +384 -0
  111. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/stakingDelegateBuilder.js +224 -0
  114. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/stakingRawMsgAuthorizeBuilder.js +259 -0
  117. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +787 -0
  120. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  121. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  122. package/dist/test/unit/transactionBuilder/transactionBuilder.js +495 -0
  123. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  124. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  125. package/dist/test/unit/transactionBuilder/transferBuilder.js +286 -0
  126. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts +2 -0
  127. package/dist/test/unit/transactionBuilder/transferBuilderV2.d.ts.map +1 -0
  128. package/dist/test/unit/transactionBuilder/transferBuilderV2.js +862 -0
  129. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts +2 -0
  130. package/dist/test/unit/transactionBuilder/walletInitBuilder.d.ts.map +1 -0
  131. package/dist/test/unit/transactionBuilder/walletInitBuilder.js +259 -0
  132. package/dist/test/unit/utils.d.ts +2 -0
  133. package/dist/test/unit/utils.d.ts.map +1 -0
  134. package/dist/test/unit/utils.js +505 -0
  135. package/dist/test/unit/versionedTransaction.d.ts +2 -0
  136. package/dist/test/unit/versionedTransaction.d.ts.map +1 -0
  137. package/dist/test/unit/versionedTransaction.js +207 -0
  138. package/dist/tsconfig.tsbuildinfo +1 -0
  139. package/package.json +14 -9
  140. package/.eslintignore +0 -5
  141. package/.mocharc.yml +0 -8
  142. package/CHANGELOG.md +0 -1223
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=keyPair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../test/unit/keyPair.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const assert_1 = __importDefault(require("assert"));
40
+ const src_1 = require("../../src");
41
+ const should_1 = __importDefault(require("should"));
42
+ const testData = __importStar(require("../resources/sol"));
43
+ const utils_1 = require("../../src/lib/utils");
44
+ describe('Sol KeyPair', function () {
45
+ const defaultSeed = { seed: testData.accountWithSeed.seed };
46
+ describe('should create a valid KeyPair', () => {
47
+ it('from an empty value', () => {
48
+ const keyPair = new src_1.KeyPair();
49
+ should_1.default.exists(keyPair.getKeys().prv);
50
+ should_1.default.exists(keyPair.getKeys().pub);
51
+ keyPair.getKeys().prv?.length.should.be.belowOrEqual(88);
52
+ keyPair.getKeys().prv?.length.should.be.aboveOrEqual(76);
53
+ keyPair.getKeys().pub.length.should.be.belowOrEqual(44);
54
+ keyPair.getKeys().pub.length.should.be.aboveOrEqual(32);
55
+ });
56
+ it('from a private key', () => {
57
+ const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
58
+ should_1.default.equal(keyPair.getKeys().pub, testData.accountWithSeed.publicKey);
59
+ should_1.default.equal(keyPair.getKeys().prv, testData.accountWithSeed.privateKey.base58);
60
+ should_1.default.equal(keyPair.getKeys(true).pub, testData.accountWithSeed.publicKey);
61
+ should_1.default.deepEqual(keyPair.getKeys(true).prv, testData.accountWithSeed.privateKey.uint8Array);
62
+ });
63
+ it('from an public key', () => {
64
+ const keyPair = new src_1.KeyPair({ pub: testData.accountWithSeed.publicKey });
65
+ should_1.default.equal(keyPair.getKeys().pub, testData.accountWithSeed.publicKey);
66
+ });
67
+ it('should always generate and regenerate valid key pairs', () => {
68
+ for (let i = 0; i < 50; i++) {
69
+ const keyPair = new src_1.KeyPair();
70
+ (0, utils_1.isValidPublicKey)(keyPair.getKeys().pub).should.be.true();
71
+ (0, utils_1.isValidAddress)(keyPair.getAddress()).should.be.true();
72
+ const prv = keyPair.getKeys().prv;
73
+ should_1.default.exist(prv);
74
+ // verify key pair can be re-generated from private portion
75
+ const regeneratedKeyPairFromPrv = new src_1.KeyPair({ prv: prv });
76
+ regeneratedKeyPairFromPrv.getKeys().should.deepEqual(keyPair.getKeys());
77
+ regeneratedKeyPairFromPrv.getAddress().should.equal(keyPair.getAddress());
78
+ regeneratedKeyPairFromPrv.should.deepEqual(keyPair);
79
+ should_1.default.exist(regeneratedKeyPairFromPrv.getKeys().prv);
80
+ // verify key pair can be re-generated from public portion
81
+ const pub = keyPair.getKeys().pub;
82
+ const regeneratedKeyPairFromPub = new src_1.KeyPair({ pub: pub });
83
+ regeneratedKeyPairFromPub.getKeys().pub.should.deepEqual(keyPair.getKeys().pub);
84
+ regeneratedKeyPairFromPub.getAddress().should.equal(keyPair.getAddress());
85
+ should_1.default.not.exist(regeneratedKeyPairFromPub.getKeys().prv);
86
+ }
87
+ });
88
+ });
89
+ describe('should fail to create a KeyPair', function () {
90
+ it('from invalid options', () => {
91
+ // @ts-expect-error Testing for an params, should throw error
92
+ (0, should_1.default)(() => new src_1.KeyPair({ random: 'random' })).throwError('Invalid key pair options');
93
+ });
94
+ it('from an invalid seed', () => {
95
+ const seed = { seed: Buffer.alloc(8) }; // Seed should be 512 bits (64 bytes)
96
+ assert_1.default.throws(() => new src_1.KeyPair(seed));
97
+ });
98
+ it('from an invalid public key', () => {
99
+ const source = {
100
+ pub: '01D63D',
101
+ };
102
+ assert_1.default.throws(() => new src_1.KeyPair(source));
103
+ });
104
+ it('from an invalid private key', () => {
105
+ const source = {
106
+ prv: '82A34E',
107
+ };
108
+ assert_1.default.throws(() => new src_1.KeyPair(source));
109
+ });
110
+ });
111
+ describe('getAddress', function () {
112
+ it('should get an address', () => {
113
+ const keyPair = new src_1.KeyPair(defaultSeed);
114
+ const address = keyPair.getAddress();
115
+ address.should.equal(testData.accountWithSeed.publicKey);
116
+ });
117
+ });
118
+ describe('getKeys', function () {
119
+ it('should get public keys in base58 and private in Uint8Array', () => {
120
+ const keyPair = new src_1.KeyPair(defaultSeed);
121
+ const { prv, pub } = keyPair.getKeys(true);
122
+ prv?.should.deepEqual(testData.accountWithSeed.privateKey.uint8Array);
123
+ pub.should.equal(testData.accountWithSeed.publicKey);
124
+ });
125
+ it('should get private and public keys base58', () => {
126
+ const keyPair = new src_1.KeyPair(defaultSeed);
127
+ const { prv, pub } = keyPair.getKeys();
128
+ prv?.should.equal(testData.accountWithSeed.privateKey.base58);
129
+ pub.should.equal(testData.accountWithSeed.publicKey);
130
+ });
131
+ it('should get private and public keys for a random seed', () => {
132
+ const keyPair = new src_1.KeyPair();
133
+ const { prv, pub } = keyPair.getKeys();
134
+ should_1.default.exist(prv);
135
+ should_1.default.exist(pub);
136
+ });
137
+ });
138
+ describe('signMessage and verifySignature', function () {
139
+ const message = 'test message pls ignore';
140
+ it('should succeed to sign a msg ', () => {
141
+ const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
142
+ const signedMessage = keyPair.signMessage(message);
143
+ signedMessage.should.deepEqual(testData.SIGNED_MESSAGE_SIGNATURE);
144
+ });
145
+ it('should fail to sign a msg if prv key is missing', () => {
146
+ const keyPair = new src_1.KeyPair({ pub: testData.pubKeys.validPubKeys[0] });
147
+ (0, should_1.default)(() => keyPair.signMessage(message)).throwError('Missing private key');
148
+ });
149
+ });
150
+ describe('verifySignature', function () {
151
+ it('should succeed to verify a signature', () => {
152
+ const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
153
+ const signature = testData.SIGNED_MESSAGE_SIGNATURE;
154
+ const message = 'test message pls ignore';
155
+ keyPair.verifySignature(message, signature).should.equal(true);
156
+ });
157
+ it('should succeed to verify a signature if the msg is a UInt8Array', () => {
158
+ const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
159
+ const signature = testData.SIGNED_MESSAGE_SIGNATURE;
160
+ const message = new Uint8Array(Buffer.from('test message pls ignore'));
161
+ keyPair.verifySignature(message, signature).should.equal(true);
162
+ });
163
+ it('should fail to verify a signature if the prv key is not correct', () => {
164
+ const keyPair = new src_1.KeyPair({ prv: testData.extraAccounts.prv1 });
165
+ const signature = testData.SIGNED_MESSAGE_SIGNATURE;
166
+ const message = 'test message pls ignore';
167
+ keyPair.verifySignature(message, signature).should.equal(false);
168
+ });
169
+ it('should fail to verify a signature if the message is not correct', () => {
170
+ const keyPair = new src_1.KeyPair({ prv: testData.accountWithSeed.privateKey.base58 });
171
+ const signature = testData.SIGNED_MESSAGE_SIGNATURE;
172
+ const message = 'incorrect msg';
173
+ keyPair.verifySignature(message, signature).should.equal(false);
174
+ });
175
+ });
176
+ });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC9rZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG1DQUFvQztBQUNwQyxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLCtDQUF1RTtBQUV2RSxRQUFRLENBQUMsYUFBYSxFQUFFO0lBQ3RCLE1BQU0sV0FBVyxHQUFHLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFNUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtRQUM3QyxFQUFFLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksYUFBTyxFQUFFLENBQUM7WUFDOUIsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLGdCQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4RCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0s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ZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3NvbCc7XG5pbXBvcnQgeyBpc1ZhbGlkUHVibGljS2V5LCBpc1ZhbGlkQWRkcmVzcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnU29sIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRlZmF1bHRTZWVkID0geyBzZWVkOiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQuc2VlZCB9O1xuXG4gIGRlc2NyaWJlKCdzaG91bGQgY3JlYXRlIGEgdmFsaWQgS2V5UGFpcicsICgpID0+IHtcbiAgICBpdCgnZnJvbSBhbiBlbXB0eSB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcigpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlQYWlyLmdldEtleXMoKS5wcnYpO1xuICAgICAgc2hvdWxkLmV4aXN0cyhrZXlQYWlyLmdldEtleXMoKS5wdWIpO1xuICAgICAga2V5UGFpci5nZXRLZXlzKCkucHJ2Py5sZW5ndGguc2hvdWxkLmJlLmJlbG93T3JFcXVhbCg4OCk7XG4gICAgICBrZXlQYWlyLmdldEtleXMoKS5wcnY/Lmxlbmd0aC5zaG91bGQuYmUuYWJvdmVPckVxdWFsKDc2KTtcbiAgICAgIGtleVBhaXIuZ2V0S2V5cygpLnB1Yi5sZW5ndGguc2hvdWxkLmJlLmJlbG93T3JFcXVhbCg0NCk7XG4gICAgICBrZXlQYWlyLmdldEtleXMoKS5wdWIubGVuZ3RoLnNob3VsZC5iZS5hYm92ZU9yRXF1YWwoMzIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYSBwcml2YXRlIGtleScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1YiwgdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHJ2LCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTgpO1xuICAgICAgc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0S2V5cyh0cnVlKS5wdWIsIHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChrZXlQYWlyLmdldEtleXModHJ1ZSkucHJ2LCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS51aW50OEFycmF5KTtcbiAgICB9KTtcblxuICAgIGl0KCdmcm9tIGFuIHB1YmxpYyBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwdWI6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wdWJsaWNLZXkgfSk7XG4gICAgICBzaG91bGQuZXF1YWwoa2V5UGFpci5nZXRLZXlzKCkucHViLCB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWx3YXlzIGdlbmVyYXRlIGFuZCByZWdlbmVyYXRlIHZhbGlkIGtleSBwYWlycycsICgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTA7IGkrKykge1xuICAgICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoKTtcbiAgICAgICAgaXNWYWxpZFB1YmxpY0tleShrZXlQYWlyLmdldEtleXMoKS5wdWIpLnNob3VsZC5iZS50cnVlKCk7XG4gICAgICAgIGlzVmFsaWRBZGRyZXNzKGtleVBhaXIuZ2V0QWRkcmVzcygpKS5zaG91bGQuYmUudHJ1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmc7XG4gICAgICAgIHNob3VsZC5leGlzdChwcnYpO1xuXG4gICAgICAgIC8vIHZlcmlmeSBrZXkgcGFpciBjYW4gYmUgcmUtZ2VuZXJhdGVkIGZyb20gcHJpdmF0ZSBwb3J0aW9uXG4gICAgICAgIGNvbnN0IHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QcnYgPSBuZXcgS2V5UGFpcih7IHBydjogcHJ2IH0pO1xuICAgICAgICByZWdlbmVyYXRlZEtleVBhaXJGcm9tUHJ2LmdldEtleXMoKS5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIuZ2V0S2V5cygpKTtcbiAgICAgICAgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5nZXRBZGRyZXNzKCkuc2hvdWxkLmVxdWFsKGtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICAgICAgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIpO1xuICAgICAgICBzaG91bGQuZXhpc3QocmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVBydi5nZXRLZXlzKCkucHJ2KTtcblxuICAgICAgICAvLyB2ZXJpZnkga2V5IHBhaXIgY2FuIGJlIHJlLWdlbmVyYXRlZCBmcm9tIHB1YmxpYyBwb3J0aW9uXG4gICAgICAgIGNvbnN0IHB1YiA9IGtleVBhaXIuZ2V0S2V5cygpLnB1YjtcbiAgICAgICAgY29uc3QgcmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVB1YiA9IG5ldyBLZXlQYWlyKHsgcHViOiBwdWIgfSk7XG4gICAgICAgIHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QdWIuZ2V0S2V5cygpLnB1Yi5zaG91bGQuZGVlcEVxdWFsKGtleVBhaXIuZ2V0S2V5cygpLnB1Yik7XG4gICAgICAgIHJlZ2VuZXJhdGVkS2V5UGFpckZyb21QdWIuZ2V0QWRkcmVzcygpLnNob3VsZC5lcXVhbChrZXlQYWlyLmdldEFkZHJlc3MoKSk7XG4gICAgICAgIHNob3VsZC5ub3QuZXhpc3QocmVnZW5lcmF0ZWRLZXlQYWlyRnJvbVB1Yi5nZXRLZXlzKCkucHJ2KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nob3VsZCBmYWlsIHRvIGNyZWF0ZSBhIEtleVBhaXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2Zyb20gaW52YWxpZCBvcHRpb25zJywgKCkgPT4ge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBhbiBwYXJhbXMsIHNob3VsZCB0aHJvdyBlcnJvclxuICAgICAgc2hvdWxkKCgpID0+IG5ldyBLZXlQYWlyKHsgcmFuZG9tOiAncmFuZG9tJyB9KSkudGhyb3dFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHNlZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzZWVkID0geyBzZWVkOiBCdWZmZXIuYWxsb2MoOCkgfTsgLy8gIFNlZWQgc2hvdWxkIGJlIDUxMiBiaXRzICg2NCBieXRlcylcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc2VlZCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Zyb20gYW4gaW52YWxpZCBwdWJsaWMga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwdWI6ICcwMUQ2M0QnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnZnJvbSBhbiBpbnZhbGlkIHByaXZhdGUga2V5JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0ge1xuICAgICAgICBwcnY6ICc4MkEzNEUnLFxuICAgICAgfTtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gbmV3IEtleVBhaXIoc291cmNlKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IGFuIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgICAgYWRkcmVzcy5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRLZXlzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZ2V0IHB1YmxpYyBrZXlzIGluIGJhc2U1OCBhbmQgcHJpdmF0ZSBpbiBVaW50OEFycmF5JywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKGRlZmF1bHRTZWVkKTtcbiAgICAgIGNvbnN0IHsgcHJ2LCBwdWIgfSA9IGtleVBhaXIuZ2V0S2V5cyh0cnVlKTtcbiAgICAgIHBydj8uc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS51aW50OEFycmF5KTtcbiAgICAgIHB1Yi5zaG91bGQuZXF1YWwodGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnB1YmxpY0tleSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBwcml2YXRlIGFuZCBwdWJsaWMga2V5cyBiYXNlNTgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoZGVmYXVsdFNlZWQpO1xuICAgICAgY29uc3QgeyBwcnYsIHB1YiB9ID0ga2V5UGFpci5nZXRLZXlzKCk7XG4gICAgICBwcnY/LnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTgpO1xuICAgICAgcHViLnNob3VsZC5lcXVhbCh0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHVibGljS2V5KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHByaXZhdGUgYW5kIHB1YmxpYyBrZXlzIGZvciBhIHJhbmRvbSBzZWVkJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKCk7XG4gICAgICBjb25zdCB7IHBydiwgcHViIH0gPSBrZXlQYWlyLmdldEtleXMoKTtcbiAgICAgIHNob3VsZC5leGlzdChwcnYpO1xuICAgICAgc2hvdWxkLmV4aXN0KHB1Yik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaWduTWVzc2FnZSBhbmQgdmVyaWZ5U2lnbmF0dXJlJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSAndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnO1xuXG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHNpZ24gYSBtc2cgJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiB0ZXN0RGF0YS5hY2NvdW50V2l0aFNlZWQucHJpdmF0ZUtleS5iYXNlNTggfSk7XG4gICAgICBjb25zdCBzaWduZWRNZXNzYWdlID0ga2V5UGFpci5zaWduTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgIHNpZ25lZE1lc3NhZ2Uuc2hvdWxkLmRlZXBFcXVhbCh0ZXN0RGF0YS5TSUdORURfTUVTU0FHRV9TSUdOQVRVUkUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHNpZ24gYSBtc2cgaWYgcHJ2IGtleSBpcyBtaXNzaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHViOiB0ZXN0RGF0YS5wdWJLZXlzLnZhbGlkUHViS2V5c1swXSB9KTtcbiAgICAgIHNob3VsZCgoKSA9PiBrZXlQYWlyLnNpZ25NZXNzYWdlKG1lc3NhZ2UpKS50aHJvd0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJpZnlTaWduYXR1cmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZlcmlmeSBhIHNpZ25hdHVyZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGVzdERhdGEuU0lHTkVEX01FU1NBR0VfU0lHTkFUVVJFO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICd0ZXN0IG1lc3NhZ2UgcGxzIGlnbm9yZSc7XG4gICAgICBrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgYSBzaWduYXR1cmUgaWYgdGhlIG1zZyBpcyBhIFVJbnQ4QXJyYXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmFjY291bnRXaXRoU2VlZC5wcml2YXRlS2V5LmJhc2U1OCB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRlc3REYXRhLlNJR05FRF9NRVNTQUdFX1NJR05BVFVSRTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBuZXcgVWludDhBcnJheShCdWZmZXIuZnJvbSgndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnKSk7XG4gICAgICBrZXlQYWlyLnZlcmlmeVNpZ25hdHVyZShtZXNzYWdlLCBzaWduYXR1cmUpLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduYXR1cmUgaWYgdGhlIHBydiBrZXkgaXMgbm90IGNvcnJlY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IEtleVBhaXIoeyBwcnY6IHRlc3REYXRhLmV4dHJhQWNjb3VudHMucHJ2MSB9KTtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRlc3REYXRhLlNJR05FRF9NRVNTQUdFX1NJR05BVFVSRTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAndGVzdCBtZXNzYWdlIHBscyBpZ25vcmUnO1xuICAgICAga2V5UGFpci52ZXJpZnlTaWduYXR1cmUobWVzc2FnZSwgc2lnbmF0dXJlKS5zaG91bGQuZXF1YWwoZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25hdHVyZSBpZiB0aGUgbWVzc2FnZSBpcyBub3QgY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgS2V5UGFpcih7IHBydjogdGVzdERhdGEuYWNjb3VudFdpdGhTZWVkLnByaXZhdGVLZXkuYmFzZTU4IH0pO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGVzdERhdGEuU0lHTkVEX01FU1NBR0VfU0lHTkFUVVJFO1xuICAgICAgY29uc3QgbWVzc2FnZSA9ICdpbmNvcnJlY3QgbXNnJztcbiAgICAgIGtleVBhaXIudmVyaWZ5U2lnbmF0dXJlKG1lc3NhZ2UsIHNpZ25hdHVyZSkuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messageBuilderFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageBuilderFactory.d.ts","sourceRoot":"","sources":["../../../../test/unit/messages/messageBuilderFactory.ts"],"names":[],"mappings":""}
@@ -0,0 +1,118 @@
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 src_1 = require("../../../src");
9
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
+ describe('Solana MessageBuilderFactory', function () {
11
+ let sandbox;
12
+ let factory;
13
+ const coinConfig = { name: 'tsol' };
14
+ // Common test data
15
+ const signatureBase64 = Buffer.from('signature1').toString('base64');
16
+ const testBroadcastMessage = {
17
+ type: sdk_core_1.MessageStandardType.SIMPLE,
18
+ payload: 'test message',
19
+ serializedSignatures: [
20
+ {
21
+ publicKey: 'pubkey1',
22
+ signature: signatureBase64,
23
+ },
24
+ ],
25
+ signers: ['signer1'],
26
+ metadata: {},
27
+ };
28
+ const unsupportedMessageTypes = [
29
+ sdk_core_1.MessageStandardType.UNKNOWN,
30
+ sdk_core_1.MessageStandardType.EIP191,
31
+ sdk_core_1.MessageStandardType.CIP8,
32
+ 'UNSUPPORTED',
33
+ ];
34
+ // Helper functions
35
+ const assertSimpleMessageBuilder = (builder) => {
36
+ should_1.default.exist(builder);
37
+ builder.should.be.instanceof(sdk_core_1.SimpleMessageBuilder);
38
+ };
39
+ const assertBuilderMessageProperties = async (builder, expectedPayload) => {
40
+ const message = await builder.build();
41
+ message.getType().should.equal(sdk_core_1.MessageStandardType.SIMPLE);
42
+ message.getPayload().should.equal(expectedPayload);
43
+ message.getSignatures().should.have.length(1);
44
+ message.getSigners().should.have.length(1);
45
+ message.getSigners()[0].should.equal('signer1');
46
+ message.getMetadata().should.be.an.Object();
47
+ return message;
48
+ };
49
+ const assertSignatureProperties = (message) => {
50
+ const signature = message.getSignatures()[0];
51
+ signature.should.have.properties(['publicKey', 'signature']);
52
+ signature.publicKey.pub.should.equal('pubkey1');
53
+ signature.signature.toString('base64').should.equal(signatureBase64);
54
+ };
55
+ const assertBroadcastFormatProperties = async (message, expectedSerializedSignatures) => {
56
+ const rebroadcastMessage = await message.toBroadcastFormat();
57
+ rebroadcastMessage.should.have.properties(['type', 'payload', 'serializedSignatures', 'signers', 'metadata']);
58
+ rebroadcastMessage.type.should.equal(sdk_core_1.MessageStandardType.SIMPLE);
59
+ rebroadcastMessage.payload.should.equal('test message');
60
+ rebroadcastMessage.serializedSignatures?.should.deepEqual(expectedSerializedSignatures);
61
+ rebroadcastMessage.signers?.should.deepEqual(['signer1']);
62
+ };
63
+ beforeEach(function () {
64
+ sandbox = sinon_1.default.createSandbox();
65
+ factory = new src_1.MessageBuilderFactory(coinConfig);
66
+ });
67
+ afterEach(function () {
68
+ sandbox.restore();
69
+ });
70
+ describe('getMessageBuilder', function () {
71
+ it('should return SimpleMessageBuilder for SIMPLE type', function () {
72
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
73
+ assertSimpleMessageBuilder(builder);
74
+ });
75
+ it('should throw error for unsupported message type', function () {
76
+ unsupportedMessageTypes.forEach((type) => {
77
+ should_1.default.throws(() => factory.getMessageBuilder(type), new RegExp(`Invalid message standard ${type}`));
78
+ });
79
+ });
80
+ });
81
+ describe('fromBroadcastFormat', function () {
82
+ it('should get the correct builder type from broadcastable message', async function () {
83
+ const builder = factory.fromBroadcastFormat(testBroadcastMessage);
84
+ assertSimpleMessageBuilder(builder);
85
+ const message = await assertBuilderMessageProperties(builder, 'test message');
86
+ assertSignatureProperties(message);
87
+ await assertBroadcastFormatProperties(message, testBroadcastMessage.serializedSignatures);
88
+ });
89
+ it('should throw for unsupported message type in broadcastable message', function () {
90
+ const broadcastMessage = {
91
+ ...testBroadcastMessage,
92
+ type: sdk_core_1.MessageStandardType.EIP191,
93
+ };
94
+ should_1.default.throws(() => factory.fromBroadcastFormat(broadcastMessage), new RegExp(`Invalid message standard ${sdk_core_1.MessageStandardType.EIP191}`));
95
+ });
96
+ });
97
+ describe('fromBroadcastString', function () {
98
+ it('should parse broadcastable string and return correct builder type', async function () {
99
+ const broadcastString = JSON.stringify(testBroadcastMessage);
100
+ const broadcastHex = Buffer.from(broadcastString).toString('hex');
101
+ const builder = factory.fromBroadcastString(broadcastHex);
102
+ assertSimpleMessageBuilder(builder);
103
+ const message = await assertBuilderMessageProperties(builder, 'test message');
104
+ assertSignatureProperties(message);
105
+ await assertBroadcastFormatProperties(message, testBroadcastMessage.serializedSignatures);
106
+ });
107
+ it('should throw for invalid JSON string', function () {
108
+ try {
109
+ factory.fromBroadcastString('abcdefg'); // Invalid hex string
110
+ fail('Expected error not thrown');
111
+ }
112
+ catch (error) {
113
+ error.should.be.instanceof(SyntaxError);
114
+ }
115
+ });
116
+ });
117
+ });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUJ1aWxkZXJGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L21lc3NhZ2VzL21lc3NhZ2VCdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLGtEQUEwQjtBQUMxQixvREFBNEI7QUFDNUIsc0NBQXFEO0FBQ3JELG1EQU84QjtBQUU5QixRQUFRLENBQUMsOEJBQThCLEVBQUU7SUFDdkMsSUFBSSxPQUEyQixDQUFDO0lBQ2hDLElBQUksT0FBOEIsQ0FBQztJQUNuQyxNQUFNLFVBQVUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQWMsQ0FBQztJQUVoRCxtQkFBbUI7SUFDbkIsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckUsTUFBTSxvQkFBb0IsR0FBeUI7UUFDakQsSUFBSSxFQUFFLDhCQUFtQixDQUFDLE1BQU07UUFDaEMsT0FBTyxFQUFFLGNBQWM7UUFDdkIsb0JBQW9CLEVBQUU7WUFDcEI7Z0JBQ0UsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFNBQVMsRUFBRSxlQUFlO2FBQzNCO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDcEIsUUFBUSxFQUFFLEVBQUU7S0FDYixDQUFDO0lBRUYsTUFBTSx1QkFBdUIsR0FBRztRQUM5Qiw4QkFBbUIsQ0FBQyxPQUFPO1FBQzNCLDhCQUFtQixDQUFDLE1BQU07UUFDMUIsOEJBQW1CLENBQUMsSUFBSTtRQUN4QixhQUFvQztLQUNyQyxDQUFDO0lBRUYsbUJBQW1CO0lBQ25CLE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDOUQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxD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by1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IE1lc3NhZ2VCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBCcm9hZGNhc3RhYmxlTWVzc2FnZSxcbiAgSU1lc3NhZ2UsXG4gIElNZXNzYWdlQnVpbGRlcixcbiAgTWVzc2FnZVN0YW5kYXJkVHlwZSxcbiAgU2VyaWFsaXplZFNpZ25hdHVyZSxcbiAgU2ltcGxlTWVzc2FnZUJ1aWxkZXIsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuZGVzY3JpYmUoJ1NvbGFuYSBNZXNzYWdlQnVpbGRlckZhY3RvcnknLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBzYW5kYm94OiBzaW5vbi5TaW5vblNhbmRib3g7XG4gIGxldCBmYWN0b3J5OiBNZXNzYWdlQnVpbGRlckZhY3Rvcnk7XG4gIGNvbnN0IGNvaW5Db25maWcgPSB7IG5hbWU6ICd0c29sJyB9IGFzIEJhc2VDb2luO1xuXG4gIC8vIENvbW1vbiB0ZXN0IGRhdGFcbiAgY29uc3Qgc2lnbmF0dXJlQmFzZTY0ID0gQnVmZmVyLmZyb20oJ3NpZ25hdHVyZTEnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIGNvbnN0IHRlc3RCcm9hZGNhc3RNZXNzYWdlOiBCcm9hZGNhc3RhYmxlTWVzc2FnZSA9IHtcbiAgICB0eXBlOiBNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSxcbiAgICBwYXlsb2FkOiAndGVzdCBtZXNzYWdlJyxcbiAgICBzZXJpYWxpemVkU2lnbmF0dXJlczogW1xuICAgICAge1xuICAgICAgICBwdWJsaWNLZXk6ICdwdWJrZXkxJyxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmVCYXNlNjQsXG4gICAgICB9LFxuICAgIF0sXG4gICAgc2lnbmVyczogWydzaWduZXIxJ10sXG4gICAgbWV0YWRhdGE6IHt9LFxuICB9O1xuXG4gIGNvbnN0IHVuc3VwcG9ydGVkTWVzc2FnZVR5cGVzID0gW1xuICAgIE1lc3NhZ2VTdGFuZGFyZFR5cGUuVU5LTk9XTixcbiAgICBNZXNzYWdlU3RhbmRhcmRUeXBlLkVJUDE5MSxcbiAgICBNZXNzYWdlU3RhbmRhcmRUeXBlLkNJUDgsXG4gICAgJ1VOU1VQUE9SVEVEJyBhcyBNZXNzYWdlU3RhbmRhcmRUeXBlLFxuICBdO1xuXG4gIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgY29uc3QgYXNzZXJ0U2ltcGxlTWVzc2FnZUJ1aWxkZXIgPSAoYnVpbGRlcjogSU1lc3NhZ2VCdWlsZGVyKSA9PiB7XG4gICAgc2hvdWxkLmV4aXN0KGJ1aWxkZXIpO1xuICAgIGJ1aWxkZXIuc2hvdWxkLmJlLmluc3RhbmNlb2YoU2ltcGxlTWVzc2FnZUJ1aWxkZXIpO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydEJ1aWxkZXJNZXNzYWdlUHJvcGVydGllcyA9IGFzeW5jIChidWlsZGVyOiBJTWVzc2FnZUJ1aWxkZXIsIGV4cGVjdGVkUGF5bG9hZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICBtZXNzYWdlLmdldFR5cGUoKS5zaG91bGQuZXF1YWwoTWVzc2FnZVN0YW5kYXJkVHlwZS5TSU1QTEUpO1xuICAgIG1lc3NhZ2UuZ2V0UGF5bG9hZCgpIS5zaG91bGQuZXF1YWwoZXhwZWN0ZWRQYXlsb2FkKTtcbiAgICBtZXNzYWdlLmdldFNpZ25hdHVyZXMoKS5zaG91bGQuaGF2ZS5sZW5ndGgoMSk7XG4gICAgbWVzc2FnZS5nZXRTaWduZXJzKCkuc2hvdWxkLmhhdmUubGVuZ3RoKDEpO1xuICAgIG1lc3NhZ2UuZ2V0U2lnbmVycygpWzBdLnNob3VsZC5lcXVhbCgnc2lnbmVyMScpO1xuICAgIG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKSEuc2hvdWxkLmJlLmFuLk9iamVjdCgpO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydFNpZ25hdHVyZVByb3BlcnRpZXMgPSAobWVzc2FnZTogSU1lc3NhZ2UpID0+IHtcbiAgICBjb25zdCBzaWduYXR1cmUgPSBtZXNzYWdlLmdldFNpZ25hdHVyZXMoKVswXTtcbiAgICBzaWduYXR1cmUuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ3B1YmxpY0tleScsICdzaWduYXR1cmUnXSk7XG4gICAgc2lnbmF0dXJlLnB1YmxpY0tleS5wdWIuc2hvdWxkLmVxdWFsKCdwdWJrZXkxJyk7XG4gICAgc2lnbmF0dXJlLnNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jykuc2hvdWxkLmVxdWFsKHNpZ25hdHVyZUJhc2U2NCk7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0QnJvYWRjYXN0Rm9ybWF0UHJvcGVydGllcyA9IGFzeW5jIChcbiAgICBtZXNzYWdlOiBJTWVzc2FnZSxcbiAgICBleHBlY3RlZFNlcmlhbGl6ZWRTaWduYXR1cmVzPzogU2VyaWFsaXplZFNpZ25hdHVyZVtdXG4gICkgPT4ge1xuICAgIGNvbnN0IHJlYnJvYWRjYXN0TWVzc2FnZSA9IGF3YWl0IG1lc3NhZ2UudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICByZWJyb2FkY2FzdE1lc3NhZ2Uuc2hvdWxkLmhhdmUucHJvcGVydGllcyhbJ3R5cGUnLCAncGF5bG9hZCcsICdzZXJpYWxpemVkU2lnbmF0dXJlcycsICdzaWduZXJzJywgJ21ldGFkYXRhJ10pO1xuICAgIHJlYnJvYWRjYXN0TWVzc2FnZS50eXBlLnNob3VsZC5lcXVhbChNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgcmVicm9hZGNhc3RNZXNzYWdlLnBheWxvYWQuc2hvdWxkLmVxdWFsKCd0ZXN0IG1lc3NhZ2UnKTtcbiAgICByZWJyb2FkY2FzdE1lc3NhZ2Uuc2VyaWFsaXplZFNpZ25hdHVyZXM/LnNob3VsZC5kZWVwRXF1YWwoZXhwZWN0ZWRTZXJpYWxpemVkU2lnbmF0dXJlcyk7XG4gICAgcmVicm9hZGNhc3RNZXNzYWdlLnNpZ25lcnM/LnNob3VsZC5kZWVwRXF1YWwoWydzaWduZXIxJ10pO1xuICB9O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgZmFjdG9yeSA9IG5ldyBNZXNzYWdlQnVpbGRlckZhY3RvcnkoY29pbkNvbmZpZyk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2FuZGJveC5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRNZXNzYWdlQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBTaW1wbGVNZXNzYWdlQnVpbGRlciBmb3IgU0lNUExFIHR5cGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRNZXNzYWdlQnVpbGRlcihNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgICBhc3NlcnRTaW1wbGVNZXNzYWdlQnVpbGRlcihidWlsZGVyKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIHVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHVuc3VwcG9ydGVkTWVzc2FnZVR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKHR5cGUpLCBuZXcgUmVnRXhwKGBJbnZhbGlkIG1lc3NhZ2Ugc3RhbmRhcmQgJHt0eXBlfWApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbUJyb2FkY2FzdEZvcm1hdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGdldCB0aGUgY29ycmVjdCBidWlsZGVyIHR5cGUgZnJvbSBicm9hZGNhc3RhYmxlIG1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5mcm9tQnJvYWRjYXN0Rm9ybWF0KHRlc3RCcm9hZGNhc3RNZXNzYWdlKTtcbiAgICAgIGFzc2VydFNpbXBsZU1lc3NhZ2VCdWlsZGVyKGJ1aWxkZXIpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYXNzZXJ0QnVpbGRlck1lc3NhZ2VQcm9wZXJ0aWVzKGJ1aWxkZXIsICd0ZXN0IG1lc3NhZ2UnKTtcbiAgICAgIGFzc2VydFNpZ25hdHVyZVByb3BlcnRpZXMobWVzc2FnZSk7XG4gICAgICBhd2FpdCBhc3NlcnRCcm9hZGNhc3RGb3JtYXRQcm9wZXJ0aWVzKG1lc3NhZ2UsIHRlc3RCcm9hZGNhc3RNZXNzYWdlLnNlcmlhbGl6ZWRTaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIHVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSBpbiBicm9hZGNhc3RhYmxlIG1lc3NhZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBicm9hZGNhc3RNZXNzYWdlID0ge1xuICAgICAgICAuLi50ZXN0QnJvYWRjYXN0TWVzc2FnZSxcbiAgICAgICAgdHlwZTogTWVzc2FnZVN0YW5kYXJkVHlwZS5FSVAxOTEsXG4gICAgICB9O1xuXG4gICAgICBzaG91bGQudGhyb3dzKFxuICAgICAgICAoKSA9PiBmYWN0b3J5LmZyb21Ccm9hZGNhc3RGb3JtYXQoYnJvYWRjYXN0TWVzc2FnZSksXG4gICAgICAgIG5ldyBSZWdFeHAoYEludmFsaWQgbWVzc2FnZSBzdGFuZGFyZCAke01lc3NhZ2VTdGFuZGFyZFR5cGUuRUlQMTkxfWApXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbUJyb2FkY2FzdFN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGJyb2FkY2FzdGFibGUgc3RyaW5nIGFuZCByZXR1cm4gY29ycmVjdCBidWlsZGVyIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBicm9hZGNhc3RTdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0ZXN0QnJvYWRjYXN0TWVzc2FnZSk7XG4gICAgICBjb25zdCBicm9hZGNhc3RIZXggPSBCdWZmZXIuZnJvbShicm9hZGNhc3RTdHJpbmcpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb21Ccm9hZGNhc3RTdHJpbmcoYnJvYWRjYXN0SGV4KTtcblxuICAgICAgYXNzZXJ0U2ltcGxlTWVzc2FnZUJ1aWxkZXIoYnVpbGRlcik7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYXNzZXJ0QnVpbGRlck1lc3NhZ2VQcm9wZXJ0aWVzKGJ1aWxkZXIsICd0ZXN0IG1lc3NhZ2UnKTtcbiAgICAgIGFzc2VydFNpZ25hdHVyZVByb3BlcnRpZXMobWVzc2FnZSk7XG4gICAgICBhd2FpdCBhc3NlcnRCcm9hZGNhc3RGb3JtYXRQcm9wZXJ0aWVzKG1lc3NhZ2UsIHRlc3RCcm9hZGNhc3RNZXNzYWdlLnNlcmlhbGl6ZWRTaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZm9yIGludmFsaWQgSlNPTiBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBmYWN0b3J5LmZyb21Ccm9hZGNhc3RTdHJpbmcoJ2FiY2RlZmcnKTsgLy8gSW52YWxpZCBoZXggc3RyaW5nXG4gICAgICAgIGZhaWwoJ0V4cGVjdGVkIGVycm9yIG5vdCB0aHJvd24nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVycm9yLnNob3VsZC5iZS5pbnN0YW5jZW9mKFN5bnRheEVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=simpleMessageBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simpleMessageBuilder.d.ts","sourceRoot":"","sources":["../../../../test/unit/messages/simpleMessageBuilder.ts"],"names":[],"mappings":""}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const sinon_1 = __importDefault(require("sinon"));
40
+ const should_1 = __importDefault(require("should"));
41
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
42
+ const bs58 = __importStar(require("bs58"));
43
+ const src_1 = require("../../../src");
44
+ describe('Solana SimpleMessageBuilder', function () {
45
+ let sandbox;
46
+ let factory;
47
+ const coinConfig = { name: 'tsol' };
48
+ beforeEach(function () {
49
+ sandbox = sinon_1.default.createSandbox();
50
+ factory = new src_1.MessageBuilderFactory(coinConfig);
51
+ });
52
+ afterEach(function () {
53
+ sandbox.restore();
54
+ });
55
+ describe('build', function () {
56
+ it('should build a SimpleMessage with correct payload', async function () {
57
+ const payload = 'Hello, Solana!';
58
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
59
+ builder.setPayload(payload);
60
+ const message = await builder.build();
61
+ should_1.default.exist(message);
62
+ message.should.be.instanceof(sdk_core_1.SimpleMessage);
63
+ should_1.default.equal(message.getType(), sdk_core_1.MessageStandardType.SIMPLE);
64
+ should_1.default.equal(message.getPayload(), payload);
65
+ });
66
+ it('should build a SimpleMessage with signatures', async function () {
67
+ const payload = 'Sign this message';
68
+ const signatures = [
69
+ {
70
+ publicKey: { pub: 'solPubKey1' },
71
+ signature: Buffer.from('solSignature1'),
72
+ },
73
+ ];
74
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
75
+ builder.setPayload(payload).setSignatures(signatures);
76
+ const message = await builder.build();
77
+ should_1.default.exist(message);
78
+ should_1.default.equal(message.getPayload(), payload);
79
+ should_1.default.deepEqual(message.getSignatures(), signatures);
80
+ });
81
+ it('should build a SimpleMessage with signers', async function () {
82
+ const payload = 'Message with signers';
83
+ const signers = ['solSigner1', 'solSigner2'];
84
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
85
+ builder.setPayload(payload).setSigners(signers);
86
+ const message = await builder.build();
87
+ should_1.default.exist(message);
88
+ should_1.default.equal(message.getPayload(), payload);
89
+ should_1.default.deepEqual(message.getSigners(), signers);
90
+ });
91
+ it('should build a SimpleMessage with metadata', async function () {
92
+ const payload = 'Message with metadata';
93
+ const metadata = { solNetwork: 'testnet', timestamp: 1625097600 };
94
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
95
+ builder.setPayload(payload).setMetadata(metadata);
96
+ const message = await builder.build();
97
+ should_1.default.exist(message);
98
+ should_1.default.equal(message.getPayload(), payload);
99
+ const messageMetadata = message.getMetadata();
100
+ should_1.default.equal(messageMetadata?.solNetwork, metadata.solNetwork);
101
+ should_1.default.equal(messageMetadata?.timestamp, metadata.timestamp);
102
+ });
103
+ it('should throw error when building without payload', async function () {
104
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
105
+ await (0, should_1.default)(builder.build()).be.rejectedWith('Message payload must be set before building the message');
106
+ });
107
+ });
108
+ describe('getSignablePayload', function () {
109
+ it('should return Buffer with correct payload', async function () {
110
+ const payload = 'Signable Solana message';
111
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
112
+ builder.setPayload(payload);
113
+ const message = await builder.build();
114
+ const signablePayload = await message.getSignablePayload();
115
+ should_1.default.exist(signablePayload);
116
+ Buffer.isBuffer(signablePayload).should.be.true();
117
+ signablePayload.toString().should.equal(payload);
118
+ });
119
+ });
120
+ describe('toBroadcastFormat', function () {
121
+ it('should convert SimpleMessage to broadcastable format', async function () {
122
+ const payload = 'Broadcast me';
123
+ const signers = ['solAddress1'];
124
+ const signatures = [
125
+ {
126
+ publicKey: { pub: 'solPubKey1' },
127
+ signature: Buffer.from('solSignature1'),
128
+ },
129
+ ];
130
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
131
+ builder.setPayload(payload).setSigners(signers).setSignatures(signatures);
132
+ const message = await builder.build();
133
+ const broadcastFormat = await message.toBroadcastFormat();
134
+ should_1.default.exist(broadcastFormat);
135
+ should_1.default.equal(broadcastFormat.type, sdk_core_1.MessageStandardType.SIMPLE);
136
+ should_1.default.equal(broadcastFormat.payload, payload);
137
+ should_1.default.deepEqual(broadcastFormat.signers, signers);
138
+ should_1.default.exist(broadcastFormat.serializedSignatures);
139
+ const serializedSignatures = broadcastFormat.serializedSignatures;
140
+ should_1.default.equal(serializedSignatures?.length, 1);
141
+ should_1.default.equal(serializedSignatures?.[0].publicKey, 'solPubKey1');
142
+ should_1.default.equal(serializedSignatures?.[0].signature, Buffer.from('solSignature1').toString('base64'));
143
+ });
144
+ });
145
+ describe('fromBroadcastFormat', function () {
146
+ it('should rebuild message from broadcastable format', async function () {
147
+ const broadcastMessage = {
148
+ type: sdk_core_1.MessageStandardType.SIMPLE,
149
+ payload: 'Solana test message',
150
+ serializedSignatures: [
151
+ {
152
+ publicKey: 'solPubKey1',
153
+ signature: Buffer.from('solSignature1').toString('base64'),
154
+ },
155
+ ],
156
+ signers: ['solSigner1'],
157
+ metadata: { network: 'testnet', encoding: 'utf8' },
158
+ };
159
+ const builder = factory.getMessageBuilder(sdk_core_1.MessageStandardType.SIMPLE);
160
+ const message = await builder.fromBroadcastFormat(broadcastMessage);
161
+ should_1.default.exist(message);
162
+ should_1.default.equal(message.getType(), sdk_core_1.MessageStandardType.SIMPLE);
163
+ should_1.default.equal(message.getPayload(), broadcastMessage.payload);
164
+ should_1.default.deepEqual(message.getSigners(), broadcastMessage.signers);
165
+ should_1.default.exist(message.getSignatures());
166
+ should_1.default.equal(message.getSignatures().length, 1);
167
+ });
168
+ });
169
+ describe('fromBroadcastString', function () {
170
+ it('should parse broadcastable string and return correct builder type', async function () {
171
+ const broadcastHex = '7b2274797065223a2253494d504c45222c227061796c6f6164223a2253544152203438373934363720746f2061646472317178763965397a70353578763336307767686c3830366430327933353839397a6b6b7132726874667876377836777963746a3279726667766572353775333037776c35363735667267773232396476713538776b6a76657564357571666e6d74657a2033316136626162353061383462383433396164636662373836626232303230663638303765366538666461363239623432343131306663376262316336623862222c2273657269616c697a65645369676e617475726573223a5b7b227075626c69634b6579223a22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139222c227369676e6174757265223a22675235434446464f5242522f6756416b4b624a4635534d6f36495063674a376a6976694f2f7631535a7056514b6a67566e6f414f45695855614472656d6c4735516743775942725a6132486a547739386c65396e44673d3d227d5d2c227369676e657273223a5b22475a6d6a57464a543964556e70574e714a61626e524d7134747779714372396b584663337a4d4765506d6139225d2c226d65746164617461223a7b22656e636f64696e67223a2275746638227d2c227369676e61626c655061796c6f6164223a2255315242556941304f4463354e445933494852764947466b5a484978635868324f575535656e41314e5868324d7a59776432646f624467774e6d51774d6e6b7a4e5467354f58707261334579636d68305a6e68324e33673264336c6a64476f7965584a6d5a335a6c636a553364544d774e3364734e5459334e575a795a3363794d6a6c6b646e45314f486472616e5a6c645751316458466d626d31305a586f674d7a46684e6d4a68596a557759546730596a67304d7a6c685a474e6d596a63344e6d4a694d6a41794d4759324f4441335a545a6c4f475a6b595459794f5749304d6a51784d54426d597a6469596a466a4e6d493459673d3d227d';
172
+ const coinConfig = { name: 'sol' };
173
+ const factory = new src_1.MessageBuilderFactory(coinConfig);
174
+ const builder = factory.fromBroadcastString(broadcastHex);
175
+ const message = await builder.build();
176
+ const payload = message.getPayload();
177
+ const payloadParts = payload.split(' ');
178
+ const address = message.getSigners()[0];
179
+ address.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9');
180
+ const destinationAddress = payloadParts[3];
181
+ destinationAddress.should.equal('addr1qxv9e9zp55xv360wghl806d02y35899zkkq2rhtfxv7x6wyctj2yrfgver57u307wl5675frgw229dvq58wkjveud5uqfnmtez');
182
+ const amount = Number(payloadParts[1]);
183
+ amount.should.equal(4879467);
184
+ const signatureBuff = message.getSignatures()[0].signature;
185
+ const signatureBase58 = bs58.encode(signatureBuff);
186
+ signatureBase58.should.equal('3aj7xDGJrFAbNF6GLrWTHpy8UW94i6xFADJ1KdomDLaCDjUyz8Gj5vPc5mZLduFhRAUCU4BUcnBWu5te1DbMXCFf');
187
+ const signatureHex = signatureBuff.toString('hex');
188
+ signatureHex.should.equal('811e420c514e44147f81502429b245e52328e883dc809ee38af88efefd526695502a38159e800e1225d4683ade9a51b94200b0601ad96b61e34f0f7c95ef670e');
189
+ const publicKeyHex = message.getSignatures()[0].publicKey.pub;
190
+ publicKeyHex.should.equal('GZmjWFJT9dUnpWNqJabnRMq4twyqCr9kXFc3zMGePma9');
191
+ });
192
+ });
193
+ });
194
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlTWVzc2FnZUJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvbWVzc2FnZXMvc2ltcGxlTWVzc2FnZUJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxrREFBMEI7QUFDMUIsb0RBQTRCO0FBQzVCLG1EQUFnRztBQUNoRywyQ0FBNkI7QUFDN0Isc0NBQXFEO0FBRXJELFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtJQUN0QyxJQUFJLE9BQTJCLENBQUM7SUFDaEMsSUFBSSxPQUE4QixDQUFDO0lBQ25DLE1BQU0sVUFBVSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBYyxDQUFDO0lBRWhELFVBQVUsQ0FBQztRQUNULE9BQU8sR0FBRyxlQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDaEMsT0FBTyxHQUFHLElBQUksMkJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUM7UUFDUixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsT0FBTyxFQUFFO1FBQ2hCLEVBQUUsQ0FBQyxtREFBbUQsRUFBRSxLQUFLO1lBQzNELE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyw4QkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0RSxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTVCLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3RDLGdCQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RCLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFD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QUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQzdCLHlHQUF5RyxDQUMxRyxDQUFDO1lBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTdCLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDM0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxlQUFlLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FDMUIsMEZBQTBGLENBQzNGLENBQUM7WUFDRixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUN2QixrSUFBa0ksQ0FDbkksQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQzlELFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4gfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBCcm9hZGNhc3RhYmxlTWVzc2FnZSwgTWVzc2FnZVN0YW5kYXJkVHlwZSwgU2ltcGxlTWVzc2FnZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBNZXNzYWdlQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuXG5kZXNjcmliZSgnU29sYW5hIFNpbXBsZU1lc3NhZ2VCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBsZXQgc2FuZGJveDogc2lub24uU2lub25TYW5kYm94O1xuICBsZXQgZmFjdG9yeTogTWVzc2FnZUJ1aWxkZXJGYWN0b3J5O1xuICBjb25zdCBjb2luQ29uZmlnID0geyBuYW1lOiAndHNvbCcgfSBhcyBCYXNlQ29pbjtcblxuICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94ID0gc2lub24uY3JlYXRlU2FuZGJveCgpO1xuICAgIGZhY3RvcnkgPSBuZXcgTWVzc2FnZUJ1aWxkZXJGYWN0b3J5KGNvaW5Db25maWcpO1xuICB9KTtcblxuICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3gucmVzdG9yZSgpO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIFNpbXBsZU1lc3NhZ2Ugd2l0aCBjb3JyZWN0IHBheWxvYWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gJ0hlbGxvLCBTb2xhbmEhJztcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKE1lc3NhZ2VTdGFuZGFyZFR5cGUuU0lNUExFKTtcbiAgICAgIGJ1aWxkZXIuc2V0UGF5bG9hZChwYXlsb2FkKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdChtZXNzYWdlKTtcbiAgICAgIG1lc3NhZ2Uuc2hvdWxkLmJlLmluc3RhbmNlb2YoU2ltcGxlTWVzc2FnZSk7XG4gICAgICBzaG91bGQuZXF1YWwobWVzc2FnZS5nZXRUeXBlKCksIE1lc3NhZ2VTdGFuZGFyZFR5cGUuU0lNUExFKTtcbiAgICAgIHNob3VsZC5lcXVhbChtZXNzYWdlLmdldFBheWxvYWQoKSwgcGF5bG9hZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGEgU2ltcGxlTWVzc2FnZSB3aXRoIHNpZ25hdHVyZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gJ1NpZ24gdGhpcyBtZXNzYWdlJztcbiAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBwdWJsaWNLZXk6IHsgcHViOiAnc29sUHViS2V5MScgfSxcbiAgICAgICAgICBzaWduYXR1cmU6IEJ1ZmZlci5mcm9tKCdzb2xTaWduYXR1cmUxJyksXG4gICAgICAgIH0sXG4gICAgICBdO1xuXG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRNZXNzYWdlQnVpbGRlcihNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgICBidWlsZGVyLnNldFBheWxvYWQocGF5bG9hZCkuc2V0U2lnbmF0dXJlcyhzaWduYXR1cmVzKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdChtZXNzYWdlKTtcbiAgICAgIHNob3VsZC5lcXVhbChtZXNzYWdlLmdldFBheWxvYWQoKSwgcGF5bG9hZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKG1lc3NhZ2UuZ2V0U2lnbmF0dXJlcygpLCBzaWduYXR1cmVzKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgYSBTaW1wbGVNZXNzYWdlIHdpdGggc2lnbmVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSAnTWVzc2FnZSB3aXRoIHNpZ25lcnMnO1xuICAgICAgY29uc3Qgc2lnbmVycyA9IFsnc29sU2lnbmVyMScsICdzb2xTaWduZXIyJ107XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKE1lc3NhZ2VTdGFuZGFyZFR5cGUuU0lNUExFKTtcbiAgICAgIGJ1aWxkZXIuc2V0UGF5bG9hZChwYXlsb2FkKS5zZXRTaWduZXJzKHNpZ25lcnMpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmV4aXN0KG1lc3NhZ2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKG1lc3NhZ2UuZ2V0UGF5bG9hZCgpLCBwYXlsb2FkKTtcbiAgICAgIHNob3VsZC5kZWVwRXF1YWwobWVzc2FnZS5nZXRTaWduZXJzKCksIHNpZ25lcnMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIFNpbXBsZU1lc3NhZ2Ugd2l0aCBtZXRhZGF0YScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSAnTWVzc2FnZSB3aXRoIG1ldGFkYXRhJztcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0geyBzb2xOZXR3b3JrOiAndGVzdG5ldCcsIHRpbWVzdGFtcDogMTYyNTA5NzYwMCB9O1xuXG4gICAgICBjb25zdCBidWlsZGVyID0gZmFjdG9yeS5nZXRNZXNzYWdlQnVpbGRlcihNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgICBidWlsZGVyLnNldFBheWxvYWQocGF5bG9hZCkuc2V0TWV0YWRhdGEobWV0YWRhdGEpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgc2hvdWxkLmV4aXN0KG1lc3NhZ2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKG1lc3NhZ2UuZ2V0UGF5bG9hZCgpLCBwYXlsb2FkKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2VNZXRhZGF0YSA9IG1lc3NhZ2UuZ2V0TWV0YWRhdGEoKTtcbiAgICAgIHNob3VsZC5lcXVhbChtZXNzYWdlTWV0YWRhdGE/LnNvbE5ldHdvcmssIG1ldGFkYXRhLnNvbE5ldHdvcmspO1xuICAgICAgc2hvdWxkLmVxdWFsKG1lc3NhZ2VNZXRhZGF0YT8udGltZXN0YW1wLCBtZXRhZGF0YS50aW1lc3RhbXApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKE1lc3NhZ2VTdGFuZGFyZFR5cGUuU0lNUExFKTtcbiAgICAgIGF3YWl0IHNob3VsZChidWlsZGVyLmJ1aWxkKCkpLmJlLnJlamVjdGVkV2l0aCgnTWVzc2FnZSBwYXlsb2FkIG11c3QgYmUgc2V0IGJlZm9yZSBidWlsZGluZyB0aGUgbWVzc2FnZScpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0U2lnbmFibGVQYXlsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIEJ1ZmZlciB3aXRoIGNvcnJlY3QgcGF5bG9hZCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSAnU2lnbmFibGUgU29sYW5hIG1lc3NhZ2UnO1xuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TWVzc2FnZUJ1aWxkZXIoTWVzc2FnZVN0YW5kYXJkVHlwZS5TSU1QTEUpO1xuICAgICAgYnVpbGRlci5zZXRQYXlsb2FkKHBheWxvYWQpO1xuXG4gICAgICBjb25zdCBtZXNzYWdlID0gYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2lnbmFibGVQYXlsb2FkID0gYXdhaXQgbWVzc2FnZS5nZXRTaWduYWJsZVBheWxvYWQoKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KHNpZ25hYmxlUGF5bG9hZCk7XG4gICAgICBCdWZmZXIuaXNCdWZmZXIoc2lnbmFibGVQYXlsb2FkKS5zaG91bGQuYmUudHJ1ZSgpO1xuICAgICAgc2lnbmFibGVQYXlsb2FkLnRvU3RyaW5nKCkuc2hvdWxkLmVxdWFsKHBheWxvYWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndG9Ccm9hZGNhc3RGb3JtYXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IFNpbXBsZU1lc3NhZ2UgdG8gYnJvYWRjYXN0YWJsZSBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXlsb2FkID0gJ0Jyb2FkY2FzdCBtZSc7XG4gICAgICBjb25zdCBzaWduZXJzID0gWydzb2xBZGRyZXNzMSddO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIHB1YmxpY0tleTogeyBwdWI6ICdzb2xQdWJLZXkxJyB9LFxuICAgICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20oJ3NvbFNpZ25hdHVyZTEnKSxcbiAgICAgICAgfSxcbiAgICAgIF07XG5cbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmdldE1lc3NhZ2VCdWlsZGVyKE1lc3NhZ2VTdGFuZGFyZFR5cGUuU0lNUExFKTtcbiAgICAgIGJ1aWxkZXIuc2V0UGF5bG9hZChwYXlsb2FkKS5zZXRTaWduZXJzKHNpZ25lcnMpLnNldFNpZ25hdHVyZXMoc2lnbmF0dXJlcyk7XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBicm9hZGNhc3RGb3JtYXQgPSBhd2FpdCBtZXNzYWdlLnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChicm9hZGNhc3RGb3JtYXQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGJyb2FkY2FzdEZvcm1hdC50eXBlLCBNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgICBzaG91bGQuZXF1YWwoYnJvYWRjYXN0Rm9ybWF0LnBheWxvYWQsIHBheWxvYWQpO1xuICAgICAgc2hvdWxkLmRlZXBFcXVhbChicm9hZGNhc3RGb3JtYXQuc2lnbmVycywgc2lnbmVycyk7XG4gICAgICBzaG91bGQuZXhpc3QoYnJvYWRjYXN0Rm9ybWF0LnNlcmlhbGl6ZWRTaWduYXR1cmVzKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRTaWduYXR1cmVzID0gYnJvYWRjYXN0Rm9ybWF0LnNlcmlhbGl6ZWRTaWduYXR1cmVzO1xuICAgICAgc2hvdWxkLmVxdWFsKHNlcmlhbGl6ZWRTaWduYXR1cmVzPy5sZW5ndGgsIDEpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNlcmlhbGl6ZWRTaWduYXR1cmVzPy5bMF0ucHVibGljS2V5LCAnc29sUHViS2V5MScpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNlcmlhbGl6ZWRTaWduYXR1cmVzPy5bMF0uc2lnbmF0dXJlLCBCdWZmZXIuZnJvbSgnc29sU2lnbmF0dXJlMScpLnRvU3RyaW5nKCdiYXNlNjQnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tQnJvYWRjYXN0Rm9ybWF0JywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVidWlsZCBtZXNzYWdlIGZyb20gYnJvYWRjYXN0YWJsZSBmb3JtYXQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBicm9hZGNhc3RNZXNzYWdlOiBCcm9hZGNhc3RhYmxlTWVzc2FnZSA9IHtcbiAgICAgICAgdHlwZTogTWVzc2FnZVN0YW5kYXJkVHlwZS5TSU1QTEUsXG4gICAgICAgIHBheWxvYWQ6ICdTb2xhbmEgdGVzdCBtZXNzYWdlJyxcbiAgICAgICAgc2VyaWFsaXplZFNpZ25hdHVyZXM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwdWJsaWNLZXk6ICdzb2xQdWJLZXkxJyxcbiAgICAgICAgICAgIHNpZ25hdHVyZTogQnVmZmVyLmZyb20oJ3NvbFNpZ25hdHVyZTEnKS50b1N0cmluZygnYmFzZTY0JyksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgc2lnbmVyczogWydzb2xTaWduZXIxJ10sXG4gICAgICAgIG1ldGFkYXRhOiB7IG5ldHdvcms6ICd0ZXN0bmV0JywgZW5jb2Rpbmc6ICd1dGY4JyB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYnVpbGRlciA9IGZhY3RvcnkuZ2V0TWVzc2FnZUJ1aWxkZXIoTWVzc2FnZVN0YW5kYXJkVHlwZS5TSU1QTEUpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGF3YWl0IGJ1aWxkZXIuZnJvbUJyb2FkY2FzdEZvcm1hdChicm9hZGNhc3RNZXNzYWdlKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KG1lc3NhZ2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKG1lc3NhZ2UuZ2V0VHlwZSgpLCBNZXNzYWdlU3RhbmRhcmRUeXBlLlNJTVBMRSk7XG4gICAgICBzaG91bGQuZXF1YWwobWVzc2FnZS5nZXRQYXlsb2FkKCksIGJyb2FkY2FzdE1lc3NhZ2UucGF5bG9hZCk7XG4gICAgICBzaG91bGQuZGVlcEVxdWFsKG1lc3NhZ2UuZ2V0U2lnbmVycygpLCBicm9hZGNhc3RNZXNzYWdlLnNpZ25lcnMpO1xuICAgICAgc2hvdWxkLmV4aXN0KG1lc3NhZ2UuZ2V0U2lnbmF0dXJlcygpKTtcbiAgICAgIHNob3VsZC5lcXVhbChtZXNzYWdlLmdldFNpZ25hdHVyZXMoKS5sZW5ndGgsIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZnJvbUJyb2FkY2FzdFN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGJyb2FkY2FzdGFibGUgc3RyaW5nIGFuZCByZXR1cm4gY29ycmVjdCBidWlsZGVyIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBicm9hZGNhc3RIZXggPVxuICAgICAgICAnN2IyMjc0Nzk3MDY1MjIzYTIyNTM0OTRkNTA0YzQ1MjIyYzIyNzA2MTc5NmM2ZjYxNjQyMjNhMjI1MzU0NDE1MjIwMzQzODM3MzkzNDM2MzcyMDc0NmYyMDYxNjQ2NDcyMzE3MTc4NzYzOTY1Mzk3YTcwMzUzNTc4NzYzMzM2MzA3NzY3Njg2YzM4MzAzNjY0MzAzMjc5MzMzNTM4MzkzOTdhNmI2YjcxMzI3MjY4NzQ2Njc4NzYzNzc4MzY3Nzc5NjM3NDZhMzI3OTcyNjY2Nzc2NjU3MjM1Mzc3NTMzMzAzNzc3NmMzNTM2MzczNTY2NzI2Nzc3MzIzMjM5NjQ3NjcxMzUzODc3NmI2YTc2NjU3NTY0MzU3NTcxNjY2ZTZkNzQ2NTdhMjAzMzMxNjEzNjYyNjE2MjM1MzA2MTM4MzQ2MjM4MzQzMzM5NjE2NDYzNjY2MjM3MzgzNjYyNjIzMjMwMzIzMDY2MzYzODMwMzc2NTM2NjUzODY2NjQ2MTM2MzIzOTYyMzQzMjM0MzEzMTMwNjY2MzM3NjI2MjMxNjMzNjYyMzg2MjIyMmMyMjczNjU3MjY5NjE2YzY5N2E2NTY0NTM2OTY3NmU2MTc0NzU3MjY1NzMyMjNhNWI3YjIyNzA3NTYyNmM2OTYzNGI2NTc5MjIzYTIyNDc1YTZkNmE1NzQ2NGE1NDM5NjQ1NTZlNzA1NzRlNzE0YTYxNjI2ZTUyNGQ3MTM0NzQ3Nzc5NzE0MzcyMzk2YjU4NDY2MzMzN2E0ZDQ3NjU1MDZkNjEzOTIyMmMyMjczNjk2NzZlNjE3NDc1NzI2NTIyM2EyMjY3NTIzNTQzNDQ0NjQ2NGY1MjQyNTIyZjY3NTY0MTZiNGI2MjRhNDYzNTUzNGQ2ZjM2NDk1MDYzNjc0YTM3NmE2OTc2Njk0ZjJmNzYzMTUzNWE3MDU2NTE0YjZhNjc1NjZlNmY0MTRmNDU2OTU4NTU2MTQ0NzI2NTZkNmM0NzM1NTE2NzQzNzc1OTQyNzI1YTYxMzI0ODZhNTQ3NzM5Mzg2YzY1Mzk2ZTQ0NjczZDNkMjI3ZDVkMmMyMjczNjk2NzZlNjU3MjczMjIzYTViMjI0NzVhNmQ2YTU3NDY0YTU0Mzk2NDU1NmU3MDU3NGU3MTRhNjE2MjZlNTI0ZDcxMzQ3NDc3Nzk3MTQzNzIzOTZiNTg0NjYzMzM3YTRkNDc2NTUwNmQ2MTM5MjI1ZDJjMjI2ZDY1NzQ2MTY0NjE3NDYxMjIzYTdiMjI2NTZlNjM2ZjY0Njk2ZTY3MjIzYTIyNzU3NDY2MzgyMjdkMmMyMjczNjk2NzZlNjE2MjZjNjU1MDYxNzk2YzZmNjE2NDIyM2EyMjU1MzE1MjQyNTU2OTQxMzA0ZjQ0NjMzNTRlNDQ1OTMzNDk0ODUyNzY0OTQ3NDY2YjVhNDg0OTc4NjM1ODY4MzI0ZjU3NTUzNTY1NmU0MTMxNGU1ODY4MzI0ZDdhNTk3NzY0MzI2NDZmNjI0NDY3Nzc0ZTZkNTE3NzRkNmU2YjdhNGU1NDY3MzU0ZjU4NzA3MjYxMzM0NTc5NjM2ZDY4MzA1YTZlNjgzMjRlMzM2NzMyNjQzMzZjNmE2NDQ3NmY3OTY1NTg0YTZkNWEzMzVhNmM2MzZhNTUzMzY0NTQ0ZDc3NGUzMzY0NzM0ZTU0NTkzMzRlNTc1YTc5NWEzMzYzNzk0ZDZhNmM2YjY0NmU0NTMxNGY0ODY0NzI2MTZlNWE2YzY0NTc1MTMxNjQ1ODQ2NmQ2MjZkMzEzMDVhNTg2ZjY3NGQ3YTQ2Njg0ZTZkNGE2ODU5NmE1NTc3NTk1NDY3MzA1OTZhNjczMDRkN2E2YzY4NWE0NzRlNmQ1OTZhNjMzNDRlNmQ0YTY5NGQ2YTQxNzk0ZDQ3NTkzMjRmNDQ0MTMzNWE1NDVhNmM0ZjQ3NWE2YjU5NTQ1OTc5NGY1NzQ5MzA0ZDZhNTE3ODRkNTQ0MjZkNTk3YTY0Njk1OTZhNDY2YTRlNmQ0OTM0NTk2NzNkM2QyMjdkJztcbiAgICAgIGNvbnN0IGNvaW5Db25maWcgPSB7IG5hbWU6ICdzb2wnIH0gYXMgQmFzZUNvaW47XG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE1lc3NhZ2VCdWlsZGVyRmFjdG9yeShjb2luQ29uZmlnKTtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBmYWN0b3J5LmZyb21Ccm9hZGNhc3RTdHJpbmcoYnJvYWRjYXN0SGV4KTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IHBheWxvYWQgPSBtZXNzYWdlLmdldFBheWxvYWQoKTtcbiAgICAgIGNvbnN0IHBheWxvYWRQYXJ0cyA9IHBheWxvYWQuc3BsaXQoJyAnKTtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBtZXNzYWdlLmdldFNpZ25lcnMoKVswXTtcbiAgICAgIGFkZHJlc3Muc2hvdWxkLmVxdWFsKCdHWm1qV0ZKVDlkVW5wV05xSmFiblJNcTR0d3lxQ3I5a1hGYzN6TUdlUG1hOScpO1xuICAgICAgY29uc3QgZGVzdGluYXRpb25BZGRyZXNzID0gcGF5bG9hZFBhcnRzWzNdO1xuICAgICAgZGVzdGluYXRpb25BZGRyZXNzLnNob3VsZC5lcXVhbChcbiAgICAgICAgJ2FkZHIxcXh2OWU5enA1NXh2MzYwd2dobDgwNmQwMnkzNTg5OXpra3Eycmh0Znh2N3g2d3ljdGoyeXJmZ3ZlcjU3dTMwN3dsNTY3NWZyZ3cyMjlkdnE1OHdranZldWQ1dXFmbm10ZXonXG4gICAgICApO1xuICAgICAgY29uc3QgYW1vdW50ID0gTnVtYmVyKHBheWxvYWRQYXJ0c1sxXSk7XG4gICAgICBhbW91bnQuc2hvdWxkLmVxdWFsKDQ4Nzk0NjcpO1xuXG4gICAgICBjb25zdCBzaWduYXR1cmVCdWZmID0gbWVzc2FnZS5nZXRTaWduYXR1cmVzKClbMF0uc2lnbmF0dXJlO1xuICAgICAgY29uc3Qgc2lnbmF0dXJlQmFzZTU4ID0gYnM1OC5lbmNvZGUoc2lnbmF0dXJlQnVmZik7XG4gICAgICBzaWduYXR1cmVCYXNlNTguc2hvdWxkLmVxdWFsKFxuICAgICAgICAnM2FqN3hER0pyRkFiTkY2R0xyV1RIcHk4VVc5NGk2eEZBREoxS2RvbURMYUNEalV5ejhHajV2UGM1bVpMZHVGaFJBVUNVNEJVY25CV3U1dGUxRGJNWENGZidcbiAgICAgICk7XG4gICAgICBjb25zdCBzaWduYXR1cmVIZXggPSBzaWduYXR1cmVCdWZmLnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIHNpZ25hdHVyZUhleC5zaG91bGQuZXF1YWwoXG4gICAgICAgICc4MTFlNDIwYzUxNGU0NDE0N2Y4MTUwMjQyOWIyNDVlNTIzMjhlODgzZGM4MDllZTM4YWY4OGVmZWZkNTI2Njk1NTAyYTM4MTU5ZTgwMGUxMjI1ZDQ2ODNhZGU5YTUxYjk0MjAwYjA2MDFhZDk2YjYxZTM0ZjBmN2M5NWVmNjcwZSdcbiAgICAgICk7XG4gICAgICBjb25zdCBwdWJsaWNLZXlIZXggPSBtZXNzYWdlLmdldFNpZ25hdHVyZXMoKVswXS5wdWJsaWNLZXkucHViO1xuICAgICAgcHVibGljS2V5SGV4LnNob3VsZC5lcXVhbCgnR1ptaldGSlQ5ZFVucFdOcUphYm5STXE0dHd5cUNyOWtYRmMzek1HZVBtYTknKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sol.d.ts","sourceRoot":"","sources":["../../../test/unit/sol.ts"],"names":[],"mappings":""}