@lifi/sdk 1.1.1 → 1.1.4
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/CHANGELOG.md +16 -0
- package/dist/Lifi.d.ts +1 -1
- package/dist/Lifi.js +179 -285
- package/dist/allowance/index.js +56 -148
- package/dist/allowance/utils.js +51 -116
- package/dist/balances/index.js +29 -92
- package/dist/balances/utils.js +108 -218
- package/dist/connectors.js +50 -133
- package/dist/execution/StatusManager.js +38 -40
- package/dist/execution/StepExecutor.js +54 -123
- package/dist/execution/allowance.execute.js +76 -142
- package/dist/execution/balanceCheck.execute.js +29 -74
- package/dist/execution/bridges/bridge.execute.js +132 -221
- package/dist/execution/exchanges/swap.execute.js +142 -225
- package/dist/execution/index.js +1 -17
- package/dist/execution/stepComparison.js +22 -61
- package/dist/execution/switchChain.js +33 -81
- package/dist/execution/utils.js +60 -119
- package/dist/helpers.js +15 -53
- package/dist/index.js +6 -25
- package/dist/services/ApiService.js +248 -385
- package/dist/services/ChainsService.js +29 -89
- package/dist/services/ConfigService.js +47 -86
- package/dist/typeguards.js +13 -21
- package/dist/types/ERC20.js +1 -4
- package/dist/types/index.js +4 -22
- package/dist/types/internal.types.js +1 -2
- package/dist/utils/errors.js +47 -93
- package/dist/utils/getProvider.js +3 -7
- package/dist/utils/multicall.js +61 -117
- package/dist/utils/parseError.js +73 -141
- package/dist/utils/preRestart.js +14 -21
- package/dist/utils/utils.js +47 -130
- package/package.json +3 -3
package/dist/balances/utils.js
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
return
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
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
|
-
|
|
254
|
-
|
|
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
|
};
|
package/dist/connectors.js
CHANGED
|
@@ -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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
15
|
+
const chainProviders = {};
|
|
50
16
|
// Archive RPC Provider
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
99
|
-
if (archive
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
+
});
|