add redirects
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
export { useAllWalletBalances, usePrices, useSendWallet, useWalletAddresses, useWalletBalance, usePortfolio, useTokensList, useRelayQuote, useExecuteRelaySwap, useSignSwap, useTrxSwapQuote, useFetchTrxQuote, useExecuteTrxSwap, useJumperTokens, useFetchJumperQuote, useExecuteBridge, useCreateWallet, useRevealMnemonic } from './model/useWalletData'
|
export { useAllWalletBalances, usePrices, useSendWallet, useWalletAddresses, useWalletBalance, usePortfolio, useTokensList, useRelayQuote, useExecuteRelaySwap, useSignSwap, useTrxSwapQuote, useFetchTrxQuote, useExecuteTrxSwap, useJumperTokens, useJumperQuote, useFetchJumperQuote, useExecuteBridge, useCreateWallet, useRevealMnemonic } from './model/useWalletData'
|
||||||
export type { Chain, FormattedAmount, WalletBalanceData, PriceEntry, SendWalletPayload, SendWalletResponse, WalletAddress, PortfolioData, PortfolioChain, PortfolioNative, PortfolioToken, TokenInfo, RelayQuotePayload, RelayQuoteResponse, RelaySwapResponse, RelaySwapStep, TrxSwapQuotePayload, TrxSwapQuoteData, JumperToken, JumperTokensMap, JumperQuote, JumperQuotePayload, JumperQuoteToken, JumperFeeCost, BridgeExecutePayload, BridgeExecuteResult } from './api/walletApi'
|
export type { Chain, FormattedAmount, WalletBalanceData, PriceEntry, SendWalletPayload, SendWalletResponse, WalletAddress, PortfolioData, PortfolioChain, PortfolioNative, PortfolioToken, TokenInfo, RelayQuotePayload, RelayQuoteResponse, RelaySwapResponse, RelaySwapStep, TrxSwapQuotePayload, TrxSwapQuoteData, JumperToken, JumperTokensMap, JumperQuote, JumperQuotePayload, JumperQuoteToken, JumperFeeCost, BridgeExecutePayload, BridgeExecuteResult } from './api/walletApi'
|
||||||
export { CHAINS } from './api/walletApi'
|
export { CHAINS } from './api/walletApi'
|
||||||
|
|||||||
@@ -66,6 +66,19 @@ export function useJumperTokens() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function useJumperQuote(payload: JumperQuotePayload | null) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ['wallet', 'jumper', 'quote',
|
||||||
|
payload?.fromChain, payload?.toChain,
|
||||||
|
payload?.fromToken, payload?.toToken,
|
||||||
|
payload?.fromAmount, payload?.fromAddress, payload?.toAddress,
|
||||||
|
],
|
||||||
|
queryFn: () => getJumperQuote(payload!),
|
||||||
|
enabled: !!payload,
|
||||||
|
staleTime: 10_000,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function useFetchJumperQuote() {
|
export function useFetchJumperQuote() {
|
||||||
return useMutation({ mutationFn: (payload: JumperQuotePayload) => getJumperQuote(payload) })
|
return useMutation({ mutationFn: (payload: JumperQuotePayload) => getJumperQuote(payload) })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,14 @@ import { useEffect, useState } from 'react'
|
|||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { useQueryClient } from '@tanstack/react-query'
|
import { useQueryClient } from '@tanstack/react-query'
|
||||||
import {
|
import {
|
||||||
useJumperTokens, useWalletBalance, useWalletAddresses, useFetchJumperQuote, useExecuteBridge,
|
useJumperTokens, useWalletBalance, useWalletAddresses, useJumperQuote, useFetchJumperQuote, useExecuteBridge,
|
||||||
type Chain, type JumperToken, type WalletBalanceData, type JumperQuote,
|
type Chain, type JumperToken, type WalletBalanceData, type JumperQuote, type JumperQuotePayload,
|
||||||
} from '@features/wallet'
|
} from '@features/wallet'
|
||||||
import { Notification, PrimaryButton } from '@shared/ui'
|
import { Notification, PrimaryButton } from '@shared/ui'
|
||||||
import { ROUTES } from '@shared/config/routes'
|
import { ROUTES } from '@shared/config/routes'
|
||||||
import { toBaseUnits } from '@shared/lib/utils/baseUnits'
|
import { useDebounce } from '@shared/lib/hooks/useDebounce'
|
||||||
|
import { toBaseUnits, fromBaseUnits } from '@shared/lib/utils/baseUnits'
|
||||||
|
import { truncateDecimals } from '@shared/lib/utils/truncateDecimals'
|
||||||
import {
|
import {
|
||||||
TOKEN_META, buildTokensFromBalance, useSwapForm,
|
TOKEN_META, buildTokensFromBalance, useSwapForm,
|
||||||
type Token,
|
type Token,
|
||||||
@@ -93,32 +95,41 @@ export function BridgeForm() {
|
|||||||
setToToken(t => toTokenOptions.find(o => o.symbol === t.symbol) ?? toTokenOptions[0])
|
setToToken(t => toTokenOptions.find(o => o.symbol === t.symbol) ?? toTokenOptions[0])
|
||||||
}, [jumperData, toWalletData, toNetwork])
|
}, [jumperData, toWalletData, toNetwork])
|
||||||
|
|
||||||
|
const debouncedAmount = useDebounce(fromAmount, 500)
|
||||||
|
const parsedAmount = parseFloat(debouncedAmount)
|
||||||
|
|
||||||
const fromJumper = jumperData?.[CHAIN_ID_BY_NET[fromNetwork]]?.find(t => t.symbol === fromToken.symbol)
|
const fromJumper = jumperData?.[CHAIN_ID_BY_NET[fromNetwork]]?.find(t => t.symbol === fromToken.symbol)
|
||||||
const toJumper = jumperData?.[CHAIN_ID_BY_NET[toNetwork]]?.find(t => t.symbol === toToken.symbol)
|
const toJumper = jumperData?.[CHAIN_ID_BY_NET[toNetwork]]?.find(t => t.symbol === toToken.symbol)
|
||||||
const fromAddress = addresses?.find(a => a.chain === fromNetwork)?.address
|
const fromAddress = addresses?.find(a => a.chain === fromNetwork)?.address
|
||||||
const toAddress = addresses?.find(a => a.chain === toNetwork)?.address
|
const toAddress = addresses?.find(a => a.chain === toNetwork)?.address
|
||||||
const parsedAmount = parseFloat(fromAmount)
|
|
||||||
const canQuote = !!fromJumper && !!toJumper && !!fromAddress && !!toAddress && parsedAmount > 0
|
|
||||||
|
|
||||||
function handleConfirm() {
|
const quotePayload: JumperQuotePayload | null =
|
||||||
if (!fromJumper || !toJumper || !fromAddress || !toAddress) return
|
fromJumper && toJumper && fromAddress && toAddress && parsedAmount > 0
|
||||||
setErrorMessage(null)
|
? {
|
||||||
fetchQuote(
|
|
||||||
{
|
|
||||||
fromChain: CHAIN_ID_BY_NET[fromNetwork],
|
fromChain: CHAIN_ID_BY_NET[fromNetwork],
|
||||||
toChain: CHAIN_ID_BY_NET[toNetwork],
|
toChain: CHAIN_ID_BY_NET[toNetwork],
|
||||||
fromToken: fromJumper.address,
|
fromToken: fromJumper.address,
|
||||||
toToken: toJumper.address,
|
toToken: toJumper.address,
|
||||||
fromAmount: toBaseUnits(fromAmount, fromToken.decimals),
|
fromAmount: toBaseUnits(debouncedAmount, fromToken.decimals),
|
||||||
fromAddress,
|
fromAddress,
|
||||||
toAddress,
|
toAddress,
|
||||||
slippage: 0.005,
|
slippage: 0.005,
|
||||||
},
|
}
|
||||||
{
|
: null
|
||||||
|
|
||||||
|
const { data: quoteData, isFetching: isQuoting } = useJumperQuote(quotePayload)
|
||||||
|
|
||||||
|
const displayToAmount = quoteData
|
||||||
|
? truncateDecimals(fromBaseUnits(quoteData.estimate.toAmount, quoteData.action.toToken.decimals), 8)
|
||||||
|
: '0'
|
||||||
|
|
||||||
|
function handleConfirm() {
|
||||||
|
if (!quotePayload) return
|
||||||
|
setErrorMessage(null)
|
||||||
|
fetchQuote(quotePayload, {
|
||||||
onSuccess: (q) => setQuote(q),
|
onSuccess: (q) => setQuote(q),
|
||||||
onError: (err) => setErrorMessage(err instanceof Error ? err.message : 'Не удалось получить котировку'),
|
onError: (err) => setErrorMessage(err instanceof Error ? err.message : 'Не удалось получить котировку'),
|
||||||
},
|
})
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleExecute() {
|
function handleExecute() {
|
||||||
@@ -183,12 +194,12 @@ export function BridgeForm() {
|
|||||||
mode="to"
|
mode="to"
|
||||||
token={toToken}
|
token={toToken}
|
||||||
tokenOptions={toTokenOptions}
|
tokenOptions={toTokenOptions}
|
||||||
amount="0"
|
amount={displayToAmount}
|
||||||
onTokenChange={setToToken}
|
onTokenChange={setToToken}
|
||||||
hideNetworkSelect
|
hideNetworkSelect
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<PrimaryButton label="Подтвердить бридж" onClick={handleConfirm} disabled={!canQuote || isPending} />
|
<PrimaryButton label="Подтвердить бридж" onClick={handleConfirm} disabled={!quotePayload || isPending || isQuoting} />
|
||||||
|
|
||||||
{quote && (
|
{quote && (
|
||||||
<BridgeConfirmModal
|
<BridgeConfirmModal
|
||||||
|
|||||||
Reference in New Issue
Block a user