@bitgo-beta/sdk-coin-trx 1.0.2-beta.232 → 1.0.2-beta.2321

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 (143) hide show
  1. package/dist/resources/protobuf/Contract.proto +32 -0
  2. package/dist/resources/protobuf/tron.d.ts +1478 -214
  3. package/dist/resources/protobuf/tron.js +6312 -2600
  4. package/dist/resources/protobuf/tron.proto +6 -0
  5. package/dist/src/index.js +6 -2
  6. package/dist/src/lib/accountCreateTxBuilder.d.ts +60 -0
  7. package/dist/src/lib/accountCreateTxBuilder.d.ts.map +1 -0
  8. package/dist/src/lib/accountCreateTxBuilder.js +191 -0
  9. package/dist/src/lib/constants.d.ts +4 -0
  10. package/dist/src/lib/constants.d.ts.map +1 -0
  11. package/dist/src/lib/constants.js +7 -0
  12. package/dist/src/lib/contractCallBuilder.d.ts +1 -35
  13. package/dist/src/lib/contractCallBuilder.d.ts.map +1 -1
  14. package/dist/src/lib/contractCallBuilder.js +13 -76
  15. package/dist/src/lib/delegateResourceTxBuilder.d.ts +27 -0
  16. package/dist/src/lib/delegateResourceTxBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/delegateResourceTxBuilder.js +104 -0
  18. package/dist/src/lib/enum.d.ts +40 -1
  19. package/dist/src/lib/enum.d.ts.map +1 -1
  20. package/dist/src/lib/enum.js +44 -4
  21. package/dist/src/lib/freezeBalanceTxBuilder.d.ts +71 -0
  22. package/dist/src/lib/freezeBalanceTxBuilder.d.ts.map +1 -0
  23. package/dist/src/lib/freezeBalanceTxBuilder.js +217 -0
  24. package/dist/src/lib/iface.d.ts +248 -2
  25. package/dist/src/lib/iface.d.ts.map +1 -1
  26. package/dist/src/lib/iface.js +1 -1
  27. package/dist/src/lib/index.js +23 -9
  28. package/dist/src/lib/keyPair.d.ts +0 -1
  29. package/dist/src/lib/keyPair.d.ts.map +1 -1
  30. package/dist/src/lib/keyPair.js +31 -18
  31. package/dist/src/lib/resourceManagementTxBuilder.d.ts +72 -0
  32. package/dist/src/lib/resourceManagementTxBuilder.d.ts.map +1 -0
  33. package/dist/src/lib/resourceManagementTxBuilder.js +150 -0
  34. package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
  35. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  36. package/dist/src/lib/tokenTransferBuilder.js +5 -3
  37. package/dist/src/lib/transaction.d.ts +3 -0
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +115 -6
  40. package/dist/src/lib/transactionBuilder.d.ts +53 -6
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  42. package/dist/src/lib/transactionBuilder.js +121 -22
  43. package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
  44. package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
  45. package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
  46. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
  47. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  48. package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
  49. package/dist/src/lib/utils.d.ts +115 -8
  50. package/dist/src/lib/utils.d.ts.map +1 -1
  51. package/dist/src/lib/utils.js +534 -55
  52. package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
  53. package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
  54. package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
  55. package/dist/src/lib/withdrawBuilder.d.ts +49 -0
  56. package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
  57. package/dist/src/lib/withdrawBuilder.js +167 -0
  58. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
  59. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  60. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
  61. package/dist/src/lib/wrappedBuilder.d.ts +67 -1
  62. package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
  63. package/dist/src/lib/wrappedBuilder.js +114 -4
  64. package/dist/src/trx.d.ts +146 -8
  65. package/dist/src/trx.d.ts.map +1 -1
  66. package/dist/src/trx.js +705 -160
  67. package/dist/src/trxToken.d.ts +2 -2
  68. package/dist/src/trxToken.d.ts.map +1 -1
  69. package/dist/src/trxToken.js +22 -7
  70. package/dist/test/fixtures.d.ts +40 -0
  71. package/dist/test/fixtures.d.ts.map +1 -0
  72. package/dist/test/fixtures.js +46 -0
  73. package/dist/test/resources.d.ts +614 -0
  74. package/dist/test/resources.d.ts.map +1 -0
  75. package/dist/test/resources.js +782 -0
  76. package/dist/test/unit/index.d.ts +2 -0
  77. package/dist/test/unit/index.d.ts.map +1 -0
  78. package/dist/test/unit/index.js +19 -0
  79. package/dist/test/unit/keyPair.d.ts +2 -0
  80. package/dist/test/unit/keyPair.d.ts.map +1 -0
  81. package/dist/test/unit/keyPair.js +163 -0
  82. package/dist/test/unit/transaction.d.ts +2 -0
  83. package/dist/test/unit/transaction.d.ts.map +1 -0
  84. package/dist/test/unit/transaction.js +38 -0
  85. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
  86. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
  87. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +248 -0
  88. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
  89. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
  90. package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
  91. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
  92. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
  93. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
  94. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
  95. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
  96. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
  97. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  98. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  99. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +87 -0
  100. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
  101. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
  102. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
  103. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
  104. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  105. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
  106. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
  107. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
  108. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
  109. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
  110. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
  111. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
  112. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
  113. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  114. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
  115. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
  116. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
  117. package/dist/test/unit/transactionBuilder/wrappedBuilder.js +68 -0
  118. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  119. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  120. package/dist/test/unit/transactionBuilder.js +178 -0
  121. package/dist/test/unit/trx.d.ts +2 -0
  122. package/dist/test/unit/trx.d.ts.map +1 -0
  123. package/dist/test/unit/trx.js +843 -0
  124. package/dist/test/unit/trxToken.d.ts +2 -0
  125. package/dist/test/unit/trxToken.d.ts.map +1 -0
  126. package/dist/test/unit/trxToken.js +152 -0
  127. package/dist/test/unit/util.d.ts +2 -0
  128. package/dist/test/unit/util.d.ts.map +1 -0
  129. package/dist/test/unit/util.js +156 -0
  130. package/dist/test/unit/verifyTransaction.d.ts +2 -0
  131. package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
  132. package/dist/test/unit/verifyTransaction.js +695 -0
  133. package/dist/tsconfig.tsbuildinfo +1 -0
  134. package/package.json +22 -16
  135. package/.eslintignore +0 -5
  136. package/.mocharc.yml +0 -8
  137. package/CHANGELOG.md +0 -118
  138. package/resources/README.md +0 -31
  139. package/resources/protobuf/Contract.proto +0 -256
  140. package/resources/protobuf/Discover.proto +0 -44
  141. package/resources/protobuf/tron.d.ts +0 -11205
  142. package/resources/protobuf/tron.js +0 -33480
  143. package/resources/protobuf/tron.proto +0 -677
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trxToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trxToken.d.ts","sourceRoot":"","sources":["../../../test/unit/trxToken.ts"],"names":[],"mappings":""}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_assert_1 = __importDefault(require("node:assert"));
7
+ const node_test_1 = require("node:test");
8
+ const sdk_api_1 = require("@bitgo-beta/sdk-api");
9
+ const sdk_test_1 = require("@bitgo-beta/sdk-test");
10
+ const statics_1 = require("@bitgo-beta/statics");
11
+ const trx_1 = require("../../src/trx");
12
+ const trxToken_1 = require("../../src/trxToken");
13
+ const ttrx_1 = require("../../src/ttrx");
14
+ const lib_1 = require("../../src/lib");
15
+ // Real TriggerSmartContract protobuf raw_data_hex encoding a TRC20 transfer:
16
+ // owner: 41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac
17
+ // contract: 4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0
18
+ // data: a9059cbb + abi(address=8483618ca85c35a9b923d98bebca718f5a1db279, uint256=100000000)
19
+ const TRC20_RAW_DATA_HEX = '0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307';
20
+ // Recipient address decoded from the ABI data above (41 prefix → base58)
21
+ const TRC20_RECIPIENT_HEX = '418483618ca85c35a9b923d98bebca718f5a1db279';
22
+ const TRC20_AMOUNT = '100000000';
23
+ (0, node_test_1.describe)('TrxToken verifyTransaction:', function () {
24
+ const bitgo = sdk_test_1.TestBitGo.decorate(sdk_api_1.BitGoAPI, { env: 'test' });
25
+ bitgo.initializeTestVars();
26
+ bitgo.safeRegister('trx', trx_1.Trx.createInstance);
27
+ bitgo.safeRegister('ttrx', ttrx_1.Ttrx.createInstance);
28
+ let tokenCoin;
29
+ (0, node_test_1.before)(function () {
30
+ const usdtConfig = statics_1.tokens.testnet.trx.tokens.find((t) => t.type === 'ttrx:usdt');
31
+ node_assert_1.default.ok(usdtConfig, 'ttrx:usdt token config not found');
32
+ tokenCoin = new trxToken_1.TrxToken(bitgo, usdtConfig);
33
+ });
34
+ (0, node_test_1.describe)('TSS wallet — TriggerSmartContract validation', () => {
35
+ (0, node_test_1.it)('should validate a correct TRC20 transfer', async function () {
36
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
37
+ const result = await tokenCoin.verifyTransaction({
38
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
39
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
40
+ walletType: 'tss',
41
+ });
42
+ node_assert_1.default.strictEqual(result, true);
43
+ });
44
+ (0, node_test_1.it)('should validate when txHex is a serialized JSON (prebuildAndSignTransaction path)', async function () {
45
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
46
+ const serializedTxHex = JSON.stringify({ txID: 'abc', raw_data_hex: TRC20_RAW_DATA_HEX, raw_data: {} });
47
+ const result = await tokenCoin.verifyTransaction({
48
+ txPrebuild: { txHex: serializedTxHex },
49
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
50
+ walletType: 'tss',
51
+ });
52
+ node_assert_1.default.strictEqual(result, true);
53
+ });
54
+ (0, node_test_1.it)('should validate when recipient is supplied as 0x-prefixed hex (COINS-1575)', async function () {
55
+ const recipientEvm = '0x' + TRC20_RECIPIENT_HEX.slice(2).toLowerCase();
56
+ const result = await tokenCoin.verifyTransaction({
57
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
58
+ txParams: { recipients: [{ address: recipientEvm, amount: TRC20_AMOUNT }] },
59
+ walletType: 'tss',
60
+ });
61
+ node_assert_1.default.strictEqual(result, true);
62
+ });
63
+ (0, node_test_1.it)('should validate when recipient is supplied as 41-prefixed hex (COINS-1575)', async function () {
64
+ const result = await tokenCoin.verifyTransaction({
65
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
66
+ txParams: { recipients: [{ address: TRC20_RECIPIENT_HEX, amount: TRC20_AMOUNT }] },
67
+ walletType: 'tss',
68
+ });
69
+ node_assert_1.default.strictEqual(result, true);
70
+ });
71
+ (0, node_test_1.it)('should throw when amount does not match', async function () {
72
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
73
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
74
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
75
+ txParams: { recipients: [{ address: recipientBase58, amount: '999' }] },
76
+ walletType: 'tss',
77
+ }), { message: 'transaction amount in txPrebuild does not match the value given by client' });
78
+ });
79
+ (0, node_test_1.it)('should throw when recipient address does not match', async function () {
80
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
81
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
82
+ txParams: { recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: TRC20_AMOUNT }] },
83
+ walletType: 'tss',
84
+ }), { message: 'destination address does not match with the recipient address' });
85
+ });
86
+ (0, node_test_1.it)('should return true when recipients is empty array (consolidation path)', async function () {
87
+ const result = await tokenCoin.verifyTransaction({
88
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
89
+ txParams: { recipients: [] },
90
+ walletType: 'tss',
91
+ });
92
+ node_assert_1.default.strictEqual(result, true);
93
+ });
94
+ (0, node_test_1.it)('should throw when contract type is not TriggerSmartContract', async function () {
95
+ // Use a native TRX Transfer protobuf as txHex — TrxToken only handles TriggerSmartContract
96
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
97
+ const nativeTrxRawDataHex = lib_1.Utils.generateRawDataHex({
98
+ contract: [
99
+ {
100
+ parameter: {
101
+ value: {
102
+ amount: 100000000,
103
+ owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
104
+ to_address: TRC20_RECIPIENT_HEX,
105
+ },
106
+ type_url: 'type.googleapis.com/protocol.TransferContract',
107
+ },
108
+ type: 'TransferContract',
109
+ },
110
+ ],
111
+ refBlockBytes: 'c8cf',
112
+ refBlockHash: '89177fd84c5d9196',
113
+ expiration: Date.now() + 3600000,
114
+ timestamp: Date.now(),
115
+ });
116
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
117
+ txPrebuild: { txHex: nativeTrxRawDataHex },
118
+ txParams: { recipients: [{ address: recipientBase58, amount: '100000000' }] },
119
+ walletType: 'tss',
120
+ }), { message: /Expected TriggerSmartContract for TRC20 token transfer/ });
121
+ });
122
+ });
123
+ (0, node_test_1.describe)('non-TSS wallet — builder-based validation (existing path)', () => {
124
+ const txHex = '{"raw_data":{"contractType":2,"contract":[{"parameter":{"value":{"data":"a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e100","owner_address":"41c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac","contract_address":"4142a1e39aefa49290f2b3f9ed688d7cecf86cd6e0"},"type_url":"type.googleapis.com/protocol.TriggerSmartContract"},"type":"TriggerSmartContract"}],"expiration":1674581767432,"timestamp":1674578167432,"ref_block_bytes":"578b","ref_block_hash":"6113bb9ac351432b","fee_limit":15000000},"raw_data_hex":"0a02578b22086113bb9ac351432b4088eae7a6de305aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c51fbeea78910b15b1d3e8a9b62914ca94d1a4ac12154142a1e39aefa49290f2b3f9ed688d7cecf86cd6e02244a9059cbb0000000000000000000000008483618ca85c35a9b923d98bebca718f5a1db2790000000000000000000000000000000000000000000000000000000005f5e10070888d8ca5de309001c0c39307","txID":"fe21c49f4febd9089125e3a006943c145721d8fcb7ab84136f8c6663ff92f8ed","signature":["0775cde302689eb8293883c66a89b31e80d608bfc3ad3c283b64a490ea4cc712c55a2fd2e62c75843dd7e77d8c4cb52e0f371fbb29b332c259f8cb63c2e6195301"]}';
125
+ (0, node_test_1.it)('should validate a correct non-TSS TRC20 transfer using txBuilder', async function () {
126
+ // The non-TSS path uses getBuilder().from(rawTx).build() and checks tx.outputs[0]
127
+ // This test uses the full JSON tx format that the builder understands.
128
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
129
+ const result = await tokenCoin.verifyTransaction({
130
+ txPrebuild: { txHex },
131
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
132
+ });
133
+ node_assert_1.default.strictEqual(result, true);
134
+ });
135
+ (0, node_test_1.it)('should validate when recipient is 0x-prefixed hex (hot wallet sendmany / COINS-1575)', async function () {
136
+ const recipientEvm = '0x' + TRC20_RECIPIENT_HEX.slice(2).toLowerCase();
137
+ const result = await tokenCoin.verifyTransaction({
138
+ txPrebuild: { txHex },
139
+ txParams: { recipients: [{ address: recipientEvm, amount: TRC20_AMOUNT }] },
140
+ });
141
+ node_assert_1.default.strictEqual(result, true);
142
+ });
143
+ (0, node_test_1.it)('should validate when recipient is 41-prefixed hex (hot wallet sendmany / COINS-1575)', async function () {
144
+ const result = await tokenCoin.verifyTransaction({
145
+ txPrebuild: { txHex },
146
+ txParams: { recipients: [{ address: TRC20_RECIPIENT_HEX, amount: TRC20_AMOUNT }] },
147
+ });
148
+ node_assert_1.default.strictEqual(result, true);
149
+ });
150
+ });
151
+ });
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMseUNBQWlEO0FBQ2pELGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsaURBQTZDO0FBQzdDLHVDQUFvQztBQUNwQyxpREFBOEM7QUFDOUMseUNBQXNDO0FBQ3RDLHVDQUFzQztBQUV0Qyw2RUFBNkU7QUFDN0UseURBQXlEO0FBQ3pELHlEQUF5RDtBQUN6RCxrR0FBa0c7QUFDbEcsTUFBTSxrQkFBa0IsR0FDdEIsd2FBQXdhLENBQUM7QUFFM2EseUVBQXlFO0FBQ3pFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRWpDLElBQUEsb0JBQVEsRUFBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxTQUFtQixDQUFDO0lBRXhCLElBQUEsa0JBQU0sRUFBQztRQUNMLE1BQU0sVUFBVSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLHFCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzFELFNBQVMsR0FBRyxJQUFJLG1CQUFRLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBQSxvQkFBUSxFQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUM1RCxJQUFBLGNBQUUsRUFBQywwQ0FBMEMsRUFBRSxLQUFLO1lBQ2xELE1BQU0sZUFBZSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ3pDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTtnQkFDOUUsVUFBVSxFQUFFLEtBQUs7YUFDWCxDQUFDLENBQUM7WUFFVixxQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyxtRkFBbUYsRUFBRSxLQUFLO1lBQzNGLE1BQU0sZUFBZSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUV4RyxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRTtnQkFDdEMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFO2dCQUM5RSxVQUFVLEVBQUUsS0FBSzthQUNYLENBQUMsQ0FBQztZQUVWLHFCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLDRFQUE0RSxFQUFFLEtBQUs7WUFDcEYsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV2RSxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO2dCQUN6QyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7Z0JBQzNFLFVBQVUsRUFBRSxLQUFLO2FBQ1gsQ0FBQyxDQUFDO1lBRVYscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsNEVBQTRFLEVBQUUsS0FBSztZQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO2dCQUN6QyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTtnQkFDbEYsVUFBVSxFQUFFLEtBQUs7YUFDWCxDQUFDLENBQUM7WUFFVixxQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyx5Q0FBeUMsRUFBRSxLQUFLO1lBQ2pELE1BQU0sZUFBZSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTNFLE1BQU0scUJBQU0sQ0FBQyxPQUFPLENBQ2xCLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFO2dCQUN6QyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUU7Z0JBQ3ZFLFVBQVUsRUFBRSxLQUFLO2FBQ1gsQ0FBQyxFQUNULEVBQUUsT0FBTyxFQUFFLDJFQUEyRSxFQUFFLENBQ3pGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLG9EQUFvRCxFQUFFLEtBQUs7WUFDNUQsTUFBTSxxQkFBTSxDQUFDLE9BQU8sQ0FDbEIsU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUMxQixVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ3pDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFO2dCQUNuRyxVQUFVLEVBQUUsS0FBSzthQUNYLENBQUMsRUFDVCxFQUFFLE9BQU8sRUFBRSwrREFBK0QsRUFBRSxDQUM3RSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyx3RUFBd0UsRUFBRSxLQUFLO1lBQ2hGLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUU7Z0JBQ3pDLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUU7Z0JBQzVCLFVBQVUsRUFBRSxLQUFLO2FBQ1gsQ0FBQyxDQUFDO1lBQ1YscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBQSxjQUFFLEVBQUMsNkRBQTZELEVBQUUsS0FBSztZQUNyRSwyRkFBMkY7WUFDM0YsTUFBTSxlQUFlLEdBQUcsV0FBSyxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDM0UsTUFBTSxtQkFBbUIsR0FBRyxXQUFLLENBQUMsa0JBQWtCLENBQUM7Z0JBQ25ELFFBQVEsRUFBRTtvQkFDUjt3QkFDRSxTQUFTLEVBQUU7NEJBQ1QsS0FBSyxFQUFFO2dDQUNMLE1BQU0sRUFBRSxTQUFTO2dDQUNqQixhQUFhLEVBQUUsNENBQTRDO2dDQUMzRCxVQUFVLEVBQUUsbUJBQW1COzZCQUN6Qjs0QkFDUixRQUFRLEVBQUUsK0NBQStDO3lCQUMxRDt3QkFDRCxJQUFJLEVBQUUsa0JBQWtCO3FCQUNsQjtpQkFDVDtnQkFDRCxhQUFhLEVBQUUsTUFBTTtnQkFDckIsWUFBWSxFQUFFLGtCQUFrQjtnQkFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPO2dCQUNoQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN0QixDQUFDLENBQUM7WUFFSCxNQUFNLHFCQUFNLENBQUMsT0FBTyxDQUNsQixTQUFTLENBQUMsaUJBQWlCLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtnQkFDMUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO2dCQUM3RSxVQUFVLEVBQUUsS0FBSzthQUNYLENBQUMsRUFDVCxFQUFFLE9BQU8sRUFBRSx3REFBd0QsRUFBRSxDQUN0RSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUEsb0JBQVEsRUFBQywyREFBMkQsRUFBRSxHQUFHLEVBQUU7UUFDekUsTUFBTSxLQUFLLEdBQ1QsZ3RDQUFndEMsQ0FBQztRQUVudEMsSUFBQSxjQUFFLEVBQUMsa0VBQWtFLEVBQUUsS0FBSztZQUMxRSxrRkFBa0Y7WUFDbEYsdUVBQXVFO1lBQ3ZFLE1BQU0sZUFBZSxHQUFHLFdBQUssQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBRTNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDO2dCQUMvQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUU7Z0JBQ3JCLFFBQVEsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsRUFBRTthQUN4RSxDQUFDLENBQUM7WUFFVixxQkFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFBLGNBQUUsRUFBQyxzRkFBc0YsRUFBRSxLQUFLO1lBQzlGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFdkUsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsaUJBQWlCLENBQUM7Z0JBQy9DLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRTtnQkFDckIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFO2FBQ3JFLENBQUMsQ0FBQztZQUVWLHFCQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLHNGQUFzRixFQUFFLEtBQUs7WUFDOUYsTUFBTSxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsaUJBQWlCLENBQUM7Z0JBQy9DLFVBQVUsRUFBRSxFQUFFLEtBQUssRUFBRTtnQkFDckIsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7YUFDNUUsQ0FBQyxDQUFDO1lBRVYscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBiZWZvcmUgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHb0FQSSwgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcnggfSBmcm9tICcuLi8uLi9zcmMvdHJ4JztcbmltcG9ydCB7IFRyeFRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL3RyeFRva2VuJztcbmltcG9ydCB7IFR0cnggfSBmcm9tICcuLi8uLi9zcmMvdHRyeCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuXG4vLyBSZWFsIFRyaWdnZXJTbWFydENvbnRyYWN0IHByb3RvYnVmIHJhd19kYXRhX2hleCBlbmNvZGluZyBhIFRSQzIwIHRyYW5zZmVyOlxuLy8gICBvd25lcjogICAgNDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjXG4vLyAgIGNvbnRyYWN0OiA0MTQyYTFlMzlhZWZhNDkyOTBmMmIzZjllZDY4OGQ3Y2VjZjg2Y2Q2ZTBcbi8vICAgZGF0YTogICAgIGE5MDU5Y2JiICsgYWJpKGFkZHJlc3M9ODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OSwgdWludDI1Nj0xMDAwMDAwMDApXG5jb25zdCBUUkMyMF9SQVdfREFUQV9IRVggPVxuICAnMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDcnO1xuXG4vLyBSZWNpcGllbnQgYWRkcmVzcyBkZWNvZGVkIGZyb20gdGhlIEFCSSBkYXRhIGFib3ZlICg0MSBwcmVmaXgg4oaSIGJhc2U1OClcbmNvbnN0IFRSQzIwX1JFQ0lQSUVOVF9IRVggPSAnNDE4NDgzNjE4Y2E4NWMzNWE5YjkyM2Q5OGJlYmNhNzE4ZjVhMWRiMjc5JztcbmNvbnN0IFRSQzIwX0FNT1VOVCA9ICcxMDAwMDAwMDAnO1xuXG5kZXNjcmliZSgnVHJ4VG9rZW4gdmVyaWZ5VHJhbnNhY3Rpb246JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0cngnLCBUcnguY3JlYXRlSW5zdGFuY2UpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R0cngnLCBUdHJ4LmNyZWF0ZUluc3RhbmNlKTtcblxuICBsZXQgdG9rZW5Db2luOiBUcnhUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZHRDb25maWcgPSB0b2tlbnMudGVzdG5ldC50cngudG9rZW5zLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ3R0cng6dXNkdCcpO1xuICAgIGFzc2VydC5vayh1c2R0Q29uZmlnLCAndHRyeDp1c2R0IHRva2VuIGNvbmZpZyBub3QgZm91bmQnKTtcbiAgICB0b2tlbkNvaW4gPSBuZXcgVHJ4VG9rZW4oYml0Z28sIHVzZHRDb25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVFNTIHdhbGxldCDigJQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgY29ycmVjdCBUUkMyMCB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudEJhc2U1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KFRSQzIwX1JFQ0lQSUVOVF9IRVgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gdHhIZXggaXMgYSBzZXJpYWxpemVkIEpTT04gKHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uIHBhdGgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7IHR4SUQ6ICdhYmMnLCByYXdfZGF0YV9oZXg6IFRSQzIwX1JBV19EQVRBX0hFWCwgcmF3X2RhdGE6IHt9IH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gcmVjaXBpZW50IGlzIHN1cHBsaWVkIGFzIDB4LXByZWZpeGVkIGhleCAoQ09JTlMtMTU3NSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNpcGllbnRFdm0gPSAnMHgnICsgVFJDMjBfUkVDSVBJRU5UX0hFWC5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50RXZtLCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gcmVjaXBpZW50IGlzIHN1cHBsaWVkIGFzIDQxLXByZWZpeGVkIGhleCAoQ09JTlMtMTU3NSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogVFJDMjBfUkVDSVBJRU5UX0hFWCwgYW1vdW50OiBUUkMyMF9BTU9VTlQgfV0gfSxcbiAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICB9IGFzIGFueSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGFtb3VudCBkb2VzIG5vdCBtYXRjaCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudEJhc2U1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KFRSQzIwX1JFQ0lQSUVOVF9IRVgpO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiByZWNpcGllbnRCYXNlNTgsIGFtb3VudDogJzk5OScgfV0gfSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgICB7IG1lc3NhZ2U6ICd0cmFuc2FjdGlvbiBhbW91bnQgaW4gdHhQcmVidWlsZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgZ2l2ZW4gYnkgY2xpZW50JyB9XG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIHJlY2lwaWVudCBhZGRyZXNzIGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogVFJDMjBfUkFXX0RBVEFfSEVYIH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogJ1RMV2g2N1A5M0tndG5aTkN0R25FSE0xSDMzTmhxMnV2dk4nLCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9IGFzIGFueSksXG4gICAgICAgIHsgbWVzc2FnZTogJ2Rlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgcmVjaXBpZW50IGFkZHJlc3MnIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIHdoZW4gcmVjaXBpZW50cyBpcyBlbXB0eSBhcnJheSAoY29uc29saWRhdGlvbiBwYXRoKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IFRSQzIwX1JBV19EQVRBX0hFWCB9LFxuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbXSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyB3aGVuIGNvbnRyYWN0IHR5cGUgaXMgbm90IFRyaWdnZXJTbWFydENvbnRyYWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVXNlIGEgbmF0aXZlIFRSWCBUcmFuc2ZlciBwcm90b2J1ZiBhcyB0eEhleCDigJQgVHJ4VG9rZW4gb25seSBoYW5kbGVzIFRyaWdnZXJTbWFydENvbnRyYWN0XG4gICAgICBjb25zdCByZWNpcGllbnRCYXNlNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChUUkMyMF9SRUNJUElFTlRfSEVYKTtcbiAgICAgIGNvbnN0IG5hdGl2ZVRyeFJhd0RhdGFIZXggPSBVdGlscy5nZW5lcmF0ZVJhd0RhdGFIZXgoe1xuICAgICAgICBjb250cmFjdDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHBhcmFtZXRlcjoge1xuICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGFtb3VudDogMTAwMDAwMDAwLFxuICAgICAgICAgICAgICAgIG93bmVyX2FkZHJlc3M6ICc0MTczYTU5OTNjZDE4MmFlMTUyYWRhZDgyMDMxNjNmNzgwYzY1YThhYTUnLFxuICAgICAgICAgICAgICAgIHRvX2FkZHJlc3M6IFRSQzIwX1JFQ0lQSUVOVF9IRVgsXG4gICAgICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICAgICAgICB0eXBlX3VybDogJ3R5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9jb2wuVHJhbnNmZXJDb250cmFjdCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdHlwZTogJ1RyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgIH0gYXMgYW55LFxuICAgICAgICBdLFxuICAgICAgICByZWZCbG9ja0J5dGVzOiAnYzhjZicsXG4gICAgICAgIHJlZkJsb2NrSGFzaDogJzg5MTc3ZmQ4NGM1ZDkxOTYnLFxuICAgICAgICBleHBpcmF0aW9uOiBEYXRlLm5vdygpICsgMzYwMDAwMCxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgfSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IG5hdGl2ZVRyeFJhd0RhdGFIZXggfSxcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiByZWNpcGllbnRCYXNlNTgsIGFtb3VudDogJzEwMDAwMDAwMCcgfV0gfSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgICB7IG1lc3NhZ2U6IC9FeHBlY3RlZCBUcmlnZ2VyU21hcnRDb250cmFjdCBmb3IgVFJDMjAgdG9rZW4gdHJhbnNmZXIvIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub24tVFNTIHdhbGxldCDigJQgYnVpbGRlci1iYXNlZCB2YWxpZGF0aW9uIChleGlzdGluZyBwYXRoKScsICgpID0+IHtcbiAgICBjb25zdCB0eEhleCA9XG4gICAgICAne1wicmF3X2RhdGFcIjp7XCJjb250cmFjdFR5cGVcIjoyLFwiY29udHJhY3RcIjpbe1wicGFyYW1ldGVyXCI6e1widmFsdWVcIjp7XCJkYXRhXCI6XCJhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwXCIsXCJvd25lcl9hZGRyZXNzXCI6XCI0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWNcIixcImNvbnRyYWN0X2FkZHJlc3NcIjpcIjQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMFwifSxcInR5cGVfdXJsXCI6XCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyaWdnZXJTbWFydENvbnRyYWN0XCJ9LFwidHlwZVwiOlwiVHJpZ2dlclNtYXJ0Q29udHJhY3RcIn1dLFwiZXhwaXJhdGlvblwiOjE2NzQ1ODE3Njc0MzIsXCJ0aW1lc3RhbXBcIjoxNjc0NTc4MTY3NDMyLFwicmVmX2Jsb2NrX2J5dGVzXCI6XCI1NzhiXCIsXCJyZWZfYmxvY2tfaGFzaFwiOlwiNjExM2JiOWFjMzUxNDMyYlwiLFwiZmVlX2xpbWl0XCI6MTUwMDAwMDB9LFwicmF3X2RhdGFfaGV4XCI6XCIwYTAyNTc4YjIyMDg2MTEzYmI5YWMzNTE0MzJiNDA4OGVhZTdhNmRlMzA1YWFlMDEwODFmMTJhOTAxMGEzMTc0Nzk3MDY1MmU2NzZmNmY2NzZjNjU2MTcwNjk3MzJlNjM2ZjZkMmY3MDcyNmY3NDZmNjM2ZjZjMmU1NDcyNjk2NzY3NjU3MjUzNmQ2MTcyNzQ0MzZmNmU3NDcyNjE2Mzc0MTI3NDBhMTU0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWMxMjE1NDE0MmExZTM5YWVmYTQ5MjkwZjJiM2Y5ZWQ2ODhkN2NlY2Y4NmNkNmUwMjI0NGE5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVmNWUxMDA3MDg4OGQ4Y2E1ZGUzMDkwMDFjMGMzOTMwN1wiLFwidHhJRFwiOlwiZmUyMWM0OWY0ZmViZDkwODkxMjVlM2EwMDY5NDNjMTQ1NzIxZDhmY2I3YWI4NDEzNmY4YzY2NjNmZjkyZjhlZFwiLFwic2lnbmF0dXJlXCI6W1wiMDc3NWNkZTMwMjY4OWViODI5Mzg4M2M2NmE4OWIzMWU4MGQ2MDhiZmMzYWQzYzI4M2I2NGE0OTBlYTRjYzcxMmM1NWEyZmQyZTYyYzc1ODQzZGQ3ZTc3ZDhjNGNiNTJlMGYzNzFmYmIyOWIzMzJjMjU5ZjhjYjYzYzJlNjE5NTMwMVwiXX0nO1xuXG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIGNvcnJlY3Qgbm9uLVRTUyBUUkMyMCB0cmFuc2ZlciB1c2luZyB0eEJ1aWxkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgbm9uLVRTUyBwYXRoIHVzZXMgZ2V0QnVpbGRlcigpLmZyb20ocmF3VHgpLmJ1aWxkKCkgYW5kIGNoZWNrcyB0eC5vdXRwdXRzWzBdXG4gICAgICAvLyBUaGlzIHRlc3QgdXNlcyB0aGUgZnVsbCBKU09OIHR4IGZvcm1hdCB0aGF0IHRoZSBidWlsZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdmFsaWRhdGUgd2hlbiByZWNpcGllbnQgaXMgMHgtcHJlZml4ZWQgaGV4IChob3Qgd2FsbGV0IHNlbmRtYW55IC8gQ09JTlMtMTU3NSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZWNpcGllbnRFdm0gPSAnMHgnICsgVFJDMjBfUkVDSVBJRU5UX0hFWC5zbGljZSgyKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4IH0sXG4gICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IHJlY2lwaWVudEV2bSwgYW1vdW50OiBUUkMyMF9BTU9VTlQgfV0gfSxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gcmVjaXBpZW50IGlzIDQxLXByZWZpeGVkIGhleCAoaG90IHdhbGxldCBzZW5kbWFueSAvIENPSU5TLTE1NzUpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleCB9LFxuICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiBUUkMyMF9SRUNJUElFTlRfSEVYLCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../test/unit/util.ts"],"names":[],"mappings":""}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const node_test_1 = require("node:test");
7
+ const assert_1 = __importDefault(require("assert"));
8
+ const src_1 = require("../../src");
9
+ const resources_1 = require("../resources");
10
+ const utils_1 = require("../../src/lib/utils");
11
+ (0, node_test_1.describe)('Util library should', function () {
12
+ // arbitrary text
13
+ const arr = [127, 255, 31, 192, 3, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
14
+ const hex = '7FFF1FC0037E0000000000000000000000000000000000000000000000000000';
15
+ const txt = 'arbitrary string to sign';
16
+ const signedString = '0x9424113f32c17b6ffbeee024e1a54b6991d756e82f66cca16a41231fdfa270d03b08e833f5dbbd5cc86896c2e5ea6c74d2e292cda21f717164f994fcdf28486d1b';
17
+ // prv-pub-address hex
18
+ const prv = 'FB3AA887E0BE3FAC9D75E661DAFF4A7FE0E91AAB13DA9775CD8586D7CB9B7640';
19
+ const pub = '046EBFB90C396B4A3B992B727CB4714A32E2A6DE43FDB3EC266286AC2246D8FD1E23E12C0DEB752C631A9011BBF8B56E2FBAA20E99D3952F0A558D11F96E7C1C5D';
20
+ const addressHex = '412C2BA4A9FF6C53207DC5B686BFECF75EA7B80577';
21
+ const base58 = 'TDzm1tCXM2YS1PDa3GoXSvxdy4AgwVbBPE';
22
+ const addrBytes = [65, 44, 43, 164, 169, 255, 108, 83, 32, 125, 197, 182, 134, 191, 236, 247, 94, 167, 184, 5, 119];
23
+ // tx information
24
+ (0, node_test_1.it)('be able to convert hex to bytes', () => {
25
+ const ba = src_1.Utils.getByteArrayFromHexAddress(hex);
26
+ assert_1.default.deepStrictEqual(ba, arr);
27
+ });
28
+ (0, node_test_1.it)('be able to convert hex with 0x to bytes ', () => {
29
+ const ba = src_1.Utils.getByteArrayFromHexAddress('0x' + hex);
30
+ assert_1.default.deepStrictEqual(ba, arr);
31
+ });
32
+ (0, node_test_1.it)('be able to convert hex to bytes', () => {
33
+ const hs = src_1.Utils.getHexAddressFromByteArray(arr);
34
+ assert_1.default.equal(hs, hex);
35
+ });
36
+ (0, node_test_1.it)('get a pub from a prv', () => {
37
+ const derivedPub = src_1.Utils.getPubKeyFromPriKey(Buffer.from(prv, 'hex'));
38
+ const derivedPubHex = src_1.Utils.getHexAddressFromByteArray(derivedPub);
39
+ assert_1.default.equal(derivedPubHex, pub);
40
+ });
41
+ (0, node_test_1.it)('get an hex address from a prv', () => {
42
+ const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
43
+ const hexAddr = src_1.Utils.getHexAddressFromByteArray(addr);
44
+ assert_1.default.equal(hexAddr, addressHex);
45
+ });
46
+ (0, node_test_1.it)('get an base58 address', () => {
47
+ const addr = src_1.Utils.getAddressFromPriKey(Buffer.from(prv, 'hex'));
48
+ const addr58 = src_1.Utils.getBase58AddressFromByteArray(addr);
49
+ assert_1.default.equal(addr58, base58);
50
+ });
51
+ (0, node_test_1.it)('get an base58 address from hex', () => {
52
+ const addr58 = src_1.Utils.getBase58AddressFromHex(addressHex);
53
+ assert_1.default.equal(addr58, base58);
54
+ });
55
+ (0, node_test_1.it)('get hex from base58 address', () => {
56
+ const hexAddr = src_1.Utils.getHexAddressFromBase58Address(base58);
57
+ assert_1.default.equal(hexAddr, addressHex);
58
+ });
59
+ (0, node_test_1.it)('validate a hex string', () => {
60
+ const hex = ['0xaffd', '0x11'];
61
+ hex.map((hex) => {
62
+ assert_1.default.ok(src_1.Utils.isValidHex(hex));
63
+ });
64
+ const invalidHex = ['0xa11', '0xFFdYYY', '0x', ''];
65
+ invalidHex.map((hex) => {
66
+ assert_1.default.strictEqual(src_1.Utils.isValidHex(hex), false);
67
+ });
68
+ });
69
+ (0, node_test_1.it)('sign a string', () => {
70
+ const hexText = Buffer.from(txt).toString('hex');
71
+ const signed = src_1.Utils.signString(hexText, prv);
72
+ assert_1.default.equal(signedString, signed);
73
+ });
74
+ (0, node_test_1.it)('should calculate an address from a pub', () => {
75
+ const pubBytes = src_1.Utils.getByteArrayFromHexAddress(pub);
76
+ const bytes = src_1.Utils.getRawAddressFromPubKey(pubBytes);
77
+ assert_1.default.deepStrictEqual(bytes, addrBytes);
78
+ });
79
+ (0, node_test_1.it)('should verify a signed message', () => {
80
+ const hexEncodedMessage = Buffer.from(txt).toString('hex');
81
+ assert_1.default.strictEqual(src_1.Utils.verifySignature(hexEncodedMessage, base58, signedString, true), true);
82
+ });
83
+ (0, node_test_1.it)('should fail to verify a signed message if the message is not in hex', () => {
84
+ assert_1.default.throws(() => src_1.Utils.verifySignature(txt, base58, signedString, true));
85
+ });
86
+ (0, node_test_1.it)('should fail to verify a signed message if the address is not in base58', () => {
87
+ const hexEncodedString = Buffer.from(txt).toString('hex');
88
+ assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, addressHex, signedString, true));
89
+ });
90
+ (0, node_test_1.it)('should fail to verify a signed message if the signature is not in hex', () => {
91
+ const hexEncodedString = Buffer.from(txt).toString('hex');
92
+ assert_1.default.throws(() => src_1.Utils.verifySignature(hexEncodedString, base58, 'abc', true));
93
+ });
94
+ (0, node_test_1.it)('should return transaction data', () => {
95
+ const data = src_1.Utils.decodeRawTransaction(resources_1.UnsignedTransferContractTx.tx.raw_data_hex);
96
+ assert_1.default.equal(data.timestamp, resources_1.UnsignedTransferContractTx.tx.raw_data.timestamp);
97
+ assert_1.default.equal(data.expiration, resources_1.UnsignedTransferContractTx.tx.raw_data.expiration);
98
+ assert_1.default.ok(data.contracts);
99
+ });
100
+ (0, node_test_1.it)('should decode a transfer contract', () => {
101
+ const tx = resources_1.UnsignedTransferContractTx.tx;
102
+ const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
103
+ const value = resources_1.UnsignedTransferContractTx.tx.raw_data.contract[0].parameter.value;
104
+ const parsedContract = src_1.Utils.decodeTransferContract(rawTx.contracts[0].parameter.value);
105
+ const toAddress = src_1.Utils.getBase58AddressFromHex(value.to_address);
106
+ const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
107
+ const amount = value.amount;
108
+ assert_1.default.equal(parsedContract[0].parameter.value.to_address, toAddress);
109
+ assert_1.default.equal(parsedContract[0].parameter.value.owner_address, ownerAddress);
110
+ assert_1.default.equal(parsedContract[0].parameter.value.amount, amount);
111
+ });
112
+ (0, node_test_1.it)('should decode an AccountPermissionUpdate Contract', () => {
113
+ const tx = resources_1.SignedAccountPermissionUpdateContractTx;
114
+ const value = tx.raw_data.contract[0].parameter.value;
115
+ const rawTx = src_1.Utils.decodeRawTransaction(tx.raw_data_hex);
116
+ const parsedTx = src_1.Utils.decodeAccountPermissionUpdateContract(rawTx.contracts[0].parameter.value);
117
+ const ownerAddress = src_1.Utils.getBase58AddressFromHex(value.owner_address);
118
+ assert_1.default.equal(parsedTx.ownerAddress, ownerAddress);
119
+ assert_1.default.equal(parsedTx.owner.type, 0);
120
+ assert_1.default.equal(parsedTx.owner.threshold, 2);
121
+ assert_1.default.equal(parsedTx.actives.length, 1);
122
+ assert_1.default.equal(parsedTx.actives[0].type, 2);
123
+ assert_1.default.equal(parsedTx.actives[0].threshold, 2);
124
+ });
125
+ (0, node_test_1.it)('should encode and decode data parameters for transfer', () => {
126
+ const types = ['address', 'uint256'];
127
+ const amount = '2000000000000000000000';
128
+ const values = [addressHex, amount];
129
+ const methodId = '0xa9059cbb';
130
+ const data = src_1.Utils.encodeDataParams(types, values, methodId);
131
+ assert_1.default.equal(data, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
132
+ const decodedData = src_1.Utils.decodeDataParams(types, 'a9059cbb0000000000000000000000002c2ba4a9ff6c53207dc5b686bfecf75ea7b8057700000000000000000000000000000000000000000000006c6b935b8bbd400000');
133
+ assert_1.default.equal(decodedData[0], addressHex.toLocaleLowerCase());
134
+ assert_1.default.equal(decodedData[1].toString(), amount);
135
+ });
136
+ (0, node_test_1.it)('should correctly map testnet and mainnet tokens', () => {
137
+ assert_1.default.strictEqual(utils_1.tokenMainnetContractAddresses.includes('TSSMHYeV2uE9qYH95DqyoCuNCzEL1NvU3S'), true);
138
+ assert_1.default.strictEqual(utils_1.tokenTestnetContractAddresses.includes('TGkfUshdbAiNj5G1mynp2meq2BfF6XSGPf'), true);
139
+ });
140
+ (0, node_test_1.describe)('getNonBase58Characters', () => {
141
+ (0, node_test_1.it)('returns empty array for valid base58 strings', () => {
142
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('TGai5uHgBcoLERrzDXMepqZB8Et7D8nV8K'), []);
143
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters(src_1.Utils.BASE58_ALPHABET), []);
144
+ });
145
+ (0, node_test_1.it)('returns invalid characters for non-base58 characters (0, O, I, l)', () => {
146
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('TGai5uHgBcoLERrzDXMepqZB8Et7D8nV80'), ['0']);
147
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('TGai5uHgBcoLERrzDXMepqZB8Et7D8nV8O'), ['O']);
148
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('TGai5uHgBcoLERrzDXMepqZB8Et7D8nV8I'), ['I']);
149
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('TGai5uHgBcoLERrzDXMepqZB8Et7D8nV8l'), ['l']);
150
+ });
151
+ (0, node_test_1.it)('returns unique non-base58 characters including whitespace and symbols', () => {
152
+ assert_1.default.deepStrictEqual(src_1.Utils.getNonBase58Characters('00OOIIll !!'), ['0', 'O', 'I', 'l', ' ', '!']);
153
+ });
154
+ });
155
+ });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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QUMsV0FBSyxDQUFDLHNCQUFzQixDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xHLGdCQUFNLENBQUMsZUFBZSxDQUFDLFdBQUssQ0FBQyxzQkFBc0IsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRyxDQUFDLENBQUMsQ0FBQztRQUVILElBQUEsY0FBRSxFQUFDLHVFQUF1RSxFQUFFLEdBQUcsRUFBRTtZQUMvRSxnQkFBTSxDQUFDLGVBQWUsQ0FBQyxXQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkcsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGl0IH0gZnJvbSAnbm9kZTp0ZXN0JztcbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IEludGVyZmFjZSwgVXRpbHMgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG5pbXBvcnQgeyBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeCwgU2lnbmVkQWNjb3VudFBlcm1pc3Npb25VcGRhdGVDb250cmFjdFR4IH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLCB0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3NlcyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5kZXNjcmliZSgnVXRpbCBsaWJyYXJ5IHNob3VsZCcsIGZ1bmN0aW9uICgpIHtcbiAgLy8gYXJiaXRyYXJ5IHRleHRcbiAgY29uc3QgYXJyID0gWzEyNywgMjU1LCAzMSwgMTkyLCAzLCAxMjYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdO1xuICBjb25zdCBoZXggPSAnN0ZGRjFGQzAwMzdFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7XG4gIGNvbnN0IHR4dCA9ICdhcmJpdHJhcnkgc3RyaW5nIHRvIHNpZ24nO1xuICBjb25zdCBzaWduZWRTdHJpbmcgPVxuICAgICcweDk0MjQxMTNmMzJjMTdiNmZmYmVlZTAyNGUxYTU0YjY5OTFkNzU2ZTgyZjY2Y2NhMTZhNDEyMzFmZGZhMjcwZDAzYjA4ZTgzM2Y1ZGJiZDVjYzg2ODk2YzJlNWVhNmM3NGQyZTI5MmNkYTIxZjcxNzE2NGY5OTRmY2RmMjg0ODZkMWInO1xuXG4gIC8vIHBydi1wdWItYWRkcmVzcyBoZXhcbiAgY29uc3QgcHJ2ID0gJ0ZCM0FBODg3RTBCRTNGQUM5RDc1RTY2MURBRkY0QTdGRTBFOTFBQUIxM0RBOTc3NUNEODU4NkQ3Q0I5Qjc2NDAnO1xuICBjb25zdCBwdWIgPVxuICAgICcwNDZFQkZCOTBDMzk2QjRBM0I5OTJCNzI3Q0I0NzE0QTMyRTJBNkRFNDNGREIzRUMyNjYyODZBQzIyNDZEOEZEMUUyM0UxMkMwREVCNzUyQzYzMUE5MDExQkJGOEI1NkUyRkJBQTIwRTk5RDM5NTJGMEE1NThEMTFGOTZFN0MxQzVEJztcbiAgY29uc3QgYWRkcmVzc0hleCA9ICc0MTJDMkJBNEE5RkY2QzUzMjA3REM1QjY4NkJGRUNGNzVFQTdCODA1NzcnO1xuICBjb25zdCBiYXNlNTggPSAnVER6bTF0Q1hNMllTMVBEYTNHb1hTdnhkeTRBZ3dWYkJQRSc7XG4gIGNvbnN0IGFkZHJCeXRlcyA9IFs2NSwgNDQsIDQzLCAxNjQsIDE2OSwgMjU1LCAxMDgsIDgzLCAzMiwgMTI1LCAxOTcsIDE4MiwgMTM0LCAxOTEsIDIzNiwgMjQ3LCA5NCwgMTY3LCAxODQsIDUsIDExOV07XG5cbiAgLy8gdHggaW5mb3JtYXRpb25cbiAgaXQoJ2JlIGFibGUgdG8gY29udmVydCBoZXggdG8gYnl0ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgYmEgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHdpdGggMHggdG8gYnl0ZXMgJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoJzB4JyArIGhleCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChiYSwgYXJyKTtcbiAgfSk7XG5cbiAgaXQoJ2JlIGFibGUgdG8gY29udmVydCBoZXggdG8gYnl0ZXMnLCAoKSA9PiB7XG4gICAgY29uc3QgaHMgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJ5dGVBcnJheShhcnIpO1xuICAgIGFzc2VydC5lcXVhbChocywgaGV4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhIHB1YiBmcm9tIGEgcHJ2JywgKCkgPT4ge1xuICAgIGNvbnN0IGRlcml2ZWRQdWIgPSBVdGlscy5nZXRQdWJLZXlGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBkZXJpdmVkUHViSGV4ID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoZGVyaXZlZFB1Yik7XG4gICAgYXNzZXJ0LmVxdWFsKGRlcml2ZWRQdWJIZXgsIHB1Yik7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYW4gaGV4IGFkZHJlc3MgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBhZGRyID0gVXRpbHMuZ2V0QWRkcmVzc0Zyb21QcmlLZXkoQnVmZmVyLmZyb20ocHJ2LCAnaGV4JykpO1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJ5dGVBcnJheShhZGRyKTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYW4gYmFzZTU4IGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUJ5dGVBcnJheShhZGRyKTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzIGZyb20gaGV4JywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHI1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KGFkZHJlc3NIZXgpO1xuICAgIGFzc2VydC5lcXVhbChhZGRyNTgsIGJhc2U1OCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgaGV4IGZyb20gYmFzZTU4IGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4QWRkciA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQmFzZTU4QWRkcmVzcyhiYXNlNTgpO1xuICAgIGFzc2VydC5lcXVhbChoZXhBZGRyLCBhZGRyZXNzSGV4KTtcbiAgfSk7XG5cbiAgaXQoJ3ZhbGlkYXRlIGEgaGV4IHN0cmluZycsICgpID0+IHtcbiAgICBjb25zdCBoZXggPSBbJzB4YWZmZCcsICcweDExJ107XG4gICAgaGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQub2soVXRpbHMuaXNWYWxpZEhleChoZXgpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGludmFsaWRIZXggPSBbJzB4YTExJywgJzB4RkZkWVlZJywgJzB4JywgJyddO1xuICAgIGludmFsaWRIZXgubWFwKChoZXgpID0+IHtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChVdGlscy5pc1ZhbGlkSGV4KGhleCksIGZhbHNlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3NpZ24gYSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4VGV4dCA9IEJ1ZmZlci5mcm9tKHR4dCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHNpZ25lZCA9IFV0aWxzLnNpZ25TdHJpbmcoaGV4VGV4dCwgcHJ2KTtcblxuICAgIGFzc2VydC5lcXVhbChzaWduZWRTdHJpbmcsIHNpZ25lZCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY2FsY3VsYXRlIGFuIGFkZHJlc3MgZnJvbSBhIHB1YicsICgpID0+IHtcbiAgICBjb25zdCBwdWJCeXRlcyA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKHB1Yik7XG4gICAgY29uc3QgYnl0ZXMgPSBVdGlscy5nZXRSYXdBZGRyZXNzRnJvbVB1YktleShwdWJCeXRlcyk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChieXRlcywgYWRkckJ5dGVzKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZScsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkTWVzc2FnZSA9IEJ1ZmZlci5mcm9tKHR4dCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZE1lc3NhZ2UsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSwgdHJ1ZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgbWVzc2FnZSBpcyBub3QgaW4gaGV4JywgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gVXRpbHMudmVyaWZ5U2lnbmF0dXJlKHR4dCwgYmFzZTU4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCBpbiBiYXNlNTgnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZFN0cmluZyA9IEJ1ZmZlci5mcm9tKHR4dCkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRTdHJpbmcsIGFkZHJlc3NIZXgsIHNpZ25lZFN0cmluZywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIHNpZ25hdHVyZSBpcyBub3QgaW4gaGV4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBiYXNlNTgsICdhYmMnLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIHRyYW5zYWN0aW9uIGRhdGEnLCAoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKFVuc2lnbmVkVHJhbnNmZXJDb250cmFjdFR4LnR4LnJhd19kYXRhX2hleCk7XG4gICAgYXNzZXJ0LmVxdWFsKGRhdGEudGltZXN0YW1wLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS50aW1lc3RhbXApO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLmV4cGlyYXRpb24sIFVuc2lnbmVkVHJhbnNmZXJDb250cmFjdFR4LnR4LnJhd19kYXRhLmV4cGlyYXRpb24pO1xuICAgIGFzc2VydC5vayhkYXRhLmNvbnRyYWN0cyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVjb2RlIGEgdHJhbnNmZXIgY29udHJhY3QnLCAoKSA9PiB7XG4gICAgY29uc3QgdHggPSBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eDtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgdmFsdWUgPSBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5jb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWU7XG4gICAgY29uc3QgcGFyc2VkQ29udHJhY3QgPSBVdGlscy5kZWNvZGVUcmFuc2ZlckNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLlRyYW5zZmVyQ29udHJhY3RbXTtcblxuICAgIGNvbnN0IHRvQWRkcmVzcyA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHZhbHVlLnRvX2FkZHJlc3MpO1xuICAgIGNvbnN0IG93bmVyQWRkcmVzcyA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KHZhbHVlLm93bmVyX2FkZHJlc3MpO1xuICAgIGNvbnN0IGFtb3VudCA9IHZhbHVlLmFtb3VudDtcblxuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUudG9fYWRkcmVzcywgdG9BZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLm93bmVyX2FkZHJlc3MsIG93bmVyQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5hbW91bnQsIGFtb3VudCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZGVjb2RlIGFuIEFjY291bnRQZXJtaXNzaW9uVXBkYXRlIENvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gU2lnbmVkQWNjb3VudFBlcm1pc3Npb25VcGRhdGVDb250cmFjdFR4O1xuICAgIGNvbnN0IHZhbHVlID0gdHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHJhd1R4ID0gVXRpbHMuZGVjb2RlUmF3VHJhbnNhY3Rpb24odHgucmF3X2RhdGFfaGV4KTtcbiAgICBjb25zdCBwYXJzZWRUeCA9IFV0aWxzLmRlY29kZUFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3QoXG4gICAgICByYXdUeC5jb250cmFjdHNbMF0ucGFyYW1ldGVyLnZhbHVlXG4gICAgKSBhcyBJbnRlcmZhY2UuQWNjb3VudFBlcm1pc3Npb25VcGRhdGVDb250cmFjdDtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXJBZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRUeC5vd25lci50eXBlLCAwKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudGhyZXNob2xkLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlcy5sZW5ndGgsIDEpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRUeC5hY3RpdmVzWzBdLnR5cGUsIDIpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRUeC5hY3RpdmVzWzBdLnRocmVzaG9sZCwgMik7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZW5jb2RlIGFuZCBkZWNvZGUgZGF0YSBwYXJhbWV0ZXJzIGZvciB0cmFuc2ZlcicsICgpID0+IHtcbiAgICBjb25zdCB0eXBlcyA9IFsnYWRkcmVzcycsICd1aW50MjU2J107XG4gICAgY29uc3QgYW1vdW50ID0gJzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICAgIGNvbnN0IHZhbHVlcyA9IFthZGRyZXNzSGV4LCBhbW91bnRdO1xuICAgIGNvbnN0IG1ldGhvZElkID0gJzB4YTkwNTljYmInO1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5lbmNvZGVEYXRhUGFyYW1zKHR5cGVzLCB2YWx1ZXMsIG1ldGhvZElkKTtcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBkYXRhLFxuICAgICAgJ2E5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmMyYmE0YTlmZjZjNTMyMDdkYzViNjg2YmZlY2Y3NWVhN2I4MDU3NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2YzZiOTM1YjhiYmQ0MDAwMDAnXG4gICAgKTtcblxuICAgIGNvbnN0IGRlY29kZWREYXRhID0gVXRpbHMuZGVjb2RlRGF0YVBhcmFtcyhcbiAgICAgIHR5cGVzLFxuICAgICAgJ2E5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmMyYmE0YTlmZjZjNTMyMDdkYzViNjg2YmZlY2Y3NWVhN2I4MDU3NzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2YzZiOTM1YjhiYmQ0MDAwMDAnXG4gICAgKTtcbiAgICBhc3NlcnQuZXF1YWwoZGVjb2RlZERhdGFbMF0sIGFkZHJlc3NIZXgudG9Mb2NhbGVMb3dlckNhc2UoKSk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzFdLnRvU3RyaW5nKCksIGFtb3VudCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY29ycmVjdGx5IG1hcCB0ZXN0bmV0IGFuZCBtYWlubmV0IHRva2VucycsICgpID0+IHtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwodG9rZW5NYWlubmV0Q29udHJhY3RBZGRyZXNzZXMuaW5jbHVkZXMoJ1RTU01IWWVWMnVFOXFZSDk1RHF5b0N1TkN6RUwxTnZVM1MnKSwgdHJ1ZSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuVGVzdG5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUR2tmVXNoZGJBaU5qNUcxbXlucDJtZXEyQmZGNlhTR1BmJyksIHRydWUpO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0Tm9uQmFzZTU4Q2hhcmFjdGVycycsICgpID0+IHtcbiAgICBpdCgncmV0dXJucyBlbXB0eSBhcnJheSBmb3IgdmFsaWQgYmFzZTU4IHN0cmluZ3MnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFV0aWxzLmdldE5vbkJhc2U1OENoYXJhY3RlcnMoJ1RHYWk1dUhnQmNvTEVScnpEWE1lcHFaQjhFdDdEOG5WOEsnKSwgW10pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChVdGlscy5nZXROb25CYXNlNThDaGFyYWN0ZXJzKFV0aWxzLkJBU0U1OF9BTFBIQUJFVCksIFtdKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGludmFsaWQgY2hhcmFjdGVycyBmb3Igbm9uLWJhc2U1OCBjaGFyYWN0ZXJzICgwLCBPLCBJLCBsKScsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoVXRpbHMuZ2V0Tm9uQmFzZTU4Q2hhcmFjdGVycygnVEdhaTV1SGdCY29MRVJyekRYTWVwcVpCOEV0N0Q4blY4MCcpLCBbJzAnXSk7XG4gICAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKFV0aWxzLmdldE5vbkJhc2U1OENoYXJhY3RlcnMoJ1RHYWk1dUhnQmNvTEVScnpEWE1lcHFaQjhFdDdEOG5WOE8nKSwgWydPJ10pO1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChVdGlscy5nZXROb25CYXNlNThDaGFyYWN0ZXJzKCdUR2FpNXVIZ0Jjb0xFUnJ6RFhNZXBxWkI4RXQ3RDhuVjhJJyksIFsnSSddKTtcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoVXRpbHMuZ2V0Tm9uQmFzZTU4Q2hhcmFjdGVycygnVEdhaTV1SGdCY29MRVJyekRYTWVwcVpCOEV0N0Q4blY4bCcpLCBbJ2wnXSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmV0dXJucyB1bmlxdWUgbm9uLWJhc2U1OCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB3aGl0ZXNwYWNlIGFuZCBzeW1ib2xzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChVdGlscy5nZXROb25CYXNlNThDaGFyYWN0ZXJzKCcwME9PSUlsbCAgISEnKSwgWycwJywgJ08nLCAnSScsICdsJywgJyAnLCAnISddKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=verifyTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyTransaction.d.ts","sourceRoot":"","sources":["../../../test/unit/verifyTransaction.ts"],"names":[],"mappings":""}