@bitgo-beta/sdk-coin-sui 3.0.3-beta.182 → 3.0.3-beta.1821

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 (196) hide show
  1. package/dist/src/index.d.ts +1 -0
  2. package/dist/src/index.d.ts.map +1 -1
  3. package/dist/src/index.js +7 -2
  4. package/dist/src/lib/compareTransactionBlocks.js +2 -3
  5. package/dist/src/lib/constants.d.ts +9 -2
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +18 -2
  8. package/dist/src/lib/customTransaction.js +3 -3
  9. package/dist/src/lib/customTransactionBuilder.js +5 -5
  10. package/dist/src/lib/iface.d.ts +80 -12
  11. package/dist/src/lib/iface.d.ts.map +1 -1
  12. package/dist/src/lib/iface.js +34 -5
  13. package/dist/src/lib/index.d.ts +6 -0
  14. package/dist/src/lib/index.d.ts.map +1 -1
  15. package/dist/src/lib/index.js +36 -10
  16. package/dist/src/lib/keyPair.js +24 -10
  17. package/dist/src/lib/mystenlab/builder/Inputs.d.ts +64 -11
  18. package/dist/src/lib/mystenlab/builder/Inputs.d.ts.map +1 -1
  19. package/dist/src/lib/mystenlab/builder/Inputs.js +63 -19
  20. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts +88 -355
  21. package/dist/src/lib/mystenlab/builder/TransactionBlock.d.ts.map +1 -1
  22. package/dist/src/lib/mystenlab/builder/TransactionBlock.js +44 -25
  23. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts +152 -77
  24. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.d.ts.map +1 -1
  25. package/dist/src/lib/mystenlab/builder/TransactionDataBlock.js +54 -44
  26. package/dist/src/lib/mystenlab/builder/Transactions.d.ts +133 -188
  27. package/dist/src/lib/mystenlab/builder/Transactions.d.ts.map +1 -1
  28. package/dist/src/lib/mystenlab/builder/Transactions.js +52 -53
  29. package/dist/src/lib/mystenlab/builder/bcs.d.ts +1 -1
  30. package/dist/src/lib/mystenlab/builder/bcs.d.ts.map +1 -1
  31. package/dist/src/lib/mystenlab/builder/bcs.js +2 -2
  32. package/dist/src/lib/mystenlab/builder/index.js +6 -2
  33. package/dist/src/lib/mystenlab/builder/serializer.js +6 -8
  34. package/dist/src/lib/mystenlab/builder/utils.d.ts +1 -1
  35. package/dist/src/lib/mystenlab/builder/utils.d.ts.map +1 -1
  36. package/dist/src/lib/mystenlab/builder/utils.js +4 -4
  37. package/dist/src/lib/mystenlab/cryptography/hash.js +3 -4
  38. package/dist/src/lib/mystenlab/framework/framework.d.ts +6 -6
  39. package/dist/src/lib/mystenlab/framework/framework.d.ts.map +1 -1
  40. package/dist/src/lib/mystenlab/framework/framework.js +22 -25
  41. package/dist/src/lib/mystenlab/framework/index.js +6 -2
  42. package/dist/src/lib/mystenlab/framework/sui-system-state.js +2 -2
  43. package/dist/src/lib/mystenlab/txn-data-serializers/type-tag-serializer.js +2 -2
  44. package/dist/src/lib/mystenlab/types/coin.d.ts +13 -11
  45. package/dist/src/lib/mystenlab/types/coin.d.ts.map +1 -1
  46. package/dist/src/lib/mystenlab/types/coin.js +20 -19
  47. package/dist/src/lib/mystenlab/types/common.d.ts +8 -8
  48. package/dist/src/lib/mystenlab/types/common.d.ts.map +1 -1
  49. package/dist/src/lib/mystenlab/types/common.js +22 -22
  50. package/dist/src/lib/mystenlab/types/events.d.ts +15 -15
  51. package/dist/src/lib/mystenlab/types/events.d.ts.map +1 -1
  52. package/dist/src/lib/mystenlab/types/events.js +17 -17
  53. package/dist/src/lib/mystenlab/types/index.js +6 -2
  54. package/dist/src/lib/mystenlab/types/normalized.d.ts +21 -21
  55. package/dist/src/lib/mystenlab/types/normalized.d.ts.map +1 -1
  56. package/dist/src/lib/mystenlab/types/normalized.js +41 -41
  57. package/dist/src/lib/mystenlab/types/objects.d.ts +51 -51
  58. package/dist/src/lib/mystenlab/types/objects.d.ts.map +1 -1
  59. package/dist/src/lib/mystenlab/types/objects.js +96 -106
  60. package/dist/src/lib/mystenlab/types/option.d.ts +1 -1
  61. package/dist/src/lib/mystenlab/types/option.d.ts.map +1 -1
  62. package/dist/src/lib/mystenlab/types/option.js +2 -3
  63. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts +55 -29
  64. package/dist/src/lib/mystenlab/types/sui-bcs.d.ts.map +1 -1
  65. package/dist/src/lib/mystenlab/types/sui-bcs.js +29 -5
  66. package/dist/src/lib/mystenlab/types/transactions.d.ts +625 -625
  67. package/dist/src/lib/mystenlab/types/transactions.d.ts.map +1 -1
  68. package/dist/src/lib/mystenlab/types/transactions.js +178 -194
  69. package/dist/src/lib/mystenlab/types/validator.d.ts +13 -13
  70. package/dist/src/lib/mystenlab/types/validator.d.ts.map +1 -1
  71. package/dist/src/lib/mystenlab/types/validator.js +124 -124
  72. package/dist/src/lib/resources/walrusConfig.d.ts +22 -0
  73. package/dist/src/lib/resources/walrusConfig.d.ts.map +1 -0
  74. package/dist/src/lib/resources/walrusConfig.js +37 -0
  75. package/dist/src/lib/rpcClient.d.ts +5 -0
  76. package/dist/src/lib/rpcClient.d.ts.map +1 -0
  77. package/dist/src/lib/rpcClient.js +74 -0
  78. package/dist/src/lib/stakingBuilder.d.ts.map +1 -1
  79. package/dist/src/lib/stakingBuilder.js +23 -7
  80. package/dist/src/lib/stakingTransaction.d.ts +0 -1
  81. package/dist/src/lib/stakingTransaction.d.ts.map +1 -1
  82. package/dist/src/lib/stakingTransaction.js +26 -15
  83. package/dist/src/lib/tokenTransferBuilder.d.ts +66 -0
  84. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
  85. package/dist/src/lib/tokenTransferBuilder.js +202 -0
  86. package/dist/src/lib/tokenTransferTransaction.d.ts +59 -0
  87. package/dist/src/lib/tokenTransferTransaction.d.ts.map +1 -0
  88. package/dist/src/lib/tokenTransferTransaction.js +272 -0
  89. package/dist/src/lib/transaction.d.ts +21 -4
  90. package/dist/src/lib/transaction.d.ts.map +1 -1
  91. package/dist/src/lib/transaction.js +129 -17
  92. package/dist/src/lib/transactionBuilder.d.ts +13 -4
  93. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  94. package/dist/src/lib/transactionBuilder.js +34 -4
  95. package/dist/src/lib/transactionBuilderFactory.d.ts +11 -2
  96. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  97. package/dist/src/lib/transactionBuilderFactory.js +32 -1
  98. package/dist/src/lib/transferBuilder.d.ts +58 -1
  99. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  100. package/dist/src/lib/transferBuilder.js +310 -24
  101. package/dist/src/lib/transferTransaction.d.ts +6 -1
  102. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  103. package/dist/src/lib/transferTransaction.js +129 -12
  104. package/dist/src/lib/unstakingBuilder.js +6 -6
  105. package/dist/src/lib/unstakingTransaction.d.ts +0 -1
  106. package/dist/src/lib/unstakingTransaction.d.ts.map +1 -1
  107. package/dist/src/lib/unstakingTransaction.js +31 -17
  108. package/dist/src/lib/utils.d.ts +24 -3
  109. package/dist/src/lib/utils.d.ts.map +1 -1
  110. package/dist/src/lib/utils.js +254 -21
  111. package/dist/src/lib/walrusStakingBuilder.d.ts +66 -0
  112. package/dist/src/lib/walrusStakingBuilder.d.ts.map +1 -0
  113. package/dist/src/lib/walrusStakingBuilder.js +200 -0
  114. package/dist/src/lib/walrusStakingTransaction.d.ts +52 -0
  115. package/dist/src/lib/walrusStakingTransaction.d.ts.map +1 -0
  116. package/dist/src/lib/walrusStakingTransaction.js +269 -0
  117. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts +36 -0
  118. package/dist/src/lib/walrusWithdrawStakeBuilder.d.ts.map +1 -0
  119. package/dist/src/lib/walrusWithdrawStakeBuilder.js +173 -0
  120. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts +21 -0
  121. package/dist/src/lib/walrusWithdrawStakeTransaction.d.ts.map +1 -0
  122. package/dist/src/lib/walrusWithdrawStakeTransaction.js +190 -0
  123. package/dist/src/register.d.ts.map +1 -1
  124. package/dist/src/register.js +5 -1
  125. package/dist/src/sui.d.ts +46 -8
  126. package/dist/src/sui.d.ts.map +1 -1
  127. package/dist/src/sui.js +525 -37
  128. package/dist/src/suiToken.d.ts +22 -0
  129. package/dist/src/suiToken.d.ts.map +1 -0
  130. package/dist/src/suiToken.js +61 -0
  131. package/dist/src/tsui.js +1 -1
  132. package/dist/test/integration/index.d.ts +1 -0
  133. package/dist/test/integration/index.d.ts.map +1 -0
  134. package/dist/test/integration/index.js +1 -0
  135. package/dist/test/local_fullnode/RpcClient.d.ts +60 -0
  136. package/dist/test/local_fullnode/RpcClient.d.ts.map +1 -0
  137. package/dist/test/local_fullnode/RpcClient.js +111 -0
  138. package/dist/test/local_fullnode/faucet.d.ts +6 -0
  139. package/dist/test/local_fullnode/faucet.d.ts.map +1 -0
  140. package/dist/test/local_fullnode/faucet.js +17 -0
  141. package/dist/test/local_fullnode/transactions.d.ts +2 -0
  142. package/dist/test/local_fullnode/transactions.d.ts.map +1 -0
  143. package/dist/test/local_fullnode/transactions.js +190 -0
  144. package/dist/test/resources/sui.d.ts +458 -0
  145. package/dist/test/resources/sui.d.ts.map +1 -0
  146. package/dist/test/resources/sui.js +632 -0
  147. package/dist/test/unit/compareTransactionBlocks.d.ts +2 -0
  148. package/dist/test/unit/compareTransactionBlocks.d.ts.map +1 -0
  149. package/dist/test/unit/compareTransactionBlocks.js +64 -0
  150. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  151. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  152. package/dist/test/unit/getBuilderFactory.js +10 -0
  153. package/dist/test/unit/keyPair.d.ts +2 -0
  154. package/dist/test/unit/keyPair.d.ts.map +1 -0
  155. package/dist/test/unit/keyPair.js +72 -0
  156. package/dist/test/unit/sui.d.ts +2 -0
  157. package/dist/test/unit/sui.d.ts.map +1 -0
  158. package/dist/test/unit/sui.js +2423 -0
  159. package/dist/test/unit/suiToken.d.ts +2 -0
  160. package/dist/test/unit/suiToken.d.ts.map +1 -0
  161. package/dist/test/unit/suiToken.js +39 -0
  162. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts +2 -0
  163. package/dist/test/unit/transactionBuilder/customTransactionBuilder.d.ts.map +1 -0
  164. package/dist/test/unit/transactionBuilder/customTransactionBuilder.js +106 -0
  165. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
  166. package/dist/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  167. package/dist/test/unit/transactionBuilder/stakingBuilder.js +152 -0
  168. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  169. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  170. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +255 -0
  171. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts +2 -0
  172. package/dist/test/unit/transactionBuilder/transactionBuilder.d.ts.map +1 -0
  173. package/dist/test/unit/transactionBuilder/transactionBuilder.js +639 -0
  174. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  175. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  176. package/dist/test/unit/transactionBuilder/transferBuilder.js +1055 -0
  177. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts +2 -0
  178. package/dist/test/unit/transactionBuilder/unstakingBuilder.d.ts.map +1 -0
  179. package/dist/test/unit/transactionBuilder/unstakingBuilder.js +115 -0
  180. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts +2 -0
  181. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.d.ts.map +1 -0
  182. package/dist/test/unit/transactionBuilder/walrusStakingBuilder.js +162 -0
  183. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts +2 -0
  184. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.d.ts.map +1 -0
  185. package/dist/test/unit/transactionBuilder/walrusWithdrawBuilder.js +181 -0
  186. package/dist/test/unit/transferTransaction.d.ts +2 -0
  187. package/dist/test/unit/transferTransaction.d.ts.map +1 -0
  188. package/dist/test/unit/transferTransaction.js +94 -0
  189. package/dist/test/unit/utils.d.ts +2 -0
  190. package/dist/test/unit/utils.d.ts.map +1 -0
  191. package/dist/test/unit/utils.js +186 -0
  192. package/dist/tsconfig.tsbuildinfo +1 -0
  193. package/package.json +16 -12
  194. package/.eslintignore +0 -6
  195. package/.mocharc.yml +0 -7
  196. package/CHANGELOG.md +0 -420
