Skip to content

Commit 6d4da52

Browse files
authored
CP-11556: Add Deposit Amount Selection Screen (#3351)
1 parent 959bb46 commit 6d4da52

File tree

17 files changed

+396
-277
lines changed

17 files changed

+396
-277
lines changed

packages/core-mobile/app/consts/reactQueryKeys.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,9 @@ export enum ReactQueryKeys {
4444
TERMS_OF_USE = 'termsOfUse',
4545

4646
// bridge
47-
BRIDGE_CONFIG = 'bridgeConfig'
47+
BRIDGE_CONFIG = 'bridgeConfig',
48+
49+
// deposit
50+
AAVE_AVAILABLE_MARKETS = 'aaveAvailableMarkets',
51+
BENQI_AVAILABLE_MARKETS = 'benqiAvailableMarkets'
4852
}

packages/core-mobile/app/new/features/deposit/hooks/aave/useAaveAvailableMarkets.ts

Lines changed: 22 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
1-
import {
2-
type QueryObserverResult,
3-
type RefetchOptions,
4-
skipToken,
5-
useQuery
6-
} from '@tanstack/react-query'
7-
import { erc20Abi, Address } from 'viem'
1+
import { skipToken, useQuery } from '@tanstack/react-query'
2+
import { erc20Abi, Address, PublicClient } from 'viem'
83
import { readContract } from 'viem/actions'
9-
import useCChainNetwork from 'hooks/earn/useCChainNetwork'
104
import { useSelector } from 'react-redux'
115
import { selectActiveAccount } from 'store/account'
12-
import { useTokensWithBalanceByNetworkForAccount } from 'features/portfolio/hooks/useTokensWithBalanceByNetworkForAccount'
13-
import { findMatchingTokenWithBalance } from 'features/deposit/utils/findMatchingTokenWithBalance'
6+
import { Network } from '@avalabs/core-chains-sdk'
7+
import { ReactQueryKeys } from 'consts/reactQueryKeys'
148
import { type DefiMarket, MarketNames } from '../../types'
159
import { gqlQuery } from '../../utils/gqlQuery'
1610
import {
@@ -32,50 +26,44 @@ import { getAaveFilteredMarketData } from '../../utils/getAaveFilteredMarketData
3226
import { getUniqueMarketId } from '../../utils/getUniqueMarketId'
3327
import { isMeritSupplyKey } from '../../utils/isMeritSupplyKey'
3428
import { bigIntToBig } from '../../utils/bigInt'
35-
import { useCChainClient } from '../useCChainClient'
3629
import { useGetCChainToken } from '../useGetCChainToken'
3730
import { useMeritAprs } from './useMeritAprs'
3831

39-
export const useAaveAvailableMarkets = (): {
32+
export const useAaveAvailableMarkets = ({
33+
network,
34+
networkClient
35+
}: {
36+
network: Network | undefined
37+
networkClient: PublicClient | undefined
38+
}): {
4039
data: DefiMarket[] | undefined
4140
error: Error | null
4241
isLoading: boolean
4342
isPending: boolean
4443
isFetching: boolean
45-
refetch:
46-
| ((
47-
options?: RefetchOptions
48-
) => Promise<QueryObserverResult<DefiMarket[], Error>>)
49-
| (() => void)
5044
} => {
51-
const cChainNetwork = useCChainNetwork()
52-
const cChainClient = useCChainClient()
5345
const activeAccount = useSelector(selectActiveAccount)
5446
const addressEVM = activeAccount?.addressC
5547
const { data: meritAprs, isPending: isPendingMeritAprs } = useMeritAprs()
5648
const getCChainToken = useGetCChainToken()
57-
const tokens = useTokensWithBalanceByNetworkForAccount(
58-
activeAccount,
59-
cChainNetwork?.chainId
60-
)
6149

6250
const {
6351
data: enrichedMarkets,
6452
isLoading: isLoadingEnrichedMarkets,
6553
isPending: isPendingEnrichedMarkets,
6654
isFetching: isFetchingEnrichedMarkets,
67-
error: errorEnrichedMarkets,
68-
refetch
55+
error: errorEnrichedMarkets
6956
} = useQuery({
70-
queryKey: ['useAaveAvailableMarkets', cChainClient, cChainNetwork, tokens],
57+
// eslint-disable-next-line @tanstack/query/exhaustive-deps
58+
queryKey: [ReactQueryKeys.AAVE_AVAILABLE_MARKETS, networkClient?.chain?.id],
7159
queryFn:
72-
cChainClient && cChainNetwork && !isPendingMeritAprs
60+
networkClient && network && !isPendingMeritAprs
7361
? async () => {
7462
// Step 1: Fetch all available reserve data from Aave V3 pool
7563
// getReservesData(in AAVE_POOL_DATA_PROVIDER abi) returns a tuple: [AggregatedReserveData[], BaseCurrencyInfo]
7664
// [0] = array of market data (USDC, USDT, WETH.e, etc.)
7765
// [1] = base currency info (USD prices, etc.) - not used currently
78-
const [marketsData] = await readContract(cChainClient, {
66+
const [marketsData] = await readContract(networkClient, {
7967
address: AAVE_UI_POOL_DATA_PROVIDER_C_CHAIN_ADDRESS,
8068
abi: AAVE_POOL_DATA_PROVIDER,
8169
functionName: 'getReservesData',
@@ -97,7 +85,7 @@ export const useAaveAvailableMarkets = (): {
9785
const supplyApyPercent = formatAaveSupplyApy(liveAprPercent)
9886

9987
// Get total supply to calculate total deposits
100-
const totalSupply = await readContract(cChainClient, {
88+
const totalSupply = await readContract(networkClient, {
10189
address: market.mintTokenAddress,
10290
abi: erc20Abi,
10391
functionName: 'totalSupply'
@@ -125,7 +113,7 @@ export const useAaveAvailableMarkets = (): {
125113
`,
126114
{
127115
request: {
128-
chainId: cChainNetwork?.chainId,
116+
chainId: network.chainId,
129117
market: AAVE_POOL_C_CHAIN_ADDRESS,
130118
underlyingToken: market.underlyingAsset,
131119
window: 'LAST_MONTH'
@@ -159,15 +147,6 @@ export const useAaveAvailableMarkets = (): {
159147
return accumulator + formattedNumber
160148
}, 0) / safeData.length
161149

162-
// Match with user's token balance
163-
const balance = findMatchingTokenWithBalance(
164-
{
165-
symbol: market.symbol,
166-
contractAddress: market.underlyingAsset
167-
},
168-
tokens
169-
)
170-
171150
// Get token metadata (logo, etc.)
172151
const token = getCChainToken(
173152
market.symbol,
@@ -177,7 +156,7 @@ export const useAaveAvailableMarkets = (): {
177156
// Construct market data with all enriched information
178157
const marketData = {
179158
marketName: MarketNames.aave,
180-
network: cChainNetwork,
159+
network,
181160
type: 'lending' as const,
182161
supplyCapReached,
183162
totalDeposits: formatAmount(
@@ -191,9 +170,8 @@ export const useAaveAvailableMarkets = (): {
191170
iconUrl: token?.logoUri,
192171
symbol: market.symbol,
193172
contractAddress: market.underlyingAsset,
194-
underlyingTokenBalance: balance,
195173
mintTokenBalance: await getAaveDepositedBalance({
196-
cChainClient,
174+
cChainClient: networkClient,
197175
walletAddress: addressEVM as Address,
198176
underlyingTokenDecimals: decimals,
199177
underlyingAssetAddress: market.underlyingAsset
@@ -210,17 +188,7 @@ export const useAaveAvailableMarkets = (): {
210188
})
211189
)
212190

213-
// Step 4: Add AVAX (native token) market data
214-
// Aave uses WAVAX wrapper, so we need to manually insert AVAX with user's balance
215-
const avaxBalance = findMatchingTokenWithBalance(
216-
{
217-
symbol: cChainNetwork.networkToken.symbol,
218-
contractAddress: undefined
219-
},
220-
tokens
221-
)
222-
223-
return aaveInsertAvax(results, avaxBalance)
191+
return aaveInsertAvax(results)
224192
}
225193
: skipToken
226194
})
@@ -230,8 +198,6 @@ export const useAaveAvailableMarkets = (): {
230198
error: errorEnrichedMarkets,
231199
isLoading: isLoadingEnrichedMarkets,
232200
isPending: isPendingEnrichedMarkets,
233-
isFetching: isFetchingEnrichedMarkets,
234-
// eslint-disable-next-line @typescript-eslint/no-empty-function
235-
refetch: cChainClient && !isPendingMeritAprs ? refetch : () => {}
201+
isFetching: isFetchingEnrichedMarkets
236202
}
237203
}

packages/core-mobile/app/new/features/deposit/hooks/benqi/useBenqiAvailableMarkets.ts

Lines changed: 26 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
1-
import {
2-
type QueryObserverResult,
3-
type RefetchOptions,
4-
skipToken,
5-
useQuery
6-
} from '@tanstack/react-query'
1+
import { skipToken, useQuery } from '@tanstack/react-query'
72
import { readContract } from 'viem/actions'
83
import { DefiMarket, MarketNames } from 'features/deposit/types'
94
import { useSelector } from 'react-redux'
105
import { selectActiveAccount } from 'store/account'
11-
import { Address } from 'viem'
6+
import { Address, PublicClient } from 'viem'
127
import { BENQI_COMPTROLLER } from 'features/deposit/abis/benqiComptroller'
138
import { BENQI_COMPTROLLER_C_CHAIN_ADDRESS } from 'features/deposit/consts'
149
import Logger from 'utils/Logger'
@@ -17,47 +12,43 @@ import { getBenqiSupplyApyPercent } from 'features/deposit/utils/getBenqiLiveApy
1712
import { getBenqiUnderlyingTokenDetails } from 'features/deposit/utils/getBenqiUnderlyingTokenDetails'
1813
import { getBenqiUnderlyingTotalSupply } from 'features/deposit//utils/getBenqiUnderlyingTotalSupply'
1914
import { getUniqueMarketId } from 'features/deposit/utils/getUniqueMarketId'
20-
import useCChainNetwork from 'hooks/earn/useCChainNetwork'
21-
import { findMatchingTokenWithBalance } from 'features/deposit/utils/findMatchingTokenWithBalance'
22-
import { useTokensWithBalanceByNetworkForAccount } from 'features/portfolio/hooks/useTokensWithBalanceByNetworkForAccount'
23-
import { useCChainClient } from '../useCChainClient'
15+
import { Network } from '@avalabs/core-chains-sdk'
16+
import { ReactQueryKeys } from 'consts/reactQueryKeys'
2417
import { useGetCChainToken } from '../useGetCChainToken'
2518

26-
export const useBenqiAvailableMarkets = (): {
19+
export const useBenqiAvailableMarkets = ({
20+
network,
21+
networkClient
22+
}: {
23+
network: Network | undefined
24+
networkClient: PublicClient | undefined
25+
}): {
2726
data: DefiMarket[] | undefined
2827
error: Error | null
2928
isLoading: boolean
3029
isPending: boolean
3130
isFetching: boolean
32-
refetch:
33-
| ((
34-
options?: RefetchOptions
35-
) => Promise<QueryObserverResult<DefiMarket[], Error>>)
36-
| (() => void)
3731
} => {
38-
const cChainNetwork = useCChainNetwork()
39-
const cChainClient = useCChainClient()
4032
const activeAccount = useSelector(selectActiveAccount)
4133
const addressEVM = activeAccount?.addressC
42-
const tokens = useTokensWithBalanceByNetworkForAccount(
43-
activeAccount,
44-
cChainNetwork?.chainId
45-
)
4634
const getCChainToken = useGetCChainToken()
4735

4836
const {
4937
data: enrichedMarkets,
5038
isLoading: isLoadingEnrichedMarkets,
5139
isPending: isPendingEnrichedMarkets,
5240
isFetching: isFetchingEnrichedMarkets,
53-
error: errorEnrichedMarkets,
54-
refetch
41+
error: errorEnrichedMarkets
5542
} = useQuery({
56-
queryKey: ['useBenqiAvailableMarkets', cChainClient, cChainNetwork, tokens],
43+
// eslint-disable-next-line @tanstack/query/exhaustive-deps
44+
queryKey: [
45+
ReactQueryKeys.BENQI_AVAILABLE_MARKETS,
46+
networkClient?.chain?.id
47+
],
5748
queryFn:
58-
cChainClient && cChainNetwork
49+
networkClient && network
5950
? async () => {
60-
const qTokenAddresses = (await readContract(cChainClient, {
51+
const qTokenAddresses = (await readContract(networkClient, {
6152
address: BENQI_COMPTROLLER_C_CHAIN_ADDRESS,
6253
abi: BENQI_COMPTROLLER,
6354
functionName: 'getAllMarkets',
@@ -67,7 +58,7 @@ export const useBenqiAvailableMarkets = (): {
6758
const results = await Promise.allSettled(
6859
qTokenAddresses.map(async qTokenAddress => {
6960
try {
70-
const isPaused = await readContract(cChainClient, {
61+
const isPaused = await readContract(networkClient, {
7162
address: BENQI_COMPTROLLER_C_CHAIN_ADDRESS,
7263
abi: BENQI_COMPTROLLER,
7364
functionName: 'mintGuardianPaused',
@@ -85,13 +76,13 @@ export const useBenqiAvailableMarkets = (): {
8576
underlyingTokenDecimals,
8677
underlyingTokenSymbol
8778
} = await getBenqiUnderlyingTokenDetails({
88-
cChainClient,
79+
cChainClient: networkClient,
8980
qTokenAddress
9081
})
9182

9283
const underlyingTotalSupply =
9384
await getBenqiUnderlyingTotalSupply({
94-
cChainClient,
85+
cChainClient: networkClient,
9586
qTokenAddress,
9687
underlyingTokenDecimals
9788
})
@@ -100,35 +91,26 @@ export const useBenqiAvailableMarkets = (): {
10091
qTokenAddress,
10192
underlyingTokenDecimals,
10293
underlyingTotalSupply,
103-
cChainClient
94+
cChainClient: networkClient
10495
})
10596

106-
const balance = findMatchingTokenWithBalance(
107-
{
108-
symbol: underlyingTokenSymbol,
109-
contractAddress: underlyingTokenAddress
110-
},
111-
tokens
112-
)
113-
11497
const token = getCChainToken(
11598
underlyingTokenSymbol,
11699
underlyingTokenAddress
117100
)
118101

119102
const marketData = {
120103
marketName: MarketNames.benqi,
121-
network: cChainNetwork,
104+
network,
122105
asset: {
123106
mintTokenAddress: qTokenAddress,
124107
assetName: underlyingTokenName,
125108
decimals: underlyingTokenDecimals,
126109
iconUrl: token?.logoUri,
127110
symbol: underlyingTokenSymbol,
128111
contractAddress: underlyingTokenAddress,
129-
underlyingTokenBalance: balance,
130112
mintTokenBalance: await getBenqiDepositedBalance({
131-
cChainClient,
113+
cChainClient: networkClient,
132114
underlyingTokenDecimals,
133115
walletAddress: addressEVM as Address,
134116
qTokenAddress
@@ -169,8 +151,6 @@ export const useBenqiAvailableMarkets = (): {
169151
error: errorEnrichedMarkets ?? null,
170152
isLoading: isLoadingEnrichedMarkets,
171153
isPending: isPendingEnrichedMarkets,
172-
isFetching: isFetchingEnrichedMarkets,
173-
// eslint-disable-next-line @typescript-eslint/no-empty-function
174-
refetch: cChainClient ? refetch : () => {}
154+
isFetching: isFetchingEnrichedMarkets
175155
}
176156
}

0 commit comments

Comments
 (0)