@1delta/margin-fetcher 0.0.10 → 0.0.13

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 (89) hide show
  1. package/dist/lending/aave-v2-type/types.d.ts +2 -0
  2. package/dist/lending/aave-v2-type/types.d.ts.map +1 -1
  3. package/dist/lending/compound-v3/publicCallParse.d.ts +4 -4
  4. package/dist/lending/compound-v3/publicCallParse.d.ts.map +1 -1
  5. package/dist/lending/compound-v3/publicCallParse.js +37 -22
  6. package/dist/lending/fetchLender.d.ts.map +1 -1
  7. package/dist/lending/fetchLender.js +25 -29
  8. package/dist/lending/fetchLenderAll.d.ts +2 -1
  9. package/dist/lending/fetchLenderAll.d.ts.map +1 -1
  10. package/dist/lending/fetchLenderAll.js +3 -3
  11. package/dist/lending/fetchLenderExt.d.ts +2 -1
  12. package/dist/lending/fetchLenderExt.d.ts.map +1 -1
  13. package/dist/lending/fetchLenderExt.js +28 -14
  14. package/dist/lending/index.d.ts +2 -0
  15. package/dist/lending/index.d.ts.map +1 -1
  16. package/dist/lending/index.js +2 -0
  17. package/dist/lending/morpho/convertPublic.d.ts +3 -5
  18. package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
  19. package/dist/lending/morpho/convertPublic.js +16 -12
  20. package/dist/lending/morpho/fetchPublic.js +1 -1
  21. package/dist/lending/morpho/publicCallBuild.d.ts +1 -4
  22. package/dist/lending/morpho/publicCallBuild.d.ts.map +1 -1
  23. package/dist/lending/morpho/types.d.ts +2 -0
  24. package/dist/lending/morpho/types.d.ts.map +1 -1
  25. package/dist/lending/user-data/aave-v3-type/userCallBuild.d.ts.map +1 -1
  26. package/dist/lending/user-data/aave-v3-type/userCallBuild.js +4 -7
  27. package/dist/lending/user-data/abis.d.ts +88 -0
  28. package/dist/lending/user-data/abis.d.ts.map +1 -1
  29. package/dist/lending/user-data/abis.js +5 -1
  30. package/dist/lending/user-data/compound-v3/userCallParse.d.ts.map +1 -1
  31. package/dist/lending/user-data/compound-v3/userCallParse.js +3 -2
  32. package/dist/lending/user-data/fetchUserData.d.ts +4 -4
  33. package/dist/lending/user-data/fetchUserData.d.ts.map +1 -1
  34. package/dist/lending/user-data/fetchUserData.js +46 -25
  35. package/dist/lending/user-data/init/userCallParse.js +1 -1
  36. package/dist/lending/user-data/morpho/userCallBuild.d.ts +4 -5
  37. package/dist/lending/user-data/morpho/userCallBuild.d.ts.map +1 -1
  38. package/dist/lending/user-data/morpho/userCallBuild.js +15 -9
  39. package/dist/lending/user-data/morpho/userCallParse.d.ts +1 -2
  40. package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
  41. package/dist/lending/user-data/morpho/userCallParse.js +15 -12
  42. package/dist/lending/user-data/types.d.ts +30 -19
  43. package/dist/lending/user-data/types.d.ts.map +1 -1
  44. package/dist/lending/user-data/types.js +12 -0
  45. package/dist/lending/user-data/utils/createGeneralUserState.d.ts +4 -4
  46. package/dist/lending/user-data/utils/createGeneralUserState.d.ts.map +1 -1
  47. package/dist/lending/user-data/utils/createGeneralUserState.js +24 -17
  48. package/dist/utils/index.d.ts +5 -3
  49. package/dist/utils/index.d.ts.map +1 -1
  50. package/dist/utils/index.js +20 -11
  51. package/dist/utils/parsing.d.ts +1 -0
  52. package/dist/utils/parsing.d.ts.map +1 -1
  53. package/dist/utils/parsing.js +3 -0
  54. package/dist/yields/index.d.ts.map +1 -1
  55. package/dist/yields/index.js +12 -5
  56. package/package.json +1 -1
  57. package/src/abis/morpho/blue.ts +99 -0
  58. package/src/abis/morpho/lens.ts +31 -0
  59. package/src/lending/aave-v2-type/types.ts +2 -0
  60. package/src/lending/compound-v3/publicCallParse.ts +93 -37
  61. package/src/lending/fetchLender.ts +86 -49
  62. package/src/lending/fetchLenderAll.ts +30 -0
  63. package/src/lending/fetchLenderExt.ts +82 -0
  64. package/src/lending/index.ts +3 -1
  65. package/src/lending/morpho/convertPublic.ts +153 -0
  66. package/src/lending/morpho/fetchPublic.ts +80 -0
  67. package/src/lending/morpho/publicCallBuild.ts +11 -0
  68. package/src/lending/morpho/types.ts +129 -0
  69. package/src/lending/user-data/aave-v3-type/userCallBuild.ts +2 -8
  70. package/src/lending/user-data/abis.ts +4 -1
  71. package/src/lending/user-data/compound-v3/userCallParse.ts +3 -2
  72. package/src/lending/user-data/fetchUserData.ts +114 -33
  73. package/src/lending/user-data/init/userCallParse.ts +1 -1
  74. package/src/lending/user-data/morpho/decoder.ts +71 -0
  75. package/src/lending/user-data/morpho/morphoLib.ts +61 -0
  76. package/src/lending/user-data/morpho/types.ts +12 -0
  77. package/src/lending/user-data/morpho/userCallBuild.ts +63 -0
  78. package/src/lending/user-data/morpho/userCallParse.ts +150 -0
  79. package/src/lending/user-data/morpho/userCallParseNoDeploy.ts +168 -0
  80. package/src/lending/user-data/types.ts +64 -42
  81. package/src/lending/user-data/utils/createGeneralUserState.ts +56 -32
  82. package/src/utils/index.ts +32 -14
  83. package/src/utils/parsing.ts +5 -0
  84. package/src/yields/index.ts +13 -4
  85. package/test/lenderData.test.ts +13251 -13649
  86. package/test/mainPrices.test.ts +1 -13
  87. package/test/morpho.test.ts +20 -0
  88. package/test/userDataMorpho.test.ts +79 -0
  89. package/test/utils.ts +13 -0