@@ -0,0 +1,94 @@
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 statics_1 = require("@bitgo-beta/statics");
40
+ const should_1 = __importDefault(require("should"));
41
+ const src_1 = require("../../src");
42
+ const testData = __importStar(require("../resources/sui"));
43
+ describe('Sui Transfer Transaction', () => {
44
+ let tx;
45
+ const config = statics_1.coins.get('tsui');
46
+ beforeEach(() => {
47
+ tx = new src_1.TransferTransaction(config);
48
+ });
49
+ describe('Empty transaction', () => {
50
+ it('should throw empty transaction', function () {
51
+ should_1.default.throws(() => tx.toJson(), 'Empty transaction');
52
+ should_1.default.throws(() => tx.toBroadcastFormat(), 'Empty transaction');
53
+ });
54
+ });
55
+ describe('From raw transaction', () => {
56
+ it('should build a transfer from raw hex', function () {
57
+ tx.fromRawTransaction(testData.TRANSFER);
58
+ const json = tx.toJson();
59
+ should_1.default.equal(json.sender, testData.sender.address);
60
+ });
61
+ it('should fail to build a transfer from incorrect raw hex', function () {
62
+ should_1.default.throws(() => tx.fromRawTransaction('random' + testData.TRANSFER), 'incorrect raw data');
63
+ });
64
+ });
65
+ describe('Explain transaction', () => {
66
+ it('should explain a transfer pay transaction', function () {
67
+ tx.fromRawTransaction(testData.TRANSFER);
68
+ const explainedTransaction = tx.explainTransaction();
69
+ explainedTransaction.should.deepEqual({
70
+ displayOrder: ['id', 'outputs', 'outputAmount', 'changeOutputs', 'changeAmount', 'fee', 'type'],
71
+ id: 'BxoeGXbBCuw6VFEcgwHHUAKrCoAsGanPB39kdVVKZZcR',
72
+ outputs: [
73
+ {
74
+ address: testData.recipients[0].address,
75
+ amount: testData.recipients[0].amount,
76
+ },
77
+ {
78
+ address: testData.recipients[1].address,
79
+ amount: testData.recipients[1].amount,
80
+ },
81
+ ],
82
+ outputAmount: `${testData.AMOUNT * 2}`,
83
+ changeOutputs: [],
84
+ changeAmount: '0',
85
+ fee: { fee: testData.gasData.budget.toString() },
86
+ type: 0,
87
+ });
88
+ });
89
+ it('should fail to explain transaction with invalid raw hex', function () {
90
+ should_1.default.throws(() => tx.fromRawTransaction('randomString'), 'Invalid transaction');
91
+ });
92
+ });
93
+ });
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC90cmFuc2ZlclRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQTRDO0FBQzVDLG9EQUE0QjtBQUM1QixtQ0FBNkQ7QUFDN0QsMkRBQTZDO0FBRzdDLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsSUFBSSxFQUFnRCxDQUFDO0lBQ3JELE1BQU0sTUFBTSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakMsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLEVBQUUsR0FBRyxJQUFJLHlCQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRTtRQUNwQyxFQUFFLENBQUMsc0NBQXNDLEVBQUU7WUFDekMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHdEQUF3RCxFQUFFO1lBQzNELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDakcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyRCxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUNwQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUM7Z0JBQy9GLEVBQUUsRUFBRSw4Q0FBOEM7Z0JBQ2xELE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUN2QyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO3FCQUN0QztvQkFDRDt3QkFDRSxPQUFPLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO3dCQUN2QyxNQUFNLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO3FCQUN0QztpQkFDRjtnQkFDRCxZQUFZLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdEMsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLFlBQVksRUFBRSxHQUFHO2dCQUNqQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7UUFDcEYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uLCBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vc3JjJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uL3Jlc291cmNlcy9zdWknO1xuaW1wb3J0IHsgVHJhbnNmZXJQcm9ncmFtbWFibGVUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9saWIvaWZhY2UnO1xuXG5kZXNjcmliZSgnU3VpIFRyYW5zZmVyIFRyYW5zYWN0aW9uJywgKCkgPT4ge1xuICBsZXQgdHg6IFRyYW5zYWN0aW9uPFRyYW5zZmVyUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+O1xuICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ3RzdWknKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0eCA9IG5ldyBUcmFuc2ZlclRyYW5zYWN0aW9uKGNvbmZpZyk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGVtcHR5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB0eC50b0pzb24oKSwgJ0VtcHR5IHRyYW5zYWN0aW9uJyk7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksICdFbXB0eSB0cmFuc2FjdGlvbicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnRnJvbSByYXcgdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBhIHRyYW5zZmVyIGZyb20gcmF3IGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHR4LmZyb21SYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUik7XG4gICAgICBjb25zdCBqc29uID0gdHgudG9Kc29uKCk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZW5kZXIsIHRlc3REYXRhLnNlbmRlci5hZGRyZXNzKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gYnVpbGQgYSB0cmFuc2ZlciBmcm9tIGluY29ycmVjdCByYXcgaGV4JywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB0eC5mcm9tUmF3VHJhbnNhY3Rpb24oJ3JhbmRvbScgKyB0ZXN0RGF0YS5UUkFOU0ZFUiksICdpbmNvcnJlY3QgcmF3IGRhdGEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V4cGxhaW4gdHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIGEgdHJhbnNmZXIgcGF5IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLlRSQU5TRkVSKTtcbiAgICAgIGNvbnN0IGV4cGxhaW5lZFRyYW5zYWN0aW9uID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG4gICAgICBleHBsYWluZWRUcmFuc2FjdGlvbi5zaG91bGQuZGVlcEVxdWFsKHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZU91dHB1dHMnLCAnY2hhbmdlQW1vdW50JywgJ2ZlZScsICd0eXBlJ10sXG4gICAgICAgIGlkOiAnQnhvZUdYYkJDdXc2VkZFY2d3SEhVQUtyQ29Bc0dhblBCMzlrZFZWS1paY1InLFxuICAgICAgICBvdXRwdXRzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogdGVzdERhdGEucmVjaXBpZW50c1swXS5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMV0uYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogdGVzdERhdGEucmVjaXBpZW50c1sxXS5hbW91bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgb3V0cHV0QW1vdW50OiBgJHt0ZXN0RGF0YS5BTU9VTlQgKiAyfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6ICcwJyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGVzdERhdGEuZ2FzRGF0YS5idWRnZXQudG9TdHJpbmcoKSB9LFxuICAgICAgICB0eXBlOiAwLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gZXhwbGFpbiB0cmFuc2FjdGlvbiB3aXRoIGludmFsaWQgcmF3IGhleCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC50aHJvd3MoKCkgPT4gdHguZnJvbVJhd1RyYW5zYWN0aW9uKCdyYW5kb21TdHJpbmcnKSwgJ0ludmFsaWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -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,186 @@
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 should_1 = __importDefault(require("should"));
40
+ const testData = __importStar(require("../resources/sui"));
41
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
42
+ const nock_1 = __importDefault(require("nock"));
43
+ describe('Sui util library', function () {
44
+ describe('isValidAddress', function () {
45
+ it('should succeed to validate valid address', function () {
46
+ for (const address of testData.addresses.validAddresses) {
47
+ should_1.default.equal(utils_1.default.isValidAddress(address), true);
48
+ }
49
+ });
50
+ it('should fail to validate invalid addresses', function () {
51
+ for (const address of testData.addresses.invalidAddresses) {
52
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(address));
53
+ should_1.default.equal(utils_1.default.isValidAddress(address), false);
54
+ }
55
+ // @ts-expect-error Testing for missing param, should not throw an error
56
+ should_1.default.doesNotThrow(() => utils_1.default.isValidAddress(undefined));
57
+ // @ts-expect-error Testing for missing param, should return false
58
+ should_1.default.equal(utils_1.default.isValidAddress(undefined), false);
59
+ });
60
+ });
61
+ describe('isValidRawTransaction', function () {
62
+ it('should succeed to validate a valid raw transaction', function () {
63
+ should_1.default.equal(utils_1.default.isValidRawTransaction(testData.TRANSFER), true);
64
+ });
65
+ it('should fail to validate an invalid raw transaction', function () {
66
+ should_1.default.doesNotThrow(() => utils_1.default.isValidRawTransaction(testData.INVALID_RAW_TX));
67
+ should_1.default.equal(utils_1.default.isValidRawTransaction(testData.INVALID_RAW_TX), false);
68
+ });
69
+ });
70
+ describe('normalizeHexId', function () {
71
+ it('should succeed to normalize hexId with no prefix', function () {
72
+ const hexId = 'cba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
73
+ const expectedNormalized = '0xcba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
74
+ should_1.default.equal(utils_1.default.normalizeHexId(hexId), expectedNormalized);
75
+ });
76
+ it('should return the hexId with prefix already', function () {
77
+ const hexId = '0xcba4a48bb0f8b586c167e5dcefaa1c5e96ab3f08';
78
+ should_1.default.equal(utils_1.default.normalizeHexId(hexId), hexId);
79
+ });
80
+ });
81
+ describe('getBalance', function () {
82
+ const nodeUrl = 'https://fullnode.testnet.sui.io';
83
+ const owner = '0xb7db6234a33f1e35f7114dac69574c6b7b193f3c4a0801e5ddb9fae4009af637';
84
+ afterEach(function () {
85
+ nock_1.default.cleanAll();
86
+ });
87
+ it('should return all funds in address balance when fundsInAddressBalance equals totalBalance', async function () {
88
+ // Real response from testnet: all 2 SUI held in address balance, not in coin objects
89
+ (0, nock_1.default)(nodeUrl)
90
+ .post('/')
91
+ .reply(200, {
92
+ jsonrpc: '2.0',
93
+ id: 1,
94
+ result: {
95
+ coinType: '0x2::sui::SUI',
96
+ coinObjectCount: 1,
97
+ totalBalance: '2000000',
98
+ lockedBalance: {},
99
+ fundsInAddressBalance: '2000000',
100
+ },
101
+ });
102
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
103
+ balanceInfo.totalBalance.should.equal('2000000');
104
+ balanceInfo.fundsInAddressBalance.should.equal('2000000');
105
+ balanceInfo.coinObjectBalance.should.equal('0');
106
+ });
107
+ it('should correctly split totalBalance into coinObjectBalance and fundsInAddressBalance', async function () {
108
+ (0, nock_1.default)(nodeUrl)
109
+ .post('/')
110
+ .reply(200, {
111
+ jsonrpc: '2.0',
112
+ id: 1,
113
+ result: {
114
+ coinType: '0x2::sui::SUI',
115
+ coinObjectCount: 2,
116
+ totalBalance: '1900000000',
117
+ lockedBalance: {},
118
+ fundsInAddressBalance: '900000000',
119
+ },
120
+ });
121
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
122
+ balanceInfo.totalBalance.should.equal('1900000000');
123
+ balanceInfo.fundsInAddressBalance.should.equal('900000000');
124
+ balanceInfo.coinObjectBalance.should.equal('1000000000');
125
+ });
126
+ it('should handle legacy response without fundsInAddressBalance (all funds in coin objects)', async function () {
127
+ (0, nock_1.default)(nodeUrl)
128
+ .post('/')
129
+ .reply(200, {
130
+ jsonrpc: '2.0',
131
+ id: 1,
132
+ result: {
133
+ coinType: '0x2::sui::SUI',
134
+ coinObjectCount: 1,
135
+ totalBalance: '1900000000',
136
+ lockedBalance: {},
137
+ },
138
+ });
139
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
140
+ balanceInfo.totalBalance.should.equal('1900000000');
141
+ balanceInfo.fundsInAddressBalance.should.equal('0');
142
+ balanceInfo.coinObjectBalance.should.equal('1900000000');
143
+ });
144
+ it('should return zero balances for an empty account', async function () {
145
+ (0, nock_1.default)(nodeUrl)
146
+ .post('/')
147
+ .reply(200, {
148
+ jsonrpc: '2.0',
149
+ id: 1,
150
+ result: {
151
+ coinType: '0x2::sui::SUI',
152
+ coinObjectCount: 0,
153
+ totalBalance: '0',
154
+ lockedBalance: {},
155
+ fundsInAddressBalance: '0',
156
+ },
157
+ });
158
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner);
159
+ balanceInfo.totalBalance.should.equal('0');
160
+ balanceInfo.fundsInAddressBalance.should.equal('0');
161
+ balanceInfo.coinObjectBalance.should.equal('0');
162
+ });
163
+ it('should query with a custom coin type', async function () {
164
+ const packageId = '0x36dbef866a1d62bf7328989a10fb2f07d769f4ee587c0de4a0a256e57e0a58a8';
165
+ const coinType = `${packageId}::deep::DEEP`;
166
+ (0, nock_1.default)(nodeUrl)
167
+ .post('/', (body) => body.params[1] === coinType)
168
+ .reply(200, {
169
+ jsonrpc: '2.0',
170
+ id: 1,
171
+ result: {
172
+ coinType,
173
+ coinObjectCount: 1,
174
+ totalBalance: '1000',
175
+ lockedBalance: {},
176
+ fundsInAddressBalance: '0',
177
+ },
178
+ });
179
+ const balanceInfo = await utils_1.default.getBalance(nodeUrl, owner, coinType);
180
+ balanceInfo.totalBalance.should.equal('1000');
181
+ balanceInfo.fundsInAddressBalance.should.equal('0');
182
+ balanceInfo.coinObjectBalance.should.equal('1000');
183
+ });
184
+ });
185
+ });
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUN4QyxnREFBd0I7QUFFeEIsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELGtFQUFrRTtZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFD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RTtnQkFDVixPQUFPLEVBQUUsS0FBSztnQkFDZCxFQUFFLEVBQUUsQ0FBQztnQkFDTCxNQUFNLEVBQUU7b0JBQ04sUUFBUTtvQkFDUixlQUFlLEVBQUUsQ0FBQztvQkFDbEIsWUFBWSxFQUFFLE1BQU07b0JBQ3BCLGFBQWEsRUFBRSxFQUFFO29CQUNqQixxQkFBcUIsRUFBRSxHQUFHO2lCQUMzQjthQUNGLENBQUMsQ0FBQztZQUVMLE1BQU0sV0FBVyxHQUFHLE1BQU0sZUFBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxXQUFXLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvc3VpJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcbmltcG9ydCBub2NrIGZyb20gJ25vY2snO1xuXG5kZXNjcmliZSgnU3VpIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSB2YWxpZCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCBhZGRyZXNzIG9mIHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBpbnZhbGlkIGFkZHJlc3NlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlcykge1xuICAgICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKTtcbiAgICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSk7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIFRlc3RpbmcgZm9yIG1pc3NpbmcgcGFyYW0sIHNob3VsZCByZXR1cm4gZmFsc2VcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyh1bmRlZmluZWQpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1ZhbGlkUmF3VHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIGEgdmFsaWQgcmF3IHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRSYXdUcmFuc2FjdGlvbih0ZXN0RGF0YS5UUkFOU0ZFUiksIHRydWUpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2YWxpZGF0ZSBhbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSk7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZFJhd1RyYW5zYWN0aW9uKHRlc3REYXRhLklOVkFMSURfUkFXX1RYKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplSGV4SWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIG5vcm1hbGl6ZSBoZXhJZCB3aXRoIG5vIHByZWZpeCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGhleElkID0gJ2NiYTRhNDhiYjBmOGI1ODZjMTY3ZTVkY2VmYWExYzVlOTZhYjNmMDgnO1xuICAgICAgY29uc3QgZXhwZWN0ZWROb3JtYWxpemVkID0gJzB4Y2JhNGE0OGJiMGY4YjU4NmMxNjdlNWRjZWZhYTFjNWU5NmFiM2YwOCc7XG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMubm9ybWFsaXplSGV4SWQoaGV4SWQpLCBleHBlY3RlZE5vcm1hbGl6ZWQpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBoZXhJZCB3aXRoIHByZWZpeCBhbHJlYWR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgaGV4SWQgPSAnMHhjYmE0YTQ4YmIwZjhiNTg2YzE2N2U1ZGNlZmFhMWM1ZTk2YWIzZjA4JztcbiAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5ub3JtYWxpemVIZXhJZChoZXhJZCksIGhleElkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldEJhbGFuY2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgbm9kZVVybCA9ICdodHRwczovL2Z1bGxub2RlLnRlc3RuZXQuc3VpLmlvJztcbiAgICBjb25zdCBvd25lciA9ICcweGI3ZGI2MjM0YTMzZjFlMzVmNzExNGRhYzY5NTc0YzZiN2IxOTNmM2M0YTA4MDFlNWRkYjlmYWU0MDA5YWY2MzcnO1xuXG4gICAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5vY2suY2xlYW5BbGwoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGFsbCBmdW5kcyBpbiBhZGRyZXNzIGJhbGFuY2Ugd2hlbiBmdW5kc0luQWRkcmVzc0JhbGFuY2UgZXF1YWxzIHRvdGFsQmFsYW5jZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFJlYWwgcmVzcG9uc2UgZnJvbSB0ZXN0bmV0OiBhbGwgMiBTVUkgaGVsZCBpbiBhZGRyZXNzIGJhbGFuY2UsIG5vdCBpbiBjb2luIG9iamVjdHNcbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZTogJzB4Mjo6c3VpOjpTVUknLFxuICAgICAgICAgICAgY29pbk9iamVjdENvdW50OiAxLFxuICAgICAgICAgICAgdG90YWxCYWxhbmNlOiAnMjAwMDAwMCcsXG4gICAgICAgICAgICBsb2NrZWRCYWxhbmNlOiB7fSxcbiAgICAgICAgICAgIGZ1bmRzSW5BZGRyZXNzQmFsYW5jZTogJzIwMDAwMDAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMjAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzcGxpdCB0b3RhbEJhbGFuY2UgaW50byBjb2luT2JqZWN0QmFsYW5jZSBhbmQgZnVuZHNJbkFkZHJlc3NCYWxhbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDIsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnOTAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyKTtcbiAgICAgIGJhbGFuY2VJbmZvLnRvdGFsQmFsYW5jZS5zaG91bGQuZXF1YWwoJzE5MDAwMDAwMDAnKTtcbiAgICAgIGJhbGFuY2VJbmZvLmZ1bmRzSW5BZGRyZXNzQmFsYW5jZS5zaG91bGQuZXF1YWwoJzkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBsZWdhY3kgcmVzcG9uc2Ugd2l0aG91dCBmdW5kc0luQWRkcmVzc0JhbGFuY2UgKGFsbCBmdW5kcyBpbiBjb2luIG9iamVjdHMpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDEsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcxOTAwMDAwMDAwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBiYWxhbmNlSW5mbyA9IGF3YWl0IHV0aWxzLmdldEJhbGFuY2Uobm9kZVVybCwgb3duZXIpO1xuICAgICAgYmFsYW5jZUluZm8udG90YWxCYWxhbmNlLnNob3VsZC5lcXVhbCgnMTkwMDAwMDAwMCcpO1xuICAgICAgYmFsYW5jZUluZm8uZnVuZHNJbkFkZHJlc3NCYWxhbmNlLnNob3VsZC5lcXVhbCgnMCcpO1xuICAgICAgYmFsYW5jZUluZm8uY29pbk9iamVjdEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxOTAwMDAwMDAwJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB6ZXJvIGJhbGFuY2VzIGZvciBhbiBlbXB0eSBhY2NvdW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgbm9jayhub2RlVXJsKVxuICAgICAgICAucG9zdCgnLycpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBqc29ucnBjOiAnMi4wJyxcbiAgICAgICAgICBpZDogMSxcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGNvaW5UeXBlOiAnMHgyOjpzdWk6OlNVSScsXG4gICAgICAgICAgICBjb2luT2JqZWN0Q291bnQ6IDAsXG4gICAgICAgICAgICB0b3RhbEJhbGFuY2U6ICcwJyxcbiAgICAgICAgICAgIGxvY2tlZEJhbGFuY2U6IHt9LFxuICAgICAgICAgICAgZnVuZHNJbkFkZHJlc3NCYWxhbmNlOiAnMCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGJhbGFuY2VJbmZvID0gYXdhaXQgdXRpbHMuZ2V0QmFsYW5jZShub2RlVXJsLCBvd25lcik7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcXVlcnkgd2l0aCBhIGN1c3RvbSBjb2luIHR5cGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYWNrYWdlSWQgPSAnMHgzNmRiZWY4NjZhMWQ2MmJmNzMyODk4OWExMGZiMmYwN2Q3NjlmNGVlNTg3YzBkZTRhMGEyNTZlNTdlMGE1OGE4JztcbiAgICAgIGNvbnN0IGNvaW5UeXBlID0gYCR7cGFja2FnZUlkfTo6ZGVlcDo6REVFUGA7XG5cbiAgICAgIG5vY2sobm9kZVVybClcbiAgICAgICAgLnBvc3QoJy8nLCAoYm9keSkgPT4gYm9keS5wYXJhbXNbMV0gPT09IGNvaW5UeXBlKVxuICAgICAgICAucmVwbHkoMjAwLCB7XG4gICAgICAgICAganNvbnJwYzogJzIuMCcsXG4gICAgICAgICAgaWQ6IDEsXG4gICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICBjb2luVHlwZSxcbiAgICAgICAgICAgIGNvaW5PYmplY3RDb3VudDogMSxcbiAgICAgICAgICAgIHRvdGFsQmFsYW5jZTogJzEwMDAnLFxuICAgICAgICAgICAgbG9ja2VkQmFsYW5jZToge30sXG4gICAgICAgICAgICBmdW5kc0luQWRkcmVzc0JhbGFuY2U6ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgYmFsYW5jZUluZm8gPSBhd2FpdCB1dGlscy5nZXRCYWxhbmNlKG5vZGVVcmwsIG93bmVyLCBjb2luVHlwZSk7XG4gICAgICBiYWxhbmNlSW5mby50b3RhbEJhbGFuY2Uuc2hvdWxkLmVxdWFsKCcxMDAwJyk7XG4gICAgICBiYWxhbmNlSW5mby5mdW5kc0luQWRkcmVzc0JhbGFuY2Uuc2hvdWxkLmVxdWFsKCcwJyk7XG4gICAgICBiYWxhbmNlSW5mby5jb2luT2JqZWN0QmFsYW5jZS5zaG91bGQuZXF1YWwoJzEwMDAnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==