@1delta/margin-fetcher 0.0.18 → 0.0.19

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.
Files changed (72) hide show
  1. package/dist/assets/liquidityThresholds.d.ts +10 -0
  2. package/dist/assets/liquidityThresholds.d.ts.map +1 -1
  3. package/dist/assets/liquidityThresholds.js +9 -2
  4. package/dist/flash-liquidity/fetchLiquidity.d.ts +2 -2
  5. package/dist/flash-liquidity/fetchLiquidity.d.ts.map +1 -1
  6. package/dist/flash-liquidity/fetchLiquidity.js +85 -54
  7. package/dist/flash-liquidity/types.d.ts +1 -0
  8. package/dist/flash-liquidity/types.d.ts.map +1 -1
  9. package/dist/lending/aave-v3-type/publicCallBuild.d.ts +1 -1
  10. package/dist/lending/aave-v3-type/publicCallBuild.d.ts.map +1 -1
  11. package/dist/lending/aave-v3-type/publicCallBuild.js +46 -48
  12. package/dist/lending/aave-v3-type/publicCallParse.d.ts.map +1 -1
  13. package/dist/lending/aave-v3-type/publicCallParse.js +8 -2
  14. package/dist/lending/compound-v3/publicCallParse.d.ts.map +1 -1
  15. package/dist/lending/compound-v3/publicCallParse.js +8 -3
  16. package/dist/lending/fetchLender.js +2 -2
  17. package/dist/lending/morpho/convertPublic.js +1 -1
  18. package/dist/lending/user-data/types.js +2 -2
  19. package/dist/lending-pairs/computeLendingPairs.d.ts +10 -1
  20. package/dist/lending-pairs/computeLendingPairs.d.ts.map +1 -1
  21. package/dist/lending-pairs/computeLendingPairs.js +26 -22
  22. package/dist/prices/defillama/index.d.ts.map +1 -1
  23. package/dist/prices/defillama/index.js +162 -151
  24. package/dist/prices/index.d.ts +3 -2
  25. package/dist/prices/index.d.ts.map +1 -1
  26. package/dist/prices/index.js +3 -2
  27. package/dist/prices/main-prices/addresses/aaveOracles.d.ts +159 -143
  28. package/dist/prices/main-prices/addresses/aaveOracles.d.ts.map +1 -1
  29. package/dist/prices/main-prices/addresses/aaveOracles.js +276 -260
  30. package/dist/prices/main-prices/addresses/morpho.d.ts.map +1 -1
  31. package/dist/prices/main-prices/addresses/morpho.js +114 -0
  32. package/dist/prices/main-prices/fetchOracleData.d.ts.map +1 -1
  33. package/dist/prices/main-prices/fetchOracleData.js +21 -9
  34. package/dist/prices/pendle/fetchPendlePrices.d.ts +7 -0
  35. package/dist/prices/pendle/fetchPendlePrices.d.ts.map +1 -0
  36. package/dist/prices/pendle/fetchPendlePrices.js +148 -0
  37. package/dist/prices/pendle/index.d.ts +2 -0
  38. package/dist/prices/pendle/index.d.ts.map +1 -0
  39. package/dist/prices/pendle/index.js +1 -0
  40. package/dist/types/apiReturnType.d.ts +2 -0
  41. package/dist/types/apiReturnType.d.ts.map +1 -1
  42. package/dist/utils/index.d.ts +1 -3
  43. package/dist/utils/index.d.ts.map +1 -1
  44. package/dist/utils/index.js +10 -16
  45. package/dist/yields/index.d.ts.map +1 -1
  46. package/dist/yields/index.js +46 -33
  47. package/package.json +3 -6
  48. package/src/assets/liquidityThresholds.ts +22 -3
  49. package/src/flash-liquidity/fetchLiquidity.ts +298 -261
  50. package/src/flash-liquidity/types.ts +1 -0
  51. package/src/lending/aave-v3-type/publicCallBuild.ts +74 -68
  52. package/src/lending/aave-v3-type/publicCallParse.ts +8 -2
  53. package/src/lending/compound-v3/publicCallParse.ts +10 -3
  54. package/src/lending/fetchLender.ts +2 -2
  55. package/src/lending/morpho/convertPublic.ts +1 -1
  56. package/src/lending/user-data/types.ts +2 -2
  57. package/src/lending-pairs/computeLendingPairs.ts +423 -410
  58. package/src/prices/defillama/index.ts +233 -227
  59. package/src/prices/index.ts +3 -2
  60. package/src/prices/main-prices/addresses/aaveOracles.ts +292 -277
  61. package/src/prices/main-prices/addresses/morpho.ts +114 -0
  62. package/src/prices/main-prices/fetchOracleData.ts +29 -22
  63. package/src/prices/pendle/fetchPendlePrices.ts +208 -0
  64. package/src/prices/pendle/index.ts +1 -0
  65. package/src/types/apiReturnType.ts +42 -39
  66. package/src/utils/index.ts +11 -18
  67. package/src/yields/index.ts +205 -179
  68. package/test/flashLiquidity.test.ts +40 -0
  69. package/test/lenderData.test.ts +18 -13254
  70. package/test/mainPrices.test.ts +24 -19
  71. package/test/morphoPrice.test.ts +1 -1
  72. package/test/userDataAave.test.ts +73 -0
