@1delta/margin-fetcher 0.0.16 → 0.0.18

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 (34) hide show
  1. package/dist/abis/oracle/ProxyOracle.d.ts +12 -0
  2. package/dist/abis/oracle/ProxyOracle.d.ts.map +1 -0
  3. package/dist/abis/oracle/ProxyOracle.js +15 -0
  4. package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
  5. package/dist/lending/morpho/convertPublic.js +8 -2
  6. package/dist/lending/morpho/fetchPublic.d.ts.map +1 -1
  7. package/dist/lending/morpho/types.d.ts +2 -0
  8. package/dist/lending/morpho/types.d.ts.map +1 -1
  9. package/dist/lending/user-data/aave-v3-type/userCallParse.d.ts.map +1 -1
  10. package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
  11. package/dist/lending/user-data/fetchUserData.js +1 -3
  12. package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
  13. package/dist/lending/user-data/morpho/userCallParse.js +2 -1
  14. package/dist/prices/main-prices/addresses/morpho.d.ts +11 -0
  15. package/dist/prices/main-prices/addresses/morpho.d.ts.map +1 -0
  16. package/dist/prices/main-prices/addresses/morpho.js +903 -0
  17. package/dist/prices/main-prices/fetchOracleData.d.ts +1 -0
  18. package/dist/prices/main-prices/fetchOracleData.d.ts.map +1 -1
  19. package/dist/prices/main-prices/fetchOracleData.js +63 -2
  20. package/package.json +1 -1
  21. package/src/abis/oracle/ProxyOracle.ts +15 -0
  22. package/src/lending/morpho/convertPublic.ts +10 -3
  23. package/src/lending/morpho/fetchPublic.ts +0 -1
  24. package/src/lending/morpho/types.ts +5 -0
  25. package/src/lending/user-data/aave-v3-type/userCallParse.ts +2 -0
  26. package/src/lending/user-data/fetchUserData.ts +1 -4
  27. package/src/lending/user-data/morpho/userCallParse.ts +2 -1
  28. package/src/prices/main-prices/addresses/morpho.ts +912 -0
  29. package/src/prices/main-prices/fetchOracleData.ts +110 -2
  30. package/test/data.ts +47979 -0
  31. package/test/mainPriceMB.test.ts +32 -0
  32. package/test/morpho.ts +66 -0
  33. package/test/morphoPrice.test.ts +31 -0
  34. package/test/userDataAll.test.ts +73 -0
@@ -6,7 +6,7 @@ import { RWADynamicOracleAbi } from '../../abis/oracle/RWADynamicOracle'
6
6
 
7
7
  import { api3OracleAddresses } from './addresses/api3'
8
8
  import { AAVE_V2_LENDERS, ASSET_META, Chain } from '@1delta/asset-registry'
9
- import { formatEther } from 'viem'
9
+ import { formatEther, formatUnits } from 'viem'
10
10
  import { getAaveAssets } from '../../assets'
