@defillama/sdk 5.0.173 → 5.0.177

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 (53) hide show
  1. package/build/Balances.d.ts +2 -2
  2. package/build/ChainApi.d.ts +26 -14
  3. package/build/ChainApi.js +58 -28
  4. package/build/abi/abi2.js +23 -15
  5. package/build/abi/cachedABIs.d.ts +1 -1
  6. package/build/abi/convertResults.d.ts +4 -1
  7. package/build/abi/convertResults.js +20 -15
  8. package/build/abi/index.js +16 -39
  9. package/build/abi/multicall.js +6 -31
  10. package/build/abi/multicall3.js +36 -37
  11. package/build/abi/rpcCall.js +1 -2
  12. package/build/abi/tron.d.ts +5 -6
  13. package/build/abi/tron.js +79 -198
  14. package/build/api.js +17 -7
  15. package/build/api2.js +17 -7
  16. package/build/computeTVL/humanizeNumber.js +1 -2
  17. package/build/erc20/index.js +5 -6
  18. package/build/eth/index.d.ts +1 -0
  19. package/build/eth/index.js +39 -16
  20. package/build/general.js +2 -2
  21. package/build/generalUtil.d.ts +2 -24
  22. package/build/generalUtil.js +39 -246
  23. package/build/index.js +17 -7
  24. package/build/providers.json +1 -1
  25. package/build/util/LlamaProvider.js +8 -3
  26. package/build/util/blocks.js +17 -20
  27. package/build/util/cache.d.ts +11 -2
  28. package/build/util/cache.js +53 -9
  29. package/build/util/common.d.ts +33 -0
  30. package/build/util/common.js +352 -0
  31. package/build/util/computeTVL.js +6 -11
  32. package/build/util/cosmos.js +6 -9
  33. package/build/util/debugLog.js +3 -3
  34. package/build/util/elastic.d.ts +19 -0
  35. package/build/util/elastic.js +54 -6
  36. package/build/util/env.d.ts +7 -1
  37. package/build/util/env.js +28 -15
  38. package/build/util/graph.js +4 -8
  39. package/build/util/index.d.ts +1 -1
  40. package/build/util/index.js +17 -15
  41. package/build/util/indexer.js +29 -19
  42. package/build/util/internal-cache.js +22 -13
  43. package/build/util/logs.js +7 -7
  44. package/build/util/promisePool.d.ts +4 -1
  45. package/build/util/promisePool.js +22 -7
  46. package/build/util/r2.d.ts +0 -1
  47. package/build/util/r2.js +4 -9
  48. package/build/util/removeRedundantRPCs.js +2 -2
  49. package/build/util/transactions.js +1 -2
  50. package/build/util/updateProviderList.js +6 -6
  51. package/package.json +3 -1
  52. package/build/computeTVL/prices.d.ts +0 -9
  53. package/build/computeTVL/prices.js +0 -73
package/build/util/env.js CHANGED
@@ -1,16 +1,35 @@
1
1
  "use strict";
2
+ var _a;
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getChainRPCs = exports.getArchivalRPCs = exports.getBatchMaxCount = exports.getDefaultChunkSize = exports.getEnvMulticallAddress = exports.getEnvCacheFolder = exports.getEnvValue = exports.getEnvRPC = exports.getParallelGetBlocksLimit = exports.getParallelGetLogsLimit = exports.getMaxParallelRequests = exports.getChainId = exports.ENV_CONSTANTS = void 0;
4
+ exports.ENV_CONSTANTS = exports.defaultShortenStringLength = exports.logGetLogsIndexer = exports.logGetLogsDebug = exports.logGetLogsErrors = exports.logGetBlockStats = void 0;
5
+ exports.getChainId = getChainId;
6
+ exports.getMaxParallelRequests = getMaxParallelRequests;
7
+ exports.getParallelGetLogsLimit = getParallelGetLogsLimit;
8
+ exports.getParallelGetBlocksLimit = getParallelGetBlocksLimit;
9
+ exports.getEnvRPC = getEnvRPC;
10
+ exports.getEnvValue = getEnvValue;
11
+ exports.getEnvCacheFolder = getEnvCacheFolder;
12
+ exports.getEnvMulticallAddress = getEnvMulticallAddress;
13
+ exports.getDefaultChunkSize = getDefaultChunkSize;
14
+ exports.getBatchMaxCount = getBatchMaxCount;
15
+ exports.getArchivalRPCs = getArchivalRPCs;
16
+ exports.getChainRPCs = getChainRPCs;
17
+ exports.getWhitelistedRPCs = getWhitelistedRPCs;
4
18
  const whitelistedEnvConstants = [
5
19
  'R2_ENDPOINT', 'R2_ACCESS_KEY_ID', 'R2_SECRET_ACCESS_KEY', 'TRON_PRO_API_KEY', 'COINS_API_KEY',
6
20
  'ELASTICSEARCH_CONFIG', 'GRAPH_API_KEY', 'LLAMA_INDEXER_ENDPOINT', 'LLAMA_INDEXER_API_KEY', 'LLAMA_INDEXER_V2_ENDPOINT', 'LLAMA_INDEXER_V2_API_KEY',
7
21
  ];
