@bitgo-beta/sdk-coin-vet 1.0.1-beta.63 → 1.0.1-beta.631

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 (160) 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 +2 -1
  4. package/dist/src/lib/constants.d.ts +28 -0
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +30 -2
  7. package/dist/src/lib/iface.d.ts +28 -2
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/index.d.ts +21 -0
  11. package/dist/src/lib/index.d.ts.map +1 -1
  12. package/dist/src/lib/index.js +44 -2
  13. package/dist/src/lib/transaction/addressInitializationTransaction.d.ts +31 -0
  14. package/dist/src/lib/transaction/addressInitializationTransaction.d.ts.map +1 -0
  15. package/dist/src/lib/transaction/addressInitializationTransaction.js +170 -0
  16. package/dist/src/lib/transaction/burnNftTransaction.d.ts +29 -0
  17. package/dist/src/lib/transaction/burnNftTransaction.d.ts.map +1 -0
  18. package/dist/src/lib/transaction/burnNftTransaction.js +138 -0
  19. package/dist/src/lib/transaction/claimRewards.d.ts +31 -0
  20. package/dist/src/lib/transaction/claimRewards.d.ts.map +1 -0
  21. package/dist/src/lib/transaction/claimRewards.js +151 -0
  22. package/dist/src/lib/transaction/delegateClauseTransaction.d.ts +27 -0
  23. package/dist/src/lib/transaction/delegateClauseTransaction.d.ts.map +1 -0
  24. package/dist/src/lib/transaction/delegateClauseTransaction.js +158 -0
  25. package/dist/src/lib/transaction/exitDelegation.d.ts +29 -0
  26. package/dist/src/lib/transaction/exitDelegation.d.ts.map +1 -0
  27. package/dist/src/lib/transaction/exitDelegation.js +143 -0
  28. package/dist/src/lib/transaction/flushTokenTransaction.d.ts +20 -0
  29. package/dist/src/lib/transaction/flushTokenTransaction.d.ts.map +1 -0
  30. package/dist/src/lib/transaction/flushTokenTransaction.js +98 -0
  31. package/dist/src/lib/transaction/nftTransaction.d.ts +17 -0
  32. package/dist/src/lib/transaction/nftTransaction.d.ts.map +1 -0
  33. package/dist/src/lib/transaction/nftTransaction.js +108 -0
  34. package/dist/src/lib/transaction/stakeClauseTransaction.d.ts +27 -0
  35. package/dist/src/lib/transaction/stakeClauseTransaction.d.ts.map +1 -0
  36. package/dist/src/lib/transaction/stakeClauseTransaction.js +158 -0
  37. package/dist/src/lib/transaction/stakingTransaction.d.ts +31 -0
  38. package/dist/src/lib/transaction/stakingTransaction.d.ts.map +1 -0
  39. package/dist/src/lib/transaction/stakingTransaction.js +169 -0
  40. package/dist/src/lib/transaction/tokenTransaction.d.ts +14 -0
  41. package/dist/src/lib/transaction/tokenTransaction.d.ts.map +1 -0
  42. package/dist/src/lib/transaction/tokenTransaction.js +95 -0
  43. package/dist/src/lib/transaction/transaction.d.ts +18 -28
  44. package/dist/src/lib/transaction/transaction.d.ts.map +1 -1
  45. package/dist/src/lib/transaction/transaction.js +99 -58
  46. package/dist/src/lib/transaction/validatorRegistrationTransaction.d.ts +32 -0
  47. package/dist/src/lib/transaction/validatorRegistrationTransaction.d.ts.map +1 -0
  48. package/dist/src/lib/transaction/validatorRegistrationTransaction.js +170 -0
  49. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts +78 -0
  50. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  51. package/dist/src/lib/transactionBuilder/addressInitializationBuilder.js +158 -0
  52. package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts +59 -0
  53. package/dist/src/lib/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/transactionBuilder/burnNftBuilder.js +118 -0
  55. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts +59 -0
  56. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/transactionBuilder/claimRewardsBuilder.js +117 -0
  58. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts +72 -0
  59. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/transactionBuilder/delegateTxnBuilder.js +133 -0
  61. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts +59 -0
  62. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
  63. package/dist/src/lib/transactionBuilder/exitDelegationBuilder.js +118 -0
  64. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts +66 -0
  65. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
  66. package/dist/src/lib/transactionBuilder/flushTokenTransactionBuilder.js +129 -0
  67. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts +23 -0
  68. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
  69. package/dist/src/lib/transactionBuilder/nftTransactionBuilder.js +93 -0
  70. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts +73 -0
  71. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.d.ts.map +1 -0
  72. package/dist/src/lib/transactionBuilder/stakeClauseTxnBuilder.js +146 -0
  73. package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts +73 -0
  74. package/dist/src/lib/transactionBuilder/stakingBuilder.d.ts.map +1 -0
  75. package/dist/src/lib/transactionBuilder/stakingBuilder.js +147 -0
  76. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts +21 -0
  77. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
  78. package/dist/src/lib/transactionBuilder/tokenTransactionBuilder.js +70 -0
  79. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts +10 -9
  80. package/dist/src/lib/transactionBuilder/transactionBuilder.d.ts.map +1 -1
  81. package/dist/src/lib/transactionBuilder/transactionBuilder.js +25 -19
  82. package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.d.ts +79 -0
  83. package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.d.ts.map +1 -0
  84. package/dist/src/lib/transactionBuilder/validatorRegistrationBuilder.js +150 -0
  85. package/dist/src/lib/transactionBuilderFactory.d.ts +55 -0
  86. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  87. package/dist/src/lib/transactionBuilderFactory.js +124 -1
  88. package/dist/src/lib/types.d.ts +21 -0
  89. package/dist/src/lib/types.d.ts.map +1 -1
  90. package/dist/src/lib/types.js +1 -1
  91. package/dist/src/lib/utils.d.ts +102 -1
  92. package/dist/src/lib/utils.d.ts.map +1 -1
  93. package/dist/src/lib/utils.js +277 -8
  94. package/dist/src/register.d.ts.map +1 -1
  95. package/dist/src/register.js +5 -1
  96. package/dist/src/vet.d.ts +94 -3
  97. package/dist/src/vet.d.ts.map +1 -1
  98. package/dist/src/vet.js +505 -10
  99. package/dist/src/vetNFTCollection.d.ts +18 -0
  100. package/dist/src/vetNFTCollection.d.ts.map +1 -0
  101. package/dist/src/vetNFTCollection.js +52 -0
  102. package/dist/src/vetToken.d.ts +1 -1
  103. package/dist/src/vetToken.d.ts.map +1 -1
  104. package/dist/src/vetToken.js +2 -2
  105. package/dist/test/resources/vet.d.ts +88 -0
  106. package/dist/test/resources/vet.d.ts.map +1 -0
  107. package/dist/test/resources/vet.js +143 -0
  108. package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
  109. package/dist/test/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
  110. package/dist/test/transactionBuilder/addressInitializationBuilder.js +141 -0
  111. package/dist/test/transactionBuilder/burnNftBuilder.d.ts +2 -0
  112. package/dist/test/transactionBuilder/burnNftBuilder.d.ts.map +1 -0
  113. package/dist/test/transactionBuilder/burnNftBuilder.js +150 -0
  114. package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts +2 -0
  115. package/dist/test/transactionBuilder/claimRewardsBuilder.d.ts.map +1 -0
  116. package/dist/test/transactionBuilder/claimRewardsBuilder.js +183 -0
  117. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts +2 -0
  118. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.d.ts.map +1 -0
  119. package/dist/test/transactionBuilder/delegateClauseTxnBuilder.js +209 -0
  120. package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts +2 -0
  121. package/dist/test/transactionBuilder/exitDelegationBuilder.d.ts.map +1 -0
  122. package/dist/test/transactionBuilder/exitDelegationBuilder.js +150 -0
  123. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts +2 -0
  124. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.d.ts.map +1 -0
  125. package/dist/test/transactionBuilder/flushTokenTransactionBuilder.js +132 -0
  126. package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts +2 -0
  127. package/dist/test/transactionBuilder/nftTransactionBuilder.d.ts.map +1 -0
  128. package/dist/test/transactionBuilder/nftTransactionBuilder.js +242 -0
  129. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts +2 -0
  130. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.d.ts.map +1 -0
  131. package/dist/test/transactionBuilder/stakeClauseTransactionBuilder.js +247 -0
  132. package/dist/test/transactionBuilder/stakingTransaction.d.ts +2 -0
  133. package/dist/test/transactionBuilder/stakingTransaction.d.ts.map +1 -0
  134. package/dist/test/transactionBuilder/stakingTransaction.js +250 -0
  135. package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts +2 -0
  136. package/dist/test/transactionBuilder/tokenTransactionBuilder.d.ts.map +1 -0
  137. package/dist/test/transactionBuilder/tokenTransactionBuilder.js +249 -0
  138. package/dist/test/transactionBuilder/transferBuilder.d.ts +2 -0
  139. package/dist/test/transactionBuilder/transferBuilder.d.ts.map +1 -0
  140. package/dist/test/transactionBuilder/transferBuilder.js +244 -0
  141. package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.d.ts +2 -0
  142. package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.d.ts.map +1 -0
  143. package/dist/test/transactionBuilder/validatorRegistrationTxnBuilder.js +231 -0
  144. package/dist/test/unit/keyPair.d.ts +2 -0
  145. package/dist/test/unit/keyPair.d.ts.map +1 -0
  146. package/dist/test/unit/keyPair.js +181 -0
  147. package/dist/test/unit/stakingFlowE2E.d.ts +2 -0
  148. package/dist/test/unit/stakingFlowE2E.d.ts.map +1 -0
  149. package/dist/test/unit/stakingFlowE2E.js +292 -0
  150. package/dist/test/unit/utils.d.ts +2 -0
  151. package/dist/test/unit/utils.d.ts.map +1 -0
  152. package/dist/test/unit/utils.js +106 -0
  153. package/dist/test/unit/vet.d.ts +2 -0
  154. package/dist/test/unit/vet.d.ts.map +1 -0
  155. package/dist/test/unit/vet.js +336 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -0
  157. package/package.json +16 -10
  158. package/.eslintignore +0 -5
  159. package/.mocharc.yml +0 -8
  160. package/CHANGELOG.md +0 -40
