@rash2x/bridge-widget 0.6.83 → 0.6.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33,7 +33,7 @@ import { CardHeader, CardTitle, CardAction, Card, CardContent, CardFooter } from
33
33
  import { FixedSizeList } from "react-window";
34
34
  const common$1 = { "connecting": "Connecting…", "initializing": "Initializing...", "loading": "Loading...", "paste": "paste", "close": "Close", "zeroPlaceholder": "0", "nativeToken": "Native Token" };
35
35
  const wallets$1 = { "addTonWallet": "Add TON wallet", "addEvmWallet": "Add EVM wallet", "connectTonWallet": "Connect TON wallet", "connectEvmWallet": "Connect EVM wallet", "initializingMetamask": "Initializing MetaMask SDK...", "initializingTronlink": "Initializing TronLink...", "failedToConnectTon": "Failed to connect to TON wallet", "failedToDisconnect": "Failed to disconnect", "metamaskConnectionError": "MetaMask connection error", "failedToConnectMetamask": "Failed to connect to MetaMask", "failedToDisconnectMetamask": "Failed to disconnect from MetaMask", "selectWallet": "Select Wallet", "tonWallets": "TON", "evmWallets": "EVM", "tronWallets": "TRON", "tonconnect": "TonConnect", "metaMask": "WalletConnect", "walletConnect": "WalletConnect", "tronLink": "TronLink", "addTronWallet": "Add Tron wallet", "comingSoon": "Coming Soon", "connected": "CONNECTED", "connectedStatus": "Connected", "disconnect": "Disconnect", "chooseWallet": "Connect wallet", "oneWalletPerEnv": "You can only connect one wallet per environment.", "connect": "Connect", "connectTronWallet": "Connect Tron wallet", "connectWallet": "Connect wallet" };
36
- const bridge$1 = { "max": "Max", "sourceNetwork": "Source network", "destinationNetwork": "Destination network", "selectToken": "Select token", "selectNetwork": "Select network", "selectSourceNetwork": "Select source network", "selectDestinationNetwork": "Select destination network", "searchToken": "Search token", "myTokens": "My tokens", "allTokens": "All tokens", "search": "Search", "select": "Select", "willChangeSourceChain": "Will change source network", "willChangeSourceNetworkAndToken": "Will change source token", "noBalancesFound": "No balances found.", "noResults": "No results", "tokenNotFound": "We couldn't find a token with that name or symbol. Please try again.", "chainNotFound": "We couldn't find a chain with that name. Please try again.", "sendToAnotherAddress": "Send to another address", "youWillReceive": "You will receive", "anotherAddressPlaceholder": "Address", "addressDoesntMatch": "Address doesn't match the {{network}} network", "checkBeforeTransfer": "Check correctness before transfer" };
36
+ const bridge$1 = { "max": "Max", "sourceNetwork": "Source network", "destinationNetwork": "Destination network", "selectToken": "Select token", "selectNetwork": "Select network", "selectSourceNetwork": "Select source network", "selectDestinationNetwork": "Select destination network", "searchToken": "Search token", "myTokens": "My tokens", "allTokens": "All tokens", "search": "Search", "select": "Select", "willChangeSourceChain": "Will change source network", "willChangeDestinationChain": "Will change destination network", "willChangeBothChains": "Will change both networks", "willChangeSourceNetworkAndToken": "Will change source token", "noBalancesFound": "No balances found.", "noResults": "No results", "tokenNotFound": "We couldn't find a token with that name or symbol. Please try again.", "chainNotFound": "We couldn't find a chain with that name. Please try again.", "sendToAnotherAddress": "Send to another address", "youWillReceive": "You will receive", "anotherAddressPlaceholder": "Address", "addressDoesntMatch": "Address doesn't match the {{network}} network", "checkBeforeTransfer": "Check correctness before transfer" };
37
37
  const transaction$1 = { "enterAmount": "Enter amount", "transfer": "Transfer", "getQuote": "Get quote", "failed": "Transaction Failed", "confirm": "Confirm transaction", "signTransaction": "Sign in transaction in wallet", "quoting": "Quoting...", "inProgress": "Transaction in progress...", "checkingBalance": "Checking balance...", "insufficientBalance": "Insufficient balance", "amountTooSmall": "Min {{min}}", "amountTooLarge": "Max {{max}}", "success": "Success", "successTitle": "Success", "done": "Done", "hashCopied": "Hash copied to clipboard", "bridged": "Bridged", "transferTitle": "Transfer", "hash": "Hash", "layerzeroScan": "TxHash", "finalFee": "Final Fee", "route": "Route", "routeTooltip": "Route is the path your transfer takes between networks. The bridge is powered by LayerZero, and the specific path can affect the fee, slippage, and estimated time.", "estTime": "Est. Time", "estTimeTooltip": "Estimated time is the approximate completion time. It depends on the route and network load; actual time may vary.", "slippage": "Slippage", "slippageTooltip": "If the received amount goes below this tolerance, the transaction will be reverted.", "minimumReceived": "Minimum received", "totalFee": "Total Fee", "totalFeeTooltip": "Total fee is the estimated total cost of the transfer. It includes network gas and bridge/route fees. The final fee may vary slightly.", "noRouteFound": "No route found", "notEnoughGas": "Not enough gas", "pasteAddressToTransfer": "Paste address to transfer", "noRouteFoundForSettings": "No route found for current settings.", "tryAdjustSettings": "Try disabling Gas on Destination, or adjust amount/networks.", "quoteError": "Quote error", "steps": { "sent": "Sent", "approving": "Approving Token", "approvingNote": "Step {{current}} of {{total}}: Confirm approval in wallet", "bridging": "Bridging", "processing": "Processing", "processingNote": "Up to 2 minutes", "completed": "Completed" } };
