essential-eth 0.4.11 → 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.
- package/lib/cjs/classes/Contract.d.ts +3 -2
- package/lib/cjs/classes/Contract.js +3 -2
- package/lib/cjs/classes/utils/clean-block.d.ts +3 -3
- package/lib/cjs/classes/utils/clean-block.js +3 -2
- package/lib/cjs/classes/utils/clean-transaction.d.ts +3 -3
- package/lib/cjs/classes/utils/clean-transaction.js +10 -6
- package/lib/cjs/classes/utils/encode-decode-transaction.d.ts +1 -0
- package/lib/cjs/classes/utils/encode-decode-transaction.js +4 -4
- package/lib/cjs/classes/utils/fetchers.d.ts +1 -1
- package/lib/cjs/index.d.ts +6 -3
- package/lib/cjs/index.js +19 -1
- package/lib/cjs/logger/logger.d.ts +11 -0
- package/lib/cjs/logger/logger.js +36 -0
- package/lib/cjs/logger/package-version.d.ts +1 -0
- package/lib/cjs/logger/package-version.js +5 -0
- package/lib/cjs/providers/BaseProvider.d.ts +261 -0
- package/lib/cjs/providers/BaseProvider.js +340 -0
- package/lib/cjs/providers/FallthroughProvider.d.ts +25 -0
- package/lib/cjs/providers/FallthroughProvider.js +65 -0
- package/lib/cjs/providers/JsonRpcProvider.d.ts +7 -33
- package/lib/cjs/providers/JsonRpcProvider.js +11 -93
- package/lib/cjs/providers/test/rpc-urls.d.ts +1 -0
- package/lib/cjs/providers/test/rpc-urls.js +1 -0
- package/lib/cjs/providers/utils/chains-info.d.ts +14 -0
- package/lib/cjs/providers/utils/chains-info.js +42 -0
- package/lib/cjs/shared/tiny-big/tiny-big.d.ts +9 -2
- package/lib/cjs/shared/tiny-big/tiny-big.js +26 -2
- package/lib/cjs/types/Block.types.d.ts +8 -19
- package/lib/cjs/types/Transaction.types.d.ts +23 -14
- package/lib/cjs/utils/bytes.d.ts +171 -0
- package/lib/cjs/utils/bytes.js +564 -0
- package/lib/cjs/utils/solidity-keccak256.d.ts +30 -0
- package/lib/cjs/utils/solidity-keccak256.js +125 -0
- package/lib/esm/classes/Contract.js +1 -1
- package/lib/esm/classes/utils/clean-block.d.ts +2 -2
- package/lib/esm/classes/utils/clean-block.js +2 -1
- package/lib/esm/classes/utils/clean-transaction.d.ts +2 -2
- package/lib/esm/classes/utils/clean-transaction.js +10 -6
- package/lib/esm/classes/utils/encode-decode-transaction.d.ts +1 -0
- package/lib/esm/classes/utils/encode-decode-transaction.js +2 -2
- package/lib/esm/classes/utils/fetchers.d.ts +1 -1
- package/lib/esm/index.d.ts +6 -3
- package/lib/esm/index.js +4 -1
- package/lib/esm/logger/logger.d.ts +11 -0
- package/lib/esm/logger/logger.js +33 -0
- package/lib/esm/logger/package-version.d.ts +1 -0
- package/lib/esm/logger/package-version.js +1 -0
- package/lib/esm/providers/BaseProvider.d.ts +17 -0
- package/lib/esm/providers/BaseProvider.js +88 -0
- package/lib/esm/providers/FallthroughProvider.d.ts +12 -0
- package/lib/esm/providers/FallthroughProvider.js +41 -0
- package/lib/esm/providers/JsonRpcProvider.d.ts +4 -9
- package/lib/esm/providers/JsonRpcProvider.js +8 -67
- package/lib/esm/providers/test/rpc-urls.d.ts +1 -0
- package/lib/esm/providers/test/rpc-urls.js +1 -0
- package/lib/esm/providers/utils/chains-info.d.ts +14 -0
- package/lib/esm/providers/utils/chains-info.js +42 -0
- package/lib/esm/shared/tiny-big/tiny-big.d.ts +2 -0
- package/lib/esm/shared/tiny-big/tiny-big.js +19 -0
- package/lib/esm/types/Block.types.d.ts +7 -19
- package/lib/esm/types/Transaction.types.d.ts +22 -14
- package/lib/esm/utils/bytes.d.ts +39 -0
- package/lib/esm/utils/bytes.js +245 -0
- package/lib/esm/utils/solidity-keccak256.d.ts +3 -0
- package/lib/esm/utils/solidity-keccak256.js +91 -0
- package/package.json +19 -19
- package/readme.md +251 -61
|
@@ -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,43 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
import { Network } from '../types/Network.types';
|
|
4
|
-
export declare class JsonRpcProvider {
|
|
1
|
+
import { BaseProvider } from './BaseProvider';
|
|
2
|
+
export declare class JsonRpcProvider extends BaseProvider {
|
|
5
3
|
/**
|
|
6
4
|
* @ignore
|
|
7
5
|
*/
|
|
8
|
-
|
|
6
|
+
selectRpcUrl(): string;
|
|
9
7
|
/**
|
|
10
|
-
* @
|
|
11
|
-
*/
|
|
12
|
-
constructor(rpcUrl?: string);
|
|
13
|
-
/**
|
|
14
|
-
* Returns the block requested
|
|
15
|
-
* Same as `web3.eth.getBlock`
|
|
16
|
-
*/
|
|
17
|
-
getBlock(timeFrame: BlockTag, returnTransactionObjects?: boolean): Promise<Block>;
|
|
18
|
-
/**
|
|
19
|
-
* Returns the network this provider is connected to
|
|
20
|
-
*/
|
|
21
|
-
getNetwork(): Promise<Network>;
|
|
22
|
-
/**
|
|
23
|
-
* Returns the current gas price in wei as TinyBig
|
|
24
|
-
* Same as `ethers.provider.getGasPrice`
|
|
8
|
+
* @ignore
|
|
25
9
|
*/
|
|
26
|
-
|
|
10
|
+
post(body: Record<string, unknown>): Promise<any>;
|
|
27
11
|
/**
|
|
28
|
-
*
|
|
29
|
-
* Same as `ethers.provider.getBalance`
|
|
30
|
-
* Same as `web3.eth.getBalance`
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```js
|
|
34
|
-
* await provider
|
|
35
|
-
* .getBalance('0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8')
|
|
36
|
-
* .then((balance) => console.log(balance.toString()));
|
|
37
|
-
* // "28798127851528138"
|
|
38
|
-
* ```
|
|
12
|
+
* @param rpcUrl The URL to your Eth node. Consider POKT or Infura
|
|
39
13
|
*/
|
|
40
|
-
|
|
14
|
+
constructor(rpcUrl?: string);
|
|
41
15
|
}
|
|
42
16
|
/**
|
|
43
17
|
* Helper function to avoid "new"
|
|
@@ -1,107 +1,25 @@
|
|
|
1
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
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
3
|
exports.jsonRpcProvider = exports.JsonRpcProvider = void 0;
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
const hex_to_decimal_1 = require("../classes/utils/hex-to-decimal");
|
|
19
|
-
const tiny_big_1 = require("../shared/tiny-big/tiny-big");
|
|
20
|
-
const chains_info_1 = __importDefault(require("./utils/chains-info"));
|
|
21
|
-
class JsonRpcProvider {
|
|
4
|
+
const BaseProvider_1 = require("./BaseProvider");
|
|
5
|
+
class JsonRpcProvider extends BaseProvider_1.BaseProvider {
|
|
22
6
|
/**
|
|
23
|
-
* @
|
|
24
|
-
*/
|
|
25
|
-
constructor(rpcUrl) {
|
|
26
|
-
this._rpcUrl = rpcUrl || 'https://free-eth-node.com/api/eth';
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Returns the block requested
|
|
30
|
-
* Same as `web3.eth.getBlock`
|
|
7
|
+
* @ignore
|
|
31
8
|
*/
|
|
32
|
-
|
|
33
|
-
return
|
|
34
|
-
let rpcTimeFrame;
|
|
35
|
-
if (typeof timeFrame === 'number') {
|
|
36
|
-
// exact block numbers require hex string format
|
|
37
|
-
rpcTimeFrame = `0x${timeFrame.toString(16)}`;
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
// "latest", "earliest", and "pending" require no manipulation
|
|
41
|
-
rpcTimeFrame = timeFrame;
|
|
42
|
-
}
|
|
43
|
-
const req = () => {
|
|
44
|
-
return (0, fetchers_1.post)(this._rpcUrl, (0, fetchers_1.buildRPCPostBody)('eth_getBlockByNumber', [
|
|
45
|
-
rpcTimeFrame,
|
|
46
|
-
returnTransactionObjects,
|
|
47
|
-
]));
|
|
48
|
-
};
|
|
49
|
-
const nodeResponse = (yield req());
|
|
50
|
-
return (0, clean_block_1.cleanBlock)(nodeResponse, returnTransactionObjects);
|
|
51
|
-
});
|
|
9
|
+
selectRpcUrl() {
|
|
10
|
+
return this._rpcUrls[0];
|
|
52
11
|
}
|
|
53
12
|
/**
|
|
54
|
-
*
|
|
13
|
+
* @ignore
|
|
55
14
|
*/
|
|
56
|
-
|
|
57
|
-
return
|
|
58
|
-
const req = () => {
|
|
59
|
-
return (0, fetchers_1.post)(this._rpcUrl, (0, fetchers_1.buildRPCPostBody)('eth_chainId', []));
|
|
60
|
-
};
|
|
61
|
-
const nodeResponse = (yield req());
|
|
62
|
-
const chainId = (0, hex_to_decimal_1.hexToDecimal)(nodeResponse);
|
|
63
|
-
const info = chains_info_1.default[chainId];
|
|
64
|
-
return {
|
|
65
|
-
chainId: Number(chainId),
|
|
66
|
-
name: info[0] || 'unknown',
|
|
67
|
-
ensAddress: info[1] || null, // only send ensAddress if it exists
|
|
68
|
-
};
|
|
69
|
-
});
|
|
15
|
+
post(body) {
|
|
16
|
+
return this._post(body);
|
|
70
17
|
}
|
|
71
18
|
/**
|
|
72
|
-
*
|
|
73
|
-
* Same as `ethers.provider.getGasPrice`
|
|
74
|
-
*/
|
|
75
|
-
getGasPrice() {
|
|
76
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
-
const req = () => {
|
|
78
|
-
return (0, fetchers_1.post)(this._rpcUrl, (0, fetchers_1.buildRPCPostBody)('eth_gasPrice', []));
|
|
79
|
-
};
|
|
80
|
-
const nodeResponse = (yield req()); /* '0x153cfb1ad0' */
|
|
81
|
-
return (0, tiny_big_1.tinyBig)((0, hex_to_decimal_1.hexToDecimal)(nodeResponse));
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Returns the balance of the account in wei as TinyBig
|
|
86
|
-
* Same as `ethers.provider.getBalance`
|
|
87
|
-
* Same as `web3.eth.getBalance`
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* ```js
|
|
91
|
-
* await provider
|
|
92
|
-
* .getBalance('0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8')
|
|
93
|
-
* .then((balance) => console.log(balance.toString()));
|
|
94
|
-
* // "28798127851528138"
|
|
95
|
-
* ```
|
|
19
|
+
* @param rpcUrl The URL to your Eth node. Consider POKT or Infura
|
|
96
20
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const req = () => {
|
|
100
|
-
return (0, fetchers_1.post)(this._rpcUrl, (0, fetchers_1.buildRPCPostBody)('eth_getBalance', [address, blockTag]));
|
|
101
|
-
};
|
|
102
|
-
const nodeResponse = (yield req()); /* '0x153cfb1ad0' */
|
|
103
|
-
return (0, tiny_big_1.tinyBig)((0, hex_to_decimal_1.hexToDecimal)(nodeResponse));
|
|
104
|
-
});
|
|
21
|
+
constructor(rpcUrl = 'https://free-eth-node.com/api/eth') {
|
|
22
|
+
super([rpcUrl]);
|
|
105
23
|
}
|
|
106
24
|
}
|
|
107
25
|
exports.JsonRpcProvider = JsonRpcProvider;
|
|
@@ -6,6 +6,7 @@ exports.fakeUrls = {
|
|
|
6
6
|
};
|
|
7
7
|
exports.rpcUrls = {
|
|
8
8
|
mainnet: `${process.env.RPC_ORIGIN}/api/eth`,
|
|
9
|
+
matic: `${process.env.RPC_ORIGIN}/api/MATIC`,
|
|
9
10
|
gno: `${process.env.RPC_ORIGIN}/api/gno`,
|
|
10
11
|
bnb: `${process.env.RPC_ORIGIN}/api/bnb`,
|
|
11
12
|
arb1: `${process.env.RPC_ORIGIN}/api/arb1`,
|