essential-eth 0.5.1 → 0.5.4-alpha.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 (47) hide show
  1. package/lib/cjs/classes/Contract.d.ts +3 -2
  2. package/lib/cjs/classes/Contract.js +3 -2
  3. package/lib/cjs/classes/utils/encode-decode-transaction.d.ts +1 -0
  4. package/lib/cjs/classes/utils/encode-decode-transaction.js +4 -4
  5. package/lib/cjs/classes/utils/fetchers.d.ts +1 -1
  6. package/lib/cjs/index.d.ts +2 -1
  7. package/lib/cjs/index.js +3 -1
  8. package/lib/cjs/logger/package-version.d.ts +1 -1
  9. package/lib/cjs/logger/package-version.js +1 -1
  10. package/lib/cjs/providers/BaseProvider.d.ts +261 -0
  11. package/lib/cjs/providers/BaseProvider.js +340 -0
  12. package/lib/cjs/providers/FallthroughProvider.d.ts +25 -0
  13. package/lib/cjs/providers/FallthroughProvider.js +65 -0
  14. package/lib/cjs/providers/JsonRpcProvider.d.ts +4 -200
  15. package/lib/cjs/providers/JsonRpcProvider.js +11 -263
  16. package/lib/cjs/providers/test/rpc-urls.d.ts +1 -0
  17. package/lib/cjs/providers/test/rpc-urls.js +1 -0
  18. package/lib/cjs/providers/utils/chains-info.d.ts +4 -0
  19. package/lib/cjs/providers/utils/chains-info.js +12 -0
  20. package/lib/cjs/shared/tiny-big/tiny-big.d.ts +2 -2
  21. package/lib/cjs/shared/tiny-big/tiny-big.js +2 -2
  22. package/lib/cjs/utils/bytes.d.ts +82 -1
  23. package/lib/cjs/utils/bytes.js +83 -3
  24. package/lib/cjs/utils/solidity-keccak256.js +2 -2
  25. package/lib/esm/classes/Contract.js +1 -1
  26. package/lib/esm/classes/utils/encode-decode-transaction.d.ts +1 -0
  27. package/lib/esm/classes/utils/encode-decode-transaction.js +2 -2
  28. package/lib/esm/classes/utils/fetchers.d.ts +1 -1
  29. package/lib/esm/index.d.ts +2 -1
  30. package/lib/esm/index.js +2 -1
  31. package/lib/esm/logger/package-version.d.ts +1 -1
  32. package/lib/esm/logger/package-version.js +1 -1
  33. package/lib/esm/providers/BaseProvider.d.ts +17 -0
  34. package/lib/esm/providers/BaseProvider.js +88 -0
  35. package/lib/esm/providers/FallthroughProvider.d.ts +12 -0
  36. package/lib/esm/providers/FallthroughProvider.js +41 -0
  37. package/lib/esm/providers/JsonRpcProvider.d.ts +4 -12
  38. package/lib/esm/providers/JsonRpcProvider.js +8 -69
  39. package/lib/esm/providers/test/rpc-urls.d.ts +1 -0
  40. package/lib/esm/providers/test/rpc-urls.js +1 -0
  41. package/lib/esm/providers/utils/chains-info.d.ts +4 -0
  42. package/lib/esm/providers/utils/chains-info.js +12 -0
  43. package/lib/esm/utils/bytes.d.ts +1 -1
  44. package/lib/esm/utils/bytes.js +2 -2
  45. package/lib/esm/utils/solidity-keccak256.js +2 -2
  46. package/package.json +11 -9
  47. package/readme.md +32 -5