38
38
  const telegram$1 = { "openWebVersion": "Open EVAA Web to Bridge", "restrictionMessage": "You can bridge between the chosen networks on EVAA web version" };
39
39
  const app$1 = { "stargateWidgetName": "Stargate Bridge Widget", "liveWidget": "Live Widget", "getStarted": "Get Started" };
@@ -51,7 +51,7 @@ const en$3 = {
51
51
  };
52
52
  const common = { "connecting": "Подключение…", "initializing": "Инициализация...", "loading": "Загрузка...", "paste": "вставить", "close": "Закрыть", "zeroPlaceholder": "0", "nativeToken": "Нативный токен" };
53
53
  const wallets = { "addTonWallet": "Добавить TON кошелёк", "addEvmWallet": "Добавить EVM кошелёк", "connectTonWallet": "Подключить TON кошелёк", "connectEvmWallet": "Подключить EVM кошелёк", "initializingMetamask": "Инициализация MetaMask SDK...", "initializingTronlink": "Инициализация TronLink...", "failedToConnectTon": "Не удалось подключиться к TON кошельку", "failedToDisconnect": "Не удалось отключиться", "metamaskConnectionError": "Ошибка подключения MetaMask", "failedToConnectMetamask": "Не удалось подключиться к MetaMask", "failedToDisconnectMetamask": "Не удалось отключиться от MetaMask", "selectWallet": "Выберите кошелёк", "tonWallets": "TON", "evmWallets": "EVM", "tronWallets": "TRON", "tonconnect": "TonConnect", "metaMask": "WalletConnect", "walletConnect": "WalletConnect", "tronLink": "TronLink", "addTronWallet": "Добавить Tron кошелёк", "comingSoon": "Скоро", "connected": "ПОДКЛЮЧЕНО", "connectedStatus": "Подключён", "disconnect": "Отключить", "chooseWallet": "Подключите кошелек", "oneWalletPerEnv": "Можно подключить только один кошелёк на окружение.", "connect": "Подключить", "connectTronWallet": "Подключить Tron кошелёк", "connectWallet": "Подключить кошелёк" };
