Skip to content

Commit 2407330

Browse files
committed
feat: v3 migration prototype continue
1 parent 061f6d8 commit 2407330

File tree

8 files changed

+77
-44
lines changed

8 files changed

+77
-44
lines changed

pages/_app.page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { CollateralChangeModal } from 'src/components/transactions/CollateralCha
1616
import { EmodeModal } from 'src/components/transactions/Emode/EmodeModal';
1717
import { FaucetModal } from 'src/components/transactions/Faucet/FaucetModal';
1818
import { GasStationProvider } from 'src/components/transactions/GasStation/GasStationProvider';
19+
import { MigrateV3Modal } from 'src/components/transactions/MigrateV3/MigrateV3Modal';
1920
import { RateSwitchModal } from 'src/components/transactions/RateSwitch/RateSwitchModal';
2021
import { RepayModal } from 'src/components/transactions/Repay/RepayModal';
2122
import { SupplyModal } from 'src/components/transactions/Supply/SupplyModal';
@@ -85,6 +86,7 @@ export default function MyApp(props: MyAppProps) {
8586
<EmodeModal />
8687
<SwapModal />
8788
<FaucetModal />
89+
<MigrateV3Modal />
8890
</GasStationProvider>
8991
</AppDataProvider>
9092
</BackgroundDataProvider>

pages/v3-migration.page.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
import { MigrateV3Modal } from 'src/components/transactions/MigrateV3/MigrateV3Modal';
12
import { StakeModal } from 'src/components/transactions/Stake/StakeModal';
23
import { StakeCooldownModal } from 'src/components/transactions/StakeCooldown/StakeCooldownModal';
34
import { StakeRewardClaimModal } from 'src/components/transactions/StakeRewardClaim/StakeRewardClaimModal';
45
import { UnStakeModal } from 'src/components/transactions/UnStake/UnStakeModal';
6+
import { useModalContext } from 'src/hooks/useModal';
57
import { useUserReserves } from 'src/hooks/useUserReserves';
68
import { MainLayout } from 'src/layouts/MainLayout';
79
import { useRootStore } from 'src/store/root';
810

911
export default function V3Migration() {
1012
const { user, borrowPositions } = useUserReserves();
13+
const { openV3Migration } = useModalContext();
14+
1115
const toggleSelectedSupplyPosition = useRootStore((state) => state.toggleMigrationSelectedAsset);
1216
const testMigration = useRootStore((state) => state._testMigration);
13-
// const migrate = useRootStore((state) => state.migrateSelectedPositions);
17+
const selectedAssets = useRootStore((state) => state.selectedMigrationAssets);
18+
1419
return (
1520
<div>
1621
<button onClick={() => testMigration()}>test migration</button>
@@ -19,6 +24,7 @@ export default function V3Migration() {
1924
<div
2025
key={reserve.underlyingAsset}
2126
onClick={() => toggleSelectedSupplyPosition(reserve.underlyingAsset)}
27+
style={{ color: selectedAssets[reserve.underlyingAsset] ? 'red' : 'black' }}
2228
>
2329
{reserve.underlyingAsset}:<b>{reserve.underlyingBalanceUSD}</b>
2430
</div>
@@ -27,7 +33,7 @@ export default function V3Migration() {
2733
{borrowPositions.map((reserve) => (
2834
<div key={reserve.underlyingAsset}>{reserve.variableBorrowsUSD}</div>
2935
))}
30-
{/* <button onClick={migrate}>Migrate positions</button> */}
36+
<button onClick={openV3Migration}>Migrate</button>
3137
</div>
3238
);
3339
}
@@ -37,10 +43,7 @@ V3Migration.getLayout = function getLayout(page: React.ReactElement) {
3743
<MainLayout>
3844
{page}
3945
{/** Modals */}
40-
<StakeModal />
41-
<StakeCooldownModal />
42-
<UnStakeModal />
43-
<StakeRewardClaimModal />
46+
<MigrateV3Modal />
4447
{/** End of modals */}
4548
</MainLayout>
4649
);

src/components/transactions/MigrateV3/MigrateV3Actions.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@ import { useTransactionHandler } from 'src/helpers/useTransactionHandler';
22
import { useRootStore } from 'src/store/root';
33

44
export const MigrateV3Actions = () => {
5-
const migrate = useRootStore((store) => store.migrate);
5+
// const selectedAssets = useRootStore((store) => )
6+
const migrateWithPermits = useRootStore((store) => store.migrateWithPermits);
7+
const migrateWithoutPermits = useRootStore((store) => store.migrateWithoutPermits);
68
const getApprovePermitsForSelectedAssets = useRootStore(
79
(store) => store.getApprovePermitsForSelectedAssets
810
);
911
const { approval, action } = useTransactionHandler({
10-
handleGetTxns: async () => {
11-
return [];
12-
},
13-
handleGetPermitTxns: async (signatures, deadline) => migrate(signatures, deadline),
14-
tryPermit: true,
12+
handleGetTxns: async () => migrateWithoutPermits(),
13+
handleGetPermitTxns: async (signatures, deadline) => migrateWithPermits(signatures, deadline),
14+
tryPermit: false,
1515
});
1616

17+
const handleApproval = () => {
18+
const approvePermitsForSelectedAssets = getApprovePermitsForSelectedAssets();
19+
approval(approvePermitsForSelectedAssets);
20+
};
21+
1722
return (
1823
<div>
19-
<button onClick={() => approval(getApprovePermitsForSelectedAssets())}>
20-
Approve with permits
21-
</button>
24+
<button onClick={handleApproval}>Approve</button>
2225
{/* <button onClick={() => }></button> */}
2326
<button onClick={action}>Migrate</button>
2427
</div>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react';
2+
import { ModalType, useModalContext } from 'src/hooks/useModal';
3+
4+
import { BasicModal } from '../../primitives/BasicModal';
5+
import { MigrateV3Actions } from './MigrateV3Actions';
6+
7+
export const MigrateV3Modal = () => {
8+
const { type, close } = useModalContext();
9+
return (
10+
<BasicModal open={type === ModalType.V3Migration} setOpen={close}>
11+
<MigrateV3Actions />
12+
</BasicModal>
13+
);
14+
};

src/helpers/useTransactionHandler.tsx

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,10 @@ export const useTransactionHandler = ({
113113

114114
const approval = async (approvals?: Approval[]) => {
115115
if (approvalTxes) {
116+
console.log(approvalTxes, 'approvalTxes');
116117
if (usePermit && approvals && approvals?.length > 0) {
117118
setApprovalTxState({ ...approvalTxState, loading: true });
119+
console.log('loading true', usePermit, approvals, approvalTxes);
118120
try {
119121
// deadline is an hour after signature
120122
const deadline = Math.floor(Date.now() / 1000 + 3600).toString();
@@ -179,11 +181,15 @@ export const useTransactionHandler = ({
179181
} else {
180182
try {
181183
setApprovalTxState({ ...approvalTxState, loading: true });
184+
console.log('no permit should call approval', approvalTxes);
182185
const params = await Promise.all(approvalTxes.map((approvalTx) => approvalTx.tx()));
186+
console.log(params, 'params');
183187
const approvalResponses = await Promise.all(
184188
params.map(
185189
(param) =>
186-
new Promise<TransactionResponse>((resolve, reject) => {
190+
new Promise<TransactionResponse>(async (resolve, reject) => {
191+
delete param.gasPrice;
192+
console.log;
187193
processTx({
188194
tx: () => sendTx(param),
189195
successCallback: (txnResponse: TransactionResponse) => {
@@ -210,29 +216,6 @@ export const useTransactionHandler = ({
210216
loading: false,
211217
success: true,
212218
});
213-
214-
// const params = await approvalTx.tx();
215-
// delete params.gasPrice;
216-
// await processTx({
217-
// tx: () => sendTx(params),
218-
// successCallback: (txnResponse: TransactionResponse) => {
219-
// setApprovalTxState({
220-
// txHash: txnResponse.hash,
221-
// loading: false,
222-
// success: true,
223-
// });
224-
// setTxError(undefined);
225-
// },
226-
// errorCallback: (error, hash) => {
227-
// const parsedError = getErrorTextFromError(error, TxAction.APPROVAL, false);
228-
// setTxError(parsedError);
229-
// setApprovalTxState({
230-
// txHash: hash,
231-
// loading: false,
232-
// });
233-
// },
234-
// action: TxAction.APPROVAL,
235-
// });
236219
} catch (error) {
237220
if (!mounted.current) return;
238221
const parsedError = getErrorTextFromError(error, TxAction.GAS_ESTIMATION, false);
@@ -343,6 +326,7 @@ export const useTransactionHandler = ({
343326
'STAKE_ACTION',
344327
'GOV_DELEGATION_ACTION',
345328
'GOVERNANCE_ACTION',
329+
'V3_MIGRATION_ACTION',
346330
].includes(tx.txType)
347331
)
348332
);

src/hooks/useModal.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export enum ModalType {
2121
Swap,
2222
GovDelegation,
2323
GovVote,
24+
V3Migration,
2425
}
2526

2627
export interface ModalArgsType {
@@ -57,6 +58,7 @@ export interface ModalContextType<T extends ModalArgsType> {
5758
openFaucet: (underlyingAsset: string) => void;
5859
openSwap: (underlyingAsset: string) => void;
5960
openGovDelegation: () => void;
61+
openV3Migration: () => void;
6062
openGovVote: (proposalId: number, support: boolean, power: string) => void;
6163
close: () => void;
6264
type?: ModalType;
@@ -157,6 +159,9 @@ export const ModalContextProvider: React.FC = ({ children }) => {
157159
setType(ModalType.GovVote);
158160
setArgs({ proposalId, support, power });
159161
},
162+
openV3Migration: () => {
163+
setType(ModalType.V3Migration);
164+
},
160165
close: () => {
161166
setType(undefined);
162167
setArgs({});

src/store/poolSelectors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ export const selectUserSummaryAndIncentives = (state: RootStore, currentTimestam
7676
const reserveIncentiveData = state.reserveIncentiveData;
7777
const userIncentiveData = state.userIncentiveData;
7878

79+
// TODO: why <any>
7980
return formatUserSummaryAndIncentives({
8081
currentTimestamp,
8182
marketReferencePriceInUsd: baseCurrencyData.marketReferenceCurrencyPriceInUsd,

src/store/v3MigrationSlice.ts

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from '@aave/contract-helpers';
88
import { SignatureLike } from '@ethersproject/bytes';
99
import dayjs from 'dayjs';
10-
import { BigNumberish } from 'ethers';
10+
import { BigNumberish, constants } from 'ethers';
1111
import { produce } from 'immer';
1212
import { Approval } from 'src/helpers/useTransactionHandler';
1313
import { StateCreator } from 'zustand';
@@ -30,10 +30,11 @@ export type V3MigrationSlice = {
3030
toggleMigrationSelectedAsset: (assetName: string) => void;
3131
getMigratorAddress: () => string;
3232
getMigrationServiceInstance: () => V3MigrationHelperService;
33-
migrate: (
33+
migrateWithPermits: (
3434
signature: SignatureLike[],
3535
deadline: BigNumberish
3636
) => EthereumTransactionTypeExtended[];
37+
migrateWithoutPermits: () => EthereumTransactionTypeExtended[];
3738
_testMigration: () => void;
3839
// migrateSelectedPositions: () => void;
3940
};
@@ -110,7 +111,6 @@ export const createV3MigrationSlice: StateCreator<
110111
const timestamp = dayjs().unix();
111112
set({ timestamp });
112113
return selectedUserReservesForMigration(get(), timestamp).map(({ reserve }): Approval => {
113-
reserve.name;
114114
return {
115115
// TODO: should we allow spending of exact ammount of the reserver?
116116
amount: reserve.totalLiquidity,
@@ -119,11 +119,31 @@ export const createV3MigrationSlice: StateCreator<
119119
};
120120
});
121121
},
122-
migrate: (signatures: SignatureLike[], deadline: BigNumberish) => {
122+
migrateWithoutPermits: () => {
123+
const timestamp = dayjs().unix();
124+
set({ timestamp });
125+
const assets: {
126+
aToken: string;
127+
deadline: number;
128+
amount: string;
129+
}[] = selectedUserReservesForMigration(get(), timestamp).map(({ reserve }) => {
130+
const deadline = Math.floor(Date.now() / 1000 + 3600);
131+
return {
132+
amount: reserve.totalLiquidity,
133+
aToken: reserve.aTokenAddress,
134+
// TODO: fow how long to approve?
135+
deadline,
136+
};
137+
});
138+
const user = get().account;
139+
console.log(assets, user);
140+
return get().getMigrationServiceInstance().migrateNoBorrow({ assets, user });
141+
},
142+
migrateWithPermits: (signatures: SignatureLike[], deadline: BigNumberish) => {
123143
const selectedReservers = selectedUserReservesForMigration(get(), get().timestamp);
124144
const permits = selectedReservers.map(({ reserve }, index) => ({
125145
aToken: reserve.aTokenAddress,
126-
value: reserve.totalLiquidity + 1000,
146+
value: constants.MaxUint256.toString(),
127147
deadline,
128148
signedPermit: signatures[index],
129149
}));
@@ -132,6 +152,7 @@ export const createV3MigrationSlice: StateCreator<
132152
const migratorHelperInstance = get().getMigrationServiceInstance();
133153
const user = get().account;
134154
const assets = permits.map((permit) => permit.aToken);
155+
console.log('migrateNoBorrowWith permits');
135156
return migratorHelperInstance.migrateNoBorrowWithPermits({
136157
user,
137158
assets,

0 commit comments

Comments
 (0)