@bitgo-beta/sdk-coin-trx 1.0.2-beta.201 → 1.0.2-beta.2011

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/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.js +3 -3
  36. package/dist/src/lib/transaction.d.ts +3 -0
  37. package/dist/src/lib/transaction.d.ts.map +1 -1
  38. package/dist/src/lib/transaction.js +115 -6
  39. package/dist/src/lib/transactionBuilder.d.ts +53 -6
  40. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  41. package/dist/src/lib/transactionBuilder.js +114 -21
  42. package/dist/src/lib/undelegateResourceTxBuilder.d.ts +27 -0
  43. package/dist/src/lib/undelegateResourceTxBuilder.d.ts.map +1 -0
  44. package/dist/src/lib/undelegateResourceTxBuilder.js +104 -0
  45. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts +65 -0
  46. package/dist/src/lib/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  47. package/dist/src/lib/unfreezeBalanceTxBuilder.js +210 -0
  48. package/dist/src/lib/utils.d.ts +92 -4
  49. package/dist/src/lib/utils.d.ts.map +1 -1
  50. package/dist/src/lib/utils.js +482 -47
  51. package/dist/src/lib/voteWitnessTxBuilder.d.ts +62 -0
  52. package/dist/src/lib/voteWitnessTxBuilder.d.ts.map +1 -0
  53. package/dist/src/lib/voteWitnessTxBuilder.js +219 -0
  54. package/dist/src/lib/withdrawBuilder.d.ts +49 -0
  55. package/dist/src/lib/withdrawBuilder.d.ts.map +1 -0
  56. package/dist/src/lib/withdrawBuilder.js +167 -0
  57. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts +49 -0
  58. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  59. package/dist/src/lib/withdrawExpireUnfreezeTxBuilder.js +167 -0
  60. package/dist/src/lib/wrappedBuilder.d.ts +67 -1
  61. package/dist/src/lib/wrappedBuilder.d.ts.map +1 -1
  62. package/dist/src/lib/wrappedBuilder.js +114 -4
  63. package/dist/src/trx.d.ts +105 -4
  64. package/dist/src/trx.d.ts.map +1 -1
  65. package/dist/src/trx.js +519 -147
  66. package/dist/src/trxToken.d.ts +2 -2
  67. package/dist/src/trxToken.d.ts.map +1 -1
  68. package/dist/src/trxToken.js +47 -6
  69. package/dist/test/fixtures.d.ts +40 -0
  70. package/dist/test/fixtures.d.ts.map +1 -0
  71. package/dist/test/fixtures.js +46 -0
  72. package/dist/test/resources.d.ts +596 -0
  73. package/dist/test/resources.d.ts.map +1 -0
  74. package/dist/test/resources.js +759 -0
  75. package/dist/test/unit/index.d.ts +2 -0
  76. package/dist/test/unit/index.d.ts.map +1 -0
  77. package/dist/test/unit/index.js +19 -0
  78. package/dist/test/unit/keyPair.d.ts +2 -0
  79. package/dist/test/unit/keyPair.d.ts.map +1 -0
  80. package/dist/test/unit/keyPair.js +163 -0
  81. package/dist/test/unit/transaction.d.ts +2 -0
  82. package/dist/test/unit/transaction.d.ts.map +1 -0
  83. package/dist/test/unit/transaction.js +38 -0
  84. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts +2 -0
  85. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.d.ts.map +1 -0
  86. package/dist/test/unit/transactionBuilder/accountCreateTxBuilder.js +247 -0
  87. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts +2 -0
  88. package/dist/test/unit/transactionBuilder/contractCallBuilder.d.ts.map +1 -0
  89. package/dist/test/unit/transactionBuilder/contractCallBuilder.js +315 -0
  90. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts +2 -0
  91. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.d.ts.map +1 -0
  92. package/dist/test/unit/transactionBuilder/delegateResourceTxBuilder.js +339 -0
  93. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts +2 -0
  94. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/transactionBuilder/freezeBalanceTxBuilder.js +365 -0
  96. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  97. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +55 -0
  99. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts +2 -0
  100. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.d.ts.map +1 -0
  101. package/dist/test/unit/transactionBuilder/undelegateResourceTxBuilder.js +339 -0
  102. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts +2 -0
  103. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.d.ts.map +1 -0
  104. package/dist/test/unit/transactionBuilder/unfreezeBalanceTxBuilder.js +336 -0
  105. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts +2 -0
  106. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.d.ts.map +1 -0
  107. package/dist/test/unit/transactionBuilder/voteWitnessTxBuilder.js +277 -0
  108. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts +2 -0
  109. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.d.ts.map +1 -0
  110. package/dist/test/unit/transactionBuilder/withdrawBalanceBuilder.js +213 -0
  111. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder/withdrawExpireUnfreezeTxBuilder.js +213 -0
  114. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts +2 -0
  115. package/dist/test/unit/transactionBuilder/wrappedBuilder.d.ts.map +1 -0
  116. package/dist/test/unit/transactionBuilder/wrappedBuilder.js +50 -0
  117. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  118. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  119. package/dist/test/unit/transactionBuilder.js +178 -0
  120. package/dist/test/unit/trx.d.ts +2 -0
  121. package/dist/test/unit/trx.d.ts.map +1 -0
  122. package/dist/test/unit/trx.js +639 -0
  123. package/dist/test/unit/trxToken.d.ts +2 -0
  124. package/dist/test/unit/trxToken.d.ts.map +1 -0
  125. package/dist/test/unit/trxToken.js +119 -0
  126. package/dist/test/unit/util.d.ts +2 -0
  127. package/dist/test/unit/util.d.ts.map +1 -0
  128. package/dist/test/unit/util.js +141 -0
  129. package/dist/test/unit/verifyTransaction.d.ts +2 -0
  130. package/dist/test/unit/verifyTransaction.d.ts.map +1 -0
  131. package/dist/test/unit/verifyTransaction.js +593 -0
  132. package/dist/tsconfig.tsbuildinfo +1 -0
  133. package/package.json +22 -16
  134. package/.eslintignore +0 -5
  135. package/.mocharc.yml +0 -8
  136. package/CHANGELOG.md +0 -104
  137. package/resources/README.md +0 -31
  138. package/resources/protobuf/Contract.proto +0 -256
  139. package/resources/protobuf/Discover.proto +0 -44
  140. package/resources/protobuf/tron.d.ts +0 -11205
  141. package/resources/protobuf/tron.js +0 -33480
  142. 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,119 @@
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 throw when amount does not match', async function () {
55
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
56
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
57
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
58
+ txParams: { recipients: [{ address: recipientBase58, amount: '999' }] },
59
+ walletType: 'tss',
60
+ }), { message: 'transaction amount in txPrebuild does not match the value given by client' });
61
+ });
62
+ (0, node_test_1.it)('should throw when recipient address does not match', async function () {
63
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
64
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
65
+ txParams: { recipients: [{ address: 'TLWh67P93KgtnZNCtGnEHM1H33Nhq2uvvN', amount: TRC20_AMOUNT }] },
66
+ walletType: 'tss',
67
+ }), { message: 'destination address does not match with the recipient address' });
68
+ });
69
+ (0, node_test_1.it)('should throw when recipients is empty', async function () {
70
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
71
+ txPrebuild: { txHex: TRC20_RAW_DATA_HEX },
72
+ txParams: { recipients: [] },
73
+ walletType: 'tss',
74
+ }), { message: 'missing or invalid required property recipients' });
75
+ });
76
+ (0, node_test_1.it)('should throw when contract type is not TriggerSmartContract', async function () {
77
+ // Use a native TRX Transfer protobuf as txHex — TrxToken only handles TriggerSmartContract
78
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
79
+ const nativeTrxRawDataHex = lib_1.Utils.generateRawDataHex({
80
+ contract: [
81
+ {
82
+ parameter: {
83
+ value: {
84
+ amount: 100000000,
85
+ owner_address: '4173a5993cd182ae152adad8203163f780c65a8aa5',
86
+ to_address: TRC20_RECIPIENT_HEX,
87
+ },
88
+ type_url: 'type.googleapis.com/protocol.TransferContract',
89
+ },
90
+ type: 'TransferContract',
91
+ },
92
+ ],
93
+ refBlockBytes: 'c8cf',
94
+ refBlockHash: '89177fd84c5d9196',
95
+ expiration: Date.now() + 3600000,
96
+ timestamp: Date.now(),
97
+ });
98
+ await node_assert_1.default.rejects(tokenCoin.verifyTransaction({
99
+ txPrebuild: { txHex: nativeTrxRawDataHex },
100
+ txParams: { recipients: [{ address: recipientBase58, amount: '100000000' }] },
101
+ walletType: 'tss',
102
+ }), { message: /Expected TriggerSmartContract for TRC20 token transfer/ });
103
+ });
104
+ });
105
+ (0, node_test_1.describe)('non-TSS wallet — builder-based validation (existing path)', () => {
106
+ (0, node_test_1.it)('should validate a correct non-TSS TRC20 transfer using txBuilder', async function () {
107
+ // The non-TSS path uses getBuilder().from(rawTx).build() and checks tx.outputs[0]
108
+ // This test uses the full JSON tx format that the builder understands.
109
+ 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"]}';
110
+ const recipientBase58 = lib_1.Utils.getBase58AddressFromHex(TRC20_RECIPIENT_HEX);
111
+ const result = await tokenCoin.verifyTransaction({
112
+ txPrebuild: { txHex },
113
+ txParams: { recipients: [{ address: recipientBase58, amount: TRC20_AMOUNT }] },
114
+ });
115
+ node_assert_1.default.strictEqual(result, true);
116
+ });
117
+ });
118
+ });
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ4VG9rZW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJ4VG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4REFBaUM7QUFDakMseUNBQWlEO0FBQ2pELGlEQUErQztBQUMvQyxtREFBK0Q7QUFDL0QsaURBQTZDO0FBQzdDLHVDQUFvQztBQUNwQyxpREFBOEM7QUFDOUMseUNBQXNDO0FBQ3RDLHVDQUFzQztBQUV0Qyw2RUFBNkU7QUFDN0UseURBQXlEO0FBQ3pELHlEQUF5RDtBQUN6RCxrR0FBa0c7QUFDbEcsTUFBTSxrQkFBa0IsR0FDdEIsd2FBQXdhLENBQUM7QUFFM2EseUVBQXlFO0FBQ3pFLE1BQU0sbUJBQW1CLEdBQUcsNENBQTRDLENBQUM7QUFDekUsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDO0FBRWpDLElBQUEsb0JBQVEsRUFBQyw2QkFBNkIsRUFBRTtJQUN0QyxNQUFNLEtBQUssR0FBaUIsb0JBQVMsQ0FBQyxRQUFRLENBQUMsa0JBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFaEQsSUFBSSxTQUFtQixDQUFDO0lBRXhCLElBQUEsa0JBQU0sRUFBQztRQUNMLE1BQU0sVUFBVSxHQUFHLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQ2pGLHFCQUFNLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxrQ0FB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QkFDN0UsVUFBVSxFQUFFLEtBQUs7YUFDWCxDQUFDLEVBQ1QsRUFBRSxPQUFPLEVBQUUsd0RBQXdELEVBQUUsQ0FDdEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLG9CQUFRLEVBQUMsMkRBQTJELEVBQUUsR0FBRyxFQUFFO1FBQ3pFLElBQUEsY0FBRSxFQUFDLGtFQUFrRSxFQUFFLEtBQUs7WUFDMUUsa0ZBQWtGO1lBQ2xGLHVFQUF1RTtZQUN2RSxNQUFNLEtBQUssR0FDVCxndENBQWd0QyxDQUFDO1lBQ250QyxNQUFNLGVBQWUsR0FBRyxXQUFLLENBQUMsdUJBQXVCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUUzRSxNQUFNLE1BQU0sR0FBRyxNQUFNLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQztnQkFDL0MsVUFBVSxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUNyQixRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUU7YUFDeEUsQ0FBQyxDQUFDO1lBRVYscUJBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGl0LCBiZWZvcmUgfSBmcm9tICdub2RlOnRlc3QnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstYXBpJztcbmltcG9ydCB7IFRlc3RCaXRHb0FQSSwgVGVzdEJpdEdvIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLXRlc3QnO1xuaW1wb3J0IHsgdG9rZW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcnggfSBmcm9tICcuLi8uLi9zcmMvdHJ4JztcbmltcG9ydCB7IFRyeFRva2VuIH0gZnJvbSAnLi4vLi4vc3JjL3RyeFRva2VuJztcbmltcG9ydCB7IFR0cnggfSBmcm9tICcuLi8uLi9zcmMvdHRyeCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWInO1xuXG4vLyBSZWFsIFRyaWdnZXJTbWFydENvbnRyYWN0IHByb3RvYnVmIHJhd19kYXRhX2hleCBlbmNvZGluZyBhIFRSQzIwIHRyYW5zZmVyOlxuLy8gICBvd25lcjogICAgNDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjXG4vLyAgIGNvbnRyYWN0OiA0MTQyYTFlMzlhZWZhNDkyOTBmMmIzZjllZDY4OGQ3Y2VjZjg2Y2Q2ZTBcbi8vICAgZGF0YTogICAgIGE5MDU5Y2JiICsgYWJpKGFkZHJlc3M9ODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OSwgdWludDI1Nj0xMDAwMDAwMDApXG5jb25zdCBUUkMyMF9SQVdfREFUQV9IRVggPVxuICAnMGEwMjU3OGIyMjA4NjExM2JiOWFjMzUxNDMyYjQwODhlYWU3YTZkZTMwNWFhZTAxMDgxZjEyYTkwMTBhMzE3NDc5NzA2NTJlNjc2ZjZmNjc2YzY1NjE3MDY5NzMyZTYzNmY2ZDJmNzA3MjZmNzQ2ZjYzNmY2YzJlNTQ3MjY5Njc2NzY1NzI1MzZkNjE3Mjc0NDM2ZjZlNzQ3MjYxNjM3NDEyNzQwYTE1NDFjNTFmYmVlYTc4OTEwYjE1YjFkM2U4YTliNjI5MTRjYTk0ZDFhNGFjMTIxNTQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMDIyNDRhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwNzA4ODhkOGNhNWRlMzA5MDAxYzBjMzkzMDcnO1xuXG4vLyBSZWNpcGllbnQgYWRkcmVzcyBkZWNvZGVkIGZyb20gdGhlIEFCSSBkYXRhIGFib3ZlICg0MSBwcmVmaXgg4oaSIGJhc2U1OClcbmNvbnN0IFRSQzIwX1JFQ0lQSUVOVF9IRVggPSAnNDE4NDgzNjE4Y2E4NWMzNWE5YjkyM2Q5OGJlYmNhNzE4ZjVhMWRiMjc5JztcbmNvbnN0IFRSQzIwX0FNT1VOVCA9ICcxMDAwMDAwMDAnO1xuXG5kZXNjcmliZSgnVHJ4VG9rZW4gdmVyaWZ5VHJhbnNhY3Rpb246JywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBiaXRnbzogVGVzdEJpdEdvQVBJID0gVGVzdEJpdEdvLmRlY29yYXRlKEJpdEdvQVBJLCB7IGVudjogJ3Rlc3QnIH0pO1xuICBiaXRnby5pbml0aWFsaXplVGVzdFZhcnMoKTtcbiAgYml0Z28uc2FmZVJlZ2lzdGVyKCd0cngnLCBUcnguY3JlYXRlSW5zdGFuY2UpO1xuICBiaXRnby5zYWZlUmVnaXN0ZXIoJ3R0cngnLCBUdHJ4LmNyZWF0ZUluc3RhbmNlKTtcblxuICBsZXQgdG9rZW5Db2luOiBUcnhUb2tlbjtcblxuICBiZWZvcmUoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHVzZHRDb25maWcgPSB0b2tlbnMudGVzdG5ldC50cngudG9rZW5zLmZpbmQoKHQpID0+IHQudHlwZSA9PT0gJ3R0cng6dXNkdCcpO1xuICAgIGFzc2VydC5vayh1c2R0Q29uZmlnLCAndHRyeDp1c2R0IHRva2VuIGNvbmZpZyBub3QgZm91bmQnKTtcbiAgICB0b2tlbkNvaW4gPSBuZXcgVHJ4VG9rZW4oYml0Z28sIHVzZHRDb25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnVFNTIHdhbGxldCDigJQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgdmFsaWRhdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIGEgY29ycmVjdCBUUkMyMCB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlY2lwaWVudEJhc2U1OCA9IFV0aWxzLmdldEJhc2U1OEFkZHJlc3NGcm9tSGV4KFRSQzIwX1JFQ0lQSUVOVF9IRVgpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHZhbGlkYXRlIHdoZW4gdHhIZXggaXMgYSBzZXJpYWxpemVkIEpTT04gKHByZWJ1aWxkQW5kU2lnblRyYW5zYWN0aW9uIHBhdGgpJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBzZXJpYWxpemVkVHhIZXggPSBKU09OLnN0cmluZ2lmeSh7IHR4SUQ6ICdhYmMnLCByYXdfZGF0YV9oZXg6IFRSQzIwX1JBV19EQVRBX0hFWCwgcmF3X2RhdGE6IHt9IH0pO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBzZXJpYWxpemVkVHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgIH0gYXMgYW55KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gYW1vdW50IGRvZXMgbm90IG1hdGNoJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKFxuICAgICAgICB0b2tlbkNvaW4udmVyaWZ5VHJhbnNhY3Rpb24oe1xuICAgICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXg6IFRSQzIwX1JBV19EQVRBX0hFWCB9LFxuICAgICAgICAgIHR4UGFyYW1zOiB7IHJlY2lwaWVudHM6IFt7IGFkZHJlc3M6IHJlY2lwaWVudEJhc2U1OCwgYW1vdW50OiAnOTk5JyB9XSB9LFxuICAgICAgICAgIHdhbGxldFR5cGU6ICd0c3MnLFxuICAgICAgICB9IGFzIGFueSksXG4gICAgICAgIHsgbWVzc2FnZTogJ3RyYW5zYWN0aW9uIGFtb3VudCBpbiB0eFByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIHRoZSB2YWx1ZSBnaXZlbiBieSBjbGllbnQnIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IHdoZW4gcmVjaXBpZW50IGFkZHJlc3MgZG9lcyBub3QgbWF0Y2gnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBUUkMyMF9SQVdfREFUQV9IRVggfSxcbiAgICAgICAgICB0eFBhcmFtczogeyByZWNpcGllbnRzOiBbeyBhZGRyZXNzOiAnVExXaDY3UDkzS2d0blpOQ3RHbkVITTFIMzNOaHEydXZ2TicsIGFtb3VudDogVFJDMjBfQU1PVU5UIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAnZGVzdGluYXRpb24gYWRkcmVzcyBkb2VzIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNpcGllbnQgYWRkcmVzcycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiByZWNpcGllbnRzIGlzIGVtcHR5JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoXG4gICAgICAgIHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgICAgdHhQcmVidWlsZDogeyB0eEhleDogVFJDMjBfUkFXX0RBVEFfSEVYIH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW10gfSxcbiAgICAgICAgICB3YWxsZXRUeXBlOiAndHNzJyxcbiAgICAgICAgfSBhcyBhbnkpLFxuICAgICAgICB7IG1lc3NhZ2U6ICdtaXNzaW5nIG9yIGludmFsaWQgcmVxdWlyZWQgcHJvcGVydHkgcmVjaXBpZW50cycgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgd2hlbiBjb250cmFjdCB0eXBlIGlzIG5vdCBUcmlnZ2VyU21hcnRDb250cmFjdCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFVzZSBhIG5hdGl2ZSBUUlggVHJhbnNmZXIgcHJvdG9idWYgYXMgdHhIZXgg4oCUIFRyeFRva2VuIG9ubHkgaGFuZGxlcyBUcmlnZ2VyU21hcnRDb250cmFjdFxuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG4gICAgICBjb25zdCBuYXRpdmVUcnhSYXdEYXRhSGV4ID0gVXRpbHMuZ2VuZXJhdGVSYXdEYXRhSGV4KHtcbiAgICAgICAgY29udHJhY3Q6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXJhbWV0ZXI6IHtcbiAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICBhbW91bnQ6IDEwMDAwMDAwMCxcbiAgICAgICAgICAgICAgICBvd25lcl9hZGRyZXNzOiAnNDE3M2E1OTkzY2QxODJhZTE1MmFkYWQ4MjAzMTYzZjc4MGM2NWE4YWE1JyxcbiAgICAgICAgICAgICAgICB0b19hZGRyZXNzOiBUUkMyMF9SRUNJUElFTlRfSEVYLFxuICAgICAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgICAgICAgdHlwZV91cmw6ICd0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyYW5zZmVyQ29udHJhY3QnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHR5cGU6ICdUcmFuc2ZlckNvbnRyYWN0JyxcbiAgICAgICAgICB9IGFzIGFueSxcbiAgICAgICAgXSxcbiAgICAgICAgcmVmQmxvY2tCeXRlczogJ2M4Y2YnLFxuICAgICAgICByZWZCbG9ja0hhc2g6ICc4OTE3N2ZkODRjNWQ5MTk2JyxcbiAgICAgICAgZXhwaXJhdGlvbjogRGF0ZS5ub3coKSArIDM2MDAwMDAsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhcbiAgICAgICAgdG9rZW5Db2luLnZlcmlmeVRyYW5zYWN0aW9uKHtcbiAgICAgICAgICB0eFByZWJ1aWxkOiB7IHR4SGV4OiBuYXRpdmVUcnhSYXdEYXRhSGV4IH0sXG4gICAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6ICcxMDAwMDAwMDAnIH1dIH0sXG4gICAgICAgICAgd2FsbGV0VHlwZTogJ3RzcycsXG4gICAgICAgIH0gYXMgYW55KSxcbiAgICAgICAgeyBtZXNzYWdlOiAvRXhwZWN0ZWQgVHJpZ2dlclNtYXJ0Q29udHJhY3QgZm9yIFRSQzIwIHRva2VuIHRyYW5zZmVyLyB9XG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9uLVRTUyB3YWxsZXQg4oCUIGJ1aWxkZXItYmFzZWQgdmFsaWRhdGlvbiAoZXhpc3RpbmcgcGF0aCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBhIGNvcnJlY3Qgbm9uLVRTUyBUUkMyMCB0cmFuc2ZlciB1c2luZyB0eEJ1aWxkZXInLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBUaGUgbm9uLVRTUyBwYXRoIHVzZXMgZ2V0QnVpbGRlcigpLmZyb20ocmF3VHgpLmJ1aWxkKCkgYW5kIGNoZWNrcyB0eC5vdXRwdXRzWzBdXG4gICAgICAvLyBUaGlzIHRlc3QgdXNlcyB0aGUgZnVsbCBKU09OIHR4IGZvcm1hdCB0aGF0IHRoZSBidWlsZGVyIHVuZGVyc3RhbmRzLlxuICAgICAgY29uc3QgdHhIZXggPVxuICAgICAgICAne1wicmF3X2RhdGFcIjp7XCJjb250cmFjdFR5cGVcIjoyLFwiY29udHJhY3RcIjpbe1wicGFyYW1ldGVyXCI6e1widmFsdWVcIjp7XCJkYXRhXCI6XCJhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg0ODM2MThjYTg1YzM1YTliOTIzZDk4YmViY2E3MThmNWExZGIyNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ZjVlMTAwXCIsXCJvd25lcl9hZGRyZXNzXCI6XCI0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWNcIixcImNvbnRyYWN0X2FkZHJlc3NcIjpcIjQxNDJhMWUzOWFlZmE0OTI5MGYyYjNmOWVkNjg4ZDdjZWNmODZjZDZlMFwifSxcInR5cGVfdXJsXCI6XCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvY29sLlRyaWdnZXJTbWFydENvbnRyYWN0XCJ9LFwidHlwZVwiOlwiVHJpZ2dlclNtYXJ0Q29udHJhY3RcIn1dLFwiZXhwaXJhdGlvblwiOjE2NzQ1ODE3Njc0MzIsXCJ0aW1lc3RhbXBcIjoxNjc0NTc4MTY3NDMyLFwicmVmX2Jsb2NrX2J5dGVzXCI6XCI1NzhiXCIsXCJyZWZfYmxvY2tfaGFzaFwiOlwiNjExM2JiOWFjMzUxNDMyYlwiLFwiZmVlX2xpbWl0XCI6MTUwMDAwMDB9LFwicmF3X2RhdGFfaGV4XCI6XCIwYTAyNTc4YjIyMDg2MTEzYmI5YWMzNTE0MzJiNDA4OGVhZTdhNmRlMzA1YWFlMDEwODFmMTJhOTAxMGEzMTc0Nzk3MDY1MmU2NzZmNmY2NzZjNjU2MTcwNjk3MzJlNjM2ZjZkMmY3MDcyNmY3NDZmNjM2ZjZjMmU1NDcyNjk2NzY3NjU3MjUzNmQ2MTcyNzQ0MzZmNmU3NDcyNjE2Mzc0MTI3NDBhMTU0MWM1MWZiZWVhNzg5MTBiMTViMWQzZThhOWI2MjkxNGNhOTRkMWE0YWMxMjE1NDE0MmExZTM5YWVmYTQ5MjkwZjJiM2Y5ZWQ2ODhkN2NlY2Y4NmNkNmUwMjI0NGE5MDU5Y2JiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODQ4MzYxOGNhODVjMzVhOWI5MjNkOThiZWJjYTcxOGY1YTFkYjI3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDVmNWUxMDA3MDg4OGQ4Y2E1ZGUzMDkwMDFjMGMzOTMwN1wiLFwidHhJRFwiOlwiZmUyMWM0OWY0ZmViZDkwODkxMjVlM2EwMDY5NDNjMTQ1NzIxZDhmY2I3YWI4NDEzNmY4YzY2NjNmZjkyZjhlZFwiLFwic2lnbmF0dXJlXCI6W1wiMDc3NWNkZTMwMjY4OWViODI5Mzg4M2M2NmE4OWIzMWU4MGQ2MDhiZmMzYWQzYzI4M2I2NGE0OTBlYTRjYzcxMmM1NWEyZmQyZTYyYzc1ODQzZGQ3ZTc3ZDhjNGNiNTJlMGYzNzFmYmIyOWIzMzJjMjU5ZjhjYjYzYzJlNjE5NTMwMVwiXX0nO1xuICAgICAgY29uc3QgcmVjaXBpZW50QmFzZTU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgoVFJDMjBfUkVDSVBJRU5UX0hFWCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRva2VuQ29pbi52ZXJpZnlUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4UHJlYnVpbGQ6IHsgdHhIZXggfSxcbiAgICAgICAgdHhQYXJhbXM6IHsgcmVjaXBpZW50czogW3sgYWRkcmVzczogcmVjaXBpZW50QmFzZTU4LCBhbW91bnQ6IFRSQzIwX0FNT1VOVCB9XSB9LFxuICAgICAgfSBhcyBhbnkpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCB0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -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,141 @@
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
+ });
141
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvdW5pdC91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUNBQXlDO0FBQ3pDLG9EQUE0QjtBQUM1QixtQ0FBNkM7QUFFN0MsNENBQW1HO0FBQ25HLCtDQUFtRztBQUVuRyxJQUFBLG9CQUFRLEVBQUMscUJBQXFCLEVBQUU7SUFDOUIsaUJBQWlCO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3RILE1BQU0sR0FBRyxHQUFHLGtFQUFrRSxDQUFDO0lBQy9FLE1BQU0sR0FBRyxHQUFHLDBCQUEwQixDQUFDO0lBQ3ZDLE1BQU0sWUFBWSxHQUNoQixzSUFBc0ksQ0FBQztJQUV6SSxzQkFBc0I7SUFDdEIsTUFBTSxHQUFHLEdBQUcsa0VBQWtFLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQ1Asb0lBQW9JLENBQUM7SUFDdkksTUFBTSxVQUFVLEdBQUcsNENBQTRDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsb0NBQW9DLENBQUM7SUFDcEQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdB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Q0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUM3RCxnQkFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFBLGNBQUUsRUFBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7UUFDekQsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkcsZ0JBQU0sQ0FBQyxXQUFXLENBQUMscUNBQTZCLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlc2NyaWJlLCBpdCB9IGZyb20gJ25vZGU6dGVzdCc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBJbnRlcmZhY2UsIFV0aWxzIH0gZnJvbSAnLi4vLi4vc3JjJztcblxuaW1wb3J0IHsgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgsIFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeCB9IGZyb20gJy4uL3Jlc291cmNlcyc7XG5pbXBvcnQgeyB0b2tlbk1haW5uZXRDb250cmFjdEFkZHJlc3NlcywgdG9rZW5UZXN0bmV0Q29udHJhY3RBZGRyZXNzZXMgfSBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuZGVzY3JpYmUoJ1V0aWwgbGlicmFyeSBzaG91bGQnLCBmdW5jdGlvbiAoKSB7XG4gIC8vIGFyYml0cmFyeSB0ZXh0XG4gIGNvbnN0IGFyciA9IFsxMjcsIDI1NSwgMzEsIDE5MiwgMywgMTI2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXTtcbiAgY29uc3QgaGV4ID0gJzdGRkYxRkMwMDM3RTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnO1xuICBjb25zdCB0eHQgPSAnYXJiaXRyYXJ5IHN0cmluZyB0byBzaWduJztcbiAgY29uc3Qgc2lnbmVkU3RyaW5nID1cbiAgICAnMHg5NDI0MTEzZjMyYzE3YjZmZmJlZWUwMjRlMWE1NGI2OTkxZDc1NmU4MmY2NmNjYTE2YTQxMjMxZmRmYTI3MGQwM2IwOGU4MzNmNWRiYmQ1Y2M4Njg5NmMyZTVlYTZjNzRkMmUyOTJjZGEyMWY3MTcxNjRmOTk0ZmNkZjI4NDg2ZDFiJztcblxuICAvLyBwcnYtcHViLWFkZHJlc3MgaGV4XG4gIGNvbnN0IHBydiA9ICdGQjNBQTg4N0UwQkUzRkFDOUQ3NUU2NjFEQUZGNEE3RkUwRTkxQUFCMTNEQTk3NzVDRDg1ODZEN0NCOUI3NjQwJztcbiAgY29uc3QgcHViID1cbiAgICAnMDQ2RUJGQjkwQzM5NkI0QTNCOTkyQjcyN0NCNDcxNEEzMkUyQTZERTQzRkRCM0VDMjY2Mjg2QUMyMjQ2RDhGRDFFMjNFMTJDMERFQjc1MkM2MzFBOTAxMUJCRjhCNTZFMkZCQUEyMEU5OUQzOTUyRjBBNTU4RDExRjk2RTdDMUM1RCc7XG4gIGNvbnN0IGFkZHJlc3NIZXggPSAnNDEyQzJCQTRBOUZGNkM1MzIwN0RDNUI2ODZCRkVDRjc1RUE3QjgwNTc3JztcbiAgY29uc3QgYmFzZTU4ID0gJ1REem0xdENYTTJZUzFQRGEzR29YU3Z4ZHk0QWd3VmJCUEUnO1xuICBjb25zdCBhZGRyQnl0ZXMgPSBbNjUsIDQ0LCA0MywgMTY0LCAxNjksIDI1NSwgMTA4LCA4MywgMzIsIDEyNSwgMTk3LCAxODIsIDEzNCwgMTkxLCAyMzYsIDI0NywgOTQsIDE2NywgMTg0LCA1LCAxMTldO1xuXG4gIC8vIHR4IGluZm9ybWF0aW9uXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGJhID0gVXRpbHMuZ2V0Qnl0ZUFycmF5RnJvbUhleEFkZHJlc3MoaGV4KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKGJhLCBhcnIpO1xuICB9KTtcblxuICBpdCgnYmUgYWJsZSB0byBjb252ZXJ0IGhleCB3aXRoIDB4IHRvIGJ5dGVzICcsICgpID0+IHtcbiAgICBjb25zdCBiYSA9IFV0aWxzLmdldEJ5dGVBcnJheUZyb21IZXhBZGRyZXNzKCcweCcgKyBoZXgpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYmEsIGFycik7XG4gIH0pO1xuXG4gIGl0KCdiZSBhYmxlIHRvIGNvbnZlcnQgaGV4IHRvIGJ5dGVzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhzID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYXJyKTtcbiAgICBhc3NlcnQuZXF1YWwoaHMsIGhleCk7XG4gIH0pO1xuXG4gIGl0KCdnZXQgYSBwdWIgZnJvbSBhIHBydicsICgpID0+IHtcbiAgICBjb25zdCBkZXJpdmVkUHViID0gVXRpbHMuZ2V0UHViS2V5RnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgZGVyaXZlZFB1YkhleCA9IFV0aWxzLmdldEhleEFkZHJlc3NGcm9tQnl0ZUFycmF5KGRlcml2ZWRQdWIpO1xuICAgIGFzc2VydC5lcXVhbChkZXJpdmVkUHViSGV4LCBwdWIpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGhleCBhZGRyZXNzIGZyb20gYSBwcnYnLCAoKSA9PiB7XG4gICAgY29uc3QgYWRkciA9IFV0aWxzLmdldEFkZHJlc3NGcm9tUHJpS2V5KEJ1ZmZlci5mcm9tKHBydiwgJ2hleCcpKTtcbiAgICBjb25zdCBoZXhBZGRyID0gVXRpbHMuZ2V0SGV4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGhleEFkZHIsIGFkZHJlc3NIZXgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGFuIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGFkZHIgPSBVdGlscy5nZXRBZGRyZXNzRnJvbVByaUtleShCdWZmZXIuZnJvbShwcnYsICdoZXgnKSk7XG4gICAgY29uc3QgYWRkcjU4ID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21CeXRlQXJyYXkoYWRkcik7XG4gICAgYXNzZXJ0LmVxdWFsKGFkZHI1OCwgYmFzZTU4KTtcbiAgfSk7XG5cbiAgaXQoJ2dldCBhbiBiYXNlNTggYWRkcmVzcyBmcm9tIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBhZGRyNTggPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleChhZGRyZXNzSGV4KTtcbiAgICBhc3NlcnQuZXF1YWwoYWRkcjU4LCBiYXNlNTgpO1xuICB9KTtcblxuICBpdCgnZ2V0IGhleCBmcm9tIGJhc2U1OCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEFkZHIgPSBVdGlscy5nZXRIZXhBZGRyZXNzRnJvbUJhc2U1OEFkZHJlc3MoYmFzZTU4KTtcbiAgICBhc3NlcnQuZXF1YWwoaGV4QWRkciwgYWRkcmVzc0hleCk7XG4gIH0pO1xuXG4gIGl0KCd2YWxpZGF0ZSBhIGhleCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4ID0gWycweGFmZmQnLCAnMHgxMSddO1xuICAgIGhleC5tYXAoKGhleCkgPT4ge1xuICAgICAgYXNzZXJ0Lm9rKFV0aWxzLmlzVmFsaWRIZXgoaGV4KSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnZhbGlkSGV4ID0gWycweGExMScsICcweEZGZFlZWScsICcweCcsICcnXTtcbiAgICBpbnZhbGlkSGV4Lm1hcCgoaGV4KSA9PiB7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMuaXNWYWxpZEhleChoZXgpLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaWduIGEgc3RyaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IGhleFRleHQgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCBzaWduZWQgPSBVdGlscy5zaWduU3RyaW5nKGhleFRleHQsIHBydik7XG5cbiAgICBhc3NlcnQuZXF1YWwoc2lnbmVkU3RyaW5nLCBzaWduZWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBhbiBhZGRyZXNzIGZyb20gYSBwdWInLCAoKSA9PiB7XG4gICAgY29uc3QgcHViQnl0ZXMgPSBVdGlscy5nZXRCeXRlQXJyYXlGcm9tSGV4QWRkcmVzcyhwdWIpO1xuICAgIGNvbnN0IGJ5dGVzID0gVXRpbHMuZ2V0UmF3QWRkcmVzc0Zyb21QdWJLZXkocHViQnl0ZXMpO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoYnl0ZXMsIGFkZHJCeXRlcyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UnLCAoKSA9PiB7XG4gICAgY29uc3QgaGV4RW5jb2RlZE1lc3NhZ2UgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoVXRpbHMudmVyaWZ5U2lnbmF0dXJlKGhleEVuY29kZWRNZXNzYWdlLCBiYXNlNTgsIHNpZ25lZFN0cmluZywgdHJ1ZSksIHRydWUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGZhaWwgdG8gdmVyaWZ5IGEgc2lnbmVkIG1lc3NhZ2UgaWYgdGhlIG1lc3NhZ2UgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZSh0eHQsIGJhc2U1OCwgc2lnbmVkU3RyaW5nLCB0cnVlKSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZmFpbCB0byB2ZXJpZnkgYSBzaWduZWQgbWVzc2FnZSBpZiB0aGUgYWRkcmVzcyBpcyBub3QgaW4gYmFzZTU4JywgKCkgPT4ge1xuICAgIGNvbnN0IGhleEVuY29kZWRTdHJpbmcgPSBCdWZmZXIuZnJvbSh0eHQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IFV0aWxzLnZlcmlmeVNpZ25hdHVyZShoZXhFbmNvZGVkU3RyaW5nLCBhZGRyZXNzSGV4LCBzaWduZWRTdHJpbmcsIHRydWUpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBmYWlsIHRvIHZlcmlmeSBhIHNpZ25lZCBtZXNzYWdlIGlmIHRoZSBzaWduYXR1cmUgaXMgbm90IGluIGhleCcsICgpID0+IHtcbiAgICBjb25zdCBoZXhFbmNvZGVkU3RyaW5nID0gQnVmZmVyLmZyb20odHh0KS50b1N0cmluZygnaGV4Jyk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiBVdGlscy52ZXJpZnlTaWduYXR1cmUoaGV4RW5jb2RlZFN0cmluZywgYmFzZTU4LCAnYWJjJywgdHJ1ZSkpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiB0cmFuc2FjdGlvbiBkYXRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbihVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YV9oZXgpO1xuICAgIGFzc2VydC5lcXVhbChkYXRhLnRpbWVzdGFtcCwgVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEudGltZXN0YW1wKTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YS5leHBpcmF0aW9uLCBVbnNpZ25lZFRyYW5zZmVyQ29udHJhY3RUeC50eC5yYXdfZGF0YS5leHBpcmF0aW9uKTtcbiAgICBhc3NlcnQub2soZGF0YS5jb250cmFjdHMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhIHRyYW5zZmVyIGNvbnRyYWN0JywgKCkgPT4ge1xuICAgIGNvbnN0IHR4ID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHg7XG4gICAgY29uc3QgcmF3VHggPSBVdGlscy5kZWNvZGVSYXdUcmFuc2FjdGlvbih0eC5yYXdfZGF0YV9oZXgpO1xuICAgIGNvbnN0IHZhbHVlID0gVW5zaWduZWRUcmFuc2ZlckNvbnRyYWN0VHgudHgucmF3X2RhdGEuY29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlO1xuICAgIGNvbnN0IHBhcnNlZENvbnRyYWN0ID0gVXRpbHMuZGVjb2RlVHJhbnNmZXJDb250cmFjdChcbiAgICAgIHJhd1R4LmNvbnRyYWN0c1swXS5wYXJhbWV0ZXIudmFsdWVcbiAgICApIGFzIEludGVyZmFjZS5UcmFuc2ZlckNvbnRyYWN0W107XG5cbiAgICBjb25zdCB0b0FkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS50b19hZGRyZXNzKTtcbiAgICBjb25zdCBvd25lckFkZHJlc3MgPSBVdGlscy5nZXRCYXNlNThBZGRyZXNzRnJvbUhleCh2YWx1ZS5vd25lcl9hZGRyZXNzKTtcbiAgICBjb25zdCBhbW91bnQgPSB2YWx1ZS5hbW91bnQ7XG5cbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkQ29udHJhY3RbMF0ucGFyYW1ldGVyLnZhbHVlLnRvX2FkZHJlc3MsIHRvQWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZENvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZS5vd25lcl9hZGRyZXNzLCBvd25lckFkZHJlc3MpO1xuICAgIGFzc2VydC5lcXVhbChwYXJzZWRDb250cmFjdFswXS5wYXJhbWV0ZXIudmFsdWUuYW1vdW50LCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlY29kZSBhbiBBY2NvdW50UGVybWlzc2lvblVwZGF0ZSBDb250cmFjdCcsICgpID0+IHtcbiAgICBjb25zdCB0eCA9IFNpZ25lZEFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3RUeDtcbiAgICBjb25zdCB2YWx1ZSA9IHR4LnJhd19kYXRhLmNvbnRyYWN0WzBdLnBhcmFtZXRlci52YWx1ZTtcbiAgICBjb25zdCByYXdUeCA9IFV0aWxzLmRlY29kZVJhd1RyYW5zYWN0aW9uKHR4LnJhd19kYXRhX2hleCk7XG4gICAgY29uc3QgcGFyc2VkVHggPSBVdGlscy5kZWNvZGVBY2NvdW50UGVybWlzc2lvblVwZGF0ZUNvbnRyYWN0KFxuICAgICAgcmF3VHguY29udHJhY3RzWzBdLnBhcmFtZXRlci52YWx1ZVxuICAgICkgYXMgSW50ZXJmYWNlLkFjY291bnRQZXJtaXNzaW9uVXBkYXRlQ29udHJhY3Q7XG4gICAgY29uc3Qgb3duZXJBZGRyZXNzID0gVXRpbHMuZ2V0QmFzZTU4QWRkcmVzc0Zyb21IZXgodmFsdWUub3duZXJfYWRkcmVzcyk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyQWRkcmVzcywgb3duZXJBZGRyZXNzKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHgub3duZXIudHlwZSwgMCk7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4Lm93bmVyLnRocmVzaG9sZCwgMik7XG4gICAgYXNzZXJ0LmVxdWFsKHBhcnNlZFR4LmFjdGl2ZXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50eXBlLCAyKTtcbiAgICBhc3NlcnQuZXF1YWwocGFyc2VkVHguYWN0aXZlc1swXS50aHJlc2hvbGQsIDIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGVuY29kZSBhbmQgZGVjb2RlIGRhdGEgcGFyYW1ldGVycyBmb3IgdHJhbnNmZXInLCAoKSA9PiB7XG4gICAgY29uc3QgdHlwZXMgPSBbJ2FkZHJlc3MnLCAndWludDI1NiddO1xuICAgIGNvbnN0IGFtb3VudCA9ICcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJztcbiAgICBjb25zdCB2YWx1ZXMgPSBbYWRkcmVzc0hleCwgYW1vdW50XTtcbiAgICBjb25zdCBtZXRob2RJZCA9ICcweGE5MDU5Y2JiJztcbiAgICBjb25zdCBkYXRhID0gVXRpbHMuZW5jb2RlRGF0YVBhcmFtcyh0eXBlcywgdmFsdWVzLCBtZXRob2RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgZGF0YSxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG5cbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IFV0aWxzLmRlY29kZURhdGFQYXJhbXMoXG4gICAgICB0eXBlcyxcbiAgICAgICdhOTA1OWNiYjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJjMmJhNGE5ZmY2YzUzMjA3ZGM1YjY4NmJmZWNmNzVlYTdiODA1NzcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmM2YjkzNWI4YmJkNDAwMDAwJ1xuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKGRlY29kZWREYXRhWzBdLCBhZGRyZXNzSGV4LnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xuICAgIGFzc2VydC5lcXVhbChkZWNvZGVkRGF0YVsxXS50b1N0cmluZygpLCBhbW91bnQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtYXAgdGVzdG5ldCBhbmQgbWFpbm5ldCB0b2tlbnMnLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHRva2VuTWFpbm5ldENvbnRyYWN0QWRkcmVzc2VzLmluY2x1ZGVzKCdUU1NNSFllVjJ1RTlxWUg5NURxeW9DdU5DekVMMU52VTNTJyksIHRydWUpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh0b2tlblRlc3RuZXRDb250cmFjdEFkZHJlc3Nlcy5pbmNsdWRlcygnVEdrZlVzaGRiQWlOajVHMW15bnAybWVxMkJmRjZYU0dQZicpLCB0cnVlKTtcbiAgfSk7XG59KTtcbiJdfQ==
@@ -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":""}