@@ -1,207 +1,233 @@
1
- import { apyToAprPercent, apyToApr } from "../utils/parsing"
1
+ import { apyToAprPercent, apyToApr } from '../utils/parsing'
2
+
3
+ const hyUSD = 'High Yield USD Base::HYUSD'
4
+ const bsdETH = 'Based ETH::BSDETH'
2
5
 
3
6
  const FeedData = {
4
- WSTETH: 'https://eth-api.lido.fi/v1/protocol/steth/apr/sma',
5
- STMATIC: 'https://polygon.lido.fi/api/stats',
6
- CBETH: 'https://api.exchange.coinbase.com/wrapped-assets/cbeth',
7
- MATICX: 'https://universe.staderlabs.com/polygon/apy',
8
- METH: 'https://meth.mantle.xyz/api/stats/apy',
9
- SUSDE: 'https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df',
10
- EZETH: 'https://app.renzoprotocol.com/api/stats?chainId=1',
11
- RETH: 'https://api.rocketpool.net/api/mainnet/payload',
12
- WEETH: 'https://www.ether.fi/api/apr',
13
- SAVAX: "https://api.benqi.fi/liquidstaking/apr",
14
- RSETH: "https://universe.kelpdao.xyz/rseth/totalApy",
15
- TRUMATIC: "https://api.trufin.io/staker/apy?staker=MATIC"
7
+ WSTETH: 'https://eth-api.lido.fi/v1/protocol/steth/apr/sma',
8
+ STMATIC: 'https://polygon.lido.fi/api/stats',
9
+ CBETH: 'https://api.exchange.coinbase.com/wrapped-assets/cbeth',
10
+ MATICX: 'https://universe.staderlabs.com/polygon/apy',
11
+ METH: 'https://meth.mantle.xyz/api/stats/apy',
12
+ SUSDE:
13
+ 'https://yields.llama.fi/poolsEnriched?pool=66985a81-9c51-46ca-9977-42b4fe7bc6df',
14
+ EZETH: 'https://app.renzoprotocol.com/api/stats?chainId=1',
15
+ RETH: 'https://api.rocketpool.net/api/mainnet/payload',
16
+ WEETH: 'https://www.ether.fi/api/apr',
17
+ SAVAX: 'https://api.benqi.fi/liquidstaking/apr',
18
+ RSETH: 'https://universe.kelpdao.xyz/rseth/totalApy',
19
+ TRUMATIC: 'https://api.trufin.io/staker/apy?staker=MATIC',
20
+ RTOKENS: 'https://yields.reserve.org/pools',
16
21
  }
17
22
 
