@defillama/sdk 2.3.28 → 2.3.29

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 (64) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +16 -16
  3. package/build/abi/cachedABIs.d.ts +4 -4
  4. package/build/abi/cachedABIs.js +70 -70
  5. package/build/abi/convertResults.d.ts +2 -2
  6. package/build/abi/convertResults.js +56 -56
  7. package/build/abi/index.d.ts +25 -25
  8. package/build/abi/index.js +166 -166
  9. package/build/abi/index.test.d.ts +1 -1
  10. package/build/abi/index.test.js +651 -651
  11. package/build/abi/multicall.d.ts +13 -13
  12. package/build/abi/multicall.js +210 -210
  13. package/build/api.d.ts +10 -10
  14. package/build/api.js +32 -32
  15. package/build/cdp/compoundTokens.d.ts +68 -68
  16. package/build/cdp/compoundTokens.js +69 -69
  17. package/build/cdp/index.d.ts +29 -29
  18. package/build/cdp/index.js +124 -124
  19. package/build/cdp/index.test.d.ts +1 -1
  20. package/build/cdp/index.test.js +82 -82
  21. package/build/cdp/makerTokens.d.ts +10 -10
  22. package/build/cdp/makerTokens.js +244 -244
  23. package/build/cli.d.ts +2 -2
  24. package/build/cli.js +95 -95
  25. package/build/computeTVL/blocks.d.ts +15 -15
  26. package/build/computeTVL/blocks.js +136 -136
  27. package/build/computeTVL/blocks.test.d.ts +1 -1
  28. package/build/computeTVL/blocks.test.js +56 -56
  29. package/build/computeTVL/humanizeNumber.d.ts +1 -1
  30. package/build/computeTVL/humanizeNumber.js +18 -18
  31. package/build/computeTVL/index.d.ts +50 -50
  32. package/build/computeTVL/index.js +371 -371
  33. package/build/computeTVL/index.test.d.ts +1 -1
  34. package/build/computeTVL/index.test.js +107 -107
  35. package/build/computeTVL/prices.d.ts +9 -9
  36. package/build/computeTVL/prices.js +163 -163
  37. package/build/erc20/index.d.ts +31 -31
  38. package/build/erc20/index.js +144 -144
  39. package/build/erc20/index.test.d.ts +1 -1
  40. package/build/erc20/index.test.js +124 -124
  41. package/build/eth/index.d.ts +21 -21
  42. package/build/eth/index.js +90 -90
  43. package/build/eth/index.test.d.ts +1 -1
  44. package/build/eth/index.test.js +122 -122
  45. package/build/general.d.ts +7 -7
  46. package/build/general.js +93 -92
  47. package/build/general.test.d.ts +1 -1
  48. package/build/general.test.js +73 -73
  49. package/build/generalUtil.d.ts +19 -19
  50. package/build/generalUtil.js +117 -117
  51. package/build/generalUtil.test.d.ts +1 -1
  52. package/build/generalUtil.test.js +59 -59
  53. package/build/index.d.ts +2 -2
  54. package/build/index.js +24 -24
  55. package/build/index.test.js +69 -69
  56. package/build/types.d.ts +5 -5
  57. package/build/types.js +2 -2
  58. package/build/util/index.d.ts +57 -57
  59. package/build/util/index.js +351 -351
  60. package/build/util/index.test.d.ts +1 -1
  61. package/build/util/index.test.js +314 -314
  62. package/build/util/tokenList.d.ts +14 -14
  63. package/build/util/tokenList.js +3631 -3631
  64. package/package.json +41 -41
