@lifi/sdk 1.1.0 → 1.1.3

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.
@@ -1,15 +1,3 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -19,43 +7,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
19
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
20
8
  });
21
9
  };
22
- var __generator = (this && this.__generator) || function (thisArg, body) {
23
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
- function verb(n) { return function (v) { return step([n, v]); }; }
26
- function step(op) {
27
- if (f) throw new TypeError("Generator is already executing.");
28
- while (_) try {
29
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
- if (y = 0, t) op = [op[0] & 2, t.value];
31
- switch (op[0]) {
32
- case 0: case 1: t = op; break;
33
- case 4: _.label++; return { value: op[1], done: false };
34
- case 5: _.label++; y = op[1]; op = [0]; continue;
35
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
- default:
37
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
- if (t[2]) _.ops.pop();
42
- _.trys.pop(); continue;
43
- }
44
- op = body.call(thisArg, _);
45
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
- }
48
- };
49
- var __importDefault = (this && this.__importDefault) || function (mod) {
50
- return (mod && mod.__esModule) ? mod : { "default": mod };
51
- };
52
- Object.defineProperty(exports, "__esModule", { value: true });
53
- var bignumber_js_1 = __importDefault(require("bignumber.js"));
54
- var ethers_1 = require("ethers");
55
- var connectors_1 = require("../connectors");
56
- var multicall_1 = require("../utils/multicall");
57
- var utils_1 = require("../utils/utils");
58
- var balanceAbi = [
10
+ import BigNumber from 'bignumber.js';
11
+ import { ethers } from 'ethers';
12
+ import { getMulticallAddress, getRpcProvider } from '../connectors';
13
+ import { fetchDataUsingMulticall } from '../utils/multicall';
14
+ import { isZeroAddress } from '../utils/utils';
15
+ const balanceAbi = [
59
16
  {
60
17
  constant: true,
61
18
  inputs: [{ name: 'who', type: 'address' }],
@@ -75,181 +32,114 @@ var balanceAbi = [
75
32
  type: 'function',
76
33
  },
77
34
  ];
78
- var getBalances = function (walletAddress, tokens) { return __awaiter(void 0, void 0, void 0, function () {
79
- var chainId;
80
- return __generator(this, function (_a) {
81
- switch (_a.label) {
82
- case 0:
83
- if (tokens.length === 0) {
84
- return [2 /*return*/, []];
85
- }
86
- chainId = tokens[0].chainId;
87
- tokens.forEach(function (token) {
88
- if (token.chainId !== chainId) {
89
- // eslint-disable-next-line no-console
90
- console.warn("Requested tokens have to be on same chain.");
91
- return [];
92
- }
93
- });
94
- return [4 /*yield*/, (0, connectors_1.getMulticallAddress)(chainId)];
95
- case 1:
96
- if ((_a.sent()) && tokens.length > 1) {
97
- return [2 /*return*/, getBalancesFromProviderUsingMulticall(walletAddress, tokens)];
98
- }
99
- else {
100
- return [2 /*return*/, getBalancesFromProvider(walletAddress, tokens)];
101
- }
102
- return [2 /*return*/];
103
- }
104
- });
105
- }); };
106
- var getBalancesFromProviderUsingMulticall = function (walletAddress, tokens) { return __awaiter(void 0, void 0, void 0, function () {
107
- var chainId, multicallAddress;
108
- return __generator(this, function (_a) {
109
- switch (_a.label) {
110
- case 0:
111
- chainId = tokens[0].chainId;
112
- return [4 /*yield*/, (0, connectors_1.getMulticallAddress)(chainId)];
113
- case 1:
114
- multicallAddress = _a.sent();
115
- if (!multicallAddress) {
116
- throw new Error('No multicallAddress found for the given chain.');
117
- }
118
- return [2 /*return*/, executeMulticall(walletAddress, tokens, multicallAddress, chainId)];
35
+ const getBalances = (walletAddress, tokens) => __awaiter(void 0, void 0, void 0, function* () {
36
+ if (tokens.length === 0) {
37
+ return [];
38
+ }
39
+ const { chainId } = tokens[0];
40
+ tokens.forEach((token) => {
41
+ if (token.chainId !== chainId) {
42
+ // eslint-disable-next-line no-console
43
+ console.warn(`Requested tokens have to be on same chain.`);
44
+ return [];
119
45
  }
120
46
  });
121
- }); };
122
- var executeMulticall = function (walletAddress, tokens, multicallAddress, chainId) { return __awaiter(void 0, void 0, void 0, function () {
123
- var calls, res;
124
- return __generator(this, function (_a) {
125
- switch (_a.label) {
126
- case 0:
127
- calls = [];
128
- tokens.map(function (token) {
129
- if ((0, utils_1.isZeroAddress)(token.address)) {
130
- calls.push({
131
- address: multicallAddress,
132
- name: 'getEthBalance',
133
- params: [walletAddress],
134
- });
135
- }
136
- else {
137
- calls.push({
138
- address: token.address,
139
- name: 'balanceOf',
140
- params: [walletAddress],
141
- });
142
- }
143
- });
144
- return [4 /*yield*/, fetchViaMulticall(calls, balanceAbi, chainId, multicallAddress)];
145
- case 1:
146
- res = _a.sent();
147
- if (!res.length) {
148
- return [2 /*return*/, []];
149
- }
150
- return [2 /*return*/, tokens.map(function (token, i) {
151
- var amount = new bignumber_js_1.default(res[i].amount.toString() || '0')
152
- .shiftedBy(-token.decimals)
153
- .toFixed();
154
- return __assign(__assign({}, token), { amount: amount || '0', blockNumber: res[i].blockNumber });
155
- })];
47
+ if ((yield getMulticallAddress(chainId)) && tokens.length > 1) {
48
+ return getBalancesFromProviderUsingMulticall(walletAddress, tokens);
49
+ }
50
+ else {
51
+ return getBalancesFromProvider(walletAddress, tokens);
52
+ }
53
+ });
54
+ const getBalancesFromProviderUsingMulticall = (walletAddress, tokens) => __awaiter(void 0, void 0, void 0, function* () {
55
+ // Configuration
56
+ const { chainId } = tokens[0];
57
+ const multicallAddress = yield getMulticallAddress(chainId);
58
+ if (!multicallAddress) {
59
+ throw new Error('No multicallAddress found for the given chain.');
60
+ }
61
+ return executeMulticall(walletAddress, tokens, multicallAddress, chainId);
62
+ });
63
+ const executeMulticall = (walletAddress, tokens, multicallAddress, chainId) => __awaiter(void 0, void 0, void 0, function* () {
64
+ // Collect calls we want to make
65
+ const calls = [];
66
+ tokens.map((token) => {
67
+ if (isZeroAddress(token.address)) {
68
+ calls.push({
69
+ address: multicallAddress,
70
+ name: 'getEthBalance',
71
+ params: [walletAddress],
72
+ });
156
73
  }
157
- });
158
- }); };
159
- var fetchViaMulticall = function (calls, abi, chainId, multicallAddress) { return __awaiter(void 0, void 0, void 0, function () {
160
- var result;
161
- return __generator(this, function (_a) {
162
- switch (_a.label) {
163
- case 0: return [4 /*yield*/, (0, multicall_1.fetchDataUsingMulticall)(calls, abi, chainId, multicallAddress)];
164
- case 1:
165
- result = _a.sent();
166
- return [2 /*return*/, result.map(function (_a) {
167
- var data = _a.data, blockNumber = _a.blockNumber;
168
- return ({
169
- amount: data ? data : new bignumber_js_1.default(0),
170
- blockNumber: blockNumber,
171
- });
172
- })];
74
+ else {
75
+ calls.push({
76
+ address: token.address,
77
+ name: 'balanceOf',
78
+ params: [walletAddress],
79
+ });
173
80
  }
174
81
  });
175
- }); };
176
- var getBalancesFromProvider = function (walletAddress, tokens) { return __awaiter(void 0, void 0, void 0, function () {
177
- var chainId, rpc, tokenAmountPromises;
178
- return __generator(this, function (_a) {
179
- switch (_a.label) {
180
- case 0:
181
- chainId = tokens[0].chainId;
182
- return [4 /*yield*/, (0, connectors_1.getRpcProvider)(chainId)];
183
- case 1:
184
- rpc = _a.sent();
185
- tokenAmountPromises = tokens.map(function (token) { return __awaiter(void 0, void 0, void 0, function () {
186
- var amount, blockNumber, balance, e_1;
187
- return __generator(this, function (_a) {
188
- switch (_a.label) {
189
- case 0:
190
- amount = '0';
191
- _a.label = 1;
192
- case 1:
193
- _a.trys.push([1, 3, , 4]);
194
- return [4 /*yield*/, getBalanceFromProvider(walletAddress, token.address, chainId, rpc)];
195
- case 2:
196
- balance = _a.sent();
197
- amount = new bignumber_js_1.default(balance.amount.toString())
198
- .shiftedBy(-token.decimals)
199
- .toString();
200
- blockNumber = balance.blockNumber;
201
- return [3 /*break*/, 4];
202
- case 3:
203
- e_1 = _a.sent();
204
- // eslint-disable-next-line no-console
205
- console.warn(e_1);
206
- return [3 /*break*/, 4];
207
- case 4: return [2 /*return*/, __assign(__assign({}, token), { amount: amount, blockNumber: blockNumber })];
208
- }
209
- });
210
- }); });
211
- return [2 /*return*/, Promise.all(tokenAmountPromises)];
212
- }
82
+ const res = yield fetchViaMulticall(calls, balanceAbi, chainId, multicallAddress);
83
+ if (!res.length) {
84
+ return [];
85
+ }
86
+ return tokens.map((token, i) => {
87
+ const amount = new BigNumber(res[i].amount.toString() || '0')
88
+ .shiftedBy(-token.decimals)
89
+ .toFixed();
90
+ return Object.assign(Object.assign({}, token), { amount: amount || '0', blockNumber: res[i].blockNumber });
213
91
  });
214
- }); };
215
- var getBalanceFromProvider = function (walletAddress, assetId, chainId, provider) { return __awaiter(void 0, void 0, void 0, function () {
216
- var blockNumber, balance, contract;
217
- return __generator(this, function (_a) {
218
- switch (_a.label) {
219
- case 0: return [4 /*yield*/, getCurrentBlockNumber(chainId)];
220
- case 1:
221
- blockNumber = _a.sent();
222
- if (!(0, utils_1.isZeroAddress)(assetId)) return [3 /*break*/, 3];
223
- return [4 /*yield*/, provider.getBalance(walletAddress, blockNumber)];
224
- case 2:
225
- balance = _a.sent();
226
- return [3 /*break*/, 5];
227
- case 3:
228
- contract = new ethers_1.ethers.Contract(assetId, ['function balanceOf(address owner) view returns (uint256)'], provider);
229
- return [4 /*yield*/, contract.balanceOf(walletAddress, {
230
- blockTag: blockNumber,
231
- })];
232
- case 4:
233
- balance = _a.sent();
234
- _a.label = 5;
235
- case 5: return [2 /*return*/, {
236
- amount: balance,
237
- blockNumber: blockNumber,
238
- }];
92
+ });
93
+ const fetchViaMulticall = (calls, abi, chainId, multicallAddress) => __awaiter(void 0, void 0, void 0, function* () {
94
+ const result = yield fetchDataUsingMulticall(calls, abi, chainId, multicallAddress);
95
+ return result.map(({ data, blockNumber }) => ({
96
+ amount: data ? data : new BigNumber(0),
97
+ blockNumber,
98
+ }));
99
+ });
100
+ const getBalancesFromProvider = (walletAddress, tokens) => __awaiter(void 0, void 0, void 0, function* () {
101
+ const chainId = tokens[0].chainId;
102
+ const rpc = yield getRpcProvider(chainId);
103
+ const tokenAmountPromises = tokens.map((token) => __awaiter(void 0, void 0, void 0, function* () {
104
+ let amount = '0';
105
+ let blockNumber;
106
+ try {
107
+ const balance = yield getBalanceFromProvider(walletAddress, token.address, chainId, rpc);
108
+ amount = new BigNumber(balance.amount.toString())
109
+ .shiftedBy(-token.decimals)
110
+ .toString();
111
+ blockNumber = balance.blockNumber;
239
112
  }
240
- });
241
- }); };
242
- var getCurrentBlockNumber = function (chainId) { return __awaiter(void 0, void 0, void 0, function () {
243
- var rpc;
244
- return __generator(this, function (_a) {
245
- switch (_a.label) {
246
- case 0: return [4 /*yield*/, (0, connectors_1.getRpcProvider)(chainId)];
247
- case 1:
248
- rpc = _a.sent();
249
- return [2 /*return*/, rpc.getBlockNumber()];
113
+ catch (e) {
114
+ // eslint-disable-next-line no-console
115
+ console.warn(e);
250
116
  }
251
- });
252
- }); };
253
- exports.default = {
254
- getBalances: getBalances,
117
+ return Object.assign(Object.assign({}, token), { amount,
118
+ blockNumber });
119
+ }));
120
+ return Promise.all(tokenAmountPromises);
121
+ });
122
+ const getBalanceFromProvider = (walletAddress, assetId, chainId, provider) => __awaiter(void 0, void 0, void 0, function* () {
123
+ const blockNumber = yield getCurrentBlockNumber(chainId);
124
+ let balance;
125
+ if (isZeroAddress(assetId)) {
126
+ balance = yield provider.getBalance(walletAddress, blockNumber);
127
+ }
128
+ else {
129
+ const contract = new ethers.Contract(assetId, ['function balanceOf(address owner) view returns (uint256)'], provider);
130
+ balance = yield contract.balanceOf(walletAddress, {
131
+ blockTag: blockNumber,
132
+ });
133
+ }
134
+ return {
135
+ amount: balance,
136
+ blockNumber,
137
+ };
138
+ });
139
+ const getCurrentBlockNumber = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
140
+ const rpc = yield getRpcProvider(chainId);
141
+ return rpc.getBlockNumber();
142
+ });
143
+ export default {
144
+ getBalances,
255
145
  };
@@ -1,4 +1,3 @@
1
- "use strict";
2
1
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
2
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
3
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -8,143 +7,61 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
9
8
  });
10
9
  };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- var __importDefault = (this && this.__importDefault) || function (mod) {
39
- return (mod && mod.__esModule) ? mod : { "default": mod };
40
- };
41
- var _a;
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.getMulticallAddress = exports.getRpcProvider = exports.getRpcUrls = exports.getRpcUrl = void 0;
44
- var ethers_1 = require("ethers");
45
- var _1 = require(".");
46
- var types_1 = require("./types");
47
- var ConfigService_1 = __importDefault(require("./services/ConfigService"));
10
+ import { providers } from 'ethers';
11
+ import { getRandomNumber, ServerError } from '.';
12
+ import { ChainId } from './types';
13
+ import ConfigService from './services/ConfigService';
48
14
  // cached providers
49
- var chainProviders = {};
15
+ const chainProviders = {};
50
16
  // Archive RPC Provider
51
- var archiveRpcs = (_a = {},
52
- _a[types_1.ChainId.ETH] = 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/eth/mainnet/archive',
53
- _a[types_1.ChainId.BSC] = 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/bsc/mainnet/archive',
54
- _a[types_1.ChainId.POL] = 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/polygon/mainnet/archive',
55
- _a[types_1.ChainId.FTM] = 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/fantom/mainnet',
56
- _a);
57
- // RPC Urls
58
- var getRpcUrl = function (chainId, archive) {
59
- if (archive === void 0) { archive = false; }
60
- return __awaiter(void 0, void 0, void 0, function () {
61
- var rpcUrls;
62
- return __generator(this, function (_a) {
63
- switch (_a.label) {
64
- case 0: return [4 /*yield*/, (0, exports.getRpcUrls)(chainId, archive)];
65
- case 1:
66
- rpcUrls = _a.sent();
67
- return [2 /*return*/, rpcUrls[0]];
68
- }
69
- });
70
- });
71
- };
72
- exports.getRpcUrl = getRpcUrl;
73
- var getRpcUrls = function (chainId, archive) {
74
- if (archive === void 0) { archive = false; }
75
- return __awaiter(void 0, void 0, void 0, function () {
76
- var configService, config;
77
- return __generator(this, function (_a) {
78
- switch (_a.label) {
79
- case 0:
80
- if (archive && archiveRpcs[chainId]) {
81
- return [2 /*return*/, [archiveRpcs[chainId]]];
82
- }
83
- configService = ConfigService_1.default.getInstance();
84
- return [4 /*yield*/, configService.getConfigAsync()];
85
- case 1:
86
- config = _a.sent();
87
- return [2 /*return*/, config.rpcs[chainId]];
88
- }
89
- });
90
- });
17
+ const archiveRpcs = {
18
+ [ChainId.ETH]: 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/eth/mainnet/archive',
19
+ [ChainId.BSC]: 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/bsc/mainnet/archive',
20
+ [ChainId.POL]: 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/polygon/mainnet/archive',
21
+ [ChainId.FTM]: 'https://speedy-nodes-nyc.moralis.io/5ed6053dc39eba789ff466c9/fantom/mainnet',
91
22
  };
92
- exports.getRpcUrls = getRpcUrls;
93
- var getRandomProvider = function (providerList) {
94
- var index = (0, _1.getRandomNumber)(0, providerList.length - 1);
23
+ // RPC Urls
24
+ export const getRpcUrl = (chainId, archive = false) => __awaiter(void 0, void 0, void 0, function* () {
25
+ const rpcUrls = yield getRpcUrls(chainId, archive);
26
+ return rpcUrls[0];
27
+ });
28
+ export const getRpcUrls = (chainId, archive = false) => __awaiter(void 0, void 0, void 0, function* () {
29
+ if (archive && archiveRpcs[chainId]) {
30
+ return [archiveRpcs[chainId]];
31
+ }
32
+ const configService = ConfigService.getInstance();
33
+ const config = yield configService.getConfigAsync();
34
+ return config.rpcs[chainId];
35
+ });
36
+ const getRandomProvider = (providerList) => {
37
+ const index = getRandomNumber(0, providerList.length - 1);
95
38
  return providerList[index];
96
39
  };
97
40
  // Provider
98
- var getRpcProvider = function (chainId, archive) {
99
- if (archive === void 0) { archive = false; }
100
- return __awaiter(void 0, void 0, void 0, function () {
101
- var _a, _b, _c, _d, urls;
102
- return __generator(this, function (_e) {
103
- switch (_e.label) {
104
- case 0:
105
- if (!(archive && archiveRpcs[chainId])) return [3 /*break*/, 2];
106
- _b = (_a = ethers_1.providers.FallbackProvider).bind;
107
- _d = (_c = ethers_1.providers.StaticJsonRpcProvider).bind;
108
- return [4 /*yield*/, (0, exports.getRpcUrl)(chainId, archive)];
109
- case 1:
110
- // return archive PRC, but don't cache it
111
- return [2 /*return*/, new (_b.apply(_a, [void 0, [
112
- new (_d.apply(_c, [void 0, _e.sent(), chainId]))()
113
- ]]))()];
114
- case 2:
115
- if (!!chainProviders[chainId]) return [3 /*break*/, 4];
116
- chainProviders[chainId] = [];
117
- return [4 /*yield*/, (0, exports.getRpcUrls)(chainId, archive)];
118
- case 3:
119
- urls = _e.sent();
120
- urls.forEach(function (url) {
121
- chainProviders[chainId].push(new ethers_1.providers.FallbackProvider([
122
- new ethers_1.providers.StaticJsonRpcProvider(url, chainId),
123
- ]));
124
- });
125
- _e.label = 4;
126
- case 4:
127
- if (!chainProviders[chainId].length) {
128
- throw new _1.ServerError("Unable to configure provider for chain ".concat(chainId));
129
- }
130
- return [2 /*return*/, getRandomProvider(chainProviders[chainId])];
131
- }
41
+ export const getRpcProvider = (chainId, archive = false) => __awaiter(void 0, void 0, void 0, function* () {
42
+ if (archive && archiveRpcs[chainId]) {
43
+ // return archive PRC, but don't cache it
44
+ return new providers.FallbackProvider([
45
+ new providers.StaticJsonRpcProvider(yield getRpcUrl(chainId, archive), chainId),
46
+ ]);
47
+ }
48
+ if (!chainProviders[chainId]) {
49
+ chainProviders[chainId] = [];
50
+ const urls = yield getRpcUrls(chainId, archive);
51
+ urls.forEach((url) => {
52
+ chainProviders[chainId].push(new providers.FallbackProvider([
53
+ new providers.StaticJsonRpcProvider(url, chainId),
54
+ ]));
132
55
  });
133
- });
134
- };
135
- exports.getRpcProvider = getRpcProvider;
56
+ }
57
+ if (!chainProviders[chainId].length) {
58
+ throw new ServerError(`Unable to configure provider for chain ${chainId}`);
59
+ }
60
+ return getRandomProvider(chainProviders[chainId]);
61
+ });
136
62
  // Multicall
137
- var getMulticallAddress = function (chainId) { return __awaiter(void 0, void 0, void 0, function () {
138
- var configService, config;
139
- return __generator(this, function (_a) {
140
- switch (_a.label) {
141
- case 0:
142
- configService = ConfigService_1.default.getInstance();
143
- return [4 /*yield*/, configService.getConfigAsync()];
144
- case 1:
145
- config = _a.sent();
146
- return [2 /*return*/, config.multicallAddresses[chainId]];
147
- }
148
- });
149
- }); };
150
- exports.getMulticallAddress = getMulticallAddress;
63
+ export const getMulticallAddress = (chainId) => __awaiter(void 0, void 0, void 0, function* () {
64
+ const configService = ConfigService.getInstance();
65
+ const config = yield configService.getConfigAsync();
66
+ return config.multicallAddresses[chainId];
67
+ });