22
+ exports.logGetBlockStats = process.env.LLAMA_SDK_LOG_GET_BLOCK_STATS === 'true' || false;
23
+ exports.logGetLogsErrors = process.env.LLAMA_SDK_LOG_GET_LOGS_ERRORS === 'true' || false;
24
+ exports.logGetLogsDebug = process.env.LLAMA_SDK_LOG_GET_LOGS_DEBUG === 'true' || false;
25
+ exports.logGetLogsIndexer = process.env.LLAMA_SDK_LOG_GET_LOGS_INDEXER === 'true' || false;
26
+ exports.defaultShortenStringLength = +((_a = process.env.LLAMA_SDK_DEFAULT_SHORTEN_STRING_LENGTH) !== null && _a !== void 0 ? _a : '120');
8
27
  const defaultEnvValues = {
9
28
  INTERNAL_SDK_CACHE_FILE: './cache.json',
10
29
  TRON_RPC_CONCURRENCY_LIMIT: '5',
11
30
  LLAMA_INDEXER_ADDRESS_CHUNK_SIZE: '20',
12
- TRON_RPC: 'https://api.trongrid.io',
13
- TRON_EVM_RPC: 'https://rpc.ankr.com/tron_jsonrpc',
31
+ TRON_WALLET_RPC: 'https://api.trongrid.io',
32
+ // TRON_EVM_RPC: 'https://rpc.ankr.com/tron_jsonrpc', // no longer used
14
33
  NAKA_RPC: 'https://node.nakachain.xyz',
15
34
  ETHF_RPC: 'https://rpc.dischain.xyz/',
16
35
  CORE_RPC: "https://rpc.coredao.org,https://rpc.ankr.com/core,https://1rpc.io/core,https://rpc-core.icecreamswap.com",
@@ -33,7 +52,6 @@ function getChainId(chain, chainId) {
33
52
  const value = (_a = getEnvValue(`${chain}_RPC_CHAIN_ID`)) !== null && _a !== void 0 ? _a : chainId;
34
53
  return +value;
35
54
  }
36
- exports.getChainId = getChainId;
37
55
  function getMaxParallelRequests(chain) {
38
56
  const chainKey = `${chain}_RPC_MAX_PARALLEL`;
39
57
  if (getEnvValue(chainKey))
@@ -42,7 +60,6 @@ function getMaxParallelRequests(chain) {
42
60
  return 20;
43
61
  return +getEnvValue('MAX_PARALLEL', '100');
44
62
  }
45
- exports.getMaxParallelRequests = getMaxParallelRequests;
46
63
  function getParallelGetLogsLimit(chain, providerUrl) {
47
64
  let defaultLimit = getEnvValue('GET_LOGS_CONCURRENCY_LIMIT', '25');
48
65
  if (chain === 'fantom')
@@ -52,32 +69,26 @@ function getParallelGetLogsLimit(chain, providerUrl) {
52
69
  return +(defaultAlchemyLimit);
53
70
  return +(getEnvValue(`${chain}_RPC_GET_LOGS_CONCURRENCY_LIMIT`, defaultLimit));
54
71
  }
55
- exports.getParallelGetLogsLimit = getParallelGetLogsLimit;
56
72
  function getParallelGetBlocksLimit(chain) {
57
73
  const defaultLimit = getEnvValue('GET_BLOCKS_CONCURRENCY_LIMIT', '5');
58
74
  return +(getEnvValue(`${chain}_RPC_GET_BLOCKS_CONCURRENCY_LIMIT`, defaultLimit));
59
75
  }
60
- exports.getParallelGetBlocksLimit = getParallelGetBlocksLimit;
61
76
  function getEnvRPC(chain) {
62
77
  const key = `${chain}_RPC`.toUpperCase();
63
78
  return getEnvValue(key, defaultEnvValues[key]);
64
79
  }
65
- exports.getEnvRPC = getEnvRPC;
66
80
  function getEnvValue(key, defaultValue) {
67
81
  var _a, _b, _c;
68
82
  key = key.toUpperCase();
69
83
  defaultValue = defaultValue !== null && defaultValue !== void 0 ? defaultValue : defaultEnvValues[key];
70
84
  return (_c = (_b = (_a = process.env['LLAMA_SDK_' + key]) !== null && _a !== void 0 ? _a : process.env['SDK_' + key]) !== null && _b !== void 0 ? _b : process.env[key]) !== null && _c !== void 0 ? _c : defaultValue;
71
85
  }
72
- exports.getEnvValue = getEnvValue;
73
86
  function getEnvCacheFolder(defaultCacheFolder) {
74
87
  return getEnvValue('TVL_LOCAL_CACHE_ROOT_FOLDER', defaultCacheFolder);
75
88
  }
76
- exports.getEnvCacheFolder = getEnvCacheFolder;
77
89
  function getEnvMulticallAddress(chain) {
78
90
  return getEnvValue(`${chain}_RPC_MULTICALL`);
79
91
  }
80
- exports.getEnvMulticallAddress = getEnvMulticallAddress;
81
92
  function getDefaultChunkSize(chain) {
82
93
  const key = chain + '_MULTICALL_CHUNK_SIZE';
83
94
  if (getEnvValue(key))
@@ -86,7 +97,6 @@ function getDefaultChunkSize(chain) {
86
97
  return 50;
87
98
  return +(getEnvValue('MULTICALL_CHUNK_SIZE', '300'));
88
99
  }
89
- exports.getDefaultChunkSize = getDefaultChunkSize;
90
100
  function getBatchMaxCount(chain) {
91
101
  const key = chain + '_BATCH_MAX_COUNT';
92
102
  if (getEnvValue(key))
@@ -96,14 +106,12 @@ function getBatchMaxCount(chain) {
96
106
  default: return +getEnvValue('BATCH_MAX_COUNT', '5');
97
107
  }
98
108
  }
99
- exports.getBatchMaxCount = getBatchMaxCount;
100
109
  function getArchivalRPCs(chain) {
101
110
  const key = chain + '_ARCHIVAL_RPC';
102
111
  if (getEnvValue(key))
103
112
  return getEnvValue(key).split(',');
104
113
  return [];
105
114
  }
106
- exports.getArchivalRPCs = getArchivalRPCs;
107
115
  function getChainRPCs(chain, defaultList = []) {
108
116
  const envValue = getEnvRPC(chain);
109
117
  if (defaultList.length) {
@@ -114,4 +122,9 @@ function getChainRPCs(chain, defaultList = []) {
114
122
  }
115
123
  return envValue || undefined;
116
124
  }
117
- exports.getChainRPCs = getChainRPCs;
125
+ function getWhitelistedRPCs(chain) {
126
+ const key = chain + '_WHITELISTED_RPC';
127
+ if (getEnvValue(key))
128
+ return getEnvValue(key).split(',');
129
+ return [];
130
+ }
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.modifyEndpoint = exports.request = void 0;
7
- const axios_1 = __importDefault(require("axios"));
3
+ exports.request = request;
4
+ exports.modifyEndpoint = modifyEndpoint;
5
+ const common_1 = require("./common");
8
6
  const cache_1 = require("./cache");
9
7
  const debugLog_1 = require("./debugLog");
10
8
  const env_1 = require("./env");
@@ -27,13 +25,12 @@ async function request(endpoint, query, { cache = false, cacheKey, variables, wi
27
25
  }
28
26
  async function _request() {
29
27
  endpoint = modifyEndpoint(endpoint, network);
30
- const { data: result } = await axios_1.default.post(endpoint, { query, variables });
28
+ const result = await (0, common_1.postJson)(endpoint, { query, variables });
31
29
  if (result.errors)
32
30
  throw new Error(result.errors[0].message);
33
31
  return withMetadata ? result : result.data;
34
32
  }
35
33
  }
36
- exports.request = request;
37
34
  let graphKeyWarned = false;
38
35
  function modifyEndpoint(endpoint, network = 'arbitrum') {
39
36
  // example: https://api.thegraph.com/subgraphs/name/yieldyak/reinvest-tracker
@@ -51,4 +48,3 @@ function modifyEndpoint(endpoint, network = 'arbitrum') {
51
48
  endpoint = endpoint.replace('[api-key]', graphKey);
52
49
  return endpoint;
53
50
  }
54
- exports.modifyEndpoint = modifyEndpoint;
@@ -3,7 +3,7 @@ import type { Address } from "../types";
3
3
  import { ethers, EventLog } from "ethers";
4
4
  import runInPromisePoolOrig from "./promisePool";
5
5
  export { getLatestBlock, getTimestamp, lookupBlock, } from "./blocks";
6
- export { convertToBigInt } from "../generalUtil";
6
+ export { convertToBigInt } from "./common";
7
7
  export declare const runInPromisePool: typeof runInPromisePoolOrig;
8
8
  export declare function sliceIntoChunks(arr: any[], chunkSize?: number): any[][];
9
9
  type GetLogsOptions = {
@@ -3,18 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.tableToString = exports.normalizeBalances = exports.normalizePrefixes = exports.normalizeAddress = exports.getLogs = exports.sliceIntoChunks = exports.runInPromisePool = exports.convertToBigInt = exports.lookupBlock = exports.getTimestamp = exports.getLatestBlock = void 0;
6
+ exports.runInPromisePool = exports.convertToBigInt = exports.lookupBlock = exports.getTimestamp = exports.getLatestBlock = void 0;
7
+ exports.sliceIntoChunks = sliceIntoChunks;
8
+ exports.getLogs = getLogs;
9
+ exports.normalizeAddress = normalizeAddress;
10
+ exports.normalizePrefixes = normalizePrefixes;
11
+ exports.normalizeBalances = normalizeBalances;
12
+ exports.tableToString = tableToString;
7
13
  const general_1 = require("../general");
8
14
  const ethers_1 = require("ethers");
9
- const generalUtil_1 = require("../generalUtil");
15
+ const common_1 = require("./common");
10
16
  const debugLog_1 = require("./debugLog");
11
17
  const promisePool_1 = __importDefault(require("./promisePool"));
12
18
  var blocks_1 = require("./blocks");
13
19
  Object.defineProperty(exports, "getLatestBlock", { enumerable: true, get: function () { return blocks_1.getLatestBlock; } });
14
20
  Object.defineProperty(exports, "getTimestamp", { enumerable: true, get: function () { return blocks_1.getTimestamp; } });
15
21
  Object.defineProperty(exports, "lookupBlock", { enumerable: true, get: function () { return blocks_1.lookupBlock; } });
16
- var generalUtil_2 = require("../generalUtil");
17
- Object.defineProperty(exports, "convertToBigInt", { enumerable: true, get: function () { return generalUtil_2.convertToBigInt; } });
22
+ var common_2 = require("./common");
23
+ Object.defineProperty(exports, "convertToBigInt", { enumerable: true, get: function () { return common_2.convertToBigInt; } });
18
24
  const p_limit_1 = __importDefault(require("p-limit"));
19
25
  const env_1 = require("./env");
20
26
  exports.runInPromisePool = promisePool_1.default;
@@ -26,7 +32,6 @@ function sliceIntoChunks(arr, chunkSize = 100) {
26
32
  }
27
33
  return res;
28
34
  }
29
- exports.sliceIntoChunks = sliceIntoChunks;
30
35
  const chainLogLimiters = {};
31
36
  function getChainLimiter(chain, providerUrl) {
32
37
  if (!chainLogLimiters[chain])
@@ -37,7 +42,7 @@ function getChainLimiter(chain, providerUrl) {
37
42
  }
38
43
  }
39
44
  async function getLogs(options) {
40
- const getLimiter = () => getChainLimiter(options.chain, (0, generalUtil_1.getProviderUrl)(options.provider));
45
+ const getLimiter = () => getChainLimiter(options.chain, (0, common_1.getProviderUrl)(options.provider));
41
46
  // if provider is not passed, we try with archival node first (if set) and then with non-archival node
42
47
  let provider;
43
48
  if (!options.provider) {
@@ -50,13 +55,13 @@ async function getLogs(options) {
50
55
  catch (e) {
51
56
  options.provider = (0, general_1.getProvider)(options.chain, false);
52
57
  // if (provider === options.provider) throw e // the provider for archival and non-archival request is the same
53
- (0, debugLog_1.debugLog)(`Error fetching logs for chain ${options.chain} ${(0, generalUtil_1.formError)(e, { chain: options.chain, target: options.target, })}, retrying...`);
58
+ if (env_1.logGetLogsDebug)
59
+ (0, debugLog_1.debugLog)(`Error fetching logs for chain ${options.chain} ${(0, common_1.formError)(e, { chain: options.chain, target: options.target, })}, retrying...`);
54
60
  return getLimiter()(() => _getLogs(options));
55
61
  }
56
62
  }
57
63
  return getLimiter()(() => _getLogs(options));
58
64
  }
59
- exports.getLogs = getLogs;
60
65
  // SMALL INCOMPATIBILITY: On the old API we don't return ids but we should
61
66
  async function _getLogs(params) {
62
67
  var _a, _b;
@@ -86,7 +91,8 @@ async function _getLogs(params) {
86
91
  currentBlock = nextBlock;
87
92
  }
88
93
  catch (e) {
89
- (0, debugLog_1.debugLog)(`Error fetching logs for chain ${params.chain} blockSpread: ${blockSpread}. ${(0, generalUtil_1.formError)(e, { chain: params.chain, target: params.target, provider })}`);
94
+ if (env_1.logGetLogsDebug)
95
+ (0, debugLog_1.debugLog)(`Error fetching logs for chain ${params.chain} blockSpread: ${blockSpread}. ${(0, common_1.formError)(e, { chain: params.chain, target: params.target, provider })}`);
90
96
  if (blockSpread >= 1001) {
91
97
  // We got too many results
92
98
  // We could chop it up into 1001 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
@@ -97,7 +103,7 @@ async function _getLogs(params) {
97
103
  blockSpread = 9999;
98
104
  }
99
105
  else {
100
- const error = (0, generalUtil_1.formError)(e, { chain: params.chain, target: params.target, provider });
106
+ const error = (0, common_1.formError)(e, { chain: params.chain, target: params.target, provider });
101
107
  error.message = `[chain: ${params.chain}] ${error === null || error === void 0 ? void 0 : error.message} params: ${JSON.stringify(logParams)}`;
102
108
  throw e;
103
109
  }
@@ -127,7 +133,6 @@ function normalizeAddress(address) {
127
133
  return address;
128
134
  return address.toLowerCase();
129
135
  }
130
- exports.normalizeAddress = normalizeAddress;
131
136
  function normalizePrefixes(address) {
132
137
  const prefix = address.substring(0, address.indexOf(":"));
133
138
  if (["solana", "tezos"].includes(prefix))
@@ -138,7 +143,6 @@ function normalizePrefixes(address) {
138
143
  ? `coingecko:${address.toLowerCase()}`
139
144
  : address.toLowerCase();
140
145
  }
141
- exports.normalizePrefixes = normalizePrefixes;
142
146
  const ethereumAddress = "ethereum:0x0000000000000000000000000000000000000000";
143
147
  const weth = "ethereum:0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
144
148
  function normalizeBalances(balances) {
@@ -151,7 +155,7 @@ function normalizeBalances(balances) {
151
155
  const normalisedKey = normalizePrefixes(key);
152
156
  if (normalisedKey == key)
153
157
  return;
154
- (0, generalUtil_1.sumSingleBalance)(balances, normalisedKey, balances[key]);
158
+ (0, common_1.sumSingleBalance)(balances, normalisedKey, balances[key]);
155
159
  delete balances[key];
156
160
  });
157
161
  const eth = balances[ethereumAddress];
@@ -161,7 +165,6 @@ function normalizeBalances(balances) {
161
165
  }
162
166
  return balances;
163
167
  }
164
- exports.normalizeBalances = normalizeBalances;
165
168
  function tableToString(data, columns, { title, columns: _columns } = {}) {
166
169
  // If only two arguments are passed and the second is not an array, treat it as options
167
170
  if (arguments.length === 2 && !Array.isArray(columns) && typeof columns === 'object') {
@@ -222,4 +225,3 @@ function tableToString(data, columns, { title, columns: _columns } = {}) {
222
225
  });
223
226
  return tableString;
224
227
  }
225
- exports.tableToString = tableToString;
@@ -3,11 +3,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isIndexer2Enabled = exports.isIndexerEnabled = exports.getTransactions = exports.getTokenTransfers = exports.getLogs = exports.getTokens = exports.supportedChainSet2 = exports.supportedChainSet = void 0;
6
+ exports.supportedChainSet2 = exports.supportedChainSet = void 0;
7
+ exports.getTokens = getTokens;
8
+ exports.getLogs = getLogs;
9
+ exports.getTokenTransfers = getTokenTransfers;
10
+ exports.getTransactions = getTransactions;
11
+ exports.isIndexerEnabled = isIndexerEnabled;
12
+ exports.isIndexer2Enabled = isIndexer2Enabled;
7
13
  const axios_1 = __importDefault(require("axios"));
8
14
  const _1 = require(".");
9
15
  const general_1 = require("../general");
10
- const generalUtil_1 = require("../generalUtil");
16
+ const common_1 = require("./common");
11
17
  const blocks_1 = require("./blocks");
12
18
  const cache_1 = require("./cache");
13
19
  const debugLog_1 = require("./debugLog");
@@ -104,7 +110,7 @@ async function getChainIndexStatus(version = "v2") {
104
110
  return state.chainIndexStatus;
105
111
  state.timestamp = Date.now();
106
112
  state.chainIndexStatus = (async () => {
107
- const { data: { syncStatus }, } = await axiosInstances[version].get(`/sync`);
113
+ const { data: { syncStatus }, } = await axiosInstances[version].get(`/sync`).catch(e => { throw (0, common_1.formError)(e); });
108
114
  const info = {};
109
115
  syncStatus.forEach((d) => {
110
116
  const chain = indexerConfigs[version].chainMapping[d.chain];
@@ -154,7 +160,8 @@ async function getTokens(address, { onlyWhitelisted = true, skipCacheRead = fals
154
160
  if (cache.timestamp && timeNow - cache.timestamp < THREE_DAYS)
155
161
  return cache.tokens;
156
162
  }
157
- (0, debugLog_1.debugLog)("[Indexer] Pulling tokens for " + address);
163
+ if (env_1.logGetLogsIndexer)
164
+ (0, debugLog_1.debugLog)("[Indexer] Pulling tokens for " + address);
158
165
  const tokens = (_b = cache.tokens) !== null && _b !== void 0 ? _b : {};
159
166
  const { data: { balances }, } = await axiosInstances.v1(`/balances`, {
160
167
  params: {
@@ -162,7 +169,7 @@ async function getTokens(address, { onlyWhitelisted = true, skipCacheRead = fals
162
169
  chainId,
163
170
  type: tokenType,
164
171
  },
165
- });
172
+ }).catch(e => { throw (0, common_1.formError)(e); });
166
173
  balances
167
174
  .filter((b) => +b.total_amount > 0)
168
175
  .forEach((b) => {
@@ -176,13 +183,12 @@ async function getTokens(address, { onlyWhitelisted = true, skipCacheRead = fals
176
183
  const tokenCache = { timestamp: timeNow, tokens };
177
184
  Object.entries(tokens).forEach(([chain, values]) => {
178
185
  values.push(general_1.ETHER_ADDRESS);
179
- tokens[chain] = (0, generalUtil_1.getUniqueAddresses)(values);
186
+ tokens[chain] = (0, common_1.getUniqueAddresses)(values);
180
187
  });
181
188
  if (!skipCache)
182
189
  await (0, cache_1.writeCache)(file, tokenCache);
183
190
  return tokens;
184
191
  }
185
- exports.getTokens = getTokens;
186
192
  // ---------------------------------------------------------------------------
187
193
  // LOGS (v2 only)
188
194
  // ---------------------------------------------------------------------------
@@ -191,7 +197,7 @@ async function getLogs(options) {
191
197
  let { all = true, limit = 1000, offset: initialOffset = 0, target, targets = [], flatten = true, debugMode = false, noTarget = false, maxBlockRange, processor, } = options;
192
198
  const { chain, fromBlock, toBlock, topic, topic1, topic2, topic3, transformLog, } = await (0, logs_1.getLogParams)(options, true);
193
199
  if (!debugMode)
194
- debugMode = debugLog_1.DEBUG_LEVEL2;
200
+ debugMode = debugLog_1.DEBUG_LEVEL2 && env_1.logGetLogsIndexer;
195
201
  const blockRange = toBlock - fromBlock;
196
202
  const effectiveMaxBlockRange = maxBlockRange !== null && maxBlockRange !== void 0 ? maxBlockRange : (noTarget ? 10000 : Infinity);
197
203
  if (noTarget && blockRange > 500000) {
@@ -204,7 +210,16 @@ async function getLogs(options) {
204
210
  const chainIndexStatus = await getChainIndexStatus("v2");
205
211
  const lastIndexedBlock = (_b = (_a = chainIndexStatus[chain]) === null || _a === void 0 ? void 0 : _a.block) !== null && _b !== void 0 ? _b : 0;
206
212
  if (lastIndexedBlock < toBlock) {
207
- throw new Error(`Indexer not up to date for ${chain}. Last indexed block: ${lastIndexedBlock}, requested block: ${toBlock}`);
213
+ const percentageMissing = ((toBlock - lastIndexedBlock) / (toBlock - fromBlock)) * 100;
214
+ if (percentageMissing > 50) // more than 50% of the requested range is missing, throw an error and so we pull the logs through rpc calls
215
+ throw new Error(`Indexer not up to date for ${chain}. Last indexed block: ${lastIndexedBlock}, requested block: ${toBlock}`);
216
+ if (env_1.logGetLogsIndexer)
217
+ (0, debugLog_1.debugLog)(`Indexer only partially up to date for ${chain}. Last indexed block: ${lastIndexedBlock}, requested block: ${toBlock}, missing ${Number(percentageMissing).toFixed(2)}%. Pulling part of the logs through RPC calls.`);
218
+ // now we split the request into two parts, one that goes to the indexer and one that goes through rpc calls
219
+ const breakBlock = lastIndexedBlock - 50; // we add a small buffer to avoid missing logs due to reorgs
220
+ const indexerLogs = await getLogs({ ...options, fromBlock, toBlock: breakBlock });
221
+ const rpcLogs = await (0, logs_1.getLogs)({ ...options, fromBlock: breakBlock + 1, toBlock, skipIndexer: true });
222
+ return indexerLogs.concat(rpcLogs);
208
223
  }
209
224
  // Re‑curse if the requested range is too large ------------------------------------------------
210
225
  if (blockRange > effectiveMaxBlockRange) {
@@ -265,7 +280,7 @@ async function getLogs(options) {
265
280
  parseLog: options.parseLog,
266
281
  onlyArgs: options.onlyArgs,
267
282
  };
268
- const { data: { logs: _logs, totalCount }, } = await axiosInstances.v2(`/logs`, { params });
283
+ const { data: { logs: _logs, totalCount }, } = await axiosInstances.v2(`/logs`, { params }).catch(e => { throw (0, common_1.formError)(e); });
269
284
  const filtered = _logs.filter((l) => {
270
285
  const isWhitelisted = !addressSet.size || addressSet.has(l.source.toLowerCase());
271
286
  if (!isWhitelisted)
@@ -308,14 +323,13 @@ async function getLogs(options) {
308
323
  }
309
324
  return allLogs.map(i => i.transformed);
310
325
  }
311
- exports.getLogs = getLogs;
312
326
  // ---------------------------------------------------------------------------
313
327
  // TOKEN TRANSFERS (v2 only)
314
328
  // ---------------------------------------------------------------------------
315
329
  async function getTokenTransfers({ chain = "ethereum", fromAddressFilter, fromBlock, toBlock, all = true, limit = 1000, offset = 0, target, targets = [], flatten = true, fromTimestamp, toTimestamp, debugMode = false, transferType = "in", token, tokens, }) {
316
330
  var _a, _b;
317
331
  if (!debugMode)
318
- debugMode = debugLog_1.DEBUG_LEVEL2;
332
+ debugMode = debugLog_1.DEBUG_LEVEL2 && env_1.logGetLogsIndexer;
319
333
  checkIndexerConfig("v2");
320
334
  const chainId = getChainId(chain, "v2");
321
335
  // -----------------------------------------------------------------------
@@ -393,7 +407,7 @@ async function getTokenTransfers({ chain = "ethereum", fromAddressFilter, fromBl
393
407
  default:
394
408
  throw new Error("Invalid transferType");
395
409
  }
396
- const { data: { transfers: _logs, totalCount }, } = await axiosInstances.v2(`/token-transfers`, { params });
410
+ const { data: { transfers: _logs, totalCount }, } = await axiosInstances.v2(`/token-transfers`, { params }).catch(e => { throw (0, common_1.formError)(e); });
397
411
  rawTransfers.push(..._logs);
398
412
  currentOffset += limit;
399
413
  if (_logs.length < limit || totalCount <= rawTransfers.length || _logs.length === 0)
@@ -426,14 +440,13 @@ async function getTokenTransfers({ chain = "ethereum", fromAddressFilter, fromBl
426
440
  }
427
441
  return filteredTransfers;
428
442
  }
429
- exports.getTokenTransfers = getTokenTransfers;
430
443
  // ---------------------------------------------------------------------------
431
444
  // TRANSACTIONS (v2 only)
432
445
  // ---------------------------------------------------------------------------
433
446
  async function getTransactions({ chain = "ethereum", addresses, transaction_hashes, from_block, to_block, all = true, limit = 1000, offset = 0, debugMode = false, transactionType = "from", }) {
434
447
  var _a, _b;
435
448
  if (!debugMode)
436
- debugMode = debugLog_1.DEBUG_LEVEL2;
449
+ debugMode = debugLog_1.DEBUG_LEVEL2 && env_1.logGetLogsIndexer;
437
450
  checkIndexerConfig("v2");
438
451
  const chainId = getChainId(chain, "v2");
439
452
  if ((!addresses || addresses.length === 0) && (!transaction_hashes || transaction_hashes.length === 0))
@@ -471,7 +484,7 @@ async function getTransactions({ chain = "ethereum", addresses, transaction_hash
471
484
  (0, debugLog_1.debugLog)("[Indexer] Pulling transactions " + debugTimeKey);
472
485
  console.time(debugTimeKey);
473
486
  }
474
- const { data: { transactions } } = await axiosInstances.v2(`/transactions`, { params });
487
+ const { data: { transactions } } = await axiosInstances.v2(`/transactions`, { params }).catch(e => { throw (0, common_1.formError)(e); });
475
488
  if (debugMode) {
476
489
  console.timeEnd(debugTimeKey);
477
490
  (0, debugLog_1.debugLog)("Transactions pulled " + chain, addresses || transaction_hashes, (transactions === null || transactions === void 0 ? void 0 : transactions.length) || 0);
@@ -502,7 +515,6 @@ async function getTransactions({ chain = "ethereum", addresses, transaction_hash
502
515
  timestamp: t.timestamp,
503
516
  }));
504
517
  }
505
- exports.getTransactions = getTransactions;
506
518
  // ---------------------------------------------------------------------------
507
519
  // Public helpers
508
520
  // ---------------------------------------------------------------------------
@@ -514,9 +526,7 @@ function isIndexerEnabled(chain) {
514
526
  return false;
515
527
  return true;
516
528
  }
517
- exports.isIndexerEnabled = isIndexerEnabled;
518
529
  function isIndexer2Enabled(chain) {
519
530
  // Alias – retained so external calls do not break
520
531
  return isIndexerEnabled(chain);
521
532
  }
522
- exports.isIndexer2Enabled = isIndexer2Enabled;
@@ -15,15 +15,29 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.retriveCache = exports.startCache = exports.saveCache = exports.setCache = exports.getCache = void 0;
36
+ exports.getCache = getCache;
37
+ exports.setCache = setCache;
38
+ exports.saveCache = saveCache;
39
+ exports.startCache = startCache;
40
+ exports.retriveCache = retriveCache;
27
41
  const fs = __importStar(require("fs"));
28
42
  const env_1 = require("./env");
29
43
  // const cacheFile = __dirname + '/../../../sc-cache1.json'
@@ -41,7 +55,6 @@ function getCache(options) {
41
55
  cache[chain][abi] = {};
42
56
  return cache[chain][abi][address];
43
57
  }
44
- exports.getCache = getCache;
45
58
  function setCache(options) {
46
59
  let { address, abi, chain = "ethereum", value } = options;
47
60
  if (!address)
@@ -53,16 +66,12 @@ function setCache(options) {
53
66
  cache[chain][abi] = {};
54
67
  cache[chain][abi][address] = value;
55
68
  }
56
- exports.setCache = setCache;
57
69
  function saveCache() {
58
70
  fs.writeFileSync(cacheFile || './cache.json', JSON.stringify(cache));
59
71
  }
60
- exports.saveCache = saveCache;
61
72
  function startCache(_cache = {}) {
62
73
  cache = _cache;
63
74
  }
64
- exports.startCache = startCache;
65
75
  function retriveCache() {
66
76
  return cache;
67
77
  }
68
- exports.retriveCache = retriveCache;
@@ -3,15 +3,18 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getLogParams = exports.toFilterTopic = exports.getLogs = void 0;
6
+ exports.getLogs = getLogs;
7
+ exports.toFilterTopic = toFilterTopic;
8
+ exports.getLogParams = getLogParams;
7
9
  const ethers_1 = require("ethers");
8
10
  const _1 = require(".");
9
- const tron_1 = require("../abi/tron");
10
11
  const blocks_1 = require("./blocks");
11
12
  const cache_1 = require("./cache");
12
13
  const debugLog_1 = require("./debugLog");
13
14
  const indexer_1 = require("./indexer");
14
15
  const promisePool_1 = __importDefault(require("./promisePool"));
16
+ const env_1 = require("./env");
17
+ const common_1 = require("./common");
15
18
  const currentVersion = "v3";
16
19
  /* -------------------------------------------------------------------------- */
17
20
  /* getLogs */
@@ -43,7 +46,7 @@ async function getLogs(options) {
43
46
  }
44
47
  }
45
48
  if (!debugMode)
46
- debugMode = debugLog_1.DEBUG_LEVEL2;
49
+ debugMode = debugLog_1.DEBUG_LEVEL2 && env_1.logGetLogsDebug;
47
50
  /* ----------------------- Split by maxBlockRange ------------------------- */
48
51
  const blockRange = toBlock - fromBlock;
49
52
  if (maxBlockRange && blockRange > maxBlockRange) {
@@ -76,7 +79,7 @@ async function getLogs(options) {
76
79
  }
77
80
  /* ----------------------------- RPC fallback ----------------------------- */
78
81
  if (chain === "tron")
79
- target = (0, tron_1.hexifyTarget)(target);
82
+ target = (0, common_1.tronToEvmAddress)(target);
80
83
  let caches = (await _getCache());
81
84
  const firstRun = !caches.length;
82
85
  if (firstRun || skipCacheRead) {
@@ -203,7 +206,6 @@ async function getLogs(options) {
203
206
  return `event-logs/${chain}/${(_a = target === null || target === void 0 ? void 0 : target.toLowerCase()) !== null && _a !== void 0 ? _a : null}-${extraKey}`;
204
207
  }
205
208
  }
206
- exports.getLogs = getLogs;
207
209
  /* -------------------------------------------------------------------------- */
208
210
  /* Utility helpers exported */
209
211
  /* -------------------------------------------------------------------------- */
@@ -213,7 +215,6 @@ function toFilterTopic(topic) {
213
215
  const fragment = ethers_1.EventFragment.from(topic);
214
216
  return (0, ethers_1.id)(fragment.format());
215
217
  }
216
- exports.toFilterTopic = toFilterTopic;
217
218
  exports.default = getLogs;
218
219
  async function getLogParams(options, isIndexerCall = false) {
219
220
  let { target, chain = "ethereum", fromBlock, toBlock, fromTimestamp, toTimestamp, eventAbi, topic, topics, extraTopics, entireLog = false, onlyArgs = false, targets = [], noTarget = false, parseLog = false, allowParseFailure = false, processor, flatten = false, } = options;
@@ -331,4 +332,3 @@ async function getLogParams(options, isIndexerCall = false) {
331
332
  topics,
332
333
  };
333
334
  }
334
- exports.getLogParams = getLogParams;
@@ -2,4 +2,7 @@ export default function runInPromisePool(params: {
2
2
  items: any[];
3
3
  concurrency: number;
4
4
  processor: any;
5
- }): Promise<any[]>;
5
+ permitFailure?: boolean;
6
+ withMetadata?: boolean;
7
+ }): Promise<any>;
8
+ export { runInPromisePool };
@@ -1,16 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = runInPromisePool;
4
+ exports.runInPromisePool = runInPromisePool;
3
5
  const promise_pool_1 = require("@supercharge/promise-pool");
4
- const generalUtil_1 = require("../generalUtil");
5
- generalUtil_1.formError;
6
+ const common_1 = require("./common");
6
7
  async function runInPromisePool(params) {
7
- const { results, errors } = await promise_pool_1.PromisePool
8
+ const errors = [];
9
+ const { results, } = await promise_pool_1.PromisePool
8
10
  .withConcurrency(params.concurrency)
9
11
  .for(params.items)
10
- .process(async (item, i) => [await params.processor(item, i), i]);
11
- if (errors.length)
12
- throw (0, generalUtil_1.formError)(null, { promisePoolErrors: errors });
12
+ .process(async (item, i) => {
13
+ try {
14
+ if (errors.length && !params.permitFailure)
15
+ throw new Error('Aborting, previous errors in promise pool');
16
+ const res = await params.processor(item, i);
17
+ return [res, i];
18
+ }
19
+ catch (e) {
20
+ errors.push(e);
21
+ return [undefined, i];
22
+ }
23
+ });
24
+ if (errors.length && !params.permitFailure)
25
+ throw (0, common_1.formError)(null, { promisePoolErrors: errors });
26
+ // Preserve order of results
13
27
  const flatResults = results.sort((a, b) => a[1] - b[1]).map((i => i[0]));
28
+ if (params.withMetadata)
29
+ return { results: flatResults, errors };
14
30
  return flatResults;
15
31
  }
16
- exports.default = runInPromisePool;
@@ -1,3 +1,2 @@
1
- /// <reference types="node" />
2
1
  export declare function storeR2JSONString(filename: string, body: string | Buffer): Promise<any>;
3
2
  export declare function getR2JSONString(filename: string): Promise<any>;
package/build/util/r2.js CHANGED
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.getR2JSONString = exports.storeR2JSONString = void 0;
7
- const axios_1 = __importDefault(require("axios"));
3
+ exports.storeR2JSONString = storeR2JSONString;
4
+ exports.getR2JSONString = getR2JSONString;
8
5
  const env_1 = require("./env");
6
+ const common_1 = require("./common");
9
7
  const { S3Client, PutObjectCommand, GetObjectCommand, } = require("@aws-sdk/client-s3");
10
8
  const { R2_ENDPOINT, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY } = env_1.ENV_CONSTANTS;
11
9
  const datasetBucket = "defillama-datasets";
@@ -35,7 +33,6 @@ async function storeR2JSONString(filename, body) {
35
33
  });
36
34
  return R2.send(command);
37
35
  }
38
- exports.storeR2JSONString = storeR2JSONString;
39
36
  async function getR2JSONString(filename) {
40
37
  try {
41
38
  if (!R2)
@@ -48,8 +45,6 @@ async function getR2JSONString(filename) {
48
45
  return {};
49
46
  }
50
47
  async function _fetchData() {
51
- const response = await (0, axios_1.default)(`${publicBucketUrl}/${filename}`);
52
- return response.data;
48
+ return (0, common_1.fetchJson)(`${publicBucketUrl}/${filename}`);
53
49
  }
54
50
  }
55
- exports.getR2JSONString = getR2JSONString;