11
11
  import {
12
12
  chainlinkOracles,
@@ -19,6 +19,8 @@ import { AAVE_STYLE_ORACLES } from './addresses/aaveOracles'
19
19
  import { AAVES_PER_CHAIN } from '../../utils'
20
20
  import { GetEvmClientFunction } from '../../types'
21
21
  import { parseRawAmount } from '../../utils/parsing'
22
+ import { ProxyOracleAbi } from '../../abis/oracle/ProxyOracle'
23
+ import { MrophoOracleInfo, MrophoOracles } from './addresses/morpho'
22
24
 
23
25
  export const formatAavePrice = (price: string, isV2 = false): number => {
24
26
  try {
@@ -34,6 +36,24 @@ export const formatAavePrice = (price: string, isV2 = false): number => {
34
36
  }
35
37
  }
36
38
 
39
+ export const formatMorphoPrice = (
40
+ price: string,
41
+ collateralDec: number,
42
+ debtDec: number,
43
+ ): number => {
44
+ try {
45
+ return Number(
46
+ formatUnits(
47
+ BigInt(price ?? '0'),
48
+ // 10^(18 - decimals)
49
+ 36 + collateralDec - debtDec,
50
+ ),
51
+ )
52
+ } catch {
53
+ return NaN
54
+ }
55
+ }
56
+
37
57
  const LENDLE_PAIR_MANTLE = '0x4c57BE599d0e0414785943569E9B6A66dA79Aa6b'
38
58
  const AU_PAIR_MANTLE = '0x709503fbb50b10f921e812c48fbd5c5522a0b20c'
39
59
  const WMNT_USDT_PAIR = '0x3e5922cd0cec71dc2d60ec8b36aa4c05b7c1672f'
@@ -44,6 +64,10 @@ interface OracleData {
44
64
  }
45
65
 
46
66
  type QueryAave = { oracle: string; assets: string[]; fork: string }
67
+ type QueryMorpho = {
68
+ oracle: string
69
+ assets: [string, string, number, number][]
70
+ }
47
71
 
48
72
  /**
49
73
  * Fetches Aave and uniswap V2 oracle data
@@ -71,6 +95,14 @@ export const fetchMainPrices = async (
71
95
  handled = [...handled, ...newOnes]
72
96
  }
73
97
  })
98
+
99
+ const morphoQueries = (MrophoOracles[chainId] ?? []).filter(
100
+ (a) =>
101
+ !handled.includes(a.collateralAsset) || !handled.includes(a.loanAsset),
102
+ )
103
+
104
+ const morphoCalls = getMorphoCalls(morphoQueries)
105
+
74
106
  const callAave = getAaveCalls(queries)
75
107
 
76
108
  const [callsChainLink, chainLinkNames] = getChainLinkCalls(chainId)
@@ -89,6 +121,7 @@ export const fetchMainPrices = async (
89
121
  ...AaveOracleAbi,
90
122
  ...Api3OracleAbi,
91
123
  ...RWADynamicOracleAbi,
124
+ ...ProxyOracleAbi,
92
125
  ],
93
126
  [
94
127
  ...callsChainLink,
@@ -96,6 +129,7 @@ export const fetchMainPrices = async (
96
129
  ...uniswapV2Calls,
97
130
  ...api3Calls,
98
131
  ...rwaCalls,
132
+ ...morphoCalls,
99
133
  ],
100
134
  getEvmClient,
101
135
  ).then((multicallResult) => {
@@ -144,13 +178,37 @@ export const fetchMainPrices = async (
144
178
  )
145
179
 
146
180
  const rwaData = parseRWADynamicOracleResults(chainId, rwaResult, rwaNames)
147
- return {
181
+
182
+ const morphoResult = multicallResult.slice(
183
+ callsChainLink.length +
184
+ callAave.length +
185
+ uniswapV2Calls.length +
186
+ api3Calls.length +
187
+ rwaCalls.length,
188
+ callsChainLink.length +
189
+ callAave.length +
190
+ uniswapV2Calls.length +
191
+ api3Calls.length +
192
+ morphoCalls.length,
193
+ )
194
+ const prices = {
148
195
  ...uniswapData,
149
196
  ...aaveData,
150
197
  ...chainLinkData,
151
198
  ...api3Data,
152
199
  ...rwaData,
153
200
  }
201
+ const morphoData = parseMorphoResults(
202
+ chainId,
203
+ morphoResult,
204
+ morphoQueries,
205
+ prices,
206
+ )
207
+
208
+ return {
209
+ ...prices,
210
+ ...morphoData,
211
+ }
154
212
  })
155
213
  })
156
214
  promises.push(fetchDefillamaData())
@@ -210,6 +268,21 @@ const getAaveCalls = (query: QueryAave[]) => {
210
268
  .flat()
211
269
  }
212
270
 
271
+ /**
272
+ * Create calldata for aave oracles
273
+ * @param chainId network
274
+ * @param addressesAaveUnderlyings address array
275
+ * @returns call data
276
+ */
277
+ const getMorphoCalls = (query: MrophoOracleInfo[] = []) => {
278
+ if (query.length === 0) return []
279
+ return query.map(({ oracle }) => ({
280
+ address: oracle,
281
+ name: 'price',
282
+ params: [],
283
+ }))
284
+ }
285
+
213
286
  /**
214
287
  * Create calldata for chainLink oracles
215
288
  * @param chainId network
@@ -332,6 +405,41 @@ const parseAaveResults = (
332
405
  return prices
333
406
  }
334
407
 
408
+ const parseMorphoResults = (
409
+ chainId: string,
410
+ data: any[],
411
+ queries: MrophoOracleInfo[],
412
+ donePrices: any = {},
413
+ ) => {
414
+ let prices: any = {}
415
+
416
+ data.forEach((d, i) => {
417
+ const details = queries[i]
418
+ const {
419
+ loanAsset,
420
+ collateralAsset,
421
+ loanAssetDecimals,
422
+ collateralAssetDecimals,
423
+ } = details
424
+ const oracleId =
425
+ ASSET_META[chainId][loanAsset]?.assetGroup ?? chainId + '-' + loanAsset
426
+ const debtPrice = donePrices[oracleId]
427
+ const oracleIdCollateral =
428
+ ASSET_META[chainId][collateralAsset]?.assetGroup ??
429
+ chainId + '-' + collateralAsset
430
+ if (debtPrice) {
431
+ const priceCollateral = formatMorphoPrice(
432
+ d.toString(),
433
+ loanAssetDecimals,
434
+ collateralAssetDecimals,
435
+ )
436
+ prices[oracleIdCollateral] = priceCollateral * debtPrice
437
+ }
438
+ })
439
+
440
+ return prices
441
+ }
442
+
335
443
  /**
336
444
  * Parser for aave results in ulticall slice
337
445
  * @param chainId network