54
- const bridge = { "max": "Макс", "sourceNetwork": "Исходная сеть", "destinationNetwork": "Целевая сеть", "selectToken": "Выбрать токен", "selectNetwork": "Выбрать сеть", "selectSourceNetwork": "Выбрать исходную сеть", "selectDestinationNetwork": "Выбрать целевую сеть", "searchToken": "Поиск токена", "myTokens": "Мои токены", "allTokens": "Все токены", "search": "Поиск", "select": "Выбрать", "willChangeSourceChain": "Сменит исходную сеть", "willChangeSourceNetworkAndToken": "Сменит исходный токен", "noBalancesFound": "Балансы не найдены.", "noResults": "Нет результатов", "tokenNotFound": "Мы не смогли найти токен с таким названием или символом. Пожалуйста, попробуйте снова.", "chainNotFound": "Мы не смогли найти сеть с таким названием. Пожалуйста, попробуйте снова.", "sendToAnotherAddress": "Отправить на другой адрес", "youWillReceive": "Вы получите", "anotherAddressPlaceholder": "Адрес", "addressDoesntMatch": "Адрес не соответствует сети {{network}}", "checkBeforeTransfer": "Проверьте корректность перед переводом" };
54
+ const bridge = { "max": "Макс", "sourceNetwork": "Исходная сеть", "destinationNetwork": "Целевая сеть", "selectToken": "Выбрать токен", "selectNetwork": "Выбрать сеть", "selectSourceNetwork": "Выбрать исходную сеть", "selectDestinationNetwork": "Выбрать целевую сеть", "searchToken": "Поиск токена", "myTokens": "Мои токены", "allTokens": "Все токены", "search": "Поиск", "select": "Выбрать", "willChangeSourceChain": "Сменит исходную сеть", "willChangeDestinationChain": "Сменит целевую сеть", "willChangeBothChains": "Сменит обе сети", "willChangeSourceNetworkAndToken": "Сменит исходный токен", "noBalancesFound": "Балансы не найдены.", "noResults": "Нет результатов", "tokenNotFound": "Мы не смогли найти токен с таким названием или символом. Пожалуйста, попробуйте снова.", "chainNotFound": "Мы не смогли найти сеть с таким названием. Пожалуйста, попробуйте снова.", "sendToAnotherAddress": "Отправить на другой адрес", "youWillReceive": "Вы получите", "anotherAddressPlaceholder": "Адрес", "addressDoesntMatch": "Адрес не соответствует сети {{network}}", "checkBeforeTransfer": "Проверьте корректность перед переводом" };
55
55
  const transaction = { "enterAmount": "Введите сумму", "transfer": "Перевести", "getQuote": "Получить котировку", "quoting": "Расчет котировки...", "failed": "Ошибка транзакции", "confirm": "Подтвердите транзакцию", "signTransaction": "Подпишите транзакцию в кошельке", "inProgress": "Транзакция выполняется...", "checkingBalance": "Проверка баланса...", "insufficientBalance": "Недостаточно средств", "amountTooSmall": "Минимум {{min}}", "amountTooLarge": "Максимум {{max}}", "success": "Успех", "successTitle": "Успех", "done": "Готово", "hashCopied": "Хэш скопирован в буфер обмена", "bridged": "Переведено", "transferTitle": "Перевод", "hash": "Хэш", "layerzeroScan": "TxHash", "finalFee": "Итоговая комиссия", "route": "Маршрут", "routeTooltip": "Маршрут — это путь, по которому будет выполнен перевод. Мост работает на базе LayerZero, а конкретный путь передачи между сетями может влиять на комиссию, проскальзывание и время.", "estTime": "Время", "estTimeTooltip": "Среднее время — примерное время завершения перевода. Зависит от маршрута и нагрузки сети; фактическое время может отличаться.", "slippage": "Проскальзывание", "slippageTooltip": "Если получаемая сумма окажется ниже этого допуска, транзакция будет отклонена.", "minimumReceived": "Минимум к получению", "totalFee": "Общая комиссия", "totalFeeTooltip": "Общая комиссия за перевод. Включает оценку комиссии сети (газ) и комиссии моста/маршрута. Фактическая сумма может немного измениться.", "noRouteFound": "Маршрут не найден", "notEnoughGas": "Недостаточно газа", "pasteAddressToTransfer": "Укажите адрес получателя", "noRouteFoundForSettings": "Маршрут не найден для текущих настроек.", "tryAdjustSettings": "Попробуйте отключить Gas on Destination или измените сумму/сети.", "quoteError": "Ошибка котировки", "steps": { "sent": "Отправлено", "approving": "Одобрение токена", "approvingNote": "Шаг {{current}} из {{total}}: Подтвердите одобрение в кошельке", "bridging": "Перевод через мост", "processing": "Обработка", "processingNote": "До 2 минут", "completed": "Завершено" } };
56
56
  const telegram = { "openWebVersion": "Открыть EVAA веб для трансфера", "restrictionMessage": "Трансфер между выбранными сетями доступен только в веб-версии EVAA" };
57
57
  const app = { "stargateWidgetName": "Виджет Stargate Bridge", "liveWidget": "Живой виджет", "getStarted": "Начало работы" };
@@ -1373,7 +1373,6 @@ const useChainDerivations = () => {
1373
1373
  return;
1374
1374
  }
1375
1375
  if (!supportedFrom.some((c2) => c2.chainKey === fromChain.chainKey)) {
1376
- setToChain(void 0);
1377
1376
  setAllowedToChains([]);
1378
1377
  }
