@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 +140 -96
- package/dist/index.js.map +1 -1
- package/dist/lending-pairs/index.d.ts +1 -1
- package/dist/lending-pairs/index.d.ts.map +1 -1
- package/dist/prices/pendle/fetchPendlePrices.d.ts +35 -0
- package/dist/prices/pendle/fetchPendlePrices.d.ts.map +1 -1
- package/dist/yields/index.d.ts.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
17827
|
-
|
|
17828
|
-
|
|
17829
|
-
|
|
17830
|
-
return
|
|
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
|
|
18130
|
-
|
|
18131
|
-
|
|
18132
|
-
|
|
18133
|
-
|
|
18134
|
-
|
|
18135
|
-
|
|
18136
|
-
|
|
18137
|
-
|
|
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
|
-
|
|
18257
|
-
|
|
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
|
{
|