@@ -1,351 +1,351 @@
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
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
- return new (P || (P = Promise))(function (resolve, reject) {
16
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
- step((generator = generator.apply(thisArg, _arguments || [])).next());
20
- });
21
- };
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
- exports.getLogs = exports.toSymbols = exports.kyberTokens = exports.tokenList = exports.lookupBlock = exports.getLatestBlock = void 0;
54
- var general_1 = require("../general");
55
- var node_fetch_1 = __importDefault(require("node-fetch"));
56
- var tokenList_1 = __importDefault(require("./tokenList"));
57
- var ethers_1 = require("ethers");
58
- var erc20_1 = require("../erc20");
59
- var kavaBlockProvider = {
60
- getBlock: function (height) { return __awaiter(void 0, void 0, void 0, function () {
61
- return __generator(this, function (_a) {
62
- return [2 /*return*/, node_fetch_1.default("https://api.data.kava.io/blocks/" + height)
63
- .then(function (res) { return res.json(); })
64
- .then(function (block) { return ({
65
- number: Number(block.block.header.height),
66
- timestamp: Math.round(Date.parse(block.block.header.time) / 1000),
67
- }); })];
68
- });
69
- }); },
70
- };
71
- var terraBlockProvider = {
72
- getBlock: function (height) { return __awaiter(void 0, void 0, void 0, function () {
73
- return __generator(this, function (_a) {
74
- return [2 /*return*/, node_fetch_1.default("https://lcd.terra.dev/blocks/" + height)
75
- .then(function (res) { return res.json(); })
76
- .then(function (block) { return ({
77
- number: Number(block.block.header.height),
78
- timestamp: Math.round(Date.parse(block.block.header.time) / 1000),
79
- }); })];
80
- });
81
- }); },
82
- };
83
- function getBlock(provider, height, chain) {
84
- return __awaiter(this, void 0, void 0, function () {
85
- var block;
86
- return __generator(this, function (_a) {
87
- switch (_a.label) {
88
- case 0: return [4 /*yield*/, provider.getBlock(height)];
89
- case 1:
90
- block = _a.sent();
91
- if (block === null) {
92
- throw new Error("Can't get block of chain " + (chain !== null && chain !== void 0 ? chain : 'ethereum'));
93
- }
94
- return [2 /*return*/, block];
95
- }
96
- });
97
- });
98
- }
99
- function getExtraProvider(chain) {
100
- if (chain === "terra") {
101
- return terraBlockProvider;
102
- }
103
- else if (chain === "kava") {
104
- return kavaBlockProvider;
105
- }
106
- return general_1.getProvider(chain);
107
- }
108
- function getLatestBlock(chain) {
109
- return __awaiter(this, void 0, void 0, function () {
110
- var provider;
111
- return __generator(this, function (_a) {
112
- provider = getExtraProvider(chain);
113
- return [2 /*return*/, getBlock(provider, "latest", chain)];
114
- });
115
- });
116
- }
117
- exports.getLatestBlock = getLatestBlock;
118
- function lookupBlock(timestamp, extraParams) {
119
- var _a, _b, _c;
120
- if (extraParams === void 0) { extraParams = {}; }
121
- return __awaiter(this, void 0, void 0, function () {
122
- var provider, lastBlock, high, low, block, mid, e_1;
123
- return __generator(this, function (_d) {
124
- switch (_d.label) {
125
- case 0:
126
- _d.trys.push([0, 6, , 7]);
127
- provider = getExtraProvider(extraParams.chain);
128
- return [4 /*yield*/, getBlock(provider, "latest", extraParams.chain)];
129
- case 1:
130
- lastBlock = _d.sent();
131
- if ((lastBlock.timestamp - timestamp) < -30 * 60) {
132
- throw new Error("Last block of chain \"" + extraParams.chain + "\" is further than 30 minutes into the past. Provider is \"" + ((_b = (_a = provider) === null || _a === void 0 ? void 0 : _a.connection) === null || _b === void 0 ? void 0 : _b.url) + "\"");
133
- }
134
- if (Math.abs(lastBlock.timestamp - timestamp) < 60) {
135
- // Short-circuit in case we are trying to get the current block
136
- return [2 /*return*/, {
137
- block: lastBlock.number,
138
- timestamp: lastBlock.timestamp,
139
- }];
140
- }
141
- high = lastBlock.number;
142
- low = 0;
143
- block = void 0;
144
- _d.label = 2;
145
- case 2:
146
- mid = Math.floor((high + low) / 2);
147
- return [4 /*yield*/, getBlock(provider, mid, extraParams.chain)];
148
- case 3:
149
- block = _d.sent();
150
- if (block.timestamp < timestamp) {
151
- low = mid + 1;
152
- }
153
- else {
154
- high = mid - 1;
155
- }
156
- _d.label = 4;
157
- case 4:
158
- if (high - low > 4) return [3 /*break*/, 2];
159
- _d.label = 5;
160
- case 5:
161
- if (Math.abs(block.timestamp - timestamp) > 3600) {
162
- throw new Error("Block selected is more than 1 hour away from the requested timestamp");
163
- }
164
- return [2 /*return*/, {
165
- block: block.number,
166
- timestamp: block.timestamp,
167
- }];
168
- case 6:
169
- e_1 = _d.sent();
170
- console.log(e_1);
171
- throw new Error("Couldn't find block height for chain " + ((_c = extraParams.chain) !== null && _c !== void 0 ? _c : 'ethereum') + ", RPC node rugged");
172
- case 7: return [2 /*return*/];
173
- }
174
- });
175
- });
176
- }
177
- exports.lookupBlock = lookupBlock;
178
- // TODO: Pull the data from somewhere like coingecko
179
- function tokenList() {
180
- return __awaiter(this, void 0, void 0, function () {
181
- return __generator(this, function (_a) {
182
- return [2 /*return*/, tokenList_1.default];
183
- });
184
- });
185
- }
186
- exports.tokenList = tokenList;
187
- function kyberTokens() {
188
- return __awaiter(this, void 0, void 0, function () {
189
- var pairs, tokens;
190
- return __generator(this, function (_a) {
191
- switch (_a.label) {
192
- case 0: return [4 /*yield*/, node_fetch_1.default("https://api.kyber.network/api/tokens/pairs").then(function (res) { return res.json(); })];
193
- case 1:
194
- pairs = _a.sent();
195
- tokens = Object.keys(pairs).reduce(function (acc, pairName) {
196
- var pair = pairs[pairName];
197
- acc[pair.contractAddress] = {
198
- symbol: pair.symbol,
199
- decimals: pair.decimals,
200
- ethPrice: pair.currentPrice,
201
- };
202
- return acc;
203
- }, {});
204
- return [2 /*return*/, {
205
- output: tokens,
206
- }];
207
- }
208
- });
209
- });
210
- }
211
- exports.kyberTokens = kyberTokens;
212
- function toSymbols(tokenBalances) {
213
- return __awaiter(this, void 0, void 0, function () {
214
- var tokens, output;
215
- var _a;
216
- var _this = this;
217
- return __generator(this, function (_b) {
218
- switch (_b.label) {
219
- case 0: return [4 /*yield*/, tokenList()];
220
- case 1:
221
- tokens = _b.sent();
222
- output = Object.entries(tokenBalances).map(function (_a) {
223
- var token = _a[0], balance = _a[1];
224
- return __awaiter(_this, void 0, void 0, function () {
225
- var tokenData, tokenSymbol, tokenDecimals, e_2, decimalBalance, _b, _c, _d, _e, _f, _g;
226
- var _h;
227
- var _j;
228
- return __generator(this, function (_k) {
229
- switch (_k.label) {
230
- case 0:
231
- tokenData = tokens.find(function (possibleToken) {
232
- return possibleToken.contract.toLowerCase() === token.toLowerCase();
233
- });
234
- if (token.toLowerCase() === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") {
235
- tokenData = {
236
- symbol: "ETH",
237
- contract: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
238
- decimals: "18",
239
- };
240
- }
241
- if (!(tokenData === undefined)) return [3 /*break*/, 5];
242
- _k.label = 1;
243
- case 1:
244
- _k.trys.push([1, 4, , 5]);
245
- tokenSymbol = erc20_1.symbol(token);
246
- tokenDecimals = erc20_1.decimals(token);
247
- _h = {};
248
- return [4 /*yield*/, tokenDecimals];
249
- case 2:
250
- _h.decimals = (_k.sent()).output,
251
- _h.contract = token.toLowerCase();
252
- return [4 /*yield*/, tokenSymbol];
253
- case 3:
254
- tokenData = (_h.symbol = (_k.sent()).output,
255
- _h);
256
- return [3 /*break*/, 5];
257
- case 4:
258
- e_2 = _k.sent();
259
- throw new Error("Failed to get token data for token at " + token);
260
- case 5:
261
- _b = Number(balance);
262
- _d = (_c = Math).pow;
263
- _e = [10];
264
- _f = Number;
265
- if (!((_j = tokenData === null || tokenData === void 0 ? void 0 : tokenData.decimals) !== null && _j !== void 0)) return [3 /*break*/, 6];
266
- _g = _j;
267
- return [3 /*break*/, 8];
268
- case 6: return [4 /*yield*/, erc20_1.decimals(token)];
269
- case 7:
270
- _g = (_k.sent()).output;
271
- _k.label = 8;
272
- case 8:
273
- decimalBalance = (_b /
274
- _d.apply(_c, _e.concat([_f.apply(void 0, [_g])]))).toFixed(6);
275
- return [2 /*return*/, {
276
- symbol: tokenData.symbol,
277
- address: tokenData.contract,
278
- balance: decimalBalance,
279
- }];
280
- }
281
- });
282
- });
283
- });
284
- _a = {};
285
- return [4 /*yield*/, Promise.all(output)];
286
- case 2: return [2 /*return*/, (_a.output = _b.sent(),
287
- _a)];
288
- }
289
- });
290
- });
291
- }
292
- exports.toSymbols = toSymbols;
293
- // SMALL INCOMPATIBILITY: On the old API we don't return ids but we should
294
- function getLogs(params) {
295
- var _a;
296
- return __awaiter(this, void 0, void 0, function () {
297
- var filter, logs, blockSpread, currentBlock, nextBlock, partLogs, e_3;
298
- return __generator(this, function (_b) {
299
- switch (_b.label) {
300
- case 0:
301
- filter = {
302
- address: params.target,
303
- topics: (_a = params.topics) !== null && _a !== void 0 ? _a : [ethers_1.utils.id(params.topic)],
304
- fromBlock: params.fromBlock,
305
- toBlock: params.toBlock, // We don't replicate Defipulse's bug because the results end up being the same anyway and hopefully they'll eventually fix it
306
- };
307
- logs = [];
308
- blockSpread = params.toBlock - params.fromBlock;
309
- currentBlock = params.fromBlock;
310
- _b.label = 1;
311
- case 1:
312
- if (!(currentBlock < params.toBlock)) return [3 /*break*/, 6];
313
- nextBlock = Math.min(params.toBlock, currentBlock + blockSpread);
314
- _b.label = 2;
315
- case 2:
316
- _b.trys.push([2, 4, , 5]);
317
- return [4 /*yield*/, general_1.getProvider(params.chain).getLogs(__assign(__assign({}, filter), { fromBlock: currentBlock, toBlock: nextBlock }))];
318
- case 3:
319
- partLogs = _b.sent();
320
- logs = logs.concat(partLogs);
321
- currentBlock = nextBlock;
322
- return [3 /*break*/, 5];
323
- case 4:
324
- e_3 = _b.sent();
325
- if (blockSpread >= 2e3) {
326
- // We got too many results
327
- // We could chop it up into 2K block spreads as that is guaranteed to always return but then we'll have to make a lot of queries (easily >1000), so instead we'll keep dividing the block spread by two until we make it
328
- blockSpread = Math.floor(blockSpread / 2);
329
- }
330
- else {
331
- throw e_3;
332
- }
333
- return [3 /*break*/, 5];
334
- case 5: return [3 /*break*/, 1];
335
- case 6:
336
- if (params.keys.length > 0) {
337
- if (params.keys[0] !== "topics") {
338
- throw new Error("Unsupported");
339
- }
340
- return [2 /*return*/, {
341
- output: logs.map(function (log) { return log.topics; }),
342
- }];
343
- }
344
- return [2 /*return*/, {
345
- output: logs,
346
- }];
347
- }
348
- });
349
- });
350
- }
351
- exports.getLogs = getLogs;
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
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
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
+ exports.getLogs = exports.toSymbols = exports.kyberTokens = exports.tokenList = exports.lookupBlock = exports.getLatestBlock = void 0;
54
+ var general_1 = require("../general");
55
+ var node_fetch_1 = __importDefault(require("node-fetch"));
56
+ var tokenList_1 = __importDefault(require("./tokenList"));
57
+ var ethers_1 = require("ethers");
58
+ var erc20_1 = require("../erc20");
59
+ var kavaBlockProvider = {
60
+ getBlock: function (height) { return __awaiter(void 0, void 0, void 0, function () {
61
+ return __generator(this, function (_a) {
62
+ return [2 /*return*/, node_fetch_1.default("https://api.data.kava.io/blocks/" + height)
63
+ .then(function (res) { return res.json(); })
64
+ .then(function (block) { return ({
65
+ number: Number(block.block.header.height),
66
+ timestamp: Math.round(Date.parse(block.block.header.time) / 1000),
67
+ }); })];
68
+ });
69
+ }); },
70
+ };
71
+ var terraBlockProvider = {
72
+ getBlock: function (height) { return __awaiter(void 0, void 0, void 0, function () {
73
+ return __generator(this, function (_a) {
74
+ return [2 /*return*/, node_fetch_1.default("https://lcd.terra.dev/blocks/" + height)
75
+ .then(function (res) { return res.json(); })
76
+ .then(function (block) { return ({
77
+ number: Number(block.block.header.height),
78
+ timestamp: Math.round(Date.parse(block.block.header.time) / 1000),
79
+ }); })];
80
+ });
81
+ }); },
82
+ };
83
+ function getBlock(provider, height, chain) {
84
+ return __awaiter(this, void 0, void 0, function () {
85
+ var block;
86
+ return __generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0: return [4 /*yield*/, provider.getBlock(height)];
89
+ case 1:
90
+ block = _a.sent();
91
+ if (block === null) {
92
+ throw new Error("Can't get block of chain " + (chain !== null && chain !== void 0 ? chain : 'ethereum'));
93
+ }
94
+ return [2 /*return*/, block];
95
+ }
96
+ });
97
+ });
98
+ }
99
+ function getExtraProvider(chain) {
100
+ if (chain === "terra") {
101
+ return terraBlockProvider;
102
+ }
103
+ else if (chain === "kava") {
104
+ return kavaBlockProvider;
105
+ }
106
+ return general_1.getProvider(chain);
107
+ }
108
+ function getLatestBlock(chain) {
109
+ return __awaiter(this, void 0, void 0, function () {
110
+ var provider;
111
+ return __generator(this, function (_a) {
112
+ provider = getExtraProvider(chain);
113
+ return [2 /*return*/, getBlock(provider, "latest", chain)];
114
+ });
115
+ });
116
+ }
117
+ exports.getLatestBlock = getLatestBlock;
118
+ function lookupBlock(timestamp, extraParams) {
119
+ var _a, _b, _c;
120
+ if (extraParams === void 0) { extraParams = {}; }
121
+ return __awaiter(this, void 0, void 0, function () {
122
+ var provider, lastBlock, high, low, block, mid, e_1;
123
+ return __generator(this, function (_d) {
124
+ switch (_d.label) {
125
+ case 0:
126
+ _d.trys.push([0, 6, , 7]);
127
+ provider = getExtraProvider(extraParams.chain);
128
+ return [4 /*yield*/, getBlock(provider, "latest", extraParams.chain)];
129
+ case 1:
130
+ lastBlock = _d.sent();
131
+ if ((lastBlock.timestamp - timestamp) < -30 * 60) {
132
+ throw new Error("Last block of chain \"" + extraParams.chain + "\" is further than 30 minutes into the past. Provider is \"" + ((_b = (_a = provider) === null || _a === void 0 ? void 0 : _a.connection) === null || _b === void 0 ? void 0 : _b.url) + "\"");
133
+ }
134
+ if (Math.abs(lastBlock.timestamp - timestamp) < 60) {
135
+ // Short-circuit in case we are trying to get the current block
136
+ return [2 /*return*/, {
137
+ block: lastBlock.number,
138
+ timestamp: lastBlock.timestamp,
139
+ }];
140
+ }
141
+ high = lastBlock.number;
142
+ low = 0;
143
+ block = void 0;
144
+ _d.label = 2;
145
+ case 2:
146
+ mid = Math.floor((high + low) / 2);
147
+ return [4 /*yield*/, getBlock(provider, mid, extraParams.chain)];
148
+ case 3:
149
+ block = _d.sent();
150
+ if (block.timestamp < timestamp) {
151
+ low = mid + 1;
152
+ }
153
+ else {
154
+ high = mid - 1;
155
+ }
156
+ _d.label = 4;
157
+ case 4:
158
+ if (high - low > 4) return [3 /*break*/, 2];
159
+ _d.label = 5;
160
+ case 5:
161
+ if (Math.abs(block.timestamp - timestamp) > 3600) {
162
+ throw new Error("Block selected is more than 1 hour away from the requested timestamp");
163
+ }
164
+ return [2 /*return*/, {
165
+ block: block.number,
166
+ timestamp: block.timestamp,
167
+ }];
168
+ case 6:
169
+ e_1 = _d.sent();
170
+ console.log(e_1);
171
+ throw new Error("Couldn't find block height for chain " + ((_c = extraParams.chain) !== null && _c !== void 0 ? _c : 'ethereum') + ", RPC node rugged");
172
+ case 7: return [2 /*return*/];
173
+ }
174
+ });
175
+ });
176
+ }
177
+ exports.lookupBlock = lookupBlock;
178
+ // TODO: Pull the data from somewhere like coingecko
179
+ function tokenList() {
180
+ return __awaiter(this, void 0, void 0, function () {
181
+ return __generator(this, function (_a) {
182
+ return [2 /*return*/, tokenList_1.default];
183
+ });
184
+ });
185
+ }
186
+ exports.tokenList = tokenList;
187
+ function kyberTokens() {
188
+ return __awaiter(this, void 0, void 0, function () {
189
+ var pairs, tokens;
190
+ return __generator(this, function (_a) {
191
+ switch (_a.label) {
192
+ case 0: return [4 /*yield*/, node_fetch_1.default("https://api.kyber.network/api/tokens/pairs").then(function (res) { return res.json(); })];
193
+ case 1:
194
+ pairs = _a.sent();
195
+ tokens = Object.keys(pairs).reduce(function (acc, pairName) {
196
+ var pair = pairs[pairName];
197
+ acc[pair.contractAddress] = {
198
+ symbol: pair.symbol,
199
+ decimals: pair.decimals,
200
+ ethPrice: pair.currentPrice,
201
+ };
202
+ return acc;
203
+ }, {});
204
+ return [2 /*return*/, {
205
+ output: tokens,
206
+ }];
207
+ }
208
+ });
209
+ });
210
+ }
211
+ exports.kyberTokens = kyberTokens;
212
+ function toSymbols(tokenBalances) {
213
+ return __awaiter(this, void 0, void 0, function () {
214
+ var tokens, output;
215
+ var _a;
216
+ var _this = this;
217
+ return __generator(this, function (_b) {
218
+ switch (_b.label) {
219
+ case 0: return [4 /*yield*/, tokenList()];
220
+ case 1:
221
+ tokens = _b.sent();
222
+ output = Object.entries(tokenBalances).map(function (_a) {
223
+ var token = _a[0], balance = _a[1];
224
+ return __awaiter(_this, void 0, void 0, function () {
225
+ var tokenData, tokenSymbol, tokenDecimals, e_2, decimalBalance, _b, _c, _d, _e, _f, _g;
226
+ var _h;
227
+ var _j;
228
+ return __generator(this, function (_k) {
229
+ switch (_k.label) {
230
+ case 0:
231
+ tokenData = tokens.find(function (possibleToken) {
232
+ return possibleToken.contract.toLowerCase() === token.toLowerCase();
233
+ });
234
+ if (token.toLowerCase() === "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee") {
235
+ tokenData = {
236
+ symbol: "ETH",
237
+ contract: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
238
+ decimals: "18",
239
+ };
240
+ }
241
+ if (!(tokenData === undefined)) return [3 /*break*/, 5];
242
+ _k.label = 1;
243
+ case 1:
244
+ _k.trys.push([1, 4, , 5]);
245
+ tokenSymbol = erc20_1.symbol(token);
246
+ tokenDecimals = erc20_1.decimals(token);
247
+ _h = {};
248
+ return [4 /*yield*/, tokenDecimals];
249
+ case 2:
250
+ _h.decimals = (_k.sent()).output,
251
+ _h.contract = token.toLowerCase();
252
+ return [4 /*yield*/, tokenSymbol];
253
+ case 3:
254
+ tokenData = (_h.symbol = (_k.sent()).output,
255
+ _h);
256
+ return [3 /*break*/, 5];
257
+ case 4:
258
+ e_2 = _k.sent();
259
+ throw new Error("Failed to get token data for token at " + token);
260
+ case 5:
261
+ _b = Number(balance);
262
+ _d = (_c = Math).pow;
263
+ _e = [10];
264
+ _f = Number;
265
+ if (!((_j = tokenData === null || tokenData === void 0 ? void 0 : tokenData.decimals) !== null && _j !== void 0)) return [3 /*break*/, 6];
266
+ _g = _j;
267
+ return [3 /*break*/, 8];
268
+ case 6: return [4 /*yield*/, erc20_1.decimals(token)];
269
+ case 7:
270
+ _g = (_k.sent()).output;
271
+ _k.label = 8;
272
+ case 8:
273
+ decimalBalance = (_b /
274
+ _d.apply(_c, _e.concat([_f.apply(void 0, [_g])]))).toFixed(6);
275
+ return [2 /*return*/, {
276
+ symbol: tokenData.symbol,
277
+ address: tokenData.contract,
278
+ balance: decimalBalance,
279
+ }];
280
+ }
281
+ });
282
+ });
283
+ });
284
+ _a = {};
285
+ return [4 /*yield*/, Promise.all(output)];
286
+ case 2: return [2 /*return*/, (_a.output = _b.sent(),
287
+ _a)];
288
+ }
289
+ });
290
+ });
291
+ }
292
+ exports.toSymbols = toSymbols;
293
+ // SMALL INCOMPATIBILITY: On the old API we don't return ids but we should
294
+ function getLogs(params) {
295
+ var _a;
296
+ return __awaiter(this, void 0, void 0, function () {
297
+ var filter, logs, blockSpread, currentBlock, nextBlock, partLogs, e_3;
298
+ return __generator(this, function (_b) {
299
+ switch (_b.label) {
300
+ case 0:
301
+ filter = {
302
+ address: params.target,
303
+ topics: (_a = params.topics) !== null && _a !== void 0 ? _a : [ethers_1.utils.id(params.topic)],
304
+ fromBlock: params.fromBlock,
305
+ toBlock: params.toBlock, // We don't replicate Defipulse's bug because the results end up being the same anyway and hopefully they'll eventually fix it
306
+ };
307
+ logs = [];
308
+ blockSpread = params.toBlock - params.fromBlock;
309
+ currentBlock = params.fromBlock;
310
+ _b.label = 1;
311
+ case 1:
312
+ if (!(currentBlock < params.toBlock)) return [3 /*break*/, 6];
313
+ nextBlock = Math.min(params.toBlock, currentBlock + blockSpread);
314
+ _b.label = 2;
315
+ case 2:
316
+ _b.trys.push([2, 4, , 5]);
317
+ return [4 /*yield*/, general_1.getProvider(params.chain).getLogs(__assign(__assign({}, filter), { fromBlock: currentBlock, toBlock: nextBlock }))];
318
+ case 3:
319
+ partLogs = _b.sent();
320
+ logs = logs.concat(partLogs);
321
+ currentBlock = nextBlock;
322
+ return [3 /*break*/, 5];
323
+ case 4:
324
+ e_3 = _b.sent();
325
+ if (blockSpread >= 2e3) {
326
+ // We got too many results
327
+ // We could chop it up into 2K block spreads as that is guaranteed to always return but then we'll have to make a lot of queries (easily >1000), so instead we'll keep dividing the block spread by two until we make it
328
+ blockSpread = Math.floor(blockSpread / 2);
329
+ }
330
+ else {
331
+ throw e_3;
332
+ }
333
+ return [3 /*break*/, 5];
334
+ case 5: return [3 /*break*/, 1];
335
+ case 6:
336
+ if (params.keys.length > 0) {
337
+ if (params.keys[0] !== "topics") {
338
+ throw new Error("Unsupported");
339
+ }
340
+ return [2 /*return*/, {
341
+ output: logs.map(function (log) { return log.topics; }),
342
+ }];
343
+ }
344
+ return [2 /*return*/, {
345
+ output: logs,
346
+ }];
347
+ }
348
+ });
349
+ });
350
+ }
351
+ exports.getLogs = getLogs;