@@ -1,10 +1,19 @@
1
- import { Lender } from "@1delta/asset-registry"
2
- import { AdditionalYields } from "../../types"
3
- import { CometInterestRateIndexes, CompoundV3GeneralPublicResponse } from "./types"
4
- import { getAssetMeta, getCompoundV3Assets, LENDER_MODE_NO_MODE, toGenericPriceKey, toOracleKey } from "../../assets"
5
- import { getCompoundV3BaseAsset } from "../addresses/compoundV3"
6
- import { calculateRateForCompound, parseRawAmount } from "../../utils/parsing"
7
- import { GenericTokenList } from "../types"
1
+ import { Lender } from '@1delta/asset-registry'
2
+ import { AdditionalYields } from '../../types'
3
+ import {
4
+ CometInterestRateIndexes,
5
+ CompoundV3GeneralPublicResponse,
6
+ } from './types'
7
+ import {
8
+ getAssetMeta,
9
+ getCompoundV3Assets,
10
+ LENDER_MODE_NO_MODE,
11
+ toGenericPriceKey,
12
+ toOracleKey,
13
+ } from '../../assets'
14
+ import { getCompoundV3BaseAsset } from '../addresses/compoundV3'
15
+ import { calculateRateForCompound, parseRawAmount } from '../../utils/parsing'
16
+ import { GenericTokenList } from '../types'
8
17
 
9
18
  const COMET_RISK_DECIMALS = 18
10
19
  const SECONDS_PER_DAY = 3600 * 24