18
23
  const LenderAPIs = {
19
- MERIDIAN: 'https://omnidex.bmaa3ajd1gjri.eu-west-2.cs.amazonlightsail.com/lending_yields'
24
+ MERIDIAN:
25
+ 'https://omnidex.bmaa3ajd1gjri.eu-west-2.cs.amazonlightsail.com/lending_yields',
20
26
  }
21
27
 
22
28
  enum MeridainNetwork {
23
- TAIKO = 'taiko'
29
+ TAIKO = 'taiko',
24
30
  }
25
31
 
26
32
  function formatMeridianKey(k: string) {
27
- const _k = k.toUpperCase()
28
- if (_k === "USDT") return 'USDT.E'
29
- if (_k === "USDCE") return 'USDC.E'
30
- return _k
33
+ const _k = k.toUpperCase()
34
+ if (_k === 'USDT') return 'USDT.E'
35
+ if (_k === 'USDCE') return 'USDC.E'
36
+ return _k
31
37
  }
32
38
 
33
39
  // Converters from apy to apr and reversed
34
40
 
35
41
  interface LenderAssetReward {
36
- deposit: number
37
- borrow: number
38
- additionalDepositData: any
39
- additionalBorrowData: any
42
+ deposit: number
43
+ borrow: number
44
+ additionalDepositData: any
45
+ additionalBorrowData: any
40
46
  }
41
47
 
42
48
  export interface YieldDataWithTimestamp {
43
- intrinsicYields: { [asset: string]: number | undefined }
44
- lenderRewards: { [chainId: number]: { [lender: string]: { [asset: string]: LenderAssetReward } } }
49
+ intrinsicYields: { [asset: string]: number | undefined }
50
+ lenderRewards: {
51
+ [chainId: number]: {
52
+ [lender: string]: { [asset: string]: LenderAssetReward }
53
+ }
54
+ }
55
+ }
56
+
57
+ const safeFetch = async <T>(
58
+ label: string,
59
+ fn: () => Promise<T>,
60
+ ): Promise<T | undefined> => {
61
+ try {
62
+ return await fn()
63
+ } catch (e) {
64
+ console.error(`Error fetching ${label}:`, e)
65
+ return undefined
66
+ }
45
67
  }
46
68
 
