@witnet/sdk 1.0.0-beta.0

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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +103 -0
  3. package/dist/package.json +72 -0
  4. package/dist/src/bin/helpers.d.ts +91 -0
  5. package/dist/src/bin/helpers.d.ts.map +1 -0
  6. package/dist/src/bin/helpers.js +816 -0
  7. package/dist/src/index.d.ts +5 -0
  8. package/dist/src/index.d.ts.map +1 -0
  9. package/dist/src/index.js +47 -0
  10. package/dist/src/lib/crypto/account.d.ts +32 -0
  11. package/dist/src/lib/crypto/account.d.ts.map +1 -0
  12. package/dist/src/lib/crypto/account.js +106 -0
  13. package/dist/src/lib/crypto/coinbase.d.ts +10 -0
  14. package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
  15. package/dist/src/lib/crypto/coinbase.js +28 -0
  16. package/dist/src/lib/crypto/index.d.ts +8 -0
  17. package/dist/src/lib/crypto/index.d.ts.map +1 -0
  18. package/dist/src/lib/crypto/index.js +30 -0
  19. package/dist/src/lib/crypto/interfaces.d.ts +85 -0
  20. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
  21. package/dist/src/lib/crypto/interfaces.js +3 -0
  22. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
  23. package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
  24. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
  25. package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
  26. package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
  27. package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
  28. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
  29. package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
  30. package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
  31. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
  32. package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
  33. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
  34. package/dist/src/lib/crypto/payloads.d.ts +57 -0
  35. package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
  36. package/dist/src/lib/crypto/payloads.js +170 -0
  37. package/dist/src/lib/crypto/signer.d.ts +33 -0
  38. package/dist/src/lib/crypto/signer.d.ts.map +1 -0
  39. package/dist/src/lib/crypto/signer.js +194 -0
  40. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
  41. package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
  42. package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
  43. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
  44. package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
  45. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
  46. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
  47. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
  48. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
  49. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
  50. package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
  51. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
  52. package/dist/src/lib/crypto/transmitters.d.ts +47 -0
  53. package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
  54. package/dist/src/lib/crypto/transmitters.js +416 -0
  55. package/dist/src/lib/crypto/types.d.ts +161 -0
  56. package/dist/src/lib/crypto/types.d.ts.map +1 -0
  57. package/dist/src/lib/crypto/types.js +273 -0
  58. package/dist/src/lib/crypto/utils.d.ts +21 -0
  59. package/dist/src/lib/crypto/utils.d.ts.map +1 -0
  60. package/dist/src/lib/crypto/utils.js +156 -0
  61. package/dist/src/lib/crypto/wallet.d.ts +120 -0
  62. package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
  63. package/dist/src/lib/crypto/wallet.js +258 -0
  64. package/dist/src/lib/index.d.ts +5 -0
  65. package/dist/src/lib/index.d.ts.map +1 -0
  66. package/dist/src/lib/index.js +44 -0
  67. package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
  68. package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
  69. package/dist/src/lib/radon/ccdr/eth.js +272 -0
  70. package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
  71. package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
  72. package/dist/src/lib/radon/ccdr/index.js +39 -0
  73. package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
  74. package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
  75. package/dist/src/lib/radon/ccdr/wit.js +35 -0
  76. package/dist/src/lib/radon/filters.d.ts +14 -0
  77. package/dist/src/lib/radon/filters.d.ts.map +1 -0
  78. package/dist/src/lib/radon/filters.js +45 -0
  79. package/dist/src/lib/radon/index.d.ts +296 -0
  80. package/dist/src/lib/radon/index.d.ts.map +1 -0
  81. package/dist/src/lib/radon/index.js +707 -0
  82. package/dist/src/lib/radon/reducers.d.ts +29 -0
  83. package/dist/src/lib/radon/reducers.d.ts.map +1 -0
  84. package/dist/src/lib/radon/reducers.js +66 -0
  85. package/dist/src/lib/radon/types.d.ts +521 -0
  86. package/dist/src/lib/radon/types.d.ts.map +1 -0
  87. package/dist/src/lib/radon/types.js +936 -0
  88. package/dist/src/lib/radon/utils.d.ts +53 -0
  89. package/dist/src/lib/radon/utils.d.ts.map +1 -0
  90. package/dist/src/lib/radon/utils.js +153 -0
  91. package/dist/src/lib/rpc/index.d.ts +3 -0
  92. package/dist/src/lib/rpc/index.d.ts.map +1 -0
  93. package/dist/src/lib/rpc/index.js +19 -0
  94. package/dist/src/lib/rpc/nodes.d.ts +40 -0
  95. package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
  96. package/dist/src/lib/rpc/nodes.js +293 -0
  97. package/dist/src/lib/rpc/provider.d.ts +88 -0
  98. package/dist/src/lib/rpc/provider.d.ts.map +1 -0
  99. package/dist/src/lib/rpc/provider.js +336 -0
  100. package/dist/src/lib/rpc/reporter.d.ts +18 -0
  101. package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
  102. package/dist/src/lib/rpc/reporter.js +30 -0
  103. package/dist/src/lib/rpc/types.d.ts +409 -0
  104. package/dist/src/lib/rpc/types.d.ts.map +1 -0
  105. package/dist/src/lib/rpc/types.js +81 -0
  106. package/dist/src/lib/types.d.ts +18 -0
  107. package/dist/src/lib/types.d.ts.map +1 -0
  108. package/dist/src/lib/types.js +7 -0
  109. package/dist/src/lib/utils.d.ts +13 -0
  110. package/dist/src/lib/utils.d.ts.map +1 -0
  111. package/dist/src/lib/utils.js +97 -0
  112. package/dist/witnet/assets/index.d.ts +30 -0
  113. package/dist/witnet/assets/index.d.ts.map +1 -0
  114. package/dist/witnet/assets/index.js +6 -0
  115. package/dist/witnet/assets/modals/index.d.ts +18 -0
  116. package/dist/witnet/assets/modals/index.d.ts.map +1 -0
  117. package/dist/witnet/assets/modals/index.js +21 -0
  118. package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
  119. package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
  120. package/dist/witnet/assets/modals/web3/eth.js +26 -0
  121. package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
  122. package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
  123. package/dist/witnet/assets/modals/web3/wit.js +20 -0
  124. package/dist/witnet/assets/requests.d.ts +11 -0
  125. package/dist/witnet/assets/requests.d.ts.map +1 -0
  126. package/dist/witnet/assets/requests.js +88 -0
  127. package/dist/witnet/witnet.proto.json +1325 -0
  128. package/package.json +72 -0
  129. package/src/bin/cli/history.js +31 -0
  130. package/src/bin/cli/inspect.js +359 -0
  131. package/src/bin/cli/network.js +592 -0
  132. package/src/bin/cli/nodes.js +364 -0
  133. package/src/bin/cli/radon.js +814 -0
  134. package/src/bin/cli/wallet.js +1000 -0
  135. package/src/bin/helpers.js +829 -0
  136. package/src/bin/postinstall.js +9 -0
  137. package/src/bin/toolkit.js +294 -0
  138. package/witnet/assets/_index.js +8 -0
  139. package/witnet/assets/_requests.js +25 -0
  140. package/witnet/assets/_sources.js +36 -0
  141. package/witnet/assets/_templates.js +36 -0
  142. package/witnet/assets/index.js +4 -0
  143. package/witnet/assets/modals/index.js +25 -0
  144. package/witnet/assets/modals/web3/btc.js +0 -0
  145. package/witnet/assets/modals/web3/eth.js +29 -0
  146. package/witnet/assets/modals/web3/sol.js +0 -0
  147. package/witnet/assets/modals/web3/wit.js +23 -0
  148. package/witnet/assets/requests.js +94 -0
  149. package/witnet/witnet.proto.json +1325 -0
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.JsonRpcProvider = exports.JsonRpcProviderError = void 0;
37
+ const axios_1 = __importStar(require("axios"));
38
+ const jsonBig = require('json-bigint');
39
+ const protobufjs_1 = require("protobufjs");
40
+ const protoRoot = protobufjs_1.Root.fromJSON(require("../../../witnet/witnet.proto.json"));
41
+ const protoBuf = protoRoot.lookupType("ConsensusConstants");
42
+ const types_1 = require("../crypto/types");
43
+ const utils = __importStar(require("../utils"));
44
+ const types_2 = require("./types");
45
+ class JsonRpcProviderError extends Error {
46
+ constructor(method, params, error) {
47
+ super(`${method}(${JSON.stringify(params)}): ${JSON.stringify(error)})`);
48
+ delete error?.stack;
49
+ this.error = error;
50
+ this.method = method;
51
+ this.params = params;
52
+ }
53
+ }
54
+ exports.JsonRpcProviderError = JsonRpcProviderError;
55
+ class JsonRpcProvider {
56
+ /**
57
+ * Create and initialize a JsonRpcProvider object connected to the default Wit/RPC endpoint.
58
+ * Defaults to https://rpc-01.witnet.io if no WITNET_SDK_PROVIDER_URL envar is settled
59
+ * on the environment.
60
+ */
61
+ static async fromEnv(url) {
62
+ return JsonRpcProvider.fromURL(url || process.env.WITNET_SDK_PROVIDER_URL || "https://rpc-01.witnet.io");
63
+ }
64
+ /**
65
+ * Create and initialize a JsonRpcProvider object connected to the specified Wit/RPC endpoint.
66
+ * @param url Wit/RPC endpoint URL.
67
+ */
68
+ static async fromURL(url) {
69
+ const provider = new JsonRpcProvider(url);
70
+ return provider.constants().then(() => provider);
71
+ }
72
+ constructor(url) {
73
+ this.endpoints = [];
74
+ if (url !== undefined) {
75
+ const urls = url.replaceAll(',', ';').split(';');
76
+ urls.forEach(url => {
77
+ const [schema,] = utils.parseURL(url);
78
+ if (!schema.startsWith("http://") && !schema.startsWith("https://")) {
79
+ throw Error(`Witnet.JsonRpcProvider: unsupported URL schema ${schema}`);
80
+ }
81
+ });
82
+ this.endpoints = urls;
83
+ }
84
+ else {
85
+ this.endpoints.push(process.env.WITNET_SDK_PROVIDER_URL || "https://rpc-01.witnet.io");
86
+ }
87
+ this._headers = new axios_1.AxiosHeaders({
88
+ "Content-Type": "application/json"
89
+ });
90
+ }
91
+ get network() {
92
+ if (this._constants) {
93
+ return this._constants.bootstrapping_committee[0].startsWith('wit') ? "mainnet" : "testnet";
94
+ }
95
+ else {
96
+ return undefined;
97
+ }
98
+ }
99
+ get networkId() {
100
+ if (this._constants) {
101
+ const obj = {};
102
+ obj.activityPeriod = this._constants.activity_period;
103
+ obj.bootstrapHash = { SHA256: Array.from(utils.fromHexString(this._constants.bootstrap_hash)) };
104
+ obj.bootstrappingCommittee = this._constants.bootstrapping_committee;
105
+ obj.checkpointZeroTimestamp = this._constants.checkpoint_zero_timestamp;
106
+ obj.checkpointsPeriod = this._constants.checkpoints_period;
107
+ obj.collateralAge = this._constants.collateral_age;
108
+ obj.collateralMinimum = this._constants.collateral_minimum;
109
+ obj.epochsWithMinimumDifficulty = this._constants.epochs_with_minimum_difficulty;
110
+ obj.extraRounds = this._constants.extra_rounds;
111
+ obj.genesisHash = { SHA256: Array.from(utils.fromHexString(this._constants.genesis_hash)) };
112
+ obj.halvingPeriod = this._constants.halving_period;
113
+ obj.initialBlockReward = this._constants.initial_block_reward;
114
+ obj.maxDrWeight = this._constants.max_dr_weight;
115
+ obj.maxVtWeight = this._constants.max_vt_weight;
116
+ if (this._constants.minimum_difficulty > 0)
117
+ obj.minimumDifficulty = this._constants.minimum_difficulty;
118
+ obj.miningBackupFactor = this._constants.mining_backup_factor;
119
+ obj.miningReplicationFactor = this._constants.mining_replication_factor;
120
+ obj.reputationExpireAlphaDiff = this._constants.reputation_expire_alpha_diff;
121
+ obj.reputationIssuance = this._constants.reputation_issuance;
122
+ obj.reputationIssuanceStop = this._constants.reputation_issuance_stop;
123
+ obj.reputationPenalizationFactor = this._constants.reputation_penalization_factor;
124
+ obj.superblockCommitteeDecreasingPeriod = this._constants.superblock_committee_decreasing_period;
125
+ obj.superblockCommitteeDecreasingStep = this._constants.superblock_committee_decreasing_step;
126
+ obj.superblockPeriod = this._constants.superblock_period;
127
+ obj.superblockSigningCommitteeSize = this._constants.superblock_signing_committee_size;
128
+ // console.log(obj)
129
+ const message = protoBuf.fromObject(obj);
130
+ // console.log(message)
131
+ const buffer = protoBuf.encode(message).finish();
132
+ const hash = utils.toHexString(utils.sha256(buffer));
133
+ // console.log(hash)
134
+ const hex = hash.substring(0, 4);
135
+ return parseInt(hex, 16);
136
+ }
137
+ return undefined;
138
+ }
139
+ nextURL() {
140
+ return this.endpoints[Math.floor(Math.random() * this.endpoints.length)];
141
+ }
142
+ async callApiMethod(method, params) {
143
+ const url = this.nextURL();
144
+ return axios_1.default
145
+ .post(url, {
146
+ jsonrpc: '2.0',
147
+ id: +new Date(),
148
+ method,
149
+ params,
150
+ }, {
151
+ headers: this._headers,
152
+ transformResponse: function (response) { return jsonBig().parse(response); },
153
+ }).then((response) => {
154
+ if (response?.error || response?.data?.error) {
155
+ throw new JsonRpcProviderError(method, params, response?.error || response?.data?.error);
156
+ }
157
+ else
158
+ return response?.data?.result;
159
+ });
160
+ }
161
+ /// ---------------------------------------------------------------------------------------------------------------
162
+ /**
163
+ * Get the list of block hashes within given range, as known by the provider.
164
+ * @param {number} since - First epoch for which to return block hashes. If negative, return block hashes from the last n epochs.
165
+ * @param {number} limit - Number of block hashes to return. If negative, return the last n block hashes from this epoch range.
166
+ */
167
+ async blocks(since = -1, limit = 1) {
168
+ return this.callApiMethod(types_2.Methods.GetBlockChain, [since, limit,]);
169
+ }
170
+ /// Get consensus constants used by the node
171
+ async constants() {
172
+ if (!this._constants) {
173
+ return this
174
+ .callApiMethod(types_2.Methods.GetConsensusConstants)
175
+ .then((constants) => {
176
+ this._constants = constants;
177
+ return constants;
178
+ });
179
+ }
180
+ else {
181
+ return this._constants;
182
+ }
183
+ }
184
+ /// Get limited list of currently top holders, as known by the provider.
185
+ async holders(minBalance = 0, maxBalance) {
186
+ return this
187
+ .callApiMethod(types_2.Methods.GetBalance2, {
188
+ all: {
189
+ minBalance,
190
+ ...maxBalance ? { maxBalance } : {}
191
+ }
192
+ }).then((balances) => {
193
+ const reverseCompare = (a, b) => {
194
+ const a_tot = a.locked + a.unlocked + a.staked;
195
+ const b_tot = b.locked + b.unlocked + b.staked;
196
+ if (a_tot < b_tot)
197
+ return 1;
198
+ else if (a_tot > b_tot)
199
+ return -1;
200
+ else
201
+ return 0;
202
+ };
203
+ return Object.fromEntries(Object.entries(balances)
204
+ .sort((a, b) => reverseCompare(a[1], b[1])));
205
+ });
206
+ }
207
+ /// Get list of known peers
208
+ async knownPeers() {
209
+ return this.callApiMethod(types_2.Methods.KnownPeers);
210
+ }
211
+ /// Get all the pending transactions
212
+ async mempool() {
213
+ return this.callApiMethod(types_2.Methods.GetMempool);
214
+ }
215
+ /// Get priority and time-to-block estimations for different priority tiers.
216
+ async priorities() {
217
+ return this.callApiMethod(types_2.Methods.Priority);
218
+ }
219
+ /// Get information about protocol versions and which version is currently being enforced.
220
+ async protocolInfo() {
221
+ return this.callApiMethod(types_2.Methods.Protocol);
222
+ }
223
+ /// Get a full list of staking powers ordered by rank
224
+ async powers(query) {
225
+ return this.callApiMethod(types_2.Methods.QueryStakingPowers, query);
226
+ }
227
+ /// Get a full list of current stake entries Query the amount of nanowits staked by an address.
228
+ async stakes(query) {
229
+ return this
230
+ .callApiMethod(types_2.Methods.QueryStakes, query)
231
+ .catch(err => {
232
+ if (err?.error?.message && err.error.message.indexOf("not registered") > -1) {
233
+ return [];
234
+ }
235
+ else {
236
+ throw err;
237
+ }
238
+ });
239
+ }
240
+ /// Get node status
241
+ async syncStatus() {
242
+ return this.callApiMethod(types_2.Methods.SyncStatus);
243
+ }
244
+ async wips() {
245
+ return this.callApiMethod(types_2.Methods.SignalingInfo);
246
+ }
247
+ async witnesses(_since) {
248
+ // todo: witnesses estimation should instead be computed in proportion to
249
+ // ratio of validators that have honestly witnessed data requests
250
+ // vs validators that have honestly witnessed data requests and
251
+ // never revealed "i passed" out of majority,
252
+ // within the specified range of epochs.
253
+ let census = 0;
254
+ return this
255
+ .stakes({ params: { distinct: true } }) // todo: implement `count` flag on IJsonRpcProvider.stakes()
256
+ .then(records => {
257
+ census = records.length;
258
+ return this.blocks(-16, 16); // todo: blocks() should return epoch, hash and validator pkh for each block
259
+ })
260
+ .then(records => {
261
+ return Promise.all(records.map(record => this.getBlock(record[1])));
262
+ })
263
+ .then(blocks => {
264
+ const validators = [];
265
+ blocks.map(block => {
266
+ const pkh = types_1.PublicKey.fromProtobuf(block.block_sig.public_key).hash().toBech32(this.network);
267
+ if (!validators.includes(pkh))
268
+ validators.push(pkh);
269
+ });
270
+ return Math.min(validators.length, Math.floor(this.network === "testnet" ? census / 2 : census / 4));
271
+ });
272
+ }
273
+ /// ---------------------------------------------------------------------------------------------------------------
274
+ /// Get balance
275
+ async getBalance(pkh) {
276
+ return this
277
+ .callApiMethod(types_2.Methods.GetBalance2, { pkh })
278
+ .then((balance) => ({
279
+ locked: BigInt(balance.locked),
280
+ staked: BigInt(balance.staked),
281
+ unlocked: BigInt(balance.unlocked),
282
+ }));
283
+ }
284
+ /**
285
+ * Get block info by hash
286
+ * @param {Hash} blockHash - Hash of the block that we are querying.
287
+ * @param {boolean} showTransactionHash - Whether to include an extra field containing array of transaction hashes.
288
+ */
289
+ async getBlock(blockHash, showTransactionHash = false) {
290
+ return this.callApiMethod(types_2.Methods.GetBlock, [blockHash, showTransactionHash,]);
291
+ }
292
+ async getDataRequest(drTxHash) {
293
+ return this.callApiMethod(types_2.Methods.DataRequestReport, [drTxHash,]);
294
+ }
295
+ /// Get the blocks that pertain to the superblock index
296
+ async getSuperblock(epoch) {
297
+ return this.callApiMethod(types_2.Methods.GetSuperblock, { "block_epoch": epoch });
298
+ }
299
+ async getTransaction(txHash) {
300
+ return this.callApiMethod(types_2.Methods.GetTransaction, [txHash,]);
301
+ }
302
+ async getTransactionReceipt(txHash) {
303
+ // todo: fetch/update receipt from provider, if not cached
304
+ return JsonRpcProvider.receipts[txHash];
305
+ }
306
+ /// Get utxos
307
+ async getUtxos(pkh, smallFirst = true) {
308
+ return this
309
+ .callApiMethod(types_2.Methods.GetUtxoInfo, [pkh,])
310
+ .then((result) => {
311
+ const inversor = smallFirst ? 1 : -1;
312
+ return result.utxos.sort((a, b) => {
313
+ if (a.value > b.value)
314
+ return inversor;
315
+ else if (a.value < b.value)
316
+ return -inversor;
317
+ else
318
+ return 0;
319
+ }).map((utxo) => ({
320
+ ...utxo,
321
+ value: BigInt(utxo.value),
322
+ }));
323
+ });
324
+ }
325
+ /// ---------------------------------------------------------------------------------------------------------------
326
+ async sendRawTransaction(transaction) {
327
+ return this.callApiMethod(types_2.Methods.Inventory, { transaction });
328
+ }
329
+ /// Get supply info
330
+ async supplyInfo() {
331
+ return this.callApiMethod(types_2.Methods.GetSupplyInfo);
332
+ }
333
+ }
334
+ exports.JsonRpcProvider = JsonRpcProvider;
335
+ JsonRpcProvider.receipts = {};
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JwYy9wcm92aWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwrQ0FBc0Q7QUFDdEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3ZDLDJDQUE4QztBQUM5QyxNQUFNLFNBQVMsR0FBRyxpQkFBUyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFBO0FBQ2xGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQTtBQUUzRCwyQ0FBb0Y7QUFFcEYsZ0RBQWlDO0FBRWpDLG1DQU1nQjtBQThCaEIsTUFBYSxvQkFBcUIsU0FBUSxLQUFLO0lBSTNDLFlBQVksTUFBYyxFQUFFLE1BQWEsRUFBRSxLQUFXO1FBQ2xELEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3hFLE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQTtRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtJQUN4QixDQUFDO0NBQ0o7QUFYRCxvREFXQztBQUVELE1BQWEsZUFBZTtJQVN4Qjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBWTtRQUM3QixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLElBQUksMEJBQTBCLENBQUMsQ0FB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QUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUIsR0FBRyxJQUFJO2dCQUNQLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUM1QixDQUFDLENBQUMsQ0FBQTtRQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ1YsQ0FBQztJQUVELG1IQUFtSDtJQUM1RyxLQUFLLENBQUMsa0JBQWtCLENBQUMsV0FBZ0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFVLGVBQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQzFFLENBQUM7SUFFRCxtQkFBbUI7SUFDWixLQUFLLENBQUMsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQWEsZUFBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7O0FBMVRMLDBDQTJUQztBQXZUaUIsd0JBQVEsR0FBcUMsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmYXVsdCBhcyBheGlvcywgQXhpb3NIZWFkZXJzIH0gZnJvbSBcImF4aW9zXCJcclxuY29uc3QganNvbkJpZyA9IHJlcXVpcmUoJ2pzb24tYmlnaW50Jyk7XHJcbmltcG9ydCB7IFJvb3QgYXMgUHJvdG9Sb290IH0gZnJvbSBcInByb3RvYnVmanNcIlxyXG5jb25zdCBwcm90b1Jvb3QgPSBQcm90b1Jvb3QuZnJvbUpTT04ocmVxdWlyZShcIi4uLy4uLy4uL3dpdG5ldC93aXRuZXQucHJvdG8uanNvblwiKSkgXHJcbmNvbnN0IHByb3RvQnVmID0gcHJvdG9Sb290Lmxvb2t1cFR5cGUoXCJDb25zZW5zdXNDb25zdGFudHNcIilcclxuXHJcbmltcG9ydCB7IFB1YmxpY0tleSwgUHVibGljS2V5SGFzaFN0cmluZywgVHJhbnNhY3Rpb25SZWNlaXB0IH0gZnJvbSBcIi4uL2NyeXB0by90eXBlc1wiXHJcbmltcG9ydCB7IEVwb2NoLCBIYXNoLCBOZXR3b3JrLCBVdHhvTWV0YWRhdGEgfSBmcm9tIFwiLi4vdHlwZXNcIlxyXG5pbXBvcnQgKiBhcyB1dGlscyBmcm9tIFwiLi4vdXRpbHNcIlxyXG5cclxuaW1wb3J0IHtcclxuICAgIEJhbGFuY2UsIEJhbGFuY2UyLCBCbG9jaywgQ29uc2Vuc3VzQ29uc3RhbnRzLCBEYXRhUmVxdWVzdFJlcG9ydCwgXHJcbiAgICBNZW1wb29sLCBNZXRob2RzLCBQZWVyQWRkciwgUHJpb3JpdGllcywgUHJvdG9jb2xJbmZvLCBcclxuICAgIFF1ZXJ5U3Rha2VzLCBRdWVyeVN0YWtpbmdQb3dlcnMsXHJcbiAgICBUcmFuc2FjdGlvblJlcG9ydCwgU2lnbmFsaW5nSW5mbywgU3Rha2VFbnRyeSwgU3Rha2luZ1Bvd2VyLCBcclxuICAgIFN1cGVyYmxvY2tSZXBvcnQsIFN1cHBseUluZm8sIFN5bmNTdGF0dXMsIFV0eG9JbmZvLFxyXG59IGZyb20gXCIuL3R5cGVzXCJcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUpzb25ScGNQcm92aWRlciB7XHJcbiAgICBuZXR3b3JrPzogTmV0d29yaztcclxuICAgIG5ldHdvcmtJZD86IG51bWJlcjtcclxuICAgIFxyXG4gICAgYmxvY2tzKHNpbmNlOiBFcG9jaCwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8QXJyYXk8W251bWJlciwgSGFzaC8qLCBQdWJsaWNLZXlIYXNoU3RyaW5nKi9dPj47XHJcbiAgICBjb25zdGFudHMoKTogUHJvbWlzZTxDb25zZW5zdXNDb25zdGFudHM+O1xyXG4gICAgaG9sZGVycyhsaW1pdD86IG51bWJlcik6IFByb21pc2U8UmVjb3JkPFB1YmxpY0tleUhhc2hTdHJpbmcsIEJhbGFuY2UyPj4gXHJcbiAgICBtZW1wb29sKCk6IFByb21pc2U8TWVtcG9vbD47XHJcbiAgICBwb3dlcnMocGFyYW1zPzogUXVlcnlTdGFraW5nUG93ZXJzKTogUHJvbWlzZTxBcnJheTxTdGFraW5nUG93ZXI+PjtcclxuICAgIHByaW9yaXRpZXMoKTogUHJvbWlzZTxQcmlvcml0aWVzPjtcclxuICAgIHByb3RvY29sSW5mbygpOiBQcm9taXNlPFByb3RvY29sSW5mbz47XHJcbiAgICBzdGFrZXMocGFyYW1zOiBRdWVyeVN0YWtlcyk6IFByb21pc2U8QXJyYXk8U3Rha2VFbnRyeT4+OyBcclxuICAgIHN1cHBseUluZm8oKTogUHJvbWlzZTxTdXBwbHlJbmZvPjtcclxuICAgIHN5bmNTdGF0dXMoKTogUHJvbWlzZTxhbnk+O1xyXG4gICAgd2lwcygpOiBQcm9taXNlPFNpZ25hbGluZ0luZm8+O1xyXG4gICAgd2l0bmVzc2VzKCk6IFByb21pc2U8bnVtYmVyPjtcclxuXHJcbiAgICBnZXRCYWxhbmNlKHBraDogUHVibGljS2V5SGFzaFN0cmluZyk6IFByb21pc2U8QmFsYW5jZTI+O1xyXG4gICAgZ2V0QmxvY2soYmxvY2tIYXNoOiBIYXNoLCBzaG93VHJhbnNhY3Rpb25IYXNoZXM/OiBib29sZWFuKTogUHJvbWlzZTxCbG9jaz47XHJcbiAgICBnZXREYXRhUmVxdWVzdChkclR4SGFzaDogSGFzaCk6IFByb21pc2U8RGF0YVJlcXVlc3RSZXBvcnQ+O1xyXG4gICAgZ2V0U3VwZXJibG9jayhlcG9jaDogRXBvY2gpOiBQcm9taXNlPFN1cGVyYmxvY2tSZXBvcnQ+O1xyXG4gICAgZ2V0VHJhbnNhY3Rpb24odHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlcG9ydD47XHJcbiAgICBnZXRUcmFuc2FjdGlvblJlY2VpcHQodHhIYXNoOiBIYXNoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+O1xyXG4gICAgZ2V0VXR4b3MocGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nLCBzbWFsbGVzdEZpcnN0PzogYm9vbGVhbik6IFByb21pc2U8QXJyYXk8VXR4b01ldGFkYXRhPj47XHJcbiAgICAgICAgXHJcbiAgICBzZW5kUmF3VHJhbnNhY3Rpb24odHg6IGFueSk6IFByb21pc2U8Ym9vbGVhbj47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBKc29uUnBjUHJvdmlkZXJFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIHJlYWRvbmx5IGVycm9yPzogYW55O1xyXG4gICAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XHJcbiAgICByZWFkb25seSBwYXJhbXM6IGFueVtdO1xyXG4gICAgY29uc3RydWN0b3IobWV0aG9kOiBzdHJpbmcsIHBhcmFtczogYW55W10sIGVycm9yPzogYW55KSB7XHJcbiAgICAgICAgc3VwZXIoYCR7bWV0aG9kfSgke0pTT04uc3RyaW5naWZ5KHBhcmFtcyl9KTogJHtKU09OLnN0cmluZ2lmeShlcnJvcil9KWApXHJcbiAgICAgICAgZGVsZXRlIGVycm9yPy5zdGFja1xyXG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvclxyXG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kXHJcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXNcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEpzb25ScGNQcm92aWRlciBpbXBsZW1lbnRzIElKc29uUnBjUHJvdmlkZXIge1xyXG4gICAgXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRzOiBzdHJpbmdbXVxyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgcmVjZWlwdHM6IFJlY29yZDxIYXNoLCBUcmFuc2FjdGlvblJlY2VpcHQ+ID0ge307XHJcblxyXG4gICAgcHJvdGVjdGVkIF9jb25zdGFudHM/OiBDb25zZW5zdXNDb25zdGFudHNcclxuICAgIHByb3RlY3RlZCBfaGVhZGVyczogQXhpb3NIZWFkZXJzO1xyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIEpzb25ScGNQcm92aWRlciBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBkZWZhdWx0IFdpdC9SUEMgZW5kcG9pbnQuXHJcbiAgICAgKiBEZWZhdWx0cyB0byBodHRwczovL3JwYy0wMS53aXRuZXQuaW8gaWYgbm8gV0lUTkVUX1NES19QUk9WSURFUl9VUkwgZW52YXIgaXMgc2V0dGxlZFxyXG4gICAgICogb24gdGhlIGVudmlyb25tZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgZnJvbUVudih1cmw/OiBzdHJpbmcpOiBQcm9taXNlPEpzb25ScGNQcm92aWRlcj4ge1xyXG4gICAgICAgIHJldHVybiBKc29uUnBjUHJvdmlkZXIuZnJvbVVSTCh1cmwgfHwgcHJvY2Vzcy5lbnYuV0lUTkVUX1NES19QUk9WSURFUl9VUkwgfHwgXCJodHRwczovL3JwYy0wMS53aXRuZXQuaW9cIilcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBKc29uUnBjUHJvdmlkZXIgb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgc3BlY2lmaWVkIFdpdC9SUEMgZW5kcG9pbnQuXHJcbiAgICAgKiBAcGFyYW0gdXJsIFdpdC9SUEMgZW5kcG9pbnQgVVJMLlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYXN5bmMgZnJvbVVSTCh1cmw6IHN0cmluZyk6IFByb21pc2U8SnNvblJwY1Byb3ZpZGVyPiB7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgSnNvblJwY1Byb3ZpZGVyKHVybClcclxuICAgICAgICByZXR1cm4gcHJvdmlkZXIuY29uc3RhbnRzKCkudGhlbigoKSA9PiBwcm92aWRlcilcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih1cmw/OiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmVuZHBvaW50cyA9IFtdXHJcbiAgICAgICAgaWYgKHVybCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybHMgPSB1cmwucmVwbGFjZUFsbCgnLCcsICc7Jykuc3BsaXQoJzsnKVxyXG4gICAgICAgICAgICB1cmxzLmZvckVhY2godXJsID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IFtzY2hlbWEsIF0gPSB1dGlscy5wYXJzZVVSTCh1cmwpXHJcbiAgICAgICAgICAgICAgICBpZiAoIXNjaGVtYS5zdGFydHNXaXRoKFwiaHR0cDovL1wiKSAmJiAhc2NoZW1hLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXaXRuZXQuSnNvblJwY1Byb3ZpZGVyOiB1bnN1cHBvcnRlZCBVUkwgc2NoZW1hICR7c2NoZW1hfWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIHRoaXMuZW5kcG9pbnRzID0gdXJsc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW5kcG9pbnRzLnB1c2gocHJvY2Vzcy5lbnYuV0lUTkVUX1NES19QUk9WSURFUl9VUkwgfHwgXCJodHRwczovL3JwYy0wMS53aXRuZXQuaW9cIilcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faGVhZGVycyA9IG5ldyBBeGlvc0hlYWRlcnMoeyBcclxuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5ldHdvcmsoKTogTmV0d29yayB8IHVuZGVmaW5lZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbnN0YW50cykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29uc3RhbnRzLmJvb3RzdHJhcHBpbmdfY29tbWl0dGVlWzBdLnN0YXJ0c1dpdGgoJ3dpdCcpID8gXCJtYWlubmV0XCI6IFwidGVzdG5ldFwiXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IG5ldHdvcmtJZCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGlmICh0aGlzLl9jb25zdGFudHMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb2JqOiBhbnkgPSB7fVxyXG4gICAgICAgICAgICBvYmouYWN0aXZpdHlQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuYWN0aXZpdHlfcGVyaW9kO1xyXG4gICAgICAgICAgICBvYmouYm9vdHN0cmFwSGFzaCA9IHsgU0hBMjU2OiBBcnJheS5mcm9tKHV0aWxzLmZyb21IZXhTdHJpbmcodGhpcy5fY29uc3RhbnRzLmJvb3RzdHJhcF9oYXNoKSkgfVxyXG4gICAgICAgICAgICBvYmouYm9vdHN0cmFwcGluZ0NvbW1pdHRlZSA9IHRoaXMuX2NvbnN0YW50cy5ib290c3RyYXBwaW5nX2NvbW1pdHRlZVxyXG4gICAgICAgICAgICBvYmouY2hlY2twb2ludFplcm9UaW1lc3RhbXAgPSB0aGlzLl9jb25zdGFudHMuY2hlY2twb2ludF96ZXJvX3RpbWVzdGFtcFxyXG4gICAgICAgICAgICBvYmouY2hlY2twb2ludHNQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuY2hlY2twb2ludHNfcGVyaW9kXHJcbiAgICAgICAgICAgIG9iai5jb2xsYXRlcmFsQWdlID0gdGhpcy5fY29uc3RhbnRzLmNvbGxhdGVyYWxfYWdlXHJcbiAgICAgICAgICAgIG9iai5jb2xsYXRlcmFsTWluaW11bSA9IHRoaXMuX2NvbnN0YW50cy5jb2xsYXRlcmFsX21pbmltdW1cclxuICAgICAgICAgICAgb2JqLmVwb2Noc1dpdGhNaW5pbXVtRGlmZmljdWx0eSA9IHRoaXMuX2NvbnN0YW50cy5lcG9jaHNfd2l0aF9taW5pbXVtX2RpZmZpY3VsdHlcclxuICAgICAgICAgICAgb2JqLmV4dHJhUm91bmRzID0gdGhpcy5fY29uc3RhbnRzLmV4dHJhX3JvdW5kc1xyXG4gICAgICAgICAgICBvYmouZ2VuZXNpc0hhc2ggPSB7IFNIQTI1NjogQXJyYXkuZnJvbSh1dGlscy5mcm9tSGV4U3RyaW5nKHRoaXMuX2NvbnN0YW50cy5nZW5lc2lzX2hhc2gpKSB9XHJcbiAgICAgICAgICAgIG9iai5oYWx2aW5nUGVyaW9kID0gdGhpcy5fY29uc3RhbnRzLmhhbHZpbmdfcGVyaW9kXHJcbiAgICAgICAgICAgIG9iai5pbml0aWFsQmxvY2tSZXdhcmQgPSB0aGlzLl9jb25zdGFudHMuaW5pdGlhbF9ibG9ja19yZXdhcmRcclxuICAgICAgICAgICAgb2JqLm1heERyV2VpZ2h0ID0gdGhpcy5fY29uc3RhbnRzLm1heF9kcl93ZWlnaHRcclxuICAgICAgICAgICAgb2JqLm1heFZ0V2VpZ2h0ID0gdGhpcy5fY29uc3RhbnRzLm1heF92dF93ZWlnaHRcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0YW50cy5taW5pbXVtX2RpZmZpY3VsdHkgPiAwKSBvYmoubWluaW11bURpZmZpY3VsdHkgPSB0aGlzLl9jb25zdGFudHMubWluaW11bV9kaWZmaWN1bHR5XHJcbiAgICAgICAgICAgIG9iai5taW5pbmdCYWNrdXBGYWN0b3IgPSB0aGlzLl9jb25zdGFudHMubWluaW5nX2JhY2t1cF9mYWN0b3JcclxuICAgICAgICAgICAgb2JqLm1pbmluZ1JlcGxpY2F0aW9uRmFjdG9yID0gdGhpcy5fY29uc3RhbnRzLm1pbmluZ19yZXBsaWNhdGlvbl9mYWN0b3JcclxuICAgICAgICAgICAgb2JqLnJlcHV0YXRpb25FeHBpcmVBbHBoYURpZmYgPSB0aGlzLl9jb25zdGFudHMucmVwdXRhdGlvbl9leHBpcmVfYWxwaGFfZGlmZlxyXG4gICAgICAgICAgICBvYmoucmVwdXRhdGlvbklzc3VhbmNlID0gdGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25faXNzdWFuY2VcclxuICAgICAgICAgICAgb2JqLnJlcHV0YXRpb25Jc3N1YW5jZVN0b3AgPSB0aGlzLl9jb25zdGFudHMucmVwdXRhdGlvbl9pc3N1YW5jZV9zdG9wXHJcbiAgICAgICAgICAgIG9iai5yZXB1dGF0aW9uUGVuYWxpemF0aW9uRmFjdG9yID0gdGhpcy5fY29uc3RhbnRzLnJlcHV0YXRpb25fcGVuYWxpemF0aW9uX2ZhY3RvclxyXG4gICAgICAgICAgICBvYmouc3VwZXJibG9ja0NvbW1pdHRlZURlY3JlYXNpbmdQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19jb21taXR0ZWVfZGVjcmVhc2luZ19wZXJpb2RcclxuICAgICAgICAgICAgb2JqLnN1cGVyYmxvY2tDb21taXR0ZWVEZWNyZWFzaW5nU3RlcCA9IHRoaXMuX2NvbnN0YW50cy5zdXBlcmJsb2NrX2NvbW1pdHRlZV9kZWNyZWFzaW5nX3N0ZXBcclxuICAgICAgICAgICAgb2JqLnN1cGVyYmxvY2tQZXJpb2QgPSB0aGlzLl9jb25zdGFudHMuc3VwZXJibG9ja19wZXJpb2RcclxuICAgICAgICAgICAgb2JqLnN1cGVyYmxvY2tTaWduaW5nQ29tbWl0dGVlU2l6ZSA9IHRoaXMuX2NvbnN0YW50cy5zdXBlcmJsb2NrX3NpZ25pbmdfY29tbWl0dGVlX3NpemVcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cob2JqKVxyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gcHJvdG9CdWYuZnJvbU9iamVjdChvYmopXHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1lc3NhZ2UpXHJcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHByb3RvQnVmLmVuY29kZShtZXNzYWdlKS5maW5pc2goKVxyXG4gICAgICAgICAgICBjb25zdCBoYXNoID0gdXRpbHMudG9IZXhTdHJpbmcodXRpbHMuc2hhMjU2KGJ1ZmZlcikpIFxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhoYXNoKVxyXG4gICAgICAgICAgICBjb25zdCBoZXggPSBoYXNoLnN1YnN0cmluZygwLCA0KVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoaGV4LCAxNilcclxuICAgICAgICB9IFxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIG5leHRVUkwoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbmRwb2ludHNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogdGhpcy5lbmRwb2ludHMubGVuZ3RoKV1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJvdGVjdGVkIGFzeW5jIGNhbGxBcGlNZXRob2Q8VD4obWV0aG9kOiBzdHJpbmcsIHBhcmFtcz86IEFycmF5PGFueT4gfCBhbnkgKTogUHJvbWlzZTxFcnJvciB8IGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMubmV4dFVSTCgpXHJcbiAgICAgICAgcmV0dXJuIGF4aW9zXHJcbiAgICAgICAgICAgIC5wb3N0KFxyXG4gICAgICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGpzb25ycGM6ICcyLjAnLFxyXG4gICAgICAgICAgICAgICAgICAgIGlkOiArIG5ldyBEYXRlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogdGhpcy5faGVhZGVycyxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24ocmVzcG9uc2UpIHsgcmV0dXJuIGpzb25CaWcoKS5wYXJzZShyZXNwb25zZSkgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICApLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZT8uZXJyb3IgfHwgcmVzcG9uc2U/LmRhdGE/LmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEpzb25ScGNQcm92aWRlckVycm9yKG1ldGhvZCwgcGFyYW1zLCByZXNwb25zZT8uZXJyb3IgfHwgcmVzcG9uc2U/LmRhdGE/LmVycm9yKTtcclxuXHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgcmV0dXJuIHJlc3BvbnNlPy5kYXRhPy5yZXN1bHQgYXMgVDtcclxuICAgICAgICAgICAgfSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gICBcclxuICAgIC8qKlxyXG4gICAgICogR2V0IHRoZSBsaXN0IG9mIGJsb2NrIGhhc2hlcyB3aXRoaW4gZ2l2ZW4gcmFuZ2UsIGFzIGtub3duIGJ5IHRoZSBwcm92aWRlci5cclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaW5jZSAtIEZpcnN0IGVwb2NoIGZvciB3aGljaCB0byByZXR1cm4gYmxvY2sgaGFzaGVzLiBJZiBuZWdhdGl2ZSwgcmV0dXJuIGJsb2NrIGhhc2hlcyBmcm9tIHRoZSBsYXN0IG4gZXBvY2hzLlxyXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsaW1pdCAtIE51bWJlciBvZiBibG9jayBoYXNoZXMgdG8gcmV0dXJuLiBJZiBuZWdhdGl2ZSwgcmV0dXJuIHRoZSBsYXN0IG4gYmxvY2sgaGFzaGVzIGZyb20gdGhpcyBlcG9jaCByYW5nZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGJsb2NrcyhzaW5jZTogbnVtYmVyID0gLTEsIGxpbWl0OiBudW1iZXIgPSAxLCk6IFByb21pc2U8QXJyYXk8W251bWJlciwgSGFzaF0+PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxbTnVtYmVyLCBIYXNoXT4oTWV0aG9kcy5HZXRCbG9ja0NoYWluLCBbc2luY2UsIGxpbWl0LCBdKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIEdldCBjb25zZW5zdXMgY29uc3RhbnRzIHVzZWQgYnkgdGhlIG5vZGVcclxuICAgIHB1YmxpYyBhc3luYyBjb25zdGFudHMoKTogUHJvbWlzZTxDb25zZW5zdXNDb25zdGFudHM+IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2NvbnN0YW50cykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgICAgICAgICAgLmNhbGxBcGlNZXRob2Q8Q29uc2Vuc3VzQ29uc3RhbnRzPihNZXRob2RzLkdldENvbnNlbnN1c0NvbnN0YW50cylcclxuICAgICAgICAgICAgICAgIC50aGVuKChjb25zdGFudHM6IENvbnNlbnN1c0NvbnN0YW50cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN0YW50cyA9IGNvbnN0YW50c1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25zdGFudHNcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0YW50c1xyXG4gICAgICAgIH0gICAgXHJcbiAgICB9XHJcblxyXG4gICAgLy8vIEdldCBsaW1pdGVkIGxpc3Qgb2YgY3VycmVudGx5IHRvcCBob2xkZXJzLCBhcyBrbm93biBieSB0aGUgcHJvdmlkZXIuXHJcbiAgICBwdWJsaWMgYXN5bmMgaG9sZGVycyhtaW5CYWxhbmNlID0gMCwgbWF4QmFsYW5jZT86IG51bWJlcik6IFByb21pc2U8UmVjb3JkPFB1YmxpY0tleUhhc2hTdHJpbmcsIEJhbGFuY2UyPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jYWxsQXBpTWV0aG9kPFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlPj4oTWV0aG9kcy5HZXRCYWxhbmNlMiwge1xyXG4gICAgICAgICAgICAgICAgYWxsOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWluQmFsYW5jZSxcclxuICAgICAgICAgICAgICAgICAgICAuLi4gbWF4QmFsYW5jZSA/IHsgbWF4QmFsYW5jZSB9IDoge31cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSkudGhlbigoYmFsYW5jZXM6IFJlY29yZDxQdWJsaWNLZXlIYXNoU3RyaW5nLCBCYWxhbmNlMj4pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldmVyc2VDb21wYXJlID0gKGE6IEJhbGFuY2UyLCBiOiBCYWxhbmNlMikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFfdG90ID0gYS5sb2NrZWQgKyBhLnVubG9ja2VkICsgYS5zdGFrZWRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBiX3RvdCA9IGIubG9ja2VkICsgYi51bmxvY2tlZCArIGIuc3Rha2VkXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFfdG90IDwgYl90b3QpIHJldHVybiAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFfdG90ID4gYl90b3QpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhiYWxhbmNlcylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGE6IChzdHJpbmcgfCBCYWxhbmNlMilbXSwgYjogKHN0cmluZyB8IEJhbGFuY2UyKVtdKSA9PiByZXZlcnNlQ29tcGFyZShhWzFdIGFzIEJhbGFuY2UyLCBiWzFdIGFzIEJhbGFuY2UyKSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgbGlzdCBvZiBrbm93biBwZWVyc1xyXG4gICAgcHVibGljIGFzeW5jIGtub3duUGVlcnMoKTogUHJvbWlzZTxBcnJheTxQZWVyQWRkcj4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPEFycmF5PFBlZXJBZGRyPj4oTWV0aG9kcy5Lbm93blBlZXJzKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIEdldCBhbGwgdGhlIHBlbmRpbmcgdHJhbnNhY3Rpb25zXHJcbiAgICBwdWJsaWMgYXN5bmMgbWVtcG9vbCgpOiBQcm9taXNlPE1lbXBvb2w+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPE1lbXBvb2w+KE1ldGhvZHMuR2V0TWVtcG9vbCk7XHJcbiAgICB9ICAgIFxyXG4gICAgXHJcbiAgICAvLy8gR2V0IHByaW9yaXR5IGFuZCB0aW1lLXRvLWJsb2NrIGVzdGltYXRpb25zIGZvciBkaWZmZXJlbnQgcHJpb3JpdHkgdGllcnMuXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJpb3JpdGllcygpOiBQcm9taXNlPFByaW9yaXRpZXM+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFByaW9yaXRpZXM+KE1ldGhvZHMuUHJpb3JpdHkpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgcHJvdG9jb2wgdmVyc2lvbnMgYW5kIHdoaWNoIHZlcnNpb24gaXMgY3VycmVudGx5IGJlaW5nIGVuZm9yY2VkLlxyXG4gICAgcHVibGljIGFzeW5jIHByb3RvY29sSW5mbygpOiBQcm9taXNlPFByb3RvY29sSW5mbz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8UHJvdG9jb2xJbmZvPihNZXRob2RzLlByb3RvY29sKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IGEgZnVsbCBsaXN0IG9mIHN0YWtpbmcgcG93ZXJzIG9yZGVyZWQgYnkgcmFua1xyXG4gICAgcHVibGljIGFzeW5jIHBvd2VycyhxdWVyeT86IFF1ZXJ5U3Rha2luZ1Bvd2Vycyk6IFByb21pc2U8QXJyYXk8U3Rha2luZ1Bvd2VyPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8QXJyYXk8U3Rha2luZ1Bvd2VyPj4oTWV0aG9kcy5RdWVyeVN0YWtpbmdQb3dlcnMsIHF1ZXJ5KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IGEgZnVsbCBsaXN0IG9mIGN1cnJlbnQgc3Rha2UgZW50cmllcyAgUXVlcnkgdGhlIGFtb3VudCBvZiBuYW5vd2l0cyBzdGFrZWQgYnkgYW4gYWRkcmVzcy5cclxuICAgIHB1YmxpYyBhc3luYyBzdGFrZXMocXVlcnk/OiBRdWVyeVN0YWtlcyk6IFByb21pc2U8QXJyYXk8U3Rha2VFbnRyeT4+IHtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgICAgICAgICAuY2FsbEFwaU1ldGhvZDxBcnJheTxTdGFrZUVudHJ5Pj4oTWV0aG9kcy5RdWVyeVN0YWtlcywgcXVlcnkpXHJcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycj8uZXJyb3I/Lm1lc3NhZ2UgJiYgZXJyLmVycm9yLm1lc3NhZ2UuaW5kZXhPZihcIm5vdCByZWdpc3RlcmVkXCIpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW11cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgbm9kZSBzdGF0dXNcclxuICAgIHB1YmxpYyBhc3luYyBzeW5jU3RhdHVzKCk6IFByb21pc2U8U3luY1N0YXR1cz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U3luY1N0YXR1cz4oTWV0aG9kcy5TeW5jU3RhdHVzKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGFzeW5jIHdpcHMoKTogUHJvbWlzZTxTaWduYWxpbmdJbmZvPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxTaWduYWxpbmdJbmZvPihNZXRob2RzLlNpZ25hbGluZ0luZm8pXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIHdpdG5lc3Nlcyhfc2luY2U/OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xyXG4gICAgICAgIC8vIHRvZG86IHdpdG5lc3NlcyBlc3RpbWF0aW9uIHNob3VsZCBpbnN0ZWFkIGJlIGNvbXB1dGVkIGluIHByb3BvcnRpb24gdG9cclxuICAgICAgICAvLyAgICAgICByYXRpbyBvZiB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBob25lc3RseSB3aXRuZXNzZWQgZGF0YSByZXF1ZXN0c1xyXG4gICAgICAgIC8vICAgICAgIHZzIHZhbGlkYXRvcnMgdGhhdCBoYXZlIGhvbmVzdGx5IHdpdG5lc3NlZCBkYXRhIHJlcXVlc3RzIGFuZFxyXG4gICAgICAgIC8vICAgICAgIG5ldmVyIHJldmVhbGVkIFwiaSBwYXNzZWRcIiBvdXQgb2YgbWFqb3JpdHksIFxyXG4gICAgICAgIC8vICAgICAgIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGVwb2Nocy5cclxuICAgICAgICBsZXQgY2Vuc3VzID0gMFxyXG4gICAgICAgIHJldHVybiB0aGlzIFxyXG4gICAgICAgICAgICAuc3Rha2VzKHsgcGFyYW1zOiB7IGRpc3RpbmN0OiB0cnVlIH19KSAvLyB0b2RvOiBpbXBsZW1lbnQgYGNvdW50YCBmbGFnIG9uIElKc29uUnBjUHJvdmlkZXIuc3Rha2VzKClcclxuICAgICAgICAgICAgLnRoZW4ocmVjb3JkcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjZW5zdXMgPSByZWNvcmRzLmxlbmd0aFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmxvY2tzKC0xNiwgMTYpIC8vIHRvZG86IGJsb2NrcygpIHNob3VsZCByZXR1cm4gZXBvY2gsIGhhc2ggYW5kIHZhbGlkYXRvciBwa2ggZm9yIGVhY2ggYmxvY2tcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnRoZW4ocmVjb3JkcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocmVjb3Jkcy5tYXAocmVjb3JkID0+IHRoaXMuZ2V0QmxvY2socmVjb3JkWzFdKSkpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKGJsb2NrcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3JzOiBBcnJheTxQdWJsaWNLZXlIYXNoU3RyaW5nPiA9IFtdXHJcbiAgICAgICAgICAgICAgICBibG9ja3MubWFwKGJsb2NrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwa2ggPSBQdWJsaWNLZXkuZnJvbVByb3RvYnVmKGJsb2NrLmJsb2NrX3NpZy5wdWJsaWNfa2V5KS5oYXNoKCkudG9CZWNoMzIodGhpcy5uZXR3b3JrKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdG9ycy5pbmNsdWRlcyhwa2gpKSB2YWxpZGF0b3JzLnB1c2gocGtoKTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5sZW5ndGgsXHJcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLm5ldHdvcmsgPT09IFwidGVzdG5ldFwiID8gY2Vuc3VzIC8gMiA6IGNlbnN1cyAvIDQpXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIC8vLyBHZXQgYmFsYW5jZVxyXG4gICAgcHVibGljIGFzeW5jIGdldEJhbGFuY2UocGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nKTogUHJvbWlzZTxCYWxhbmNlMj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jYWxsQXBpTWV0aG9kPEJhbGFuY2UyPihNZXRob2RzLkdldEJhbGFuY2UyLCB7IHBraCB9KVxyXG4gICAgICAgICAgICAudGhlbigoYmFsYW5jZTogQmFsYW5jZTIpID0+ICh7XHJcbiAgICAgICAgICAgICAgICBsb2NrZWQ6IEJpZ0ludChiYWxhbmNlLmxvY2tlZCksXHJcbiAgICAgICAgICAgICAgICBzdGFrZWQ6IEJpZ0ludChiYWxhbmNlLnN0YWtlZCksXHJcbiAgICAgICAgICAgICAgICB1bmxvY2tlZDogQmlnSW50KGJhbGFuY2UudW5sb2NrZWQpLFxyXG4gICAgICAgICAgICB9KSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgYmxvY2sgaW5mbyBieSBoYXNoXHJcbiAgICAgKiBAcGFyYW0ge0hhc2h9IGJsb2NrSGFzaCAtIEhhc2ggb2YgdGhlIGJsb2NrIHRoYXQgd2UgYXJlIHF1ZXJ5aW5nLlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBzaG93VHJhbnNhY3Rpb25IYXNoIC0gV2hldGhlciB0byBpbmNsdWRlIGFuIGV4dHJhIGZpZWxkIGNvbnRhaW5pbmcgYXJyYXkgb2YgdHJhbnNhY3Rpb24gaGFzaGVzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0QmxvY2soXHJcbiAgICAgICAgICAgIGJsb2NrSGFzaDogSGFzaCxcclxuICAgICAgICAgICAgc2hvd1RyYW5zYWN0aW9uSGFzaCA9IGZhbHNlLFxyXG4gICAgICAgICk6IFByb21pc2U8QmxvY2s+XHJcbiAgICB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxCbG9jaz4oTWV0aG9kcy5HZXRCbG9jaywgW2Jsb2NrSGFzaCwgc2hvd1RyYW5zYWN0aW9uSGFzaCwgXSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGFzeW5jIGdldERhdGFSZXF1ZXN0KGRyVHhIYXNoOiBIYXNoKTogUHJvbWlzZTxEYXRhUmVxdWVzdFJlcG9ydD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8RGF0YVJlcXVlc3RSZXBvcnQ+KE1ldGhvZHMuRGF0YVJlcXVlc3RSZXBvcnQsIFtkclR4SGFzaCwgXSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgLy8vIEdldCB0aGUgYmxvY2tzIHRoYXQgcGVydGFpbiB0byB0aGUgc3VwZXJibG9jayBpbmRleFxyXG4gICAgcHVibGljIGFzeW5jIGdldFN1cGVyYmxvY2soZXBvY2g6IEVwb2NoKTogUHJvbWlzZTxTdXBlcmJsb2NrUmVwb3J0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxTdXBlcmJsb2NrUmVwb3J0PihNZXRob2RzLkdldFN1cGVyYmxvY2ssIHsgXCJibG9ja19lcG9jaFwiOiBlcG9jaCB9KTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHVibGljIGFzeW5jIGdldFRyYW5zYWN0aW9uKHR4SGFzaDogSGFzaCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZXBvcnQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPFRyYW5zYWN0aW9uUmVwb3J0PihNZXRob2RzLkdldFRyYW5zYWN0aW9uLCBbdHhIYXNoLCBdKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KHR4SGFzaDogSGFzaCk6IFByb21pc2U8VHJhbnNhY3Rpb25SZWNlaXB0PiB7XHJcbiAgICAgICAgLy8gdG9kbzogZmV0Y2gvdXBkYXRlIHJlY2VpcHQgZnJvbSBwcm92aWRlciwgaWYgbm90IGNhY2hlZFxyXG4gICAgICAgIHJldHVybiBKc29uUnBjUHJvdmlkZXIucmVjZWlwdHNbdHhIYXNoXVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gR2V0IHV0eG9zXHJcbiAgICBwdWJsaWMgYXN5bmMgZ2V0VXR4b3MocGtoOiBQdWJsaWNLZXlIYXNoU3RyaW5nLCBzbWFsbEZpcnN0ID0gdHJ1ZSk6IFByb21pc2U8QXJyYXk8VXR4b01ldGFkYXRhPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICAgICAgICAgIC5jYWxsQXBpTWV0aG9kPFV0eG9JbmZvPihNZXRob2RzLkdldFV0eG9JbmZvLCBbcGtoLCBdKVxyXG4gICAgICAgICAgICAudGhlbigocmVzdWx0OiBVdHhvSW5mbykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzb3IgPSBzbWFsbEZpcnN0ID8gMSA6IC0xXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnV0eG9zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYS52YWx1ZSA+IGIudmFsdWUpIHJldHVybiBpbnZlcnNvcjtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhLnZhbHVlIDwgYi52YWx1ZSkgcmV0dXJuIC0gaW52ZXJzb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDtcclxuICAgICAgICAgICAgICAgIH0pLm1hcCgodXR4bzogVXR4b01ldGFkYXRhKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnV0eG8sXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCh1dHhvLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VuZFJhd1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBhbnkpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsQXBpTWV0aG9kPGJvb2xlYW4+KE1ldGhvZHMuSW52ZW50b3J5LCB7IHRyYW5zYWN0aW9uIH0pXHJcbiAgICB9XHJcblxyXG4gICAgLy8vIEdldCBzdXBwbHkgaW5mb1xyXG4gICAgcHVibGljIGFzeW5jIHN1cHBseUluZm8oKTogUHJvbWlzZTxTdXBwbHlJbmZvPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxTdXBwbHlJbmZvPihNZXRob2RzLkdldFN1cHBseUluZm8pXHJcbiAgICB9XHJcbn0iXX0=
@@ -0,0 +1,18 @@
1
+ import { IJsonRpcProvider, JsonRpcProvider } from "./provider";
2
+ import { DataRequestReport, PeerAddr, SupplyInfo } from "./types";
3
+ import { Hash } from "../types";
4
+ export interface IReporter extends IJsonRpcProvider {
5
+ providers(): Promise<Array<string>>;
6
+ supplyInfo(): Promise<SupplyInfo>;
7
+ getDataRequest(drTxHash: Hash, channel?: string): Promise<DataRequestReport>;
8
+ searchDataRequests(radHash: Hash): Promise<any>;
9
+ }
10
+ export declare class Reporter extends JsonRpcProvider implements IReporter {
11
+ constructor(url?: string);
12
+ peers(): Promise<Array<PeerAddr>>;
13
+ providers(): Promise<Array<string>>;
14
+ supplyInfo(): Promise<SupplyInfo>;
15
+ reportDataRequest(drTxHash: Hash, channel?: string): Promise<DataRequestReport>;
16
+ searchDataRequests(radHash: Hash): Promise<any>;
17
+ }
18
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../../../src/lib/rpc/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAW,QAAQ,EAAE,UAAU,EAAG,MAAM,SAAS,CAAA;AAC3E,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,MAAM,WAAW,SAAU,SAAQ,gBAAgB;IAC/C,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;IACnC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAElC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC5E,kBAAkB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACnD;AAED,qBAAa,QAAS,SAAQ,eAAgB,YAAW,SAAS;gBAClD,GAAG,CAAC,EAAE,MAAM;IAKjB,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAI3B,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAKnC,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC;IAKjC,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI/E,kBAAkB,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC;CAG/D"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Reporter = void 0;
4
+ const provider_1 = require("./provider");
5
+ const types_1 = require("./types");
6
+ class Reporter extends provider_1.JsonRpcProvider {
7
+ constructor(url) {
8
+ super(url || process.env.WITNET_TOOLKIT_REPORTER_URL || "https://kermit.witnet.io");
9
+ }
10
+ /// ---------------------------------------------------------------------------------------------------------------
11
+ peers() {
12
+ return this.callApiMethod(types_1.Methods.KnownPeers);
13
+ }
14
+ async providers() {
15
+ return this.callApiMethod(types_1.Methods.Providers);
16
+ }
17
+ /// Get supply info
18
+ async supplyInfo() {
19
+ return this.callApiMethod(types_1.Methods.GetSupplyInfo);
20
+ }
21
+ /// ---------------------------------------------------------------------------------------------------------------
22
+ async reportDataRequest(drTxHash, channel) {
23
+ return this.callApiMethod(types_1.Methods.DataRequestReport, [drTxHash, channel,]);
24
+ }
25
+ async searchDataRequests(radHash) {
26
+ return this.callApiMethod(types_1.Methods.SearchDataRequests, [radHash,]);
27
+ }
28
+ }
29
+ exports.Reporter = Reporter;
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JwYy9yZXBvcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBOEQ7QUFDOUQsbUNBQTJFO0FBVzNFLE1BQWEsUUFBUyxTQUFRLDBCQUFlO0lBQ3pDLFlBQVksR0FBWTtRQUNwQixLQUFLLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLElBQUksMEJBQTBCLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBRUQsbUhBQW1IO0lBQzVHLEtBQUs7UUFDUixPQUFPLElBQUksQ0FBQyxhQUFhLENBQWtCLGVBQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFnQixlQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVELG1CQUFtQjtJQUNaLEtBQUssQ0FBQyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBYSxlQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDaEUsQ0FBQztJQUVELG1IQUFtSDtJQUM1RyxLQUFLLENBQUMsaUJBQWlCLENBQUMsUUFBYyxFQUFFLE9BQWdCO1FBQzNELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBb0IsZUFBTyxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRyxDQUFDLENBQUE7SUFDbEcsQ0FBQztJQUVNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxPQUFhO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBTSxlQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFPLEVBQUcsQ0FBQyxDQUFBO0lBQzNFLENBQUM7Q0FDSjtBQTNCRCw0QkEyQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSnNvblJwY1Byb3ZpZGVyLCBKc29uUnBjUHJvdmlkZXIgfSBmcm9tIFwiLi9wcm92aWRlclwiXHJcbmltcG9ydCB7IERhdGFSZXF1ZXN0UmVwb3J0LCBNZXRob2RzLCBQZWVyQWRkciwgU3VwcGx5SW5mbywgfSBmcm9tIFwiLi90eXBlc1wiXHJcbmltcG9ydCB7IEhhc2ggfSBmcm9tIFwiLi4vdHlwZXNcIlxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVwb3J0ZXIgZXh0ZW5kcyBJSnNvblJwY1Byb3ZpZGVyIHtcclxuICAgIHByb3ZpZGVycygpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+XHJcbiAgICBzdXBwbHlJbmZvKCk6IFByb21pc2U8U3VwcGx5SW5mbz47XHJcblxyXG4gICAgZ2V0RGF0YVJlcXVlc3QoZHJUeEhhc2g6IEhhc2gsIGNoYW5uZWw/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFSZXF1ZXN0UmVwb3J0PlxyXG4gICAgc2VhcmNoRGF0YVJlcXVlc3RzKHJhZEhhc2g6IEhhc2gpOiBQcm9taXNlPGFueT47XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZXBvcnRlciBleHRlbmRzIEpzb25ScGNQcm92aWRlciBpbXBsZW1lbnRzIElSZXBvcnRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcih1cmw/OiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcih1cmwgfHwgcHJvY2Vzcy5lbnYuV0lUTkVUX1RPT0xLSVRfUkVQT1JURVJfVVJMIHx8IFwiaHR0cHM6Ly9rZXJtaXQud2l0bmV0LmlvXCIpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAgIHB1YmxpYyBwZWVycygpOiBQcm9taXNlPEFycmF5PFBlZXJBZGRyPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8QXJyYXk8UGVlckFkZHI+PihNZXRob2RzLktub3duUGVlcnMpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgYXN5bmMgcHJvdmlkZXJzKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8QXJyYXk8c3RyaW5nPj4oTWV0aG9kcy5Qcm92aWRlcnMpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vLyBHZXQgc3VwcGx5IGluZm9cclxuICAgIHB1YmxpYyBhc3luYyBzdXBwbHlJbmZvKCk6IFByb21pc2U8U3VwcGx5SW5mbz4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8U3VwcGx5SW5mbz4oTWV0aG9kcy5HZXRTdXBwbHlJbmZvKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgICBwdWJsaWMgYXN5bmMgcmVwb3J0RGF0YVJlcXVlc3QoZHJUeEhhc2g6IEhhc2gsIGNoYW5uZWw/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFSZXF1ZXN0UmVwb3J0PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbEFwaU1ldGhvZDxEYXRhUmVxdWVzdFJlcG9ydD4oTWV0aG9kcy5EYXRhUmVxdWVzdFJlcG9ydCwgW2RyVHhIYXNoLCBjaGFubmVsLCBdKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoRGF0YVJlcXVlc3RzKHJhZEhhc2g6IEhhc2gpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxBcGlNZXRob2Q8YW55PihNZXRob2RzLlNlYXJjaERhdGFSZXF1ZXN0cywgW3JhZEhhc2gsIF0pXHJcbiAgICB9XHJcbn1cclxuIl19