1379
1378
  }, [
@@ -1407,27 +1406,23 @@ const useChainDerivations = () => {
1407
1406
  try {
1408
1407
  if (ignore) return;
1409
1408
  const dest = await getDestTokens(fromChain.chainKey, srcAddr);
1409
+ if (ignore) return;
1410
1410
  const byChainSameSymbol = assetMatrix?.[selectedAssetSymbol.toUpperCase()] ?? {};
1411
- const expectedAddrByChain = new Map(
1412
- Object.entries(byChainSameSymbol).map(([ck, tok]) => [
1413
- ck,
1414
- (tok.address ?? "").toLowerCase()
1415
- ])
1416
- );
1417
1411
  const filteredDest = dest.filter((t2) => {
1418
1412
  const ck = t2.chainKey ?? t2.dstChainKey ?? "";
1419
- const expected = expectedAddrByChain.get(ck);
1420
- const got = (t2.address ?? "").toLowerCase();
1421
- return !!expected && expected === got;
1413
+ const matrixToken = byChainSameSymbol[ck];
1414
+ const symbolMatch = matrixToken && (t2.symbol ?? "").toUpperCase() === selectedAssetSymbol.toUpperCase();
1415
+ return !!symbolMatch;
1422
1416
  });
1423
1417
  const keys2 = new Set(filteredDest.map((t2) => t2.chainKey));
1424
1418
  let list = chains.filter((c2) => keys2.has(c2.chainKey));
1425
1419
  if (fromChain?.chainKey) {
1426
1420
  list = list.filter((c2) => c2.chainKey !== fromChain.chainKey);
1427
1421
  }
1422
+ const currentToChain = useChainsStore.getState().toChain;
1428
1423
  setAllowedToChains(list);
1429
1424
  if (isUrlInitialized) {
1430
- if (!toChain || !list.some((c2) => c2.chainKey === toChain.chainKey)) {
1425
+ if (!currentToChain || !list.some((c2) => c2.chainKey === currentToChain.chainKey)) {
1431
1426
  const ton = list.find((c2) => c2.chainKey === "ton");
1432
1427
  setToChain(ton || list[0]);
1433
1428
  }
@@ -1451,7 +1446,6 @@ const useChainDerivations = () => {
1451
1446
  assetMatrix,
1452
1447
  fromChain?.chainKey,
1453
1448
  chains,
1454
- toChain,
1455
1449
  setAllowedToChains,
1456
1450
  setToChain,
1457
1451
  setIsLoadingToChains,
@@ -2233,7 +2227,7 @@ const ChainSelectModal = ({
2233
2227
  const findCompatibleSrcChain = useCallback(
2234
2228
  (dstChain) => {
2235
2229
  if (!chains || !selectedAssetSymbol || !assetMatrix) return void 0;
2236
- const PRIORITY_CHAINS = [
2230
+ const PRIORITY_CHAINS2 = [
2237
2231
  "ethereum",
2238
2232
  "arbitrum",
2239
2233
  "bsc",
@@ -2244,20 +2238,20 @@ const ChainSelectModal = ({
2244
2238
  const assetByChain = assetMatrix[selectedAssetSymbol.toUpperCase()];
2245
2239
  if (!assetByChain) return void 0;
2246
2240
  const availableChains = chains.filter(
2247
- (c2) => assetByChain[c2.chainKey] && assetByChain[dstChain.chainKey]
2241
+ (c2) => assetByChain[c2.chainKey] && assetByChain[dstChain.chainKey] && c2.chainKey !== fromChain?.chainKey && c2.chainKey !== dstChain.chainKey
2248
2242
  );
2249
- for (const chainKey of PRIORITY_CHAINS) {
2243
+ for (const chainKey of PRIORITY_CHAINS2) {
2250
2244
  const chain2 = availableChains.find((c2) => c2.chainKey === chainKey);
2251
2245
  if (chain2) return chain2;
2252
2246
  }
2253
2247
  return availableChains[0];
2254
2248
  },
2255
- [chains, selectedAssetSymbol, assetMatrix]
2249
+ [chains, selectedAssetSymbol, assetMatrix, fromChain?.chainKey]
2256
2250
  );
2257
2251
  const findCompatibleTokenAndSrcChain = useCallback(
2258
2252
  (dstChain) => {
2259
2253
  if (!chains || !assetMatrix) return void 0;
2260
- const PRIORITY_CHAINS = [
2254
+ const PRIORITY_CHAINS2 = [
2261
2255
  "ethereum",
2262
2256
  "arbitrum",
2263
2257
  "bsc",
@@ -2269,11 +2263,11 @@ const ChainSelectModal = ({
2269
2263
  const assetByChain = assetMatrix[tokenSymbol];
2270
2264
  if (!assetByChain[dstChain.chainKey]) continue;
2271
2265
  const availableChains = chains.filter(
2272
- (c2) => assetByChain[c2.chainKey] && c2.chainKey !== dstChain.chainKey
2266
+ (c2) => assetByChain[c2.chainKey] && c2.chainKey !== dstChain.chainKey && c2.chainKey !== fromChain?.chainKey
2273
2267
  );
2274
2268
  if (availableChains.length === 0) continue;
2275
2269
  let sourceChain;
2276
- for (const chainKey of PRIORITY_CHAINS) {
2270
+ for (const chainKey of PRIORITY_CHAINS2) {
2277
2271
  sourceChain = availableChains.find((c2) => c2.chainKey === chainKey);
2278
2272
  if (sourceChain) break;
2279
2273
  }
@@ -2282,7 +2276,7 @@ const ChainSelectModal = ({
2282
2276
  }
2283
2277
  return void 0;
2284
2278
  },
2285
- [chains, assetMatrix]
2279
+ [chains, assetMatrix, fromChain?.chainKey]
2286
2280
  );
2287
2281
  const groupedChains = useMemo(() => {
2288
2282
  const q3 = query.trim().toLowerCase();
@@ -2321,25 +2315,92 @@ const ChainSelectModal = ({
2321
2315
  findCompatibleSrcChain,
2322
2316
  findCompatibleTokenAndSrcChain
2323
2317
  ]);
2324
- const onChainPick = (chain2, willChangeSrc = false, willChangeTokenAndSrc = false) => {
2325
- if (willChangeTokenAndSrc) {
2326
- const result = findCompatibleTokenAndSrcChain(chain2);
2327
- if (result) {
2328
- setSelectedAssetSymbol(result.tokenSymbol);
2329
- if (setFromChain) setFromChain(result.sourceChain);
2330
- }
2331
- } else if (willChangeSrc) {
2332
- const newSrcChain = findCompatibleSrcChain(chain2);
2333
- if (newSrcChain && setFromChain) setFromChain(newSrcChain);
2334
- }
2335
- onChangeChain(chain2);
2336
- handleClose();
2337
- };
2318
+ const PRIORITY_CHAINS = useMemo(
2319
+ () => ["ethereum", "arbitrum", "bsc", "polygon", "optimism", "base"],
2320
+ []
2321
+ );
2322
+ const [isPickLoading, setIsPickLoading] = useState(false);
2323
+ const onChainPick = useCallback(
2324
+ async (chain2, willChangeSrc = false, willChangeTokenAndSrc = false) => {
2325
+ if (!willChangeSrc && !willChangeTokenAndSrc) {
2326
+ onChangeChain(chain2);
2327
+ handleClose();
2328
+ return;
2329
+ }
2330
+ setIsPickLoading(true);
2331
+ try {
2332
+ if (willChangeTokenAndSrc) {
2333
+ const result = findCompatibleTokenAndSrcChain(chain2);
2334
+ if (!result) return;
2335
+ const dstToken = assetMatrix?.[result.tokenSymbol.toUpperCase()]?.[chain2.chainKey];
2336
+ if (!dstToken?.address) return;
2337
+ const availableSources = await getDestTokens(chain2.chainKey, dstToken.address);
2338
+ const sourceChainKeys = new Set(availableSources.map((t22) => t22.chainKey ?? ""));
2339
+ let validSrc;
2340
+ for (const key of PRIORITY_CHAINS) {
2341
+ if (sourceChainKeys.has(key) && key !== fromChain?.chainKey && key !== chain2.chainKey) {
2342
+ validSrc = chains?.find((c2) => c2.chainKey === key);
2343
+ if (validSrc) break;
2344
+ }
2345
+ }
2346
+ if (!validSrc && chains) {
2347
+ validSrc = chains.find(
2348
+ (c2) => sourceChainKeys.has(c2.chainKey) && c2.chainKey !== fromChain?.chainKey && c2.chainKey !== chain2.chainKey
2349
+ );
2350
+ }
2351
+ if (validSrc) {
2352
+ setSelectedAssetSymbol(result.tokenSymbol);
2353
+ setFromChain(validSrc);
2354
+ onChangeChain(chain2);
2355
+ }
2356
+ } else if (willChangeSrc && selectedAssetSymbol) {
2357
+ const dstToken = assetMatrix?.[selectedAssetSymbol.toUpperCase()]?.[chain2.chainKey];
2358
+ if (!dstToken?.address) return;
2359
+ const availableSources = await getDestTokens(chain2.chainKey, dstToken.address);
2360
+ const sourceChainKeys = new Set(availableSources.map((t22) => t22.chainKey ?? ""));
2361
+ let validSrc;
2362
+ for (const key of PRIORITY_CHAINS) {
2363
+ if (sourceChainKeys.has(key) && key !== fromChain?.chainKey && key !== chain2.chainKey) {
2364
+ validSrc = chains?.find((c2) => c2.chainKey === key);
2365
+ if (validSrc) break;
2366
+ }
2367
+ }
2368
+ if (!validSrc && chains) {
2369
+ validSrc = chains.find(
2370
+ (c2) => sourceChainKeys.has(c2.chainKey) && c2.chainKey !== fromChain?.chainKey && c2.chainKey !== chain2.chainKey
2371
+ );
2372
+ }
2373
+ if (validSrc) {
2374
+ setFromChain(validSrc);
2375
+ onChangeChain(chain2);
2376
+ }
2377
+ }
2378
+ } catch (e2) {
2379
+ console.error("Failed to validate route", e2);
2380
+ } finally {
2381
+ setIsPickLoading(false);
2382
+ handleClose();
2383
+ }
2384
+ },
2385
+ [
2386
+ chains,
2387
+ fromChain?.chainKey,
2388
+ selectedAssetSymbol,
2389
+ assetMatrix,
2390
+ findCompatibleTokenAndSrcChain,
2391
+ setSelectedAssetSymbol,
2392
+ setFromChain,
2393
+ onChangeChain,
2394
+ handleClose,
2395
+ PRIORITY_CHAINS
2396
+ ]
2397
+ );
2338
2398
  const renderChainItem = (chain2, willChangeSrc, willChangeTokenAndSrc = false) => {
2339
2399
  const isSelected = isSource ? fromChain?.chainKey === chain2.chainKey : toChain?.chainKey === chain2.chainKey;
2340
2400
  return /* @__PURE__ */ jsx(
2341
2401
  Button,
2342
2402
  {
2403
+ disabled: isPickLoading,
2343
2404
  onClick: () => onChainPick(chain2, willChangeSrc, willChangeTokenAndSrc),
2344
2405
  className: cn$2(
2345
2406
  "w-full cursor-pointer flex shadow-none rounded-xs items-center justify-between gap-3 px-5 py-4 h-13 font-semibold capitalize bg-transparent hover:scale-100 hover:bg-accent",
@@ -3657,6 +3718,7 @@ function useBridgeTransaction() {
3657
3718
  from_network: srcChain?.name || quote.srcChainKey,
3658
3719
  to_network: dstChain?.name || quote.dstChainKey,
3659
3720
  estimated_fee: gas.requiredNative.toString(),
3721
+ estimated_fee_token: gas.nativeSym.toString(),
3660
3722
  sent_at: (/* @__PURE__ */ new Date()).toISOString()
3661
3723
  },
3662
3724
  bridgeReportConfig
@@ -6757,7 +6819,7 @@ const TokenSelectModal = ({
6757
6819
  const [manualTabSwitch, setManualTabSwitch] = useState(false);
6758
6820
  const [listHeight, setListHeight] = useState(400);
6759
6821
  const { srcAddress } = useAddresses();
6760
- const { fromChain, setFromChain, chains } = useChainsStore();
6822
+ const { fromChain, toChain, setFromChain, chains } = useChainsStore();
6761
6823
  const { assetMatrix, selectedAssetSymbol } = useTokensStore();
6762
6824
  const { hasAnyWallet, hasWalletForChain } = useConnectedWalletsStore();
6763
6825
  const { getBalance, query: balancesQuery } = useBalances(
@@ -6806,25 +6868,35 @@ const TokenSelectModal = ({
6806
6868
  const groups = {
6807
6869
  withBalance: [],
6808
6870
  onSrcChain: [],
6809
- willChangeSrcChain: []
6871
+ willChangeDstChain: [],
6872
+ willChangeSrcChain: [],
6873
+ willChangeBothChains: []
6810
6874
  };
6811
6875
  for (const asset of filtered) {
6812
6876
  const hasBalance = getBalance(asset.symbol) > 0;
6813
6877
  const onSrc = isTokenAvailableOnChain(asset.symbol, fromChain?.chainKey);
6878
+ const onDst = isTokenAvailableOnChain(asset.symbol, toChain?.chainKey);
6814
6879
  if (hasBalance && onSrc) {
6815
6880
  groups.withBalance.push(asset);
6816
- } else if (onSrc) {
6881
+ } else if (onSrc && onDst) {
6817
6882
  groups.onSrcChain.push(asset);
6818
- } else {
6883
+ } else if (onSrc && !onDst) {
6884
+ groups.willChangeDstChain.push(asset);
6885
+ } else if (!onSrc && onDst) {
6819
6886
  const availableChain = findFirstAvailableChain(asset.symbol);
6820
6887
  if (availableChain) groups.willChangeSrcChain.push(asset);
6888
+ } else {
6889
+ const availableChain = findFirstAvailableChain(asset.symbol);
6890
+ if (availableChain) groups.willChangeBothChains.push(asset);
6821
6891
  }
6822
6892
  }
6823
6893
  const sortByUsd = (a2, b2) => getTokenUsdValue(b2.symbol, b2.price?.usd) - getTokenUsdValue(a2.symbol, a2.price?.usd);
6824
6894
  const sortAZ = (a2, b2) => a2.symbol.localeCompare(b2.symbol);
6825
6895
  groups.withBalance.sort(sortByUsd);
6826
6896
  groups.onSrcChain.sort(sortAZ);
6897
+ groups.willChangeDstChain.sort(sortAZ);
6827
6898
  groups.willChangeSrcChain.sort(sortAZ);
6899
+ groups.willChangeBothChains.sort(sortAZ);
6828
6900
  return groups;
6829
6901
  }, [
6830
6902
  items,
@@ -6832,6 +6904,7 @@ const TokenSelectModal = ({
6832
6904
  getBalance,
6833
6905
  isTokenAvailableOnChain,
6834
6906
  fromChain?.chainKey,
6907
+ toChain?.chainKey,
6835
6908
  findFirstAvailableChain,
6836
6909
  getTokenUsdValue
6837
6910
  ]);
@@ -6864,12 +6937,15 @@ const TokenSelectModal = ({
6864
6937
  }, [isOpen, resetState]);
6865
6938
  useEffect(() => () => resetState(), [resetState]);
6866
6939
  const onPick = useCallback(
6867
- (sym, willChangeSrcChain = false) => {
6868
- if (willChangeSrcChain) {
6940
+ (sym, willChangeSrcChain = false, willChangeDstChain = false, willChangeBothChains = false) => {
6941
+ onChangeAsset(sym);
6942
+ if (willChangeBothChains) {
6869
6943
  const newChain = findFirstAvailableChain(sym);
6870
6944
  if (newChain && setFromChain) setFromChain(newChain);
6871
- }
6872
- onChangeAsset(sym);
6945
+ } else if (willChangeSrcChain) {
6946
+ const newChain = findFirstAvailableChain(sym);
6947
+ if (newChain && setFromChain) setFromChain(newChain);
6948
+ } else ;
6873
6949
  handleClose();
6874
6950
  },
6875
6951
  [findFirstAvailableChain, handleClose, onChangeAsset, setFromChain]
@@ -6893,6 +6969,13 @@ const TokenSelectModal = ({
6893
6969
  ];
6894
6970
  return mainTokens;
6895
6971
  }, [effectiveTab, myTokens, groupedTokens]);
6972
+ const willChangeDstTokens = useMemo(
6973
+ () => groupedTokens.willChangeDstChain.map((token) => ({
6974
+ token,
6975
+ willChangeDst: true
6976
+ })),
6977
+ [groupedTokens.willChangeDstChain]
6978
+ );
6896
6979
  const willChangeSrcTokens = useMemo(
6897
6980
  () => groupedTokens.willChangeSrcChain.map((token) => ({
6898
6981
  token,
@@ -6900,14 +6983,33 @@ const TokenSelectModal = ({
6900
6983
  })),
6901
6984
  [groupedTokens.willChangeSrcChain]
6902
6985
  );
6903
- const hasNoResults = tokensToRender.length === 0 && willChangeSrcTokens.length === 0;
6986
+ const willChangeBothTokens = useMemo(
6987
+ () => groupedTokens.willChangeBothChains.map((token) => ({
6988
+ token,
6989
+ willChangeBoth: true
6990
+ })),
6991
+ [groupedTokens.willChangeBothChains]
6992
+ );
6993
+ const hasNoResults = tokensToRender.length === 0 && willChangeDstTokens.length === 0 && willChangeSrcTokens.length === 0 && willChangeBothTokens.length === 0;
6904
6994
  const virtualItems = useMemo(() => {
6905
6995
  const items2 = tokensToRender.map(
6906
6996
  ({ token, willChangeSrc }) => ({
6907
6997
  type: "token",
6908
- data: { token, willChangeSrc }
6998
+ data: { token, willChangeSrc, willChangeDst: false, willChangeBoth: false }
6909
6999
  })
6910
7000
  );
7001
+ if (effectiveTab === "all" && willChangeDstTokens.length > 0) {
7002
+ items2.push({
7003
+ type: "header",
7004
+ text: t2("bridge.willChangeDestinationChain")
7005
+ });
7006
+ items2.push(
7007
+ ...willChangeDstTokens.map(({ token, willChangeDst }) => ({
7008
+ type: "token",
7009
+ data: { token, willChangeSrc: false, willChangeDst, willChangeBoth: false }
7010
+ }))
7011
+ );
7012
+ }
6911
7013
  if (effectiveTab === "all" && willChangeSrcTokens.length > 0) {
6912
7014
  items2.push({
6913
7015
  type: "header",
@@ -6916,12 +7018,24 @@ const TokenSelectModal = ({
6916
7018
  items2.push(
6917
7019
  ...willChangeSrcTokens.map(({ token, willChangeSrc }) => ({
6918
7020
  type: "token",
6919
- data: { token, willChangeSrc }
7021
+ data: { token, willChangeSrc, willChangeDst: false, willChangeBoth: false }
7022
+ }))
7023
+ );
7024
+ }
7025
+ if (effectiveTab === "all" && willChangeBothTokens.length > 0) {
7026
+ items2.push({
7027
+ type: "header",
7028
+ text: t2("bridge.willChangeBothChains")
7029
+ });
7030
+ items2.push(
7031
+ ...willChangeBothTokens.map(({ token, willChangeBoth }) => ({
7032
+ type: "token",
7033
+ data: { token, willChangeSrc: false, willChangeDst: false, willChangeBoth }
6920
7034
  }))
6921
7035
  );
6922
7036
  }
6923
7037
  return items2;
6924
- }, [effectiveTab, tokensToRender, t2, willChangeSrcTokens]);
7038
+ }, [effectiveTab, tokensToRender, t2, willChangeDstTokens, willChangeSrcTokens, willChangeBothTokens]);
6925
7039
  useLayoutEffect(() => {
6926
7040
  const updateHeight = () => {
6927
7041
  const container2 = document.getElementById("token-select-list");
@@ -6959,7 +7073,7 @@ const TokenSelectModal = ({
6959
7073
  }
6960
7074
  );
6961
7075
  }
6962
- const { token, willChangeSrc } = item.data;
7076
+ const { token, willChangeSrc, willChangeDst, willChangeBoth } = item.data;
6963
7077
  const bal = getBalance(token.symbol);
6964
7078
  const usd = getTokenUsdValue(token.symbol, token.price?.usd);
6965
7079
  const isSelected = selectedAssetSymbol?.toUpperCase() === token.symbol.toUpperCase();
@@ -6973,8 +7087,8 @@ const TokenSelectModal = ({
6973
7087
  balance: bal,
6974
7088
  usdValue: usd,
6975
7089
  isBalanceLoading: balancesQuery.isLoading || balancesQuery.isFetching,
6976
- willChangeSrc,
6977
- onPick: () => onPick(token.symbol, willChangeSrc)
7090
+ willChangeSrc: willChangeSrc || willChangeDst || willChangeBoth,
7091
+ onPick: () => onPick(token.symbol, willChangeSrc, willChangeDst, willChangeBoth)
6978
7092
  }
6979
7093
  ) });
6980
7094
  },
@@ -25877,7 +25991,7 @@ class WalletConnectModal {
25877
25991
  }
25878
25992
  async initUi() {
25879
25993
  if (typeof window !== "undefined") {
25880
- await import("./index-CJeHQDmm.js");
25994
+ await import("./index-C4Q8SlY6.js");
25881
25995
  const modal = document.createElement("wcm-modal");
25882
25996
  document.body.insertAdjacentElement("beforeend", modal);
25883
25997
  OptionsCtrl.setIsUiLoaded(true);
@@ -26629,4 +26743,4 @@ export {
26629
26743
  getQuoteFees as y,
26630
26744
  calculateMinReceived as z
26631
26745
  };
26632
- //# sourceMappingURL=index-7Rh1biLW.js.map
26746
+ //# sourceMappingURL=index-FgCGs20h.js.map