@defillama/sdk 2.3.53 → 2.3.56

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.
@@ -56,6 +56,7 @@ var ethers_1 = require("ethers");
56
56
  var general_1 = require("../general");
57
57
  var multicall_1 = __importDefault(require("./multicall"));
58
58
  var convertResults_1 = __importDefault(require("./convertResults"));
59
+ var promise_pool_1 = require("@supercharge/promise-pool");
59
60
  function resolveABI(providedAbi) {
60
61
  var abi = providedAbi;
61
62
  if (typeof abi === "string") {
@@ -106,9 +107,9 @@ function call(params) {
106
107
  }
107
108
  exports.call = call;
108
109
  function multiCall(params) {
109
- var _a;
110
110
  return __awaiter(this, void 0, void 0, function () {
111
- var abi, contractCalls, multicallCalls, result, _loop_1, i, flatResults, failed, newResults_1;
111
+ var abi, contractCalls, chunkSize, contractChunks, i, _a, results, errors, flatResults, failed, newResults_1;
112
+ var _this = this;
112
113
  return __generator(this, function (_b) {
113
114
  switch (_b.label) {
114
115
  case 0:
@@ -121,43 +122,25 @@ function multiCall(params) {
121
122
  contract: (_a = call.target) !== null && _a !== void 0 ? _a : params.target,
122
123
  };
123
124
  });
124
- multicallCalls = [];
125
- result = [];
126
- _loop_1 = function (i) {
127
- var pendingResult;
128
- return __generator(this, function (_c) {
129
- switch (_c.label) {
130
- case 0:
131
- pendingResult = multicall_1.default(abi, contractCalls.slice(i, i + 500), (_a = params.chain) !== null && _a !== void 0 ? _a : "ethereum", params.block).then(function (partialCalls) {
132
- result[i / 500] = partialCalls;
133
- });
134
- multicallCalls.push(pendingResult);
135
- if (!(i % 20000)) return [3 /*break*/, 2];
136
- return [4 /*yield*/, Promise.all(multicallCalls)];
137
- case 1:
138
- _c.sent(); // It would be faster to just await on all of them, but if we do that at some point node crashes without error message, so to prevent that we have to periodically await smaller sets of calls
139
- multicallCalls = []; // Clear them from memory
140
- _c.label = 2;
141
- case 2: return [2 /*return*/];
142
- }
143
- });
144
- };
145
- i = 0;
146
- _b.label = 1;
125
+ chunkSize = 500;
126
+ contractChunks = [];
127
+ for (i = 0; i < contractCalls.length; i += chunkSize)
128
+ contractChunks.push(contractCalls.slice(i, i + chunkSize));
129
+ return [4 /*yield*/, promise_pool_1.PromisePool
130
+ .withConcurrency(20)
131
+ .for(contractChunks)
132
+ .process(function (calls, i) { return __awaiter(_this, void 0, void 0, function () {
133
+ var _a;
134
+ return __generator(this, function (_b) {
135
+ return [2 /*return*/, multicall_1.default(abi, calls, (_a = params.chain) !== null && _a !== void 0 ? _a : "ethereum", params.block)];
136
+ });
137
+ }); })];
147
138
  case 1:
148
- if (!(i < contractCalls.length)) return [3 /*break*/, 4];
149
- return [5 /*yield**/, _loop_1(i)];
150
- case 2:
151
- _b.sent();
152
- _b.label = 3;
153
- case 3:
154
- i += 500;
155
- return [3 /*break*/, 1];
156
- case 4: return [4 /*yield*/, Promise.all(multicallCalls)];
157
- case 5:
158
- _b.sent();
159
- flatResults = [].concat.apply([], result);
160
- if (!(params.requery === true && flatResults.some(function (r) { return !r.success; }))) return [3 /*break*/, 7];
139
+ _a = _b.sent(), results = _a.results, errors = _a.errors;
140
+ if (errors.length)
141
+ throw errors[0];
142
+ flatResults = [].concat.apply([], results);
143
+ if (!(params.requery === true && flatResults.some(function (r) { return !r.success; }))) return [3 /*break*/, 3];
161
144
  failed = flatResults.map(function (r, i) { return [r, i]; }).filter(function (r) { return !r[0].success; });
162
145
  return [4 /*yield*/, multiCall({
163
146
  abi: params.abi,
@@ -169,13 +152,13 @@ function multiCall(params) {
169
152
  var output = _a.output;
170
153
  return output;
171
154
  })];
172
- case 6:
155
+ case 2:
173
156
  newResults_1 = _b.sent();
174
157
  failed.forEach(function (f, i) {
175
158
  flatResults[f[1]] = newResults_1[i];
176
159
  });
177
- _b.label = 7;
178
- case 7: return [2 /*return*/, {
160
+ _b.label = 3;
161
+ case 3: return [2 /*return*/, {
179
162
  output: flatResults, // flatten array
180
163
  }];
181
164
  }
@@ -44,6 +44,7 @@ var ethers_1 = require("ethers");
44
44
  var utils_1 = require("ethers/lib/utils");
45
45
  var general_1 = require("../general");
46
46
  var convertResults_1 = __importDefault(require("./convertResults"));
47
+ var rpcCall_1 = require("./rpcCall");
47
48
  exports.MULTICALL_ADDRESS_MAINNET = "0xeefba1e63905ef1d7acba5a8513c70307c1ce441";
48
49
  exports.MULTICALL_ADDRESS_KOVAN = "0x2cc8688c5f75e365aaeeb4ea8d6a480405a48d2a";
49
50
  exports.MULTICALL_ADDRESS_RINKEBY = "0x42ad527de7d4e9d9d011ac45b31d8551f8fe9821";
@@ -130,7 +131,7 @@ function executeCalls(contractCalls, chain, block) {
130
131
  to: address,
131
132
  data: callData,
132
133
  };
133
- return [4 /*yield*/, general_1.getProvider(chain).call(tx, block !== null && block !== void 0 ? block : "latest")];
134
+ return [4 /*yield*/, rpcCall_1.call(general_1.getProvider(chain), tx, block !== null && block !== void 0 ? block : "latest", chain)];
134
135
  case 4:
135
136
  returnData = _b.sent();
136
137
  _a = ethers_1.ethers.utils.defaultAbiCoder.decode(["uint256", "bytes[]"], returnData), blockNumber = _a[0], returnValues = _a[1];
@@ -141,21 +142,24 @@ function executeCalls(contractCalls, chain, block) {
141
142
  console.log("Multicall failed, defaulting to single transactions...");
142
143
  }
143
144
  return [3 /*break*/, 6];
144
- case 6: return [4 /*yield*/, Promise.all(contractCalls.map(function (call) { return __awaiter(_this, void 0, void 0, function () {
145
- var e_2;
146
- return __generator(this, function (_a) {
147
- switch (_a.label) {
148
- case 0:
149
- _a.trys.push([0, 2, , 3]);
150
- return [4 /*yield*/, general_1.getProvider(chain).call({ to: call.to, data: call.data }, block !== null && block !== void 0 ? block : "latest")];
151
- case 1: return [2 /*return*/, _a.sent()];
152
- case 2:
153
- e_2 = _a.sent();
154
- return [2 /*return*/, null];
155
- case 3: return [2 /*return*/];
156
- }
145
+ case 6: return [4 /*yield*/, Promise.all(contractCalls.map(function (_a) {
146
+ var to = _a.to, data = _a.data;
147
+ return __awaiter(_this, void 0, void 0, function () {
148
+ var e_2;
149
+ return __generator(this, function (_b) {
150
+ switch (_b.label) {
151
+ case 0:
152
+ _b.trys.push([0, 2, , 3]);
153
+ return [4 /*yield*/, rpcCall_1.call(general_1.getProvider(chain), { to: to, data: data }, block !== null && block !== void 0 ? block : "latest", chain)];
154
+ case 1: return [2 /*return*/, _b.sent()];
155
+ case 2:
156
+ e_2 = _b.sent();
157
+ return [2 /*return*/, null];
158
+ case 3: return [2 /*return*/];
159
+ }
160
+ });
157
161
  });
158
- }); }))];
162
+ }))];
159
163
  case 7:
160
164
  values = _b.sent();
161
165
  return [2 /*return*/, values];
@@ -0,0 +1,3 @@
1
+ import { Deferrable } from "@ethersproject/properties";
2
+ import { BaseProvider, BlockTag, TransactionRequest } from "@ethersproject/providers";
3
+ export declare function call(provider: BaseProvider, data: Deferrable<TransactionRequest>, block: BlockTag, chain?: string): Promise<string>;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.call = void 0;
40
+ var events_1 = require("events");
41
+ var DEBUG_MODE_ENABLED = !!process.env.LLAMA_DEBUG_MODE;
42
+ var maxParallelCalls = !!process.env.LLAMA_SDK_MAX_PARALLEL ? +process.env.LLAMA_SDK_MAX_PARALLEL : 100;
43
+ var COUNTERS = {};
44
+ var emitter = new events_1.EventEmitter();
45
+ emitter.setMaxListeners(500000);
46
+ function call(provider, data, block, chain) {
47
+ return __awaiter(this, void 0, void 0, function () {
48
+ function onComplete() {
49
+ counter.activeWorkers--;
50
+ if (counter.queue.length) {
51
+ var nextRequestId = counter.pickFromTop ? counter.queue.shift() : counter.queue.pop();
52
+ counter.pickFromTop = !counter.pickFromTop;
53
+ emitter.emit(nextRequestId);
54
+ }
55
+ }
56
+ var counter, currentId, eventId, showEveryX, response, e_1;
57
+ return __generator(this, function (_a) {
58
+ switch (_a.label) {
59
+ case 0:
60
+ if (!chain)
61
+ chain = 'noChain';
62
+ counter = getChainCounter(chain);
63
+ currentId = counter.requestCount++;
64
+ eventId = chain + "-" + currentId;
65
+ if (!(counter.activeWorkers > maxParallelCalls)) return [3 /*break*/, 2];
66
+ counter.queue.push(eventId);
67
+ return [4 /*yield*/, events_1.once(emitter, eventId)];
68
+ case 1:
69
+ _a.sent();
70
+ _a.label = 2;
71
+ case 2:
72
+ counter.activeWorkers++;
73
+ if (DEBUG_MODE_ENABLED) {
74
+ showEveryX = counter.queue.length > 100 ? 50 : 10 // show log fewer times if lot more are queued up
75
+ ;
76
+ if (currentId % showEveryX === 0)
77
+ console.log("chain: " + chain + " request #: " + currentId + " queue: " + counter.queue.length + " active requests: " + counter.activeWorkers);
78
+ }
79
+ _a.label = 3;
80
+ case 3:
81
+ _a.trys.push([3, 5, , 6]);
82
+ return [4 /*yield*/, provider.call(data, block)];
83
+ case 4:
84
+ response = _a.sent();
85
+ onComplete();
86
+ return [3 /*break*/, 6];
87
+ case 5:
88
+ e_1 = _a.sent();
89
+ onComplete();
90
+ throw e_1;
91
+ case 6: return [2 /*return*/, response];
92
+ }
93
+ });
94
+ });
95
+ }
96
+ exports.call = call;
97
+ function getChainCounter(chain) {
98
+ if (!COUNTERS[chain])
99
+ COUNTERS[chain] = {
100
+ activeWorkers: 0,
101
+ queue: [],
102
+ requestCount: 0,
103
+ pickFromTop: true,
104
+ };
105
+ return COUNTERS[chain];
106
+ }
@@ -47,6 +47,7 @@ export declare const chainToCoingeckoId: {
47
47
  telos: string;
48
48
  moonbeam: string;
49
49
  velas: string;
50
+ milkomeda: string;
50
51
  };
51
52
  export default function (rawBalances: Balances, timestamp: number | "now", verbose?: boolean, knownTokenPrices?: TokenPrices, getCoingeckoLock?: GetCoingeckoLog, coingeckoMaxRetries?: number): Promise<{
52
53
  usdTvl: number;
@@ -109,6 +109,7 @@ exports.chainToCoingeckoId = {
109
109
  telos: "telos",
110
110
  moonbeam: "moonbeam",
111
111
  velas: "velas",
112
+ milkomeda: "milkomeda-cardano",
112
113
  };
113
114
  var chains = Object.keys(exports.chainToCoingeckoId);
114
115
  function getHistoricalChainPrices(ids, timestamp, knownTokenPrices, getCoingeckoLock, coingeckoMaxRetries) {
package/build/general.js CHANGED
@@ -44,7 +44,7 @@ exports.providers = {
44
44
  celo: createProvider("celo", "https://forno.celo.org", 42220),
45
45
  iotex: createProvider("iotex", "https://babel-api.mainnet.iotex.io", 4689),
46
46
  moonriver: createProvider("moonriver", "https://rpc.api.moonriver.moonbeam.network/,https://moonriver.api.onfinality.io/public", 1285),
47
- shiden: createProvider("shiden", "https://rpc.shiden.astar.network:8545/", 336),
47
+ shiden: createProvider("shiden", "https://rpc.astar.network:8545,https://astar.api.onfinality.io/public", 336),
48
48
  palm: createProvider("palm", "https://palm-mainnet.infura.io/v3/3a961d6501e54add9a41aa53f15de99b", 11297108109),
49
49
  energyweb: createProvider("energyweb", "https://rpc.energyweb.org", 246),
50
50
  songbird: createProvider("songbird", "https://songbird.towolabs.com/rpc", 19),
@@ -80,11 +80,12 @@ exports.providers = {
80
80
  moonbeam: createProvider("moonbeam", 'https://rpc.api.moonbeam.network', 1284),
81
81
  curio: createProvider("curio", 'https://mainnet-api.skalenodes.com/v1/fit-betelgeuse', 836542336838601),
82
82
  astar: createProvider("astar", "https://rpc.astar.network:8545", 592),
83
- godwoken: createProvider("godwoken", "https://mainnet.godwoken.io/rpc/eth-wallet", 71394),
83
+ godwoken: createProvider("godwoken", "https://mainnet.godwoken.io/rpc", 71394),
84
84
  evmos: createProvider("evmos", "https://eth.bd.evmos.org:8545/", 9001),
85
85
  conflux: createProvider("conflux", "https://evm.confluxrpc.com", 1030),
86
86
  milkomeda: createProvider("milkomeda", "https://rpc-mainnet-cardano-evm.c1.milkomeda.com", 2001),
87
87
  dfk: createProvider("dfk", "https://subnets.avax.network/defi-kingdoms/dfk-chain/rpc", 53935),
88
+ crab: createProvider("crab", "https://crab-rpc.darwinia.network", 44),
88
89
  };
89
90
  function getProvider(chain) {
90
91
  if (chain === void 0) { chain = "ethereum"; }
@@ -115,19 +115,23 @@ function getLatestBlock(chain) {
115
115
  });
116
116
  }
117
117
  exports.getLatestBlock = getLatestBlock;
118
+ var intialBlocks = {
119
+ terra: 4724001,
120
+ crab: 4969901
121
+ };
118
122
  function lookupBlock(timestamp, extraParams) {
119
- var _a, _b, _c;
123
+ var _a, _b, _c, _d, _e;
120
124
  if (extraParams === void 0) { extraParams = {}; }
121
125
  return __awaiter(this, void 0, void 0, function () {
122
126
  var provider, lastBlock, high, low, block, mid, e_1;
123
- return __generator(this, function (_d) {
124
- switch (_d.label) {
127
+ return __generator(this, function (_f) {
128
+ switch (_f.label) {
125
129
  case 0:
126
- _d.trys.push([0, 6, , 7]);
130
+ _f.trys.push([0, 6, , 7]);
127
131
  provider = getExtraProvider(extraParams.chain);
128
132
  return [4 /*yield*/, getBlock(provider, "latest", extraParams.chain)];
129
133
  case 1:
130
- lastBlock = _d.sent();
134
+ lastBlock = _f.sent();
131
135
  if ((lastBlock.timestamp - timestamp) < -30 * 60) {
132
136
  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
137
  }
@@ -139,24 +143,24 @@ function lookupBlock(timestamp, extraParams) {
139
143
  }];
140
144
  }
141
145
  high = lastBlock.number;
142
- low = (extraParams === null || extraParams === void 0 ? void 0 : extraParams.chain) === "terra" ? 4724001 : 0;
146
+ low = (_d = intialBlocks[(_c = extraParams === null || extraParams === void 0 ? void 0 : extraParams.chain) !== null && _c !== void 0 ? _c : "ethereum"]) !== null && _d !== void 0 ? _d : 0;
143
147
  block = void 0;
144
- _d.label = 2;
148
+ _f.label = 2;
145
149
  case 2:
146
150
  mid = Math.floor((high + low) / 2);
147
151
  return [4 /*yield*/, getBlock(provider, mid, extraParams.chain)];
148
152
  case 3:
149
- block = _d.sent();
153
+ block = _f.sent();
150
154
  if (block.timestamp < timestamp) {
151
155
  low = mid + 1;
152
156
  }
153
157
  else {
154
158
  high = mid - 1;
155
159
  }
156
- _d.label = 4;
160
+ _f.label = 4;
157
161
  case 4:
158
162
  if (high - low > 4) return [3 /*break*/, 2];
159
- _d.label = 5;
163
+ _f.label = 5;
160
164
  case 5:
161
165
  if (Math.abs(block.timestamp - timestamp) > 3600) {
162
166
  throw new Error("Block selected is more than 1 hour away from the requested timestamp");
@@ -166,9 +170,9 @@ function lookupBlock(timestamp, extraParams) {
166
170
  timestamp: block.timestamp,
167
171
  }];
168
172
  case 6:
169
- e_1 = _d.sent();
173
+ e_1 = _f.sent();
170
174
  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");
175
+ throw new Error("Couldn't find block height for chain " + ((_e = extraParams.chain) !== null && _e !== void 0 ? _e : 'ethereum') + ", RPC node rugged");
172
176
  case 7: return [2 /*return*/];
173
177
  }
174
178
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@defillama/sdk",
3
- "version": "2.3.53",
3
+ "version": "2.3.56",
4
4
  "description": "SDK for calculating TVL",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -22,6 +22,7 @@
22
22
  "build"
23
23
  ],
24
24
  "dependencies": {
25
+ "@supercharge/promise-pool": "^2.1.0",
25
26
  "ethers": "^5.4.5",
26
27
  "graphql": "^15.5.0",
27
28
  "graphql-request": "^3.4.0",