@@ -0,0 +1,340 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.BaseProvider = void 0;
16
+ const clean_block_1 = require("../classes/utils/clean-block");
17
+ const clean_transaction_1 = require("../classes/utils/clean-transaction");
18
+ const fetchers_1 = require("../classes/utils/fetchers");
19
+ const hex_to_decimal_1 = require("../classes/utils/hex-to-decimal");
20
+ const tiny_big_1 = require("../shared/tiny-big/tiny-big");
21
+ const chains_info_1 = __importDefault(require("./utils/chains-info"));
22
+ class BaseProvider {
23
+ /**
24
+ * @param rpcUrl The URL to your Eth node. Consider POKT or Infura
25
+ */
26
+ constructor(rpcUrls) {
27
+ /**
28
+ * @ignore
29
+ */
30
+ this._rpcUrls = [];
31
+ /**
32
+ * @ignore
33
+ */
34
+ this._post = (body) => (0, fetchers_1.post)(this.selectRpcUrl(), body);
35
+ this._rpcUrls = rpcUrls;
36
+ }
37
+ /**
38
+ * Returns the network this provider is connected to
39
+ */
40
+ getNetwork() {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ const hexChainId = (yield this.post((0, fetchers_1.buildRPCPostBody)('eth_chainId', [])));
43
+ const chainId = (0, hex_to_decimal_1.hexToDecimal)(hexChainId);
44
+ const info = chains_info_1.default[chainId];
45
+ return {
46
+ chainId: Number(chainId),
47
+ name: info[0] || 'unknown',
48
+ ensAddress: info[1] || null, // only send ensAddress if it exists
49
+ };
50
+ });
51
+ }
52
+ /**
53
+ * * Similar to [`ethers.provider.getTransaction`](https://docs.ethers.io/v5/api/providers/provider/#Provider-getTransaction), some information not included
54
+ *
55
+ * @returns information about one transaction
56
+ * @example
57
+ * ```js
58
+ * await provider.getTransaction('0x9014ae6ef92464338355a79e5150e542ff9a83e2323318b21f40d6a3e65b4789');
59
+ * {
60
+ * accessList: [],
61
+ * blockHash: '0x876810a013dbcd140f6fd6048c1dc33abbb901f1f96b394c2fa63aef3cb40b5d',
62
+ * blockNumber: 14578286,
63
+ * chainId: 1,
64
+ * from: '0xdfD9dE5f6FA60BD70636c0900752E93a6144AEd4',
65
+ * gas: Big {
66
+ * s: 1,
67
+ * e: 5,
68
+ * c: [ 1, 1, 2, 1, 6, 3 ],
69
+ * constructor: <ref *1> [Function: Big] {
70
+ * DP: 20,
71
+ * RM: 1,
72
+ * NE: -7,
73
+ * PE: 21,
74
+ * strict: false,
75
+ * roundDown: 0,
76
+ * roundHalfUp: 1,
77
+ * roundHalfEven: 2,
78
+ * roundUp: 3,
79
+ * Big: [Circular *1],
80
+ * default: [Circular *1]
81
+ * }
82
+ * },
83
+ * gasPrice: Big {
84
+ * s: 1,
85
+ * e: 10,
86
+ * c: [
87
+ * 4, 8, 5, 9, 2,
88
+ * 4, 2, 6, 8, 5,
89
+ * 8
90
+ * ],
91
+ * constructor: <ref *1> [Function: Big] {
92
+ * DP: 20,
93
+ * RM: 1,
94
+ * NE: -7,
95
+ * PE: 21,
96
+ * strict: false,
97
+ * roundDown: 0,
98
+ * roundHalfUp: 1,
99
+ * roundHalfEven: 2,
100
+ * roundUp: 3,
101
+ * Big: [Circular *1],
102
+ * default: [Circular *1]
103
+ * }
104
+ * },
105
+ * hash: '0x9014ae6ef92464338355a79e5150e542ff9a83e2323318b21f40d6a3e65b4789',
106
+ * input: '0x83259f170000000000000000000000000000000000000000000000000000000000000080000000000000000000000000dfd9de5f6fa60bd70636c0900752e93a6144aed400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009e99ad11a214fd016b19dc3648678c5944859ae292b21c24ca94f857836c4596f1950c82dd0c23dd621af4763edc2f66466e63c5df9de0c1107b1cd16bf460fe93e43fd308e3444bc79c3d88a4cb961dc8367ab6ad048867afc76d193bca99cf3a068864ed4a7df1dbf1d4c52238eced3e5e05644b4040fc2b3ccb8557b0e99fff6131305a0ea2b8061b90bd418db5bbdd2e92129f52d93f90531465e309c4caec5b85285822b6196398d36f16f511811b61bbda6461e80e29210cd303118bdcee8df6fa0505ffbe8642094fd2ba4dd458496fe3b459ac880bbf71877c713e969ccf5ed7efab8a84ebc07e3939901371ca427e1192e455a8f35a6a1d7ad09e1475dd1758b36fa631dab5d70e99316b23c4c43094188d360cd9c3457355904e07c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000162074a7047f',
107
+ * maxFeePerGas: Big {
108
+ * s: 1,
109
+ * e: 10,
110
+ * c: [
111
+ * 6, 7, 6, 8, 1,
112
+ * 2, 6, 1, 6, 1,
113
+ * 8
114
+ * ],
115
+ * constructor: <ref *1> [Function: Big] {
116
+ * DP: 20,
117
+ * RM: 1,
118
+ * NE: -7,
119
+ * PE: 21,
120
+ * strict: false,
121
+ * roundDown: 0,
122
+ * roundHalfUp: 1,
123
+ * roundHalfEven: 2,
124
+ * roundUp: 3,
125
+ * Big: [Circular *1],
126
+ * default: [Circular *1]
127
+ * }
128
+ * },
129
+ * maxPriorityFeePerGas: Big {
130
+ * s: 1,
131
+ * e: 9,
132
+ * c: [ 1, 5 ],
133
+ * constructor: <ref *1> [Function: Big] {
134
+ * DP: 20,
135
+ * RM: 1,
136
+ * NE: -7,
137
+ * PE: 21,
138
+ * strict: false,
139
+ * roundDown: 0,
140
+ * roundHalfUp: 1,
141
+ * roundHalfEven: 2,
142
+ * roundUp: 3,
143
+ * Big: [Circular *1],
144
+ * default: [Circular *1]
145
+ * }
146
+ * },
147
+ * nonce: 129,
148
+ * r: '0x59a7c15b12c18cd68d6c440963d959bff3e73831ffc938e75ecad07f7ee43fbc',
149
+ * s: '0x1ebaf05f0d9273b16c2a7748b150a79d22533a8cd74552611cbe620fee3dcf1c',
150
+ * to: '0x39B72d136ba3e4ceF35F48CD09587ffaB754DD8B',
151
+ * transactionIndex: 29,
152
+ * type: 2,
153
+ * v: 0,
154
+ * value: Big {
155
+ * s: 1,
156
+ * e: 0,
157
+ * c: [ 0 ],
158
+ * constructor: <ref *1> [Function: Big] {
159
+ * DP: 20,
160
+ * RM: 1,
161
+ * NE: -7,
162
+ * PE: 21,
163
+ * strict: false,
164
+ * roundDown: 0,
165
+ * roundHalfUp: 1,
166
+ * roundHalfEven: 2,
167
+ * roundUp: 3,
168
+ * Big: [Circular *1],
169
+ * default: [Circular *1]
170
+ * }
171
+ * },
172
+ * confirmations: 1210
173
+ * }
174
+ * ```
175
+ */
176
+ getTransaction(transactionHash) {
177
+ return __awaiter(this, void 0, void 0, function* () {
178
+ const [rpcTransaction, blockNumber] = yield Promise.all([
179
+ this.post((0, fetchers_1.buildRPCPostBody)('eth_getTransactionByHash', [transactionHash])),
180
+ this.getBlock('latest'),
181
+ ]);
182
+ const cleanedTransaction = (0, clean_transaction_1.cleanTransaction)(rpcTransaction);
183
+ // https://ethereum.stackexchange.com/questions/2881/how-to-get-the-transaction-confirmations-using-the-json-rpc
184
+ cleanedTransaction.confirmations =
185
+ blockNumber.number - cleanedTransaction.blockNumber + 1;
186
+ return cleanedTransaction;
187
+ });
188
+ }
189
+ /**
190
+ * Returns the transaction count from genesis up to specified blockTag
191
+ *
192
+ * * Same as `ethers.provider.getTransactionCount`
193
+ * * Same as `web3.eth.getTransactionCount`
194
+ *
195
+ * @example
196
+ * ```js
197
+ * const address = '0x71660c4005ba85c37ccec55d0c4493e66fe775d3';
198
+ * await provider
199
+ * .getTransactionCount(address, 'latest')
200
+ * // 1060000
201
+ * ```
202
+ *
203
+ * @example
204
+ * ```js
205
+ * await provider
206
+ * .getTransactionCount(address)
207
+ * // 1053312
208
+ * ```
209
+ *
210
+ * @example
211
+ * ```js
212
+ * await provider
213
+ * .getTransactionCount(address, 14649390)
214
+ * // 1053312
215
+ * ```
216
+ */
217
+ getTransactionCount(address, blockTag = 'latest') {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ if (typeof blockTag === 'number') {
220
+ blockTag = `0x${blockTag.toString(16)}`;
221
+ }
222
+ const transactionCount = (yield this.post((0, fetchers_1.buildRPCPostBody)('eth_getTransactionCount', [address, blockTag])));
223
+ return Number((0, hex_to_decimal_1.hexToDecimal)(transactionCount));
224
+ });
225
+ }
226
+ /**
227
+ * Gets information about a certain block.
228
+ * Same as `web3.eth.getBlock` and `ethers.providers.getBlock`
229
+ *
230
+ * @param timeFrame The number, hash, or text-based description ('latest', 'earliest', or 'pending') of the block to collect information on.
231
+ *
232
+ * @param returnTransactionObjects Whether to also return data about the transactions on the block.
233
+ *
234
+ * @returns A BlockResponse object with information about the specified block
235
+ *
236
+ * @example
237
+ * ```js
238
+ * await provider.getBlock(14645431);
239
+ * ```
240
+ *
241
+ * @example
242
+ * ```js
243
+ * await provider.getBlock('0x3e5cea9c2be7e0ab4b0aa04c24dafddc37571db2d2d345caf7f88b3366ece0cf');
244
+ * ```
245
+ *
246
+ * @example
247
+ * ```js
248
+ * await provider.getBlock('latest');
249
+ * {
250
+ * number: 4232826,
251
+ * hash: '0x93211a1cd17e154b183565ec685254a03f844a8e34824a46ce1bdd6753dcb669',
252
+ * parentHash: '0x1b32bfcba1bb2a57f56e166a3bb06875a1978992999dfc8828397b4c1526f472',
253
+ * sha3Uncles: '0x0fb399c67bb5a071ec8a22549223215ab76b7d4009941c9c37aa3c3936010463',
254
+ * logsBloom: '0x00000000000000000000101000000000020000000000000000000000000000000000400000010000000000000000000000000000010000000008800000000800000000200000000000000000000000000000000000000000000002000000000000000000000000000040000000000040000000000000000000000000000000000000000000000001000000000004000000000010000000000000000020000000000000000200100020000000000000000080000000000080001000000000000000000001040000000000000000008000000020010100000000200000100000000000000000000000002000000080000000020400000000002000200000000000',
255
+ * transactionsRoot: '0xc43b3f13e1fe810e34d3a26ffe465b72c7063a5c70a02de2c78e91e4d10bd9fb',
256
+ * stateRoot: '0x04d7bc816537ea7ef3a16e76c9879d29f34f99d4154273c2e98e012a31bad745',
257
+ * receiptsRoot: '0x89c6f781ceac0bd49c4d9aa9115df4a5d4dd0e0220ff7668012f15bc04222c6b',
258
+ * miner: '0x31fe561eb2c628cD32Ec52573D7c4b7E4C278Bfa',
259
+ * difficulty: '1300907486001755331049',
260
+ * totalDifficulty: '5989929395521171616186006183',
261
+ * extraData: '0xce018c495249532d62613031656132',
262
+ * size: 5416,
263
+ * gasLimit: 6800000,
264
+ * gasUsed: 202955,
265
+ * timestamp: 1649884910,
266
+ * transactions: [
267
+ * '0x6b34a59c7b9aead24fa6dad782f8a3ad84ed4a23ee09bcbf0bcf880840fbbe20',
268
+ * '0x9a3851ca24d5336c6a0d48aba2c4b4769d7a672c9b01729c5eb9924efd1b19a7',
269
+ * '0xc3ed3d198b62f2f3427ebfa3bbd0fcada4e3c0c189e4464e7eeceb403c75981e'
270
+ * ],
271
+ * uncles: [
272
+ * '0x0c567c054e98153f10d651fbbc018891c1dd9d62a9ffd998e87678803e95b6ed',
273
+ * '0xb7d69389dbfb057c6fcb4bc0582d46a2ba01170703f0dadf8cd1462b83e88753',
274
+ * '0xd5f74ccd0ad4c58b3161e8c2c507c264231e5f28925061b809c02e5e4bb6db28'
275
+ * ],
276
+ * minimumGasPrice: '0x387ee40',
277
+ * bitcoinMergedMiningHeader: '0x04000020e8567ed3d2480e15a1dd1b4335e4732ae343c037e4fd03000000000000000000ed10a8340d163d3e813bdd430f902f4e5a56828dc62313b2e23797c0be6b8516eb3e576297d8091735884f42',
278
+ * bitcoinMergedMiningCoinbaseTransaction: '0x0000000000000140e910128fda7bac502dc5e0573bbaf12de8e2524f70c22f7bd160dedcb19a2521002b6a2952534b424c4f434b3ae493303f597fa368c0ccc4f8aceabf1c315bb7c9a07605c073a89f260040967aace6a7d9',
279
+ * bitcoinMergedMiningMerkleProof: '0xdf63a3d7eb6fbcfb301311faa46e9a15b0408bb1a04e284daee86c273c1dfd65ede23f3170f806e9e0f4cef7ba6b56aa37470d9c23f96ec8e43d08b58645919c5e10bcb892897a731f8f9ce79c72dc0e390896bcd6c67bb38c0bdb72982b6cf05519968d76673572c3f3ef3a08b0ddb464863f1788f7cdbaad3fe44a8a8af576d430ac282fe28852c16df198ca96cc5f71a50695912efe1a836e8442be69e31b6d6f973da2818bce9a3a1c2d9be0671aee9a7776e398d6a03d1e178e20d84646004a3d03c0501334e629d9146aa6a01316dcbaa289df6e6c5e3090cadaddff22699cfc7ff09512fc0d65c5062f17c98561ce3c9510de210d9d654cf99f8d756ff37c9fa21e7122ee8cadb923341690845d572921425f2bd7e044558b7e07983ac4df28928028b0c13c3624dc7a965af8091b0cecc845bf7da5308c03b2c97d607f6706a599f802025894435f1d76ea4e67cc2fc4e1559f1206f559a24633de0f',
280
+ * hashForMergedMining: '0xe493303f597fa368c0ccc4f8aceabf1c315bb7c9a07605c073a89f260040967a',
281
+ * paidFees: '0xc0744dcb7a0',
282
+ * cumulativeDifficulty: '0x1190930db285269e582'
283
+ * }
284
+ *```
285
+ */
286
+ getBlock(timeFrame = 'latest', returnTransactionObjects = false) {
287
+ return __awaiter(this, void 0, void 0, function* () {
288
+ let rpcTimeFrame;
289
+ let type = 'Number';
290
+ if (typeof timeFrame === 'number') {
291
+ // exact block numbers require hex string format
292
+ rpcTimeFrame = `0x${timeFrame.toString(16)}`;
293
+ }
294
+ else if (timeFrame.startsWith('0x')) {
295
+ rpcTimeFrame = timeFrame;
296
+ // use endpoint that accepts string
297
+ type = 'Hash';
298
+ }
299
+ else {
300
+ // "latest", "earliest", "pending", or hex string require no manipulation
301
+ rpcTimeFrame = timeFrame;
302
+ }
303
+ const rpcBlock = (yield this.post((0, fetchers_1.buildRPCPostBody)(`eth_getBlockBy${type}`, [
304
+ rpcTimeFrame,
305
+ returnTransactionObjects,
306
+ ])));
307
+ return (0, clean_block_1.cleanBlock)(rpcBlock, returnTransactionObjects);
308
+ });
309
+ }
310
+ /**
311
+ * Returns the current gas price in wei as TinyBig
312
+ * Same as `ethers.provider.getGasPrice`
313
+ */
314
+ getGasPrice() {
315
+ return __awaiter(this, void 0, void 0, function* () {
316
+ const hexGasPrice = (yield this.post((0, fetchers_1.buildRPCPostBody)('eth_gasPrice', [])));
317
+ return (0, tiny_big_1.tinyBig)((0, hex_to_decimal_1.hexToDecimal)(hexGasPrice));
318
+ });
319
+ }
320
+ /**
321
+ * Returns the balance of the account in wei as TinyBig
322
+ * * Same as [`ethers.provider.getBalance`](https://docs.ethers.io/v5/api/providers/provider/#Provider-getBalance)
323
+ * * Same as `web3.eth.getBalance`
324
+ *
325
+ * @example
326
+ * ```js
327
+ * await provider
328
+ * .getBalance('0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8')
329
+ * .then((balance) => console.log(balance.toString()));
330
+ * // "28798127851528138"
331
+ * ```
332
+ */
333
+ getBalance(address, blockTag = 'latest') {
334
+ return __awaiter(this, void 0, void 0, function* () {
335
+ const hexBalance = (yield this.post((0, fetchers_1.buildRPCPostBody)('eth_getBalance', [address, blockTag])));
336
+ return (0, tiny_big_1.tinyBig)((0, hex_to_decimal_1.hexToDecimal)(hexBalance));
337
+ });
338
+ }
339
+ }
340
+ exports.BaseProvider = BaseProvider;
@@ -0,0 +1,25 @@
1
+ import { BaseProvider } from './BaseProvider';
2
+ interface ConstructorOptions {
3
+ timeoutDuration?: number;
4
+ }
5
+ /**
6
+ * @beta
7
+ * A JSON RPC Provider which moves to the next URL when one fails.
8
+ */
9
+ export declare class FallthroughProvider extends BaseProvider {
10
+ /**
11
+ * @ignore
12
+ */
13
+ private rpcUrlCounter;
14
+ private readonly timeoutDuration;
15
+ /**
16
+ * @ignore
17
+ */
18
+ selectRpcUrl(): string;
19
+ constructor(rpcUrls: string[], options?: ConstructorOptions);
20
+ /**
21
+ * @ignore
22
+ */
23
+ post: (body: Record<string, unknown>) => Promise<any>;
24
+ }
25
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FallthroughProvider = void 0;
4
+ const logger_1 = require("../logger/logger");
5
+ const BaseProvider_1 = require("./BaseProvider");
6
+ // https://advancedweb.hu/how-to-add-timeout-to-a-promise-in-javascript/
7
+ const promiseTimeout = (prom, time) => Promise.race([
8
+ prom,
9
+ new Promise((_r, reject) => setTimeout(() => reject('Promise timed out'), time)),
10
+ ]);
11
+ const DEFAULT_TIMEOUT_DURATION = 8000;
12
+ /**
13
+ * @beta
14
+ * A JSON RPC Provider which moves to the next URL when one fails.
15
+ */
16
+ class FallthroughProvider extends BaseProvider_1.BaseProvider {
17
+ constructor(rpcUrls, options = {}) {
18
+ if (!Array.isArray(rpcUrls)) {
19
+ logger_1.logger.throwError('Array required', { rpcUrls });
20
+ }
21
+ if (rpcUrls.length <= 1) {
22
+ logger_1.logger.throwError('More than one rpcUrl is required', { rpcUrls });
23
+ }
24
+ super(rpcUrls);
25
+ // index of current trusted rpc url
26
+ /**
27
+ * @ignore
28
+ */
29
+ this.rpcUrlCounter = 0;
30
+ /**
31
+ * @ignore
32
+ */
33
+ this.post = (body) => {
34
+ // while failing post, add to rpcUrlCounter and post again
35
+ const genesisCount = this.rpcUrlCounter;
36
+ const recursivePostRetry = () => {
37
+ // Times out request
38
+ const genesisRpcUrl = this.selectRpcUrl();
39
+ const res = promiseTimeout(this._post(body), this.timeoutDuration).catch((e) => {
40
+ // A mutex: Only add if no other instance has discovered this url as failing yet
41
+ if (genesisRpcUrl === this.selectRpcUrl()) {
42
+ // add one and handle array overflow
43
+ this.rpcUrlCounter =
44
+ (this.rpcUrlCounter + 1) % this._rpcUrls.length;
45
+ }
46
+ // we've already tried this rpc, throw for good
47
+ if (this.rpcUrlCounter === genesisCount) {
48
+ throw e;
49
+ }
50
+ return recursivePostRetry();
51
+ });
52
+ return res;
53
+ };
54
+ return recursivePostRetry();
55
+ };
56
+ this.timeoutDuration = options.timeoutDuration || DEFAULT_TIMEOUT_DURATION;
57
+ }
58
+ /**
59
+ * @ignore
60
+ */
61
+ selectRpcUrl() {
62
+ return this._rpcUrls[this.rpcUrlCounter];
63
+ }
64
+ }
65
+ exports.FallthroughProvider = FallthroughProvider;
@@ -1,213 +1,17 @@
1
- import { TinyBig } from '../shared/tiny-big/tiny-big';
2
- import { BlockResponse, BlockTag } from '../types/Block.types';
3
- import { Network } from '../types/Network.types';
4
- import { TransactionResponse } from '../types/Transaction.types';
5
- export declare class JsonRpcProvider {
1
+ import { BaseProvider } from './BaseProvider';
2
+ export declare class JsonRpcProvider extends BaseProvider {
6
3
  /**
7
4
  * @ignore
8
5
  */
9
- readonly _rpcUrl: string;
6
+ selectRpcUrl(): string;
10
7
  /**
11
8
  * @ignore
12
9
  */
13
- private post;
10
+ post(body: Record<string, unknown>): Promise<any>;
14
11
  /**
15
12
  * @param rpcUrl The URL to your Eth node. Consider POKT or Infura
16
13
  */
17
14
  constructor(rpcUrl?: string);
18
- /**
19
- * Returns the block requested
20
- * Same as `web3.eth.getBlock`
21
- * @example
22
- * ```js
23
- * await provider.getBlock('latest');
24
- * {
25
- * number: 4232826,
26
- * hash: '0x93211a1cd17e154b183565ec685254a03f844a8e34824a46ce1bdd6753dcb669',
27
- * parentHash: '0x1b32bfcba1bb2a57f56e166a3bb06875a1978992999dfc8828397b4c1526f472',
28
- * sha3Uncles: '0x0fb399c67bb5a071ec8a22549223215ab76b7d4009941c9c37aa3c3936010463',
29
- * logsBloom: '0x00000000000000000000101000000000020000000000000000000000000000000000400000010000000000000000000000000000010000000008800000000800000000200000000000000000000000000000000000000000000002000000000000000000000000000040000000000040000000000000000000000000000000000000000000000001000000000004000000000010000000000000000020000000000000000200100020000000000000000080000000000080001000000000000000000001040000000000000000008000000020010100000000200000100000000000000000000000002000000080000000020400000000002000200000000000',
30
- * transactionsRoot: '0xc43b3f13e1fe810e34d3a26ffe465b72c7063a5c70a02de2c78e91e4d10bd9fb',
31
- * stateRoot: '0x04d7bc816537ea7ef3a16e76c9879d29f34f99d4154273c2e98e012a31bad745',
32
- * receiptsRoot: '0x89c6f781ceac0bd49c4d9aa9115df4a5d4dd0e0220ff7668012f15bc04222c6b',
33
- * miner: '0x31fe561eb2c628cD32Ec52573D7c4b7E4C278Bfa',
34
- * difficulty: '1300907486001755331049',
35
- * totalDifficulty: '5989929395521171616186006183',
36
- * extraData: '0xce018c495249532d62613031656132',
37
- * size: 5416,
38
- * gasLimit: 6800000,
39
- * gasUsed: 202955,
40
- * timestamp: 1649884910,
41
- * transactions: [
42
- * '0x6b34a59c7b9aead24fa6dad782f8a3ad84ed4a23ee09bcbf0bcf880840fbbe20',
43
- * '0x9a3851ca24d5336c6a0d48aba2c4b4769d7a672c9b01729c5eb9924efd1b19a7',
44
- * '0xc3ed3d198b62f2f3427ebfa3bbd0fcada4e3c0c189e4464e7eeceb403c75981e'
45
- * ],
46
- * uncles: [
47
- * '0x0c567c054e98153f10d651fbbc018891c1dd9d62a9ffd998e87678803e95b6ed',
48
- * '0xb7d69389dbfb057c6fcb4bc0582d46a2ba01170703f0dadf8cd1462b83e88753',
49
- * '0xd5f74ccd0ad4c58b3161e8c2c507c264231e5f28925061b809c02e5e4bb6db28'
50
- * ],
51
- * minimumGasPrice: '0x387ee40',
52
- * bitcoinMergedMiningHeader: '0x04000020e8567ed3d2480e15a1dd1b4335e4732ae343c037e4fd03000000000000000000ed10a8340d163d3e813bdd430f902f4e5a56828dc62313b2e23797c0be6b8516eb3e576297d8091735884f42',
53
- * bitcoinMergedMiningCoinbaseTransaction: '0x0000000000000140e910128fda7bac502dc5e0573bbaf12de8e2524f70c22f7bd160dedcb19a2521002b6a2952534b424c4f434b3ae493303f597fa368c0ccc4f8aceabf1c315bb7c9a07605c073a89f260040967aace6a7d9',
54
- * bitcoinMergedMiningMerkleProof: '0xdf63a3d7eb6fbcfb301311faa46e9a15b0408bb1a04e284daee86c273c1dfd65ede23f3170f806e9e0f4cef7ba6b56aa37470d9c23f96ec8e43d08b58645919c5e10bcb892897a731f8f9ce79c72dc0e390896bcd6c67bb38c0bdb72982b6cf05519968d76673572c3f3ef3a08b0ddb464863f1788f7cdbaad3fe44a8a8af576d430ac282fe28852c16df198ca96cc5f71a50695912efe1a836e8442be69e31b6d6f973da2818bce9a3a1c2d9be0671aee9a7776e398d6a03d1e178e20d84646004a3d03c0501334e629d9146aa6a01316dcbaa289df6e6c5e3090cadaddff22699cfc7ff09512fc0d65c5062f17c98561ce3c9510de210d9d654cf99f8d756ff37c9fa21e7122ee8cadb923341690845d572921425f2bd7e044558b7e07983ac4df28928028b0c13c3624dc7a965af8091b0cecc845bf7da5308c03b2c97d607f6706a599f802025894435f1d76ea4e67cc2fc4e1559f1206f559a24633de0f',
55
- * hashForMergedMining: '0xe493303f597fa368c0ccc4f8aceabf1c315bb7c9a07605c073a89f260040967a',
56
- * paidFees: '0xc0744dcb7a0',
57
- * cumulativeDifficulty: '0x1190930db285269e582'
58
- * }
59
- *```
60
- */
61
- getBlock(timeFrame?: BlockTag, returnTransactionObjects?: boolean): Promise<BlockResponse>;
62
- /**
63
- * Returns the network this provider is connected to
64
- */
65
- getNetwork(): Promise<Network>;
66
- /**
67
- * Returns the current gas price in wei as TinyBig
68
- * Same as `ethers.provider.getGasPrice`
69
- */
70
- getGasPrice(): Promise<TinyBig>;
71
- /**
72
- * Returns the balance of the account in wei as TinyBig
73
- * Same as `ethers.provider.getBalance`
74
- * Same as `web3.eth.getBalance`
75
- *
76
- * @example
77
- * ```js
78
- * await provider
79
- * .getBalance('0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8')
80
- * .then((balance) => console.log(balance.toString()));
81
- * // "28798127851528138"
82
- * ```
83
- */
84
- getBalance(address: string, blockTag?: BlockTag): Promise<TinyBig>;
85
- /**
86
- * Similar to `ethers.provider.getTransaction`, some information not included
87
- *
88
- * @params hash A transaction hash
89
- * @returns information about one transaction
90
- * @example
91
- * ```js
92
- * await provider.getTransaction('0x9014ae6ef92464338355a79e5150e542ff9a83e2323318b21f40d6a3e65b4789');
93
- * {
94
- * accessList: [],
95
- * blockHash: '0x876810a013dbcd140f6fd6048c1dc33abbb901f1f96b394c2fa63aef3cb40b5d',
96
- * blockNumber: 14578286,
97
- * chainId: 1,
98
- * from: '0xdfD9dE5f6FA60BD70636c0900752E93a6144AEd4',
99
- * gas: Big {
100
- * s: 1,
101
- * e: 5,
102
- * c: [ 1, 1, 2, 1, 6, 3 ],
103
- * constructor: <ref *1> [Function: Big] {
104
- * DP: 20,
105
- * RM: 1,
106
- * NE: -7,
107
- * PE: 21,
108
- * strict: false,
109
- * roundDown: 0,
110
- * roundHalfUp: 1,
111
- * roundHalfEven: 2,
112
- * roundUp: 3,
113
- * Big: [Circular *1],
114
- * default: [Circular *1]
115
- * }
116
- * },
117
- * gasPrice: Big {
118
- * s: 1,
119
- * e: 10,
120
- * c: [
121
- * 4, 8, 5, 9, 2,
122
- * 4, 2, 6, 8, 5,
123
- * 8
124
- * ],
125
- * constructor: <ref *1> [Function: Big] {
126
- * DP: 20,
127
- * RM: 1,
128
- * NE: -7,
129
- * PE: 21,
130
- * strict: false,
131
- * roundDown: 0,
132
- * roundHalfUp: 1,
133
- * roundHalfEven: 2,
134
- * roundUp: 3,
135
- * Big: [Circular *1],
136
- * default: [Circular *1]
137
- * }
138
- * },
139
- * hash: '0x9014ae6ef92464338355a79e5150e542ff9a83e2323318b21f40d6a3e65b4789',
140
- * input: '0x83259f170000000000000000000000000000000000000000000000000000000000000080000000000000000000000000dfd9de5f6fa60bd70636c0900752e93a6144aed400000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000024000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000009e99ad11a214fd016b19dc3648678c5944859ae292b21c24ca94f857836c4596f1950c82dd0c23dd621af4763edc2f66466e63c5df9de0c1107b1cd16bf460fe93e43fd308e3444bc79c3d88a4cb961dc8367ab6ad048867afc76d193bca99cf3a068864ed4a7df1dbf1d4c52238eced3e5e05644b4040fc2b3ccb8557b0e99fff6131305a0ea2b8061b90bd418db5bbdd2e92129f52d93f90531465e309c4caec5b85285822b6196398d36f16f511811b61bbda6461e80e29210cd303118bdcee8df6fa0505ffbe8642094fd2ba4dd458496fe3b459ac880bbf71877c713e969ccf5ed7efab8a84ebc07e3939901371ca427e1192e455a8f35a6a1d7ad09e1475dd1758b36fa631dab5d70e99316b23c4c43094188d360cd9c3457355904e07c00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000162074a7047f',
141
- * maxFeePerGas: Big {
142
- * s: 1,
143
- * e: 10,
144
- * c: [
145
- * 6, 7, 6, 8, 1,
146
- * 2, 6, 1, 6, 1,
147
- * 8
148
- * ],
149
- * constructor: <ref *1> [Function: Big] {
150
- * DP: 20,
151
- * RM: 1,
152
- * NE: -7,
153
- * PE: 21,
154
- * strict: false,
155
- * roundDown: 0,
156
- * roundHalfUp: 1,
157
- * roundHalfEven: 2,
158
- * roundUp: 3,
159
- * Big: [Circular *1],
160
- * default: [Circular *1]
161
- * }
162
- * },
163
- * maxPriorityFeePerGas: Big {
164
- * s: 1,
165
- * e: 9,
166
- * c: [ 1, 5 ],
167
- * constructor: <ref *1> [Function: Big] {
168
- * DP: 20,
169
- * RM: 1,
170
- * NE: -7,
171
- * PE: 21,
172
- * strict: false,
173
- * roundDown: 0,
174
- * roundHalfUp: 1,
175
- * roundHalfEven: 2,
176
- * roundUp: 3,
177
- * Big: [Circular *1],
178
- * default: [Circular *1]
179
- * }
180
- * },
181
- * nonce: 129,
182
- * r: '0x59a7c15b12c18cd68d6c440963d959bff3e73831ffc938e75ecad07f7ee43fbc',
183
- * s: '0x1ebaf05f0d9273b16c2a7748b150a79d22533a8cd74552611cbe620fee3dcf1c',
184
- * to: '0x39B72d136ba3e4ceF35F48CD09587ffaB754DD8B',
185
- * transactionIndex: 29,
186
- * type: 2,
187
- * v: 0,
188
- * value: Big {
189
- * s: 1,
190
- * e: 0,
191
- * c: [ 0 ],
192
- * constructor: <ref *1> [Function: Big] {
193
- * DP: 20,
194
- * RM: 1,
195
- * NE: -7,
196
- * PE: 21,
197
- * strict: false,
198
- * roundDown: 0,
199
- * roundHalfUp: 1,
200
- * roundHalfEven: 2,
201
- * roundUp: 3,
202
- * Big: [Circular *1],
203
- * default: [Circular *1]
204
- * }
205
- * },
206
- * confirmations: 1210
207
- * }
208
- * ```
209
- */
210
- getTransaction(hash: string): Promise<TransactionResponse>;
211
15
  }
212
16
  /**
213
17
  * Helper function to avoid "new"