@defillama/sdk 5.0.4 → 5.0.5
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/build/ChainApi.d.ts +1 -1
- package/build/generalUtil.js +7 -1
- package/build/util/index.d.ts +1 -1
- package/build/util/index.js +10 -6
- package/build/util/logs.d.ts +5 -4
- package/build/util/logs.js +65 -31
- package/package.json +1 -1
package/build/ChainApi.d.ts
CHANGED
|
@@ -56,6 +56,6 @@ export declare class ChainApi {
|
|
|
56
56
|
usdTokenBalances: BalancesV1;
|
|
57
57
|
rawTokenBalances: BalancesV1;
|
|
58
58
|
}>;
|
|
59
|
-
getLogs(params: GetLogsOptions): Promise<any[] | import("ethers").EventLog[]>;
|
|
59
|
+
getLogs(params: GetLogsOptions): Promise<any[] | import("ethers").EventLog[] | import("ethers").EventLog[][]>;
|
|
60
60
|
}
|
|
61
61
|
export default ChainApi;
|
package/build/generalUtil.js
CHANGED
|
@@ -218,7 +218,7 @@ function getProviderUrl(provider) {
|
|
|
218
218
|
}
|
|
219
219
|
exports.getProviderUrl = getProviderUrl;
|
|
220
220
|
function formErrorString(e, errorParams) {
|
|
221
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
|
|
221
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
222
222
|
if (errorParams === void 0) { errorParams = {}; }
|
|
223
223
|
if (!e) {
|
|
224
224
|
if (errorParams.promisePoolErrors) {
|
|
@@ -277,6 +277,12 @@ function formErrorString(e, errorParams) {
|
|
|
277
277
|
extraInfo += shortenString(' params: ' + errorParams.params.join(', '));
|
|
278
278
|
return "Failed to call: ".concat(method, " ").concat(extraInfo, " on chain: [").concat(errorParams.chain, "] rpc: ").concat(providerUrl, " call reverted, reason: ").concat((_o = (_m = e.errorName) !== null && _m !== void 0 ? _m : e.shortMessage) !== null && _o !== void 0 ? _o : '', " ").concat((_p = e.errorArgs) !== null && _p !== void 0 ? _p : '');
|
|
279
279
|
}
|
|
280
|
+
else if (e.code === 'BAD_DATA') {
|
|
281
|
+
if (!method)
|
|
282
|
+
method = (_r = (_q = e === null || e === void 0 ? void 0 : e.info) === null || _q === void 0 ? void 0 : _q.payload) === null || _r === void 0 ? void 0 : _r.method;
|
|
283
|
+
var extraInfo = 'target: ' + errorParams.target;
|
|
284
|
+
return "Failed method: ".concat(method, " ").concat(extraInfo, " on chain: [").concat(errorParams.chain, "] rpc: ").concat(providerUrl, " reason: ").concat((_u = (_t = (_s = e.errorName) !== null && _s !== void 0 ? _s : e.shortMessage) !== null && _t !== void 0 ? _t : e.message) !== null && _u !== void 0 ? _u : '', " ").concat((_v = e.errorArgs) !== null && _v !== void 0 ? _v : '');
|
|
285
|
+
}
|
|
280
286
|
if (method === 'eth_blockNumber')
|
|
281
287
|
return "host: ".concat(providerUrl, " reason: ").concat(e.reason, " code: ").concat(e.code);
|
|
282
288
|
if (method === 'getBlockNumber')
|
package/build/util/index.d.ts
CHANGED
package/build/util/index.js
CHANGED
|
@@ -75,7 +75,7 @@ exports.sliceIntoChunks = sliceIntoChunks;
|
|
|
75
75
|
function getLogs(params) {
|
|
76
76
|
var _a;
|
|
77
77
|
return __awaiter(this, void 0, void 0, function () {
|
|
78
|
-
var filter, logs, blockSpread, currentBlock, nextBlock, logParams, partLogs, e_1, error;
|
|
78
|
+
var filter, logs, blockSpread, currentBlock, provider, nextBlock, logParams, partLogs, e_1, error;
|
|
79
79
|
return __generator(this, function (_b) {
|
|
80
80
|
switch (_b.label) {
|
|
81
81
|
case 0:
|
|
@@ -91,6 +91,7 @@ function getLogs(params) {
|
|
|
91
91
|
logs = [];
|
|
92
92
|
blockSpread = params.toBlock - params.fromBlock;
|
|
93
93
|
currentBlock = params.fromBlock;
|
|
94
|
+
provider = (0, general_1.getProvider)(params.chain, true);
|
|
94
95
|
_b.label = 1;
|
|
95
96
|
case 1:
|
|
96
97
|
if (!(currentBlock < params.toBlock)) return [3 /*break*/, 6];
|
|
@@ -99,7 +100,7 @@ function getLogs(params) {
|
|
|
99
100
|
_b.label = 2;
|
|
100
101
|
case 2:
|
|
101
102
|
_b.trys.push([2, 4, , 5]);
|
|
102
|
-
return [4 /*yield*/,
|
|
103
|
+
return [4 /*yield*/, provider.getLogs(logParams)];
|
|
103
104
|
case 3:
|
|
104
105
|
partLogs = _b.sent();
|
|
105
106
|
logs = logs.concat(partLogs);
|
|
@@ -107,14 +108,14 @@ function getLogs(params) {
|
|
|
107
108
|
return [3 /*break*/, 5];
|
|
108
109
|
case 4:
|
|
109
110
|
e_1 = _b.sent();
|
|
110
|
-
(0, debugLog_1.debugLog)("Error fetching logs for chain ".concat(params.chain, " blockSpread: ").concat(blockSpread, ". ").concat((0, generalUtil_1.formError)(e_1)));
|
|
111
|
+
(0, debugLog_1.debugLog)("Error fetching logs for chain ".concat(params.chain, " blockSpread: ").concat(blockSpread, ". ").concat((0, generalUtil_1.formError)(e_1, { chain: params.chain, target: params.target, provider: provider })));
|
|
111
112
|
if (blockSpread >= 2e3) {
|
|
112
113
|
// We got too many results
|
|
113
114
|
// 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
|
|
114
115
|
blockSpread = Math.floor(blockSpread / 2);
|
|
115
116
|
}
|
|
116
117
|
else {
|
|
117
|
-
error = (0, generalUtil_1.formError)(e_1);
|
|
118
|
+
error = (0, generalUtil_1.formError)(e_1, { chain: params.chain, target: params.target, provider: provider });
|
|
118
119
|
error.message = "[chain: ".concat(params.chain, "] ").concat(error === null || error === void 0 ? void 0 : error.message, " params: ").concat(JSON.stringify(logParams));
|
|
119
120
|
throw e_1;
|
|
120
121
|
}
|
|
@@ -129,8 +130,11 @@ function getLogs(params) {
|
|
|
129
130
|
output: logs.map(function (log) { return log.topics; })
|
|
130
131
|
}];
|
|
131
132
|
}
|
|
132
|
-
// ethers v5 logs had
|
|
133
|
-
logs.forEach(function (log) {
|
|
133
|
+
// ethers v5 logs had 'logIndex' but not ethers v6, so adding field to keep it compatible
|
|
134
|
+
logs.forEach(function (log) {
|
|
135
|
+
log.logIndex = log.index;
|
|
136
|
+
delete log.provider;
|
|
137
|
+
});
|
|
134
138
|
return [2 /*return*/, {
|
|
135
139
|
output: logs
|
|
136
140
|
}];
|
package/build/util/logs.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { EventLog } from "ethers";
|
|
2
2
|
import { Address } from "../types";
|
|
3
3
|
export type GetLogsOptions = {
|
|
4
|
-
target
|
|
4
|
+
target?: Address;
|
|
5
5
|
topic?: string;
|
|
6
6
|
keys?: string[];
|
|
7
7
|
fromBlock?: number;
|
|
8
8
|
toBlock?: number;
|
|
9
|
-
topics?: string[];
|
|
9
|
+
topics?: (string | null)[];
|
|
10
10
|
extraTopics?: string[];
|
|
11
11
|
chain?: string;
|
|
12
12
|
eventAbi?: string | any;
|
|
@@ -17,9 +17,10 @@ export type GetLogsOptions = {
|
|
|
17
17
|
entireLog?: boolean;
|
|
18
18
|
cacheInCloud?: boolean;
|
|
19
19
|
onlyArgs?: boolean;
|
|
20
|
+
targets?: Address[];
|
|
21
|
+
flatten?: boolean;
|
|
20
22
|
};
|
|
21
|
-
export declare function getLogs(
|
|
22
|
-
skipCache, skipCacheRead, entireLog, cacheInCloud, onlyArgs, keys, }: GetLogsOptions): Promise<EventLog[] | any[]>;
|
|
23
|
+
export declare function getLogs(options: GetLogsOptions): Promise<EventLog[] | EventLog[][] | any[]>;
|
|
23
24
|
export type logCache = {
|
|
24
25
|
logs: EventLog[];
|
|
25
26
|
metadata?: {
|
package/build/util/logs.js
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
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
|
+
};
|
|
2
13
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
14
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
15
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,6 +46,9 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
46
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
47
|
}
|
|
37
48
|
};
|
|
49
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
50
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
51
|
+
};
|
|
38
52
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
53
|
exports.getLogs = void 0;
|
|
40
54
|
var _1 = require(".");
|
|
@@ -42,11 +56,9 @@ var ethers_1 = require("ethers");
|
|
|
42
56
|
var blocks_1 = require("./blocks");
|
|
43
57
|
var cache_1 = require("./cache");
|
|
44
58
|
var debugLog_1 = require("./debugLog");
|
|
59
|
+
var p_limit_1 = __importDefault(require("p-limit"));
|
|
45
60
|
var currentVersion = 'v2';
|
|
46
|
-
function getLogs(
|
|
47
|
-
var target = _a.target, _b = _a.chain, chain = _b === void 0 ? 'ethereum' : _b, fromBlock = _a.fromBlock, toBlock = _a.toBlock, fromTimestamp = _a.fromTimestamp, toTimestamp = _a.toTimestamp, eventAbi = _a.eventAbi, topic = _a.topic, topics = _a.topics, extraTopics = _a.extraTopics, // can be passed as input as extra filter arguments
|
|
48
|
-
_c = _a.skipCache, // can be passed as input as extra filter arguments
|
|
49
|
-
skipCache = _c === void 0 ? false : _c, _d = _a.skipCacheRead, skipCacheRead = _d === void 0 ? false : _d, _e = _a.entireLog, entireLog = _e === void 0 ? false : _e, _f = _a.cacheInCloud, cacheInCloud = _f === void 0 ? false : _f, _g = _a.onlyArgs, onlyArgs = _g === void 0 ? false : _g, _h = _a.keys, keys = _h === void 0 ? [] : _h;
|
|
61
|
+
function getLogs(options) {
|
|
50
62
|
return __awaiter(this, void 0, void 0, function () {
|
|
51
63
|
function addLogsToCache(fromBlock, toBlock) {
|
|
52
64
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -58,8 +70,7 @@ function getLogs(_a) {
|
|
|
58
70
|
metadata = cacheData.metadata;
|
|
59
71
|
return [4 /*yield*/, (0, _1.getLogs)({
|
|
60
72
|
chain: chain,
|
|
61
|
-
target: target,
|
|
62
|
-
topic: topic,
|
|
73
|
+
target: target, topic: topic,
|
|
63
74
|
keys: keys,
|
|
64
75
|
topics: topics,
|
|
65
76
|
fromBlock: fromBlock,
|
|
@@ -123,7 +134,7 @@ function getLogs(_a) {
|
|
|
123
134
|
throw new Error('extraKey is required');
|
|
124
135
|
if (keys.length)
|
|
125
136
|
extraKey += '-' + keys.join('-').toLowerCase();
|
|
126
|
-
return "event-logs/".concat(chain, "/").concat(target.toLowerCase(), "
|
|
137
|
+
return "event-logs/".concat(chain, "/").concat(target.toLowerCase(), "-").concat(extraKey);
|
|
127
138
|
}
|
|
128
139
|
// we need to form filter topic with indexed keyword, else it messes up generated topic string
|
|
129
140
|
function toFilterTopic(topic) {
|
|
@@ -135,36 +146,47 @@ function getLogs(_a) {
|
|
|
135
146
|
var fragment = topic.fragments[0];
|
|
136
147
|
return (0, ethers_1.id)("".concat(fragment.name, "(").concat(fragment.inputs.map(function (i) { return i.type; }).join(','), ")"));
|
|
137
148
|
}
|
|
138
|
-
var iface, cacheData, isFirstRun,
|
|
149
|
+
var target, _a, chain, fromBlock, toBlock, fromTimestamp, toTimestamp, eventAbi, topic, topics, extraTopics, _b, skipCache, _c, skipCacheRead, _d, entireLog, _e, cacheInCloud, _f, onlyArgs, _g, keys, targets, _h, flatten, limiter, newOptions_1, res, iface, cacheData, isFirstRun, metadata_1, logs;
|
|
139
150
|
return __generator(this, function (_j) {
|
|
140
151
|
switch (_j.label) {
|
|
141
152
|
case 0:
|
|
142
|
-
|
|
143
|
-
|
|
153
|
+
target = options.target, _a = options.chain, chain = _a === void 0 ? 'ethereum' : _a, fromBlock = options.fromBlock, toBlock = options.toBlock, fromTimestamp = options.fromTimestamp, toTimestamp = options.toTimestamp, eventAbi = options.eventAbi, topic = options.topic, topics = options.topics, extraTopics = options.extraTopics, _b = options.skipCache, skipCache = _b === void 0 ? false : _b, _c = options.skipCacheRead, skipCacheRead = _c === void 0 ? false : _c, _d = options.entireLog, entireLog = _d === void 0 ? false : _d, _e = options.cacheInCloud, cacheInCloud = _e === void 0 ? false : _e, _f = options.onlyArgs, onlyArgs = _f === void 0 ? false : _f, _g = options.keys, keys = _g === void 0 ? [] : _g, targets = options.targets, _h = options.flatten, flatten = _h === void 0 ? true : _h;
|
|
154
|
+
if (!target && !(targets === null || targets === void 0 ? void 0 : targets.length))
|
|
155
|
+
throw new Error('target|targets is required');
|
|
144
156
|
if (!fromBlock && !fromTimestamp)
|
|
145
157
|
throw new Error('fromBlock or fromTimestamp is required');
|
|
146
158
|
if (!toBlock && !toTimestamp)
|
|
147
159
|
throw new Error('toBlock or toTimestamp is required');
|
|
160
|
+
limiter = getChainLimiter(chain);
|
|
148
161
|
if (!!fromBlock) return [3 /*break*/, 2];
|
|
149
|
-
return [4 /*yield*/, (0, blocks_1.getBlock)(chain, fromTimestamp)];
|
|
162
|
+
return [4 /*yield*/, limiter(function () { return (0, blocks_1.getBlock)(chain, fromTimestamp); })];
|
|
150
163
|
case 1:
|
|
151
164
|
fromBlock = (_j.sent()).block;
|
|
152
165
|
_j.label = 2;
|
|
153
166
|
case 2:
|
|
154
167
|
if (!!toBlock) return [3 /*break*/, 4];
|
|
155
|
-
return [4 /*yield*/, (0, blocks_1.getBlock)(chain, toTimestamp)];
|
|
168
|
+
return [4 /*yield*/, limiter(function () { return (0, blocks_1.getBlock)(chain, toTimestamp); })];
|
|
156
169
|
case 3:
|
|
157
170
|
toBlock = (_j.sent()).block;
|
|
158
171
|
_j.label = 4;
|
|
159
172
|
case 4:
|
|
160
|
-
if ((
|
|
161
|
-
|
|
173
|
+
if (!(targets === null || targets === void 0 ? void 0 : targets.length)) return [3 /*break*/, 6];
|
|
174
|
+
newOptions_1 = __assign(__assign({}, options), { fromBlock: fromBlock, toBlock: toBlock });
|
|
175
|
+
delete newOptions_1.targets;
|
|
176
|
+
return [4 /*yield*/, Promise.all(targets.map(function (i) { return getLogs(__assign(__assign({}, newOptions_1), { target: i })); }))];
|
|
177
|
+
case 5:
|
|
178
|
+
res = _j.sent();
|
|
179
|
+
if (flatten)
|
|
180
|
+
return [2 /*return*/, res.flat()];
|
|
181
|
+
return [2 /*return*/, res];
|
|
182
|
+
case 6:
|
|
183
|
+
if (eventAbi)
|
|
184
|
+
iface = new ethers_1.Interface([eventAbi]);
|
|
185
|
+
if ((!topics || !topics.length)) {
|
|
186
|
+
if (topic)
|
|
162
187
|
topic = toFilterTopic(topic);
|
|
163
|
-
|
|
164
|
-
else if (eventAbi) {
|
|
165
|
-
iface = new ethers_1.Interface([eventAbi]);
|
|
188
|
+
else if (eventAbi)
|
|
166
189
|
topic = toFilterTopic(iface);
|
|
167
|
-
}
|
|
168
190
|
else {
|
|
169
191
|
throw new Error('eventAbi | topic | topics are required');
|
|
170
192
|
}
|
|
@@ -173,30 +195,30 @@ function getLogs(_a) {
|
|
|
173
195
|
topics.push.apply(topics, extraTopics);
|
|
174
196
|
}
|
|
175
197
|
return [4 /*yield*/, _getCache()];
|
|
176
|
-
case
|
|
198
|
+
case 7:
|
|
177
199
|
cacheData = _j.sent();
|
|
178
200
|
isFirstRun = !cacheData.metadata;
|
|
179
201
|
if (isFirstRun)
|
|
180
202
|
cacheData.metadata = { version: currentVersion };
|
|
181
|
-
if (!isFirstRun) return [3 /*break*/,
|
|
182
|
-
return [4 /*yield*/, addLogsToCache(fromBlock, toBlock)];
|
|
183
|
-
case 6:
|
|
184
|
-
_j.sent();
|
|
185
|
-
return [3 /*break*/, 11];
|
|
186
|
-
case 7:
|
|
187
|
-
metadata = cacheData.metadata;
|
|
188
|
-
if (!(fromBlock < metadata.fromBlock)) return [3 /*break*/, 9];
|
|
189
|
-
return [4 /*yield*/, addLogsToCache(fromBlock, metadata.fromBlock - 1)];
|
|
203
|
+
if (!isFirstRun) return [3 /*break*/, 9];
|
|
204
|
+
return [4 /*yield*/, limiter(function () { return addLogsToCache(fromBlock, toBlock); })];
|
|
190
205
|
case 8:
|
|
191
206
|
_j.sent();
|
|
192
|
-
|
|
207
|
+
return [3 /*break*/, 13];
|
|
193
208
|
case 9:
|
|
194
|
-
|
|
195
|
-
return [
|
|
209
|
+
metadata_1 = cacheData.metadata;
|
|
210
|
+
if (!(fromBlock < metadata_1.fromBlock)) return [3 /*break*/, 11];
|
|
211
|
+
return [4 /*yield*/, limiter(function () { return addLogsToCache(fromBlock, metadata_1.fromBlock); })];
|
|
196
212
|
case 10:
|
|
197
213
|
_j.sent();
|
|
198
214
|
_j.label = 11;
|
|
199
215
|
case 11:
|
|
216
|
+
if (!(toBlock > metadata_1.toBlock)) return [3 /*break*/, 13];
|
|
217
|
+
return [4 /*yield*/, limiter(function () { return addLogsToCache(metadata_1.toBlock, toBlock); })];
|
|
218
|
+
case 12:
|
|
219
|
+
_j.sent();
|
|
220
|
+
_j.label = 13;
|
|
221
|
+
case 13:
|
|
200
222
|
logs = cacheData.logs.filter(function (i) {
|
|
201
223
|
if (i.blockNumber < fromBlock)
|
|
202
224
|
return false;
|
|
@@ -212,4 +234,16 @@ function getLogs(_a) {
|
|
|
212
234
|
});
|
|
213
235
|
}
|
|
214
236
|
exports.getLogs = getLogs;
|
|
237
|
+
var chainLimiters = {};
|
|
238
|
+
function getChainLimiter(chain) {
|
|
239
|
+
if (!chainLimiters[chain])
|
|
240
|
+
chainLimiters[chain] = createLimiter(chain);
|
|
241
|
+
return chainLimiters[chain];
|
|
242
|
+
function createLimiter(chain) {
|
|
243
|
+
var _a;
|
|
244
|
+
var defaultLimit = chain === 'fantom' ? 10 : 20;
|
|
245
|
+
var limit = +((_a = process.env["".concat(chain.toUpperCase(), "_RPC_GET_LOGS_CONCURRENCY_LIMIT")]) !== null && _a !== void 0 ? _a : defaultLimit);
|
|
246
|
+
return (0, p_limit_1.default)(limit);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
215
249
|
exports.default = getLogs;
|