@fileverse-dev/formulajs 4.4.11-mod-68 → 4.4.11-mod-68-patch-1
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/lib/browser/formula.js +368 -244
- package/lib/browser/formula.min.js +2 -2
- package/lib/browser/formula.min.js.map +1 -1
- package/lib/cjs/index.cjs +211 -70
- package/lib/esm/index.mjs +211 -70
- package/package.json +1 -1
package/lib/cjs/index.cjs
CHANGED
|
@@ -13144,15 +13144,126 @@ const SERVICES_API_KEY = {
|
|
|
13144
13144
|
Defillama: 'Defillama'
|
|
13145
13145
|
};
|
|
13146
13146
|
|
|
13147
|
+
// Proxy map configuration
|
|
13148
|
+
const PROXY_MAP = {
|
|
13149
|
+
Etherscan: {
|
|
13150
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13151
|
+
removeParams: ['apikey']
|
|
13152
|
+
},
|
|
13153
|
+
Basescan: {
|
|
13154
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13155
|
+
removeParams: ['apikey']
|
|
13156
|
+
},
|
|
13157
|
+
Gnosisscan: {
|
|
13158
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13159
|
+
removeParams: ['apikey']
|
|
13160
|
+
},
|
|
13161
|
+
Coingecko: {
|
|
13162
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13163
|
+
removeParams: ['apikey']
|
|
13164
|
+
},
|
|
13165
|
+
Firefly: {
|
|
13166
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13167
|
+
removeParams: ['apikey']
|
|
13168
|
+
},
|
|
13169
|
+
Neynar: {
|
|
13170
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13171
|
+
removeParams: ['api_key']
|
|
13172
|
+
},
|
|
13173
|
+
Safe: {
|
|
13174
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13175
|
+
removeParams: ['api_key']
|
|
13176
|
+
},
|
|
13177
|
+
Defillama: {
|
|
13178
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13179
|
+
removeParams: ['api_key']
|
|
13180
|
+
},
|
|
13181
|
+
GnosisPay: {
|
|
13182
|
+
url: "https://staging-api-proxy-ca4268d7d581.herokuapp.com/proxy",
|
|
13183
|
+
removeParams: ['api_key']
|
|
13184
|
+
},
|
|
13185
|
+
// Add more services as needed. It can be direct url instead of ENV variable
|
|
13186
|
+
// ANOTHER_SERVICE: "https://another-proxy-url.com"
|
|
13187
|
+
};
|
|
13188
|
+
|
|
13189
|
+
/**
|
|
13190
|
+
* Removes specified parameters from a URL
|
|
13191
|
+
* @param {string} url - The original URL
|
|
13192
|
+
* @param {string[]} paramsToRemove - Array of parameter names to remove
|
|
13193
|
+
* @returns {string} URL with specified parameters removed
|
|
13194
|
+
*/
|
|
13195
|
+
function removeUrlParams(url, paramsToRemove) {
|
|
13196
|
+
if (!paramsToRemove || paramsToRemove.length === 0) {
|
|
13197
|
+
return url;
|
|
13198
|
+
}
|
|
13199
|
+
|
|
13200
|
+
const urlObj = new URL(url);
|
|
13201
|
+
|
|
13202
|
+
paramsToRemove.forEach(param => {
|
|
13203
|
+
if (urlObj.searchParams.has(param)) {
|
|
13204
|
+
urlObj.searchParams.delete(param);
|
|
13205
|
+
}
|
|
13206
|
+
});
|
|
13207
|
+
|
|
13208
|
+
return urlObj.toString();
|
|
13209
|
+
}
|
|
13210
|
+
|
|
13211
|
+
/**
|
|
13212
|
+
* Handles URL routing through proxy or direct API calls
|
|
13213
|
+
* @param {string} url - The original API URL
|
|
13214
|
+
* @param {string} serviceName - The name of the service (e.g., 'EOA')
|
|
13215
|
+
* @param {string} headers - The name of the service (e.g., 'EOA')
|
|
13216
|
+
* @returns {Object} Object containing URL and HEADERS for the fetch request
|
|
13217
|
+
*/
|
|
13218
|
+
function getUrlAndHeaders({ url, serviceName, headers = {} }) {
|
|
13219
|
+
console.log('getUrlAndHeaders new modified function from formulajs', url, apiKeyName, serviceName);
|
|
13220
|
+
// Check if proxy is enabled in localStorage
|
|
13221
|
+
const apiKeyLS = window.localStorage.getItem(SERVICES_API_KEY[serviceName]);
|
|
13222
|
+
const isProxyModeEnabledValue = apiKeyLS === 'DEFAULT_PROXY_MODE';
|
|
13223
|
+
|
|
13224
|
+
// Check if proxy URL exists for this service
|
|
13225
|
+
const proxyConfig = PROXY_MAP[serviceName];
|
|
13226
|
+
|
|
13227
|
+
// If proxy mode is enabled AND proxy URL exists for this service
|
|
13228
|
+
if (isProxyModeEnabledValue && proxyConfig && serviceName && SERVICES_API_KEY[serviceName]) {
|
|
13229
|
+
console.log('isProxyModeEnabledValue', isProxyModeEnabledValue);
|
|
13230
|
+
// Remove specified parameters from the target URL
|
|
13231
|
+
const cleanedUrl = removeUrlParams(url, proxyConfig.removeParams);
|
|
13232
|
+
|
|
13233
|
+
return {
|
|
13234
|
+
URL: proxyConfig.url,
|
|
13235
|
+
HEADERS: {
|
|
13236
|
+
'target-url': cleanedUrl,
|
|
13237
|
+
method: 'GET',
|
|
13238
|
+
'Content-Type': 'application/json'
|
|
13239
|
+
}
|
|
13240
|
+
};
|
|
13241
|
+
}
|
|
13242
|
+
|
|
13243
|
+
|
|
13244
|
+
return {
|
|
13245
|
+
URL: url,
|
|
13246
|
+
HEADERS: {
|
|
13247
|
+
...headers,
|
|
13248
|
+
method: 'GET',
|
|
13249
|
+
'Content-Type': 'application/json'
|
|
13250
|
+
}
|
|
13251
|
+
};
|
|
13252
|
+
}
|
|
13253
|
+
|
|
13147
13254
|
const fromTimeStampToBlock = async (timestamp, chain, apiKey) => {
|
|
13148
|
-
if(!timestamp || !chain || !apiKey) return
|
|
13149
|
-
|
|
13150
|
-
|
|
13151
|
-
|
|
13152
|
-
|
|
13153
|
-
|
|
13255
|
+
if (!timestamp || !chain || !apiKey) return
|
|
13256
|
+
const chainId = CHAIN_ID_MAP[chain];
|
|
13257
|
+
const url = `https://api.etherscan.io/v2/api?module=block&action=getblocknobytime×tamp=${timestamp}&closest=before&apikey=${apiKey}&chainId=${chainId}`;
|
|
13258
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders(url);
|
|
13259
|
+
const res = await fetch(finalUrl, {
|
|
13260
|
+
method: 'GET',
|
|
13261
|
+
headers: HEADERS,
|
|
13262
|
+
});
|
|
13263
|
+
const json = await res.json();
|
|
13264
|
+
return parseInt(json.result);
|
|
13154
13265
|
|
|
13155
|
-
|
|
13266
|
+
};
|
|
13156
13267
|
|
|
13157
13268
|
var fromTimestampToBlock = {
|
|
13158
13269
|
fromTimeStampToBlock
|
|
@@ -13309,7 +13420,11 @@ async function handleScanRequest({
|
|
|
13309
13420
|
}
|
|
13310
13421
|
url += `&page=${page}&offset=${offset}`;
|
|
13311
13422
|
}
|
|
13312
|
-
const
|
|
13423
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({url, serviceName: 'Etherscan', headers: {}});
|
|
13424
|
+
const res = await fetch(finalUrl, {
|
|
13425
|
+
method: 'GET',
|
|
13426
|
+
headers: HEADERS,
|
|
13427
|
+
});
|
|
13313
13428
|
if (!res.ok) {
|
|
13314
13429
|
throw new NetworkError(apiInfo.apiKeyName, res.status)
|
|
13315
13430
|
}
|
|
@@ -13328,14 +13443,19 @@ async function handleScanRequest({
|
|
|
13328
13443
|
}
|
|
13329
13444
|
|
|
13330
13445
|
const fromUsernameToFid = async (username, apiKey) => {
|
|
13331
|
-
if(!username) return null
|
|
13446
|
+
if (!username) return null
|
|
13332
13447
|
const url = `https://api.neynar.com/v2/farcaster/user/search/?q=${username}&limit=5`;
|
|
13333
|
-
const
|
|
13334
|
-
headers: {
|
|
13448
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({
|
|
13449
|
+
url, serviceName: 'Neynar', headers: {
|
|
13335
13450
|
'x-api-key': apiKey,
|
|
13336
13451
|
'x-neynar-experimental': 'false'
|
|
13337
13452
|
}
|
|
13338
13453
|
});
|
|
13454
|
+
|
|
13455
|
+
const res = await fetch(finalUrl, {
|
|
13456
|
+
method: 'GET',
|
|
13457
|
+
headers: HEADERS,
|
|
13458
|
+
});
|
|
13339
13459
|
const json = await res.json();
|
|
13340
13460
|
const users = json.result ? json.result.users : [];
|
|
13341
13461
|
const user = users.find(user => user.username === username);
|
|
@@ -17563,9 +17683,9 @@ const aaveParamsSchema = objectType({
|
|
|
17563
17683
|
|
|
17564
17684
|
async function FIREFLY() {
|
|
17565
17685
|
try {
|
|
17566
|
-
|
|
17686
|
+
const [platform, contentType, identifier, start = 0, end = 10] = argsToArray(arguments);
|
|
17567
17687
|
|
|
17568
|
-
validateParams(fireflyParamsSchema, {
|
|
17688
|
+
validateParams(fireflyParamsSchema, {
|
|
17569
17689
|
platform,
|
|
17570
17690
|
contentType,
|
|
17571
17691
|
identifier,
|
|
@@ -17587,12 +17707,14 @@ validateParams(fireflyParamsSchema, {
|
|
|
17587
17707
|
.filter(Boolean)
|
|
17588
17708
|
.join(',')
|
|
17589
17709
|
);
|
|
17590
|
-
|
|
17591
|
-
|
|
17592
|
-
|
|
17710
|
+
url.searchParams.set('type', fireFlyPlaformType[platform][contentType]);
|
|
17711
|
+
url.searchParams.set('start', String(start));
|
|
17712
|
+
url.searchParams.set('end', String(end));
|
|
17593
17713
|
|
|
17594
|
-
const
|
|
17595
|
-
|
|
17714
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({ url: url.toString(), serviceName: 'Firefly', headers });
|
|
17715
|
+
const response = await fetch(finalUrl, {
|
|
17716
|
+
method: 'GET',
|
|
17717
|
+
headers: HEADERS,
|
|
17596
17718
|
});
|
|
17597
17719
|
if (!response.ok) {
|
|
17598
17720
|
throw new NetworkError(SERVICES_API_KEY.Firefly, response.status)
|
|
@@ -17650,15 +17772,18 @@ async function LENS() {
|
|
|
17650
17772
|
.join(',')
|
|
17651
17773
|
);
|
|
17652
17774
|
const typeMap = {
|
|
17653
|
-
posts:
|
|
17775
|
+
posts: 'lensid',
|
|
17654
17776
|
replies: 'lenspostid',
|
|
17655
17777
|
};
|
|
17656
17778
|
url.searchParams.set('type', typeMap[contentType]);
|
|
17657
17779
|
url.searchParams.set('start', String(start));
|
|
17658
|
-
url.searchParams.set('end',
|
|
17780
|
+
url.searchParams.set('end', String(end));
|
|
17659
17781
|
|
|
17660
|
-
const
|
|
17661
|
-
|
|
17782
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({ url: url.toString(), serviceName: 'Firefly', headers });
|
|
17783
|
+
|
|
17784
|
+
const response = await fetch(finalUrl, {
|
|
17785
|
+
method: 'GET',
|
|
17786
|
+
headers: HEADERS,
|
|
17662
17787
|
});
|
|
17663
17788
|
if (!response.ok) {
|
|
17664
17789
|
throw new NetworkError(SERVICES_API_KEY.Firefly, response.status)
|
|
@@ -17685,7 +17810,7 @@ async function FARCASTER() {
|
|
|
17685
17810
|
try {
|
|
17686
17811
|
const [contentType, identifier, start = 0, end = 10] =
|
|
17687
17812
|
argsToArray(arguments);
|
|
17688
|
-
validateParams(farcasterParamsSchema, {
|
|
17813
|
+
validateParams(farcasterParamsSchema, {
|
|
17689
17814
|
contentType,
|
|
17690
17815
|
identifier,
|
|
17691
17816
|
start,
|
|
@@ -17711,16 +17836,19 @@ validateParams(farcasterParamsSchema, {
|
|
|
17711
17836
|
.join(',')
|
|
17712
17837
|
);
|
|
17713
17838
|
const typeMap = {
|
|
17714
|
-
|
|
17715
|
-
|
|
17716
|
-
|
|
17717
|
-
};
|
|
17839
|
+
posts: 'farcasterid',
|
|
17840
|
+
replies: 'farcasterpostid',
|
|
17841
|
+
channels: 'farcasterchannels',
|
|
17842
|
+
};
|
|
17718
17843
|
url.searchParams.set('type', typeMap[contentType]);
|
|
17719
17844
|
url.searchParams.set('start', String(start));
|
|
17720
|
-
url.searchParams.set('end',
|
|
17845
|
+
url.searchParams.set('end', String(end));
|
|
17846
|
+
|
|
17847
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({ url: url.toString(), serviceName: 'Firefly', headers });
|
|
17721
17848
|
|
|
17722
|
-
const response = await fetch(
|
|
17723
|
-
|
|
17849
|
+
const response = await fetch(finalUrl, {
|
|
17850
|
+
method: 'GET',
|
|
17851
|
+
headers: HEADERS,
|
|
17724
17852
|
});
|
|
17725
17853
|
if (!response.ok) {
|
|
17726
17854
|
throw new NetworkError(
|
|
@@ -17829,12 +17957,12 @@ async function BLOCKSCOUT() {
|
|
|
17829
17957
|
}
|
|
17830
17958
|
|
|
17831
17959
|
async function BASE() {
|
|
17832
|
-
try {
|
|
17960
|
+
try {
|
|
17833
17961
|
const [type, address, startDate, endDate, page, limit] = argsToArray(arguments);
|
|
17834
|
-
|
|
17962
|
+
validateParams(baseParamsSchema, { type, address, startDate, endDate, page, limit });
|
|
17835
17963
|
const API_KEY = window.localStorage.getItem(SERVICES_API_KEY.Basescan);
|
|
17836
17964
|
if (!API_KEY) throw new MissingApiKeyError(SERVICES_API_KEY.Basescan)
|
|
17837
|
-
|
|
17965
|
+
|
|
17838
17966
|
return await handleScanRequest({
|
|
17839
17967
|
type,
|
|
17840
17968
|
address,
|
|
@@ -17847,9 +17975,9 @@ try {
|
|
|
17847
17975
|
chainId: CHAIN_ID_MAP.base,
|
|
17848
17976
|
network: 'base'
|
|
17849
17977
|
})
|
|
17850
|
-
} catch (error) {
|
|
17851
|
-
|
|
17852
|
-
}
|
|
17978
|
+
} catch (error) {
|
|
17979
|
+
return errorMessageHandler(error, 'BASE')
|
|
17980
|
+
}
|
|
17853
17981
|
}
|
|
17854
17982
|
async function GNOSIS() {
|
|
17855
17983
|
try {
|
|
@@ -17890,9 +18018,9 @@ async function GNOSIS() {
|
|
|
17890
18018
|
|
|
17891
18019
|
async function NEYNAR() {
|
|
17892
18020
|
try {
|
|
17893
|
-
|
|
17894
|
-
|
|
17895
|
-
});
|
|
18021
|
+
const neynarParamsSchema = objectType({
|
|
18022
|
+
username: stringType().nonempty()
|
|
18023
|
+
});
|
|
17896
18024
|
|
|
17897
18025
|
const [username] = argsToArray(arguments);
|
|
17898
18026
|
|
|
@@ -17906,12 +18034,19 @@ async function NEYNAR() {
|
|
|
17906
18034
|
|
|
17907
18035
|
const url = `https://api.neynar.com/v2/farcaster/followers?fid=${fid}`;
|
|
17908
18036
|
|
|
17909
|
-
const
|
|
17910
|
-
headers: {
|
|
17911
|
-
|
|
17912
|
-
|
|
18037
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({
|
|
18038
|
+
url: url.toString(), serviceName: 'Firefly', headers: {
|
|
18039
|
+
headers: {
|
|
18040
|
+
'x-api-key': API_KEY,
|
|
18041
|
+
'x-neynar-experimental': 'false'
|
|
18042
|
+
}
|
|
17913
18043
|
}
|
|
17914
18044
|
});
|
|
18045
|
+
|
|
18046
|
+
const response = await fetch(finalUrl, {
|
|
18047
|
+
method: 'GET',
|
|
18048
|
+
headers: HEADERS,
|
|
18049
|
+
});
|
|
17915
18050
|
if (!response.ok) {
|
|
17916
18051
|
throw new NetworkError(SERVICES_API_KEY.Neynar, response.status)
|
|
17917
18052
|
}
|
|
@@ -18045,20 +18180,20 @@ async function COINGECKO() {
|
|
|
18045
18180
|
break
|
|
18046
18181
|
}
|
|
18047
18182
|
case 'market': {
|
|
18048
|
-
const map = { all:'', base:'base-ecosystem', meme:'meme-token', aiagents:'ai-agents', bitcoin:'bitcoin-ecosystem', ethereum:'ethereum-ecosystem', hyperliquid:'hyperliquid-ecosystem', pump:'pump-ecosystem', solana:'solana-ecosystem' };
|
|
18183
|
+
const map = { all: '', base: 'base-ecosystem', meme: 'meme-token', aiagents: 'ai-agents', bitcoin: 'bitcoin-ecosystem', ethereum: 'ethereum-ecosystem', hyperliquid: 'hyperliquid-ecosystem', pump: 'pump-ecosystem', solana: 'solana-ecosystem' };
|
|
18049
18184
|
const _category = map[param1] || '';
|
|
18050
18185
|
const trend = param2 ? `&price_change_percentage=${param2}` : '';
|
|
18051
|
-
url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&include_tokens=top&page=1&per_page=100${_category
|
|
18186
|
+
url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&include_tokens=top&page=1&per_page=100${_category ? `&category=${_category}` : ''}${trend}`;
|
|
18052
18187
|
break
|
|
18053
18188
|
}
|
|
18054
18189
|
case 'stablecoins': {
|
|
18055
|
-
const _category = param1==='all'? 'stablecoins' : param1;
|
|
18190
|
+
const _category = param1 === 'all' ? 'stablecoins' : param1;
|
|
18056
18191
|
const trend = param2 ? `&price_change_percentage=${param2}` : '';
|
|
18057
18192
|
url = `https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&category=${_category}&order=market_cap_desc&page=1&per_page=100${trend}`;
|
|
18058
18193
|
break
|
|
18059
18194
|
}
|
|
18060
18195
|
case 'derivatives': {
|
|
18061
|
-
url = (!param1 || param1==='all')
|
|
18196
|
+
url = (!param1 || param1 === 'all')
|
|
18062
18197
|
? 'https://api.coingecko.com/api/v3/derivatives'
|
|
18063
18198
|
: `https://api.coingecko.com/api/v3/derivatives/exchanges/${param1}?include_tickers=all`;
|
|
18064
18199
|
break
|
|
@@ -18073,17 +18208,17 @@ async function COINGECKO() {
|
|
|
18073
18208
|
throw new NetworkError(SERVICES_API_KEY.Coingecko, res.status)
|
|
18074
18209
|
}
|
|
18075
18210
|
|
|
18076
|
-
if (category==='price') {
|
|
18211
|
+
if (category === 'price') {
|
|
18077
18212
|
const out = {};
|
|
18078
18213
|
for (const [token, prices] of Object.entries(json))
|
|
18079
|
-
for (const [cur,val] of Object.entries(prices))
|
|
18080
|
-
out[`${token.charAt(0).toUpperCase()+token.slice(1)}_${cur.toUpperCase()}`]=val;
|
|
18214
|
+
for (const [cur, val] of Object.entries(prices))
|
|
18215
|
+
out[`${token.charAt(0).toUpperCase() + token.slice(1)}_${cur.toUpperCase()}`] = val;
|
|
18081
18216
|
return [out]
|
|
18082
18217
|
}
|
|
18083
18218
|
|
|
18084
18219
|
const data = Array.isArray(json) ? json : [json];
|
|
18085
|
-
return data.map(item=>{
|
|
18086
|
-
const flat={};
|
|
18220
|
+
return data.map(item => {
|
|
18221
|
+
const flat = {};
|
|
18087
18222
|
for (const [key, value] of Object.entries(item)) {
|
|
18088
18223
|
if (typeof value !== 'object' || value === null) {
|
|
18089
18224
|
flat[key] = value;
|
|
@@ -18091,12 +18226,13 @@ async function COINGECKO() {
|
|
|
18091
18226
|
}
|
|
18092
18227
|
return flat
|
|
18093
18228
|
})
|
|
18094
|
-
} catch(err) {
|
|
18095
|
-
return errorMessageHandler(err,'COINGECKO')
|
|
18229
|
+
} catch (err) {
|
|
18230
|
+
return errorMessageHandler(err, 'COINGECKO')
|
|
18096
18231
|
}
|
|
18097
18232
|
}
|
|
18098
18233
|
|
|
18099
18234
|
async function EOA() {
|
|
18235
|
+
console.log('EOA');
|
|
18100
18236
|
try {
|
|
18101
18237
|
const [addresses, category, chains, startTime, endTime, page = 1, offset = 10] =
|
|
18102
18238
|
argsToArray(arguments);
|
|
@@ -18105,8 +18241,8 @@ async function EOA() {
|
|
|
18105
18241
|
const apiKey = window.localStorage.getItem(SERVICES_API_KEY.Etherscan);
|
|
18106
18242
|
if (!apiKey) throw new MissingApiKeyError(SERVICES_API_KEY.Etherscan)
|
|
18107
18243
|
|
|
18108
|
-
const INPUTS = addresses.split(',').map(s=>s.trim()).filter(Boolean);
|
|
18109
|
-
const CHAINS = chains.split(',').map(s=>s.trim()).filter(Boolean);
|
|
18244
|
+
const INPUTS = addresses.split(',').map(s => s.trim()).filter(Boolean);
|
|
18245
|
+
const CHAINS = chains.split(',').map(s => s.trim()).filter(Boolean);
|
|
18110
18246
|
|
|
18111
18247
|
const ADDRESS_MAP = {};
|
|
18112
18248
|
for (const inp of INPUTS) {
|
|
@@ -18123,7 +18259,12 @@ async function EOA() {
|
|
|
18123
18259
|
const out = [];
|
|
18124
18260
|
|
|
18125
18261
|
async function fetchJSON(url) {
|
|
18126
|
-
const
|
|
18262
|
+
const { URL: finalUrl, HEADERS } = getUrlAndHeaders({ url, serviceName: 'Etherscan', headers: {} });
|
|
18263
|
+
console.log('finalUrl', finalUrl, HEADERS);
|
|
18264
|
+
const res = await fetch(finalUrl, {
|
|
18265
|
+
method: 'GET',
|
|
18266
|
+
headers: HEADERS,
|
|
18267
|
+
});
|
|
18127
18268
|
if (!res.ok) throw new NetworkError(SERVICES_API_KEY.Etherscan, res.status)
|
|
18128
18269
|
const json = await res.json();
|
|
18129
18270
|
|
|
@@ -18141,15 +18282,15 @@ async function EOA() {
|
|
|
18141
18282
|
|
|
18142
18283
|
if (category === 'balance') {
|
|
18143
18284
|
// chunk 20
|
|
18144
|
-
for (let i=0; i<ADDRS.length; i+=20) {
|
|
18145
|
-
const slice = ADDRS.slice(i,i+20).join(',');
|
|
18285
|
+
for (let i = 0; i < ADDRS.length; i += 20) {
|
|
18286
|
+
const slice = ADDRS.slice(i, i + 20).join(',');
|
|
18146
18287
|
const url =
|
|
18147
|
-
`https://api.etherscan.io/v2/api?chainid=${chainId}
|
|
18148
|
-
`&module=account&action=addresstokenbalance&address=${slice}
|
|
18288
|
+
`https://api.etherscan.io/v2/api?chainid=${chainId}` +
|
|
18289
|
+
`&module=account&action=addresstokenbalance&address=${slice}` +
|
|
18149
18290
|
`&page=${page}&offset=${offset}&apikey=${apiKey}`;
|
|
18150
18291
|
const data = await fetchJSON(url);
|
|
18151
18292
|
if (!Array.isArray(data)) return data
|
|
18152
|
-
data.forEach((item, idx) => out.push({ chain, address: ADDRS[i+idx], name: ADDRESS_MAP[ADDRS[i+idx]], ...item }));
|
|
18293
|
+
data.forEach((item, idx) => out.push({ chain, address: ADDRS[i + idx], name: ADDRESS_MAP[ADDRS[i + idx]], ...item }));
|
|
18153
18294
|
}
|
|
18154
18295
|
} else {
|
|
18155
18296
|
// txns
|
|
@@ -18159,9 +18300,9 @@ async function EOA() {
|
|
|
18159
18300
|
if (!eb) throw new ValidationError(`Invalid endTime: ${endTime}`)
|
|
18160
18301
|
for (const addr of ADDRS) {
|
|
18161
18302
|
const url =
|
|
18162
|
-
`https://api.etherscan.io/v2/api?chainid=${chainId}
|
|
18163
|
-
`&module=account&action=tokentx&address=${addr}
|
|
18164
|
-
`&startblock=${sb}&endblock=${eb}
|
|
18303
|
+
`https://api.etherscan.io/v2/api?chainid=${chainId}` +
|
|
18304
|
+
`&module=account&action=tokentx&address=${addr}` +
|
|
18305
|
+
`&startblock=${sb}&endblock=${eb}` +
|
|
18165
18306
|
`&page=${page}&offset=${offset}&sort=asc&apikey=${apiKey}`;
|
|
18166
18307
|
const data = await fetchJSON(url);
|
|
18167
18308
|
if (!Array.isArray(data)) return data
|
|
@@ -18236,20 +18377,20 @@ async function DEFILLAMA() {
|
|
|
18236
18377
|
|
|
18237
18378
|
switch (category) {
|
|
18238
18379
|
case 'protocols':
|
|
18239
|
-
json = Array.isArray(json) ? json.slice(0,500) : [];
|
|
18380
|
+
json = Array.isArray(json) ? json.slice(0, 500) : [];
|
|
18240
18381
|
break
|
|
18241
18382
|
case 'yields':
|
|
18242
|
-
json = Array.isArray(json.data) ? json.data.slice(0,500) : [];
|
|
18383
|
+
json = Array.isArray(json.data) ? json.data.slice(0, 500) : [];
|
|
18243
18384
|
break
|
|
18244
18385
|
case 'dex':
|
|
18245
18386
|
case 'fees':
|
|
18246
|
-
json = Array.isArray(json.protocols) ? json.protocols.slice(0,500) : [];
|
|
18387
|
+
json = Array.isArray(json.protocols) ? json.protocols.slice(0, 500) : [];
|
|
18247
18388
|
break
|
|
18248
18389
|
}
|
|
18249
18390
|
|
|
18250
18391
|
return (Array.isArray(json) ? json : [json]).map(item => {
|
|
18251
18392
|
const out = {};
|
|
18252
|
-
for (const [k,v] of Object.entries(item)) {
|
|
18393
|
+
for (const [k, v] of Object.entries(item)) {
|
|
18253
18394
|
if (v === null || typeof v !== 'object') out[k] = v;
|
|
18254
18395
|
}
|
|
18255
18396
|
return out
|
|
@@ -18285,7 +18426,7 @@ async function UNISWAP() {
|
|
|
18285
18426
|
// flatten nested
|
|
18286
18427
|
return json.map(item => {
|
|
18287
18428
|
const flat = {};
|
|
18288
|
-
Object.entries(item).forEach(([k,v]) => {
|
|
18429
|
+
Object.entries(item).forEach(([k, v]) => {
|
|
18289
18430
|
if (v === null || typeof v !== 'object') flat[k] = v;
|
|
18290
18431
|
});
|
|
18291
18432
|
return flat
|