@@ -15,12 +24,13 @@ export const getCompoundV3ReservesDataConverter = (
15
24
  chainId: string,
16
25
  prices: { [asset: string]: number },
17
26
  additionalYields: AdditionalYields,
18
- tokenList: GenericTokenList = {}
27
+ tokenList: GenericTokenList = {},
19
28
  ): [(data: any[]) => CompoundV3GeneralPublicResponse | undefined, number] => {
20
-
21
29
  const assetsToQuery = getCompoundV3Assets(chainId, lender)
22
30
  const baseAssetData = getCompoundV3BaseAsset(lender, chainId)
23
- const tokensNoBase = assetsToQuery.filter(a => a !== baseAssetData.baseAsset)
31
+ const tokensNoBase = assetsToQuery.filter(
32
+ (a) => a !== baseAssetData.baseAsset,
33
+ )
24
34
 
25
35
  const baseLength = tokensNoBase.length * 2
26
36
  const expectedNumberOfCalls = baseLength + 6
@@ -34,10 +44,15 @@ export const getCompoundV3ReservesDataConverter = (
34
44
  const asset = tokensNoBase[i]
35
45
  const resultsAssetInfo = data[i * 2]
36
46
  const resultsTotals = data[i * 2 + 1]
37
- const assetMeta = tokenList[asset] ?? { ...getAssetMeta(chainId, asset), address: asset }
47
+ const assetMeta = tokenList[asset] ?? {
48
+ ...getAssetMeta(chainId, asset),
49
+ address: asset,
50
+ }
38
51
  const decimals = assetMeta?.decimals ?? 18
39
52
  const totals = parseRawAmount(resultsTotals[0], decimals)
40
- const oracleKey = toOracleKey(assetMeta?.assetGroup) ?? toGenericPriceKey(asset, chainId)
53
+ const oracleKey =
54
+ toOracleKey(assetMeta?.assetGroup) ??
55
+ toGenericPriceKey(asset, chainId)
41
56
  result[asset] = {
42
57
  poolId: asset,
43
58
  underlying: asset,
@@ -46,12 +61,21 @@ export const getCompoundV3ReservesDataConverter = (
46
61
  [LENDER_MODE_NO_MODE]: {
47
62
  category: LENDER_MODE_NO_MODE,
48
63
  // collateral factors
49
- borrowCollateralFactor: parseRawAmount(resultsAssetInfo.borrowCollateralFactor.toString(), COMET_RISK_DECIMALS),
50
- collateralFactor: parseRawAmount(resultsAssetInfo.liquidateCollateralFactor.toString(), COMET_RISK_DECIMALS),
51
- borrowFactor: 1
52
- }
64
+ borrowCollateralFactor: parseRawAmount(
65
+ resultsAssetInfo.borrowCollateralFactor.toString(),
66
+ COMET_RISK_DECIMALS,
67
+ ),
68
+ collateralFactor: parseRawAmount(
69
+ resultsAssetInfo.liquidateCollateralFactor.toString(),
70
+ COMET_RISK_DECIMALS,
71
+ ),
72
+ borrowFactor: 1,
73
+ },
53
74
  },
54
- supplyCap: parseRawAmount(resultsAssetInfo.supplyCap.toString(), decimals),
75
+ supplyCap: parseRawAmount(
76
+ resultsAssetInfo.supplyCap.toString(),
77
+ decimals,
78
+ ),
55
79
 
56
80
  // interest rates
57
81
  variableBorrowRate: 0,
@@ -70,34 +94,48 @@ export const getCompoundV3ReservesDataConverter = (
70
94
  totalDepositsUSD: Number(totals) * (prices[oracleKey] ?? 1),
71
95
  // rewards
72
96
  rewards: {},
73
- borrowingEnabled: false
97
+ borrowingEnabled: false,
74
98
  }
75
99
  }
76
100
 
77
- const baseMeta = getAssetMeta(chainId, baseAssetData.baseAsset)
101
+ const baseMeta = tokenList[baseAssetData.baseAsset] ?? {
102
+ ...getAssetMeta(chainId, baseAssetData.baseAsset),
103
+ address: baseAssetData.baseAsset,
104
+ }
78
105
 
79
106
  // parse data for rewards calculation
80
107
  const decimals = baseMeta?.decimals ?? 18
81
108
  const resultsSupplyRewards = Number(data[baseLength]?.toString())
82
109
  const resultsBorrowRewards = Number(data[baseLength + 1]?.toString())
83
110
  const resultsIndexScale = data[baseLength + 2]?.toString()
84
- const resultsSupply = parseRawAmount(data[baseLength + 3]?.toString(), decimals)
85
- const resultsBorrow = parseRawAmount(data[baseLength + 4]?.toString(), decimals)
86
-
87
- const compToSuppliersPerDay = resultsSupplyRewards / Number(resultsIndexScale) * SECONDS_PER_DAY;
88
- const compToBorrowersPerDay = resultsBorrowRewards / Number(resultsIndexScale) * SECONDS_PER_DAY;
111
+ const resultsSupply = parseRawAmount(
112
+ data[baseLength + 3]?.toString(),
113
+ decimals,
114
+ )
115
+ const resultsBorrow = parseRawAmount(
116
+ data[baseLength + 4]?.toString(),
117
+ decimals,
118
+ )
119
+
120
+ const compToSuppliersPerDay =
121
+ (resultsSupplyRewards / Number(resultsIndexScale)) * SECONDS_PER_DAY
122
+ const compToBorrowersPerDay =
123
+ (resultsBorrowRewards / Number(resultsIndexScale)) * SECONDS_PER_DAY
89
124
 
90
125
  const resultsInterest = data[baseLength + 5]
91
126
 
92
- const oracleKeyBase = toOracleKey(baseMeta?.assetGroup) ?? toGenericPriceKey(baseAssetData.baseAsset, chainId)
127
+ const oracleKeyBase =
128
+ toOracleKey(baseMeta?.assetGroup) ??
129
+ toGenericPriceKey(baseAssetData.baseAsset, chainId)
93
130
  const price = prices[oracleKeyBase] ?? 1
94
131
  const liquidity = Number(resultsSupply) - Number(resultsBorrow)
95
- const compPrice = prices["COMP"]
132
+ const compPrice = prices['COMP']
96
133
 
97
134
  const baseData = {
98
135
  [baseAssetData.baseAsset]: {
99
136
  poolId: baseAssetData.baseAsset,
100
137
  underlying: baseAssetData.baseAsset,
138
+ asset: baseMeta,
101
139
  // collateral factots
102
140
  borrowCollateralFactor: 0,
103
141
  collateralFactor: 0,
@@ -109,14 +147,25 @@ export const getCompoundV3ReservesDataConverter = (
109
147
  // collateral factors
110
148
  borrowCollateralFactor: 0,
111
149
  collateralFactor: 0,
112
- borrowFactor: 1
113
- }
150
+ borrowFactor: 1,
151
+ },
114
152
  },
115
153
  // interest rates
116
- variableBorrowRate: calculateRateForCompound(resultsInterest[CometInterestRateIndexes.borrowRate].toString(), chainId, lender),
117
- depositRate: calculateRateForCompound(resultsInterest[CometInterestRateIndexes.supplyRate].toString(), chainId, lender),
154
+ variableBorrowRate: calculateRateForCompound(
155
+ resultsInterest[CometInterestRateIndexes.borrowRate].toString(),
156
+ chainId,
157
+ lender,
158
+ ),
159
+ depositRate: calculateRateForCompound(
160
+ resultsInterest[CometInterestRateIndexes.supplyRate].toString(),
161
+ chainId,
162
+ lender,
163
+ ),
118
164
  stableBorrowRate: 0,
119
- utilization: parseRawAmount(resultsInterest[CometInterestRateIndexes.utilization].toString(), COMET_RISK_DECIMALS),
165
+ utilization: parseRawAmount(
166
+ resultsInterest[CometInterestRateIndexes.utilization].toString(),
167
+ COMET_RISK_DECIMALS,
168
+ ),
120
169
 
121
170
  totalLiquidity: liquidity,
122
171
  totalLiquidityUSD: liquidity * price,
@@ -129,18 +178,25 @@ export const getCompoundV3ReservesDataConverter = (
129
178
  // rewards
130
179
  rewards: {
131
180
  COMP: {
132
- depositRate: (compPrice * compToSuppliersPerDay / Number(resultsSupply)) * DAYS_IN_YEAR * 100 / price,
133
- variableBorrowRate: (compPrice * compToBorrowersPerDay / Number(resultsBorrow)) * DAYS_IN_YEAR * 100 / price,
181
+ depositRate:
182
+ (((compPrice * compToSuppliersPerDay) / Number(resultsSupply)) *
183
+ DAYS_IN_YEAR *
184
+ 100) /
185
+ price,
186
+ variableBorrowRate:
187
+ (((compPrice * compToBorrowersPerDay) / Number(resultsBorrow)) *
188
+ DAYS_IN_YEAR *
189
+ 100) /
190
+ price,
134
191
  stableBorrowRate: 0,
135
- }
192
+ },
136
193
  },
137
194
  borrowingEnabled: true,
138
195
  stakingYield: additionalYields.intrinsicYields[oracleKeyBase] ?? 0,
139
- }
196
+ },
140
197
  }
