@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/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
- const chainId = CHAIN_ID_MAP[chain];
13150
- const url = `https://api.etherscan.io/v2/api?module=block&action=getblocknobytime&timestamp=${timestamp}&closest=before&apikey=${apiKey}&chainId=${chainId}`;
13151
- const res = await fetch(url);
13152
- const json = await res.json();
13153
- return parseInt(json.result);
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&timestamp=${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 res = await fetch(url);
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 res = await fetch(url, {
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
- const [platform, contentType, identifier, start = 0, end = 10] = argsToArray(arguments);
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
- url.searchParams.set('type', fireFlyPlaformType[platform][contentType]);
17591
- url.searchParams.set('start', String(start));
17592
- url.searchParams.set('end', String(end));
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 response = await fetch(url.toString(), {
17595
- headers: { 'x-api-key': apiKey }
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: 'lensid',
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', String(end));
17780
+ url.searchParams.set('end', String(end));
17659
17781
 
17660
- const response = await fetch(url.toString(), {
17661
- headers: { 'x-api-key': apiKey },
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
- posts: 'farcasterid',
17715
- replies: 'farcasterpostid',
17716
- channels: 'farcasterchannels',
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', String(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(url.toString(), {
17723
- headers: { 'x-api-key': apiKey },
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
- validateParams(baseParamsSchema, { type, address, startDate, endDate, page, limit });
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
- return errorMessageHandler(error, 'BASE')
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
- const neynarParamsSchema = objectType({
17894
- username: stringType().nonempty()
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 response = await fetch(url, {
17910
- headers: {
17911
- 'x-api-key': apiKey,
17912
- 'x-neynar-experimental': 'false',
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?`&category=${_category}`:''}${trend}`;
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 res = await fetch(url);
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