Skip to content

Commit

Permalink
fix: build route price impact
Browse files Browse the repository at this point in the history
  • Loading branch information
viet-nv committed Jan 3, 2025
1 parent 85e4f16 commit de9b26d
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ export default function ConfirmSwapModalContent({
parsedAmountOutFromBuild = toCurrencyAmount(routeSummary.parsedAmountOut.currency, amountOut)

amountOutUsdFromBuild = buildResult.data.amountOutUsd
amountInUsd = buildResult.data.amountInUsd
}
}

Expand Down
11 changes: 10 additions & 1 deletion src/components/SwapForm/hooks/useBuildRoute.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Currency } from '@kyberswap/ks-sdk-core'
import { t } from '@lingui/macro'
import { useCallback, useRef } from 'react'
import { useSearchParams } from 'react-router-dom'
Expand Down Expand Up @@ -28,10 +29,12 @@ type Args = {
slippage: number
transactionTimeout: number
permit?: string
currencyIn: Currency | undefined
currencyOut: Currency | undefined
}

const useBuildRoute = (args: Args) => {
const { recipient, routeSummary, slippage, transactionTimeout, permit } = args
const { recipient, routeSummary, slippage, transactionTimeout, permit, currencyIn, currencyOut } = args
const [searchParams] = useSearchParams()
const clientId = searchParams.get('clientId')
const { chainId, account } = useActiveWeb3React()
Expand Down Expand Up @@ -65,6 +68,10 @@ const useBuildRoute = (args: Args) => {
skipSimulateTx: false,
enableGasEstimation: true,
permit,
// for calculating price impact only
chainId,
tokenInDecimals: currencyIn?.decimals,
tokenOutDecimals: currencyOut?.decimals,
}

try {
Expand Down Expand Up @@ -105,6 +112,8 @@ const useBuildRoute = (args: Args) => {
buildRoute,
isEnableAuthenAggregator,
permit,
currencyIn?.decimals,
currencyOut?.decimals,
])

return fetcher
Expand Down
2 changes: 2 additions & 0 deletions src/components/SwapForm/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ const SwapForm: React.FC<SwapFormProps> = props => {
slippage,
transactionTimeout,
permit,
currencyIn,
currencyOut,
})

const swapInputError = useGetInputError({
Expand Down
66 changes: 56 additions & 10 deletions src/services/route/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,16 +82,62 @@ const routeApi = createApi({
BuildRouteResponse,
{ url: string; payload: BuildRoutePayload; signal?: AbortSignal; authentication: boolean }
>({
query: ({ url, payload, signal, authentication }) => ({
url,
method: 'POST',
body: payload,
signal,
authentication,
headers: {
'x-client-id': payload.source || 'kyberswap',
},
}),
query: ({ url, payload, signal, authentication }) => {
const { chainId, tokenInDecimals, tokenOutDecimals, ...rest } = payload
return {
url,
method: 'POST',
body: rest,
signal,
authentication,
headers: {
'x-client-id': payload.source || 'kyberswap',
},
}
},
async transformResponse(baseResponse: BuildRouteResponse, _meta, { payload }): Promise<BuildRouteResponse> {
const { data } = baseResponse || {}
const { chainId, tokenInDecimals, tokenOutDecimals, routeSummary } = payload || {}
const { tokenIn, tokenOut } = routeSummary || {}

// Ensure all necessary data is available
if (data && routeSummary && chainId && tokenInDecimals && tokenOutDecimals) {
const { amountIn, amountOut } = routeSummary

// Build the URL for the price impact API request
const priceImpactUrl = new URL(`${BFF_API}/v1/price-impact`)
priceImpactUrl.searchParams.append('tokenIn', tokenIn)
priceImpactUrl.searchParams.append('tokenInDecimal', tokenInDecimals.toString())
priceImpactUrl.searchParams.append('tokenOut', tokenOut)
priceImpactUrl.searchParams.append('tokenOutDecimal', tokenOutDecimals.toString())
priceImpactUrl.searchParams.append('amountIn', amountIn)
priceImpactUrl.searchParams.append('amountOut', amountOut)
priceImpactUrl.searchParams.append('chainId', chainId.toString())

try {
// Fetch price impact data
const priceImpactResponse = await fetch(priceImpactUrl.toString()).then(res => res.json())
const { amountInUSD, amountOutUSD } = priceImpactResponse?.data || {}

// Update routeSummary with USD values if available
if (amountInUSD && amountOutUSD) {
return {
...baseResponse,
data: {
...data,
amountInUsd: amountInUSD,
amountOutUsd: amountOutUSD,
},
}
}
} catch (error) {
console.error('Failed to fetch price impact:', error)
}
}

// Return original response if conditions are not met or request fails
return baseResponse
},
}),
}),
})
Expand Down
4 changes: 4 additions & 0 deletions src/services/route/types/buildRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ export type BuildRoutePayload = {
skipSimulateTx: boolean
enableGasEstimation?: boolean
permit?: string
// for calculating price impact only
chainId?: number
tokenInDecimals?: number
tokenOutDecimals?: number
}

export type BuildRouteData = {
Expand Down

0 comments on commit de9b26d

Please sign in to comment.