141
198
  return { data: { ...result, ...baseData }, chainId }
142
199
  },
143
- expectedNumberOfCalls
200
+ expectedNumberOfCalls,
144
201
  ]
145
202
  }
146
-
@@ -1,4 +1,3 @@
1
-
2
1
  // aave v2 style
3
2
  import { ProtocolDataProviderAbi } from '../abis/aave-v2/ProtocolDataProvider'
4
3
  import { IncentivesControllerAbi } from '../abis/lendle/IncentivesController'
@@ -17,7 +16,13 @@ import { CometAbi } from '../abis/compound-v3/Comet'
17
16
  import { CometExtAbi } from '../abis/compound-v3/CometExt'
18
17
  import { IrgetterAbi } from '../abis/compound-v3/IrGetter'
19
18
 
20
- import { isAaveV2Type, isAaveV3Original, isAaveV3Type, isCompoundV3, isInit } from '../utils'
19
+ import {
20
+ isAaveV2Type,
21
+ isAaveV3Original,
22
+ isAaveV3Type,
23
+ isCompoundV3,
24
+ isInit,
25
+ } from '../utils'
21
26
  import { AdditionalYields, MulticallRetryFunction } from '../types'
22
27
  import { buildAaveV2StyleLenderReserveCall } from './aave-v2-type/publicCallBuild'
