@defisaver/positions-sdk 2.1.160-shifter-v2-dev → 2.1.161-aave-3.7-dev
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/cjs/aaveV2/index.js +0 -2
- package/cjs/aaveV3/index.js +7 -1
- package/cjs/curveUsd/index.d.ts +2 -5
- package/cjs/curveUsd/index.js +15 -30
- package/cjs/fluid/index.d.ts +0 -5
- package/cjs/fluid/index.js +1 -36
- package/cjs/helpers/aaveHelpers/index.d.ts +9 -1
- package/cjs/helpers/aaveHelpers/index.js +23 -9
- package/cjs/helpers/aaveV4Helpers/index.js +0 -1
- package/cjs/helpers/compoundHelpers/index.js +0 -2
- package/cjs/helpers/curveUsdHelpers/index.d.ts +1 -3
- package/cjs/helpers/curveUsdHelpers/index.js +2 -16
- package/cjs/helpers/fluidHelpers/index.js +0 -1
- package/cjs/helpers/liquityV2Helpers/index.js +0 -1
- package/cjs/helpers/llamaLendHelpers/index.js +0 -2
- package/cjs/helpers/makerHelpers/index.d.ts +1 -1
- package/cjs/helpers/makerHelpers/index.js +2 -2
- package/cjs/helpers/morphoBlueHelpers/index.js +0 -2
- package/cjs/helpers/morphoMidnightHelpers/index.js +0 -2
- package/cjs/helpers/sparkHelpers/index.js +0 -1
- package/cjs/liquity/index.js +2 -16
- package/cjs/maker/index.d.ts +2 -7
- package/cjs/maker/index.js +12 -45
- package/cjs/markets/index.d.ts +0 -1
- package/cjs/markets/index.js +1 -3
- package/cjs/portfolio/index.d.ts +1 -5
- package/cjs/portfolio/index.js +2 -274
- package/cjs/savings/index.js +5 -2
- package/cjs/savings/morphoVaults/index.d.ts +1 -1
- package/cjs/savings/morphoVaults/index.js +56 -18
- package/cjs/savings/morphoVaults/options.d.ts +2 -0
- package/cjs/savings/morphoVaults/options.js +61 -1
- package/cjs/spark/index.js +1 -0
- package/cjs/staking/staking.d.ts +0 -20
- package/cjs/staking/staking.js +1 -19
- package/cjs/types/aave.d.ts +1 -2
- package/cjs/types/aaveV4.d.ts +0 -1
- package/cjs/types/compound.d.ts +0 -2
- package/cjs/types/curveUsd.d.ts +0 -6
- package/cjs/types/fluid.d.ts +0 -1
- package/cjs/types/liquity.d.ts +0 -4
- package/cjs/types/liquityV2.d.ts +0 -2
- package/cjs/types/maker.d.ts +0 -4
- package/cjs/types/morphoBlue.d.ts +0 -2
- package/cjs/types/morphoMidnight.d.ts +0 -1
- package/cjs/types/portfolio.d.ts +10 -26
- package/cjs/types/savings/morphoVaults.d.ts +10 -2
- package/cjs/types/savings/morphoVaults.js +9 -1
- package/cjs/types/spark.d.ts +0 -2
- package/esm/aaveV2/index.js +0 -2
- package/esm/aaveV3/index.js +7 -1
- package/esm/curveUsd/index.d.ts +2 -5
- package/esm/curveUsd/index.js +15 -30
- package/esm/fluid/index.d.ts +0 -5
- package/esm/fluid/index.js +0 -33
- package/esm/helpers/aaveHelpers/index.d.ts +9 -1
- package/esm/helpers/aaveHelpers/index.js +20 -8
- package/esm/helpers/aaveV4Helpers/index.js +0 -1
- package/esm/helpers/compoundHelpers/index.js +0 -2
- package/esm/helpers/curveUsdHelpers/index.d.ts +1 -3
- package/esm/helpers/curveUsdHelpers/index.js +2 -16
- package/esm/helpers/fluidHelpers/index.js +0 -1
- package/esm/helpers/liquityV2Helpers/index.js +0 -1
- package/esm/helpers/llamaLendHelpers/index.js +0 -2
- package/esm/helpers/makerHelpers/index.d.ts +1 -1
- package/esm/helpers/makerHelpers/index.js +2 -2
- package/esm/helpers/morphoBlueHelpers/index.js +0 -2
- package/esm/helpers/morphoMidnightHelpers/index.js +0 -2
- package/esm/helpers/sparkHelpers/index.js +0 -1
- package/esm/liquity/index.js +2 -16
- package/esm/maker/index.d.ts +2 -7
- package/esm/maker/index.js +13 -44
- package/esm/markets/index.d.ts +0 -1
- package/esm/markets/index.js +0 -1
- package/esm/portfolio/index.d.ts +1 -5
- package/esm/portfolio/index.js +5 -276
- package/esm/savings/index.js +5 -2
- package/esm/savings/morphoVaults/index.d.ts +1 -1
- package/esm/savings/morphoVaults/index.js +57 -19
- package/esm/savings/morphoVaults/options.d.ts +2 -0
- package/esm/savings/morphoVaults/options.js +61 -1
- package/esm/spark/index.js +1 -0
- package/esm/staking/staking.d.ts +0 -20
- package/esm/staking/staking.js +0 -17
- package/esm/types/aave.d.ts +1 -2
- package/esm/types/aaveV4.d.ts +0 -1
- package/esm/types/compound.d.ts +0 -2
- package/esm/types/curveUsd.d.ts +0 -6
- package/esm/types/fluid.d.ts +0 -1
- package/esm/types/liquity.d.ts +0 -4
- package/esm/types/liquityV2.d.ts +0 -2
- package/esm/types/maker.d.ts +0 -4
- package/esm/types/morphoBlue.d.ts +0 -2
- package/esm/types/morphoMidnight.d.ts +0 -1
- package/esm/types/portfolio.d.ts +10 -26
- package/esm/types/savings/morphoVaults.d.ts +10 -2
- package/esm/types/savings/morphoVaults.js +8 -0
- package/esm/types/spark.d.ts +0 -2
- package/package.json +1 -1
- package/src/aaveV2/index.ts +0 -2
- package/src/aaveV3/index.ts +6 -1
- package/src/curveUsd/index.ts +16 -33
- package/src/fluid/index.ts +0 -40
- package/src/helpers/aaveHelpers/index.ts +24 -10
- package/src/helpers/aaveV4Helpers/index.ts +0 -1
- package/src/helpers/compoundHelpers/index.ts +0 -2
- package/src/helpers/curveUsdHelpers/index.ts +2 -23
- package/src/helpers/fluidHelpers/index.ts +0 -1
- package/src/helpers/liquityV2Helpers/index.ts +0 -1
- package/src/helpers/llamaLendHelpers/index.ts +0 -2
- package/src/helpers/makerHelpers/index.ts +1 -2
- package/src/helpers/morphoBlueHelpers/index.ts +0 -2
- package/src/helpers/morphoMidnightHelpers/index.ts +0 -2
- package/src/helpers/sparkHelpers/index.ts +0 -1
- package/src/liquity/index.ts +2 -17
- package/src/maker/index.ts +29 -77
- package/src/markets/index.ts +1 -2
- package/src/portfolio/index.ts +4 -259
- package/src/savings/index.ts +5 -2
- package/src/savings/morphoVaults/index.ts +73 -21
- package/src/savings/morphoVaults/options.ts +67 -1
- package/src/spark/index.ts +1 -0
- package/src/staking/staking.ts +0 -28
- package/src/types/aave.ts +1 -3
- package/src/types/aaveV4.ts +0 -1
- package/src/types/compound.ts +0 -2
- package/src/types/curveUsd.ts +0 -7
- package/src/types/fluid.ts +0 -1
- package/src/types/liquity.ts +0 -6
- package/src/types/liquityV2.ts +0 -2
- package/src/types/maker.ts +0 -6
- package/src/types/morphoBlue.ts +0 -2
- package/src/types/morphoMidnight.ts +0 -1
- package/src/types/portfolio.ts +12 -31
- package/src/types/savings/morphoVaults.ts +11 -1
- package/src/types/spark.ts +0 -2
- package/cjs/markets/maker/index.d.ts +0 -1
- package/cjs/markets/maker/index.js +0 -13
- package/esm/markets/maker/index.d.ts +0 -1
- package/esm/markets/maker/index.js +0 -10
- package/src/markets/maker/index.ts +0 -10
package/src/fluid/index.ts
CHANGED
|
@@ -1830,43 +1830,3 @@ export const _getUserPositionsPortfolio = async (provider: PublicClient, network
|
|
|
1830
1830
|
userData: userData[i],
|
|
1831
1831
|
})).filter(md => md.marketData !== undefined);
|
|
1832
1832
|
};
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
export const _getAllFluidMarketDataPortfolio = async (provider: PublicClient, network: NetworkNumber): Promise<Record<string, FluidMarketData>> => {
|
|
1836
|
-
const versions = getFluidVersionsDataForNetwork(network);
|
|
1837
|
-
if (versions.length === 0) return {};
|
|
1838
|
-
|
|
1839
|
-
const view = FluidViewContractViem(provider, network);
|
|
1840
|
-
const vaultsData = await Promise.all(versions.map((version) => view.read.getVaultData([version.marketAddress])));
|
|
1841
|
-
|
|
1842
|
-
const tokens = Array.from(new Set(vaultsData.map((vaultData) => {
|
|
1843
|
-
const vaultTokens = [getAssetInfoByAddress(vaultData.supplyToken0, network).symbol, getAssetInfoByAddress(vaultData.borrowToken0, network).symbol];
|
|
1844
|
-
if (vaultData.supplyToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.supplyToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.supplyToken1, network).symbol);
|
|
1845
|
-
if (vaultData.borrowToken1 && !compareAddresses(ZERO_ADDRESS, vaultData.borrowToken1)) vaultTokens.push(getAssetInfoByAddress(vaultData.borrowToken1, network).symbol);
|
|
1846
|
-
return vaultTokens;
|
|
1847
|
-
}).flat()));
|
|
1848
|
-
|
|
1849
|
-
// ETH and WBTC needed for other tokens prices
|
|
1850
|
-
if (!tokens.includes('ETH')) tokens.push('ETH');
|
|
1851
|
-
if (!tokens.includes('WBTC')) tokens.push('WBTC');
|
|
1852
|
-
|
|
1853
|
-
const [tokenPrices, merklCampaigns] = await Promise.all([
|
|
1854
|
-
getTokensPricesForPortfolio(tokens, provider, network),
|
|
1855
|
-
getFluidMerklCampaigns(network),
|
|
1856
|
-
]);
|
|
1857
|
-
|
|
1858
|
-
const parsedMarketsData = await Promise.all(vaultsData.map(async (vaultData) => parseMarketData(provider, vaultData, network, tokenPrices)));
|
|
1859
|
-
|
|
1860
|
-
const marketsData: Record<string, FluidMarketData> = {};
|
|
1861
|
-
parsedMarketsData.forEach((marketData, i) => {
|
|
1862
|
-
if (!marketData) return;
|
|
1863
|
-
marketsData[versions[i].value] = attachFluidMerklIncentives(marketData, merklCampaigns);
|
|
1864
|
-
});
|
|
1865
|
-
|
|
1866
|
-
return marketsData;
|
|
1867
|
-
};
|
|
1868
|
-
|
|
1869
|
-
export const getAllFluidMarketDataPortfolio = async (
|
|
1870
|
-
provider: EthereumProvider,
|
|
1871
|
-
network: NetworkNumber,
|
|
1872
|
-
): Promise<Record<string, FluidMarketData>> => _getAllFluidMarketDataPortfolio(getViemProvider(provider, network, { batch: { multicall: true } }), network);
|
|
@@ -2,7 +2,7 @@ import Dec from 'decimal.js';
|
|
|
2
2
|
import { assetAmountInWei, getAssetInfo, getAssetInfoByAddress } from '@defisaver/tokens';
|
|
3
3
|
import { Client } from 'viem';
|
|
4
4
|
import {
|
|
5
|
-
AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions,
|
|
5
|
+
AaveAssetData, AaveHelperCommon, AaveMarketInfo, AaveV3AggregatedPositionData, AaveV3AssetsData, AaveV3UsedAsset, AaveV3UsedAssets, AaveVersions, EModeCategoriesData,
|
|
6
6
|
} from '../../types';
|
|
7
7
|
import { getNativeAssetFromWrapped, getWrappedNativeAssetFromUnwrapped } from '../../services/utils';
|
|
8
8
|
import {
|
|
@@ -24,6 +24,13 @@ export const isAaveV3 = ({ selectedMarket }: { selectedMarket: Partial<AaveMarke
|
|
|
24
24
|
export const aaveV3IsInIsolationMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, collateral }) => collateral && assetsData[symbol].isIsolated);
|
|
25
25
|
export const aaveV3IsInSiloedMode = ({ usedAssets, assetsData }: { usedAssets: AaveV3UsedAssets, assetsData: AaveV3AssetsData }) => Object.values(usedAssets).some(({ symbol, debt }) => debt && assetsData[symbol].isSiloed);
|
|
26
26
|
|
|
27
|
+
export const aaveV3IsEmodeIsolated = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }) => eModeCategory !== 0 && !!eModeCategoriesData?.[eModeCategory]?.isolated;
|
|
28
|
+
|
|
29
|
+
export const aaveV3CanBeCollateralInEmode = ({ eModeCategory, eModeCategoriesData }: { eModeCategory: number, eModeCategoriesData?: EModeCategoriesData }, _asset: string) => {
|
|
30
|
+
if (!aaveV3IsEmodeIsolated({ eModeCategory, eModeCategoriesData })) return true;
|
|
31
|
+
return eModeCategoriesData![eModeCategory].collateralAssets.includes(getNativeAssetFromWrapped(_asset));
|
|
32
|
+
};
|
|
33
|
+
|
|
27
34
|
export const aaveAnyGetCollSuppliedAssets = ({ usedAssets }: { usedAssets: AaveV3UsedAssets }) => Object.values(usedAssets)
|
|
28
35
|
.filter(({ isSupplied, collateral }: { isSupplied: boolean, collateral: boolean }) => isSupplied && collateral);
|
|
29
36
|
|
|
@@ -37,14 +44,18 @@ export const aaveAnyGetSuppliableAssets = ({
|
|
|
37
44
|
const collAccountAssets = aaveAnyGetCollSuppliedAssets(data);
|
|
38
45
|
const marketAssets = Object.values(assetsData) as AaveAssetData[];
|
|
39
46
|
|
|
40
|
-
if (
|
|
47
|
+
if (!isAaveV3(data)) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: true }));
|
|
48
|
+
|
|
49
|
+
const canBeCollateralInEmode = (symbol: string) => aaveV3CanBeCollateralInEmode(data, symbol);
|
|
50
|
+
|
|
51
|
+
if (collAccountAssets.length === 0) return marketAssets.filter(({ canBeSupplied }) => canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: canBeCollateralInEmode(symbol) }));
|
|
41
52
|
|
|
42
53
|
if (aaveV3IsInIsolationMode(data)) {
|
|
43
54
|
const collAsset = collAccountAssets[0].symbol;
|
|
44
|
-
return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset }));
|
|
55
|
+
return marketAssets.filter(d => d.canBeSupplied).map(({ symbol }) => ({ symbol, canBeCollateral: symbol === collAsset && canBeCollateralInEmode(symbol) }));
|
|
45
56
|
}
|
|
46
57
|
|
|
47
|
-
return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated }));
|
|
58
|
+
return marketAssets.filter(d => d.canBeSupplied).map(({ symbol, isIsolated }) => ({ symbol, canBeCollateral: !isIsolated && canBeCollateralInEmode(symbol) }));
|
|
48
59
|
};
|
|
49
60
|
|
|
50
61
|
export const aaveAnyGetSuppliableAsCollAssets = ({
|
|
@@ -62,8 +73,8 @@ export const aaveAnyGetEmodeMutableProps = (
|
|
|
62
73
|
const asset = getNativeAssetFromWrapped(_asset);
|
|
63
74
|
|
|
64
75
|
const assetData = assetsData[asset];
|
|
65
|
-
const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[] } = eModeCategoriesData?.[eModeCategory] || {
|
|
66
|
-
collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0',
|
|
76
|
+
const eModeCategoryData: { collateralAssets: string[], collateralFactor: string, liquidationRatio: string, ltvZeroAssets: string[], isolated?: boolean } = eModeCategoriesData?.[eModeCategory] || {
|
|
77
|
+
collateralAssets: [], ltvZeroAssets: [], collateralFactor: '0', liquidationRatio: '0', isolated: false,
|
|
67
78
|
};
|
|
68
79
|
|
|
69
80
|
if (
|
|
@@ -72,6 +83,9 @@ export const aaveAnyGetEmodeMutableProps = (
|
|
|
72
83
|
|| new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
|
|
73
84
|
) {
|
|
74
85
|
const { liquidationRatio, collateralFactor } = assetData;
|
|
86
|
+
if (eModeCategory !== 0 && eModeCategoryData.isolated && !eModeCategoryData.collateralAssets.includes(asset)) {
|
|
87
|
+
return ({ liquidationRatio, collateralFactor: '0' });
|
|
88
|
+
}
|
|
75
89
|
return ({ liquidationRatio, collateralFactor });
|
|
76
90
|
}
|
|
77
91
|
if (eModeCategoryData.ltvZeroAssets.includes(asset)) return ({ liquidationRatio: '0', collateralFactor: '0' });
|
|
@@ -118,7 +132,10 @@ export const aaveAnyGetUserReserveLtvAndLltv = (
|
|
|
118
132
|
|| !eModeCategoryData.collateralAssets.includes(asset)
|
|
119
133
|
|| new Dec(eModeCategoryData.collateralFactor || 0).eq(0)
|
|
120
134
|
) {
|
|
121
|
-
|
|
135
|
+
const ltv = eModeCategory !== 0 && eModeCategoryData?.isolated && !eModeCategoryData.collateralAssets.includes(asset)
|
|
136
|
+
? '0'
|
|
137
|
+
: assetData.collateralFactor;
|
|
138
|
+
return { ltv, lltv: assetData.liquidationRatio };
|
|
122
139
|
}
|
|
123
140
|
|
|
124
141
|
const ltv = eModeCategoryData.ltvZeroAssets.includes(asset) ? '0' : eModeCategoryData.collateralFactor;
|
|
@@ -169,9 +186,6 @@ export const aaveAnyGetAggregatedPositionData = ({
|
|
|
169
186
|
},
|
|
170
187
|
);
|
|
171
188
|
payload.safetyRatioWithLtvZeroFallback = +payload.suppliedUsd ? new Dec(payload.borrowLimitWithLtvZeroFallbackUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
172
|
-
// Normalised safety ratio (100 = liquidation on every protocol): the automation ratio above, falling back
|
|
173
|
-
// to the regular ratio when the fallback carries its '0' placeholder.
|
|
174
|
-
payload.safetyRatio = +payload.safetyRatioWithLtvZeroFallback ? payload.safetyRatioWithLtvZeroFallback : payload.ratio;
|
|
175
189
|
payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
|
|
176
190
|
payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
|
|
177
191
|
const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
|
|
@@ -270,7 +270,6 @@ export const aaveV4GetAggregatedPositionData = ({
|
|
|
270
270
|
payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
271
271
|
payload.minRatio = '100';
|
|
272
272
|
payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
273
|
-
payload.safetyRatio = payload.ratio;
|
|
274
273
|
payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
|
|
275
274
|
payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
|
|
276
275
|
const { leveragedType, leveragedAsset } = isLeveragedPosAaveV4(usedAssets);
|
|
@@ -139,7 +139,6 @@ export const getCompoundV2AggregatedData = ({
|
|
|
139
139
|
payload.collRatio = payload.borrowedUsd && payload.borrowedUsd !== '0'
|
|
140
140
|
? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString()
|
|
141
141
|
: '0';
|
|
142
|
-
payload.safetyRatio = payload.ratio;
|
|
143
142
|
|
|
144
143
|
// Calculate borrow limits per asset
|
|
145
144
|
Object.values(usedAssets).forEach((item) => {
|
|
@@ -186,7 +185,6 @@ export const getCompoundV3AggregatedData = ({
|
|
|
186
185
|
payload.incentiveUsd = incentiveUsd;
|
|
187
186
|
payload.totalInterestUsd = totalInterestUsd;
|
|
188
187
|
payload.minRatio = '100';
|
|
189
|
-
payload.safetyRatio = payload.ratio;
|
|
190
188
|
payload.liqRatio = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).toString();
|
|
191
189
|
payload.liqPercent = new Dec(payload.borrowLimitUsd).div(payload.liquidationLimitUsd).mul(100).toString();
|
|
192
190
|
payload.minDebt = assetsData[selectedMarket.baseAsset].minDebt;
|
|
@@ -5,18 +5,11 @@ import {
|
|
|
5
5
|
calcLeverageLiqPrice, getAssetsTotal, getExposure, isLeveragedPos,
|
|
6
6
|
} from '../../moneymarket';
|
|
7
7
|
import { mapRange } from '../../services/utils';
|
|
8
|
-
import { calculateNetApyFromRates } from '../../staking';
|
|
9
8
|
|
|
10
9
|
export const getCrvUsdAggregatedData = ({
|
|
11
|
-
loanExists, usedAssets, network, selectedMarket, numOfBands,
|
|
10
|
+
loanExists, usedAssets, network, selectedMarket, numOfBands, ...rest
|
|
12
11
|
}:{
|
|
13
|
-
loanExists: boolean,
|
|
14
|
-
usedAssets: CrvUSDUsedAssets,
|
|
15
|
-
network: NetworkNumber,
|
|
16
|
-
selectedMarket: CrvUSDMarketData,
|
|
17
|
-
numOfBands: number | string,
|
|
18
|
-
borrowRate?: string, // market borrow APY in %, see `CrvUSDGlobalMarketData.borrowRate`
|
|
19
|
-
collStakingApy?: string, // native yield APY in % of the collateral asset, if it is a staked asset
|
|
12
|
+
loanExists: boolean, usedAssets: CrvUSDUsedAssets, network: NetworkNumber, selectedMarket: CrvUSDMarketData, numOfBands: number | string
|
|
20
13
|
}): CrvUSDAggregatedPositionData => {
|
|
21
14
|
const payload = {} as CrvUSDAggregatedPositionData;
|
|
22
15
|
payload.supplied = getAssetsTotal(usedAssets, ({ isSupplied }: { isSupplied: boolean }) => isSupplied, ({ supplied }: { supplied: string }) => supplied); // this is wrong if we are in soft-liquidations
|
|
@@ -33,8 +26,6 @@ export const getCrvUsdAggregatedData = ({
|
|
|
33
26
|
|
|
34
27
|
// this is all approximation
|
|
35
28
|
payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
|
|
36
|
-
// Collateral ratio rebased so 100 sits on the band-derived minimum (normalised safety ratio, same scale as the other protocols).
|
|
37
|
-
payload.safetyRatio = loanExists && payload.minAllowedRatio ? new Dec(payload.ratio).div(payload.minAllowedRatio).mul(100).toString() : '0';
|
|
38
29
|
payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
|
|
39
30
|
// only take in consideration collAsset
|
|
40
31
|
payload.borrowLimitUsd = usedAssets?.[selectedMarket.collAsset]?.isSupplied
|
|
@@ -51,17 +42,5 @@ export const getCrvUsdAggregatedData = ({
|
|
|
51
42
|
|
|
52
43
|
payload.exposure = getExposure(payload.borrowedUsd, payload.suppliedUsd);
|
|
53
44
|
|
|
54
|
-
// crvUSD debt accrues the market borrow rate. Collateral (including crvUSD held during soft liquidation) earns
|
|
55
|
-
// nothing from the protocol itself; only the native yield of staked collateral is counted, as an incentive.
|
|
56
|
-
const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({
|
|
57
|
-
suppliedUsd: payload.suppliedUsd,
|
|
58
|
-
borrowedUsd: payload.borrowedUsd,
|
|
59
|
-
borrowRate,
|
|
60
|
-
incentives: [{ apy: collStakingApy, amountUsd: usedAssets?.[selectedMarket.collAsset]?.suppliedUsd || '0' }],
|
|
61
|
-
});
|
|
62
|
-
payload.netApy = netApy;
|
|
63
|
-
payload.totalInterestUsd = totalInterestUsd;
|
|
64
|
-
payload.incentiveUsd = incentiveUsd;
|
|
65
|
-
|
|
66
45
|
return payload;
|
|
67
46
|
};
|
|
@@ -143,7 +143,6 @@ borrowShares?: string,
|
|
|
143
143
|
payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
144
144
|
payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
145
145
|
payload.minRatio = marketData.minRatio;
|
|
146
|
-
payload.safetyRatio = payload.ratio;
|
|
147
146
|
const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
|
|
148
147
|
|
|
149
148
|
payload.leveragedType = leveragedType;
|
|
@@ -69,7 +69,6 @@ export const getLiquityV2AggregatedPositionData = ({
|
|
|
69
69
|
payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
|
|
70
70
|
payload.ratio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
71
71
|
payload.collRatio = (+payload.suppliedUsd && +payload.borrowedUsd) ? new Dec(payload.suppliedUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
72
|
-
payload.safetyRatio = payload.ratio;
|
|
73
72
|
const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApyLiquityV2(usedAssets, assetsData, interestRate);
|
|
74
73
|
payload.netApy = netApy;
|
|
75
74
|
payload.incentiveUsd = incentiveUsd;
|
|
@@ -38,8 +38,6 @@ export const getLlamaLendAggregatedData = ({
|
|
|
38
38
|
|
|
39
39
|
// this is all approximation
|
|
40
40
|
payload.minAllowedRatio = mapRange(numOfBands, 4, 50, 115, 140); // collateral ratio
|
|
41
|
-
// Collateral ratio rebased so 100 sits on the band-derived minimum (normalised safety ratio, same scale as the other protocols).
|
|
42
|
-
payload.safetyRatio = loanExists && payload.minAllowedRatio ? new Dec(payload.ratio).div(payload.minAllowedRatio).mul(100).toString() : '0';
|
|
43
41
|
payload.collFactor = new Dec(1).div(payload.minAllowedRatio).mul(100).toString(); // collateral factor = 1 / collateral ratio
|
|
44
42
|
// only take in consideration collAsset
|
|
45
43
|
payload.borrowLimitUsd = usedAssets?.[collAsset]?.isSupplied
|
|
@@ -10,7 +10,6 @@ export const parseCollateralInfo = (
|
|
|
10
10
|
_rate: string,
|
|
11
11
|
_spot: string,
|
|
12
12
|
_line: string,
|
|
13
|
-
_dust: string,
|
|
14
13
|
_duty: string,
|
|
15
14
|
_futureRate: string,
|
|
16
15
|
_chop: string,
|
|
@@ -21,7 +20,7 @@ export const parseCollateralInfo = (
|
|
|
21
20
|
const rate = new Dec(_rate).toString();
|
|
22
21
|
const spot = new Dec(_spot).div(1e27).toString();
|
|
23
22
|
const line = new Dec(_line).div(1e45).toString();
|
|
24
|
-
const dust = new Dec(
|
|
23
|
+
const dust = new Dec(_rate).div(1e45).toString();
|
|
25
24
|
const duty = new Dec(_duty).toString();
|
|
26
25
|
const futureRate = new Dec(_futureRate).toString();
|
|
27
26
|
const chop = new Dec(_chop).div(1e18).toString();
|
|
@@ -54,8 +54,6 @@ export const getMorphoBlueAggregatedPositionData = ({ usedAssets, assetsData, ma
|
|
|
54
54
|
payload.ltv = new Dec(usedAssets[loanToken]?.borrowed || 0).div(oracle).div(usedAssets[collateralToken]?.supplied || 1).toString(); // default to 1 because can't div 0
|
|
55
55
|
payload.ratio = new Dec(usedAssets[collateralToken]?.supplied || 0).mul(oracle).div(usedAssets[loanToken]?.borrowed || 1).mul(100)
|
|
56
56
|
.toString();
|
|
57
|
-
// Borrow limit over debt, so 100 sits on the market's LLTV however low it is (`ratio` is the raw collateral ratio).
|
|
58
|
-
payload.safetyRatio = +payload.borrowedUsd > 0 ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
59
57
|
|
|
60
58
|
const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
|
|
61
59
|
payload.leveragedType = leveragedType;
|
|
@@ -102,8 +102,6 @@ export const getMorphoMidnightAggregatedPositionData = ({
|
|
|
102
102
|
payload.ltv = new Dec(payload.suppliedCollateralUsd).eq(0) ? '0' : new Dec(payload.borrowedUsd).div(payload.suppliedCollateralUsd).toString();
|
|
103
103
|
payload.ratio = new Dec(payload.borrowedUsd).eq(0) ? '0' : new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString();
|
|
104
104
|
payload.healthRatio = new Dec(payload.borrowedUsd).eq(0) ? 'Infinity' : new Dec(payload.liquidationLimitUsd).div(payload.borrowedUsd).toDP(4).toString();
|
|
105
|
-
// Borrow limit over debt, so 100 sits on the market's LLTV however low it is (`ratio` is the raw collateral ratio).
|
|
106
|
-
payload.safetyRatio = +payload.borrowedUsd > 0 ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
107
105
|
|
|
108
106
|
const { leveragedType, leveragedAsset } = isLeveragedPos(usedAssets);
|
|
109
107
|
payload.leveragedType = leveragedType;
|
|
@@ -96,7 +96,6 @@ export const sparkGetAggregatedPositionData = ({
|
|
|
96
96
|
payload.leftToBorrowUsd = leftToBorrowUsd.lte('0') ? '0' : leftToBorrowUsd.toString();
|
|
97
97
|
payload.ratio = +payload.suppliedUsd ? new Dec(payload.borrowLimitUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
98
98
|
payload.collRatio = +payload.suppliedUsd ? new Dec(payload.suppliedCollateralUsd).div(payload.borrowedUsd).mul(100).toString() : '0';
|
|
99
|
-
payload.safetyRatio = payload.ratio;
|
|
100
99
|
const { netApy, incentiveUsd, totalInterestUsd } = calculateNetApy({ usedAssets, assetsData });
|
|
101
100
|
payload.netApy = netApy;
|
|
102
101
|
payload.incentiveUsd = incentiveUsd;
|
package/src/liquity/index.ts
CHANGED
|
@@ -18,7 +18,6 @@ import { ZERO_ADDRESS } from '../constants';
|
|
|
18
18
|
import { getViemProvider, setViemBlockNumber } from '../services/viem';
|
|
19
19
|
import { getEthAmountForDecimals } from '../services/utils';
|
|
20
20
|
import { getExposure } from '../moneymarket';
|
|
21
|
-
import { calculateNetApyFromRates } from '../staking';
|
|
22
21
|
|
|
23
22
|
export const LIQUITY_NORMAL_MODE_RATIO = 110; // MCR
|
|
24
23
|
export const LIQUITY_RECOVERY_MODE_RATIO = 150; // CCR
|
|
@@ -90,15 +89,6 @@ export const _getLiquityTroveInfo = async (provider: Client, network: NetworkNum
|
|
|
90
89
|
]);
|
|
91
90
|
|
|
92
91
|
const recoveryMode = troveInfo[6];
|
|
93
|
-
const minCollateralRatio = recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO;
|
|
94
|
-
const collateral = assetAmountInEth(troveInfo[1].toString());
|
|
95
|
-
const debtInAsset = assetAmountInEth(troveInfo[2].toString());
|
|
96
|
-
const collateralUsd = new Dec(collateral).mul(assetAmountInEth(assetPrice.toString())).toString();
|
|
97
|
-
const collRatio = +debtInAsset ? new Dec(collateralUsd).div(debtInAsset).mul(100).toString() : '0';
|
|
98
|
-
|
|
99
|
-
// LUSD debt is interest free (only a one-off borrowing fee on issuance) and ETH collateral earns no yield,
|
|
100
|
-
// so a trove's net APY is always 0. It is exposed for parity with the other protocols.
|
|
101
|
-
const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({ suppliedUsd: collateralUsd, borrowedUsd: debtInAsset });
|
|
102
92
|
|
|
103
93
|
const payload = {
|
|
104
94
|
troveStatus: LIQUITY_TROVE_STATUS_ENUM[+(troveInfo[0].toString())],
|
|
@@ -112,15 +102,10 @@ export const _getLiquityTroveInfo = async (provider: Client, network: NetworkNum
|
|
|
112
102
|
totalETH: totalETH.toString(),
|
|
113
103
|
totalLUSD: totalLUSD.toString(),
|
|
114
104
|
debtInFront: debtInFront.toString(),
|
|
115
|
-
minCollateralRatio,
|
|
116
|
-
// Collateral ratio rebased so 100 sits on the trove's minimum collateral ratio (normalised safety ratio).
|
|
117
|
-
safetyRatio: +minCollateralRatio > 0 ? new Dec(collRatio).div(minCollateralRatio).mul(100).toString() : '0',
|
|
105
|
+
minCollateralRatio: recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO,
|
|
118
106
|
priceForRecovery: new Dec(recoveryMode ? LIQUITY_RECOVERY_MODE_RATIO : LIQUITY_NORMAL_MODE_RATIO).mul(totalLUSD).div(totalETH).div(100)
|
|
119
107
|
.toString(),
|
|
120
|
-
exposure: getExposure(
|
|
121
|
-
netApy,
|
|
122
|
-
totalInterestUsd,
|
|
123
|
-
incentiveUsd,
|
|
108
|
+
exposure: getExposure(assetAmountInEth(troveInfo[2].toString()), new Dec(assetAmountInEth(troveInfo[1].toString())).mul(assetPrice).toString()),
|
|
124
109
|
};
|
|
125
110
|
|
|
126
111
|
return payload;
|
package/src/maker/index.ts
CHANGED
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
import Dec from 'decimal.js';
|
|
2
2
|
import {
|
|
3
|
-
assetAmountInEth, bytesToString, getAssetInfo, ilkToAsset,
|
|
3
|
+
assetAmountInEth, bytesToString, getAssetInfo, ilkToAsset,
|
|
4
4
|
} from '@defisaver/tokens';
|
|
5
5
|
import { Client, PublicClient } from 'viem';
|
|
6
6
|
import {
|
|
7
|
-
Blockish, EthAddress, EthereumProvider,
|
|
7
|
+
Blockish, EthAddress, EthereumProvider, NetworkNumber, PositionBalances,
|
|
8
8
|
} from '../types/common';
|
|
9
9
|
import {
|
|
10
10
|
getConfigContractAddress, McdDogContractViem, McdGetCdpsContractViem, McdJugContractViem, McdSpotterContractViem, McdVatContractViem, McdViewContractViem,
|
|
11
11
|
} from '../contracts';
|
|
12
|
-
import {
|
|
13
|
-
CdpData, CdpInfo, CdpType, IlkInfo,
|
|
14
|
-
} from '../types';
|
|
12
|
+
import { CdpData, CdpInfo, CdpType } from '../types';
|
|
15
13
|
import { wethToEth } from '../services/utils';
|
|
16
14
|
import { parseCollateralInfo } from '../helpers/makerHelpers';
|
|
17
15
|
import { getViemProvider, setViemBlockNumber } from '../services/viem';
|
|
18
16
|
import { getExposure } from '../moneymarket';
|
|
19
|
-
import { calculateNetApyFromRates, getStakingApy, STAKING_ASSETS } from '../staking';
|
|
20
17
|
|
|
21
18
|
export const _getMakerAccountBalances = async (provider: PublicClient, network: NetworkNumber, block: Blockish, addressMapping: boolean, cdpId: string, _managerAddress?: EthAddress): Promise<PositionBalances> => {
|
|
22
19
|
let balances: PositionBalances = {
|
|
@@ -51,7 +48,7 @@ export const _getMakerAccountBalances = async (provider: PublicClient, network:
|
|
|
51
48
|
const [
|
|
52
49
|
par,
|
|
53
50
|
[_, mat],
|
|
54
|
-
[artGlobal, rate, spot, line
|
|
51
|
+
[artGlobal, rate, spot, line],
|
|
55
52
|
[duty],
|
|
56
53
|
futureRate,
|
|
57
54
|
chop,
|
|
@@ -72,7 +69,6 @@ export const _getMakerAccountBalances = async (provider: PublicClient, network:
|
|
|
72
69
|
rate.toString(),
|
|
73
70
|
spot.toString(),
|
|
74
71
|
line.toString(),
|
|
75
|
-
dust.toString(),
|
|
76
72
|
duty.toString(),
|
|
77
73
|
futureRate.toString(),
|
|
78
74
|
chop.toString(),
|
|
@@ -133,73 +129,44 @@ export const getUserCdps = async (
|
|
|
133
129
|
userAddress: EthAddress,
|
|
134
130
|
): Promise<CdpInfo[]> => _getUserCdps(getViemProvider(provider, network), network, userAddress);
|
|
135
131
|
|
|
136
|
-
export const
|
|
132
|
+
export const _getMakerCdpData = async (provider: Client, network: NetworkNumber, cdp: CdpInfo): Promise<CdpData> => {
|
|
137
133
|
const vatContract = McdVatContractViem(provider, network);
|
|
138
134
|
const spotterContract = McdSpotterContractViem(provider, network);
|
|
139
135
|
const dogContract = McdDogContractViem(provider, network);
|
|
140
136
|
const jugContract = McdJugContractViem(provider, network);
|
|
141
137
|
|
|
142
|
-
const par = await spotterContract.read.par();
|
|
143
|
-
|
|
144
|
-
const ilksInfo = await Promise.all(ilkLabels.map(async (ilkLabel) => {
|
|
145
|
-
const ilk = stringToBytes(ilkLabel) as HexString;
|
|
146
|
-
const [
|
|
147
|
-
[_, mat],
|
|
148
|
-
[artGlobal, rate, spot, line, dust],
|
|
149
|
-
[duty],
|
|
150
|
-
futureRate,
|
|
151
|
-
chop,
|
|
152
|
-
] = await Promise.all([
|
|
153
|
-
spotterContract.read.ilks([ilk]),
|
|
154
|
-
vatContract.read.ilks([ilk]),
|
|
155
|
-
jugContract.read.ilks([ilk]),
|
|
156
|
-
jugContract.read.drip([ilk]),
|
|
157
|
-
dogContract.read.chop([ilk]),
|
|
158
|
-
]);
|
|
159
|
-
|
|
160
|
-
return parseCollateralInfo(
|
|
161
|
-
ilk,
|
|
162
|
-
par.toString(),
|
|
163
|
-
mat.toString(),
|
|
164
|
-
artGlobal.toString(),
|
|
165
|
-
rate.toString(),
|
|
166
|
-
spot.toString(),
|
|
167
|
-
line.toString(),
|
|
168
|
-
dust.toString(),
|
|
169
|
-
duty.toString(),
|
|
170
|
-
futureRate.toString(),
|
|
171
|
-
chop.toString(),
|
|
172
|
-
);
|
|
173
|
-
}));
|
|
174
|
-
|
|
175
|
-
return Object.fromEntries(ilksInfo.map((ilkInfo) => [ilkInfo.ilkLabel, ilkInfo]));
|
|
176
|
-
};
|
|
177
|
-
|
|
178
|
-
export const getMakerIlksData = async (
|
|
179
|
-
provider: EthereumProvider,
|
|
180
|
-
network: NetworkNumber,
|
|
181
|
-
ilkLabels: string[],
|
|
182
|
-
): Promise<Record<string, IlkInfo>> => _getMakerIlksData(getViemProvider(provider, network, { batch: { multicall: true } }), network, ilkLabels);
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* @param ilkInfo optional precomputed ilk data (from `_getMakerIlksData`); when provided the per-ilk reads are skipped
|
|
186
|
-
*/
|
|
187
|
-
export const _getMakerCdpData = async (provider: Client, network: NetworkNumber, cdp: CdpInfo, ilkInfo?: IlkInfo): Promise<CdpData> => {
|
|
188
|
-
const vatContract = McdVatContractViem(provider, network);
|
|
189
|
-
|
|
190
138
|
const [
|
|
191
139
|
[ink, art],
|
|
192
140
|
coll,
|
|
193
|
-
|
|
194
|
-
|
|
141
|
+
par,
|
|
142
|
+
[_, mat],
|
|
143
|
+
[artGlobal, rate, spot, line],
|
|
144
|
+
[duty],
|
|
145
|
+
futureRate,
|
|
146
|
+
chop,
|
|
195
147
|
] = await Promise.all([
|
|
196
148
|
vatContract.read.urns([cdp.ilk, cdp.urn]),
|
|
197
149
|
vatContract.read.gem([cdp.ilk, cdp.urn]),
|
|
198
|
-
|
|
199
|
-
|
|
150
|
+
spotterContract.read.par(),
|
|
151
|
+
spotterContract.read.ilks([cdp.ilk]),
|
|
152
|
+
vatContract.read.ilks([cdp.ilk]),
|
|
153
|
+
jugContract.read.ilks([cdp.ilk]),
|
|
154
|
+
jugContract.read.drip([cdp.ilk]),
|
|
155
|
+
dogContract.read.chop([cdp.ilk]),
|
|
200
156
|
]);
|
|
201
157
|
|
|
202
|
-
const collInfo =
|
|
158
|
+
const collInfo = parseCollateralInfo(
|
|
159
|
+
cdp.ilk,
|
|
160
|
+
par.toString(),
|
|
161
|
+
mat.toString(),
|
|
162
|
+
artGlobal.toString(),
|
|
163
|
+
rate.toString(),
|
|
164
|
+
spot.toString(),
|
|
165
|
+
line.toString(),
|
|
166
|
+
duty.toString(),
|
|
167
|
+
futureRate.toString(),
|
|
168
|
+
chop.toString(),
|
|
169
|
+
);
|
|
203
170
|
|
|
204
171
|
const collateral = assetAmountInEth(ink.toString(), `MCD-${cdp.asset}`);
|
|
205
172
|
|
|
@@ -213,20 +180,9 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
|
|
|
213
180
|
let ratio = new Dec(ink).times(collInfo.assetPrice).div(debt).times(100)
|
|
214
181
|
.toString();
|
|
215
182
|
if (new Dec(debt).eq(0)) ratio = '0';
|
|
216
|
-
// Collateral ratio rebased so 100 sits on the ilk's liquidation ratio (normalised safety ratio).
|
|
217
|
-
const safetyRatio = +collInfo.liqPercent > 0 ? new Dec(ratio).div(collInfo.liqPercent).mul(100).toString() : '0';
|
|
218
183
|
|
|
219
184
|
const debtTooLow = new Dec(debt).gt(0) && new Dec(assetAmountInEth(debt, 'DAI')).lt(collInfo.minDebt);
|
|
220
185
|
|
|
221
|
-
// DAI debt accrues the ilk's stability fee. Collateral earns nothing inside the vault, except for the
|
|
222
|
-
// native yield of staked collateral (e.g. wstETH), which is tracked as an incentive.
|
|
223
|
-
const { netApy, totalInterestUsd, incentiveUsd } = calculateNetApyFromRates({
|
|
224
|
-
suppliedUsd: collateralUsd,
|
|
225
|
-
borrowedUsd: assetAmountInEth(debt, 'DAI'),
|
|
226
|
-
borrowRate: collInfo.stabilityFee.toString(),
|
|
227
|
-
incentives: [{ apy: collStakingApy, amountUsd: collateralUsd }],
|
|
228
|
-
});
|
|
229
|
-
|
|
230
186
|
return {
|
|
231
187
|
owner: cdp.owner,
|
|
232
188
|
id: cdp.id.toString(),
|
|
@@ -245,7 +201,6 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
|
|
|
245
201
|
debtAssetMarketPrice: '1',
|
|
246
202
|
liquidationPrice,
|
|
247
203
|
ratio,
|
|
248
|
-
safetyRatio,
|
|
249
204
|
liqRatio: collInfo.liqRatio.toString(),
|
|
250
205
|
liqPercent: parseFloat(collInfo.liqPercent.toString()),
|
|
251
206
|
assetPrice: collInfo.assetPrice,
|
|
@@ -261,9 +216,6 @@ export const _getMakerCdpData = async (provider: Client, network: NetworkNumber,
|
|
|
261
216
|
liquidationFee: collInfo.liquidationFee,
|
|
262
217
|
lastUpdated: Date.now(),
|
|
263
218
|
exposure: getExposure(assetAmountInEth(debt, 'DAI'), collateralUsd),
|
|
264
|
-
netApy,
|
|
265
|
-
totalInterestUsd,
|
|
266
|
-
incentiveUsd,
|
|
267
219
|
};
|
|
268
220
|
};
|
|
269
221
|
|
package/src/markets/index.ts
CHANGED
|
@@ -30,5 +30,4 @@ export {
|
|
|
30
30
|
getFTokenAddress,
|
|
31
31
|
getFluidMarketInfoByAddress,
|
|
32
32
|
} from './fluid';
|
|
33
|
-
export { AaveV4Spokes, findAaveV4SpokeByAddress } from './aaveV4';
|
|
34
|
-
export { MakerActiveIlks } from './maker';
|
|
33
|
+
export { AaveV4Spokes, findAaveV4SpokeByAddress } from './aaveV4';
|