@@ -0,0 +1,106 @@
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/vet"));
41
+ const utils_1 = __importDefault(require("../../src/lib/utils"));
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ describe('Vechain util library', function () {
44
+ describe('isValidAddress', function () {
45
+ it('should succeed to validate raw transactoin', 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('isValidBlockId', function () {
62
+ it('should succeed to validate valid block IDs', function () {
63
+ for (const blockId of testData.blockIds.validBlockIds) {
64
+ should_1.default.equal(utils_1.default.isValidBlockId(blockId), true);
65
+ }
66
+ });
67
+ it('should fail to validate invalid block IDs', function () {
68
+ for (const blockId of testData.blockIds.invalidBlockIds) {
69
+ should_1.default.doesNotThrow(() => utils_1.default.isValidBlockId(blockId));
70
+ should_1.default.equal(utils_1.default.isValidBlockId(blockId), false);
71
+ }
72
+ // @ts-expect-error Testing for missing param, should not throw an error
73
+ should_1.default.doesNotThrow(() => utils_1.default.isValidBlockId(undefined));
74
+ // @ts-expect-error Testing for missing param, should return false
75
+ should_1.default.equal(utils_1.default.isValidBlockId(undefined), false);
76
+ });
77
+ });
78
+ describe('isValidDeserialize', function () {
79
+ it('should succeed to correctly deserialize sponsored signed serialized transaction', function () {
80
+ const signedTxn = utils_1.default.deserializeTransaction(testData.SPONSORED_TRANSACTION);
81
+ should_1.default.equal(signedTxn.origin.toString().toLowerCase(), '0x7ca00e3bc8a836026c2917c6c7c6d049e52099dd');
82
+ should_1.default.equal(signedTxn.gasPayer.toString().toLowerCase(), '0xdc9fef0b84a0ccf3f1bd4b84e41743e3e051a083');
83
+ });
84
+ it('should succeed to correctly deserialize unsigned serialized transaction', function () {
85
+ const signedTxn = utils_1.default.deserializeTransaction(testData.UNSIGNED_TRANSACTION);
86
+ should_1.default.equal(signedTxn.isSigned, false);
87
+ should_1.default.equal(signedTxn.body.gas, 21000);
88
+ should_1.default.equal(signedTxn.body.nonce, 400496);
89
+ should_1.default.equal(signedTxn.body.expiration, 64);
90
+ should_1.default.equal(signedTxn.body.blockRef, '0x01536ce9e9fb0638');
91
+ });
92
+ it('should fail to deserialize an invalid serialized transaction', function () {
93
+ should_1.default.throws(() => utils_1.default.deserializeTransaction(testData.INVALID_TRANSACTION));
94
+ });
95
+ });
96
+ it('should get correct transaction type from clause', function () {
97
+ should_1.default.equal(sdk_core_1.TransactionType.Send, utils_1.default.getTransactionTypeFromClause(testData.TRANSFER_CLAUSE));
98
+ });
99
+ it('is valid public key', function () {
100
+ // with 0x prefix
101
+ should_1.default.equal(false, utils_1.default.isValidPublicKey('0x9b4e96086d111500259f9b38680b0509a405c1904da18976455a20c691d3bb07'));
102
+ // without 0x prefix
103
+ should_1.default.equal(true, utils_1.default.isValidPublicKey('029831d82c36a58a69b31177b73d852e260a37769561450dab6ed234d5d965ef0b'));
104
+ });
105
+ });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsMkRBQTZDO0FBQzdDLGdFQUF3QztBQUN4QyxtREFBdUQ7QUFFdkQsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUQsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCx3RUFBd0U7WUFDeEUsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzNELGtFQUFrRTtZQUNsRSxnQkFBTSxDQUFDLEtBQUssQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4RCxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELHdFQUF3RTtZQUN4RSxnQkFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxlQUFLLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDM0Qsa0VBQWtFO1lBQ2xFLGdCQUFNLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtRQUM3QixFQUFFLENBQUMsaUZBQWlGLEVBQUU7WUFDcEYsTUFBTSxTQUFTLEdBQW1CLGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMvRixnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLDRDQUE0QyxDQUFDLENBQUM7WUFDdEcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSw0Q0FBNEMsQ0FBQyxDQUFDO1FBQzFHLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLHlFQUF5RSxFQUFFO1lBQzVFLE1BQU0sU0FBUyxHQUFtQixlQUFLLENBQUMsc0JBQXNCLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDOUYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMzQyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxnQkFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFDLDhEQUE4RCxFQUFFO1lBQ2pFLGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQUssQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsaURBQWlELEVBQUU7UUFDcEQsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBSyxDQUFDLDRCQUE0QixDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1FBQ3hCLGlCQUFpQjtRQUNqQixnQkFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsZUFBSyxDQUFDLGdCQUFnQixDQUFDLG9FQUFvRSxDQUFDLENBQUMsQ0FBQztRQUNsSCxvQkFBb0I7UUFDcEIsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDLENBQUM7SUFDbkgsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIGFzIFZldFRyYW5zYWN0aW9uIH0gZnJvbSAnQHZlY2hhaW4vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL3ZldCc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmRlc2NyaWJlKCdWZWNoYWluIHV0aWwgbGlicmFyeScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ2lzVmFsaWRBZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2YWxpZGF0ZSByYXcgdHJhbnNhY3RvaW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBhZGRyZXNzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGFkZHJlc3Mgb2YgdGVzdERhdGEuYWRkcmVzc2VzLmludmFsaWRBZGRyZXNzZXMpIHtcbiAgICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSk7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgbm90IHRocm93IGFuIGVycm9yXG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IHV0aWxzLmlzVmFsaWRBZGRyZXNzKHVuZGVmaW5lZCkpO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUZXN0aW5nIGZvciBtaXNzaW5nIHBhcmFtLCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEFkZHJlc3ModW5kZWZpbmVkKSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNWYWxpZEJsb2NrSWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIHZhbGlkYXRlIHZhbGlkIGJsb2NrIElEcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAoY29uc3QgYmxvY2tJZCBvZiB0ZXN0RGF0YS5ibG9ja0lkcy52YWxpZEJsb2NrSWRzKSB7XG4gICAgICAgIHNob3VsZC5lcXVhbCh1dGlscy5pc1ZhbGlkQmxvY2tJZChibG9ja0lkKSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gdmFsaWRhdGUgaW52YWxpZCBibG9jayBJRHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IGJsb2NrSWQgb2YgdGVzdERhdGEuYmxvY2tJZHMuaW52YWxpZEJsb2NrSWRzKSB7XG4gICAgICAgIHNob3VsZC5kb2VzTm90VGhyb3coKCkgPT4gdXRpbHMuaXNWYWxpZEJsb2NrSWQoYmxvY2tJZCkpO1xuICAgICAgICBzaG91bGQuZXF1YWwodXRpbHMuaXNWYWxpZEJsb2NrSWQoYmxvY2tJZCksIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB1dGlscy5pc1ZhbGlkQmxvY2tJZCh1bmRlZmluZWQpKTtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVGVzdGluZyBmb3IgbWlzc2luZyBwYXJhbSwgc2hvdWxkIHJldHVybiBmYWxzZVxuICAgICAgc2hvdWxkLmVxdWFsKHV0aWxzLmlzVmFsaWRCbG9ja0lkKHVuZGVmaW5lZCksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzVmFsaWREZXNlcmlhbGl6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gY29ycmVjdGx5IGRlc2VyaWFsaXplIHNwb25zb3JlZCBzaWduZWQgc2VyaWFsaXplZCB0cmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHNpZ25lZFR4bjogVmV0VHJhbnNhY3Rpb24gPSB1dGlscy5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uKHRlc3REYXRhLlNQT05TT1JFRF9UUkFOU0FDVElPTik7XG4gICAgICBzaG91bGQuZXF1YWwoc2lnbmVkVHhuLm9yaWdpbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCksICcweDdjYTAwZTNiYzhhODM2MDI2YzI5MTdjNmM3YzZkMDQ5ZTUyMDk5ZGQnKTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeG4uZ2FzUGF5ZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLCAnMHhkYzlmZWYwYjg0YTBjY2YzZjFiZDRiODRlNDE3NDNlM2UwNTFhMDgzJyk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBzdWNjZWVkIHRvIGNvcnJlY3RseSBkZXNlcmlhbGl6ZSB1bnNpZ25lZCBzZXJpYWxpemVkIHRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgc2lnbmVkVHhuOiBWZXRUcmFuc2FjdGlvbiA9IHV0aWxzLmRlc2VyaWFsaXplVHJhbnNhY3Rpb24odGVzdERhdGEuVU5TSUdORURfVFJBTlNBQ1RJT04pO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5pc1NpZ25lZCwgZmFsc2UpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5LmdhcywgMjEwMDApO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5Lm5vbmNlLCA0MDA0OTYpO1xuICAgICAgc2hvdWxkLmVxdWFsKHNpZ25lZFR4bi5ib2R5LmV4cGlyYXRpb24sIDY0KTtcbiAgICAgIHNob3VsZC5lcXVhbChzaWduZWRUeG4uYm9keS5ibG9ja1JlZiwgJzB4MDE1MzZjZTllOWZiMDYzOCcpO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0byBkZXNlcmlhbGl6ZSBhbiBpbnZhbGlkIHNlcmlhbGl6ZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHV0aWxzLmRlc2VyaWFsaXplVHJhbnNhY3Rpb24odGVzdERhdGEuSU5WQUxJRF9UUkFOU0FDVElPTikpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBjb3JyZWN0IHRyYW5zYWN0aW9uIHR5cGUgZnJvbSBjbGF1c2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2hvdWxkLmVxdWFsKFRyYW5zYWN0aW9uVHlwZS5TZW5kLCB1dGlscy5nZXRUcmFuc2FjdGlvblR5cGVGcm9tQ2xhdXNlKHRlc3REYXRhLlRSQU5TRkVSX0NMQVVTRSkpO1xuICB9KTtcblxuICBpdCgnaXMgdmFsaWQgcHVibGljIGtleScsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aXRoIDB4IHByZWZpeFxuICAgIHNob3VsZC5lcXVhbChmYWxzZSwgdXRpbHMuaXNWYWxpZFB1YmxpY0tleSgnMHg5YjRlOTYwODZkMTExNTAwMjU5ZjliMzg2ODBiMDUwOWE0MDVjMTkwNGRhMTg5NzY0NTVhMjBjNjkxZDNiYjA3JykpO1xuICAgIC8vIHdpdGhvdXQgMHggcHJlZml4XG4gICAgc2hvdWxkLmVxdWFsKHRydWUsIHV0aWxzLmlzVmFsaWRQdWJsaWNLZXkoJzAyOTgzMWQ4MmMzNmE1OGE2OWIzMTE3N2I3M2Q4NTJlMjYwYTM3NzY5NTYxNDUwZGFiNmVkMjM0ZDVkOTY1ZWYwYicpKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=vet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vet.d.ts","sourceRoot":"","sources":["../../../test/unit/vet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,336 @@
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 assert_1 = __importDefault(require("assert"));
41
+ const lodash_1 = __importDefault(require("lodash"));
42
+ const should_1 = __importDefault(require("should"));
43
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
44
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ const src_1 = require("../../src");
47
+ const testData = __importStar(require("../resources/vet"));
48
+ describe('Vechain', function () {
49
+ let bitgo;
50
+ let basecoin;
51
+ let newTxPrebuild;
52
+ let newTxParams;
53
+ const txPreBuild = {
54
+ txHex: testData.SPONSORED_TRANSACTION,
55
+ txInfo: {},
56
+ };
57
+ const txParams = {
58
+ recipients: testData.recipients,
59
+ };
60
+ before(function () {
61
+ bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'mock' });
62
+ bitgo.safeRegister('vet', src_1.Vet.createInstance);
63
+ bitgo.safeRegister('tvet', src_1.Tvet.createInstance);
64
+ bitgo.initializeTestVars();
65
+ basecoin = bitgo.coin('tvet');
66
+ newTxPrebuild = () => {
67
+ return lodash_1.default.cloneDeep(txPreBuild);
68
+ };
69
+ newTxParams = () => {
70
+ return lodash_1.default.cloneDeep(txParams);
71
+ };
72
+ });
73
+ it('should return the right info', function () {
74
+ const vet = bitgo.coin('vet');
75
+ const tvet = bitgo.coin('tvet');
76
+ const vetStatics = statics_1.coins.get('vet');
77
+ const tvetStatics = statics_1.coins.get('tvet');
78
+ vet.getChain().should.equal('vet');
79
+ vet.getFamily().should.equal('vet');
80
+ vet.getFullName().should.equal('VeChain');
81
+ vet.getBaseFactor().should.equal(1e18);
82
+ tvet.getChain().should.equal('tvet');
83
+ tvet.getFamily().should.equal('vet');
84
+ tvet.getFullName().should.equal('Testnet VeChain');
85
+ tvet.getBaseFactor().should.equal(1e18);
86
+ vetStatics.gasTankLowBalanceAlertFactor.should.equal(80);
87
+ tvetStatics.gasTankLowBalanceAlertFactor.should.equal(80);
88
+ vetStatics.gasTankMinBalanceRecommendationFactor.should.equal(200);
89
+ tvetStatics.gasTankMinBalanceRecommendationFactor.should.equal(200);
90
+ });
91
+ it('should validate address', function () {
92
+ const vet = bitgo.coin('vet');
93
+ vet.isValidAddress('wrongaddress').should.false();
94
+ vet.isValidAddress('25bcb8855effa9f12a23c2f7f34f2d92b5841f19').should.false();
95
+ vet.isValidAddress('0x7Ca00e3bC8a836026C2917C6c7c6D049E52099dd').should.true();
96
+ vet.isValidAddress('0x690fFcefa92876C772E85d4B5963807C2152e08d').should.true();
97
+ vet.isValidAddress('0xe59F1cea4e0FEf511e3d0f4EEc44ADf19C4cbeEC').should.true();
98
+ });
99
+ it('is valid pub', function () {
100
+ // with 0x prefix
101
+ basecoin.isValidPub('0x9b4e96086d111500259f9b38680b0509a405c1904da18976455a20c691d3bb07').should.equal(false);
102
+ // without 0x prefix
103
+ basecoin.isValidPub('027c10f30d5c874cee3d193a321c82926d905998cb4852880935da4ee1820bd7d5').should.equal(true);
104
+ });
105
+ describe('Verify transaction: ', () => {
106
+ it('should succeed to verify transaction', async function () {
107
+ const txPrebuild = newTxPrebuild();
108
+ const txParams = newTxParams();
109
+ const verification = {};
110
+ const isTransactionVerified = await basecoin.verifyTransaction({ txParams, txPrebuild, verification });
111
+ isTransactionVerified.should.equal(true);
112
+ });
113
+ it('should succeed to verify transaction when recipients amount are numbers', async function () {
114
+ const txPrebuild = newTxPrebuild();
115
+ const txParamsWithNumberAmounts = newTxParams();
116
+ txParamsWithNumberAmounts.recipients = txParamsWithNumberAmounts.recipients.map(({ address, amount }) => {
117
+ return { address, amount: Number(amount) };
118
+ });
119
+ const verification = {};
120
+ const isTransactionVerified = await basecoin.verifyTransaction({
121
+ txParams: txParamsWithNumberAmounts,
122
+ txPrebuild,
123
+ verification,
124
+ });
125
+ isTransactionVerified.should.equal(true);
126
+ });
127
+ it('should fail to verify transaction with invalid param', async function () {
128
+ const txPrebuild = {};
129
+ const txParams = newTxParams();
130
+ txParams.recipients = undefined;
131
+ await basecoin
132
+ .verifyTransaction({
133
+ txParams,
134
+ txPrebuild,
135
+ })
136
+ .should.rejectedWith('missing required tx prebuild property txHex');
137
+ });
138
+ it('should build correct nft transfer data', function () {
139
+ const data = basecoin.buildNftTransferData({
140
+ fromAddress: testData.addresses.validAddresses[0],
141
+ recipientAddress: testData.addresses.validAddresses[1],
142
+ type: 'ERC721',
143
+ tokenId: '1234',
144
+ tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
145
+ });
146
+ data.should.deepEqual({
147
+ tokenType: 'ERC721',
148
+ tokenQuantity: '1',
149
+ tokenContractAddress: '0x887d9102f0003f1724d8fd5d4fe95a11572fcd77',
150
+ tokenId: '1234',
151
+ });
152
+ });
153
+ it('should build throw invalid address error', function () {
154
+ (0, should_1.default)(() => basecoin.buildNftTransferData({
155
+ fromAddress: testData.addresses.validAddresses[0],
156
+ recipientAddress: testData.addresses.invalidAddresses[0],
157
+ type: 'ERC721',
158
+ tokenId: '1234',
159
+ tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
160
+ })).throwError('Invalid recipient address');
161
+ (0, should_1.default)(() => basecoin.buildNftTransferData({
162
+ fromAddress: testData.addresses.invalidAddresses[0],
163
+ recipientAddress: testData.addresses.validAddresses[0],
164
+ type: 'ERC721',
165
+ tokenId: '1234',
166
+ tokenContractAddress: testData.NFT_CONTRACT_ADDRESS,
167
+ })).throwError('Invalid from address');
168
+ });
169
+ });
170
+ describe('Parse and Explain Transactions: ', () => {
171
+ const transferInputsResponse = [
172
+ {
173
+ address: testData.addresses.validAddresses[0],
174
+ amount: testData.AMOUNT.toString(),
175
+ },
176
+ ];
177
+ const transferOutputsResponse = [
178
+ {
179
+ address: testData.recipients[0].address,
180
+ amount: testData.recipients[0].amount,
181
+ },
182
+ ];
183
+ it('should parse a transfer transaction', async function () {
184
+ const parsedTransaction = await basecoin.parseTransaction({
185
+ txHex: testData.SPONSORED_TRANSACTION,
186
+ });
187
+ parsedTransaction.should.deepEqual({
188
+ inputs: transferInputsResponse,
189
+ outputs: transferOutputsResponse,
190
+ });
191
+ });
192
+ it('should explain a transfer transaction', async function () {
193
+ const rawTx = newTxPrebuild().txHex;
194
+ const transaction = new src_1.Transaction(statics_1.coins.get('tvet'));
195
+ transaction.fromRawTransaction(rawTx);
196
+ const explainedTx = transaction.explainTransaction();
197
+ explainedTx.should.deepEqual({
198
+ displayOrder: [
199
+ 'id',
200
+ 'outputs',
201
+ 'outputAmount',
202
+ 'changeOutputs',
203
+ 'changeAmount',
204
+ 'fee',
205
+ 'withdrawAmount',
206
+ 'sender',
207
+ 'type',
208
+ ],
209
+ id: '0x6d842d5dc5d59d4e8f0a8ec2757b430d1f19c06766fbc5b3db5ebac8a067a439',
210
+ outputs: [
211
+ {
212
+ address: '0xe59f1cea4e0fef511e3d0f4eec44adf19c4cbeec',
213
+ amount: '100000000000000000',
214
+ },
215
+ ],
216
+ outputAmount: '100000000000000000',
217
+ changeOutputs: [],
218
+ changeAmount: '0',
219
+ fee: { fee: '315411764705882352' },
220
+ sender: '0x7ca00e3bc8a836026c2917c6c7c6d049e52099dd',
221
+ type: 0,
222
+ });
223
+ });
224
+ it('should fail to explain a invalid raw transaction', async function () {
225
+ const rawTx = 'invalidRawTransaction';
226
+ const transaction = new src_1.Transaction(statics_1.coins.get('tvet'));
227
+ await assert_1.default.rejects(async () => transaction.fromRawTransaction(rawTx), {
228
+ message: 'invalid raw transaction',
229
+ });
230
+ });
231
+ it('should fail to parse a transfer transaction when explainTransaction response is undefined', async function () {
232
+ const stub = sinon_1.default.stub(src_1.Vet.prototype, 'explainTransaction');
233
+ stub.resolves(undefined);
234
+ await basecoin
235
+ .parseTransaction({ txHex: testData.INVALID_TRANSACTION })
236
+ .should.be.rejectedWith('Invalid transaction');
237
+ stub.restore();
238
+ });
239
+ });
240
+ describe('address validation', () => {
241
+ it('should return true when validating a well formatted address prefixed with 0x', async function () {
242
+ const address = testData.addresses.validAddresses[0];
243
+ basecoin.isValidAddress(address).should.equal(true);
244
+ });
245
+ it('should return false when validating an incorrectly formatted', async function () {
246
+ const address = 'wrongaddress';
247
+ basecoin.isValidAddress(address).should.equal(false);
248
+ });
249
+ });
250
+ describe('address verification', () => {
251
+ const testData = {
252
+ walletVersion: 6,
253
+ commonKeychain: '02fad451e7d1a536897ded5f803a73cc7309a403cf43bb25bda494b9800efe32999b6b71b6159eccf1244492556b733f68733a23c184bf40bc37c52da5ad29e575',
254
+ baseAddress: '0x8420429aa50b7f6ab196c4ce0dcf629fdbb821a1',
255
+ feeAddress: '0x33f9d3172de8a88e47b399562e51fa9cde0f2511',
256
+ depositAddress: '0x26b88c0a103d185792a9597580c2c5170d93f410',
257
+ depositIndex: 3,
258
+ forwarderVersion: 5,
259
+ };
260
+ it('should verify a valid TSS base address (wallet version 6)', async function () {
261
+ const params = {
262
+ address: testData.baseAddress,
263
+ baseAddress: testData.baseAddress,
264
+ keychains: [
265
+ { commonKeychain: testData.commonKeychain },
266
+ { commonKeychain: testData.commonKeychain },
267
+ { commonKeychain: testData.commonKeychain },
268
+ ],
269
+ index: 0,
270
+ walletVersion: testData.walletVersion,
271
+ coinSpecific: {
272
+ feeAddress: testData.feeAddress,
273
+ forwarderVersion: testData.forwarderVersion,
274
+ },
275
+ };
276
+ const result = await basecoin.isWalletAddress(params);
277
+ result.should.equal(true);
278
+ });
279
+ it('should fail to verify a invalid TSS base address (wallet version 6)', async function () {
280
+ const params = {
281
+ address: '0x8420429aa50b7f6ab196c4ce0dcf629fdbb821a0',
282
+ baseAddress: testData.baseAddress,
283
+ keychains: [
284
+ { commonKeychain: testData.commonKeychain },
285
+ { commonKeychain: testData.commonKeychain },
286
+ { commonKeychain: testData.commonKeychain },
287
+ ],
288
+ index: 0,
289
+ walletVersion: testData.walletVersion,
290
+ coinSpecific: {
291
+ feeAddress: testData.feeAddress,
292
+ forwarderVersion: testData.forwarderVersion,
293
+ },
294
+ };
295
+ await basecoin.isWalletAddress(params).should.be.rejected();
296
+ });
297
+ it('should verify a valid TSS deposit address (wallet version 6)', async function () {
298
+ const params = {
299
+ address: testData.depositAddress,
300
+ baseAddress: testData.baseAddress,
301
+ keychains: [
302
+ { commonKeychain: testData.commonKeychain },
303
+ { commonKeychain: testData.commonKeychain },
304
+ { commonKeychain: testData.commonKeychain },
305
+ ],
306
+ index: testData.depositIndex,
307
+ walletVersion: testData.walletVersion,
308
+ coinSpecific: {
309
+ feeAddress: testData.feeAddress,
310
+ forwarderVersion: testData.forwarderVersion,
311
+ },
312
+ };
313
+ const result = await basecoin.isWalletAddress(params);
314
+ result.should.equal(true);
315
+ });
316
+ it('should fail to verify a invalid TSS deposit address (wallet version 6)', async function () {
317
+ const params = {
318
+ address: '0x26b88c0a103d185792a9597580c2c5170d93f411',
319
+ baseAddress: testData.baseAddress,
320
+ keychains: [
321
+ { commonKeychain: testData.commonKeychain },
322
+ { commonKeychain: testData.commonKeychain },
323
+ { commonKeychain: testData.commonKeychain },
324
+ ],
325
+ index: testData.depositIndex,
326
+ walletVersion: testData.walletVersion,
327
+ coinSpecific: {
328
+ feeAddress: testData.feeAddress,
329
+ forwarderVersion: testData.forwarderVersion,
330
+ },
331
+ };
332
+ await basecoin.isWalletAddress(params).should.be.rejected();
333
+ });
334
+ });
335
+ });
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC91bml0L3ZldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtEQUEwQjtBQUMxQixvREFBNEI7QUFDNUIsb0RBQXVCO0FBQ3ZCLG9EQUE0QjtBQUM1QixpREFBK0M7QUFDL0MsbURBQStEO0FBQy9ELGlEQUFnRTtBQUNoRSxtQ0FBbUQ7QUFDbkQsMkRBQTZDO0FBRTdDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7SUFDbEIsSUFBSSxLQUFtQixDQUFDO0lBQ3hCLElBQUksUUFBUSxDQUFDO0lBQ2IsSUFBSSxhQUFhLENBQUM7SUFDbEIsSUFBSSxXQUFXLENBQUM7SUFFaEIsTUFBTSxVQUFVLEdBQUc7UUFDakIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxxQkFBcUI7UUFDckMsTUFBTSxFQUFFLEVBQUU7S0FDWCxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUc7UUFDZixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7S0FDaEMsQ0FBQztJQUVGLE1BQU0sQ0FBQztRQUNMLEtBQUssR0FBRyxvQkFBUyxDQUFDLFFBQVEsQ0FBQyxrQkFBUSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsU0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzlDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNoRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQixRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE9BQU8sZ0JBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMs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L0IsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtpQkFDNUM7YUFDRixDQUFDO1lBRUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdFQUF3RSxFQUFFLEtBQUs7WUFDaEYsTUFBTSxNQUFNLEdBQUc7Z0JBQ2IsT0FBTyxFQUFFLDRDQUE0QztnQkFDckQsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2dCQUNqQyxTQUFTLEVBQUU7b0JBQ1QsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtvQkFDM0MsRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsRUFBRTtpQkFDNUM7Z0JBQ0QsS0FBSyxFQUFFLFFBQVEsQ0FBQyxZQUFZO2dCQUM1QixhQUFhLEVBQUUsUUFBUSxDQUFDLGFBQWE7Z0JBQ3JDLFlBQVksRUFBRTtvQkFDWixVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7b0JBQy9CLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxnQkFBZ0I7aUJBQzVDO2FBQ0YsQ0FBQztZQUVGLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHbywgVGVzdEJpdEdvQVBJIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgY29pbnMsIEdhc1RhbmtBY2NvdW50Q29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVmV0LCBUdmV0LCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi9yZXNvdXJjZXMvdmV0JztcblxuZGVzY3JpYmUoJ1ZlY2hhaW4nLCBmdW5jdGlvbiAoKSB7XG4gIGxldCBiaXRnbzogVGVzdEJpdEdvQVBJO1xuICBsZXQgYmFzZWNvaW47XG4gIGxldCBuZXdUeFByZWJ1aWxkO1xuICBsZXQgbmV3VHhQYXJhbXM7XG5cbiAgY29uc3QgdHhQcmVCdWlsZCA9IHtcbiAgICB0eEhleDogdGVzdERhdGEuU1BPTlNPUkVEX1RSQU5TQUNUSU9OLFxuICAgIHR4SW5mbzoge30sXG4gIH07XG5cbiAgY29uc3QgdHhQYXJhbXMgPSB7XG4gICAgcmVjaXBpZW50czogdGVzdERhdGEucmVjaXBpZW50cyxcbiAgfTtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGJpdGdvID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ21vY2snIH0pO1xuICAgIGJpdGdvLnNhZmVSZWdpc3RlcigndmV0JywgVmV0LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R2ZXQnLCBUdmV0LmNyZWF0ZUluc3RhbmNlKTtcbiAgICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgICBiYXNlY29pbiA9IGJpdGdvLmNvaW4oJ3R2ZXQnKTtcbiAgICBuZXdUeFByZWJ1aWxkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIF8uY2xvbmVEZWVwKHR4UHJlQnVpbGQpO1xuICAgIH07XG4gICAgbmV3VHhQYXJhbXMgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gXy5jbG9uZURlZXAodHhQYXJhbXMpO1xuICAgIH07XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRoZSByaWdodCBpbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHZldCA9IGJpdGdvLmNvaW4oJ3ZldCcpO1xuICAgIGNvbnN0IHR2ZXQgPSBiaXRnby5jb2luKCd0dmV0Jyk7XG4gICAgY29uc3QgdmV0U3RhdGljcyA9IGNvaW5zLmdldCgndmV0JykgYXMgR2FzVGFua0FjY291bnRDb2luO1xuICAgIGNvbnN0IHR2ZXRTdGF0aWNzID0gY29pbnMuZ2V0KCd0dmV0JykgYXMgR2FzVGFua0FjY291bnRDb2luO1xuXG4gICAgdmV0LmdldENoYWluKCkuc2hvdWxkLmVxdWFsKCd2ZXQnKTtcbiAgICB2ZXQuZ2V0RmFtaWx5KCkuc2hvdWxkLmVxdWFsKCd2ZXQnKTtcbiAgICB2ZXQuZ2V0RnVsbE5hbWUoKS5zaG91bGQuZXF1YWwoJ1ZlQ2hhaW4nKTtcbiAgICB2ZXQuZ2V0QmFzZUZhY3RvcigpLnNob3VsZC5lcXVhbCgxZTE4KTtcblxuICAgIHR2ZXQuZ2V0Q2hhaW4oKS5zaG91bGQuZXF1YWwoJ3R2ZXQnKTtcbiAgICB0dmV0LmdldEZhbWlseSgpLnNob3VsZC5lcXVhbCgndmV0Jyk7XG4gICAgdHZldC5nZXRGdWxsTmFtZSgpLnNob3VsZC5lcXVhbCgnVGVzdG5ldCBWZUNoYWluJyk7XG4gICAgdHZldC5nZXRCYXNlRmFjdG9yKCkuc2hvdWxkLmVxdWFsKDFlMTgpO1xuXG4gICAgdmV0U3RhdGljcy5nYXNUYW5rTG93QmFsYW5jZUFsZXJ0RmFjdG9yLnNob3VsZC5lcXVhbCg4MCk7XG4gICAgdHZldFN0YXRpY3MuZ2FzVGFua0xvd0JhbGFuY2VBbGVydEZhY3Rvci5zaG91bGQuZXF1YWwoODApO1xuICAgIHZldFN0YXRpY3MuZ2FzVGFua01pbkJhbGFuY2VSZWNvbW1lbmRhdGlvbkZhY3Rvci5zaG91bGQuZXF1YWwoMjAwKTtcbiAgICB0dmV0U3RhdGljcy5nYXNUYW5rTWluQmFsYW5jZVJlY29tbWVuZGF0aW9uRmFjdG9yLnNob3VsZC5lcXVhbCgyMDApO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIGFkZHJlc3MnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdmV0ID0gYml0Z28uY29pbigndmV0Jyk7XG4gICAgdmV0LmlzVmFsaWRBZGRyZXNzKCd3cm9uZ2FkZHJlc3MnKS5zaG91bGQuZmFsc2UoKTtcbiAgICB2ZXQuaXNWYWxpZEFkZHJlc3MoJzI1YmNiODg1NWVmZmE5ZjEyYTIzYzJmN2YzNGYyZDkyYjU4NDFmMTknKS5zaG91bGQuZmFsc2UoKTtcbiAgICB2ZXQuaXNWYWxpZEFkZHJlc3MoJzB4N0NhMDBlM2JDOGE4MzYwMjZDMjkxN0M2YzdjNkQwNDlFNTIwOTlkZCcpLnNob3VsZC50cnVlKCk7XG4gICAgdmV0LmlzVmFsaWRBZGRyZXNzKCcweDY5MGZGY2VmYTkyODc2Qzc3MkU4NWQ0QjU5NjM4MDdDMjE1MmUwOGQnKS5zaG91bGQudHJ1ZSgpO1xuICAgIHZldC5pc1ZhbGlkQWRkcmVzcygnMHhlNTlGMWNlYTRlMEZFZjUxMWUzZDBmNEVFYzQ0QURmMTlDNGNiZUVDJykuc2hvdWxkLnRydWUoKTtcbiAgfSk7XG5cbiAgaXQoJ2lzIHZhbGlkIHB1YicsIGZ1bmN0aW9uICgpIHtcbiAgICAvLyB3aXRoIDB4IHByZWZpeFxuICAgIGJhc2Vjb2luLmlzVmFsaWRQdWIoJzB4OWI0ZTk2MDg2ZDExMTUwMDI1OWY5YjM4NjgwYjA1MDlhNDA1YzE5MDRkYTE4OTc2NDU1YTIwYzY5MWQzYmIwNycpLnNob3VsZC5lcXVhbChmYWxzZSk7XG4gICAgLy8gd2l0aG91dCAweCBwcmVmaXhcbiAgICBiYXNlY29pbi5pc1ZhbGlkUHViKCcwMjdjMTBmMzBkNWM4NzRjZWUzZDE5M2EzMjFjODI5MjZkOTA1OTk4Y2I0ODUyODgwOTM1ZGE0ZWUxODIwYmQ3ZDUnKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdWZXJpZnkgdHJhbnNhY3Rpb246ICcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHN1Y2NlZWQgdG8gdmVyaWZ5IHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IG5ld1R4UHJlYnVpbGQoKTtcbiAgICAgIGNvbnN0IHR4UGFyYW1zID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIGNvbnN0IHZlcmlmaWNhdGlvbiA9IHt9O1xuICAgICAgY29uc3QgaXNUcmFuc2FjdGlvblZlcmlmaWVkID0gYXdhaXQgYmFzZWNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgdmVyaWZpY2F0aW9uIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3VjY2VlZCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2hlbiByZWNpcGllbnRzIGFtb3VudCBhcmUgbnVtYmVycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHR4UHJlYnVpbGQgPSBuZXdUeFByZWJ1aWxkKCk7XG4gICAgICBjb25zdCB0eFBhcmFtc1dpdGhOdW1iZXJBbW91bnRzID0gbmV3VHhQYXJhbXMoKTtcbiAgICAgIHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50cyA9IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMucmVjaXBpZW50cy5tYXAoKHsgYWRkcmVzcywgYW1vdW50IH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHsgYWRkcmVzcywgYW1vdW50OiBOdW1iZXIoYW1vdW50KSB9O1xuICAgICAgfSk7XG4gICAgICBjb25zdCB2ZXJpZmljYXRpb24gPSB7fTtcbiAgICAgIGNvbnN0IGlzVHJhbnNhY3Rpb25WZXJpZmllZCA9IGF3YWl0IGJhc2Vjb2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQYXJhbXM6IHR4UGFyYW1zV2l0aE51bWJlckFtb3VudHMsXG4gICAgICAgIHR4UHJlYnVpbGQsXG4gICAgICAgIHZlcmlmaWNhdGlvbixcbiAgICAgIH0pO1xuICAgICAgaXNUcmFuc2FjdGlvblZlcmlmaWVkLnNob3VsZC5lcXVhbCh0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgdHJhbnNhY3Rpb24gd2l0aCBpbnZhbGlkIHBhcmFtJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdHhQcmVidWlsZCA9IHt9O1xuICAgICAgY29uc3QgdHhQYXJhbXMgPSBuZXdUeFBhcmFtcygpO1xuICAgICAgdHhQYXJhbXMucmVjaXBpZW50cyA9IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IGJhc2Vjb2luXG4gICAgICAgIC52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQYXJhbXMsXG4gICAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgfSlcbiAgICAgICAgLnNob3VsZC5yZWplY3RlZFdpdGgoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgY29ycmVjdCBuZnQgdHJhbnNmZXIgZGF0YScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgIGZyb21BZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF0sXG4gICAgICAgIHJlY2lwaWVudEFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1sxXSxcbiAgICAgICAgdHlwZTogJ0VSQzcyMScsXG4gICAgICAgIHRva2VuSWQ6ICcxMjM0JyxcbiAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgfSk7XG4gICAgICBkYXRhLnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICB0b2tlblR5cGU6ICdFUkM3MjEnLFxuICAgICAgICB0b2tlblF1YW50aXR5OiAnMScsXG4gICAgICAgIHRva2VuQ29udHJhY3RBZGRyZXNzOiAnMHg4ODdkOTEwMmYwMDAzZjE3MjRkOGZkNWQ0ZmU5NWExMTU3MmZjZDc3JyxcbiAgICAgICAgdG9rZW5JZDogJzEyMzQnLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHRocm93IGludmFsaWQgYWRkcmVzcyBlcnJvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICByZWNpcGllbnRBZGRyZXNzOiB0ZXN0RGF0YS5hZGRyZXNzZXMuaW52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICB0eXBlOiAnRVJDNzIxJyxcbiAgICAgICAgICB0b2tlbklkOiAnMTIzNCcsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIHJlY2lwaWVudCBhZGRyZXNzJyk7XG5cbiAgICAgIHNob3VsZCgoKSA9PlxuICAgICAgICBiYXNlY29pbi5idWlsZE5mdFRyYW5zZmVyRGF0YSh7XG4gICAgICAgICAgZnJvbUFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy5pbnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICAgIHJlY2lwaWVudEFkZHJlc3M6IHRlc3REYXRhLmFkZHJlc3Nlcy52YWxpZEFkZHJlc3Nlc1swXSxcbiAgICAgICAgICB0eXBlOiAnRVJDNzIxJyxcbiAgICAgICAgICB0b2tlbklkOiAnMTIzNCcsXG4gICAgICAgICAgdG9rZW5Db250cmFjdEFkZHJlc3M6IHRlc3REYXRhLk5GVF9DT05UUkFDVF9BRERSRVNTLFxuICAgICAgICB9KVxuICAgICAgKS50aHJvd0Vycm9yKCdJbnZhbGlkIGZyb20gYWRkcmVzcycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGFyc2UgYW5kIEV4cGxhaW4gVHJhbnNhY3Rpb25zOiAnLCAoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmZXJJbnB1dHNSZXNwb25zZSA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGVzdERhdGEuYWRkcmVzc2VzLnZhbGlkQWRkcmVzc2VzWzBdLFxuICAgICAgICBhbW91bnQ6IHRlc3REYXRhLkFNT1VOVC50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3QgdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UgPSBbXG4gICAgICB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLnJlY2lwaWVudHNbMF0uYWRkcmVzcyxcbiAgICAgICAgYW1vdW50OiB0ZXN0RGF0YS5yZWNpcGllbnRzWzBdLmFtb3VudCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGl0KCdzaG91bGQgcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBhcnNlZFRyYW5zYWN0aW9uID0gYXdhaXQgYmFzZWNvaW4ucGFyc2VUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4OiB0ZXN0RGF0YS5TUE9OU09SRURfVFJBTlNBQ1RJT04sXG4gICAgICB9KTtcblxuICAgICAgcGFyc2VkVHJhbnNhY3Rpb24uc2hvdWxkLmRlZXBFcXVhbCh7XG4gICAgICAgIGlucHV0czogdHJhbnNmZXJJbnB1dHNSZXNwb25zZSxcbiAgICAgICAgb3V0cHV0czogdHJhbnNmZXJPdXRwdXRzUmVzcG9uc2UsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmF3VHggPSBuZXdUeFByZWJ1aWxkKCkudHhIZXg7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3R2ZXQnKSk7XG4gICAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24ocmF3VHgpO1xuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSB0cmFuc2FjdGlvbi5leHBsYWluVHJhbnNhY3Rpb24oKTtcbiAgICAgIGV4cGxhaW5lZFR4LnNob3VsZC5kZWVwRXF1YWwoe1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ3dpdGhkcmF3QW1vdW50JyxcbiAgICAgICAgICAnc2VuZGVyJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiAnMHg2ZDg0MmQ1ZGM1ZDU5ZDRlOGYwYThlYzI3NTdiNDMwZDFmMTljMDY3NjZmYmM1YjNkYjVlYmFjOGEwNjdhNDM5JyxcbiAgICAgICAgb3V0cHV0czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6ICcweGU1OWYxY2VhNGUwZmVmNTExZTNkMGY0ZWVjNDRhZGYxOWM0Y2JlZWMnLFxuICAgICAgICAgICAgYW1vdW50OiAnMTAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6ICcxMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAnMCcsXG4gICAgICAgIGZlZTogeyBmZWU6ICczMTU0MTE3NjQ3MDU4ODIzNTInIH0sXG4gICAgICAgIHNlbmRlcjogJzB4N2NhMDBlM2JjOGE4MzYwMjZjMjkxN2M2YzdjNmQwNDllNTIwOTlkZCcsXG4gICAgICAgIHR5cGU6IDAsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0byBleHBsYWluIGEgaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByYXdUeCA9ICdpbnZhbGlkUmF3VHJhbnNhY3Rpb24nO1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0dmV0JykpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4gdHJhbnNhY3Rpb24uZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1R4KSwge1xuICAgICAgICBtZXNzYWdlOiAnaW52YWxpZCByYXcgdHJhbnNhY3Rpb24nLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdG8gcGFyc2UgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiB3aGVuIGV4cGxhaW5UcmFuc2FjdGlvbiByZXNwb25zZSBpcyB1bmRlZmluZWQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YihWZXQucHJvdG90eXBlLCAnZXhwbGFpblRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc29sdmVzKHVuZGVmaW5lZCk7XG4gICAgICBhd2FpdCBiYXNlY29pblxuICAgICAgICAucGFyc2VUcmFuc2FjdGlvbih7IHR4SGV4OiB0ZXN0RGF0YS5JTlZBTElEX1RSQU5TQUNUSU9OIH0pXG4gICAgICAgIC5zaG91bGQuYmUucmVqZWN0ZWRXaXRoKCdJbnZhbGlkIHRyYW5zYWN0aW9uJyk7XG4gICAgICBzdHViLnJlc3RvcmUoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZHJlc3MgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdmFsaWRhdGluZyBhIHdlbGwgZm9ybWF0dGVkIGFkZHJlc3MgcHJlZml4ZWQgd2l0aCAweCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSB0ZXN0RGF0YS5hZGRyZXNzZXMudmFsaWRBZGRyZXNzZXNbMF07XG4gICAgICBiYXNlY29pbi5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKS5zaG91bGQuZXF1YWwodHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIHZhbGlkYXRpbmcgYW4gaW5jb3JyZWN0bHkgZm9ybWF0dGVkJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICd3cm9uZ2FkZHJlc3MnO1xuICAgICAgYmFzZWNvaW4uaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxdWFsKGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FkZHJlc3MgdmVyaWZpY2F0aW9uJywgKCkgPT4ge1xuICAgIGNvbnN0IHRlc3REYXRhID0ge1xuICAgICAgd2FsbGV0VmVyc2lvbjogNixcbiAgICAgIGNvbW1vbktleWNoYWluOlxuICAgICAgICAnMDJmYWQ0NTFlN2QxYTUzNjg5N2RlZDVmODAzYTczY2M3MzA5YTQwM2NmNDNiYjI1YmRhNDk0Yjk4MDBlZmUzMjk5OWI2YjcxYjYxNTllY2NmMTI0NDQ5MjU1NmI3MzNmNjg3MzNhMjNjMTg0YmY0MGJjMzdjNTJkYTVhZDI5ZTU3NScsXG4gICAgICBiYXNlQWRkcmVzczogJzB4ODQyMDQyOWFhNTBiN2Y2YWIxOTZjNGNlMGRjZjYyOWZkYmI4MjFhMScsXG4gICAgICBmZWVBZGRyZXNzOiAnMHgzM2Y5ZDMxNzJkZThhODhlNDdiMzk5NTYyZTUxZmE5Y2RlMGYyNTExJyxcbiAgICAgIGRlcG9zaXRBZGRyZXNzOiAnMHgyNmI4OGMwYTEwM2QxODU3OTJhOTU5NzU4MGMyYzUxNzBkOTNmNDEwJyxcbiAgICAgIGRlcG9zaXRJbmRleDogMyxcbiAgICAgIGZvcndhcmRlclZlcnNpb246IDUsXG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgdmVyaWZ5IGEgdmFsaWQgVFNTIGJhc2UgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6IHRlc3REYXRhLmJhc2VBZGRyZXNzLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIGludmFsaWQgVFNTIGJhc2UgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6ICcweDg0MjA0MjlhYTUwYjdmNmFiMTk2YzRjZTBkY2Y2MjlmZGJiODIxYTAnLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogMCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcykuc2hvdWxkLmJlLnJlamVjdGVkKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZlcmlmeSBhIHZhbGlkIFRTUyBkZXBvc2l0IGFkZHJlc3MgKHdhbGxldCB2ZXJzaW9uIDYpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBhZGRyZXNzOiB0ZXN0RGF0YS5kZXBvc2l0QWRkcmVzcyxcbiAgICAgICAgYmFzZUFkZHJlc3M6IHRlc3REYXRhLmJhc2VBZGRyZXNzLFxuICAgICAgICBrZXljaGFpbnM6IFtcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgXSxcbiAgICAgICAgaW5kZXg6IHRlc3REYXRhLmRlcG9zaXRJbmRleCxcbiAgICAgICAgd2FsbGV0VmVyc2lvbjogdGVzdERhdGEud2FsbGV0VmVyc2lvbixcbiAgICAgICAgY29pblNwZWNpZmljOiB7XG4gICAgICAgICAgZmVlQWRkcmVzczogdGVzdERhdGEuZmVlQWRkcmVzcyxcbiAgICAgICAgICBmb3J3YXJkZXJWZXJzaW9uOiB0ZXN0RGF0YS5mb3J3YXJkZXJWZXJzaW9uLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYmFzZWNvaW4uaXNXYWxsZXRBZGRyZXNzKHBhcmFtcyk7XG4gICAgICByZXN1bHQuc2hvdWxkLmVxdWFsKHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIGludmFsaWQgVFNTIGRlcG9zaXQgYWRkcmVzcyAod2FsbGV0IHZlcnNpb24gNiknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICAgIGFkZHJlc3M6ICcweDI2Yjg4YzBhMTAzZDE4NTc5MmE5NTk3NTgwYzJjNTE3MGQ5M2Y0MTEnLFxuICAgICAgICBiYXNlQWRkcmVzczogdGVzdERhdGEuYmFzZUFkZHJlc3MsXG4gICAgICAgIGtleWNoYWluczogW1xuICAgICAgICAgIHsgY29tbW9uS2V5Y2hhaW46IHRlc3REYXRhLmNvbW1vbktleWNoYWluIH0sXG4gICAgICAgICAgeyBjb21tb25LZXljaGFpbjogdGVzdERhdGEuY29tbW9uS2V5Y2hhaW4gfSxcbiAgICAgICAgICB7IGNvbW1vbktleWNoYWluOiB0ZXN0RGF0YS5jb21tb25LZXljaGFpbiB9LFxuICAgICAgICBdLFxuICAgICAgICBpbmRleDogdGVzdERhdGEuZGVwb3NpdEluZGV4LFxuICAgICAgICB3YWxsZXRWZXJzaW9uOiB0ZXN0RGF0YS53YWxsZXRWZXJzaW9uLFxuICAgICAgICBjb2luU3BlY2lmaWM6IHtcbiAgICAgICAgICBmZWVBZGRyZXNzOiB0ZXN0RGF0YS5mZWVBZGRyZXNzLFxuICAgICAgICAgIGZvcndhcmRlclZlcnNpb246IHRlc3REYXRhLmZvcndhcmRlclZlcnNpb24sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCBiYXNlY29pbi5pc1dhbGxldEFkZHJlc3MocGFyYW1zKS5zaG91bGQuYmUucmVqZWN0ZWQoKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==