@1delta/margin-fetcher 0.0.35 → 0.0.36
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/abis/morpho/lens.d.ts +38 -15
- package/dist/abis/morpho/lens.d.ts.map +1 -1
- package/dist/abis/morpho/lens.js +30 -20
- package/dist/flash-liquidity/assets.d.ts +2 -2
- package/dist/flash-liquidity/assets.d.ts.map +1 -1
- package/dist/flash-liquidity/assets.js +2 -2
- package/dist/flash-liquidity/fetchLiquidity.d.ts.map +1 -1
- package/dist/flash-liquidity/fetchLiquidity.js +2 -2
- package/dist/lending/fetchLender.d.ts.map +1 -1
- package/dist/lending/fetchLender.js +24 -5
- package/dist/lending/fetchLenderAll.d.ts.map +1 -1
- package/dist/lending/fetchLenderAll.js +15 -3
- package/dist/lending/morpho/chainsConfigs.d.ts +21 -0
- package/dist/lending/morpho/chainsConfigs.d.ts.map +1 -0
- package/dist/lending/morpho/chainsConfigs.js +234 -0
- package/dist/lending/morpho/constants/markets.d.ts +4 -0
- package/dist/lending/morpho/constants/markets.d.ts.map +1 -0
- package/dist/lending/morpho/constants/markets.js +63 -0
- package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
- package/dist/lending/morpho/convertPublic.js +2 -13
- package/dist/lending/morpho/getMarketsFromChain.d.ts +8 -0
- package/dist/lending/morpho/getMarketsFromChain.d.ts.map +1 -0
- package/dist/lending/morpho/getMarketsFromChain.js +318 -0
- package/dist/lending/morpho/publicCallBuild.d.ts +5 -0
- package/dist/lending/morpho/publicCallBuild.d.ts.map +1 -1
- package/dist/lending/morpho/publicCallBuild.js +16 -0
- package/dist/lending/morpho/utils/evmParser.d.ts +22 -0
- package/dist/lending/morpho/utils/evmParser.d.ts.map +1 -0
- package/dist/lending/morpho/utils/evmParser.js +103 -0
- package/dist/lending/morpho/utils/mathLib.d.ts +125 -0
- package/dist/lending/morpho/utils/mathLib.d.ts.map +1 -0
- package/dist/lending/morpho/utils/mathLib.js +334 -0
- package/dist/lending/morpho/utils/parsers.d.ts +10 -0
- package/dist/lending/morpho/utils/parsers.d.ts.map +1 -0
- package/dist/lending/morpho/utils/parsers.js +37 -0
- package/dist/lending/user-data/abis.d.ts +37 -14
- package/dist/lending/user-data/abis.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallBuild.d.ts +3 -0
- package/dist/lending/user-data/morpho/userCallBuild.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallBuild.js +9 -8
- package/dist/lending-pairs/computeLendingPairs.d.ts.map +1 -1
- package/dist/lending-pairs/computeLendingPairs.js +11 -7
- package/dist/prices/main-prices/fetchOracleData.d.ts +0 -2
- package/dist/prices/main-prices/fetchOracleData.d.ts.map +1 -1
- package/dist/prices/main-prices/fetchOracleData.js +2 -22
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -5
- package/dist/utils/parsing.d.ts +2 -0
- package/dist/utils/parsing.d.ts.map +1 -1
- package/dist/utils/parsing.js +20 -0
- package/package.json +1 -1
- package/src/abis/morpho/lens.ts +40 -30
- package/src/flash-liquidity/assets.ts +3 -2
- package/src/flash-liquidity/fetchLiquidity.ts +3 -2
- package/src/lending/fetchLender.ts +29 -4
- package/src/lending/fetchLenderAll.ts +32 -12
- package/src/lending/morpho/chainsConfigs.ts +268 -0
- package/src/lending/morpho/constants/markets.ts +64 -0
- package/src/lending/morpho/convertPublic.ts +2 -14
- package/src/lending/morpho/getMarketsFromChain.ts +402 -0
- package/src/lending/morpho/publicCallBuild.ts +17 -0
- package/src/lending/morpho/utils/evmParser.ts +122 -0
- package/src/lending/morpho/utils/mathLib.ts +434 -0
- package/src/lending/morpho/utils/parsers.ts +53 -0
- package/src/lending/user-data/morpho/userCallBuild.ts +9 -8
- package/src/lending-pairs/computeLendingPairs.ts +15 -10
- package/src/prices/main-prices/fetchOracleData.ts +2 -34
- package/src/utils/index.ts +3 -4
- package/src/utils/parsing.ts +32 -0
- package/test/lenderData.test.ts +1 -1
- package/test/mbChain.test.ts +44 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
import { morphoPools } from '@1delta/data-sdk'
|
|
2
|
+
import { getEvmClient } from '@1delta/providers'
|
|
3
|
+
import { formatEther, parseAbi } from 'viem'
|
|
4
|
+
import { MORPHO_LENS } from '../user-data/morpho/userCallBuild'
|
|
5
|
+
import { decodeMarkets } from './utils/evmParser'
|
|
6
|
+
import { AdditionalYields } from '../../types'
|
|
7
|
+
import { GenericTokenList } from '../types'
|
|
8
|
+
import { formatNr, parseLtv } from './utils/parsers'
|
|
9
|
+
import { MorphoGeneralPublicResponse } from './types'
|
|
10
|
+
import { toGenericPriceKey, toOracleKey } from '../../assets'
|
|
11
|
+
import { MathLib } from './utils/mathLib'
|
|
12
|
+
import { apyToApr } from '../user-data/utils'
|
|
13
|
+
import { formatMorphoPrice } from '../../utils/parsing'
|
|
14
|
+
import { MORPHO_MARKETS } from './constants/markets'
|
|
15
|
+
|
|
16
|
+
export async function getMarkets(
|
|
17
|
+
chainId: string,
|
|
18
|
+
markets: string[],
|
|
19
|
+
additionalYields: AdditionalYields = {
|
|
20
|
+
intrinsicYields: {},
|
|
21
|
+
lenderRewards: {},
|
|
22
|
+
loaded: true,
|
|
23
|
+
},
|
|
24
|
+
tokens: GenericTokenList = {},
|
|
25
|
+
prices: any,
|
|
26
|
+
) {
|
|
27
|
+
const abi = parseAbi([
|
|
28
|
+
'function getMarketDataCompact(address morpho, bytes32[] calldata marketsIds) external view returns (bytes memory data)',
|
|
29
|
+
])
|
|
30
|
+
const provider = getEvmClient(chainId)
|
|
31
|
+
|
|
32
|
+
const mb = morphoPools()?.MORPHO_BLUE?.[chainId]
|
|
33
|
+
if (!mb) return []
|
|
34
|
+
|
|
35
|
+
const returnData = await provider.simulateContract({
|
|
36
|
+
abi,
|
|
37
|
+
functionName: 'getMarketDataCompact',
|
|
38
|
+
address: MORPHO_LENS[chainId] as any,
|
|
39
|
+
args: [mb, markets] as any,
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const decoded = decodeMarkets(returnData.result ?? '0x')
|
|
43
|
+
|
|
44
|
+
const data: { [m: string]: MorphoGeneralPublicResponse } = {}
|
|
45
|
+
decoded.forEach((market, i) => {
|
|
46
|
+
const uniqueKey = markets[i]
|
|
47
|
+
const { lltv, irm, oracle, loanToken, collateralToken, ...state } = market
|
|
48
|
+
if (collateralToken && loanToken && oracle) {
|
|
49
|
+
const m = 'MORPHO_BLUE_' + uniqueKey.slice(2).toUpperCase()
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
if (!data[m]) data[m] = { data: {} }
|
|
52
|
+
// 1. LOAN asset entry
|
|
53
|
+
const loanRewards: any = {}
|
|
54
|
+
|
|
55
|
+
// state.rewards?.forEach((reward) => {
|
|
56
|
+
// loanRewards[reward.asset.address] = {
|
|
57
|
+
// depositRate: formatNr(reward.amountPerSuppliedToken, reward.asset.decimals),
|
|
58
|
+
// variableBorrowRate: formatNr(reward.amountPerBorrowedToken, reward.asset.decimals),
|
|
59
|
+
// stableBorrowRate: 0,
|
|
60
|
+
// }
|
|
61
|
+
// })
|
|
62
|
+
|
|
63
|
+
// get assets from list
|
|
64
|
+
const loanAsset = tokens[loanToken.toLowerCase()]
|
|
65
|
+
const collateralAsset = tokens[collateralToken.toLowerCase()]
|
|
66
|
+
|
|
67
|
+
const loanKey =
|
|
68
|
+
toOracleKey(loanAsset?.assetGroup!) ??
|
|
69
|
+
toGenericPriceKey(loanAsset.address, chainId)
|
|
70
|
+
|
|
71
|
+
let loanPrice = prices[loanKey]
|
|
72
|
+
|
|
73
|
+
// try to infer loan price from collateral price if any
|
|
74
|
+
if (!loanPrice) {
|
|
75
|
+
const collateralKey =
|
|
76
|
+
toOracleKey(collateralAsset?.assetGroup!) ??
|
|
77
|
+
toGenericPriceKey(collateralAsset.address, chainId)
|
|
78
|
+
const collateralPrice = prices[collateralKey]
|
|
79
|
+
// get debt price by collateral price
|
|
80
|
+
if (collateralPrice) {
|
|
81
|
+
const priceDebtToCollateral = formatMorphoPrice(
|
|
82
|
+
state.price.toString(),
|
|
83
|
+
loanAsset.decimals,
|
|
84
|
+
collateralAsset.decimals,
|
|
85
|
+
)
|
|
86
|
+
loanPrice = collateralPrice / priceDebtToCollateral
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const loanTokenAddress = loanAsset.address.toLowerCase()
|
|
91
|
+
|
|
92
|
+
const meta = tokens[loanTokenAddress] ?? loanAsset
|
|
93
|
+
const totalDeposits = formatNr(
|
|
94
|
+
state.totalSupplyAssets,
|
|
95
|
+
loanAsset.decimals,
|
|
96
|
+
)
|
|
97
|
+
const totalDebt = formatNr(state.totalBorrowAssets, loanAsset.decimals)
|
|
98
|
+
|
|
99
|
+
const utilization = MathLib.getUtilization({
|
|
100
|
+
totalBorrowAssets: state.totalBorrowAssets,
|
|
101
|
+
totalSupplyAssets: state.totalSupplyAssets,
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
let borrowApy = 0n
|
|
105
|
+
let supplyApy = 0n
|
|
106
|
+
|
|
107
|
+
try {
|
|
108
|
+
borrowApy = MathLib.getBorrowApy(
|
|
109
|
+
state.rateAtTarget,
|
|
110
|
+
utilization,
|
|
111
|
+
undefined,
|
|
112
|
+
Number(state.lastUpdate),
|
|
113
|
+
)
|
|
114
|
+
supplyApy = MathLib.getSupplyApy(borrowApy, utilization, state.fee)
|
|
115
|
+
} catch {}
|
|
116
|
+
const borrowApr = apyToApr(Number(formatEther(borrowApy))) * 100
|
|
117
|
+
const depositApr = apyToApr(Number(formatEther(supplyApy))) * 100
|
|
118
|
+
|
|
119
|
+
data[m].data[loanTokenAddress] = {
|
|
120
|
+
poolId: loanTokenAddress,
|
|
121
|
+
underlying: loanTokenAddress,
|
|
122
|
+
asset: meta,
|
|
123
|
+
totalDeposits,
|
|
124
|
+
totalDebtStable: 0,
|
|
125
|
+
totalDebt,
|
|
126
|
+
totalDepositsUSD: totalDeposits * loanPrice,
|
|
127
|
+
totalDebtStableUSD: 0,
|
|
128
|
+
totalLiquidity: totalDeposits - totalDebt,
|
|
129
|
+
totalLiquidityUSD: (totalDeposits - totalDebt) * loanPrice,
|
|
130
|
+
totalDebtUSD: totalDebt * loanPrice,
|
|
131
|
+
depositRate: depositApr,
|
|
132
|
+
variableBorrowRate: borrowApr,
|
|
133
|
+
stableBorrowRate: 0,
|
|
134
|
+
stakingYield: additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
|
|
135
|
+
rewards: Object.keys(loanRewards).length > 0 ? loanRewards : undefined,
|
|
136
|
+
decimals: loanAsset.decimals,
|
|
137
|
+
config: {
|
|
138
|
+
0: {
|
|
139
|
+
category: 0,
|
|
140
|
+
borrowCollateralFactor: 0,
|
|
141
|
+
collateralFactor: 0,
|
|
142
|
+
borrowFactor: 1,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
collateralActive: false,
|
|
146
|
+
borrowingEnabled: true,
|
|
147
|
+
hasStable: false,
|
|
148
|
+
isActive: true,
|
|
149
|
+
isFrozen: false,
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const ltv = parseLtv(lltv)
|
|
153
|
+
|
|
154
|
+
const collateralAssetAddress = collateralAsset.address.toLowerCase()
|
|
155
|
+
const metaCollateral = tokens[collateralAssetAddress] ?? collateralAsset
|
|
156
|
+
// 2. COLLATERAL asset entry
|
|
157
|
+
data[m].data[collateralAssetAddress] = {
|
|
158
|
+
poolId: collateralAssetAddress,
|
|
159
|
+
underlying: collateralAssetAddress,
|
|
160
|
+
asset: metaCollateral,
|
|
161
|
+
totalDeposits: 0, // we do not have these metrics when querying on-chain
|
|
162
|
+
totalDebtStable: 0,
|
|
163
|
+
totalDebt: 0,
|
|
164
|
+
totalLiquidity: 0,
|
|
165
|
+
totalLiquidityUSD: 0,
|
|
166
|
+
totalDepositsUSD: 0,
|
|
167
|
+
totalDebtStableUSD: 0,
|
|
168
|
+
totalDebtUSD: 0,
|
|
169
|
+
depositRate: 0,
|
|
170
|
+
variableBorrowRate: 0,
|
|
171
|
+
stableBorrowRate: 0,
|
|
172
|
+
stakingYield:
|
|
173
|
+
additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
|
|
174
|
+
rewards: undefined,
|
|
175
|
+
decimals: collateralAsset.decimals,
|
|
176
|
+
config: {
|
|
177
|
+
0: {
|
|
178
|
+
category: 0,
|
|
179
|
+
borrowCollateralFactor: ltv,
|
|
180
|
+
collateralFactor: ltv,
|
|
181
|
+
borrowFactor: 1,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
collateralActive: true,
|
|
185
|
+
borrowingEnabled: false,
|
|
186
|
+
hasStable: false,
|
|
187
|
+
isActive: true,
|
|
188
|
+
isFrozen: false,
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
data[m].params = {
|
|
192
|
+
market: {
|
|
193
|
+
lender: m,
|
|
194
|
+
collateralDecimals: collateralAsset.decimals,
|
|
195
|
+
loanDecimals: loanAsset.decimals,
|
|
196
|
+
id: uniqueKey,
|
|
197
|
+
lltv: lltv.toString(),
|
|
198
|
+
oracle: oracle,
|
|
199
|
+
irm: irm,
|
|
200
|
+
collateralAddress: collateralAssetAddress,
|
|
201
|
+
loanAddress: loanTokenAddress,
|
|
202
|
+
},
|
|
203
|
+
}
|
|
204
|
+
data[m].chainId = chainId
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
|
|
208
|
+
return data
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export function getMorphoMarketDataConverter(
|
|
212
|
+
lender: string,
|
|
213
|
+
chainId: string,
|
|
214
|
+
prices: any,
|
|
215
|
+
additionalYields: AdditionalYields = {
|
|
216
|
+
intrinsicYields: {},
|
|
217
|
+
lenderRewards: {},
|
|
218
|
+
loaded: true,
|
|
219
|
+
},
|
|
220
|
+
tokens: GenericTokenList = {},
|
|
221
|
+
): [(data: any[]) => any | undefined, number] {
|
|
222
|
+
const markets = MORPHO_MARKETS[chainId] ?? []
|
|
223
|
+
return [
|
|
224
|
+
(rData: any[]) => {
|
|
225
|
+
const decoded = decodeMarkets(rData[0] ?? '0x')
|
|
226
|
+
|
|
227
|
+
const data: { [m: string]: MorphoGeneralPublicResponse } = {}
|
|
228
|
+
decoded.forEach((market, i) => {
|
|
229
|
+
const uniqueKey = markets[i]
|
|
230
|
+
const { lltv, irm, oracle, loanToken, collateralToken, ...state } =
|
|
231
|
+
market
|
|
232
|
+
if (collateralToken && loanToken && oracle) {
|
|
233
|
+
const m = 'MORPHO_BLUE_' + uniqueKey.slice(2).toUpperCase()
|
|
234
|
+
// @ts-ignore
|
|
235
|
+
if (!data[m]) data[m] = { data: {} }
|
|
236
|
+
// 1. LOAN asset entry
|
|
237
|
+
const loanRewards: any = {}
|
|
238
|
+
|
|
239
|
+
// state.rewards?.forEach((reward) => {
|
|
240
|
+
// loanRewards[reward.asset.address] = {
|
|
241
|
+
// depositRate: formatNr(reward.amountPerSuppliedToken, reward.asset.decimals),
|
|
242
|
+
// variableBorrowRate: formatNr(reward.amountPerBorrowedToken, reward.asset.decimals),
|
|
243
|
+
// stableBorrowRate: 0,
|
|
244
|
+
// }
|
|
245
|
+
// })
|
|
246
|
+
|
|
247
|
+
// get assets from list
|
|
248
|
+
const loanAsset = tokens[loanToken.toLowerCase()]
|
|
249
|
+
const collateralAsset = tokens[collateralToken.toLowerCase()]
|
|
250
|
+
|
|
251
|
+
const loanKey =
|
|
252
|
+
toOracleKey(loanAsset?.assetGroup!) ??
|
|
253
|
+
toGenericPriceKey(loanAsset.address, chainId)
|
|
254
|
+
|
|
255
|
+
let loanPrice = prices[loanKey]
|
|
256
|
+
|
|
257
|
+
// try to infer loan price from collateral price if any
|
|
258
|
+
if (!loanPrice) {
|
|
259
|
+
const collateralKey =
|
|
260
|
+
toOracleKey(collateralAsset?.assetGroup!) ??
|
|
261
|
+
toGenericPriceKey(collateralAsset.address, chainId)
|
|
262
|
+
const collateralPrice = prices[collateralKey]
|
|
263
|
+
// get debt price by collateral price
|
|
264
|
+
if (collateralPrice) {
|
|
265
|
+
const priceDebtToCollateral = formatMorphoPrice(
|
|
266
|
+
state.price.toString(),
|
|
267
|
+
loanAsset.decimals,
|
|
268
|
+
collateralAsset.decimals,
|
|
269
|
+
)
|
|
270
|
+
loanPrice = collateralPrice / priceDebtToCollateral
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const loanTokenAddress = loanAsset.address.toLowerCase()
|
|
275
|
+
|
|
276
|
+
const meta = tokens[loanTokenAddress] ?? loanAsset
|
|
277
|
+
const totalDeposits = formatNr(
|
|
278
|
+
state.totalSupplyAssets,
|
|
279
|
+
loanAsset.decimals,
|
|
280
|
+
)
|
|
281
|
+
const totalDebt = formatNr(
|
|
282
|
+
state.totalBorrowAssets,
|
|
283
|
+
loanAsset.decimals,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
const utilization = MathLib.getUtilization({
|
|
287
|
+
totalBorrowAssets: state.totalBorrowAssets,
|
|
288
|
+
totalSupplyAssets: state.totalSupplyAssets,
|
|
289
|
+
})
|
|
290
|
+
|
|
291
|
+
let borrowApy = 0n
|
|
292
|
+
let supplyApy = 0n
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
borrowApy = MathLib.getBorrowApy(
|
|
296
|
+
state.rateAtTarget,
|
|
297
|
+
utilization,
|
|
298
|
+
undefined,
|
|
299
|
+
Number(state.lastUpdate),
|
|
300
|
+
)
|
|
301
|
+
supplyApy = MathLib.getSupplyApy(borrowApy, utilization, state.fee)
|
|
302
|
+
} catch {}
|
|
303
|
+
const borrowApr = apyToApr(Number(formatEther(borrowApy))) * 100
|
|
304
|
+
const depositApr = apyToApr(Number(formatEther(supplyApy))) * 100
|
|
305
|
+
|
|
306
|
+
data[m].data[loanTokenAddress] = {
|
|
307
|
+
poolId: loanTokenAddress,
|
|
308
|
+
underlying: loanTokenAddress,
|
|
309
|
+
asset: meta,
|
|
310
|
+
totalDeposits,
|
|
311
|
+
totalDebtStable: 0,
|
|
312
|
+
totalDebt,
|
|
313
|
+
totalDepositsUSD: totalDeposits * loanPrice,
|
|
314
|
+
totalDebtStableUSD: 0,
|
|
315
|
+
totalLiquidity: totalDeposits - totalDebt,
|
|
316
|
+
totalLiquidityUSD: (totalDeposits - totalDebt) * loanPrice,
|
|
317
|
+
totalDebtUSD: totalDebt * loanPrice,
|
|
318
|
+
depositRate: depositApr,
|
|
319
|
+
variableBorrowRate: borrowApr,
|
|
320
|
+
stableBorrowRate: 0,
|
|
321
|
+
stakingYield:
|
|
322
|
+
additionalYields.intrinsicYields[meta?.assetGroup] ?? 0,
|
|
323
|
+
rewards:
|
|
324
|
+
Object.keys(loanRewards).length > 0 ? loanRewards : undefined,
|
|
325
|
+
decimals: loanAsset.decimals,
|
|
326
|
+
config: {
|
|
327
|
+
0: {
|
|
328
|
+
category: 0,
|
|
329
|
+
borrowCollateralFactor: 0,
|
|
330
|
+
collateralFactor: 0,
|
|
331
|
+
borrowFactor: 1,
|
|
332
|
+
},
|
|
333
|
+
},
|
|
334
|
+
collateralActive: false,
|
|
335
|
+
borrowingEnabled: true,
|
|
336
|
+
hasStable: false,
|
|
337
|
+
isActive: true,
|
|
338
|
+
isFrozen: false,
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
const ltv = parseLtv(lltv)
|
|
342
|
+
|
|
343
|
+
const collateralAssetAddress = collateralAsset.address.toLowerCase()
|
|
344
|
+
const metaCollateral =
|
|
345
|
+
tokens[collateralAssetAddress] ?? collateralAsset
|
|
346
|
+
// 2. COLLATERAL asset entry
|
|
347
|
+
data[m].data[collateralAssetAddress] = {
|
|
348
|
+
poolId: collateralAssetAddress,
|
|
349
|
+
underlying: collateralAssetAddress,
|
|
350
|
+
asset: metaCollateral,
|
|
351
|
+
totalDeposits: 0, // we do not have these metrics when querying on-chain
|
|
352
|
+
totalDebtStable: 0,
|
|
353
|
+
totalDebt: 0,
|
|
354
|
+
totalLiquidity: 0,
|
|
355
|
+
totalLiquidityUSD: 0,
|
|
356
|
+
totalDepositsUSD: 0,
|
|
357
|
+
totalDebtStableUSD: 0,
|
|
358
|
+
totalDebtUSD: 0,
|
|
359
|
+
depositRate: 0,
|
|
360
|
+
variableBorrowRate: 0,
|
|
361
|
+
stableBorrowRate: 0,
|
|
362
|
+
stakingYield:
|
|
363
|
+
additionalYields.intrinsicYields[metaCollateral?.assetGroup] ?? 0,
|
|
364
|
+
rewards: undefined,
|
|
365
|
+
decimals: collateralAsset.decimals,
|
|
366
|
+
config: {
|
|
367
|
+
0: {
|
|
368
|
+
category: 0,
|
|
369
|
+
borrowCollateralFactor: ltv,
|
|
370
|
+
collateralFactor: ltv,
|
|
371
|
+
borrowFactor: 1,
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
collateralActive: true,
|
|
375
|
+
borrowingEnabled: false,
|
|
376
|
+
hasStable: false,
|
|
377
|
+
isActive: true,
|
|
378
|
+
isFrozen: false,
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
data[m].params = {
|
|
382
|
+
market: {
|
|
383
|
+
lender: m,
|
|
384
|
+
collateralDecimals: collateralAsset.decimals,
|
|
385
|
+
loanDecimals: loanAsset.decimals,
|
|
386
|
+
id: uniqueKey,
|
|
387
|
+
lltv: lltv.toString(),
|
|
388
|
+
oracle: oracle,
|
|
389
|
+
irm: irm,
|
|
390
|
+
collateralAddress: collateralAssetAddress,
|
|
391
|
+
loanAddress: loanTokenAddress,
|
|
392
|
+
},
|
|
393
|
+
}
|
|
394
|
+
data[m].chainId = chainId
|
|
395
|
+
}
|
|
396
|
+
})
|
|
397
|
+
|
|
398
|
+
return data
|
|
399
|
+
},
|
|
400
|
+
markets.length > 0 ? 1 : 0,
|
|
401
|
+
]
|
|
402
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { morphoPools } from '@1delta/data-sdk'
|
|
1
2
|
import { AdditionalYields } from '../../types'
|
|
3
|
+
import { MORPHO_LENS } from '../user-data/morpho/userCallBuild'
|
|
4
|
+
import { MORPHO_MARKETS } from './constants/markets'
|
|
2
5
|
import { convertMarketsToMorphoResponse } from './convertPublic'
|
|
3
6
|
import { fetchMorphoMarkets } from './fetchPublic'
|
|
4
7
|
|
|
@@ -13,3 +16,17 @@ export async function fetchMorphoPublicData(
|
|
|
13
16
|
const mbData = await fetchMorphoMarkets(chainId)
|
|
14
17
|
return convertMarketsToMorphoResponse(mbData, chainId, yields)
|
|
15
18
|
}
|
|
19
|
+
|
|
20
|
+
export function buildMorphoCall(chainId: string) {
|
|
21
|
+
const markets = MORPHO_MARKETS[chainId] ?? []
|
|
22
|
+
const mb = morphoPools()?.MORPHO_BLUE?.[chainId]
|
|
23
|
+
if (!mb || markets.length === 0) return []
|
|
24
|
+
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
address: MORPHO_LENS[chainId],
|
|
28
|
+
name: 'getMarketDataCompact',
|
|
29
|
+
params: [mb, markets],
|
|
30
|
+
},
|
|
31
|
+
]
|
|
32
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
type Market = {
|
|
2
|
+
loanToken: string; // 20 bytes (EVM address, hex)
|
|
3
|
+
collateralToken: string; // 20 bytes (EVM address, hex)
|
|
4
|
+
oracle: string; // 20 bytes (EVM address, hex)
|
|
5
|
+
irm: string; // 20 bytes (EVM address, hex)
|
|
6
|
+
lltv: bigint; // 16 bytes
|
|
7
|
+
price: bigint; // 32 bytes
|
|
8
|
+
rateAtTarget: bigint; // 32 bytes
|
|
9
|
+
totalSupplyAssets: bigint; // 16 bytes
|
|
10
|
+
totalSupplyShares: bigint; // 16 bytes
|
|
11
|
+
totalBorrowAssets: bigint; // 16 bytes
|
|
12
|
+
totalBorrowShares: bigint; // 16 bytes
|
|
13
|
+
lastUpdate: bigint; // 16 bytes
|
|
14
|
+
fee: bigint; // 16 bytes
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const FIELD_SIZES = {
|
|
18
|
+
addr: 20,
|
|
19
|
+
u128: 16,
|
|
20
|
+
u256: 32,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const RECORD_SIZE =
|
|
24
|
+
4 * FIELD_SIZES.addr + // loanToken, collateralToken, oracle, irm
|
|
25
|
+
1 * FIELD_SIZES.u128 + // lltv
|
|
26
|
+
2 * FIELD_SIZES.u256 + // price, rateAtTarget
|
|
27
|
+
5 * FIELD_SIZES.u128 + // totals (4) + lastUpdate
|
|
28
|
+
1 * FIELD_SIZES.u128; // fee
|
|
29
|
+
// = 256 bytes
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Decode packed markets bytes into typed objects.
|
|
33
|
+
* Integers are parsed as big-endian BigInt. Addresses are 0x-prefixed lowercase hex.
|
|
34
|
+
*/
|
|
35
|
+
export function decodeMarkets(input: string | Uint8Array): Market[] {
|
|
36
|
+
const bytes = normalizeToBytes(input);
|
|
37
|
+
|
|
38
|
+
if (bytes.length % RECORD_SIZE !== 0) {
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Invalid data length ${bytes.length}; not a multiple of ${RECORD_SIZE} bytes per record`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const markets: Market[] = [];
|
|
45
|
+
for (let i = 0; i < bytes.length; i += RECORD_SIZE) {
|
|
46
|
+
let o = i;
|
|
47
|
+
|
|
48
|
+
const loanToken = readAddress(bytes, o, FIELD_SIZES.addr); o += FIELD_SIZES.addr;
|
|
49
|
+
const collateralToken = readAddress(bytes, o, FIELD_SIZES.addr); o += FIELD_SIZES.addr;
|
|
50
|
+
const oracle = readAddress(bytes, o, FIELD_SIZES.addr); o += FIELD_SIZES.addr;
|
|
51
|
+
const irm = readAddress(bytes, o, FIELD_SIZES.addr); o += FIELD_SIZES.addr;
|
|
52
|
+
|
|
53
|
+
const lltv = readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
54
|
+
const price = readUintBE(bytes, o, FIELD_SIZES.u256); o += FIELD_SIZES.u256;
|
|
55
|
+
const rateAtTarget = readUintBE(bytes, o, FIELD_SIZES.u256); o += FIELD_SIZES.u256;
|
|
56
|
+
|
|
57
|
+
const totalSupplyAssets= readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
58
|
+
const totalSupplyShares= readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
59
|
+
const totalBorrowAssets= readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
60
|
+
const totalBorrowShares= readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
61
|
+
const lastUpdate = readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
62
|
+
const fee = readUintBE(bytes, o, FIELD_SIZES.u128); o += FIELD_SIZES.u128;
|
|
63
|
+
|
|
64
|
+
markets.push({
|
|
65
|
+
loanToken,
|
|
66
|
+
collateralToken,
|
|
67
|
+
oracle,
|
|
68
|
+
irm,
|
|
69
|
+
lltv,
|
|
70
|
+
price,
|
|
71
|
+
rateAtTarget,
|
|
72
|
+
totalSupplyAssets,
|
|
73
|
+
totalSupplyShares,
|
|
74
|
+
totalBorrowAssets,
|
|
75
|
+
totalBorrowShares,
|
|
76
|
+
lastUpdate,
|
|
77
|
+
fee,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return markets;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ---------- helpers ----------
|
|
85
|
+
|
|
86
|
+
function normalizeToBytes(input: string | Uint8Array): Uint8Array {
|
|
87
|
+
if (typeof input !== "string") {
|
|
88
|
+
return input;
|
|
89
|
+
}
|
|
90
|
+
let hex = input.startsWith("0x") ? input.slice(2) : input;
|
|
91
|
+
if (hex.length % 2 !== 0) throw new Error("Hex string must have even length");
|
|
92
|
+
const out = new Uint8Array(hex.length / 2);
|
|
93
|
+
for (let i = 0; i < out.length; i++) {
|
|
94
|
+
out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
95
|
+
}
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function readAddress(bytes: Uint8Array, offset: number, len: number): string {
|
|
100
|
+
// Addresses are the raw 20 bytes, render as 0x + 40 hex chars (lowercase).
|
|
101
|
+
const hex = toHex(bytes.subarray(offset, offset + len));
|
|
102
|
+
return "0x" + hex;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function readUintBE(bytes: Uint8Array, offset: number, len: number): bigint {
|
|
106
|
+
// Big-endian: (((b0 * 256) + b1) * 256 + ...) pattern.
|
|
107
|
+
let v = 0n;
|
|
108
|
+
const end = offset + len;
|
|
109
|
+
for (let i = offset; i < end; i++) {
|
|
110
|
+
v = (v << 8n) | BigInt(bytes[i]);
|
|
111
|
+
}
|
|
112
|
+
return v;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function toHex(arr: Uint8Array): string {
|
|
116
|
+
let s = "";
|
|
117
|
+
for (let i = 0; i < arr.length; i++) {
|
|
118
|
+
const h = arr[i].toString(16).padStart(2, "0");
|
|
119
|
+
s += h;
|
|
120
|
+
}
|
|
121
|
+
return s;
|
|
122
|
+
}
|