@rash2x/bridge-widget 0.8.3 → 0.8.5

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.
@@ -1211,6 +1211,25 @@ const SearchInput = ({
1211
1211
  ) })
1212
1212
  ] });
1213
1213
  };
1214
+ const TOKEN_EQUIVALENTS = {
1215
+ USDT: ["USDT0"],
1216
+ USDT0: ["USDT"]
1217
+ };
1218
+ function getEquivalentSymbols(symbol) {
1219
+ return TOKEN_EQUIVALENTS[symbol.toUpperCase()] ?? [];
1220
+ }
1221
+ const BRIDGE_PREFERRED_TOKENS = /* @__PURE__ */ new Set(["USDT0"]);
1222
+ function getBridgeTokenSymbol(symbol, assetMatrix, chainKey) {
1223
+ if (!assetMatrix || !chainKey) return symbol.toUpperCase();
1224
+ const candidates = [symbol.toUpperCase(), ...getEquivalentSymbols(symbol)];
1225
+ for (const sym of candidates) {
1226
+ if (BRIDGE_PREFERRED_TOKENS.has(sym) && assetMatrix[sym]?.[chainKey]) return sym;
1227
+ }
1228
+ for (const sym of candidates) {
1229
+ if (assetMatrix[sym]?.[chainKey]) return sym;
1230
+ }
1231
+ return symbol.toUpperCase();
1232
+ }
1214
1233
  const ChainSelectModal = ({
1215
1234
  isOpen,
1216
1235
  onClose,
@@ -1238,10 +1257,14 @@ const ChainSelectModal = ({
1238
1257
  "optimism",
1239
1258
  "base"
1240
1259
  ];
1241
- const assetByChain = assetMatrix[selectedAssetSymbol.toUpperCase()];
1242
- if (!assetByChain) return void 0;
1260
+ const allSymbols = [
1261
+ selectedAssetSymbol.toUpperCase(),
1262
+ ...getEquivalentSymbols(selectedAssetSymbol).map((s2) => s2.toUpperCase())
1263
+ ];
1264
+ const hasTokenOrEquiv = (chainKey) => allSymbols.some((sym) => !!assetMatrix[sym]?.[chainKey]);
1265
+ if (!hasTokenOrEquiv(dstChain.chainKey)) return void 0;
1243
1266
  const availableChains = chains.filter(
1244
- (c2) => assetByChain[c2.chainKey] && assetByChain[dstChain.chainKey] && c2.chainKey !== fromChain?.chainKey && c2.chainKey !== dstChain.chainKey
1267
+ (c2) => hasTokenOrEquiv(c2.chainKey) && c2.chainKey !== fromChain?.chainKey && c2.chainKey !== dstChain.chainKey
1245
1268
  );
1246
1269
  for (const chainKey of PRIORITY_CHAINS2) {
1247
1270
  const chain2 = availableChains.find((c2) => c2.chainKey === chainKey);
@@ -1325,9 +1348,20 @@ const ChainSelectModal = ({
1325
1348
  []
1326
1349
  );
1327
1350
  const [isPickLoading, setIsPickLoading] = React.useState(false);
1351
+ const switchToEquivalentIfNeeded = React.useCallback(
1352
+ (chainKey) => {
1353
+ if (!selectedAssetSymbol || !assetMatrix) return;
1354
+ const effectiveSym = getBridgeTokenSymbol(selectedAssetSymbol, assetMatrix, chainKey);
1355
+ if (effectiveSym !== selectedAssetSymbol.toUpperCase()) {
1356
+ setSelectedAssetSymbol(effectiveSym);
1357
+ }
1358
+ },
1359
+ [selectedAssetSymbol, assetMatrix, setSelectedAssetSymbol]
1360
+ );
1328
1361
  const onChainPick = React.useCallback(
1329
1362
  async (chain2, willChangeSrc = false, willChangeTokenAndSrc = false) => {
1330
1363
  if (!willChangeSrc && !willChangeTokenAndSrc) {
1364
+ switchToEquivalentIfNeeded(chain2.chainKey);
1331
1365
  onChangeChain(chain2);
1332
1366
  handleClose();
1333
1367
  return;
@@ -1359,7 +1393,18 @@ const ChainSelectModal = ({
1359
1393
  onChangeChain(chain2);
1360
1394
  }
1361
1395
  } else if (willChangeSrc && selectedAssetSymbol) {
1362
- const dstToken = assetMatrix?.[selectedAssetSymbol.toUpperCase()]?.[chain2.chainKey];
1396
+ let dstToken = assetMatrix?.[selectedAssetSymbol.toUpperCase()]?.[chain2.chainKey];
1397
+ let resolvedSym = selectedAssetSymbol;
1398
+ if (!dstToken?.address) {
1399
+ for (const eq of getEquivalentSymbols(selectedAssetSymbol)) {
1400
+ const eqToken = assetMatrix?.[eq]?.[chain2.chainKey];
1401
+ if (eqToken?.address) {
1402
+ dstToken = eqToken;
1403
+ resolvedSym = eq;
1404
+ break;
1405
+ }
1406
+ }
1407
+ }
1363
1408
  if (!dstToken?.address) return;
1364
1409
  const availableSources = await getDestTokens(chain2.chainKey, dstToken.address);
1365
1410
  const sourceChainKeys = new Set(availableSources.map((t22) => t22.chainKey ?? ""));
@@ -1376,6 +1421,9 @@ const ChainSelectModal = ({
1376
1421
  );
1377
1422
  }
1378
1423
  if (validSrc) {
1424
+ if (resolvedSym.toUpperCase() !== selectedAssetSymbol.toUpperCase()) {
1425
+ setSelectedAssetSymbol(resolvedSym);
1426
+ }
1379
1427
  setFromChain(validSrc);
1380
1428
  onChangeChain(chain2);
1381
1429
  }
@@ -1393,6 +1441,7 @@ const ChainSelectModal = ({
1393
1441
  selectedAssetSymbol,
1394
1442
  assetMatrix,
1395
1443
  findCompatibleTokenAndSrcChain,
1444
+ switchToEquivalentIfNeeded,
1396
1445
  setSelectedAssetSymbol,
1397
1446
  setFromChain,
1398
1447
  onChangeChain,
@@ -2462,6 +2511,7 @@ function computeFeeBreakdownUsd(quote, srcToken, dstToken, tokens, chains, srcCh
2462
2511
  let messageFeeUsd = 0;
2463
2512
  let messageFeeAmount = 0;
2464
2513
  let messageFeeSymbol = "";
2514
+ let messageFeeTokenPriceUsd = 0;
2465
2515
  const messageFees = quote.fees.filter((f4) => f4.type === "message");
2466
2516
  for (const f4 of messageFees) {
2467
2517
  const { decimals, priceUsd } = lookupTokenMeta(
@@ -2479,6 +2529,7 @@ function computeFeeBreakdownUsd(quote, srcToken, dstToken, tokens, chains, srcCh
2479
2529
  (t2) => t2.chainKey === f4.chainKey && t2.address.toLowerCase() === f4.token.toLowerCase()
2480
2530
  );
2481
2531
  messageFeeSymbol = token?.symbol?.toUpperCase() ?? chain2?.nativeCurrency?.symbol?.toUpperCase() ?? "";
2532
+ messageFeeTokenPriceUsd = priceUsd ?? 0;
2482
2533
  }
2483
2534
  }
2484
2535
  let bridgeFeeAmount = 0;
@@ -2509,7 +2560,14 @@ function computeFeeBreakdownUsd(quote, srcToken, dstToken, tokens, chains, srcCh
2509
2560
  dstGasUsd = dstGasAmount * (priceUsd ?? 0);
2510
2561
  }
2511
2562
  }
2512
- const totalFeeUsd = messageFeeUsd + bridgeFeeUsd + dstGasUsd;
2563
+ if (dstGasAmount > 0 && messageFeeSymbol) {
2564
+ if (messageFeeSymbol === dstGasSymbol) {
2565
+ messageFeeAmount += dstGasAmount;
2566
+ } else if (messageFeeTokenPriceUsd > 0) {
2567
+ messageFeeAmount += dstGasUsd / messageFeeTokenPriceUsd;
2568
+ }
2569
+ }
2570
+ const totalFeeUsd = messageFeeUsd + bridgeFeeUsd;
2513
2571
  return {
2514
2572
  messageFeeAmount,
2515
2573
  messageFeeSymbol,
@@ -2605,22 +2663,16 @@ function useBridgeQuote() {
2605
2663
  const { chainRegistry } = useChainStrategies();
2606
2664
  const publicClient = wagmi.usePublicClient();
2607
2665
  const input2 = inputAmount;
2608
- const srcTokenOnFrom = React.useMemo(
2609
- () => resolveTokenOnChainFromMatrix$1(
2610
- assetMatrix,
2611
- selectedAssetSymbol,
2612
- fromChain?.chainKey
2613
- ),
2614
- [assetMatrix, selectedAssetSymbol, fromChain?.chainKey]
2615
- );
2616
- const dstTokenOnTo = React.useMemo(
2617
- () => resolveTokenOnChainFromMatrix$1(
2618
- assetMatrix,
2619
- selectedAssetSymbol,
2620
- toChain?.chainKey
2621
- ),
2622
- [assetMatrix, selectedAssetSymbol, toChain?.chainKey]
2623
- );
2666
+ const srcTokenOnFrom = React.useMemo(() => {
2667
+ if (!assetMatrix || !selectedAssetSymbol || !fromChain?.chainKey) return void 0;
2668
+ const sym = getBridgeTokenSymbol(selectedAssetSymbol, assetMatrix, fromChain.chainKey);
2669
+ return resolveTokenOnChainFromMatrix$1(assetMatrix, sym, fromChain.chainKey);
2670
+ }, [assetMatrix, selectedAssetSymbol, fromChain?.chainKey]);
2671
+ const dstTokenOnTo = React.useMemo(() => {
2672
+ if (!assetMatrix || !selectedAssetSymbol || !toChain?.chainKey) return void 0;
2673
+ const sym = getBridgeTokenSymbol(selectedAssetSymbol, assetMatrix, toChain.chainKey);
2674
+ return resolveTokenOnChainFromMatrix$1(assetMatrix, sym, toChain.chainKey);
2675
+ }, [assetMatrix, selectedAssetSymbol, toChain?.chainKey]);
2624
2676
  const [loading, setLoading] = React.useState(false);
2625
2677
  React.useEffect(() => {
2626
2678
  if (!input2 || input2 === "") {
@@ -2652,14 +2704,9 @@ function useBridgeQuote() {
2652
2704
  try {
2653
2705
  setLoading(true);
2654
2706
  setQuoteLoading?.();
2655
- if (assetMatrix && selectedAssetSymbol) {
2656
- const tokenMatrix = assetMatrix[selectedAssetSymbol.toUpperCase()];
2657
- if (!tokenMatrix || !tokenMatrix[fromChain.chainKey] || !tokenMatrix[toChain.chainKey]) {
2658
- if (!cancelled) {
2659
- resetUi();
2660
- }
2661
- return;
2662
- }
2707
+ if (!srcTokenOnFrom || !dstTokenOnTo) {
2708
+ if (!cancelled) resetUi();
2709
+ return;
2663
2710
  }
2664
2711
  const srcAmountLD = toLD(input2, srcTokenOnFrom.decimals);
2665
2712
  const srcAddrApi = addrForApi(fromChain.chainKey, srcAddress);
@@ -2765,6 +2812,11 @@ const useChainDerivations = () => {
2765
2812
  return [];
2766
2813
  const byChain = assetMatrix[selectedAssetSymbol.toUpperCase()];
2767
2814
  const keys2 = new Set(Object.keys(byChain ?? {}));
2815
+ for (const eq of getEquivalentSymbols(selectedAssetSymbol)) {
2816
+ for (const ck of Object.keys(assetMatrix[eq] ?? {})) {
2817
+ keys2.add(ck);
2818
+ }
2819
+ }
2768
2820
  const result = chains.filter((c2) => keys2.has(c2.chainKey) && isAllowedFromChain(c2.chainKey));
2769
2821
  return result;
2770
2822
  }, [selectedAssetSymbol, assetMatrix, chains]);
@@ -2806,11 +2858,8 @@ const useChainDerivations = () => {
2806
2858
  setAllowedToChains([]);
2807
2859
  return;
2808
2860
  }
2809
- const srcToken = resolveTokenOnChainFromMatrix(
2810
- assetMatrix,
2811
- selectedAssetSymbol,
2812
- fromChain.chainKey
2813
- );
2861
+ const srcSym = getBridgeTokenSymbol(selectedAssetSymbol, assetMatrix, fromChain.chainKey);
2862
+ const srcToken = resolveTokenOnChainFromMatrix(assetMatrix, srcSym, fromChain.chainKey);
2814
2863
  const srcAddr = srcToken?.address;
2815
2864
  if (!srcAddr) {
2816
2865
  setAllowedToChains([]);
@@ -2822,11 +2871,18 @@ const useChainDerivations = () => {
2822
2871
  const dest = await getDestTokens(fromChain.chainKey, srcAddr);
2823
2872
  if (ignore) return;
2824
2873
  const byChainSameSymbol = assetMatrix?.[selectedAssetSymbol.toUpperCase()] ?? {};
2874
+ const equivalentSymbols = /* @__PURE__ */ new Set([
2875
+ selectedAssetSymbol.toUpperCase(),
2876
+ ...getEquivalentSymbols(selectedAssetSymbol).map((s2) => s2.toUpperCase())
2877
+ ]);
2825
2878
  const filteredDest = dest.filter((t2) => {
2826
2879
  const ck = t2.chainKey ?? t2.dstChainKey ?? "";
2827
- const matrixToken = byChainSameSymbol[ck];
2828
- const symbolMatch = matrixToken && (t2.symbol ?? "").toUpperCase() === selectedAssetSymbol.toUpperCase();
2829
- return !!symbolMatch;
2880
+ const destSymbol = (t2.symbol ?? "").toUpperCase();
2881
+ if (!equivalentSymbols.has(destSymbol)) return false;
2882
+ const hasInMatrix = !!byChainSameSymbol[ck] || getEquivalentSymbols(selectedAssetSymbol).some(
2883
+ (eq) => !!assetMatrix?.[eq.toUpperCase()]?.[ck]
2884
+ );
2885
+ return hasInMatrix;
2830
2886
  });
2831
2887
  const keys2 = new Set(filteredDest.map((t2) => t2.chainKey));
2832
2888
  let list = chains.filter((c2) => keys2.has(c2.chainKey) && isAllowedToChain(c2.chainKey));
@@ -3601,7 +3657,18 @@ function useBalances(chainKey, address) {
3601
3657
  );
3602
3658
  if (typeof byAddress === "number") return byAddress;
3603
3659
  }
3604
- return balanceBySymbol.get(symbolUpper) ?? 0;
3660
+ const directBalance = balanceBySymbol.get(symbolUpper) ?? 0;
3661
+ if (directBalance > 0) return directBalance;
3662
+ for (const eq of getEquivalentSymbols(symbolUpper)) {
3663
+ const eqToken = chainKey ? assetMatrix?.[eq]?.[chainKey] : void 0;
3664
+ if (eqToken?.address) {
3665
+ const b2 = balanceByTokenKey.get(makeTokenBalanceKey(eqToken.address));
3666
+ if (typeof b2 === "number" && b2 > 0) return b2;
3667
+ }
3668
+ const eqBalance = balanceBySymbol.get(eq) ?? 0;
3669
+ if (eqBalance > 0) return eqBalance;
3670
+ }
3671
+ return directBalance;
3605
3672
  },
3606
3673
  [assetMatrix, balanceBySymbol, balanceByTokenKey, chainKey]
3607
3674
  );
@@ -3667,8 +3734,9 @@ function useSwapModel() {
3667
3734
  if (!isAllowedFromChain(toChain.chainKey)) return;
3668
3735
  chainsStore.setAllowedToChains([]);
3669
3736
  chainsStore.setFromChain(toChain);
3670
- const tokenOnNewFrom = tokensStore.assetMatrix?.[sym]?.[toChain.chainKey];
3671
- if (tokenOnNewFrom) {
3737
+ const matrix = tokensStore.assetMatrix;
3738
+ const hasTokenOnNewFrom = !!matrix?.[sym]?.[toChain.chainKey] || getEquivalentSymbols(sym).some((eq) => !!matrix?.[eq]?.[toChain.chainKey]);
3739
+ if (hasTokenOnNewFrom) {
3672
3740
  chainsStore.setToChain(fromChain);
3673
3741
  } else {
3674
3742
  chainsStore.setToChain(void 0);
@@ -26553,7 +26621,7 @@ class WalletConnectModal {
26553
26621
  }
26554
26622
  async initUi() {
26555
26623
  if (typeof window !== "undefined") {
26556
- await Promise.resolve().then(() => require("./index-s4FyGXJW.cjs"));
26624
+ await Promise.resolve().then(() => require("./index-DiFbb5zn.cjs"));
26557
26625
  const modal = document.createElement("wcm-modal");
26558
26626
  document.body.insertAdjacentElement("beforeend", modal);
26559
26627
  OptionsCtrl.setIsUiLoaded(true);
@@ -27456,4 +27524,4 @@ exports.useSettingsStore = useSettingsStore;
27456
27524
  exports.useSwapModel = useSwapModel;
27457
27525
  exports.useTokensStore = useTokensStore;
27458
27526
  exports.useTransactionStore = useTransactionStore;
27459
- //# sourceMappingURL=index-egFmHlPu.cjs.map
27527
+ //# sourceMappingURL=index-CytmPXNr.cjs.map