Skip to content

Commit 201ef6b

Browse files
committed
feat: health factor calculations added before and after migration
1 parent 5d314d7 commit 201ef6b

File tree

5 files changed

+195
-35
lines changed

5 files changed

+195
-35
lines changed

pages/v3-migration.page.tsx

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { ConnectWalletPaper } from 'src/components/ConnectWalletPaper';
55
import { ContentContainer } from 'src/components/ContentContainer';
66
import { MigrateV3Modal } from 'src/components/transactions/MigrateV3/MigrateV3Modal';
77
import { useAppDataContext } from 'src/hooks/app-data-provider/useAppDataProvider';
8+
import { useCurrentTimestamp } from 'src/hooks/useCurrentTimestamp';
89
import { usePermissions } from 'src/hooks/usePermissions';
910
import { useUserReserves } from 'src/hooks/useUserReserves';
1011
import { MainLayout } from 'src/layouts/MainLayout';
@@ -16,13 +17,32 @@ import { MigrationListItemLoader } from 'src/modules/migration/MigrationListItem
1617
import { MigrationLists } from 'src/modules/migration/MigrationLists';
1718
import { MigrationTopPanel } from 'src/modules/migration/MigrationTopPanel';
1819
import { usePoolDataV3Subscription, useRootStore } from 'src/store/root';
20+
import {
21+
selectV2UserSummaryAfterMigration,
22+
selectV3UserSummary,
23+
selectV3UserSummaryAfterMigration,
24+
} from 'src/store/v3MigrationSelectors';
1925

