2
2
'use client'
3
3
4
4
import { useTokens } from '@/lib/modules/tokens/TokensProvider'
5
- import { GqlToken } from '@/lib/shared/services/api/generated/graphql'
6
5
import { useMandatoryContext } from '@/lib/shared/utils/contexts'
7
6
import { HumanAmount } from '@balancer/sdk'
8
7
import { PropsWithChildren , createContext , useEffect , useMemo , useState } from 'react'
@@ -17,7 +16,6 @@ import {
17
16
injectNativeAsset ,
18
17
replaceWrappedWithNativeAsset ,
19
18
requiresProportionalInput ,
20
- supportsNestedActions ,
21
19
} from '../LiquidityActionHelpers'
22
20
import { isDisabledWithReason } from '@/lib/shared/utils/functions/isDisabledWithReason'
23
21
import { useUserAccount } from '@/lib/modules/web3/UserAccountProvider'
@@ -30,7 +28,8 @@ import { useTotalUsdValue } from '@/lib/modules/tokens/useTotalUsdValue'
30
28
import { HumanTokenAmountWithAddress } from '@/lib/modules/tokens/token.types'
31
29
import { isUnhandledAddPriceImpactError } from '@/lib/modules/price-impact/price-impact.utils'
32
30
import { useModalWithPoolRedirect } from '../../useModalWithPoolRedirect'
33
- import { getLeafTokens } from '@/lib/modules/tokens/token.helpers'
31
+ import { getPoolTokens } from '../../pool.helpers'
32
+ import { useUserSettings } from '@/lib/modules/user/settings/UserSettingsProvider'
34
33
35
34
export type UseAddLiquidityResponse = ReturnType < typeof _useAddLiquidity >
36
35
export const AddLiquidityContext = createContext < UseAddLiquidityResponse | null > ( null )
@@ -41,12 +40,14 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
41
40
const [ acceptPoolRisks , setAcceptPoolRisks ] = useState ( false )
42
41
const [ wethIsEth , setWethIsEth ] = useState ( false )
43
42
const [ totalUSDValue , setTotalUSDValue ] = useState ( '0' )
43
+ const [ proportionalSlippage , setProportionalSlippage ] = useState < string > ( '0' )
44
44
45
45
const { pool, refetch : refetchPool , isLoading } = usePool ( )
46
46
const { getToken, getNativeAssetToken, getWrappedNativeAssetToken, isLoadingTokenPrices } =
47
47
useTokens ( )
48
48
const { isConnected } = useUserAccount ( )
49
49
const { hasValidationErrors } = useTokenInputsValidation ( )
50
+ const { slippage : userSlippage } = useUserSettings ( )
50
51
51
52
const handler = useMemo ( ( ) => selectAddLiquidityHandler ( pool ) , [ pool . id , isLoading ] )
52
53
@@ -58,9 +59,12 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
58
59
const chain = pool . chain
59
60
const nativeAsset = getNativeAssetToken ( chain )
60
61
const wNativeAsset = getWrappedNativeAssetToken ( chain )
62
+ const isForcedProportionalAdd = requiresProportionalInput ( pool . type )
63
+ const slippage = isForcedProportionalAdd ? proportionalSlippage : userSlippage
64
+ const tokens = getPoolTokens ( pool , getToken )
61
65
62
66
function setInitialHumanAmountsIn ( ) {
63
- const amountsIn = getPoolTokens ( ) . map (
67
+ const amountsIn = tokens . map (
64
68
token =>
65
69
( {
66
70
tokenAddress : token . address ,
@@ -81,18 +85,6 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
81
85
] )
82
86
}
83
87
84
- function getPoolTokens ( ) {
85
- if ( supportsNestedActions ( pool ) ) {
86
- return getLeafTokens ( pool . poolTokens )
87
- }
88
-
89
- return pool . poolTokens
90
- }
91
-
92
- const tokens = getPoolTokens ( )
93
- . map ( token => getToken ( token . address , chain ) )
94
- . filter ( ( token ) : token is GqlToken => ! ! token )
95
-
96
88
const tokensWithNativeAsset = replaceWrappedWithNativeAsset ( tokens , nativeAsset )
97
89
98
90
const validTokens = injectNativeAsset ( tokens , nativeAsset , pool )
@@ -127,6 +119,7 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
127
119
handler,
128
120
humanAmountsIn,
129
121
simulationQuery,
122
+ slippage,
130
123
} )
131
124
const transactionSteps = useTransactionSteps ( steps , isLoadingSteps )
132
125
@@ -138,7 +131,7 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
138
131
const hasQuoteContext = ! ! simulationQuery . data
139
132
140
133
async function refetchQuote ( ) {
141
- if ( requiresProportionalInput ( pool . type ) ) {
134
+ if ( isForcedProportionalAdd ) {
142
135
/*
143
136
This is the only edge-case where the SDK needs pool onchain data from the frontend
144
137
(calculateProportionalAmounts uses pool.dynamicData.totalShares in its parameters)
@@ -198,6 +191,10 @@ export function _useAddLiquidity(urlTxHash?: Hash) {
198
191
addLiquidityTxHash,
199
192
hasQuoteContext,
200
193
addLiquidityTxSuccess,
194
+ slippage,
195
+ proportionalSlippage,
196
+ isForcedProportionalAdd,
197
+ setProportionalSlippage,
201
198
refetchQuote,
202
199
setHumanAmountIn,
203
200
setHumanAmountsIn,
0 commit comments