@defillama/sdk 2.3.33 → 2.3.34
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/LICENSE +661 -661
- package/README.md +16 -16
- package/build/abi/cachedABIs.d.ts +4 -4
- package/build/abi/cachedABIs.js +70 -70
- package/build/abi/convertResults.d.ts +2 -2
- package/build/abi/convertResults.js +56 -56
- package/build/abi/index.d.ts +26 -25
- package/build/abi/index.js +185 -166
- package/build/abi/index.test.d.ts +1 -1
- package/build/abi/index.test.js +651 -651
- package/build/abi/multicall.d.ts +13 -13
- package/build/abi/multicall.js +210 -210
- package/build/api.d.ts +10 -10
- package/build/api.js +32 -32
- package/build/cdp/compoundTokens.d.ts +68 -68
- package/build/cdp/compoundTokens.js +69 -69
- package/build/cdp/index.d.ts +29 -29
- package/build/cdp/index.js +124 -124
- package/build/cdp/index.test.d.ts +1 -1
- package/build/cdp/index.test.js +82 -82
- package/build/cdp/makerTokens.d.ts +10 -10
- package/build/cdp/makerTokens.js +244 -244
- package/build/cli.d.ts +2 -2
- package/build/cli.js +95 -95
- package/build/computeTVL/blocks.d.ts +15 -15
- package/build/computeTVL/blocks.js +136 -136
- package/build/computeTVL/blocks.test.d.ts +1 -1
- package/build/computeTVL/blocks.test.js +56 -56
- package/build/computeTVL/humanizeNumber.d.ts +1 -1
- package/build/computeTVL/humanizeNumber.js +18 -18
- package/build/computeTVL/index.d.ts +52 -52
- package/build/computeTVL/index.js +373 -373
- package/build/computeTVL/index.test.d.ts +1 -1
- package/build/computeTVL/index.test.js +107 -107
- package/build/computeTVL/prices.d.ts +9 -9
- package/build/computeTVL/prices.js +163 -163
- package/build/erc20/index.d.ts +31 -31
- package/build/erc20/index.js +144 -144
- package/build/erc20/index.test.d.ts +1 -1
- package/build/erc20/index.test.js +124 -124
- package/build/eth/index.d.ts +21 -21
- package/build/eth/index.js +90 -90
- package/build/eth/index.test.d.ts +1 -1
- package/build/eth/index.test.js +122 -122
- package/build/general.d.ts +7 -7
- package/build/general.js +94 -94
- package/build/general.test.d.ts +1 -1
- package/build/general.test.js +73 -73
- package/build/generalUtil.d.ts +19 -19
- package/build/generalUtil.js +117 -117
- package/build/generalUtil.test.d.ts +1 -1
- package/build/generalUtil.test.js +59 -59
- package/build/index.d.ts +2 -2
- package/build/index.js +24 -24
- package/build/index.test.js +69 -69
- package/build/types.d.ts +5 -5
- package/build/types.js +2 -2
- package/build/util/index.d.ts +57 -57
- package/build/util/index.js +351 -351
- package/build/util/index.test.d.ts +1 -1
- package/build/util/index.test.js +314 -314
- package/build/util/tokenList.d.ts +14 -14
- package/build/util/tokenList.js +3631 -3631
- package/package.json +41 -41
package/build/util/index.js
CHANGED
|
@@ -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 = (extraParams === null || extraParams === void 0 ? void 0 : extraParams.chain) === "terra" ? 4724001 : 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 = (extraParams === null || extraParams === void 0 ? void 0 : extraParams.chain) === "terra" ? 4724001 : 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;
|