2026
export default function V3Migration() {
2127
const { loading } = useAppDataContext();
2228
const { currentAccount, loading: web3Loading } = useWeb3Context();
2329
const { isPermissionsLoading } = usePermissions();
2430
const setCurrentMarketForMigration = useRootStore((state) => state.setCurrentMarketForMigration);
2531

32+
const currentTimeStamp = useCurrentTimestamp(5);
33+
34+
const v2UserSummaryAfterMigration = useRootStore((state) =>
35+
selectV2UserSummaryAfterMigration(state, currentTimeStamp)
36+
);
37+
38+
const v3UserSummaryAfterMigration = useRootStore((state) =>
39+
selectV3UserSummaryAfterMigration(state, currentTimeStamp)
40+
);
41+
42+
const v3UserSummaryBeforeMigration = useRootStore((state) =>
43+
selectV3UserSummary(state, currentTimeStamp)
44+
);
45+
2646
const { user, borrowPositions } = useUserReserves();
2747

2848
const {
@@ -43,7 +63,6 @@ export default function V3Migration() {
4363
return (
4464
<>
4565
<MigrationTopPanel />
46-
4766
{currentAccount && !isPermissionsLoading ? (
4867
<ContentContainer>
4968
<MigrationLists
@@ -121,10 +140,10 @@ export default function V3Migration() {
121140
<Divider sx={{ my: 10 }} />
122141

123142
<MigrationBottomPanel
124-
hfV2Current={'1.2'} // TODO: need value
125-
hfV2AfterChange={'2'} // TODO: need value
126-
hfV3Current={'1.2'} // TODO: need value
127-
hfV3AfterChange={'2'} // TODO: need value
143+
hfV2Current={user.healthFactor} // TODO: need value
144+
hfV2AfterChange={v2UserSummaryAfterMigration.healthFactor} // TODO: need value
145+
hfV3Current={v3UserSummaryBeforeMigration.healthFactor} // TODO: need value
146+
hfV3AfterChange={v3UserSummaryAfterMigration.healthFactor} // TODO: need value
128147
disableButton={
129148
!Object.keys(selectedSupplyAssets).length && !Object.keys(selectedBorrowAssets).length
130149
}

src/store/poolSelectors.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { formatReservesAndIncentives, formatUserSummaryAndIncentives } from '@aa
22
import { EmodeCategory } from 'src/helpers/types';
33
import { fetchIconSymbolAndName, STABLE_ASSETS } from 'src/ui-config/reservePatches';
44
import { CustomMarket, MarketDataType, marketsData } from 'src/utils/marketsAndNetworksConfig';
5+
import { PoolReserve } from './poolSlice';
56

67
import { RootStore } from './root';
78

@@ -23,27 +24,47 @@ export const selectCurrentChainIdV2MarketData = (state: RootStore) => {
2324
?.get(marketData.addresses.LENDING_POOL_ADDRESS_PROVIDER);
2425
};
2526

27+
export const selectCurrentChainIdV3MarketData = (state: RootStore) => {
28+
const v2MarketKey = selectCurrentChainIdV3MarketKey(state);
29+
const marketData = marketsData[v2MarketKey];
30+
return state.data
31+
.get(state.currentChainId)
32+
?.get(marketData.addresses.LENDING_POOL_ADDRESS_PROVIDER);
33+
};
34+
2635
export const selectCurrentUserLendingPoolData = (state: RootStore) => {
2736
return state.data
2837
.get(state.currentChainId)
2938
?.get(state.currentMarketData.addresses.LENDING_POOL_ADDRESS_PROVIDER);
3039
};
3140

41+
export const selectFormatUserEmodeCategoryId = (reserve?: PoolReserve) => {
42+
return reserve?.userEmodeCategoryId || 0;
43+
};
44+
3245
export const selectCurrentUserEmodeCategoryId = (state: RootStore): number => {
33-
return selectCurrentUserLendingPoolData(state)?.userEmodeCategoryId || 0;
46+
return selectFormatUserEmodeCategoryId(selectCurrentUserLendingPoolData(state));
47+
};
48+
49+
export const selectFormatUserReserves = (reserve?: PoolReserve) => {
50+
return reserve?.userReserves || [];
3451
};
3552

3653
export const selectCurrentUserReserves = (state: RootStore) => {
37-
return selectCurrentUserLendingPoolData(state)?.userReserves || [];
54+
return selectFormatUserReserves(selectCurrentUserLendingPoolData(state));
55+
};
56+
57+
export const selectFormatReserves = (reserve?: PoolReserve) => {
58+
return reserve?.reserves || [];
3859
};
3960

4061
export const selectCurrentReserves = (state: RootStore) => {
41-
return selectCurrentUserLendingPoolData(state)?.reserves || [];
62+
return selectFormatReserves(selectCurrentUserLendingPoolData(state));
4263
};
4364

44-
export const selectCurrentBaseCurrencyData = (state: RootStore) => {
65+
export const selectFormatBaseCurrencyData = (reserve?: PoolReserve) => {
4566
return (
46-
selectCurrentUserLendingPoolData(state)?.baseCurrencyData || {
67+
reserve?.baseCurrencyData || {
4768
marketReferenceCurrencyDecimals: 0,
4869
marketReferenceCurrencyPriceInUsd: '0',
4970
networkBaseTokenPriceInUsd: '0',
@@ -52,6 +73,10 @@ export const selectCurrentBaseCurrencyData = (state: RootStore) => {
5273
);
5374
};
5475

76+
export const selectCurrentBaseCurrencyData = (state: RootStore) => {
77+
return selectFormatBaseCurrencyData(selectCurrentUserLendingPoolData(state));
78+
};
79+
5580
export const reserveSortFn = (a: { iconSymbol: string }, b: { iconSymbol: string }) => {
5681
const aIsStable = STABLE_ASSETS.includes(a.iconSymbol.toUpperCase());
5782
const bIsStable = STABLE_ASSETS.includes(b.iconSymbol.toUpperCase());

src/store/poolSlice.ts

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,20 @@ import { availableMarkets, marketsData, networkConfigs } from 'src/utils/markets
3939
import { optimizedPath } from 'src/utils/utils';
4040
import { StateCreator } from 'zustand';
4141

42-
import {
43-
selectCurrentChainIdV3MarketKey,
44-
selectFormattedReserves,
45-
} from './poolSelectors';
42+
import { selectCurrentChainIdV3MarketKey, selectFormattedReserves } from './poolSelectors';
4643
import { RootStore } from './root';
4744

45+
// TODO: what is the better name for this type?
46+
export type PoolReserve = {
47+
reserves?: ReserveDataHumanized[];
48+
baseCurrencyData?: PoolBaseCurrencyHumanized;
49+
userEmodeCategoryId?: number;
50+
userReserves?: UserReserveDataHumanized[];
51+
};
52+
4853
// TODO: add chain/provider/account mapping
4954
export interface PoolSlice {
50-
data: Map<
51-
number,
52-
Map<
53-
string,
54-
{
55-
reserves?: ReserveDataHumanized[];
56-
baseCurrencyData?: PoolBaseCurrencyHumanized;
57-
userEmodeCategoryId?: number;
58-
userReserves?: UserReserveDataHumanized[];
59-
}
60-
>
61-
>;
55+
data: Map<number, Map<string, PoolReserve>>;
6256
refreshPoolData: (marketData?: MarketDataType) => Promise<void>;
6357
refreshPoolV3Data: () => Promise<void>;
6458
// methods
@@ -129,7 +123,6 @@ export const createPoolSlice: StateCreator<
129123
const account = get().account;
130124
const currentChainId = get().currentChainId;
131125
const currentMarketData = marketData || get().currentMarketData;
132-
console.log(get().currentMarketData, 'currentMarketData');
133126
const poolDataProviderContract = new UiPoolDataProvider({
134127
uiPoolDataProviderAddress: currentMarketData.addresses.UI_POOL_DATA_PROVIDER,
135128
provider: get().jsonRpcProvider(),

src/store/v3MigrationSelectors.ts

Lines changed: 131 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
import { InterestRate } from '@aave/contract-helpers';
1+
import {
2+
InterestRate,
3+
PoolBaseCurrencyHumanized,
4+
ReserveDataHumanized,
5+
UserReserveDataHumanized,
6+
} from '@aave/contract-helpers';
27
import { V3MigrationHelperSignedPermit } from '@aave/contract-helpers/dist/esm/v3-migration-contract/v3MigrationTypes';
3-
import { valueToBigNumber } from '@aave/math-utils';
8+
import { formatReserves, formatUserSummary, valueToBigNumber } from '@aave/math-utils';
49
import { SignatureLike } from '@ethersproject/bytes';
5-
import { BigNumber, BigNumberish, constants } from 'ethers';
10+
import { BigNumberish, constants } from 'ethers';
11+
612
import {
13+
selectCurrentChainIdV2MarketData,
14+
selectCurrentChainIdV3MarketData,
15+
selectFormatBaseCurrencyData,
16+
selectFormatUserEmodeCategoryId,
717
selectUserNonEmtpySummaryAndIncentive,
818
selectUserSummaryAndIncentives,
919
} from './poolSelectors';
@@ -21,7 +31,6 @@ export const selectUserSupplyIncreasedReservesForMigrationPermits = (
2131
store: RootStore,
2232
timestamp: number
2333
) => {
24-
console.log('selectUserSupplyIncreasedReservesForMigrationPermits')
2534
return selectedUserSupplyReservesForMigration(store, timestamp).map((userReserve) => {
2635
const increasedAmount = addPercent(userReserve.underlyingBalance);
2736
return { ...userReserve, increasedAmount };
@@ -84,7 +93,122 @@ export const selectUserBorrowReservesForMigration = (store: RootStore, timestamp
8493
return selectedUserReserves;
8594
};
8695

87-
export const selectCurrentMarketV2Reserves = (store: RootStore, timestamp: number) => {
88-
const currentChainId = store.currentChainId;
89-
return store.data.get(currentChainId);
96+
export const selectFormatUserSummaryForMigration = (
97+
reserves: ReserveDataHumanized[] = [],
98+
userReserves: UserReserveDataHumanized[] = [],
99+
baseCurrencyData: PoolBaseCurrencyHumanized,
100+
userEmodeCategoryId: number,
101+
currentTimestamp: number
102+
) => {
103+
const { marketReferenceCurrencyDecimals, marketReferenceCurrencyPriceInUsd } = baseCurrencyData;
104+
const formattedReserves = formatReserves({
105+
reserves: reserves,
106+
currentTimestamp,
107+
marketReferenceCurrencyDecimals: marketReferenceCurrencyDecimals,
108+
marketReferencePriceInUsd: marketReferenceCurrencyPriceInUsd,
109+
});
110+
111+
const formattedSummary = formatUserSummary({
112+
currentTimestamp,
113+
formattedReserves,
114+
marketReferenceCurrencyDecimals: marketReferenceCurrencyDecimals,
115+
marketReferencePriceInUsd: marketReferenceCurrencyPriceInUsd,
116+
userReserves,
117+
userEmodeCategoryId: 0,
118+
});
119+
120+
return formattedSummary;
121+
};
122+
123+
export const selectV2UserSummaryAfterMigration = (store: RootStore, currentTimestamp: number) => {
124+
const poolReserve = selectCurrentChainIdV2MarketData(store);
125+
126+
const userReserves =
127+
poolReserve?.userReserves?.filter((userReserve) => {
128+
if (
129+
store.selectedMigrationSupplyAssets[userReserve.underlyingAsset] ||
130+
store.selectedMigrationBorrowAssets[userReserve.underlyingAsset]
131+
) {
132+
return false;
133+
}
134+
return true;
135+
}) || [];
136+
137+
const baseCurrencyData = selectFormatBaseCurrencyData(poolReserve);
138+
const userEmodeCategoryId = selectFormatUserEmodeCategoryId(poolReserve);
139+
140+
return selectFormatUserSummaryForMigration(
141+
poolReserve?.reserves,
142+
userReserves,
143+
baseCurrencyData,
144+
userEmodeCategoryId,
145+
currentTimestamp
146+
);
147+
};
148+
149+
const combine = (a: string, b: string): string => {
150+
return valueToBigNumber(a).plus(valueToBigNumber(b)).toString();
151+
};
152+
153+
export const selectV3UserSummaryAfterMigration = (store: RootStore, currentTimestamp: number) => {
154+
const poolReserveV3 = selectCurrentChainIdV3MarketData(store);
155+
156+
const supplies = selectedUserSupplyReservesForMigration(store, currentTimestamp);
157+
const borrows = selectUserBorrowReservesForMigration(store, currentTimestamp);
158+
159+
//TODO: refactor that to be more efficient
160+
const suppliesMap = supplies.concat(borrows).reduce((obj, item) => {
161+
obj[item.underlyingAsset] = item;
162+
return obj;
163+
}, {} as Record<string, typeof supplies[0]>);
164+
165+
const userReserves =
166+
poolReserveV3?.userReserves?.map((userReserve) => {
167+
const suppliedAsset = suppliesMap[userReserve.underlyingAsset];
168+
if (suppliedAsset) {
169+
const combinedScaledATokenBalance = combine(
170+
userReserve.scaledATokenBalance,
171+
suppliedAsset.scaledATokenBalance
172+
);
173+
//TODO: merge only if emode categories are the same?
174+
return {
175+
...userReserve,
176+
scaledATokenBalance: combinedScaledATokenBalance,
177+
scaledVariableDebt: combine(
178+
userReserve.scaledVariableDebt,
179+
suppliedAsset.scaledVariableDebt
180+
),
181+
principalStableDebt: combine(
182+
userReserve.principalStableDebt,
183+
suppliedAsset.principalStableDebt
184+
),
185+
};
186+
}
187+
return userReserve;
188+
}) || [];
189+
190+
const baseCurrencyData = selectFormatBaseCurrencyData(poolReserveV3);
191+
const userEmodeCategoryId = selectFormatUserEmodeCategoryId(poolReserveV3);
192+
193+
return selectFormatUserSummaryForMigration(
194+
poolReserveV3?.reserves,
195+
userReserves,
196+
baseCurrencyData,
197+
userEmodeCategoryId,
198+
currentTimestamp
199+
);
200+
};
201+
202+
export const selectV3UserSummary = (store: RootStore, timestamp: number) => {
203+
const poolReserveV3 = selectCurrentChainIdV3MarketData(store);
204+
const baseCurrencyData = selectFormatBaseCurrencyData(poolReserveV3);
205+
const userEmodeCategoryId = selectFormatUserEmodeCategoryId(poolReserveV3);
206+
207+
return selectFormatUserSummaryForMigration(
208+
poolReserveV3?.reserves,
209+
poolReserveV3?.userReserves,
210+
baseCurrencyData,
211+
userEmodeCategoryId,
212+
timestamp
213+
);
90214
};

src/store/v3MigrationSlice.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ export const createV3MigrationSlice: StateCreator<
7979

8080
const { name } = await getTokenData(underlyingAsset);
8181
const chainId = get().currentChainId;
82-
console.log(name, 'name');
8382

8483
const erc20_2612Service = new ERC20_2612Service(get().jsonRpcProvider());
8584

0 commit comments

Comments
 (0)