From bdc8bd3d93df859d8008cbd1081e4a6799b12742 Mon Sep 17 00:00:00 2001 From: rassadin11 Date: Fri, 29 May 2026 15:12:22 +0300 Subject: [PATCH] add redirects --- src/widgets/bridge-form/ui/BridgeForm.tsx | 57 ++++++++++++++++++++--- src/widgets/swap-form/ui/SwapForm.tsx | 6 ++- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/widgets/bridge-form/ui/BridgeForm.tsx b/src/widgets/bridge-form/ui/BridgeForm.tsx index 0a96d26..cb1117c 100644 --- a/src/widgets/bridge-form/ui/BridgeForm.tsx +++ b/src/widgets/bridge-form/ui/BridgeForm.tsx @@ -3,10 +3,13 @@ import { useNavigate } from 'react-router-dom' import { useQueryClient } from '@tanstack/react-query' import { useJumperTokens, useWalletBalance, useWalletAddresses, useFetchJumperQuote, useExecuteBridge, + useRelayQuote, type Chain, type JumperToken, type WalletBalanceData, type JumperQuote, type JumperQuotePayload, + type RelayQuotePayload, } from '@features/wallet' import { Notification, PrimaryButton } from '@shared/ui' import { ROUTES } from '@shared/config/routes' +import { useDebounce } from '@shared/lib/hooks/useDebounce' import { toBaseUnits, fromBaseUnits } from '@shared/lib/utils/baseUnits' import { truncateDecimals } from '@shared/lib/utils/truncateDecimals' import { @@ -32,6 +35,15 @@ const NET_BY_CHAIN_ID: Record = Object.fromEntries( Object.entries(CHAIN_ID_BY_NET).map(([net, id]) => [id, net]) ) +// Relay использует собственные chain id (отличаются от Jumper, напр. для SOL) +const RELAY_CHAIN_ID: Record = { + ETH: 1, + BSC: 56, + SOL: 792703809, + TRX: 728126428, + BTC: 8253038, +} + function mapJumperToken(t: JumperToken): Token { const meta = TOKEN_META[t.symbol] return { @@ -115,9 +127,42 @@ export function BridgeForm() { } : null - const displayToAmount = quote - ? truncateDecimals(fromBaseUnits(quote.estimate.toAmount, quote.action.toToken.decimals), 8) - : '0' + // Реактивная оценка суммы назначения через /api/relay/quote (как в SwapForm) + const debouncedAmount = useDebounce(fromAmount, 500) + const parsedDebounced = parseFloat(debouncedAmount) + const relayOriginChainId = RELAY_CHAIN_ID[fromNetwork] + const relayDestChainId = RELAY_CHAIN_ID[toNetwork] + + const relayQuotePayload: RelayQuotePayload | null = + fromJumper && toJumper && fromAddress && toAddress && + relayOriginChainId && relayDestChainId && parsedDebounced > 0 + ? { + user: fromAddress, + recipient: toAddress, + originChainId: relayOriginChainId, + destinationChainId: relayDestChainId, + originCurrency: fromJumper.address, + destinationCurrency: toJumper.address, + amount: toBaseUnits(debouncedAmount, fromToken.decimals), + tradeType: 'EXACT_INPUT', + } + : null + + const { data: relayQuote } = useRelayQuote(relayQuotePayload) + + const displayToAmount = relayQuote + ? relayQuote.details.currencyOut.amountFormatted + : quote + ? truncateDecimals(fromBaseUnits(quote.estimate.toAmount, quote.action.toToken.decimals), 8) + : '0' + + function handleFromNetworkChange(net: string) { + setFromNetwork(net) + // сеть назначения не может совпадать с исходной — переключаем на первую доступную + if (net === toNetwork) { + setToNetwork(NETWORKS.find(n => n !== net) ?? toNetwork) + } + } function handleConfirm() { if (!quotePayload) return @@ -165,8 +210,8 @@ export function BridgeForm() { n !== toNetwork)} + onChange={handleFromNetworkChange} + options={NETWORKS} /> - + {quote && ( - + {modalData && (