From de9b26d3336335f93c5144661972d6f4de7b1887 Mon Sep 17 00:00:00 2001 From: viet-nv Date: Fri, 3 Jan 2025 11:26:02 +0700 Subject: [PATCH] fix: build route price impact --- .../SwapModal/ConfirmSwapModalContent.tsx | 1 + .../SwapForm/hooks/useBuildRoute.tsx | 11 +++- src/components/SwapForm/index.tsx | 2 + src/services/route/index.ts | 66 ++++++++++++++++--- src/services/route/types/buildRoute.ts | 4 ++ 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/components/SwapForm/SwapModal/ConfirmSwapModalContent.tsx b/src/components/SwapForm/SwapModal/ConfirmSwapModalContent.tsx index 1f79517e32..1cfa18cb94 100644 --- a/src/components/SwapForm/SwapModal/ConfirmSwapModalContent.tsx +++ b/src/components/SwapForm/SwapModal/ConfirmSwapModalContent.tsx @@ -190,6 +190,7 @@ export default function ConfirmSwapModalContent({ parsedAmountOutFromBuild = toCurrencyAmount(routeSummary.parsedAmountOut.currency, amountOut) amountOutUsdFromBuild = buildResult.data.amountOutUsd + amountInUsd = buildResult.data.amountInUsd } } diff --git a/src/components/SwapForm/hooks/useBuildRoute.tsx b/src/components/SwapForm/hooks/useBuildRoute.tsx index bf441ee915..9521281c5b 100644 --- a/src/components/SwapForm/hooks/useBuildRoute.tsx +++ b/src/components/SwapForm/hooks/useBuildRoute.tsx @@ -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' @@ -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() @@ -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 { @@ -105,6 +112,8 @@ const useBuildRoute = (args: Args) => { buildRoute, isEnableAuthenAggregator, permit, + currencyIn?.decimals, + currencyOut?.decimals, ]) return fetcher diff --git a/src/components/SwapForm/index.tsx b/src/components/SwapForm/index.tsx index 0d85c56eb0..6c1b798620 100644 --- a/src/components/SwapForm/index.tsx +++ b/src/components/SwapForm/index.tsx @@ -142,6 +142,8 @@ const SwapForm: React.FC = props => { slippage, transactionTimeout, permit, + currencyIn, + currencyOut, }) const swapInputError = useGetInputError({ diff --git a/src/services/route/index.ts b/src/services/route/index.ts index 78045c8ba2..1058d0f0d7 100644 --- a/src/services/route/index.ts +++ b/src/services/route/index.ts @@ -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 { + 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 + }, }), }), }) diff --git a/src/services/route/types/buildRoute.ts b/src/services/route/types/buildRoute.ts index ce9d3a24c4..0d7cd05124 100644 --- a/src/services/route/types/buildRoute.ts +++ b/src/services/route/types/buildRoute.ts @@ -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 = {