@1delta/margin-fetcher 0.0.25 → 0.0.26
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/yields/index.d.ts.map +1 -1
- package/dist/yields/index.js +210 -5
- package/package.json +1 -1
- package/src/yields/index.ts +248 -5
- package/test/mainPrices.test.ts +2 -2
- package/test/yields.test.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/yields/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/yields/index.ts"],"names":[],"mappings":"AAmFA,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,qBAAqB,EAAE,GAAG,CAAA;IAC1B,oBAAoB,EAAE,GAAG,CAAA;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE;QAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAA;IACxD,aAAa,EAAE;QACb,CAAC,OAAO,EAAE,MAAM,GAAG;YACjB,CAAC,MAAM,EAAE,MAAM,GAAG;gBAAE,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CAAA;aAAE,CAAA;SACzD,CAAA;KACF,CAAA;CACF;AAcD,eAAO,MAAM,kBAAkB,uCA2X9B,CAAA"}
|
package/dist/yields/index.js
CHANGED
|
@@ -3,6 +3,30 @@ const hyUSD = 'High Yield USD Base::HYUSD';
|
|
|
3
3
|
const bsdETH = 'Based ETH::BSDETH';
|
|
4
4
|
const wstHype = 'Staked HYPE Shares::WSTHYPE';
|
|
5
5
|
const kHYPE = 'Kinetiq Staked HYPE::kHYPE';
|
|
6
|
+
const tETH = 'Treehouse ETH::TETH';
|
|
7
|
+
const osETH = 'StakeWise Staked ETH::OSETH';
|
|
8
|
+
// const ethPlus = 'ETHPlus::ETH+'
|
|
9
|
+
const ethX = 'Stader ETHx::ETHx';
|
|
10
|
+
const pufEth = 'PUFETH';
|
|
11
|
+
const stUSD = 'Angle Staked USDA::STUSD';
|
|
12
|
+
const stEur = 'Angle Staked EURA::STEUR';
|
|
13
|
+
const sUsds = 'sUSDS::SUSDS';
|
|
14
|
+
const srUsd = 'Reservoir srUSD::SRUSD';
|
|
15
|
+
const yusd = 'YieldFi yUSD::yUSD';
|
|
16
|
+
const rlp = 'Resolv RLP::RLP';
|
|
17
|
+
const wstusr = 'Resolv wstUSR::WSTUSR';
|
|
18
|
+
const ethPlus = 'ETHPlus::ETH+';
|
|
19
|
+
const woEth = 'Wrapped OETH::WOETH';
|
|
20
|
+
const csusdl = 'Coinshift USDL Morpho Vault::CSUSDL';
|
|
21
|
+
const sfrxeth = 'Staked Frax Ether::sfrxETH';
|
|
22
|
+
const ceth = 'cETH::CETH';
|
|
23
|
+
const sfrax = 'Staked FRAX::SFRAX';
|
|
24
|
+
const sdeusd = 'Elixir Staked deUSD::SDEUSD';
|
|
25
|
+
const rsweth = 'Restaked Swell ETH::RSWETH';
|
|
26
|
+
const ynethx = 'ynETH MAX::YNETHX';
|
|
27
|
+
const usdZeroPlus = 'Staked USD0::USD0++';
|
|
28
|
+
const ethZero = 'ETH0::ETH0';
|
|
29
|
+
const usdThree = "Web 3 Dollar::USD3";
|
|
6
30
|
const FeedData = {
|
|
7
31
|
WSTETH: 'https://eth-api.lido.fi/v1/protocol/steth/apr/sma',
|
|
8
32
|
STMATIC: 'https://polygon.lido.fi/api/stats',
|
|
@@ -18,6 +42,21 @@ const FeedData = {
|
|
|
18
42
|
TRUMATIC: 'https://api.trufin.io/staker/apy?staker=MATIC',
|
|
19
43
|
RTOKENS: 'https://yields.reserve.org/pools',
|
|
20
44
|
HYPE: 'https://api.hyperlend.finance/data/nativeApy',
|
|
45
|
+
ETHX: 'https://universe.staderlabs.com/eth/apy',
|
|
46
|
+
OSETH: 'https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy',
|
|
47
|
+
PUFETH: 'https://api-v2.puffer.fi/backend-for-frontend/tvl/all',
|
|
48
|
+
ANGLE: 'https://exporter.angle.money/v2/savingsApr',
|
|
49
|
+
SUSDS: 'https://info-sky.blockanalitica.com/api/v1/overall/?format=json',
|
|
50
|
+
SRUSD: 'https://app.reservoir.xyz/api/website',
|
|
51
|
+
YUSD: 'https://ctrl.yield.fi/t/yusd/apy',
|
|
52
|
+
RLP: 'https://api.resolv.xyz/apr/rlp/7d',
|
|
53
|
+
WSTUSR: 'https://api.resolv.xyz/apr/staking/7d',
|
|
54
|
+
MORPHO_VAULTS: 'https://blue-api.morpho.org/graphql',
|
|
55
|
+
SDEUSD: 'https://api-deusd-prod-public.elixir.xyz/public/deusd_apy',
|
|
56
|
+
RSWETH: 'https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr',
|
|
57
|
+
YNETHX: 'https://gateway.yieldnest.finance/api/v1/graphql',
|
|
58
|
+
USDZEROPLUS: 'https://app.usual.money/api/rewards/rates/USD0++',
|
|
59
|
+
ETHZERO: 'https://app.usual.money/api/rewards/rates/ETH0',
|
|
21
60
|
};
|
|
22
61
|
const LenderAPIs = {
|
|
23
62
|
MERIDIAN: 'https://omnidex.bmaa3ajd1gjri.eu-west-2.cs.amazonlightsail.com/lending_yields',
|
|
@@ -57,8 +96,7 @@ export const fetchGeneralYields = async () => {
|
|
|
57
96
|
return Number(res.rethAPR);
|
|
58
97
|
});
|
|
59
98
|
const weethPromise = safeFetch('WEETH', async () => {
|
|
60
|
-
const wstethRes = await
|
|
61
|
-
const wstethApr = Number(wstethRes.data.aprs.at(-1).apr) * 0.9;
|
|
99
|
+
const wstethRes = await wstethPromise;
|
|
62
100
|
let aYield = 0;
|
|
63
101
|
try {
|
|
64
102
|
const weethRes = await fetch(FeedData.WEETH).then((r) => r.json());
|
|
@@ -67,7 +105,7 @@ export const fetchGeneralYields = async () => {
|
|
|
67
105
|
catch (e) {
|
|
68
106
|
aYield = 0.5;
|
|
69
107
|
}
|
|
70
|
-
return aYield +
|
|
108
|
+
return aYield + (wstethRes ?? 0);
|
|
71
109
|
});
|
|
72
110
|
const stmaticPromise = safeFetch('STMATIC', async () => {
|
|
73
111
|
const res = await fetch(FeedData.STMATIC).then((r) => r.json());
|
|
@@ -102,12 +140,140 @@ export const fetchGeneralYields = async () => {
|
|
|
102
140
|
const res = await fetch(FeedData.TRUMATIC).then((r) => r.json());
|
|
103
141
|
return apyToAprPercent(res.apy);
|
|
104
142
|
});
|
|
143
|
+
const ethxPromise = safeFetch('ETHX', async () => {
|
|
144
|
+
const res = await fetch(FeedData.ETHX).then((r) => r.json());
|
|
145
|
+
return apyToAprPercent(res.value);
|
|
146
|
+
});
|
|
147
|
+
const osEthPromise = safeFetch('OSETH', async () => {
|
|
148
|
+
const res = await fetch(FeedData.OSETH, {
|
|
149
|
+
method: 'POST',
|
|
150
|
+
headers: { Accept: 'application/json' },
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
query: 'query osTokenApy { osTokens { apy feePercent }}',
|
|
153
|
+
operationName: 'osTokenApy',
|
|
154
|
+
}),
|
|
155
|
+
}).then((r) => r.json());
|
|
156
|
+
return apyToAprPercent(res.data?.osTokens?.[0]?.apy);
|
|
157
|
+
});
|
|
158
|
+
const ynethxPromise = safeFetch('YNETHX', async () => {
|
|
159
|
+
const res = await fetch(FeedData.YNETHX, {
|
|
160
|
+
method: 'POST',
|
|
161
|
+
headers: {
|
|
162
|
+
Accept: 'application/json',
|
|
163
|
+
'Content-Type': 'application/json',
|
|
164
|
+
},
|
|
165
|
+
body: JSON.stringify({
|
|
166
|
+
operationName: 'GetTokenMetrics',
|
|
167
|
+
variables: {
|
|
168
|
+
networkType: 'mainnet',
|
|
169
|
+
},
|
|
170
|
+
query: 'query GetTokenMetrics($networkType: NetworkType!) {\n getLRTsData(networkType: $networkType) {\n summary {\n total_tvl {\n value\n value_raw\n value_usd\n __typename\n }\n __typename\n }\n tokens {\n token\n total_tvl {\n value\n value_raw\n value_usd\n __typename\n }\n price\n blockchains {\n chainId\n tvl {\n value\n value_raw\n value_usd\n __typename\n }\n apr {\n apr7d\n apr31d\n restaking7dApr\n __typename\n }\n strategyAssets {\n tokenAddress\n symbol\n apr7d\n tvl\n isBuffer\n protocols\n manager\n maturityDate\n __typename\n }\n contract_details {\n tokenAddress\n ynViewer\n referralDepositAdapter\n rateProvider\n __typename\n }\n historicalData {\n apy\n exchangeRate\n usdPrice\n baseAsset\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}',
|
|
171
|
+
}),
|
|
172
|
+
}).then((r) => r.json());
|
|
173
|
+
const dat = res?.data?.getLRTsData?.tokens
|
|
174
|
+
.find((x) => x.token === 'ynETHx')
|
|
175
|
+
?.blockchains?.find((b) => b.chainId === 1)?.apr?.apr31d;
|
|
176
|
+
return Number(dat ?? 0);
|
|
177
|
+
});
|
|
178
|
+
const pufEthPromise = safeFetch('PUFETH', async () => {
|
|
179
|
+
const res = await fetch(FeedData.PUFETH, {
|
|
180
|
+
method: 'GET',
|
|
181
|
+
headers: { Accept: 'application/json' },
|
|
182
|
+
}).then((r) => r.json());
|
|
183
|
+
return apyToAprPercent(res.apy);
|
|
184
|
+
});
|
|
185
|
+
const usdZeroPlusPromise = safeFetch('USDZEROPLUS', async () => {
|
|
186
|
+
const res = await fetch(FeedData.USDZEROPLUS, {
|
|
187
|
+
method: 'GET',
|
|
188
|
+
headers: { Accept: 'application/json' },
|
|
189
|
+
}).then((r) => r.json());
|
|
190
|
+
return Number(res?.rewards[0]?.apr ?? 0) * 100;
|
|
191
|
+
});
|
|
192
|
+
const ethZeroPromise = safeFetch('ETHZERO', async () => {
|
|
193
|
+
const res = await fetch(FeedData.ETHZERO, {
|
|
194
|
+
method: 'GET',
|
|
195
|
+
headers: { Accept: 'application/json' },
|
|
196
|
+
}).then((r) => r.json());
|
|
197
|
+
return Number(res?.rewards[0]?.apr ?? 0) * 100;
|
|
198
|
+
});
|
|
199
|
+
const susdsPromise = safeFetch('SUSDS', async () => {
|
|
200
|
+
const res = await fetch(FeedData.SUSDS, {
|
|
201
|
+
method: 'GET',
|
|
202
|
+
headers: { Accept: 'application/json' },
|
|
203
|
+
}).then((r) => r.json());
|
|
204
|
+
return apyToAprPercent(Number(res?.[0]?.sky_savings_rate_apy ?? 0) * 100);
|
|
205
|
+
});
|
|
206
|
+
const srusdPromise = safeFetch('SRUSD', async () => {
|
|
207
|
+
const res = await fetch(FeedData.SRUSD, {
|
|
208
|
+
method: 'GET',
|
|
209
|
+
headers: { Accept: 'application/json' },
|
|
210
|
+
}).then((r) => r.json());
|
|
211
|
+
return apyToAprPercent(Number(res?.srusdApy ?? 0));
|
|
212
|
+
});
|
|
213
|
+
const yusdPromise = safeFetch('YUSD', async () => {
|
|
214
|
+
const res = await fetch(FeedData.YUSD, {
|
|
215
|
+
method: 'GET',
|
|
216
|
+
headers: { Accept: 'application/json' },
|
|
217
|
+
}).then((r) => r.json());
|
|
218
|
+
return apyToAprPercent(Number(res?.apy ?? 0));
|
|
219
|
+
});
|
|
220
|
+
const rlpPromise = safeFetch('RLP', async () => {
|
|
221
|
+
const res = await fetch(FeedData.RLP, {
|
|
222
|
+
method: 'GET',
|
|
223
|
+
headers: { Accept: 'application/json' },
|
|
224
|
+
}).then((r) => r.json());
|
|
225
|
+
return Number(res?.value ?? 0) * 100;
|
|
226
|
+
});
|
|
227
|
+
const wstusrPromise = safeFetch('WSTUSR', async () => {
|
|
228
|
+
const res = await fetch(FeedData.WSTUSR, {
|
|
229
|
+
method: 'GET',
|
|
230
|
+
headers: { Accept: 'application/json' },
|
|
231
|
+
}).then((r) => r.json());
|
|
232
|
+
return Number(res?.value ?? 0) * 100;
|
|
233
|
+
});
|
|
234
|
+
const sdeusdPromise = safeFetch('SDEUSD', async () => {
|
|
235
|
+
const res = await fetch(FeedData.SDEUSD, {
|
|
236
|
+
method: 'GET',
|
|
237
|
+
headers: { Accept: 'application/json' },
|
|
238
|
+
}).then((r) => r.json());
|
|
239
|
+
return apyToAprPercent((res?.deusd_apy ?? 0) / 100) * 100;
|
|
240
|
+
});
|
|
241
|
+
const rswethPromise = safeFetch('RSWETH', async () => {
|
|
242
|
+
const res = await fetch(FeedData.RSWETH, {
|
|
243
|
+
method: 'GET',
|
|
244
|
+
headers: { Accept: 'application/json' },
|
|
245
|
+
}).then((r) => r.text());
|
|
246
|
+
return Number(res) ?? 0;
|
|
247
|
+
});
|
|
248
|
+
const csusdlPromise = safeFetch('CSUSDL', async () => {
|
|
249
|
+
const res = await fetch(FeedData.MORPHO_VAULTS, {
|
|
250
|
+
method: 'POST',
|
|
251
|
+
headers: { Accept: 'application/json' },
|
|
252
|
+
body: JSON.stringify({
|
|
253
|
+
query: 'query GetAllCurrentAPYFromVault($address: String!) {\n vaultByAddress(address: $address) {\n state {\n apy\n netApy\n }\n asset {\n yield {\n apr\n }\n }\n }\n}',
|
|
254
|
+
variables: {
|
|
255
|
+
address: '0xbEeFc011e94f43b8B7b455eBaB290C7Ab4E216f1',
|
|
256
|
+
},
|
|
257
|
+
}),
|
|
258
|
+
}).then((r) => r.json());
|
|
259
|
+
const vba = res?.data?.vaultByAddress;
|
|
260
|
+
return (apyToAprPercent(vba.state.apy ?? 0) * 100 +
|
|
261
|
+
(vba?.asset?.yield.apr ?? 0) * 100);
|
|
262
|
+
});
|
|
105
263
|
const rtokensPromise = safeFetch('RTOKENS', async () => {
|
|
106
264
|
const res = await fetch(FeedData.RTOKENS).then((r) => r.json());
|
|
107
265
|
const data = res.rtokens['8453'];
|
|
266
|
+
const dataMainnet = res.rtokens['1'];
|
|
267
|
+
const dataMainnetColalterals = res.collaterals['1'];
|
|
108
268
|
return {
|
|
109
269
|
[bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
|
|
110
270
|
[hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
|
|
271
|
+
[sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
|
|
272
|
+
[sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
|
|
273
|
+
[ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
|
|
274
|
+
[ethPlus]: apyToAprPercent(dataMainnet['ETH+'] / 100) * 100,
|
|
275
|
+
[usdThree]: apyToAprPercent(dataMainnet['USD3'] / 100) * 100,
|
|
276
|
+
[woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100,
|
|
111
277
|
};
|
|
112
278
|
});
|
|
113
279
|
const hypePromise = safeFetch('HYPE', async () => {
|
|
@@ -117,6 +283,15 @@ export const fetchGeneralYields = async () => {
|
|
|
117
283
|
[kHYPE]: res.kHYPE.latestApr,
|
|
118
284
|
};
|
|
119
285
|
});
|
|
286
|
+
const anglePromise = safeFetch('ANGLE', async () => {
|
|
287
|
+
const now = Math.floor(Date.now() / 1000);
|
|
288
|
+
const nowMinusWeek = now - 7 * 24 * 3600;
|
|
289
|
+
const res = await fetch(FeedData.ANGLE + `?from=${nowMinusWeek}&to=${now}`).then((r) => r.json());
|
|
290
|
+
return {
|
|
291
|
+
[stEur]: apyToAprPercent(res.EURA) * 100,
|
|
292
|
+
[stUSD]: apyToAprPercent(res.USDA) * 100,
|
|
293
|
+
};
|
|
294
|
+
});
|
|
120
295
|
const cbethPromise = safeFetch('CBETH', async () => {
|
|
121
296
|
try {
|
|
122
297
|
const res = await fetch(FeedData.CBETH, {
|
|
@@ -142,7 +317,7 @@ export const fetchGeneralYields = async () => {
|
|
|
142
317
|
},
|
|
143
318
|
})));
|
|
144
319
|
});
|
|
145
|
-
const [wstethData, ezethData, rethData, weethData, stmaticData, methData, maticXdata, susdeData, meridianData, savaxData, cbethData, rsethData, trumaticData, rtokensData, hypeData,] = await Promise.all([
|
|
320
|
+
const [wstethData, ezethData, rethData, weethData, stmaticData, methData, maticXdata, susdeData, meridianData, savaxData, cbethData, rsethData, trumaticData, rtokensData, hypeData, osEthData, ethXData, pufEthData, angleData, susdsData, srUsdData, yusdData, rlpData, wstusrData, csusdlData, sdeusdData, rswethData, ynethxData, ethZeroData, usdZeroPlusData,] = await Promise.all([
|
|
146
321
|
wstethPromise,
|
|
147
322
|
ezethPromise,
|
|
148
323
|
rethPromise,
|
|
@@ -158,6 +333,21 @@ export const fetchGeneralYields = async () => {
|
|
|
158
333
|
trumaticPromise,
|
|
159
334
|
rtokensPromise,
|
|
160
335
|
hypePromise,
|
|
336
|
+
osEthPromise,
|
|
337
|
+
ethxPromise,
|
|
338
|
+
pufEthPromise,
|
|
339
|
+
anglePromise,
|
|
340
|
+
susdsPromise,
|
|
341
|
+
srusdPromise,
|
|
342
|
+
yusdPromise,
|
|
343
|
+
rlpPromise,
|
|
344
|
+
wstusrPromise,
|
|
345
|
+
csusdlPromise,
|
|
346
|
+
sdeusdPromise,
|
|
347
|
+
rswethPromise,
|
|
348
|
+
ynethxPromise,
|
|
349
|
+
ethZeroPromise,
|
|
350
|
+
usdZeroPlusPromise,
|
|
161
351
|
]);
|
|
162
352
|
const data = {
|
|
163
353
|
intrinsicYields: {
|
|
@@ -170,14 +360,29 @@ export const fetchGeneralYields = async () => {
|
|
|
170
360
|
WEETH: weethData,
|
|
171
361
|
STMATIC: stmaticData,
|
|
172
362
|
USDY: 4.35,
|
|
173
|
-
USDE: 0,
|
|
174
363
|
SUSDE: susdeData,
|
|
175
364
|
SAVAX: savaxData,
|
|
176
365
|
CBETH: cbethData,
|
|
177
366
|
RSETH: rsethData,
|
|
178
367
|
TRUMATIC: trumaticData,
|
|
368
|
+
[sUsds]: susdsData,
|
|
369
|
+
[ethZero]: ethZeroData,
|
|
370
|
+
[usdZeroPlus]: usdZeroPlusData,
|
|
371
|
+
[csusdl]: csusdlData,
|
|
372
|
+
[srUsd]: srUsdData,
|
|
373
|
+
[sdeusd]: sdeusdData,
|
|
374
|
+
[wstusr]: wstusrData,
|
|
375
|
+
[yusd]: yusdData,
|
|
376
|
+
[rlp]: rlpData,
|
|
377
|
+
[rsweth]: rswethData,
|
|
378
|
+
[osETH]: osEthData,
|
|
379
|
+
[ethX]: ethXData,
|
|
380
|
+
[ynethx]: ynethxData,
|
|
381
|
+
[tETH]: wstethData,
|
|
382
|
+
[pufEth]: pufEthData,
|
|
179
383
|
...rtokensData,
|
|
180
384
|
...hypeData,
|
|
385
|
+
...angleData,
|
|
181
386
|
},
|
|
182
387
|
lenderRewards: {
|
|
183
388
|
'167000': {
|
package/package.json
CHANGED
package/src/yields/index.ts
CHANGED
|
@@ -5,7 +5,30 @@ const bsdETH = 'Based ETH::BSDETH'
|
|
|
5
5
|
|
|
6
6
|
const wstHype = 'Staked HYPE Shares::WSTHYPE'
|
|
7
7
|
const kHYPE = 'Kinetiq Staked HYPE::kHYPE'
|
|
8
|
-
|
|
8
|
+
const tETH = 'Treehouse ETH::TETH'
|
|
9
|
+
const osETH = 'StakeWise Staked ETH::OSETH'
|
|
10
|
+
// const ethPlus = 'ETHPlus::ETH+'
|
|
11
|
+
const ethX = 'Stader ETHx::ETHx'
|
|
12
|
+
const pufEth = 'PUFETH'
|
|
13
|
+
const stUSD = 'Angle Staked USDA::STUSD'
|
|
14
|
+
const stEur = 'Angle Staked EURA::STEUR'
|
|
15
|
+
const sUsds = 'sUSDS::SUSDS'
|
|
16
|
+
const srUsd = 'Reservoir srUSD::SRUSD'
|
|
17
|
+
const yusd = 'YieldFi yUSD::yUSD'
|
|
18
|
+
const rlp = 'Resolv RLP::RLP'
|
|
19
|
+
const wstusr = 'Resolv wstUSR::WSTUSR'
|
|
20
|
+
const ethPlus = 'ETHPlus::ETH+'
|
|
21
|
+
const woEth = 'Wrapped OETH::WOETH'
|
|
22
|
+
const csusdl = 'Coinshift USDL Morpho Vault::CSUSDL'
|
|
23
|
+
const sfrxeth = 'Staked Frax Ether::sfrxETH'
|
|
24
|
+
const ceth = 'cETH::CETH'
|
|
25
|
+
const sfrax = 'Staked FRAX::SFRAX'
|
|
26
|
+
const sdeusd = 'Elixir Staked deUSD::SDEUSD'
|
|
27
|
+
const rsweth = 'Restaked Swell ETH::RSWETH'
|
|
28
|
+
const ynethx = 'ynETH MAX::YNETHX'
|
|
29
|
+
const usdZeroPlus = 'Staked USD0::USD0++'
|
|
30
|
+
const ethZero = 'ETH0::ETH0'
|
|
31
|
+
const usdThree = "Web 3 Dollar::USD3"
|
|
9
32
|
const FeedData = {
|
|
10
33
|
WSTETH: 'https://eth-api.lido.fi/v1/protocol/steth/apr/sma',
|
|
11
34
|
STMATIC: 'https://polygon.lido.fi/api/stats',
|
|
@@ -22,6 +45,22 @@ const FeedData = {
|
|
|
22
45
|
TRUMATIC: 'https://api.trufin.io/staker/apy?staker=MATIC',
|
|
23
46
|
RTOKENS: 'https://yields.reserve.org/pools',
|
|
24
47
|
HYPE: 'https://api.hyperlend.finance/data/nativeApy',
|
|
48
|
+
ETHX: 'https://universe.staderlabs.com/eth/apy',
|
|
49
|
+
OSETH:
|
|
50
|
+
'https://graphs.stakewise.io/mainnet-a/subgraphs/name/stakewise/prod?opName=osTokenApy',
|
|
51
|
+
PUFETH: 'https://api-v2.puffer.fi/backend-for-frontend/tvl/all',
|
|
52
|
+
ANGLE: 'https://exporter.angle.money/v2/savingsApr',
|
|
53
|
+
SUSDS: 'https://info-sky.blockanalitica.com/api/v1/overall/?format=json',
|
|
54
|
+
SRUSD: 'https://app.reservoir.xyz/api/website',
|
|
55
|
+
YUSD: 'https://ctrl.yield.fi/t/yusd/apy',
|
|
56
|
+
RLP: 'https://api.resolv.xyz/apr/rlp/7d',
|
|
57
|
+
WSTUSR: 'https://api.resolv.xyz/apr/staking/7d',
|
|
58
|
+
MORPHO_VAULTS: 'https://blue-api.morpho.org/graphql',
|
|
59
|
+
SDEUSD: 'https://api-deusd-prod-public.elixir.xyz/public/deusd_apy',
|
|
60
|
+
RSWETH: 'https://v3-lst.svc.swellnetwork.io/api/tokens/sweth/apr',
|
|
61
|
+
YNETHX: 'https://gateway.yieldnest.finance/api/v1/graphql',
|
|
62
|
+
USDZEROPLUS: 'https://app.usual.money/api/rewards/rates/USD0++',
|
|
63
|
+
ETHZERO: 'https://app.usual.money/api/rewards/rates/ETH0',
|
|
25
64
|
}
|
|
26
65
|
|
|
27
66
|
const LenderAPIs = {
|
|
@@ -87,8 +126,7 @@ export const fetchGeneralYields = async () => {
|
|
|
87
126
|
})
|
|
88
127
|
|
|
89
128
|
const weethPromise = safeFetch('WEETH', async () => {
|
|
90
|
-
const wstethRes = await
|
|
91
|
-
const wstethApr = Number(wstethRes.data.aprs.at(-1).apr) * 0.9
|
|
129
|
+
const wstethRes = await wstethPromise
|
|
92
130
|
let aYield = 0
|
|
93
131
|
try {
|
|
94
132
|
const weethRes = await fetch(FeedData.WEETH).then((r) => r.json())
|
|
@@ -96,7 +134,7 @@ export const fetchGeneralYields = async () => {
|
|
|
96
134
|
} catch (e) {
|
|
97
135
|
aYield = 0.5
|
|
98
136
|
}
|
|
99
|
-
return aYield +
|
|
137
|
+
return aYield + (wstethRes ?? 0)
|
|
100
138
|
})
|
|
101
139
|
|
|
102
140
|
const stmaticPromise = safeFetch('STMATIC', async () => {
|
|
@@ -138,12 +176,160 @@ export const fetchGeneralYields = async () => {
|
|
|
138
176
|
return apyToAprPercent(res.apy)
|
|
139
177
|
})
|
|
140
178
|
|
|
179
|
+
const ethxPromise = safeFetch('ETHX', async () => {
|
|
180
|
+
const res = await fetch(FeedData.ETHX).then((r) => r.json())
|
|
181
|
+
return apyToAprPercent(res.value)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
const osEthPromise = safeFetch('OSETH', async () => {
|
|
185
|
+
const res = await fetch(FeedData.OSETH, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers: { Accept: 'application/json' },
|
|
188
|
+
body: JSON.stringify({
|
|
189
|
+
query: 'query osTokenApy { osTokens { apy feePercent }}',
|
|
190
|
+
operationName: 'osTokenApy',
|
|
191
|
+
}),
|
|
192
|
+
}).then((r) => r.json())
|
|
193
|
+
return apyToAprPercent(res.data?.osTokens?.[0]?.apy)
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
const ynethxPromise = safeFetch('YNETHX', async () => {
|
|
197
|
+
const res = await fetch(FeedData.YNETHX, {
|
|
198
|
+
method: 'POST',
|
|
199
|
+
headers: {
|
|
200
|
+
Accept: 'application/json',
|
|
201
|
+
'Content-Type': 'application/json',
|
|
202
|
+
},
|
|
203
|
+
body: JSON.stringify({
|
|
204
|
+
operationName: 'GetTokenMetrics',
|
|
205
|
+
variables: {
|
|
206
|
+
networkType: 'mainnet',
|
|
207
|
+
},
|
|
208
|
+
query:
|
|
209
|
+
'query GetTokenMetrics($networkType: NetworkType!) {\n getLRTsData(networkType: $networkType) {\n summary {\n total_tvl {\n value\n value_raw\n value_usd\n __typename\n }\n __typename\n }\n tokens {\n token\n total_tvl {\n value\n value_raw\n value_usd\n __typename\n }\n price\n blockchains {\n chainId\n tvl {\n value\n value_raw\n value_usd\n __typename\n }\n apr {\n apr7d\n apr31d\n restaking7dApr\n __typename\n }\n strategyAssets {\n tokenAddress\n symbol\n apr7d\n tvl\n isBuffer\n protocols\n manager\n maturityDate\n __typename\n }\n contract_details {\n tokenAddress\n ynViewer\n referralDepositAdapter\n rateProvider\n __typename\n }\n historicalData {\n apy\n exchangeRate\n usdPrice\n baseAsset\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}',
|
|
210
|
+
}),
|
|
211
|
+
}).then((r) => r.json())
|
|
212
|
+
|
|
213
|
+
const dat = res?.data?.getLRTsData?.tokens
|
|
214
|
+
.find((x: any) => x.token === 'ynETHx')
|
|
215
|
+
?.blockchains?.find((b: any) => b.chainId === 1)?.apr?.apr31d
|
|
216
|
+
|
|
217
|
+
return Number(dat ?? 0)
|
|
218
|
+
})
|
|
219
|
+
|
|
220
|
+
const pufEthPromise = safeFetch('PUFETH', async () => {
|
|
221
|
+
const res = await fetch(FeedData.PUFETH, {
|
|
222
|
+
method: 'GET',
|
|
223
|
+
headers: { Accept: 'application/json' },
|
|
224
|
+
}).then((r) => r.json())
|
|
225
|
+
return apyToAprPercent(res.apy)
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
const usdZeroPlusPromise = safeFetch('USDZEROPLUS', async () => {
|
|
229
|
+
const res = await fetch(FeedData.USDZEROPLUS, {
|
|
230
|
+
method: 'GET',
|
|
231
|
+
headers: { Accept: 'application/json' },
|
|
232
|
+
}).then((r) => r.json())
|
|
233
|
+
return Number(res?.rewards[0]?.apr ?? 0) * 100
|
|
234
|
+
})
|
|
235
|
+
|
|
236
|
+
const ethZeroPromise = safeFetch('ETHZERO', async () => {
|
|
237
|
+
const res = await fetch(FeedData.ETHZERO, {
|
|
238
|
+
method: 'GET',
|
|
239
|
+
headers: { Accept: 'application/json' },
|
|
240
|
+
}).then((r) => r.json())
|
|
241
|
+
return Number(res?.rewards[0]?.apr ?? 0) * 100
|
|
242
|
+
})
|
|
243
|
+
|
|
244
|
+
const susdsPromise = safeFetch('SUSDS', async () => {
|
|
245
|
+
const res = await fetch(FeedData.SUSDS, {
|
|
246
|
+
method: 'GET',
|
|
247
|
+
headers: { Accept: 'application/json' },
|
|
248
|
+
}).then((r) => r.json())
|
|
249
|
+
return apyToAprPercent(Number(res?.[0]?.sky_savings_rate_apy ?? 0) * 100)
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
const srusdPromise = safeFetch('SRUSD', async () => {
|
|
253
|
+
const res = await fetch(FeedData.SRUSD, {
|
|
254
|
+
method: 'GET',
|
|
255
|
+
headers: { Accept: 'application/json' },
|
|
256
|
+
}).then((r) => r.json())
|
|
257
|
+
return apyToAprPercent(Number(res?.srusdApy ?? 0))
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
const yusdPromise = safeFetch('YUSD', async () => {
|
|
261
|
+
const res = await fetch(FeedData.YUSD, {
|
|
262
|
+
method: 'GET',
|
|
263
|
+
headers: { Accept: 'application/json' },
|
|
264
|
+
}).then((r) => r.json())
|
|
265
|
+
return apyToAprPercent(Number(res?.apy ?? 0))
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
const rlpPromise = safeFetch('RLP', async () => {
|
|
269
|
+
const res = await fetch(FeedData.RLP, {
|
|
270
|
+
method: 'GET',
|
|
271
|
+
headers: { Accept: 'application/json' },
|
|
272
|
+
}).then((r) => r.json())
|
|
273
|
+
return Number(res?.value ?? 0) * 100
|
|
274
|
+
})
|
|
275
|
+
|
|
276
|
+
const wstusrPromise = safeFetch('WSTUSR', async () => {
|
|
277
|
+
const res = await fetch(FeedData.WSTUSR, {
|
|
278
|
+
method: 'GET',
|
|
279
|
+
headers: { Accept: 'application/json' },
|
|
280
|
+
}).then((r) => r.json())
|
|
281
|
+
return Number(res?.value ?? 0) * 100
|
|
282
|
+
})
|
|
283
|
+
|
|
284
|
+
const sdeusdPromise = safeFetch('SDEUSD', async () => {
|
|
285
|
+
const res = await fetch(FeedData.SDEUSD, {
|
|
286
|
+
method: 'GET',
|
|
287
|
+
headers: { Accept: 'application/json' },
|
|
288
|
+
}).then((r) => r.json())
|
|
289
|
+
return apyToAprPercent((res?.deusd_apy ?? 0) / 100) * 100
|
|
290
|
+
})
|
|
291
|
+
|
|
292
|
+
const rswethPromise = safeFetch('RSWETH', async () => {
|
|
293
|
+
const res = await fetch(FeedData.RSWETH, {
|
|
294
|
+
method: 'GET',
|
|
295
|
+
headers: { Accept: 'application/json' },
|
|
296
|
+
}).then((r) => r.text())
|
|
297
|
+
return Number(res) ?? 0
|
|
298
|
+
})
|
|
299
|
+
|
|
300
|
+
const csusdlPromise = safeFetch('CSUSDL', async () => {
|
|
301
|
+
const res = await fetch(FeedData.MORPHO_VAULTS, {
|
|
302
|
+
method: 'POST',
|
|
303
|
+
headers: { Accept: 'application/json' },
|
|
304
|
+
body: JSON.stringify({
|
|
305
|
+
query:
|
|
306
|
+
'query GetAllCurrentAPYFromVault($address: String!) {\n vaultByAddress(address: $address) {\n state {\n apy\n netApy\n }\n asset {\n yield {\n apr\n }\n }\n }\n}',
|
|
307
|
+
variables: {
|
|
308
|
+
address: '0xbEeFc011e94f43b8B7b455eBaB290C7Ab4E216f1',
|
|
309
|
+
},
|
|
310
|
+
}),
|
|
311
|
+
}).then((r) => r.json())
|
|
312
|
+
const vba = res?.data?.vaultByAddress
|
|
313
|
+
return (
|
|
314
|
+
apyToAprPercent(vba.state.apy ?? 0) * 100 +
|
|
315
|
+
(vba?.asset?.yield.apr ?? 0) * 100
|
|
316
|
+
)
|
|
317
|
+
})
|
|
318
|
+
|
|
141
319
|
const rtokensPromise = safeFetch('RTOKENS', async () => {
|
|
142
320
|
const res = await fetch(FeedData.RTOKENS).then((r) => r.json())
|
|
143
321
|
const data = res.rtokens['8453']
|
|
322
|
+
const dataMainnet = res.rtokens['1']
|
|
323
|
+
const dataMainnetColalterals = res.collaterals['1']
|
|
144
324
|
return {
|
|
145
325
|
[bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
|
|
146
326
|
[hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
|
|
327
|
+
[sfrxeth]: apyToAprPercent(dataMainnetColalterals.sfrxeth / 100) * 100,
|
|
328
|
+
[sfrax]: apyToAprPercent(dataMainnetColalterals.sfrax / 100) * 100,
|
|
329
|
+
[ceth]: apyToAprPercent(dataMainnetColalterals.ceth / 100) * 100,
|
|
330
|
+
[ethPlus]: apyToAprPercent(dataMainnet['ETH+'] / 100) * 100,
|
|
331
|
+
[usdThree]: apyToAprPercent(dataMainnet['USD3'] / 100) * 100,
|
|
332
|
+
[woEth]: apyToAprPercent(dataMainnetColalterals.woeth / 100) * 100,
|
|
147
333
|
}
|
|
148
334
|
})
|
|
149
335
|
|
|
@@ -155,6 +341,18 @@ export const fetchGeneralYields = async () => {
|
|
|
155
341
|
}
|
|
156
342
|
})
|
|
157
343
|
|
|
344
|
+
const anglePromise = safeFetch('ANGLE', async () => {
|
|
345
|
+
const now = Math.floor(Date.now() / 1000)
|
|
346
|
+
const nowMinusWeek = now - 7 * 24 * 3600
|
|
347
|
+
const res = await fetch(
|
|
348
|
+
FeedData.ANGLE + `?from=${nowMinusWeek}&to=${now}`,
|
|
349
|
+
).then((r) => r.json())
|
|
350
|
+
return {
|
|
351
|
+
[stEur]: apyToAprPercent(res.EURA) * 100,
|
|
352
|
+
[stUSD]: apyToAprPercent(res.USDA) * 100,
|
|
353
|
+
}
|
|
354
|
+
})
|
|
355
|
+
|
|
158
356
|
const cbethPromise = safeFetch('CBETH', async () => {
|
|
159
357
|
try {
|
|
160
358
|
const res = await fetch(FeedData.CBETH, {
|
|
@@ -200,6 +398,21 @@ export const fetchGeneralYields = async () => {
|
|
|
200
398
|
trumaticData,
|
|
201
399
|
rtokensData,
|
|
202
400
|
hypeData,
|
|
401
|
+
osEthData,
|
|
402
|
+
ethXData,
|
|
403
|
+
pufEthData,
|
|
404
|
+
angleData,
|
|
405
|
+
susdsData,
|
|
406
|
+
srUsdData,
|
|
407
|
+
yusdData,
|
|
408
|
+
rlpData,
|
|
409
|
+
wstusrData,
|
|
410
|
+
csusdlData,
|
|
411
|
+
sdeusdData,
|
|
412
|
+
rswethData,
|
|
413
|
+
ynethxData,
|
|
414
|
+
ethZeroData,
|
|
415
|
+
usdZeroPlusData,
|
|
203
416
|
] = await Promise.all([
|
|
204
417
|
wstethPromise,
|
|
205
418
|
ezethPromise,
|
|
@@ -216,6 +429,21 @@ export const fetchGeneralYields = async () => {
|
|
|
216
429
|
trumaticPromise,
|
|
217
430
|
rtokensPromise,
|
|
218
431
|
hypePromise,
|
|
432
|
+
osEthPromise,
|
|
433
|
+
ethxPromise,
|
|
434
|
+
pufEthPromise,
|
|
435
|
+
anglePromise,
|
|
436
|
+
susdsPromise,
|
|
437
|
+
srusdPromise,
|
|
438
|
+
yusdPromise,
|
|
439
|
+
rlpPromise,
|
|
440
|
+
wstusrPromise,
|
|
441
|
+
csusdlPromise,
|
|
442
|
+
sdeusdPromise,
|
|
443
|
+
rswethPromise,
|
|
444
|
+
ynethxPromise,
|
|
445
|
+
ethZeroPromise,
|
|
446
|
+
usdZeroPlusPromise,
|
|
219
447
|
])
|
|
220
448
|
|
|
221
449
|
const data: YieldDataWithTimestamp = {
|
|
@@ -229,14 +457,29 @@ export const fetchGeneralYields = async () => {
|
|
|
229
457
|
WEETH: weethData,
|
|
230
458
|
STMATIC: stmaticData,
|
|
231
459
|
USDY: 4.35,
|
|
232
|
-
USDE: 0,
|
|
233
460
|
SUSDE: susdeData,
|
|
234
461
|
SAVAX: savaxData,
|
|
235
462
|
CBETH: cbethData,
|
|
236
463
|
RSETH: rsethData,
|
|
237
464
|
TRUMATIC: trumaticData,
|
|
465
|
+
[sUsds]: susdsData,
|
|
466
|
+
[ethZero]: ethZeroData,
|
|
467
|
+
[usdZeroPlus]: usdZeroPlusData,
|
|
468
|
+
[csusdl]: csusdlData,
|
|
469
|
+
[srUsd]: srUsdData,
|
|
470
|
+
[sdeusd]: sdeusdData,
|
|
471
|
+
[wstusr]: wstusrData,
|
|
472
|
+
[yusd]: yusdData,
|
|
473
|
+
[rlp]: rlpData,
|
|
474
|
+
[rsweth]: rswethData,
|
|
475
|
+
[osETH]: osEthData,
|
|
476
|
+
[ethX]: ethXData,
|
|
477
|
+
[ynethx]: ynethxData,
|
|
478
|
+
[tETH]: wstethData,
|
|
479
|
+
[pufEth]: pufEthData,
|
|
238
480
|
...rtokensData,
|
|
239
481
|
...hypeData,
|
|
482
|
+
...angleData,
|
|
240
483
|
},
|
|
241
484
|
lenderRewards: {
|
|
242
485
|
'167000': {
|
package/test/mainPrices.test.ts
CHANGED