47
- const safeFetch = async <T>(label: string, fn: () => Promise<T>): Promise<T | undefined> => {
69
+ export const fetchGeneralYields = async () => {
70
+ const wstethPromise = safeFetch('WSTETH', async () => {
71
+ const res = await fetch(FeedData.WSTETH).then((r) => r.json())
72
+ return Number(res.data.aprs.at(-1).apr) * 0.9
73
+ })
74
+
75
+ const ezethPromise = safeFetch('EZETH', async () => {
76
+ const res = await fetch(FeedData.EZETH).then((r) => r.json())
77
+ return Number(res.data.apr.data.rate)
78
+ })
79
+
80
+ const rethPromise = safeFetch('RETH', async () => {
81
+ const res = await fetch(FeedData.RETH).then((r) => r.json())
82
+ return Number(res.rethAPR)
83
+ })
84
+
85
+ const weethPromise = safeFetch('WEETH', async () => {
86
+ const wstethRes = await fetch(FeedData.WSTETH).then((r) => r.json())
87
+ const wstethApr = Number(wstethRes.data.aprs.at(-1).apr) * 0.9
88
+ let aYield = 0
48
89
  try {
49
- return await fn()
90
+ const weethRes = await fetch(FeedData.WEETH).then((r) => r.json())
91
+ aYield = Number(weethRes.lrt2Apr)
50
92
  } catch (e) {
51
- console.error(`Error fetching ${label}:`, e)
52
- return undefined
93
+ aYield = 0.5
53
94
  }
54
- }
55
-
95
+ return aYield + wstethApr
96
+ })
97
+
98
+ const stmaticPromise = safeFetch('STMATIC', async () => {
99
+ const res = await fetch(FeedData.STMATIC).then((r) => r.json())
100
+ return Number(res.apr) * 0.9
101
+ })
102
+
103
+ const savaxPromise = safeFetch('SAVAX', async () => {
104
+ const res = await fetch(FeedData.SAVAX).then((r) => r.json())
105
+ return Number(res.apr) * 100
106
+ })
107
+
108
+ const methPromise = safeFetch('METH', async () => {
109
+ const res = await fetch(FeedData.METH).then((r) => r.json())
110
+ return apyToApr(Number(res.data[0]?.OneDayAPY)) * 100
111
+ })
112
+
113
+ const maticxPromise = safeFetch('MATICX', async () => {
114
+ const res = await fetch(FeedData.MATICX).then((r) => r.json())
115
+ return Number(res.value) * 0.9
116
+ })
117
+
118
+ const susdePromise = safeFetch('SUSDE', async () => {
119
+ try {
120
+ const res = await fetch(FeedData.SUSDE).then((r) => r.json())
121
+ return apyToAprPercent(res?.data[0]?.apy ?? 0)
122
+ } catch (e) {
123
+ return 0
124
+ }
125
+ })
126
+
127
+ const rsethPromise = safeFetch('RSETH', async () => {
128
+ const res = await fetch(FeedData.RSETH).then((r) => r.json())
129
+ return apyToAprPercent(res.totalAPY)
130
+ })
131
+
132
+ const trumaticPromise = safeFetch('TRUMATIC', async () => {
133
+ const res = await fetch(FeedData.TRUMATIC).then((r) => r.json())
134
+ return apyToAprPercent(res.apy)
135
+ })
136
+
137
+ const rtokensPromise = safeFetch('RTOKENS', async () => {
138
+ const res = await fetch(FeedData.RTOKENS).then((r) => r.json())
139
+ const data = res.rtokens['8453']
140
+ return {
141
+ [bsdETH]: apyToAprPercent(data.bsdETH / 100) * 100,
142
+ [hyUSD]: apyToAprPercent(data.hyUSD / 100) * 100,
143
+ }
144
+ })
56
145
 
57
- export const fetchGeneralYields = async () => {
58
- const wstethPromise = safeFetch('WSTETH', async () => {
59
- const res = await fetch(FeedData.WSTETH).then(r => r.json())
60
- return Number(res.data.aprs.at(-1).apr) * 0.9
61
- })
62
-
63
- const ezethPromise = safeFetch('EZETH', async () => {
64
- const res = await fetch(FeedData.EZETH).then(r => r.json())
65
- return Number(res.data.apr.data.rate)
66
- })
67
-
68
- const rethPromise = safeFetch('RETH', async () => {
69
- const res = await fetch(FeedData.RETH).then(r => r.json())
70
- return Number(res.rethAPR)
71
- })
72
-
73
- const weethPromise = safeFetch('WEETH', async () => {
74
- const wstethRes = await fetch(FeedData.WSTETH).then(r => r.json())
75
- const wstethApr = Number(wstethRes.data.aprs.at(-1).apr) * 0.9
76
- let aYield = 0
77
- try {
78
- const weethRes = await fetch(FeedData.WEETH).then(r => r.json())
79
- aYield = Number(weethRes.lrt2Apr)
80
- } catch (e) {
81
- aYield = 0.5
82
- }
83
- return aYield + wstethApr
84
- })
85
-
86
- const stmaticPromise = safeFetch('STMATIC', async () => {
87
- const res = await fetch(FeedData.STMATIC).then(r => r.json())
88
- return Number(res.apr) * 0.9
89
- })
90
-
91
- const savaxPromise = safeFetch('SAVAX', async () => {
92
- const res = await fetch(FeedData.SAVAX).then(r => r.json())
93
- return Number(res.apr) * 100
94
- })
95
-
96
- const methPromise = safeFetch('METH', async () => {
97
- const res = await fetch(FeedData.METH).then(r => r.json())
98
- return apyToApr(Number(res.data[0]?.OneDayAPY)) * 100
99
- })
100
-
101
- const maticxPromise = safeFetch('MATICX', async () => {
102
- const res = await fetch(FeedData.MATICX).then(r => r.json())
103
- return Number(res.value) * 0.9
104
- })
105
-
106
- const susdePromise = safeFetch('SUSDE', async () => {
107
- try {
108
- const res = await fetch(FeedData.SUSDE).then(r => r.json())
109
- return apyToAprPercent(res?.data[0]?.apy ?? 0)
110
- } catch (e) {
111
- return 0
112
- }
113
- })
114
-
115
- const rsethPromise = safeFetch('RSETH', async () => {
116
- const res = await fetch(FeedData.RSETH).then(r => r.json())
117
- return apyToAprPercent(res.totalAPY)
118
- })
119
-
120
- const trumaticPromise = safeFetch('TRUMATIC', async () => {
121
- const res = await fetch(FeedData.TRUMATIC).then(r => r.json())
122
- return apyToAprPercent(res.apy)
123
- })
124
-
125
- const cbethPromise = safeFetch('CBETH', async () => {
126
- try {
127
- const res = await fetch(FeedData.CBETH, {
128
- headers: {
129
- "User-Agent": "1delta/yields",
130
- "Content-Type": "application/json"
131
- }
132
- }).then(r => r.json())
133
- return apyToAprPercent(res.apy) * 100
134
- } catch (e) {
135
- console.log("CBETH failed", e)
136
- return 0
137
- }
138
- })
139
-
140
- const meridianPromise = safeFetch('MERIDIAN', async () => {
141
- const res = await fetch(LenderAPIs.MERIDIAN).then(r => r.json())
142
- const taikoData = res[MeridainNetwork.TAIKO]
143
- return Object.assign({}, ...Object.keys(taikoData).map(key => ({
144
- [formatMeridianKey(key)]: {
145
- deposit: taikoData[key].apy_reward,
146
- borrow: taikoData[key].apy_reward_borrow
147
- }
148
- })))
149
- })
150
-
151
- const [
152
- wstethData,
153
- ezethData,
154
- rethData,
155
- weethData,
156
- stmaticData,
157
- methData,
158
- maticXdata,
159
- susdeData,
160
- meridianData,
161
- savaxData,
162
- cbethData,
163
- rsethData,
164
- trumaticData
165
- ] = await Promise.all([
166
- wstethPromise,
167
- ezethPromise,
168
- rethPromise,
169
- weethPromise,
170
- stmaticPromise,
171
- methPromise,
172
- maticxPromise,
173
- susdePromise,
174
- meridianPromise,
175
- savaxPromise,
176
- cbethPromise,
177
- rsethPromise,
178
- trumaticPromise,
179
- ])
180
-
181
- const data: YieldDataWithTimestamp = {
182
- intrinsicYields: {
183
- MATICX: maticXdata,
184
- METH: methData,
185
- CMETH: methData,
186
- WSTETH: wstethData,
187
- EZETH: ezethData,
188
- RETH: rethData,
189
- WEETH: weethData,
190
- STMATIC: stmaticData,
191
- USDY: 4.35,
192
- USDE: 0,
193
- SUSDE: susdeData,
194
- SAVAX: savaxData,
195
- CBETH: cbethData,
196
- RSETH: rsethData,
197
- TRUMATIC: trumaticData,
146
+ const cbethPromise = safeFetch('CBETH', async () => {
147
+ try {
148
+ const res = await fetch(FeedData.CBETH, {
149
+ headers: {
150
+ 'User-Agent': '1delta/yields',
151
+ 'Content-Type': 'application/json',
198
152
  },
199
- lenderRewards: {
200
- "167000": {
201
- MERIDIAN: meridianData
202
- }
203
- }
153
+ }).then((r) => r.json())
154
+ return apyToAprPercent(res.apy) * 100
155
+ } catch (e) {
156
+ console.log('CBETH failed', e)
157
+ return 0
204
158
  }
205
- return data
159
+ })
160
+
161
+ const meridianPromise = safeFetch('MERIDIAN', async () => {
162
+ const res = await fetch(LenderAPIs.MERIDIAN).then((r) => r.json())
163
+ const taikoData = res[MeridainNetwork.TAIKO]
164
+ return Object.assign(
165
+ {},
166
+ ...Object.keys(taikoData).map((key) => ({
167
+ [formatMeridianKey(key)]: {
168
+ deposit: taikoData[key].apy_reward,
169
+ borrow: taikoData[key].apy_reward_borrow,
170
+ },
171
+ })),
172
+ )
173
+ })
174
+
175
+ const [
176
+ wstethData,
177
+ ezethData,
178
+ rethData,
179
+ weethData,
180
+ stmaticData,
181
+ methData,
182
+ maticXdata,
183
+ susdeData,
184
+ meridianData,
185
+ savaxData,
186
+ cbethData,
187
+ rsethData,
188
+ trumaticData,
189
+ rtokensData,
190
+ ] = await Promise.all([
191
+ wstethPromise,
192
+ ezethPromise,
193
+ rethPromise,
194
+ weethPromise,
195
+ stmaticPromise,
196
+ methPromise,
197
+ maticxPromise,
198
+ susdePromise,
199
+ meridianPromise,
200
+ savaxPromise,
201
+ cbethPromise,
202
+ rsethPromise,
203
+ trumaticPromise,
204
+ rtokensPromise,
205
+ ])
206
+
207
+ const data: YieldDataWithTimestamp = {
208
+ intrinsicYields: {
209
+ MATICX: maticXdata,
210
+ METH: methData,
211
+ CMETH: methData,
212
+ WSTETH: wstethData,
213
+ EZETH: ezethData,
214
+ RETH: rethData,
215
+ WEETH: weethData,
216
+ STMATIC: stmaticData,
217
+ USDY: 4.35,
218
+ USDE: 0,
219
+ SUSDE: susdeData,
220
+ SAVAX: savaxData,
221
+ CBETH: cbethData,
222
+ RSETH: rsethData,
223
+ TRUMATIC: trumaticData,
224
+ ...rtokensData,
225
+ },
226
+ lenderRewards: {
227
+ '167000': {
228
+ MERIDIAN: meridianData,
229
+ },
230
+ },
231
+ }
232
+ return data
206
233
  }
207
-
@@ -0,0 +1,40 @@
1
+ import { describe, it } from 'vitest'
2
+ import { attachPricesToFlashLiquidity, fetchFlashLiquidityForChain, fetchMainPrices } from "../src"
3
+ import { getEvmClient, multicallRetry } from "@1delta/providers"
4
+ import { Chain } from "@1delta/asset-registry"
5
+
6
+
7
+
8
+ describe('find flash liquidity', () => {
9
+ it('flash liquidity for chain', async () => {
10
+
11
+ const chain = Chain.HYPEREVM
12
+
13
+ const liquidity = await fetchFlashLiquidityForChain(chain, multicallRetry)
14
+
15
+ console.log("liquidity", liquidity)
16
+
17
+ const prices = await fetchMainPrices([chain], getEvmClient)
18
+
19
+ console.log("prices", prices)
20
+
21
+ const dataWithPrices = attachPricesToFlashLiquidity(chain, liquidity, prices)
22
+
23
+ console.log(dataWithPrices)
24
+
25
+ })
26
+ }, { timeout: 10000 })
27
+
28
+
29
+ function prettyPrint(obj: any) {
30
+ for (const key in obj) {
31
+ const value = obj[key]
32
+ const keyStr = `\x1b[1m\x1b[36m${key}:\x1b[0m` // bold cyan
33
+ if (typeof value === 'object' && value !== null) {
34
+ console.log(`${keyStr}`)
35
+ console.dir(value, { depth: null, colors: true })
36
+ } else {
37
+ console.log(`${keyStr} ${value}`)
38
+ }
39
+ }
40
+ }