@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.
- package/dist/evaa-bridge.cjs +1 -1
- package/dist/evaa-bridge.mjs +1 -1
- package/dist/{index-4Tkk8Kek.cjs → index-BSBhFRpe.cjs} +2 -2
- package/dist/{index-4Tkk8Kek.cjs.map → index-BSBhFRpe.cjs.map} +1 -1
- package/dist/{index-CJeHQDmm.js → index-C4Q8SlY6.js} +2 -2
- package/dist/{index-CJeHQDmm.js.map → index-C4Q8SlY6.js.map} +1 -1
- package/dist/{index-7Rh1biLW.js → index-FgCGs20h.js} +167 -53
- package/dist/index-FgCGs20h.js.map +1 -0
- package/dist/{index-Bym1eouV.cjs → index-qUQoBkSH.cjs} +167 -53
- package/dist/index-qUQoBkSH.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
- package/dist/index-7Rh1biLW.js.map +0 -1
- package/dist/index-Bym1eouV.cjs.map +0 -1
|
@@ -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
|
|
1420
|
-
const
|
|
1421
|
-
return !!
|
|
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 (!
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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-
|
|
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-
|
|
26746
|
+
//# sourceMappingURL=index-FgCGs20h.js.map
|