fix select bridge
This commit is contained in:
161
dist/assets/index-B04m7avt.js
vendored
Normal file
161
dist/assets/index-B04m7avt.js
vendored
Normal file
File diff suppressed because one or more lines are too long
161
dist/assets/index-DQUSmPFE.js
vendored
161
dist/assets/index-DQUSmPFE.js
vendored
File diff suppressed because one or more lines are too long
2
dist/index.html
vendored
2
dist/index.html
vendored
@@ -5,7 +5,7 @@
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>ЭКСА — Ваш мост в мир цифровых активов</title>
|
||||
<script type="module" crossorigin src="/assets/index-DQUSmPFE.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-B04m7avt.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-CmBRAAIp.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -27,7 +27,7 @@ const pump = COIN_ICONS.PUMP
|
||||
const popcat = COIN_ICONS.POPCAT
|
||||
const trump = COIN_ICONS.TRUMP
|
||||
const pengu = COIN_ICONS.PENGU
|
||||
import type { WalletBalanceData, TokenInfo } from '@features/wallet'
|
||||
import type { WalletBalanceData } from '@features/wallet'
|
||||
|
||||
export interface Token {
|
||||
symbol: string
|
||||
@@ -52,12 +52,6 @@ const TOKENS: Record<string, Token> = {
|
||||
|
||||
export const TOKENS_LIST: Token[] = Object.values(TOKENS)
|
||||
|
||||
// /api/tokens (TokenInfo) не отдаёт decimals — используем известные значения для
|
||||
// каталожных монет как лучшее приближение, когда монета не найдена в балансе кошелька.
|
||||
export const TOKEN_DECIMALS: Record<string, number> = Object.fromEntries(
|
||||
Object.entries(TOKENS).map(([symbol, t]) => [symbol, t.decimals])
|
||||
)
|
||||
|
||||
export const TOKEN_META: Record<string, { letter: string; color: string; logo?: string }> = {
|
||||
// Native / major
|
||||
BTC: { letter: '₿', logo: btc, color: '#F7931A' },
|
||||
@@ -97,10 +91,6 @@ const CHAIN_NATIVE: Record<string, string> = {
|
||||
ETH: 'ETH', BSC: 'BSC', BTC: 'BTC', TRX: 'TRX', SOL: 'SOL',
|
||||
}
|
||||
|
||||
// Каждая нативная EVM-монета (ETH/BSC/ARB…) — 18 знаков; для остальных незнакомых
|
||||
// каталожных символов это самое частое значение среди ERC-20/BEP-20 токенов.
|
||||
const DEFAULT_DECIMALS = 18
|
||||
|
||||
export function buildTokensFromBalance(data: WalletBalanceData): Token[] {
|
||||
const result: Token[] = []
|
||||
|
||||
@@ -134,41 +124,6 @@ export function buildTokensFromBalance(data: WalletBalanceData): Token[] {
|
||||
return result
|
||||
}
|
||||
|
||||
/**
|
||||
* Список монет для селектора свопа: показывает ВСЕ монеты, поддерживаемые
|
||||
* каталогом провайдера (/api/tokens) для сети, а не только те, что реально
|
||||
* лежат в кошельке — иначе непополненные монеты пропадали бы из выбора.
|
||||
* Баланс/курс/decimals подставляются из реального кошелька, если монета там есть.
|
||||
*/
|
||||
export function buildTokensFromCatalog(
|
||||
catalog: TokenInfo[],
|
||||
network: string,
|
||||
walletData?: WalletBalanceData,
|
||||
): Token[] {
|
||||
const held = walletData ? buildTokensFromBalance(walletData) : []
|
||||
const heldBySymbol = new Map(held.map(t => [t.symbol, t]))
|
||||
|
||||
const nativeSym = CHAIN_NATIVE[network] ?? network
|
||||
const symbols = new Set<string>([nativeSym, ...catalog.filter(t => t.chain === network).map(t => t.symbol)])
|
||||
|
||||
return Array.from(symbols).map(symbol => {
|
||||
const existing = heldBySymbol.get(symbol)
|
||||
if (existing) return existing
|
||||
|
||||
const meta = TOKEN_META[symbol]
|
||||
return {
|
||||
symbol,
|
||||
letter: meta?.letter ?? symbol[0],
|
||||
color: meta?.color ?? '#888',
|
||||
logo: meta?.logo,
|
||||
network,
|
||||
balance: 0,
|
||||
usdRate: 0,
|
||||
decimals: TOKEN_DECIMALS[symbol] ?? DEFAULT_DECIMALS,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
const RATE = 82.2578
|
||||
|
||||
export function useSwapForm() {
|
||||
|
||||
@@ -10,7 +10,7 @@ import {
|
||||
} from '@features/wallet'
|
||||
import { ROUTES } from '@shared/config/routes'
|
||||
import { useDebounce } from '@shared/lib/hooks/useDebounce'
|
||||
import { TOKENS_LIST, buildTokensFromBalance, buildTokensFromCatalog, useSwapForm } from '../model/useSwapForm'
|
||||
import { TOKENS_LIST, buildTokensFromBalance, useSwapForm } from '../model/useSwapForm'
|
||||
import { SwapCard } from './SwapCard'
|
||||
import { SwapDirectionButton } from './SwapDirectionButton'
|
||||
import { SwapInfoPanel } from './SwapInfoPanel'
|
||||
@@ -48,13 +48,12 @@ export function SwapForm() {
|
||||
const { data: walletData } = useWalletBalance(fromNetwork as Chain)
|
||||
const { data: tokensList } = useTokensList()
|
||||
|
||||
// На EVM/SOL показываем весь каталог Relay (/api/tokens) для сети — включая монеты,
|
||||
// которых нет в кошельке, — а не только то, что реально куплено; баланс/курс
|
||||
// подставляются из кошелька, если монета там есть. Для TRX каталог не при чём:
|
||||
// своп идёт через отдельный эндпоинт по символам, поэтому используем баланс кошелька.
|
||||
const tokenOptions = !isTrxNetwork && tokensList
|
||||
? buildTokensFromCatalog(tokensList, fromNetwork, walletData)
|
||||
: (walletData ? buildTokensFromBalance(walletData) : TOKENS_LIST)
|
||||
const balanceTokenOptions = walletData ? buildTokensFromBalance(walletData) : TOKENS_LIST
|
||||
// На EVM/SOL можно выбирать только монеты из каталога Relay (/api/tokens) — для
|
||||
// остальных не резолвится адрес контракта и котировка вообще не запрашивается.
|
||||
const tokenOptions = isTrxNetwork || !tokensList
|
||||
? balanceTokenOptions
|
||||
: balanceTokenOptions.filter(t => t.symbol === fromNetwork || tokensList.some(tl => tl.chain === fromNetwork && tl.symbol === t.symbol))
|
||||
|
||||
useEffect(() => {
|
||||
if (tokenOptions.length === 0) return
|
||||
|
||||
Reference in New Issue
Block a user