23
28
  import { buildAaveV3StyleLenderReserveCall } from './aave-v3-type/publicCallBuild'
@@ -35,10 +40,14 @@ import { YLDRProtocolDataProviderAbi } from '../abis/aave-v2/YLDR'
35
40
  import { GenericTokenList } from './types'
36
41
 
37
42
  function buildLenderCall(chainId: string, lender: Lender) {
38
- if (isAaveV2Type(lender)) return buildAaveV2StyleLenderReserveCall(chainId, lender)
39
- if (isAaveV3Type(lender)) return buildAaveV3StyleLenderReserveCall(chainId, lender)
43
+ if (isAaveV2Type(lender))
44
+ return buildAaveV2StyleLenderReserveCall(chainId, lender)
45
+ if (isAaveV3Type(lender))
46
+ return buildAaveV3StyleLenderReserveCall(chainId, lender)
47
+ if (isCompoundV3(lender))
48
+ return buildCompoundV3StyleLenderReserveCall(chainId, lender)
40
49
  if (isInit(lender)) return buildInitStyleLenderReserveCall(chainId, lender)
41
- return buildCompoundV3StyleLenderReserveCall(chainId, lender)
50
+ return []
42
51
  }
43
52
 
44
53
  function getLenderDataConverter(
@@ -46,44 +55,63 @@ function getLenderDataConverter(
46
55
  chainId: string,
47
56
  prices: { [a: string]: number },
48
57
  additionalYields: AdditionalYields,
49
- tokenList: GenericTokenList = {}
58
+ tokenList: GenericTokenList = {},
50
59
  ) {
51
- if (isAaveV2Type(lender)) return getAaveV2ReservesDataConverter(lender, chainId, prices, additionalYields, tokenList)
52
- if (isAaveV3Type(lender)) return getAaveV3ReservesDataConverter(lender, chainId, prices, additionalYields, tokenList)
53
- if (isInit(lender)) return getInitReservesDataConverter(lender, chainId, prices, additionalYields, tokenList)
54
- return getCompoundV3ReservesDataConverter(lender, chainId, prices, additionalYields, tokenList)
60
+ if (isAaveV2Type(lender))
61
+ return getAaveV2ReservesDataConverter(
62
+ lender,
63
+ chainId,
64
+ prices,
65
+ additionalYields,
66
+ tokenList,
67
+ )
68
+ if (isAaveV3Type(lender))
69
+ return getAaveV3ReservesDataConverter(
70
+ lender,
71
+ chainId,
72
+ prices,
73
+ additionalYields,
74
+ tokenList,
75
+ )
76
+ if (isCompoundV3(lender))
77
+ return getCompoundV3ReservesDataConverter(
78
+ lender,
79
+ chainId,
80
+ prices,
81
+ additionalYields,
82
+ tokenList,
83
+ )
84
+
85
+ if (isInit(lender))
86
+ return getInitReservesDataConverter(
87
+ lender,
88
+ chainId,
89
+ prices,
90
+ additionalYields,
91
+ tokenList,
92
+ )
93
+ return [() => null, 0] as any
55
94
  }
56
95
 
57
96
  const getAbi = (lender: string) => {
58
- if (isAaveV2Type(lender)) return [
59
- ...ProtocolDataProviderAbi,
60
- ...UniswapV2PairAbi,
61
- ...RewarderAbi,
62
- ...IncentivesControllerAbi
63
- ]
64
-
65
- if (isAaveV3Original(lender)) return [
66
- ...AavePoolV3UpgradedAbi,
67
- ...AaveV3ProtocolDataProviderAbi
68
- ]
69
- if (lender === Lender.YLDR) return [
70
- ...YLDRProtocolDataProviderAbi,
71
- ]
72
-
73
- if (isAaveV3Type(lender)) return [
74
- ...AavePoolLegacyAbi,
75
- ...AavePoolDataProviderLegacyAbi
76
- ]
77
-
78
-
79
- if (isCompoundV3(lender)) return [
80
- ...IrgetterAbi,
81
- ...CometAbi,
82
- ...CometExtAbi
83
- ]
97
+ if (isAaveV2Type(lender))
98
+ return [
99
+ ...ProtocolDataProviderAbi,
100
+ ...UniswapV2PairAbi,
101
+ ...RewarderAbi,
102
+ ...IncentivesControllerAbi,
103
+ ]
84
104
 
85
- if (isInit(lender))
86
- return InitLensAbi
105
+ if (isAaveV3Original(lender))
106
+ return [...AavePoolV3UpgradedAbi, ...AaveV3ProtocolDataProviderAbi]
107
+ if (lender === Lender.YLDR) return [...YLDRProtocolDataProviderAbi]
108
+
109
+ if (isAaveV3Type(lender))
110
+ return [...AavePoolLegacyAbi, ...AavePoolDataProviderLegacyAbi]
111
+
112
+ if (isCompoundV3(lender)) return [...IrgetterAbi, ...CometAbi, ...CometExtAbi]
113
+
114
+ if (isInit(lender)) return InitLensAbi
87
115
 
88
116
  return []
89
117
  }
@@ -94,7 +122,9 @@ export const getLenderPublicData = async (
94
122
  prices: { [asset: string]: number },
95
123
  additionalYields: AdditionalYields,
96
124
  multicallRetry: MulticallRetryFunction,
97
- tokenList: () => Promise<GenericTokenList> = async () => { return {} }
125
+ tokenList: () => Promise<GenericTokenList> = async () => {
126
+ return {}
127
+ },
98
128
  ): Promise<{ [lender: string]: any }> => {
99
129
  let calls: {
100
130
  call: Call
@@ -127,17 +157,24 @@ export const getLenderPublicData = async (
127
157
 
128
158
  let currentSlice = 0
129
159
  for (const lender of lenders) {
130
- const [converter, sliceLength] = getLenderDataConverter(lender, chainId, prices, additionalYields, list)
131
-
132
- const data = rawResults.slice(currentSlice, currentSlice + sliceLength)
133
- const convertedData = converter(data)
134
- if (!convertedData) {
135
- invalidLenders.push(lender)
136
- } else {
137
- lenderData[lender] = convertedData
160
+ const [converter, sliceLength] = getLenderDataConverter(
161
+ lender,
162
+ chainId,
163
+ prices,
164
+ additionalYields,
165
+ list,
166
+ )
167
+ if (sliceLength > 0) {
168
+ const data = rawResults.slice(currentSlice, currentSlice + sliceLength)
169
+ const convertedData = converter(data)
170
+ if (!convertedData) {
171
+ invalidLenders.push(lender)
172
+ } else {
173
+ lenderData[lender] = convertedData
174
+ }
175
+
176
+ currentSlice += sliceLength
138
177
  }
139
-
140
- currentSlice += sliceLength
141
178
  }
142
179
 
143
180
  return lenderData
@@ -0,0 +1,30 @@
1
+ import { AdditionalYields, MulticallRetryFunction } from '../types'
2
+ import { Lender } from '@1delta/asset-registry'
3
+ import { getLenderPublicData } from './fetchLender'
4
+ import { getLenderPublicDataViaApi } from './fetchLenderExt'
5
+ import { GenericTokenList } from './types'
6
+
7
+ const LENDERS_VIA_API: string[] = [Lender.MORPHO_BLUE]
8
+
9
+ export const getLenderPublicDataAll = async (
10
+ chainId: string,
11
+ lenders: Lender[],
12
+ prices: { [asset: string]: number },
13
+ additionalYields: AdditionalYields,
14
+ multicallRetry: MulticallRetryFunction,
15
+ tokenList?: () => Promise<GenericTokenList>
16
+ ): Promise<{ [lender: string]: any }> => {
17
+
18
+ const lendersApi = lenders.filter(l => LENDERS_VIA_API.includes(l))
19
+
20
+ const lendersOnChain = lenders.filter(l => !LENDERS_VIA_API.includes(l))
21
+
22
+ const onChain = getLenderPublicData(chainId, lendersOnChain, prices, additionalYields, multicallRetry, tokenList)
23
+
24
+ const api = getLenderPublicDataViaApi(chainId, lendersApi, prices, additionalYields, tokenList)
25
+
26
+ const [onChainRes, apiRes] = await Promise.all([onChain, api])
27
+
28
+ return { ...onChainRes, ...apiRes }
29
+
30
+ }
@@ -0,0 +1,82 @@
1
+ import { isMorphoType, isMultiMarket } from '../utils'
2
+ import { AdditionalYields } from '../types'
3
+ import { Lender } from '@1delta/asset-registry'
4
+ import { GenericTokenList } from './types'
5
+ import { fetchMorphoMarkets } from './morpho/fetchPublic'
6
+ import { convertMarketsToMorphoResponse } from './morpho/convertPublic'
7
+
8
+ async function getLenderDataFromApi(
9
+ lender: Lender,
10
+ chainId: string,
11
+ prices: { [a: string]: number },
12
+ additionalYields: AdditionalYields,
13
+ ) {
14
+ if (isMorphoType(lender)) return await fetchMorphoMarkets(chainId)
15
+ return {}
16
+ }
17
+
18
+ function convertLenderDataFromApi(
19
+ lender: Lender,
20
+ chainId: string,
21
+ data: any,
22
+ prices: { [a: string]: number },
23
+ additionalYields: AdditionalYields,
24
+ list: GenericTokenList = {},
25
+ ) {
26
+ if (isMorphoType(lender))
27
+ return convertMarketsToMorphoResponse(data, chainId, additionalYields, list)
28
+ return {}
29
+ }
30
+
31
+ export const getLenderPublicDataViaApi = async (
32
+ chainId: string,
33
+ lenders: Lender[],
34
+ prices: { [asset: string]: number },
35
+ additionalYields: AdditionalYields,
36
+ tokenList: () => Promise<GenericTokenList> = async () => {
37
+ return {}
38
+ },
39
+ ): Promise<{ [lender: string]: any }> => {
40
+ let promises: any[] = []
41
+ for (const lender of lenders) {
42
+ promises.push(
43
+ getLenderDataFromApi(lender, chainId, prices, additionalYields),
44
+ )
45
+ }
46
+
47
+ const [list, ...results] = await Promise.all([tokenList(), ...promises])
48
+
49
+ const lenderData: { [lender: string]: any } = {}
50
+ for (let i = 0; i < lenders.length; i++) {
51
+ try {
52
+ const lender = lenders[i]
53
+ if (isMultiMarket(lender)) {
54
+ const dataObtained = results[i]
55
+ const converted: any = convertLenderDataFromApi(
56
+ lender,
57
+ chainId,
58
+ dataObtained,
59
+ prices,
60
+ additionalYields,
61
+ list,
62
+ )
63
+ Object.keys(converted).forEach((marketId: string) => {
64
+ lenderData[marketId] = converted[marketId]
65
+ })
66
+ } else {
67
+ lenderData[lender] = convertLenderDataFromApi(
68
+ lender,
69
+ chainId,
70
+ results[i],
71
+ prices,
72
+ additionalYields,
73
+ list,
74
+ )
75
+ }
76
+ } catch (e) {
77
+ console.log('error fetching from API on', chainId, ':', e)
78
+ }
79
+ }
80
+
81
+ return lenderData
82
+ }
@@ -1,3 +1,5 @@
1
1
  export * from "./fetchLender"
2
+ export * from "./fetchLenderExt"
3
+ export * from "./fetchLenderAll"
2
4
  export * from "./user-data"
3
- export * from "./types"
5
+ export * from "./types"
@@ -0,0 +1,153 @@
1
+ import { formatUnits } from 'viem'
2
+ import {
3
+ MorphoGeneralPublicResponse,
4
+ RewardsMap,
5
+ GetMarketsResponse,
6
+ } from './types'
7
+ import { apyToApr } from '../user-data/utils'
8
+ import { AdditionalYields } from '../../types'
9
+ import { GenericTokenList } from '../types'
10
+
11
+ function parseLtv(ltv: number | string) {
12
+ let str = 0
13
+ try {
14
+ str = Number(formatUnits(BigInt(ltv), 18))
15
+ } catch (e) {}
16
+ return str
17
+ }
18
+
19
+ function formatNr(n: string, d: number) {
20
+ return Number(formatUnits(BigInt(n ?? 0), d))
21
+ }
22
+
23
+ export function convertMarketsToMorphoResponse(
24
+ response: GetMarketsResponse,
25
+ chainId: string,
26
+ additionalYields: AdditionalYields = {
27
+ intrinsicYields: {},
28
+ lenderRewards: {},
29
+ loaded: true,
30
+ },
31
+ tokens: GenericTokenList = {},
32
+ ): { [m: string]: MorphoGeneralPublicResponse } {
33
+ const data: { [m: string]: MorphoGeneralPublicResponse } = {}
34
+
35
+ response.markets.items.forEach((market) => {
36
+ const {
37
+ uniqueKey,
38
+ lltv,
39
+ irmAddress,
40
+ oracleAddress,
41
+ loanAsset,
42
+ collateralAsset,
43
+ state,
44
+ } = market
45
+ if (collateralAsset && loanAsset && oracleAddress) {
46
+ const m = 'MORPHO_BLUE_' + uniqueKey.slice(2).toUpperCase()
47
+ // @ts-ignore
48
+ if (!data[m]) data[m] = { data: {} }
49
+ // 1. LOAN asset entry
50
+ const loanRewards: RewardsMap = {}
51
+
52
+ // state.rewards?.forEach((reward) => {
53
+ // loanRewards[reward.asset.address] = {
54
+ // depositRate: formatNr(reward.amountPerSuppliedToken, reward.asset.decimals),
55
+ // variableBorrowRate: formatNr(reward.amountPerBorrowedToken, reward.asset.decimals),
56
+ // stableBorrowRate: 0,
57
+ // }
58
+ // })
59
+
60
+ const loanAssetAddress = loanAsset.address.toLowerCase()
61
+
62
+ const meta = tokens[loanAssetAddress] ?? loanAsset
63
+
64
+ data[m].data[loanAssetAddress] = {
65
+ poolId: loanAssetAddress,
66
+ underlying: loanAssetAddress,
67
+ asset: meta,
68
+ totalDeposits: formatNr(state.supplyAssets, loanAsset.decimals),
69
+ totalDebtStable: 0,
70
+ totalDebt: formatNr(state.borrowAssets, loanAsset.decimals),
71
+ totalDepositsUSD: Number(state.supplyAssetsUsd),
72
+ totalDebtStableUSD: 0,
73
+ totalDebtUSD: Number(state.borrowAssetsUsd),
74
+ depositRate: apyToApr(Number(state.supplyApy)) * 100,
75
+ variableBorrowRate: apyToApr(Number(state.borrowApy)) * 100,
76
+ stableBorrowRate: 0,
77
+ stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
78
+ rewards: Object.keys(loanRewards).length > 0 ? loanRewards : undefined,
79
+ decimals: loanAsset.decimals,
80
+ config: {
81
+ 0: {
82
+ category: 0,
83
+ borrowCollateralFactor: 0,
84
+ collateralFactor: 0,
85
+ borrowFactor: 1,
86
+ },
87
+ },
88
+ collateralActive: false,
89
+ borrowingEnabled: true,
90
+ hasStable: false,
91
+ isActive: true,
92
+ isFrozen: false,
93
+ }
94
+
95
+ const ltv = parseLtv(lltv)
96
+
97
+ const collateralAssetAddress = collateralAsset.address.toLowerCase()
98
+ const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset
99
+ // 2. COLLATERAL asset entry
100
+ data[m].data[collateralAssetAddress] = {
101
+ poolId: collateralAssetAddress,
102
+ underlying: collateralAssetAddress,
103
+ asset: metaCollateral,
104
+ totalDeposits: formatNr(
105
+ state.collateralAssets,
106
+ collateralAsset.decimals,
107
+ ),
108
+ totalDebtStable: 0,
109
+ totalDebt: 0,
110
+ totalDepositsUSD: Number(state.collateralAssetsUsd),
111
+ totalDebtStableUSD: 0,
112
+ totalDebtUSD: 0,
113
+ depositRate: 0,
114
+ variableBorrowRate: 0,
115
+ stableBorrowRate: 0,
116
+ stakingYield:
117
+ additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
118
+ rewards: undefined,
119
+ decimals: collateralAsset.decimals,
120
+ config: {
121
+ 0: {
122
+ category: 0,
123
+ borrowCollateralFactor: ltv,
124
+ collateralFactor: ltv,
125
+ borrowFactor: 1,
126
+ },
127
+ },
128
+ collateralActive: true,
129
+ borrowingEnabled: false,
130
+ hasStable: false,
131
+ isActive: true,
132
+ isFrozen: false,
133
+ }
134
+
135
+ data[m].params = {
136
+ market: {
137
+ lender: m,
138
+ collateralDecimals: collateralAsset.decimals,
139
+ loanDecimals: loanAsset.decimals,
140
+ id: uniqueKey,
141
+ lltv,
142
+ oracle: oracleAddress,
143
+ irm: irmAddress,
144
+ collateralAddress: collateralAsset.address,
145
+ loanAddress: loanAsset.address,
146
+ },
147
+ }
148
+ data[m].chainId = chainId
149
+ }
150
+ })
151
+
152
+ return data
153
+ }