@1delta/margin-fetcher 0.0.67 → 0.0.68

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/dist/index.js CHANGED
@@ -17738,6 +17738,108 @@ function getDistinctPairsByShortAsset(pairs) {
17738
17738
  return result;
17739
17739
  }
17740
17740
 
17741
+ // src/prices/pendle/fetchPendlePrices.ts
17742
+ var PENDLE_API_BASE = "https://api-v2.pendle.finance/core";
17743
+ var MARKETS_ENDPOINT = `${PENDLE_API_BASE}/v1/markets/all`;
17744
+ var PRICES_ENDPOINT = (types) => `${PENDLE_API_BASE}/v1/prices/assets${types ? `?type=${types.join(",")}` : ""}`;
17745
+ async function fetchPendleMarkets() {
17746
+ try {
17747
+ const response = await fetch(MARKETS_ENDPOINT);
17748
+ if (!response.ok) {
17749
+ throw new Error(`Failed to fetch all markets data: ${response.status}`);
17750
+ }
17751
+ const data = await response.json();
17752
+ const marketsByChain = {};
17753
+ if (data.markets) {
17754
+ for (const market of data.markets) {
17755
+ const chainId = market.chainId.toString();
17756
+ if (!marketsByChain[chainId]) {
17757
+ marketsByChain[chainId] = [];
17758
+ }
17759
+ marketsByChain[chainId].push(market);
17760
+ }
17761
+ }
17762
+ return marketsByChain;
17763
+ } catch (error) {
17764
+ console.error("Error fetching all markets data:", error);
17765
+ return {};
17766
+ }
17767
+ }
17768
+ async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]) {
17769
+ try {
17770
+ const data = await fetchPendlePricesRaw(assetType);
17771
+ let prices = {};
17772
+ Object.entries(data).forEach(([key, val]) => {
17773
+ const [chainId, address] = key.split("-");
17774
+ const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
17775
+ prices[assetKey] = val;
17776
+ });
17777
+ return prices;
17778
+ } catch (error) {
17779
+ console.error(`Error fetching prices pendle prices:`, error);
17780
+ return {};
17781
+ }
17782
+ }
17783
+ async function fetchPendlePricesRaw(assetType = ["YT", "PT"]) {
17784
+ try {
17785
+ const response = await fetch(PRICES_ENDPOINT(assetType));
17786
+ const data = await response.json();
17787
+ return data.prices;
17788
+ } catch (error) {
17789
+ console.error(`Error fetching prices pendle prices:`, error);
17790
+ return {};
17791
+ }
17792
+ }
17793
+ async function fetchPendlePrices(lists = {}, assetType = ["YT", "PT"]) {
17794
+ try {
17795
+ const marketsResponse = await fetchPendleMarkets();
17796
+ if (!Object.keys(marketsResponse).length) {
17797
+ return {};
17798
+ }
17799
+ const allPrices = await fetchPendlePricesForAllChain(lists, assetType);
17800
+ return Object.fromEntries(
17801
+ Object.entries(allPrices).filter(([, price]) => !!price)
17802
+ );
17803
+ } catch (error) {
17804
+ console.error("Error in fetchPendlePrices:", error);
17805
+ return {};
17806
+ }
17807
+ }
17808
+ async function fetchPendleYields(lists = {}) {
17809
+ try {
17810
+ const marketsResponse = await fetchPendleMarkets();
17811
+ if (!Object.keys(marketsResponse).length) {
17812
+ return {};
17813
+ }
17814
+ const prices = await fetchPendlePricesRaw();
17815
+ let yields = {};
17816
+ const now = /* @__PURE__ */ new Date();
17817
+ Object.entries(marketsResponse).forEach(([chain, dataArr]) => {
17818
+ dataArr.forEach((market) => {
17819
+ const ptPrice = prices[market.pt];
17820
+ const ytPrice = prices[market.yt];
17821
+ if (ytPrice && ytPrice > 0) {
17822
+ const yearFraction = yearFractionToExpiry(market.expiry, now);
17823
+ const apr = ytPrice / ptPrice * 100 / yearFraction;
17824
+ const [chainId, address] = market.pt.split("-");
17825
+ const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? market.pt;
17826
+ yields[assetKey] = apr;
17827
+ }
17828
+ });
17829
+ });
17830
+ return yields;
17831
+ } catch (error) {
17832
+ console.error("Error in fetchPendlePrices:", error);
17833
+ return {};
17834
+ }
17835
+ }
17836
+ function yearFractionToExpiry(expiryISO, now = /* @__PURE__ */ new Date()) {
17837
+ const expiry = new Date(expiryISO);
17838
+ const diffMs = expiry.getTime() - now.getTime();
17839
+ const yearFraction = diffMs / (1e3 * 60 * 60 * 24 * 365.25);
17840
+ return yearFraction;
17841
+ }
17842
+
17741
17843
  // src/yields/yieldTypes.ts
