@1delta/margin-fetcher 0.0.15 → 0.0.17
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/oracle/ProxyOracle.d.ts +12 -0
- package/dist/abis/oracle/ProxyOracle.d.ts.map +1 -0
- package/dist/abis/oracle/ProxyOracle.js +15 -0
- package/dist/lending/aave-v3-type/publicCallParse.d.ts +4 -4
- package/dist/lending/aave-v3-type/publicCallParse.d.ts.map +1 -1
- package/dist/lending/aave-v3-type/publicCallParse.js +68 -44
- package/dist/lending/fetchLender.d.ts.map +1 -1
- package/dist/lending/morpho/convertPublic.d.ts.map +1 -1
- package/dist/lending/morpho/convertPublic.js +8 -2
- package/dist/lending/morpho/fetchPublic.d.ts.map +1 -1
- package/dist/lending/morpho/types.d.ts +2 -0
- package/dist/lending/morpho/types.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallParse.d.ts.map +1 -1
- package/dist/lending/user-data/morpho/userCallParse.js +60 -0
- package/dist/prices/main-prices/addresses/morpho.d.ts +11 -0
- package/dist/prices/main-prices/addresses/morpho.d.ts.map +1 -0
- package/dist/prices/main-prices/addresses/morpho.js +903 -0
- package/dist/prices/main-prices/fetchOracleData.d.ts +1 -0
- package/dist/prices/main-prices/fetchOracleData.d.ts.map +1 -1
- package/dist/prices/main-prices/fetchOracleData.js +70 -4
- package/dist/types/providers.d.ts +1 -1
- package/dist/types/providers.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/abis/oracle/ProxyOracle.ts +15 -0
- package/src/lending/aave-v3-type/publicCallParse.ts +312 -110
- package/src/lending/fetchLender.ts +1 -0
- package/src/lending/morpho/convertPublic.ts +10 -3
- package/src/lending/morpho/fetchPublic.ts +0 -1
- package/src/lending/morpho/types.ts +5 -0
- package/src/lending/user-data/morpho/userCallParse.ts +63 -0
- package/src/prices/main-prices/addresses/morpho.ts +912 -0
- package/src/prices/main-prices/fetchOracleData.ts +120 -8
- package/src/types/providers.ts +4 -3
- package/test/mainPriceMB.test.ts +32 -0
- package/test/morpho.ts +66 -0
- package/test/morphoPrice.test.ts +31 -0
- package/test/userDataAll.test.ts +82 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const ProxyOracleAbi: readonly [{
|
|
2
|
+
readonly inputs: readonly [];
|
|
3
|
+
readonly name: "price";
|
|
4
|
+
readonly outputs: readonly [{
|
|
5
|
+
readonly internalType: "uint256";
|
|
6
|
+
readonly name: "";
|
|
7
|
+
readonly type: "uint256";
|
|
8
|
+
}];
|
|
9
|
+
readonly stateMutability: "view";
|
|
10
|
+
readonly type: "function";
|
|
11
|
+
}];
|
|
12
|
+
//# sourceMappingURL=ProxyOracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProxyOracle.d.ts","sourceRoot":"","sources":["../../../src/abis/oracle/ProxyOracle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;;EAcjB,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AaveV3GeneralPublicResponse } from
|
|
2
|
-
import { AdditionalYields } from
|
|
3
|
-
import { Lender } from
|
|
4
|
-
import { GenericTokenList } from
|
|
1
|
+
import { AaveV3GeneralPublicResponse } from './types';
|
|
2
|
+
import { AdditionalYields } from '../../types';
|
|
3
|
+
import { Lender } from '@1delta/asset-registry';
|
|
4
|
+
import { GenericTokenList } from '../types';
|
|
5
5
|
export declare const getAaveV3ReservesDataConverter: (lender: Lender, chainId: string, prices: {
|
|
6
6
|
[asset: string]: number;
|
|
7
7
|
}, additionalYields: AdditionalYields, tokenList?: GenericTokenList) => [(data: any[]) => AaveV3GeneralPublicResponse | undefined, number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publicCallParse.d.ts","sourceRoot":"","sources":["../../../src/lending/aave-v3-type/publicCallParse.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"publicCallParse.d.ts","sourceRoot":"","sources":["../../../src/lending/aave-v3-type/publicCallParse.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAK5B,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAQ/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,eAAO,MAAM,8BAA8B,GACzC,QAAQ,MAAM,EACd,SAAS,MAAM,EACf,QAAQ;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACnC,kBAAkB,gBAAgB,EAClC,YAAW,gBAAqB,KAC/B,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,2BAA2B,GAAG,SAAS,EAAE,MAAM,CA2MnE,CAAA;AA0BD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,GAAG,EACrB,MAAM,EAAE,GAAG,EACX,SAAS,EAAE,GAAG,GACb,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,SAAS,EAAE,MAAM,CAAC,CA0H5C"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { AaveV3GetreserveConfigDataIndexes, AaveV3GetReservesIndexes, YLDRTypeGetReserveConfigurationData, YLDRTypeGetReserveDataIndexes } from
|
|
2
|
-
import { AAVE_V3_EMODES } from
|
|
3
|
-
import { BPS, formatAaveRawApyToApr, parseRawAmount } from
|
|
4
|
-
import { Lender } from
|
|
5
|
-
import { getAaveAssets, getAssetMeta, LENDER_MODE_NO_MODE, toGenericPriceKey, toOracleKey } from
|
|
1
|
+
import { AaveV3GetreserveConfigDataIndexes, AaveV3GetReservesIndexes, YLDRTypeGetReserveConfigurationData, YLDRTypeGetReserveDataIndexes, } from './types';
|
|
2
|
+
import { AAVE_V3_EMODES } from './publicCallBuild';
|
|
3
|
+
import { BPS, formatAaveRawApyToApr, parseRawAmount } from '../../utils/parsing';
|
|
4
|
+
import { Lender } from '@1delta/asset-registry';
|
|
5
|
+
import { getAaveAssets, getAssetMeta, LENDER_MODE_NO_MODE, toGenericPriceKey, toOracleKey, } from '../../assets';
|
|
6
6
|
export const getAaveV3ReservesDataConverter = (lender, chainId, prices, additionalYields, tokenList = {}) => {
|
|
7
|
-
if (lender.
|
|
7
|
+
if (lender.startsWith('AAVE_V3'))
|
|
8
8
|
return parseAave32(chainId, lender, prices, additionalYields, tokenList);
|
|
9
9
|
switch (lender) {
|
|
10
10
|
/** AAVE V3 style with rewards from state */
|
|
11
|
-
case Lender.YLDR:
|
|
11
|
+
case Lender.YLDR:
|
|
12
|
+
return parseYLDRCall(chainId, lender, additionalYields, prices, tokenList);
|
|
12
13
|
default: {
|
|
13
14
|
const assetsToQuery = getAaveAssets(chainId, lender);
|
|
14
15
|
const expectedNumberOfCalls = assetsToQuery.length * 6 + AAVE_V3_EMODES.length + 1;
|
|
@@ -29,7 +30,7 @@ export const getAaveV3ReservesDataConverter = (lender, chainId, prices, addition
|
|
|
29
30
|
label: rawCfg.label,
|
|
30
31
|
borrowCollateralFactor: rawCfg.ltv / BPS,
|
|
31
32
|
collateralFactor: rawCfg.liquidationThreshold / BPS,
|
|
32
|
-
borrowFactor: 1
|
|
33
|
+
borrowFactor: 1,
|
|
33
34
|
};
|
|
34
35
|
});
|
|
35
36
|
for (let i = 0; i < assetsToQuery.length; i++) {
|
|
@@ -41,13 +42,19 @@ export const getAaveV3ReservesDataConverter = (lender, chainId, prices, addition
|
|
|
41
42
|
const reserveCaps = data[i * 6 + 3];
|
|
42
43
|
const debtCeiling = data[i * 6 + 4];
|
|
43
44
|
const reserveEMode = data[i * 6 + 5];
|
|
44
|
-
const assetMeta = tokenList[asset] ?? {
|
|
45
|
+
const assetMeta = tokenList[asset] ?? {
|
|
46
|
+
...getAssetMeta(chainId, asset),
|
|
47
|
+
address: asset,
|
|
48
|
+
};
|
|
45
49
|
const decimals = assetMeta?.decimals ?? 18;
|
|
46
50
|
const totalDeposits = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalAToken]?.toString(), decimals);
|
|
47
51
|
const totalDebtStable = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalStableDebt]?.toString(), decimals);
|
|
48
52
|
const totalDebt = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalVariableDebt]?.toString(), decimals);
|
|
49
|
-
const liquidity = Number(totalDeposits) -
|
|
50
|
-
|
|
53
|
+
const liquidity = Number(totalDeposits) -
|
|
54
|
+
Number(totalDebt) -
|
|
55
|
+
Number(totalDebtStable);
|
|
56
|
+
const price = prices[toOracleKey(assetMeta?.assetGroup) ??
|
|
57
|
+
toGenericPriceKey(asset, chainId)];
|
|
51
58
|
resultReserves[asset] = {
|
|
52
59
|
poolId: asset,
|
|
53
60
|
underlying: asset,
|
|
@@ -75,16 +82,20 @@ export const getAaveV3ReservesDataConverter = (lender, chainId, prices, addition
|
|
|
75
82
|
...resultReserves[asset],
|
|
76
83
|
decimals: Number(configData?.[AaveV3GetreserveConfigDataIndexes.decimals]),
|
|
77
84
|
config: {
|
|
78
|
-
...populateEModes(Number(configData?.[AaveV3GetreserveConfigDataIndexes.ltv]) /
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
...populateEModes(Number(configData?.[AaveV3GetreserveConfigDataIndexes.ltv]) /
|
|
86
|
+
BPS, Number(configData?.[AaveV3GetreserveConfigDataIndexes.liquidationThreshold]) / BPS),
|
|
87
|
+
...(eModeCategory !== 0
|
|
88
|
+
? {
|
|
89
|
+
[eModeCategory]: {
|
|
90
|
+
category: eModeCategory,
|
|
91
|
+
label: eModeConfigs[eModeCategory]?.label ?? 'Default',
|
|
92
|
+
borrowCollateralFactor: eModeConfigs[eModeCategory]?.borrowCollateralFactor ??
|
|
93
|
+
0,
|
|
94
|
+
collateralFactor: eModeConfigs[eModeCategory]?.collateralFactor ?? 0,
|
|
95
|
+
borrowFactor: 1,
|
|
96
|
+
},
|
|
86
97
|
}
|
|
87
|
-
|
|
98
|
+
: {}),
|
|
88
99
|
},
|
|
89
100
|
// flags
|
|
90
101
|
collateralActive: configData?.[AaveV3GetreserveConfigDataIndexes.usageAsCollateralEnabled],
|
|
@@ -97,13 +108,13 @@ export const getAaveV3ReservesDataConverter = (lender, chainId, prices, addition
|
|
|
97
108
|
// caps
|
|
98
109
|
borrowCap: Number(reserveCaps[0]?.toString()),
|
|
99
110
|
supplyCap: Number(reserveCaps[1]?.toString()),
|
|
100
|
-
debtCeiling: parseRawAmount(debtCeiling[i]?.toString(), Number(decimalsCeiling?.toString()))
|
|
111
|
+
debtCeiling: parseRawAmount(debtCeiling[i]?.toString(), Number(decimalsCeiling?.toString())),
|
|
101
112
|
};
|
|
102
113
|
}
|
|
103
114
|
return {
|
|
104
115
|
data: resultReserves,
|
|
105
116
|
chainId,
|
|
106
|
-
eModes: eModeConfigs
|
|
117
|
+
eModes: eModeConfigs,
|
|
107
118
|
};
|
|
108
119
|
},
|
|
109
120
|
expectedNumberOfCalls,
|
|
@@ -113,12 +124,12 @@ export const getAaveV3ReservesDataConverter = (lender, chainId, prices, addition
|
|
|
113
124
|
};
|
|
114
125
|
const populateEModes = (borrowCollateralFactor, collateralFactor) => {
|
|
115
126
|
let data = {};
|
|
116
|
-
AAVE_V3_EMODES.forEach(e => {
|
|
127
|
+
AAVE_V3_EMODES.forEach((e) => {
|
|
117
128
|
data[e] = {
|
|
118
129
|
category: e,
|
|
119
130
|
borrowCollateralFactor,
|
|
120
131
|
collateralFactor,
|
|
121
|
-
borrowFactor: 1
|
|
132
|
+
borrowFactor: 1,
|
|
122
133
|
};
|
|
123
134
|
});
|
|
124
135
|
return data;
|
|
@@ -140,12 +151,16 @@ export function parseYLDRCall(chainId, lender, additionalYields, prices, tokenLi
|
|
|
140
151
|
const asset = assetsToQuery[i];
|
|
141
152
|
const reserveData = data[i * 2];
|
|
142
153
|
const configData = data[i * 2 + 1];
|
|
143
|
-
const assetMeta = tokenList[asset] ?? {
|
|
154
|
+
const assetMeta = tokenList[asset] ?? {
|
|
155
|
+
...getAssetMeta(chainId, asset),
|
|
156
|
+
address: asset,
|
|
157
|
+
};
|
|
144
158
|
const decimals = assetMeta?.decimals ?? 18;
|
|
145
159
|
const totalVariableDebt = parseRawAmount(reserveData?.[YLDRTypeGetReserveDataIndexes.totalVariableDebt]?.toString(), decimals);
|
|
146
160
|
const totalAToken = parseRawAmount(reserveData?.[YLDRTypeGetReserveDataIndexes.totalYToken]?.toString(), decimals);
|
|
147
161
|
const liquidity = Number(totalAToken) - Number(totalVariableDebt);
|
|
148
|
-
const oracleKey = toOracleKey(assetMeta?.assetGroup) ??
|
|
162
|
+
const oracleKey = toOracleKey(assetMeta?.assetGroup) ??
|
|
163
|
+
toGenericPriceKey(asset, chainId);
|
|
149
164
|
const price = prices[oracleKey] ?? 1;
|
|
150
165
|
const totalDepositsUSD = Number(totalAToken) * price;
|
|
151
166
|
const totalDebtUSD = Number(totalVariableDebt) * price;
|
|
@@ -177,8 +192,8 @@ export function parseYLDRCall(chainId, lender, additionalYields, prices, tokenLi
|
|
|
177
192
|
// collateral factors
|
|
178
193
|
borrowCollateralFactor: Number(configData?.[YLDRTypeGetReserveConfigurationData.ltv]?.toString()) / BPS,
|
|
179
194
|
collateralFactor: Number(configData?.[YLDRTypeGetReserveConfigurationData.liquidationThreshold]?.toString()) / BPS,
|
|
180
|
-
borrowFactor: 1
|
|
181
|
-
}
|
|
195
|
+
borrowFactor: 1,
|
|
196
|
+
},
|
|
182
197
|
},
|
|
183
198
|
liquidationBonus: Number(configData?.[YLDRTypeGetReserveConfigurationData.liquidationBonus]?.toString()) / BPS,
|
|
184
199
|
// flags
|
|
@@ -192,7 +207,7 @@ export function parseYLDRCall(chainId, lender, additionalYields, prices, tokenLi
|
|
|
192
207
|
return {
|
|
193
208
|
data: resultReserves,
|
|
194
209
|
chainId,
|
|
195
|
-
eModes: {}
|
|
210
|
+
eModes: {},
|
|
196
211
|
};
|
|
197
212
|
},
|
|
198
213
|
expectedNumberOfCalls,
|
|
@@ -221,13 +236,13 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
221
236
|
label: rawCfg.label,
|
|
222
237
|
borrowCollateralFactor: rawCfg.ltv / BPS,
|
|
223
238
|
collateralFactor: rawCfg.liquidationThreshold / BPS,
|
|
224
|
-
borrowFactor: 1
|
|
239
|
+
borrowFactor: 1,
|
|
225
240
|
};
|
|
226
241
|
debtBitmap[mode] = emodeDataResult[3 * index + 1];
|
|
227
242
|
collateralBitmap[mode] = emodeDataResult[3 * index + 2];
|
|
228
243
|
});
|
|
229
244
|
// we get the reserves list to obtain the index per reserve
|
|
230
|
-
const lowerReservesList = reservesList
|
|
245
|
+
const lowerReservesList = reservesList?.map((a) => a.toLowerCase());
|
|
231
246
|
for (let i = 0; i < assetsToQuery.length; i++) {
|
|
232
247
|
const asset = assetsToQuery[i];
|
|
233
248
|
const reserveData = data[i * 5];
|
|
@@ -236,13 +251,17 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
236
251
|
// const siloedBorrowing = data[i * 5 + 2]
|
|
237
252
|
const reserveCaps = data[i * 5 + 3];
|
|
238
253
|
const debtCeiling = data[i * 5 + 4];
|
|
239
|
-
const assetMeta = tokenList[asset] ?? {
|
|
254
|
+
const assetMeta = tokenList[asset] ?? {
|
|
255
|
+
...getAssetMeta(chainId, asset),
|
|
256
|
+
address: asset,
|
|
257
|
+
};
|
|
240
258
|
const decimals = assetMeta?.decimals ?? 18;
|
|
241
259
|
const totalDeposits = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalAToken]?.toString(), decimals);
|
|
242
260
|
const totalDebtStable = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalStableDebt]?.toString(), decimals);
|
|
243
261
|
const totalDebt = parseRawAmount(reserveData?.[AaveV3GetReservesIndexes.totalVariableDebt]?.toString(), decimals);
|
|
244
262
|
const liquidity = Number(totalDeposits) - Number(totalDebt) - Number(totalDebtStable);
|
|
245
|
-
const price = prices[toOracleKey(assetMeta?.assetGroup)] ??
|
|
263
|
+
const price = prices[toOracleKey(assetMeta?.assetGroup)] ??
|
|
264
|
+
toGenericPriceKey(asset, chainId);
|
|
246
265
|
resultReserves[asset] = {
|
|
247
266
|
poolId: asset,
|
|
248
267
|
underlying: asset,
|
|
@@ -265,22 +284,27 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
265
284
|
// rewards
|
|
266
285
|
rewards: {},
|
|
267
286
|
};
|
|
268
|
-
const activeEmodes = AAVE_V3_EMODES.map(mode => isReserveEnabledOnBitmap(debtBitmap[mode], lowerReservesList.indexOf(asset)) ||
|
|
287
|
+
const activeEmodes = AAVE_V3_EMODES.map((mode) => isReserveEnabledOnBitmap(debtBitmap[mode], lowerReservesList.indexOf(asset)) ||
|
|
288
|
+
isReserveEnabledOnBitmap(collateralBitmap[mode], lowerReservesList.indexOf(asset))
|
|
289
|
+
? mode
|
|
290
|
+
: -1).filter((m) => m !== undefined && m > 0);
|
|
269
291
|
const eModeCategory = activeEmodes.length === 0 ? 0 : activeEmodes[0]; // Number(emodeResult[index].toString())
|
|
270
292
|
resultReserves[asset] = {
|
|
271
293
|
...resultReserves[asset],
|
|
272
294
|
decimals: Number(configData?.[AaveV3GetreserveConfigDataIndexes.decimals]),
|
|
273
295
|
config: {
|
|
274
296
|
...populateEModes(Number(configData?.[AaveV3GetreserveConfigDataIndexes.ltv]) / BPS, Number(configData?.[AaveV3GetreserveConfigDataIndexes.liquidationThreshold]) / BPS),
|
|
275
|
-
...(eModeCategory !== 0
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
297
|
+
...(eModeCategory !== 0
|
|
298
|
+
? {
|
|
299
|
+
[eModeCategory]: {
|
|
300
|
+
category: eModeCategory,
|
|
301
|
+
label: eModeConfigs[eModeCategory]?.label ?? 'Default',
|
|
302
|
+
borrowCollateralFactor: eModeConfigs[eModeCategory]?.borrowCollateralFactor ?? 0,
|
|
303
|
+
collateralFactor: eModeConfigs[eModeCategory]?.collateralFactor ?? 0,
|
|
304
|
+
borrowFactor: 1,
|
|
305
|
+
},
|
|
282
306
|
}
|
|
283
|
-
|
|
307
|
+
: {}),
|
|
284
308
|
},
|
|
285
309
|
// flags
|
|
286
310
|
collateralActive: configData?.[AaveV3GetreserveConfigDataIndexes.usageAsCollateralEnabled],
|
|
@@ -293,13 +317,13 @@ function parseAave32(chainId, lender, prices, additionalYields, tokenList) {
|
|
|
293
317
|
// caps
|
|
294
318
|
borrowCap: Number(reserveCaps[0]?.toString()),
|
|
295
319
|
supplyCap: Number(reserveCaps[1]?.toString()),
|
|
296
|
-
debtCeiling: parseRawAmount(debtCeiling[i]?.toString(), Number(decimalsCeiling?.toString()))
|
|
320
|
+
debtCeiling: parseRawAmount(debtCeiling[i]?.toString(), Number(decimalsCeiling?.toString())),
|
|
297
321
|
};
|
|
298
322
|
}
|
|
299
323
|
return {
|
|
300
324
|
data: resultReserves,
|
|
301
325
|
chainId,
|
|
302
|
-
eModes: eModeConfigs
|
|
326
|
+
eModes: eModeConfigs,
|
|
303
327
|
};
|
|
304
328
|
},
|
|
305
329
|
expectedNumberOfCalls,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchLender.d.ts","sourceRoot":"","sources":["../../src/lending/fetchLender.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAWnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AA+E1C,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,SAAS,MAAM,EAAE,EACjB,QAAQ;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACnC,kBAAkB,gBAAgB,EAClC,gBAAgB,sBAAsB,EACtC,YAAW,MAAM,OAAO,CAAC,gBAAgB,CAExC,KACA,OAAO,CAAC;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"fetchLender.d.ts","sourceRoot":"","sources":["../../src/lending/fetchLender.ts"],"names":[],"mappings":"AAyBA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAWnE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAG/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AA+E1C,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,EACf,SAAS,MAAM,EAAE,EACjB,QAAQ;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACnC,kBAAkB,gBAAgB,EAClC,gBAAgB,sBAAsB,EACtC,YAAW,MAAM,OAAO,CAAC,gBAAgB,CAExC,KACA,OAAO,CAAC;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,CAsDnC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"convertPublic.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/convertPublic.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAE3B,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAc3C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE,gBAIjB,EACD,MAAM,GAAE,gBAAqB,
|
|
1
|
+
{"version":3,"file":"convertPublic.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/convertPublic.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAE3B,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAEhB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAc3C,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,EAAE,MAAM,EACf,gBAAgB,GAAE,gBAIjB,EACD,MAAM,GAAE,gBAAqB,GAC5B;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,2BAA2B,CAAA;CAAE,CAgI9C"}
|
|
@@ -35,15 +35,19 @@ export function convertMarketsToMorphoResponse(response, chainId, additionalYiel
|
|
|
35
35
|
// })
|
|
36
36
|
const loanAssetAddress = loanAsset.address.toLowerCase();
|
|
37
37
|
const meta = tokens[loanAssetAddress] ?? loanAsset;
|
|
38
|
+
const totalDeposits = formatNr(state.supplyAssets, loanAsset.decimals);
|
|
39
|
+
const totalDebt = formatNr(state.borrowAssets, loanAsset.decimals);
|
|
38
40
|
data[m].data[loanAssetAddress] = {
|
|
39
41
|
poolId: loanAssetAddress,
|
|
40
42
|
underlying: loanAssetAddress,
|
|
41
43
|
asset: meta,
|
|
42
|
-
totalDeposits
|
|
44
|
+
totalDeposits,
|
|
43
45
|
totalDebtStable: 0,
|
|
44
|
-
totalDebt
|
|
46
|
+
totalDebt,
|
|
45
47
|
totalDepositsUSD: Number(state.supplyAssetsUsd),
|
|
46
48
|
totalDebtStableUSD: 0,
|
|
49
|
+
totalLiquidity: totalDeposits - totalDebt,
|
|
50
|
+
totalLiquidityUSD: Number(state.supplyAssetsUsd) - Number(state.borrowAssetsUsd),
|
|
47
51
|
totalDebtUSD: Number(state.borrowAssetsUsd),
|
|
48
52
|
depositRate: apyToApr(Number(state.supplyApy)) * 100,
|
|
49
53
|
variableBorrowRate: apyToApr(Number(state.borrowApy)) * 100,
|
|
@@ -76,6 +80,8 @@ export function convertMarketsToMorphoResponse(response, chainId, additionalYiel
|
|
|
76
80
|
totalDeposits: formatNr(state.collateralAssets, collateralAsset.decimals),
|
|
77
81
|
totalDebtStable: 0,
|
|
78
82
|
totalDebt: 0,
|
|
83
|
+
totalLiquidity: 0,
|
|
84
|
+
totalLiquidityUSD: 0,
|
|
79
85
|
totalDepositsUSD: Number(state.collateralAssetsUsd),
|
|
80
86
|
totalDebtStableUSD: 0,
|
|
81
87
|
totalDebtUSD: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchPublic.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/fetchPublic.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,WAoDjE,CAAA;AAKD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"fetchPublic.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/fetchPublic.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK,GAAI,OAAO,MAAM,EAAE,MAAM,MAAM,EAAE,SAAS,MAAM,WAoDjE,CAAA;AAKD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,gBAoBvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QACP,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE;gBACT,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;gBACjB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,eAAe,EAAE;gBACf,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;gBACjB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,KAAK,EAAE;gBACL,SAAS,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,OAAO,EAAE,MAAM,CAAA;wBACf,IAAI,EAAE,MAAM,CAAA;wBACZ,MAAM,EAAE,MAAM,CAAA;wBACd,QAAQ,EAAE,MAAM,CAAA;qBACjB,CAAA;oBACD,sBAAsB,EAAE,MAAM,CAAC;oBAC/B,sBAAsB,EAAE,MAAM,CAAC;iBAChC,EAAE,CAAC;gBACJ,YAAY,EAAE,MAAM,CAAC;gBACrB,eAAe,EAAE,MAAM,CAAC;gBACxB,YAAY,EAAE,MAAM,CAAA;gBACpB,eAAe,EAAE,MAAM,CAAA;gBACvB,gBAAgB,EAAE,MAAM,CAAC;gBACzB,mBAAmB,EAAE,MAAM,CAAC;aAC7B,CAAC;SACH,EAAE,CAAC;KACL,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IAEzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IAExB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAA;AAI3D,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IAGrB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE;QACJ,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,MAAM,EAAE,MAAM,CAAA;YACd,UAAU,EAAE,MAAM,CAAA;YAClB,KAAK,EAAE,eAAe,CAAA;YAEtB,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,CAAC,CAAC;YACnB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lending/morpho/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG3C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE;QACP,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;YACtB,IAAI,EAAE,MAAM,CAAC;YACb,SAAS,EAAE;gBACT,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;gBACjB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,eAAe,EAAE;gBACf,OAAO,EAAE,MAAM,CAAC;gBAChB,IAAI,EAAE,MAAM,CAAC;gBACb,MAAM,EAAE,MAAM,CAAC;gBACf,QAAQ,EAAE,MAAM,CAAC;gBACjB,QAAQ,EAAE,MAAM,CAAC;aAClB,CAAC;YACF,KAAK,EAAE;gBACL,SAAS,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,KAAK,EAAE,MAAM,CAAC;gBACd,OAAO,EAAE;oBACP,KAAK,EAAE;wBACL,OAAO,EAAE,MAAM,CAAA;wBACf,IAAI,EAAE,MAAM,CAAA;wBACZ,MAAM,EAAE,MAAM,CAAA;wBACd,QAAQ,EAAE,MAAM,CAAA;qBACjB,CAAA;oBACD,sBAAsB,EAAE,MAAM,CAAC;oBAC/B,sBAAsB,EAAE,MAAM,CAAC;iBAChC,EAAE,CAAC;gBACJ,YAAY,EAAE,MAAM,CAAC;gBACrB,eAAe,EAAE,MAAM,CAAC;gBACxB,YAAY,EAAE,MAAM,CAAA;gBACpB,eAAe,EAAE,MAAM,CAAA;gBACvB,gBAAgB,EAAE,MAAM,CAAC;gBACzB,mBAAmB,EAAE,MAAM,CAAC;aAC7B,CAAC;SACH,EAAE,CAAC;KACL,CAAC;CACH,CAAC;AAEF,MAAM,WAAW,UAAU;IAEzB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IAExB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAA;AAI3D,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAA;IAGrB,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE;QACJ,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,MAAM,EAAE,MAAM,CAAA;YACd,UAAU,EAAE,MAAM,CAAA;YAClB,KAAK,EAAE,eAAe,CAAA;YAEtB,aAAa,EAAE,MAAM,CAAC;YACtB,eAAe,EAAE,CAAC,CAAC;YACnB,SAAS,EAAE,MAAM,CAAC;YAGlB,cAAc,EAAE,MAAM,CAAA;YACtB,iBAAiB,EAAE,MAAM,CAAA;YAGzB,gBAAgB,EAAE,MAAM,CAAC;YACzB,kBAAkB,EAAE,CAAC,CAAC;YACtB,YAAY,EAAE,MAAM,CAAC;YAErB,WAAW,EAAE,MAAM,CAAC;YACpB,kBAAkB,EAAE,MAAM,CAAC;YAC3B,YAAY,EAAE,MAAM,CAAC;YACrB,gBAAgB,EAAE,CAAC,CAAC;YAGpB,OAAO,CAAC,EAAE,UAAU,CAAA;YAGpB,QAAQ,EAAE,MAAM,CAAC;YAEjB,MAAM,EAAE;gBACN,CAAC,CAAC,CAAC,EAAE;oBACH,QAAQ,EAAE,MAAM,CAAA;oBAEhB,sBAAsB,EAAE,MAAM,CAAA;oBAC9B,gBAAgB,EAAE,MAAM,CAAA;oBACxB,YAAY,EAAE,CAAC,CAAA;iBAChB,CAAA;aACF,CAAA;YAGD,gBAAgB,EAAE,OAAO,CAAC;YAC1B,gBAAgB,EAAE,OAAO,CAAC;YAC1B,SAAS,EAAE,KAAK,CAAC;YACjB,QAAQ,EAAE,IAAI,CAAC;YACf,QAAQ,EAAE,KAAK,CAAC;SACjB,CAAA;KACF,CAAA;IACD,yBAAyB;IACzB,MAAM,EAAE;QACN,MAAM,EAAE,YAAY,CAAC;KACtB,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;CAChB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userCallParse.d.ts","sourceRoot":"","sources":["../../../../src/lending/user-data/morpho/userCallParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"userCallParse.d.ts","sourceRoot":"","sources":["../../../../src/lending/user-data/morpho/userCallParse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAE/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAA;AA+CpD,eAAO,MAAM,kCAAkC,GAC7C,QAAQ,MAAM,EACd,SAAS,MAAM,EACf,SAAS,MAAM,EACf,SAAS,MAAM,EAAE,EACjB,QAAQ;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACnC,YAAY;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACvC,YAAY,GAAG,KACd,CACD,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,yBAAyB,CAAA;CAAE,GAAG,SAAS,EAC5E,MAAM,CA8EP,CAAA"}
|
|
@@ -2,6 +2,45 @@ import { getAssetMeta, toGenericPriceKey, toOracleKey } from '../../../assets';
|
|
|
2
2
|
import { createBaseTypeUserState } from '../utils';
|
|
3
3
|
import { parseRawAmount } from '../../../utils/parsing';
|
|
4
4
|
import { decodePackedDataset } from './decoder';
|
|
5
|
+
const balanceData = {
|
|
6
|
+
'0': {
|
|
7
|
+
borrowDiscountedCollateral: 0,
|
|
8
|
+
collateral: 0,
|
|
9
|
+
deposits: 0,
|
|
10
|
+
debt: 0,
|
|
11
|
+
adjustedDebt: 0,
|
|
12
|
+
nav: 0,
|
|
13
|
+
deposits24h: 0,
|
|
14
|
+
debt24h: 0,
|
|
15
|
+
nav24h: 0,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
// aggregated apr data
|
|
19
|
+
const aprData = {
|
|
20
|
+
'0': {
|
|
21
|
+
apr: 0,
|
|
22
|
+
borrowApr: 0,
|
|
23
|
+
depositApr: 0,
|
|
24
|
+
rewards: 0,
|
|
25
|
+
rewardApr: 0,
|
|
26
|
+
rewardDepositApr: 0,
|
|
27
|
+
rewardBorrowApr: 0,
|
|
28
|
+
stakingApr: 0,
|
|
29
|
+
stakingDepositApr: 0,
|
|
30
|
+
stakingBorrowApr: 0,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const userDataEmpty = (account, chainId) => {
|
|
34
|
+
return {
|
|
35
|
+
account,
|
|
36
|
+
chainId,
|
|
37
|
+
balanceData,
|
|
38
|
+
aprData,
|
|
39
|
+
userConfigs: {
|
|
40
|
+
'0': { selectedMode: 0, id: account },
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
};
|
|
5
44
|
export const getMorphoUserDataConverterWithlens = (lender, chainId, account, markets, prices, pricesHist, lenderData) => {
|
|
6
45
|
const expectedNumberOfCalls = Math.ceil(markets.length / 100);
|
|
7
46
|
return [
|
|
@@ -10,6 +49,7 @@ export const getMorphoUserDataConverterWithlens = (lender, chainId, account, mar
|
|
|
10
49
|
if (data.length !== expectedNumberOfCalls) {
|
|
11
50
|
return undefined;
|
|
12
51
|
}
|
|
52
|
+
let marketsHandled = [];
|
|
13
53
|
// de-chunk the calldata
|
|
14
54
|
const returnDatas = data.flatMap((d) => decodePackedDataset(d));
|
|
15
55
|
let datas = {};
|
|
@@ -18,6 +58,7 @@ export const getMorphoUserDataConverterWithlens = (lender, chainId, account, mar
|
|
|
18
58
|
let totalDeposits24h = 0;
|
|
19
59
|
const balanceData = returnDatas[i];
|
|
20
60
|
const markeId = markets[balanceData.index];
|
|
61
|
+
marketsHandled.push(markeId);
|
|
21
62
|
const market = lenderData[markeId]?.params?.market;
|
|
22
63
|
const { dataForMarket, addedDebt, addedDeposits } = createMorphoEntryFromMarketWithLens(balanceData, chainId, market, prices, pricesHist);
|
|
23
64
|
totalDebt24h += addedDebt;
|
|
@@ -36,6 +77,25 @@ export const getMorphoUserDataConverterWithlens = (lender, chainId, account, mar
|
|
|
36
77
|
id: market.id,
|
|
37
78
|
};
|
|
38
79
|
}
|
|
80
|
+
for (const [marketId, pubData] of Object.entries(lenderData ?? {})) {
|
|
81
|
+
if (marketsHandled.includes(marketId))
|
|
82
|
+
continue;
|
|
83
|
+
const payload = {
|
|
84
|
+
chainId,
|
|
85
|
+
account,
|
|
86
|
+
lendingPositions: { '0': {} },
|
|
87
|
+
rewards: {},
|
|
88
|
+
userEMode: 0,
|
|
89
|
+
};
|
|
90
|
+
const userData = userDataEmpty(account, chainId);
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
datas[marketId] = {
|
|
93
|
+
...payload,
|
|
94
|
+
...userData,
|
|
95
|
+
// @ts-ignore
|
|
96
|
+
id: pubData?.params?.market.id,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
39
99
|
return datas;
|
|
40
100
|
},
|
|
41
101
|
expectedNumberOfCalls,
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface MrophoOracleInfo {
|
|
2
|
+
oracle: string;
|
|
3
|
+
loanAsset: string;
|
|
4
|
+
collateralAsset: string;
|
|
5
|
+
loanAssetDecimals: number;
|
|
6
|
+
collateralAssetDecimals: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const MrophoOracles: {
|
|
9
|
+
[c: string]: MrophoOracleInfo[];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=morpho.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"morpho.d.ts","sourceRoot":"","sources":["../../../../src/prices/main-prices/addresses/morpho.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,uBAAuB,EAAE,MAAM,CAAA;CAChC;AAED,eAAO,MAAM,aAAa,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAA;CAq4B5D,CAAA"}
|