17742
17844
  var addressToAssetYearn = {
17743
17845
  "0xe007ca01894c863d7898045ed5a3b4abf0b18f37": "vbETH yVault::yvvbETH",
@@ -17815,19 +17917,26 @@ var FeedData = {
17815
17917
  SSUPERUSD: "https://www.superreturn.ai/api/trpc/cmc.getUSDCPrice,rewardBackend.getYield,rewardBackend.getTvlChange?batch=1&input=%7B%220%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%221%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%2C%222%22%3A%7B%22json%22%3Anull%2C%22meta%22%3A%7B%22values%22%3A%5B%22undefined%22%5D%7D%7D%7D",
17816
17918
  HBHYPE: "https://api.hyperbeat.org/api/v1/staking?address=0xCeaD893b162D38e714D82d06a7fe0b0dc3c38E0b"
17817
17919
  };
17818
- var LenderAPIs = {
17819
- MERIDIAN: "https://omnidex.bmaa3ajd1gjri.eu-west-2.cs.amazonlightsail.com/lending_yields"
17820
- };
17821
17920
  function averageDataLastN(arr, n = 7) {
17822
17921
  const last = arr.slice(-n);
17823
17922
  if (last.length === 0) return 0;
17824
17923
  return last.reduce((sum, x) => sum + x.data, 0) / last.length;
17825
17924
  }
17826
- function formatMeridianKey(k) {
17827
- const _k = k.toUpperCase();
17828
- if (_k === "USDT") return "USDT.E";
17829
- if (_k === "USDCE") return "USDC.E";
17830
- return _k;
17925
+ var getListUrl = (chainId) => `https://raw.githubusercontent.com/1delta-DAO/asset-lists/main/${chainId}.json`;
17926
+ async function getDeltaTokenList(chain) {
17927
+ const data = await fetch(getListUrl(chain));
17928
+ const list = (await data.json()).list;
17929
+ return list;
17930
+ }
17931
+ async function getListsMulti(chainIds) {
17932
+ const ps = chainIds.map(async (chainId) => await getDeltaTokenList(chainId));
17933
+ const lists = await Promise.all(ps);
17934
+ let res = {};
17935
+ for (let i = 0; i < chainIds.length; i++) {
17936
+ const chainId = chainIds[i];
17937
+ res[chainId] = { list: lists[i] };
17938
+ }
17939
+ return res;
17831
17940
  }
17832
17941
  var safeFetch = async (label, fn) => {
17833
17942
  try {
@@ -18126,19 +18235,18 @@ var fetchGeneralYields = async () => {
18126
18235
  return 0;
18127
18236
  }
18128
18237
  });
18129
- const meridianPromise = safeFetch("MERIDIAN", async () => {
18130
- const res = await fetch(LenderAPIs.MERIDIAN).then((r) => r.json());
18131
- const taikoData = res["taiko" /* TAIKO */];
18132
- return Object.assign(
18133
- {},
18134
- ...Object.keys(taikoData).map((key) => ({
18135
- [formatMeridianKey(key)]: {
18136
- deposit: taikoData[key].apy_reward,
18137
- borrow: taikoData[key].apy_reward_borrow
18138
- }
18139
- }))
18140
- );
18141
- });
18238
+ const pendlePromise = getListsMulti([
18239
+ Chain.PLASMA_MAINNET,
18240
+ Chain.ETHEREUM_MAINNET,
18241
+ Chain.BERACHAIN,
18242
+ Chain.MANTLE,
18243
+ Chain.BASE,
18244
+ Chain.OP_MAINNET,
18245
+ Chain.ARBITRUM_ONE,
18246
+ Chain.SONIC_MAINNET,
18247
+ Chain.HYPEREVM,
18248
+ Chain.BNB_SMART_CHAIN_MAINNET
18249
+ ]).then((x) => fetchPendleYields(x));
18142
18250
  const [
18143
18251
  wstethData,
18144
18252
  ezethData,
@@ -18148,7 +18256,7 @@ var fetchGeneralYields = async () => {
18148
18256
  methData,
18149
18257
  maticXdata,
18150
18258
  susdeData,
18151
- meridianData,
18259
+ // meridianData,
18152
18260
  savaxData,
18153
18261
  cbethData,
18154
18262
  rsethData,
@@ -18174,7 +18282,8 @@ var fetchGeneralYields = async () => {
18174
18282
  thBillData,
18175
18283
  yearnKatanaData,
18176
18284
  ssuperusdData,
18177
- hbhypeData
18285
+ hbhypeData,
18286
+ pendleData
18178
18287
  ] = await Promise.all([
18179
18288
  wstethPromise,
18180
18289
  ezethPromise,
@@ -18184,7 +18293,7 @@ var fetchGeneralYields = async () => {
18184
18293
  methPromise,
18185
18294
  maticxPromise,
18186
18295
  susdePromise,
18187
- meridianPromise,
18296
+ // meridianPromise,
18188
18297
  savaxPromise,
18189
18298
  cbethPromise,
18190
18299
  rsethPromise,
@@ -18210,7 +18319,8 @@ var fetchGeneralYields = async () => {
18210
18319
  thbillPromise,
18211
18320
  yearnKatanaPromise,
18212
18321
  ssuperusdPromise,
18213
- hbhypePromise
18322
+ hbhypePromise,
18323
+ pendlePromise
18214
18324
  ]);
18215
18325
  const data = {
18216
18326
  intrinsicYields: {
@@ -18250,12 +18360,13 @@ var fetchGeneralYields = async () => {
18250
18360
  ...rtokensData,
18251
18361
  ...hypeData,
18252
18362
  ...angleData,
18253
- ...yearnKatanaData
18363
+ ...yearnKatanaData,
18364
+ ...pendleData
18254
18365
  },
18255
18366
  lenderRewards: {
18256
- "167000": {
18257
- MERIDIAN: meridianData
18258
- }
18367
+ // '167000': {
18368
+ // MERIDIAN: meridianData,
18369
+ // },
18259
18370
  }
18260
18371
  };
18261
18372
  return data;
@@ -19991,73 +20102,6 @@ var getChainLinkKeys = (chainId) => {
19991
20102
  }
19992
20103
  });
19993
20104
 
19994
- // src/prices/pendle/fetchPendlePrices.ts
19995
- var PENDLE_API_BASE = "https://api-v2.pendle.finance/core";
19996
- var MARKETS_ENDPOINT = `${PENDLE_API_BASE}/v1/markets/all`;
19997
- var PRICES_ENDPOINT = (types) => `${PENDLE_API_BASE}/v1/prices/assets${types ? `?type=${types.join(",")}` : ""}`;
19998
- var marketsCache = {};
19999
- var marketsCacheTimestamp = 0;
20000
- var MARKETS_CACHE_TTL = 5 * 60 * 1e3;
20001
- async function fetchPendleMarkets() {
20002
- if (Object.keys(marketsCache).length && marketsCacheTimestamp > Date.now() - MARKETS_CACHE_TTL) {
20003
- return marketsCache;
20004
- }
20005
- try {
20006
- const response = await fetch(MARKETS_ENDPOINT);
20007
- if (!response.ok) {
20008
- throw new Error(`Failed to fetch all markets data: ${response.status}`);
20009
- }
20010
- const data = await response.json();
20011
- const marketsByChain = {};
20012
- if (data.markets) {
20013
- for (const market of data.markets) {
20014
- const chainId = market.chainId.toString();
20015
- if (!marketsByChain[chainId]) {
20016
- marketsByChain[chainId] = [];
20017
- }
20018
- marketsByChain[chainId].push(market);
20019
- }
20020
- }
20021
- marketsCache = marketsByChain;
20022
- marketsCacheTimestamp = Date.now();
20023
- return marketsByChain;
20024
- } catch (error) {
20025
- console.error("Error fetching all markets data:", error);
20026
- return {};
20027
- }
20028
- }
20029
- async function fetchPendlePricesForAllChain(lists = {}, assetType = ["YT", "PT"]) {
20030
- try {
20031
- const response = await fetch(PRICES_ENDPOINT(assetType));
20032
- const data = await response.json();
20033
- let prices = {};
20034
- Object.entries(data.prices).forEach(([key, val]) => {
20035
- const [chainId, address] = key.split("-");
20036
- const assetKey = lists[chainId]?.list?.[address.toLowerCase()]?.assetGroup ?? key;
20037
- prices[assetKey] = val;
20038
- });
20039
- return prices;
20040
- } catch (error) {
20041
- console.error(`Error fetching prices pendle prices:`, error);
20042
- return {};
20043
- }
20044
- }
20045
- async function fetchPendlePrices(lists = {}) {
20046
- try {
20047
- const marketsResponse = await fetchPendleMarkets();
20048
- if (!Object.keys(marketsResponse).length) {
20049
- return {};
20050
- }
20051
- const allPrices = await fetchPendlePricesForAllChain(lists);
20052
- return Object.fromEntries(
20053
- Object.entries(allPrices).filter(([, price]) => !!price)
20054
- );
20055
- } catch (error) {
20056
- console.error("Error in fetchPendlePrices:", error);
20057
- return {};
20058
- }
20059
- }
20060
-
20061
20105
  // src/abis/oracle/ProxyOracle.ts
20062
20106
  var ProxyOracleAbi = [
20063
20107
  {