@rash2x/bridge-widget 0.7.6 → 0.7.8
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-DzUouoJg.cjs → index-Btnz7slS.cjs} +2 -2
- package/dist/{index-DzUouoJg.cjs.map → index-Btnz7slS.cjs.map} +1 -1
- package/dist/{index-CF3yEUFF.js → index-CEcrJo_G.js} +58 -34
- package/dist/index-CEcrJo_G.js.map +1 -0
- package/dist/{index-CDaFAnWU.js → index-DIK7UXln.js} +2 -2
- package/dist/{index-CDaFAnWU.js.map → index-DIK7UXln.js.map} +1 -1
- package/dist/{index-CbuEGPY8.cjs → index-bZ0S5sNd.cjs} +231 -191
- package/dist/index-bZ0S5sNd.cjs.map +1 -0
- package/dist/index.d.ts +29 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/index-CF3yEUFF.js.map +0 -1
- package/dist/index-CbuEGPY8.cjs.map +0 -1
|
@@ -3,7 +3,7 @@ var __defProp = Object.defineProperty;
|
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
5
|
const jsxRuntime = require("react/jsx-runtime");
|
|
6
|
-
const
|
|
6
|
+
const React = require("react");
|
|
7
7
|
const reactI18next = require("react-i18next");
|
|
8
8
|
const i18n = require("i18next");
|
|
9
9
|
const button = require("@/components/ui/button");
|
|
@@ -32,6 +32,23 @@ const tronwalletAdapters = require("@tronweb3/tronwallet-adapters");
|
|
|
32
32
|
const tronweb = require("tronweb");
|
|
33
33
|
const card = require("@/components/ui/card");
|
|
34
34
|
const reactWindow = require("react-window");
|
|
35
|
+
function _interopNamespaceDefault(e2) {
|
|
36
|
+
const n3 = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
37
|
+
if (e2) {
|
|
38
|
+
for (const k2 in e2) {
|
|
39
|
+
if (k2 !== "default") {
|
|
40
|
+
const d3 = Object.getOwnPropertyDescriptor(e2, k2);
|
|
41
|
+
Object.defineProperty(n3, k2, d3.get ? d3 : {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
get: () => e2[k2]
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
n3.default = e2;
|
|
49
|
+
return Object.freeze(n3);
|
|
50
|
+
}
|
|
51
|
+
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
35
52
|
const common$1 = { "connecting": "Connecting…", "initializing": "Initializing...", "loading": "Loading...", "paste": "paste", "close": "Close", "zeroPlaceholder": "0", "nativeToken": "Native Token" };
|
|
36
53
|
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" };
|
|
37
54
|
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" };
|
|
@@ -95,7 +112,7 @@ function BridgeI18nProvider({
|
|
|
95
112
|
children,
|
|
96
113
|
defaultLanguage = "en"
|
|
97
114
|
}) {
|
|
98
|
-
|
|
115
|
+
React.useEffect(() => {
|
|
99
116
|
if (bridgeI18n.language !== defaultLanguage) {
|
|
100
117
|
bridgeI18n.changeLanguage(defaultLanguage);
|
|
101
118
|
}
|
|
@@ -507,9 +524,9 @@ const ExitIcon = (props) => {
|
|
|
507
524
|
);
|
|
508
525
|
};
|
|
509
526
|
const SwapButton = ({ canSwap, onSwap }) => {
|
|
510
|
-
const [turns, setTurns] =
|
|
511
|
-
const [isSwapping, setIsSwapping] =
|
|
512
|
-
const handleSwap =
|
|
527
|
+
const [turns, setTurns] = React.useState(0);
|
|
528
|
+
const [isSwapping, setIsSwapping] = React.useState(false);
|
|
529
|
+
const handleSwap = React.useCallback(() => {
|
|
513
530
|
if (!canSwap || isSwapping) return;
|
|
514
531
|
setIsSwapping(true);
|
|
515
532
|
setTurns((t2) => t2 + 1);
|
|
@@ -585,7 +602,7 @@ const SelectNetworkButton = ({
|
|
|
585
602
|
network
|
|
586
603
|
}) => {
|
|
587
604
|
const { t: t2 } = useBridgeTranslation();
|
|
588
|
-
const label =
|
|
605
|
+
const label = React.useMemo(() => {
|
|
589
606
|
return network?.name ?? t2("bridge.selectNetwork");
|
|
590
607
|
}, [network, t2]);
|
|
591
608
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -626,7 +643,7 @@ const normalizeValue = (value, max) => {
|
|
|
626
643
|
}
|
|
627
644
|
return void 0;
|
|
628
645
|
};
|
|
629
|
-
const TokenInput =
|
|
646
|
+
const TokenInput = React.forwardRef(
|
|
630
647
|
({
|
|
631
648
|
value,
|
|
632
649
|
onAmountChange,
|
|
@@ -638,11 +655,11 @@ const TokenInput = react.forwardRef(
|
|
|
638
655
|
error,
|
|
639
656
|
...rest
|
|
640
657
|
}, ref) => {
|
|
641
|
-
const [inputVal, setInputVal] =
|
|
642
|
-
|
|
658
|
+
const [inputVal, setInputVal] = React.useState(value ?? "");
|
|
659
|
+
React.useEffect(() => {
|
|
643
660
|
setInputVal(value ?? "");
|
|
644
661
|
}, [value]);
|
|
645
|
-
const handleChange =
|
|
662
|
+
const handleChange = React.useCallback(
|
|
646
663
|
(event) => {
|
|
647
664
|
const raw = event.target.value;
|
|
648
665
|
const normalized = normalizeValue(raw, max);
|
|
@@ -689,10 +706,10 @@ const TokenInput = react.forwardRef(
|
|
|
689
706
|
);
|
|
690
707
|
TokenInput.displayName = "TokenInput";
|
|
691
708
|
function useModal(initial = false) {
|
|
692
|
-
const [isOpen, setOpen] =
|
|
693
|
-
const onOpen =
|
|
694
|
-
const onClose =
|
|
695
|
-
const toggle =
|
|
709
|
+
const [isOpen, setOpen] = React.useState(initial);
|
|
710
|
+
const onOpen = React.useCallback(() => setOpen(true), []);
|
|
711
|
+
const onClose = React.useCallback(() => setOpen(false), []);
|
|
712
|
+
const toggle = React.useCallback(() => setOpen((v2) => !v2), []);
|
|
696
713
|
return { isOpen, onOpen, onClose, toggle };
|
|
697
714
|
}
|
|
698
715
|
function createJSONStorage(getStorage, options) {
|
|
@@ -1203,14 +1220,14 @@ const ChainSelectModal = ({
|
|
|
1203
1220
|
isSource
|
|
1204
1221
|
}) => {
|
|
1205
1222
|
const { t: t2 } = useBridgeTranslation();
|
|
1206
|
-
const [query, setQuery] =
|
|
1223
|
+
const [query, setQuery] = React.useState("");
|
|
1207
1224
|
const { setFromChain, chains, fromChain, toChain } = useChainsStore();
|
|
1208
1225
|
const { assetMatrix, selectedAssetSymbol, setSelectedAssetSymbol } = useTokensStore();
|
|
1209
|
-
const handleClose =
|
|
1226
|
+
const handleClose = React.useCallback(() => {
|
|
1210
1227
|
setQuery("");
|
|
1211
1228
|
onClose();
|
|
1212
1229
|
}, [onClose]);
|
|
1213
|
-
const findCompatibleSrcChain =
|
|
1230
|
+
const findCompatibleSrcChain = React.useCallback(
|
|
1214
1231
|
(dstChain) => {
|
|
1215
1232
|
if (!chains || !selectedAssetSymbol || !assetMatrix) return void 0;
|
|
1216
1233
|
const PRIORITY_CHAINS2 = [
|
|
@@ -1234,7 +1251,7 @@ const ChainSelectModal = ({
|
|
|
1234
1251
|
},
|
|
1235
1252
|
[chains, selectedAssetSymbol, assetMatrix, fromChain?.chainKey]
|
|
1236
1253
|
);
|
|
1237
|
-
const findCompatibleTokenAndSrcChain =
|
|
1254
|
+
const findCompatibleTokenAndSrcChain = React.useCallback(
|
|
1238
1255
|
(dstChain) => {
|
|
1239
1256
|
if (!chains || !assetMatrix) return void 0;
|
|
1240
1257
|
const PRIORITY_CHAINS2 = [
|
|
@@ -1264,7 +1281,7 @@ const ChainSelectModal = ({
|
|
|
1264
1281
|
},
|
|
1265
1282
|
[chains, assetMatrix, fromChain?.chainKey]
|
|
1266
1283
|
);
|
|
1267
|
-
const groupedChains =
|
|
1284
|
+
const groupedChains = React.useMemo(() => {
|
|
1268
1285
|
const q3 = query.trim().toLowerCase();
|
|
1269
1286
|
const isAllowed = isSource ? isAllowedFromChain : isAllowedToChain;
|
|
1270
1287
|
const filtered = (items ?? []).filter((c2) => isAllowed(c2.chainKey)).filter(
|
|
@@ -1303,12 +1320,12 @@ const ChainSelectModal = ({
|
|
|
1303
1320
|
findCompatibleTokenAndSrcChain,
|
|
1304
1321
|
isSource
|
|
1305
1322
|
]);
|
|
1306
|
-
const PRIORITY_CHAINS =
|
|
1323
|
+
const PRIORITY_CHAINS = React.useMemo(
|
|
1307
1324
|
() => ["ethereum", "arbitrum", "bsc", "polygon", "optimism", "base"],
|
|
1308
1325
|
[]
|
|
1309
1326
|
);
|
|
1310
|
-
const [isPickLoading, setIsPickLoading] =
|
|
1311
|
-
const onChainPick =
|
|
1327
|
+
const [isPickLoading, setIsPickLoading] = React.useState(false);
|
|
1328
|
+
const onChainPick = React.useCallback(
|
|
1312
1329
|
async (chain2, willChangeSrc = false, willChangeTokenAndSrc = false) => {
|
|
1313
1330
|
if (!willChangeSrc && !willChangeTokenAndSrc) {
|
|
1314
1331
|
onChangeChain(chain2);
|
|
@@ -1456,9 +1473,9 @@ const ChainSelectModal = ({
|
|
|
1456
1473
|
] })
|
|
1457
1474
|
] }) });
|
|
1458
1475
|
};
|
|
1459
|
-
const ChainStrategyContext =
|
|
1476
|
+
const ChainStrategyContext = React.createContext(void 0);
|
|
1460
1477
|
function useChainStrategies() {
|
|
1461
|
-
const context =
|
|
1478
|
+
const context = React.useContext(ChainStrategyContext);
|
|
1462
1479
|
if (!context) {
|
|
1463
1480
|
throw new Error(
|
|
1464
1481
|
"useChainStrategies must be used within ChainStrategyProvider"
|
|
@@ -1606,12 +1623,12 @@ const WalletInlineButton = ({
|
|
|
1606
1623
|
const account = connection?.getAccount();
|
|
1607
1624
|
const isConnected = connection?.isConnected();
|
|
1608
1625
|
const error = connection?.getError();
|
|
1609
|
-
const availableConnections =
|
|
1626
|
+
const availableConnections = React.useMemo(
|
|
1610
1627
|
() => connection?.getAvailableConnections() ?? [],
|
|
1611
1628
|
[connection]
|
|
1612
1629
|
);
|
|
1613
1630
|
const evmConnectorId = connectedEvmConnector?.id;
|
|
1614
|
-
const activeTronConnection =
|
|
1631
|
+
const activeTronConnection = React.useMemo(() => {
|
|
1615
1632
|
if (walletType !== "tron") return null;
|
|
1616
1633
|
const tronWalletConnect = availableConnections.find(
|
|
1617
1634
|
(conn) => conn.provider === "walletconnect" && conn.connected && !!conn.address
|
|
@@ -1623,16 +1640,16 @@ const WalletInlineButton = ({
|
|
|
1623
1640
|
if (tronLink) return tronLink;
|
|
1624
1641
|
return null;
|
|
1625
1642
|
}, [availableConnections, walletType]);
|
|
1626
|
-
const handleClick =
|
|
1643
|
+
const handleClick = React.useCallback(() => {
|
|
1627
1644
|
onOpen(addressType);
|
|
1628
1645
|
}, [onOpen, addressType]);
|
|
1629
|
-
const buttonText =
|
|
1646
|
+
const buttonText = React.useMemo(() => {
|
|
1630
1647
|
if (isConnected && account) return formatAddress(account);
|
|
1631
1648
|
if (wallet === "ton") return t2("wallets.addTonWallet");
|
|
1632
1649
|
if (wallet === "tronlink") return t2("wallets.addTronWallet");
|
|
1633
1650
|
return t2("wallets.addEvmWallet");
|
|
1634
1651
|
}, [wallet, isConnected, account, t2]);
|
|
1635
|
-
const connectedIcon =
|
|
1652
|
+
const connectedIcon = React.useMemo(() => {
|
|
1636
1653
|
if (!isConnected) return null;
|
|
1637
1654
|
if (walletType === "tron" && activeTronConnection) {
|
|
1638
1655
|
return activeTronConnection.provider === "walletconnect" ? prefixIcons.walletconnect : prefixIcons.tronlink;
|
|
@@ -1737,8 +1754,8 @@ const SwapSection = ({
|
|
|
1737
1754
|
const { assetMatrix, selectedAssetSymbol } = useTokensStore();
|
|
1738
1755
|
const { status } = useBridgeQuoteStore();
|
|
1739
1756
|
const { t: t2 } = useBridgeTranslation();
|
|
1740
|
-
const [isFocused, setIsFocused] =
|
|
1741
|
-
const tokenOnThisChain =
|
|
1757
|
+
const [isFocused, setIsFocused] = React.useState(false);
|
|
1758
|
+
const tokenOnThisChain = React.useMemo(
|
|
1742
1759
|
() => resolveTokenOnChainFromMatrix$2(
|
|
1743
1760
|
assetMatrix,
|
|
1744
1761
|
selectedAssetSymbol,
|
|
@@ -1747,25 +1764,25 @@ const SwapSection = ({
|
|
|
1747
1764
|
[assetMatrix, selectedAssetSymbol, chain2?.chainKey]
|
|
1748
1765
|
);
|
|
1749
1766
|
const priceUsd = tokenOnThisChain?.price?.usd ?? pickAnyPriceUsd(assetMatrix, selectedAssetSymbol);
|
|
1750
|
-
const computedFiat =
|
|
1767
|
+
const computedFiat = React.useMemo(() => {
|
|
1751
1768
|
const amt = parseFloat(amount || "");
|
|
1752
1769
|
if (Number.isNaN(amt) || !priceUsd) return "$0";
|
|
1753
1770
|
return formatUsd(amt * priceUsd);
|
|
1754
1771
|
}, [amount, priceUsd]);
|
|
1755
1772
|
const isUsdLoading = Boolean(amount && parseFloat(amount) > 0 && !priceUsd);
|
|
1756
|
-
const onChangeChain =
|
|
1773
|
+
const onChangeChain = React.useCallback(
|
|
1757
1774
|
(c2) => {
|
|
1758
1775
|
onSelect?.(c2);
|
|
1759
1776
|
onClose();
|
|
1760
1777
|
},
|
|
1761
1778
|
[onSelect, onClose]
|
|
1762
1779
|
);
|
|
1763
|
-
const handleMaxClick =
|
|
1780
|
+
const handleMaxClick = React.useCallback(() => {
|
|
1764
1781
|
if (balance.balance && onAmountChange) {
|
|
1765
1782
|
onAmountChange(balance.balance.toString());
|
|
1766
1783
|
}
|
|
1767
1784
|
}, [balance.balance, onAmountChange]);
|
|
1768
|
-
const isInsufficientBalance =
|
|
1785
|
+
const isInsufficientBalance = React.useMemo(() => {
|
|
1769
1786
|
return !!(isSource && amount && balance.balance && parseFloat(amount) > balance.balance);
|
|
1770
1787
|
}, [amount, balance.balance, isSource]);
|
|
1771
1788
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
@@ -1802,7 +1819,7 @@ const SwapSection = ({
|
|
|
1802
1819
|
TokenInput,
|
|
1803
1820
|
{
|
|
1804
1821
|
value: amount,
|
|
1805
|
-
onAmountChange:
|
|
1822
|
+
onAmountChange: React.useCallback(
|
|
1806
1823
|
(v2) => onAmountChange?.(v2),
|
|
1807
1824
|
[onAmountChange]
|
|
1808
1825
|
),
|
|
@@ -1878,13 +1895,13 @@ function isAddressValidForChain(chainKey, addr, chainType) {
|
|
|
1878
1895
|
return addr.trim().length > 0;
|
|
1879
1896
|
}
|
|
1880
1897
|
const useIsAddressValid = (address, chainKey, chainType) => {
|
|
1881
|
-
const isValid =
|
|
1898
|
+
const isValid = React.useMemo(() => {
|
|
1882
1899
|
return isAddressValidForChain(chainKey, address, chainType);
|
|
1883
1900
|
}, [address, chainKey, chainType]);
|
|
1884
1901
|
return { isValid };
|
|
1885
1902
|
};
|
|
1886
1903
|
const AnotherAddress = () => {
|
|
1887
|
-
const [isFocused, setIsFocused] =
|
|
1904
|
+
const [isFocused, setIsFocused] = React.useState(false);
|
|
1888
1905
|
const { t: t2 } = useBridgeTranslation();
|
|
1889
1906
|
const { toChain } = useChainsStore();
|
|
1890
1907
|
const setCustomDstAddress = useCustomAddressStore(
|
|
@@ -1895,11 +1912,11 @@ const AnotherAddress = () => {
|
|
|
1895
1912
|
const customDstAddress = useCustomAddressStore(
|
|
1896
1913
|
(state2) => state2.customDstAddress
|
|
1897
1914
|
);
|
|
1898
|
-
const [value, setValue] =
|
|
1899
|
-
const trimmed =
|
|
1915
|
+
const [value, setValue] = React.useState("");
|
|
1916
|
+
const trimmed = React.useMemo(() => value.trim(), [value]);
|
|
1900
1917
|
const { isValid } = useIsAddressValid(trimmed, toChain?.chainKey, toChain?.chainType);
|
|
1901
1918
|
const invalid = trimmed && !isValid;
|
|
1902
|
-
|
|
1919
|
+
React.useEffect(() => {
|
|
1903
1920
|
if (!isEnabled2) {
|
|
1904
1921
|
if (customDstAddress !== void 0) {
|
|
1905
1922
|
setCustomDstAddress(void 0);
|
|
@@ -2056,7 +2073,7 @@ function useAddresses() {
|
|
|
2056
2073
|
(state2) => state2.address
|
|
2057
2074
|
);
|
|
2058
2075
|
const tronAddress = tronLinkAddress || tronWalletConnectAddress || void 0;
|
|
2059
|
-
const srcAddress =
|
|
2076
|
+
const srcAddress = React.useMemo(() => {
|
|
2060
2077
|
if (!fromChain?.chainKey) return void 0;
|
|
2061
2078
|
const chainKey = fromChain.chainKey.toLowerCase();
|
|
2062
2079
|
if (chainKey === "ton") {
|
|
@@ -2067,7 +2084,7 @@ function useAddresses() {
|
|
|
2067
2084
|
}
|
|
2068
2085
|
return evmAddress || void 0;
|
|
2069
2086
|
}, [fromChain?.chainKey, evmAddress, tonAddress, tronAddress]);
|
|
2070
|
-
const dstAddress =
|
|
2087
|
+
const dstAddress = React.useMemo(() => {
|
|
2071
2088
|
if (!toChain?.chainKey) return void 0;
|
|
2072
2089
|
if (isCustomAddressEnabled) {
|
|
2073
2090
|
return customDstAddress;
|
|
@@ -2403,7 +2420,7 @@ function calculateMinReceived(quote, slippageBps, dstToken) {
|
|
|
2403
2420
|
}
|
|
2404
2421
|
function getQuoteDetails(quote, srcToken, dstToken, tokens, chains, slippageBps, srcChain, dstChain) {
|
|
2405
2422
|
const amounts = getQuoteAmounts(quote, srcToken, dstToken);
|
|
2406
|
-
const fees = computeFeeBreakdownUsd(quote, srcToken, tokens, chains, srcChain, dstChain);
|
|
2423
|
+
const fees = computeFeeBreakdownUsd(quote, srcToken, dstToken, tokens, chains, srcChain, dstChain);
|
|
2407
2424
|
const minimumReceived = calculateMinReceived(quote, slippageBps, dstToken);
|
|
2408
2425
|
return {
|
|
2409
2426
|
inputAmount: amounts.inputHuman,
|
|
@@ -2423,7 +2440,7 @@ function getRouteDisplayName(route) {
|
|
|
2423
2440
|
if (routeLower.includes("v2")) return "Stargate V2";
|
|
2424
2441
|
return route.split(/[/\-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
2425
2442
|
}
|
|
2426
|
-
function computeFeeBreakdownUsd(quote, srcToken, tokens, chains, srcChain, dstChain) {
|
|
2443
|
+
function computeFeeBreakdownUsd(quote, srcToken, dstToken, tokens, chains, srcChain, dstChain) {
|
|
2427
2444
|
const defaultMsgSymbol = srcChain?.nativeCurrency?.symbol?.toUpperCase() ?? "";
|
|
2428
2445
|
const defaultBridgeSymbol = srcToken?.symbol?.toUpperCase() ?? "";
|
|
2429
2446
|
const defaultDstGasSymbol = dstChain?.nativeCurrency?.symbol?.toUpperCase() ?? "";
|
|
@@ -2466,7 +2483,7 @@ function computeFeeBreakdownUsd(quote, srcToken, tokens, chains, srcChain, dstCh
|
|
|
2466
2483
|
let bridgeFeeUsd = 0;
|
|
2467
2484
|
const bridgeFeeSymbol = srcToken.symbol?.toUpperCase() ?? "";
|
|
2468
2485
|
const srcHuman = fromLD(quote.srcAmount, srcToken.decimals);
|
|
2469
|
-
const dstHuman = fromLD(quote.dstAmount,
|
|
2486
|
+
const dstHuman = dstToken ? fromLD(quote.dstAmount, dstToken.decimals) : 0;
|
|
2470
2487
|
const diff = srcHuman - dstHuman;
|
|
2471
2488
|
if (diff > 0) {
|
|
2472
2489
|
bridgeFeeAmount = diff;
|
|
@@ -2586,7 +2603,7 @@ function useBridgeQuote() {
|
|
|
2586
2603
|
const { chainRegistry } = useChainStrategies();
|
|
2587
2604
|
const publicClient = wagmi.usePublicClient();
|
|
2588
2605
|
const input2 = inputAmount;
|
|
2589
|
-
const srcTokenOnFrom =
|
|
2606
|
+
const srcTokenOnFrom = React.useMemo(
|
|
2590
2607
|
() => resolveTokenOnChainFromMatrix$1(
|
|
2591
2608
|
assetMatrix,
|
|
2592
2609
|
selectedAssetSymbol,
|
|
@@ -2594,7 +2611,7 @@ function useBridgeQuote() {
|
|
|
2594
2611
|
),
|
|
2595
2612
|
[assetMatrix, selectedAssetSymbol, fromChain?.chainKey]
|
|
2596
2613
|
);
|
|
2597
|
-
const dstTokenOnTo =
|
|
2614
|
+
const dstTokenOnTo = React.useMemo(
|
|
2598
2615
|
() => resolveTokenOnChainFromMatrix$1(
|
|
2599
2616
|
assetMatrix,
|
|
2600
2617
|
selectedAssetSymbol,
|
|
@@ -2602,14 +2619,14 @@ function useBridgeQuote() {
|
|
|
2602
2619
|
),
|
|
2603
2620
|
[assetMatrix, selectedAssetSymbol, toChain?.chainKey]
|
|
2604
2621
|
);
|
|
2605
|
-
const [loading, setLoading] =
|
|
2606
|
-
|
|
2622
|
+
const [loading, setLoading] = React.useState(false);
|
|
2623
|
+
React.useEffect(() => {
|
|
2607
2624
|
if (!input2 || input2 === "") {
|
|
2608
2625
|
setLoading(false);
|
|
2609
2626
|
resetWithIdle();
|
|
2610
2627
|
}
|
|
2611
2628
|
}, [input2, resetWithIdle]);
|
|
2612
|
-
|
|
2629
|
+
React.useEffect(() => {
|
|
2613
2630
|
const resetUi = (withError) => {
|
|
2614
2631
|
setLoading(false);
|
|
2615
2632
|
{
|
|
@@ -2741,7 +2758,7 @@ const useChainDerivations = () => {
|
|
|
2741
2758
|
setIsLoadingToChains,
|
|
2742
2759
|
isUrlInitialized
|
|
2743
2760
|
} = useChainsStore();
|
|
2744
|
-
const supportedFrom =
|
|
2761
|
+
const supportedFrom = React.useMemo(() => {
|
|
2745
2762
|
if (typeof selectedAssetSymbol !== "string" || !assetMatrix || !chains?.length)
|
|
2746
2763
|
return [];
|
|
2747
2764
|
const byChain = assetMatrix[selectedAssetSymbol.toUpperCase()];
|
|
@@ -2749,7 +2766,7 @@ const useChainDerivations = () => {
|
|
|
2749
2766
|
const result = chains.filter((c2) => keys2.has(c2.chainKey) && isAllowedFromChain(c2.chainKey));
|
|
2750
2767
|
return result;
|
|
2751
2768
|
}, [selectedAssetSymbol, assetMatrix, chains]);
|
|
2752
|
-
|
|
2769
|
+
React.useEffect(() => {
|
|
2753
2770
|
setAllowedFromChains(supportedFrom);
|
|
2754
2771
|
if (!isUrlInitialized) {
|
|
2755
2772
|
return;
|
|
@@ -2780,7 +2797,7 @@ const useChainDerivations = () => {
|
|
|
2780
2797
|
setAllowedToChains,
|
|
2781
2798
|
isUrlInitialized
|
|
2782
2799
|
]);
|
|
2783
|
-
|
|
2800
|
+
React.useEffect(() => {
|
|
2784
2801
|
let ignore = false;
|
|
2785
2802
|
const run = async () => {
|
|
2786
2803
|
if (!selectedAssetSymbol || !fromChain?.chainKey || !chains?.length) {
|
|
@@ -2860,7 +2877,7 @@ function isBalanceDebugEnabled() {
|
|
|
2860
2877
|
function useBalances(chainKey, address) {
|
|
2861
2878
|
const { chainRegistry } = useChainStrategies();
|
|
2862
2879
|
const { assetMatrix } = useTokensStore();
|
|
2863
|
-
const tokensOnChain =
|
|
2880
|
+
const tokensOnChain = React.useMemo(() => {
|
|
2864
2881
|
if (!chainKey || !assetMatrix) return [];
|
|
2865
2882
|
const tokensList = [];
|
|
2866
2883
|
for (const [, byChain] of Object.entries(assetMatrix)) {
|
|
@@ -2906,7 +2923,7 @@ function useBalances(chainKey, address) {
|
|
|
2906
2923
|
refetchInterval: 6e4,
|
|
2907
2924
|
refetchIntervalInBackground: false
|
|
2908
2925
|
});
|
|
2909
|
-
const balanceBySymbol =
|
|
2926
|
+
const balanceBySymbol = React.useMemo(() => {
|
|
2910
2927
|
const map = /* @__PURE__ */ new Map();
|
|
2911
2928
|
const data = query.data;
|
|
2912
2929
|
if (data) {
|
|
@@ -2916,12 +2933,12 @@ function useBalances(chainKey, address) {
|
|
|
2916
2933
|
}
|
|
2917
2934
|
return map;
|
|
2918
2935
|
}, [query.data]);
|
|
2919
|
-
const getBalance =
|
|
2936
|
+
const getBalance = React.useCallback(
|
|
2920
2937
|
(symbol) => balanceBySymbol.get(normalizeTickerSymbol$1(symbol)) ?? 0,
|
|
2921
2938
|
[balanceBySymbol]
|
|
2922
2939
|
);
|
|
2923
2940
|
const isLoading = query.isLoading || query.isFetching;
|
|
2924
|
-
const balances =
|
|
2941
|
+
const balances = React.useMemo(() => query.data || {}, [query.data]);
|
|
2925
2942
|
return {
|
|
2926
2943
|
balances,
|
|
2927
2944
|
getBalance,
|
|
@@ -2944,21 +2961,21 @@ function useSwapModel() {
|
|
|
2944
2961
|
);
|
|
2945
2962
|
const { loading } = useBridgeQuote();
|
|
2946
2963
|
const { inputAmount, setInputAmount, resetWithIdle } = useBridgeQuoteStore();
|
|
2947
|
-
const fromBalance =
|
|
2964
|
+
const fromBalance = React.useMemo(
|
|
2948
2965
|
() => ({
|
|
2949
2966
|
balance: srcBalances.getBalance(tokensStore.selectedAssetSymbol || ""),
|
|
2950
2967
|
isLoading: srcBalances.isLoading
|
|
2951
2968
|
}),
|
|
2952
2969
|
[srcBalances, tokensStore.selectedAssetSymbol]
|
|
2953
2970
|
);
|
|
2954
|
-
const receiveBalance =
|
|
2971
|
+
const receiveBalance = React.useMemo(
|
|
2955
2972
|
() => ({
|
|
2956
2973
|
balance: dstBalances.getBalance(tokensStore.selectedAssetSymbol || ""),
|
|
2957
2974
|
isLoading: dstBalances.isLoading
|
|
2958
2975
|
}),
|
|
2959
2976
|
[dstBalances, tokensStore.selectedAssetSymbol]
|
|
2960
2977
|
);
|
|
2961
|
-
const state2 =
|
|
2978
|
+
const state2 = React.useMemo(
|
|
2962
2979
|
() => ({
|
|
2963
2980
|
fromChain: chainsStore.fromChain,
|
|
2964
2981
|
toChain: chainsStore.toChain,
|
|
@@ -2974,7 +2991,7 @@ function useSwapModel() {
|
|
|
2974
2991
|
setFromChain: chainsStore.setFromChain,
|
|
2975
2992
|
setToChain: chainsStore.setToChain,
|
|
2976
2993
|
setAmount: setInputAmount,
|
|
2977
|
-
swapSides:
|
|
2994
|
+
swapSides: React.useCallback(() => {
|
|
2978
2995
|
const fromChain = chainsStore.fromChain;
|
|
2979
2996
|
const toChain = chainsStore.toChain;
|
|
2980
2997
|
const sym = (tokensStore.selectedAssetSymbol ?? "").toUpperCase();
|
|
@@ -3025,11 +3042,54 @@ const InfoIcon = (props) => {
|
|
|
3025
3042
|
}
|
|
3026
3043
|
);
|
|
3027
3044
|
};
|
|
3045
|
+
const MOBILE_BREAKPOINT = 768;
|
|
3046
|
+
function useIsMobile() {
|
|
3047
|
+
const [isMobile2, setIsMobile] = React__namespace.useState(
|
|
3048
|
+
void 0
|
|
3049
|
+
);
|
|
3050
|
+
React__namespace.useEffect(() => {
|
|
3051
|
+
const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
|
|
3052
|
+
const onChange = () => {
|
|
3053
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
3054
|
+
};
|
|
3055
|
+
mql.addEventListener("change", onChange);
|
|
3056
|
+
setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
|
|
3057
|
+
return () => mql.removeEventListener("change", onChange);
|
|
3058
|
+
}, []);
|
|
3059
|
+
return !!isMobile2;
|
|
3060
|
+
}
|
|
3028
3061
|
const Tip = (props) => {
|
|
3029
3062
|
const { children, text } = props;
|
|
3030
|
-
|
|
3031
|
-
|
|
3032
|
-
|
|
3063
|
+
const [open, setOpen] = React.useState(false);
|
|
3064
|
+
const isMobile2 = useIsMobile();
|
|
3065
|
+
const tooltipRef = React.useRef(null);
|
|
3066
|
+
const handleToggle = () => {
|
|
3067
|
+
setOpen((prev) => !prev);
|
|
3068
|
+
};
|
|
3069
|
+
React.useEffect(() => {
|
|
3070
|
+
const handleClickOutside = (event) => {
|
|
3071
|
+
if (tooltipRef.current && !tooltipRef.current.contains(event.target)) {
|
|
3072
|
+
setOpen(false);
|
|
3073
|
+
}
|
|
3074
|
+
};
|
|
3075
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
3076
|
+
return () => {
|
|
3077
|
+
document.removeEventListener("mousedown", handleClickOutside);
|
|
3078
|
+
};
|
|
3079
|
+
}, []);
|
|
3080
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { open: isMobile2 ? open : void 0, children: [
|
|
3081
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3082
|
+
tooltip.TooltipTrigger,
|
|
3083
|
+
{
|
|
3084
|
+
onClick: (e2) => {
|
|
3085
|
+
e2.preventDefault();
|
|
3086
|
+
handleToggle();
|
|
3087
|
+
},
|
|
3088
|
+
className: "w-4 h-4 rounded-full bg-muted text-muted-foreground",
|
|
3089
|
+
children
|
|
3090
|
+
}
|
|
3091
|
+
),
|
|
3092
|
+
/* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { ref: tooltipRef, children: text })
|
|
3033
3093
|
] });
|
|
3034
3094
|
};
|
|
3035
3095
|
const BASE_URL = "https://icons-ckg.pages.dev/stargate-light/tokens";
|
|
@@ -3046,13 +3106,18 @@ function useFeeBreakdown() {
|
|
|
3046
3106
|
const { quote } = useBridgeQuoteStore();
|
|
3047
3107
|
const { tokens, allTokens, selectedAssetSymbol, assetMatrix } = useTokensStore();
|
|
3048
3108
|
const { fromChain, toChain, chains } = useChainsStore();
|
|
3049
|
-
return
|
|
3109
|
+
return React.useMemo(() => {
|
|
3050
3110
|
const srcToken = resolveTokenOnChainFromMatrix$1(
|
|
3051
3111
|
assetMatrix,
|
|
3052
3112
|
selectedAssetSymbol,
|
|
3053
3113
|
fromChain?.chainKey
|
|
3054
3114
|
);
|
|
3055
|
-
|
|
3115
|
+
const dstToken = resolveTokenOnChainFromMatrix$1(
|
|
3116
|
+
assetMatrix,
|
|
3117
|
+
selectedAssetSymbol,
|
|
3118
|
+
toChain?.chainKey
|
|
3119
|
+
);
|
|
3120
|
+
return computeFeeBreakdownUsd(quote, srcToken, dstToken, allTokens ?? tokens, chains, fromChain, toChain);
|
|
3056
3121
|
}, [quote, allTokens, tokens, chains, selectedAssetSymbol, assetMatrix, fromChain, toChain]);
|
|
3057
3122
|
}
|
|
3058
3123
|
function useBridgeExternalData(options) {
|
|
@@ -3068,7 +3133,7 @@ function useBridgeExternalData(options) {
|
|
|
3068
3133
|
const inputAmount = useBridgeQuoteStore((state2) => state2.inputAmount);
|
|
3069
3134
|
const quote = useBridgeQuoteStore((state2) => state2.quote);
|
|
3070
3135
|
const slippageBps = useSettingsStore((state2) => state2.slippageBps);
|
|
3071
|
-
const data =
|
|
3136
|
+
const data = React.useMemo(
|
|
3072
3137
|
() => buildBridgeExternalData({
|
|
3073
3138
|
amount: inputAmount,
|
|
3074
3139
|
selectedAssetSymbol,
|
|
@@ -3093,8 +3158,8 @@ function useBridgeExternalData(options) {
|
|
|
3093
3158
|
slippageBps
|
|
3094
3159
|
]
|
|
3095
3160
|
);
|
|
3096
|
-
const lastSerializedRef =
|
|
3097
|
-
|
|
3161
|
+
const lastSerializedRef = React.useRef(void 0);
|
|
3162
|
+
React.useEffect(() => {
|
|
3098
3163
|
const callback = options?.onDataUpdate;
|
|
3099
3164
|
if (!callback) return;
|
|
3100
3165
|
const serialized = serializeBridgeDataForCache(data);
|
|
@@ -3678,7 +3743,7 @@ function useGasEstimate(amountNum) {
|
|
|
3678
3743
|
const quoteFees = quote?.fees;
|
|
3679
3744
|
const quoteSrcChainKey = quote?.srcChainKey;
|
|
3680
3745
|
const nativeBalanceValue = nativeCurrencySymbol ? Number(balances[nativeCurrencySymbol.toUpperCase()]?.balance ?? 0) : 0;
|
|
3681
|
-
const result =
|
|
3746
|
+
const result = React.useMemo(() => {
|
|
3682
3747
|
if (!chainKey || !nativeCurrencySymbol) {
|
|
3683
3748
|
return {
|
|
3684
3749
|
nativeSym: "",
|
|
@@ -3756,7 +3821,7 @@ function useBridgeTransaction() {
|
|
|
3756
3821
|
const { chains } = useChainsStore();
|
|
3757
3822
|
const txStore = useTransactionStore();
|
|
3758
3823
|
const gas = useGasEstimate();
|
|
3759
|
-
const srcToken =
|
|
3824
|
+
const srcToken = React.useMemo(
|
|
3760
3825
|
() => resolveTokenOnChainFromMatrix$1(
|
|
3761
3826
|
assetMatrix,
|
|
3762
3827
|
selectedAssetSymbol,
|
|
@@ -3764,7 +3829,7 @@ function useBridgeTransaction() {
|
|
|
3764
3829
|
),
|
|
3765
3830
|
[assetMatrix, selectedAssetSymbol, quote?.srcChainKey]
|
|
3766
3831
|
);
|
|
3767
|
-
const dstToken =
|
|
3832
|
+
const dstToken = React.useMemo(
|
|
3768
3833
|
() => resolveTokenOnChainFromMatrix$1(
|
|
3769
3834
|
assetMatrix,
|
|
3770
3835
|
selectedAssetSymbol,
|
|
@@ -3978,7 +4043,7 @@ function useBalanceCheck(amountNum, gas) {
|
|
|
3978
4043
|
const { selectedAssetSymbol } = useTokensStore();
|
|
3979
4044
|
const { srcAddress } = useAddresses();
|
|
3980
4045
|
const { getBalance } = useBalances(fromChain?.chainKey, srcAddress);
|
|
3981
|
-
const validationResult =
|
|
4046
|
+
const validationResult = React.useMemo(() => {
|
|
3982
4047
|
if (!fromChain || !gas.balancesKnown) {
|
|
3983
4048
|
return {
|
|
3984
4049
|
availableBalance: 0,
|
|
@@ -4021,7 +4086,7 @@ function useAmountLimits(amountNum) {
|
|
|
4021
4086
|
const { selectedAssetSymbol, tokens } = useTokensStore();
|
|
4022
4087
|
const { fromChain } = useChainsStore();
|
|
4023
4088
|
const { quote } = useBridgeQuoteStore();
|
|
4024
|
-
const limitsResult =
|
|
4089
|
+
const limitsResult = React.useMemo(() => {
|
|
4025
4090
|
const tokenSymbol = selectedAssetSymbol;
|
|
4026
4091
|
if (quote?.srcAmountMax && fromChain?.chainKey && selectedAssetSymbol) {
|
|
4027
4092
|
const sourceToken = tokens?.find(
|
|
@@ -4059,7 +4124,7 @@ function useSilentValidations(amountString) {
|
|
|
4059
4124
|
const { selectedAssetSymbol, assetMatrix, tokens } = useTokensStore();
|
|
4060
4125
|
const { fromChain, toChain } = useChainsStore();
|
|
4061
4126
|
const { quote, status, error } = useBridgeQuoteStore();
|
|
4062
|
-
const validationResult =
|
|
4127
|
+
const validationResult = React.useMemo(() => {
|
|
4063
4128
|
const hasTooManyDecimals = (() => {
|
|
4064
4129
|
if (!amountString || !fromChain?.chainKey || !selectedAssetSymbol)
|
|
4065
4130
|
return false;
|
|
@@ -4110,35 +4175,11 @@ function useSilentValidations(amountString) {
|
|
|
4110
4175
|
status,
|
|
4111
4176
|
error
|
|
4112
4177
|
]);
|
|
4113
|
-
react.useEffect(() => {
|
|
4114
|
-
if (validationResult.isValidForTransfer) return;
|
|
4115
|
-
console.info("[SilentValidations] invalid", {
|
|
4116
|
-
amountString,
|
|
4117
|
-
hasTooManyDecimals: validationResult.hasTooManyDecimals,
|
|
4118
|
-
hasUnsupportedTokenPair: validationResult.hasUnsupportedTokenPair,
|
|
4119
|
-
hasInsufficientLiquidity: validationResult.hasInsufficientLiquidity,
|
|
4120
|
-
status,
|
|
4121
|
-
hasQuote: Boolean(quote),
|
|
4122
|
-
error,
|
|
4123
|
-
fromChainKey: fromChain?.chainKey,
|
|
4124
|
-
toChainKey: toChain?.chainKey,
|
|
4125
|
-
selectedAssetSymbol
|
|
4126
|
-
});
|
|
4127
|
-
}, [
|
|
4128
|
-
validationResult,
|
|
4129
|
-
amountString,
|
|
4130
|
-
status,
|
|
4131
|
-
quote,
|
|
4132
|
-
error,
|
|
4133
|
-
fromChain?.chainKey,
|
|
4134
|
-
toChain?.chainKey,
|
|
4135
|
-
selectedAssetSymbol
|
|
4136
|
-
]);
|
|
4137
4178
|
return validationResult;
|
|
4138
4179
|
}
|
|
4139
4180
|
function useTelegramRestriction() {
|
|
4140
4181
|
const { fromChain, toChain } = useChainsStore();
|
|
4141
|
-
const restriction =
|
|
4182
|
+
const restriction = React.useMemo(() => {
|
|
4142
4183
|
const isTelegramEnv = typeof window !== "undefined" && /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
|
|
4143
4184
|
typeof window.TelegramWebviewProxy?.postEvent === "function";
|
|
4144
4185
|
if (!isTelegramEnv) {
|
|
@@ -4182,7 +4223,7 @@ const MainButton = ({
|
|
|
4182
4223
|
const missingDst = isCustomAddressEnabled ? !dstAddressValid : !dstConnectedOk || !dstAddressValid;
|
|
4183
4224
|
const requiresCustomAddress = isCustomAddressEnabled && !dstAddressValid;
|
|
4184
4225
|
const canTransfer = !missingSrc && !missingDst && amountNum > 0 && !!srcChainKey && !!dstChainKey;
|
|
4185
|
-
const label =
|
|
4226
|
+
const label = React.useMemo(() => {
|
|
4186
4227
|
switch (true) {
|
|
4187
4228
|
case isTelegramRestricted:
|
|
4188
4229
|
return t2("telegram.openWebVersion");
|
|
@@ -4260,7 +4301,6 @@ const MainButton = ({
|
|
|
4260
4301
|
}
|
|
4261
4302
|
};
|
|
4262
4303
|
const disabled = status === "loading" || requiresCustomAddress || !isTelegramRestricted && !missingSrc && !missingDst && (amountNum <= 0 || isBalanceLoading || hasInsufficientBalance || hasAmountTooLarge || !gas.hasEnoughGas || noRoute || !isValidForTransfer);
|
|
4263
|
-
console.log(gas);
|
|
4264
4304
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pt-4 space-y-4", children: [
|
|
4265
4305
|
isTelegramRestricted && /* @__PURE__ */ jsxRuntime.jsx(
|
|
4266
4306
|
alert.Alert,
|
|
@@ -4295,7 +4335,7 @@ const WalletModalButton = (props) => {
|
|
|
4295
4335
|
const { icon: IconComponent, name, onClose } = props;
|
|
4296
4336
|
const { chainRegistry } = useChainStrategies();
|
|
4297
4337
|
const { connect, isPending } = wagmi.useConnect();
|
|
4298
|
-
const [isConnecting, setIsConnecting] =
|
|
4338
|
+
const [isConnecting, setIsConnecting] = React.useState(false);
|
|
4299
4339
|
if (props.variant === "connected") {
|
|
4300
4340
|
const { address, onDisconnect } = props;
|
|
4301
4341
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -4749,11 +4789,11 @@ const SuccessStep = ({
|
|
|
4749
4789
|
);
|
|
4750
4790
|
};
|
|
4751
4791
|
const useCountdown = (initialSeconds) => {
|
|
4752
|
-
const [time2, setTime] =
|
|
4792
|
+
const [time2, setTime] = React.useState(initialSeconds);
|
|
4753
4793
|
const minutes = Math.floor(time2 / 60);
|
|
4754
4794
|
const seconds = time2 % 60;
|
|
4755
4795
|
const formattedTime = `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
|
4756
|
-
|
|
4796
|
+
React.useEffect(() => {
|
|
4757
4797
|
if (!time2) return;
|
|
4758
4798
|
const intervalId = setInterval(() => {
|
|
4759
4799
|
setTime(time2 - 1);
|
|
@@ -4831,7 +4871,7 @@ const useTokens = () => {
|
|
|
4831
4871
|
// 1 час хранения в кэше
|
|
4832
4872
|
refetchOnWindowFocus: false
|
|
4833
4873
|
});
|
|
4834
|
-
|
|
4874
|
+
React.useEffect(() => {
|
|
4835
4875
|
if (query.isSuccess && query.data?.length) {
|
|
4836
4876
|
setAllTokens(query.data);
|
|
4837
4877
|
const bridgeableTokens = query.data.filter(
|
|
@@ -4850,7 +4890,7 @@ const useTokens = () => {
|
|
|
4850
4890
|
setSelectedToken,
|
|
4851
4891
|
setSelectedAssetSymbol
|
|
4852
4892
|
]);
|
|
4853
|
-
|
|
4893
|
+
React.useEffect(() => {
|
|
4854
4894
|
if (query.isError && query.error) {
|
|
4855
4895
|
console.error(query.error.name, query.error.message);
|
|
4856
4896
|
}
|
|
@@ -4870,7 +4910,7 @@ const useChains = () => {
|
|
|
4870
4910
|
// 1 час хранения в кэше
|
|
4871
4911
|
refetchOnWindowFocus: false
|
|
4872
4912
|
});
|
|
4873
|
-
|
|
4913
|
+
React.useEffect(() => {
|
|
4874
4914
|
if (query.isSuccess && query.data?.length) {
|
|
4875
4915
|
setChains(query.data);
|
|
4876
4916
|
if (!fromChain) {
|
|
@@ -4878,7 +4918,7 @@ const useChains = () => {
|
|
|
4878
4918
|
}
|
|
4879
4919
|
}
|
|
4880
4920
|
}, [query.isSuccess, query.data]);
|
|
4881
|
-
|
|
4921
|
+
React.useEffect(() => {
|
|
4882
4922
|
if (query.isError && query.error) {
|
|
4883
4923
|
console.error(query.error.name, query.error.message);
|
|
4884
4924
|
}
|
|
@@ -6636,7 +6676,7 @@ function ChainStrategyProvider({
|
|
|
6636
6676
|
tronApiKey
|
|
6637
6677
|
}) {
|
|
6638
6678
|
const { chains } = useChainsStore();
|
|
6639
|
-
const chainKeyToId =
|
|
6679
|
+
const chainKeyToId = React.useMemo(() => {
|
|
6640
6680
|
const map = {
|
|
6641
6681
|
...EVM_CHAIN_KEY_TO_ID
|
|
6642
6682
|
};
|
|
@@ -6649,7 +6689,7 @@ function ChainStrategyProvider({
|
|
|
6649
6689
|
}
|
|
6650
6690
|
return map;
|
|
6651
6691
|
}, [chains]);
|
|
6652
|
-
const evmStrategy =
|
|
6692
|
+
const evmStrategy = React.useMemo(
|
|
6653
6693
|
() => new EvmChainStrategy({
|
|
6654
6694
|
evmAddress: evmWallet.address,
|
|
6655
6695
|
evmIsConnected: evmWallet.isConnected,
|
|
@@ -6669,7 +6709,7 @@ function ChainStrategyProvider({
|
|
|
6669
6709
|
chainKeyToId
|
|
6670
6710
|
]
|
|
6671
6711
|
);
|
|
6672
|
-
const tonStrategy =
|
|
6712
|
+
const tonStrategy = React.useMemo(
|
|
6673
6713
|
() => new TonChainStrategy({
|
|
6674
6714
|
tonConnectUI: tonWallet.tonConnectUI,
|
|
6675
6715
|
tonAddress: tonWallet.address,
|
|
@@ -6678,7 +6718,7 @@ function ChainStrategyProvider({
|
|
|
6678
6718
|
}),
|
|
6679
6719
|
[tonWallet.tonConnectUI, tonWallet.address, tonClient, tonApiKey]
|
|
6680
6720
|
);
|
|
6681
|
-
const tronStrategy =
|
|
6721
|
+
const tronStrategy = React.useMemo(
|
|
6682
6722
|
() => new TronChainStrategy({
|
|
6683
6723
|
tronLink: {
|
|
6684
6724
|
address: tronWallet.tronLink.address,
|
|
@@ -6708,11 +6748,11 @@ function ChainStrategyProvider({
|
|
|
6708
6748
|
tronApiKey
|
|
6709
6749
|
]
|
|
6710
6750
|
);
|
|
6711
|
-
const chainRegistry =
|
|
6751
|
+
const chainRegistry = React.useMemo(
|
|
6712
6752
|
() => new ChainStrategyRegistry([evmStrategy, tonStrategy, tronStrategy]),
|
|
6713
6753
|
[evmStrategy, tonStrategy, tronStrategy]
|
|
6714
6754
|
);
|
|
6715
|
-
const value =
|
|
6755
|
+
const value = React.useMemo(
|
|
6716
6756
|
() => ({
|
|
6717
6757
|
chainRegistry
|
|
6718
6758
|
}),
|
|
@@ -6930,10 +6970,10 @@ const TokenSelectModal = ({
|
|
|
6930
6970
|
onChangeAsset
|
|
6931
6971
|
}) => {
|
|
6932
6972
|
const { t: t2 } = useBridgeTranslation();
|
|
6933
|
-
const [query, setQuery] =
|
|
6934
|
-
const [tab, setTab] =
|
|
6935
|
-
const [manualTabSwitch, setManualTabSwitch] =
|
|
6936
|
-
const [listHeight, setListHeight] =
|
|
6973
|
+
const [query, setQuery] = React.useState("");
|
|
6974
|
+
const [tab, setTab] = React.useState("my");
|
|
6975
|
+
const [manualTabSwitch, setManualTabSwitch] = React.useState(false);
|
|
6976
|
+
const [listHeight, setListHeight] = React.useState(400);
|
|
6937
6977
|
const { srcAddress } = useAddresses();
|
|
6938
6978
|
const { fromChain, toChain, setFromChain, chains } = useChainsStore();
|
|
6939
6979
|
const { assetMatrix, selectedAssetSymbol } = useTokensStore();
|
|
@@ -6942,20 +6982,20 @@ const TokenSelectModal = ({
|
|
|
6942
6982
|
fromChain?.chainKey,
|
|
6943
6983
|
srcAddress
|
|
6944
6984
|
);
|
|
6945
|
-
const hasSourceWallet =
|
|
6985
|
+
const hasSourceWallet = React.useCallback(() => {
|
|
6946
6986
|
return hasWalletForChain(fromChain?.chainKey);
|
|
6947
6987
|
}, [hasWalletForChain, fromChain?.chainKey]);
|
|
6948
|
-
|
|
6988
|
+
React.useEffect(() => {
|
|
6949
6989
|
if (!hasSourceWallet()) setTab("all");
|
|
6950
6990
|
}, [hasSourceWallet]);
|
|
6951
|
-
const getTokenUsdValue =
|
|
6991
|
+
const getTokenUsdValue = React.useCallback(
|
|
6952
6992
|
(symbol, price) => {
|
|
6953
6993
|
const bal = getBalance(symbol);
|
|
6954
6994
|
return bal > 0 && price ? bal * price : 0;
|
|
6955
6995
|
},
|
|
6956
6996
|
[getBalance]
|
|
6957
6997
|
);
|
|
6958
|
-
const isTokenAvailableOnChain =
|
|
6998
|
+
const isTokenAvailableOnChain = React.useCallback(
|
|
6959
6999
|
(symbol, chainKey) => {
|
|
6960
7000
|
if (!assetMatrix || !chainKey) return false;
|
|
6961
7001
|
const tokensByChain = assetMatrix[symbol.toUpperCase()];
|
|
@@ -6963,7 +7003,7 @@ const TokenSelectModal = ({
|
|
|
6963
7003
|
},
|
|
6964
7004
|
[assetMatrix]
|
|
6965
7005
|
);
|
|
6966
|
-
const findFirstAvailableChain =
|
|
7006
|
+
const findFirstAvailableChain = React.useCallback(
|
|
6967
7007
|
(symbol) => {
|
|
6968
7008
|
if (!assetMatrix || !chains) return void 0;
|
|
6969
7009
|
const tokensByChain = assetMatrix[symbol.toUpperCase()];
|
|
@@ -6976,7 +7016,7 @@ const TokenSelectModal = ({
|
|
|
6976
7016
|
},
|
|
6977
7017
|
[assetMatrix, chains]
|
|
6978
7018
|
);
|
|
6979
|
-
const groupedTokens =
|
|
7019
|
+
const groupedTokens = React.useMemo(() => {
|
|
6980
7020
|
const q3 = query.trim().toLowerCase();
|
|
6981
7021
|
const filtered = q3 ? items.filter(
|
|
6982
7022
|
(a2) => a2.name.toLowerCase().includes(q3) || a2.symbol.toLowerCase().includes(q3)
|
|
@@ -7026,33 +7066,33 @@ const TokenSelectModal = ({
|
|
|
7026
7066
|
]);
|
|
7027
7067
|
const myTokens = groupedTokens.withBalance;
|
|
7028
7068
|
const effectiveTab = hasSourceWallet() ? tab === "my" && myTokens.length === 0 && !manualTabSwitch ? "all" : tab : "all";
|
|
7029
|
-
|
|
7069
|
+
React.useEffect(() => {
|
|
7030
7070
|
if (query.trim() !== "" && tab === "my" && myTokens.length === 0 && !manualTabSwitch) {
|
|
7031
7071
|
setTab("all");
|
|
7032
7072
|
}
|
|
7033
7073
|
}, [query, tab, myTokens.length, manualTabSwitch]);
|
|
7034
|
-
|
|
7074
|
+
React.useEffect(() => {
|
|
7035
7075
|
if (query.trim() !== "" && tab === "all" && myTokens.length > 0 && !manualTabSwitch) {
|
|
7036
7076
|
setTab("my");
|
|
7037
7077
|
}
|
|
7038
7078
|
}, [query, tab, myTokens.length, manualTabSwitch]);
|
|
7039
|
-
|
|
7079
|
+
React.useEffect(() => {
|
|
7040
7080
|
setManualTabSwitch(false);
|
|
7041
7081
|
}, [query]);
|
|
7042
|
-
const resetState =
|
|
7082
|
+
const resetState = React.useCallback(() => {
|
|
7043
7083
|
setQuery("");
|
|
7044
7084
|
setTab("my");
|
|
7045
7085
|
setManualTabSwitch(false);
|
|
7046
7086
|
}, []);
|
|
7047
|
-
const handleClose =
|
|
7087
|
+
const handleClose = React.useCallback(() => {
|
|
7048
7088
|
resetState();
|
|
7049
7089
|
onClose();
|
|
7050
7090
|
}, [onClose, resetState]);
|
|
7051
|
-
|
|
7091
|
+
React.useEffect(() => {
|
|
7052
7092
|
if (!isOpen) resetState();
|
|
7053
7093
|
}, [isOpen, resetState]);
|
|
7054
|
-
|
|
7055
|
-
const onPick =
|
|
7094
|
+
React.useEffect(() => () => resetState(), [resetState]);
|
|
7095
|
+
const onPick = React.useCallback(
|
|
7056
7096
|
(sym, willChangeSrcChain = false, willChangeDstChain = false, willChangeBothChains = false) => {
|
|
7057
7097
|
onChangeAsset(sym);
|
|
7058
7098
|
if (willChangeBothChains) {
|
|
@@ -7066,7 +7106,7 @@ const TokenSelectModal = ({
|
|
|
7066
7106
|
},
|
|
7067
7107
|
[findFirstAvailableChain, handleClose, onChangeAsset, setFromChain]
|
|
7068
7108
|
);
|
|
7069
|
-
const tokensToRender =
|
|
7109
|
+
const tokensToRender = React.useMemo(() => {
|
|
7070
7110
|
if (effectiveTab === "my") {
|
|
7071
7111
|
return myTokens.map((token) => ({
|
|
7072
7112
|
token,
|
|
@@ -7085,21 +7125,21 @@ const TokenSelectModal = ({
|
|
|
7085
7125
|
];
|
|
7086
7126
|
return mainTokens;
|
|
7087
7127
|
}, [effectiveTab, myTokens, groupedTokens]);
|
|
7088
|
-
const willChangeDstTokens =
|
|
7128
|
+
const willChangeDstTokens = React.useMemo(
|
|
7089
7129
|
() => groupedTokens.willChangeDstChain.map((token) => ({
|
|
7090
7130
|
token,
|
|
7091
7131
|
willChangeDst: true
|
|
7092
7132
|
})),
|
|
7093
7133
|
[groupedTokens.willChangeDstChain]
|
|
7094
7134
|
);
|
|
7095
|
-
const willChangeSrcTokens =
|
|
7135
|
+
const willChangeSrcTokens = React.useMemo(
|
|
7096
7136
|
() => groupedTokens.willChangeSrcChain.map((token) => ({
|
|
7097
7137
|
token,
|
|
7098
7138
|
willChangeSrc: true
|
|
7099
7139
|
})),
|
|
7100
7140
|
[groupedTokens.willChangeSrcChain]
|
|
7101
7141
|
);
|
|
7102
|
-
const willChangeBothTokens =
|
|
7142
|
+
const willChangeBothTokens = React.useMemo(
|
|
7103
7143
|
() => groupedTokens.willChangeBothChains.map((token) => ({
|
|
7104
7144
|
token,
|
|
7105
7145
|
willChangeBoth: true
|
|
@@ -7107,7 +7147,7 @@ const TokenSelectModal = ({
|
|
|
7107
7147
|
[groupedTokens.willChangeBothChains]
|
|
7108
7148
|
);
|
|
7109
7149
|
const hasNoResults = tokensToRender.length === 0 && willChangeDstTokens.length === 0 && willChangeSrcTokens.length === 0 && willChangeBothTokens.length === 0;
|
|
7110
|
-
const virtualItems =
|
|
7150
|
+
const virtualItems = React.useMemo(() => {
|
|
7111
7151
|
const items2 = tokensToRender.map(
|
|
7112
7152
|
({ token, willChangeSrc }) => ({
|
|
7113
7153
|
type: "token",
|
|
@@ -7152,7 +7192,7 @@ const TokenSelectModal = ({
|
|
|
7152
7192
|
}
|
|
7153
7193
|
return items2;
|
|
7154
7194
|
}, [effectiveTab, tokensToRender, t2, willChangeDstTokens, willChangeSrcTokens, willChangeBothTokens]);
|
|
7155
|
-
|
|
7195
|
+
React.useLayoutEffect(() => {
|
|
7156
7196
|
const updateHeight = () => {
|
|
7157
7197
|
const container2 = document.getElementById("token-select-list");
|
|
7158
7198
|
if (!container2) return;
|
|
@@ -7175,7 +7215,7 @@ const TokenSelectModal = ({
|
|
|
7175
7215
|
resizeObserver?.disconnect();
|
|
7176
7216
|
};
|
|
7177
7217
|
}, [isOpen, hasSourceWallet]);
|
|
7178
|
-
const VirtualRow =
|
|
7218
|
+
const VirtualRow = React.useCallback(
|
|
7179
7219
|
({ index, style }) => {
|
|
7180
7220
|
const item = virtualItems[index];
|
|
7181
7221
|
if (!item) return null;
|
|
@@ -7219,7 +7259,7 @@ const TokenSelectModal = ({
|
|
|
7219
7259
|
virtualItems
|
|
7220
7260
|
]
|
|
7221
7261
|
);
|
|
7222
|
-
const itemKey =
|
|
7262
|
+
const itemKey = React.useCallback(
|
|
7223
7263
|
(index) => {
|
|
7224
7264
|
const item = virtualItems[index];
|
|
7225
7265
|
if (!item) return index;
|
|
@@ -7296,8 +7336,8 @@ function useBridgeRefresh() {
|
|
|
7296
7336
|
const { fromChain, toChain } = useChainsStore();
|
|
7297
7337
|
const { setLoading: setQLoading, triggerRefetch } = useBridgeQuoteStore();
|
|
7298
7338
|
const { hasAnyWallet } = useConnectedWalletsStore();
|
|
7299
|
-
const [spinning, setSpinning] =
|
|
7300
|
-
const refresh =
|
|
7339
|
+
const [spinning, setSpinning] = React.useState(false);
|
|
7340
|
+
const refresh = React.useCallback(async () => {
|
|
7301
7341
|
setSpinning(true);
|
|
7302
7342
|
try {
|
|
7303
7343
|
setQLoading();
|
|
@@ -7350,8 +7390,8 @@ function useBridgeRefresh() {
|
|
|
7350
7390
|
}
|
|
7351
7391
|
const RefreshButton = () => {
|
|
7352
7392
|
const { refresh, spinning } = useBridgeRefresh();
|
|
7353
|
-
const [turns, setTurns] =
|
|
7354
|
-
const handleRefresh =
|
|
7393
|
+
const [turns, setTurns] = React.useState(0);
|
|
7394
|
+
const handleRefresh = React.useCallback(() => {
|
|
7355
7395
|
setTurns((t2) => t2 + 1);
|
|
7356
7396
|
refresh();
|
|
7357
7397
|
}, [refresh]);
|
|
@@ -7380,7 +7420,7 @@ const SelectTokenButton = ({
|
|
|
7380
7420
|
token
|
|
7381
7421
|
}) => {
|
|
7382
7422
|
const { t: t2 } = useBridgeTranslation();
|
|
7383
|
-
const label =
|
|
7423
|
+
const label = React.useMemo(() => {
|
|
7384
7424
|
return token?.symbol ?? t2("bridge.selectToken");
|
|
7385
7425
|
}, [token, t2]);
|
|
7386
7426
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -7418,8 +7458,8 @@ const Toolbar = () => {
|
|
|
7418
7458
|
onOpen: onOpenSettings
|
|
7419
7459
|
} = useModal();
|
|
7420
7460
|
const { tokens, selectedAssetSymbol, setSelectedAssetSymbol } = useTokensStore();
|
|
7421
|
-
const assets =
|
|
7422
|
-
const current =
|
|
7461
|
+
const assets = React.useMemo(() => listAssetsForSelect(tokens || []), [tokens]);
|
|
7462
|
+
const current = React.useMemo(() => {
|
|
7423
7463
|
if (!assets.length) return void 0;
|
|
7424
7464
|
if (!selectedAssetSymbol) return assets[0];
|
|
7425
7465
|
const sum = selectedAssetSymbol.toUpperCase();
|
|
@@ -7465,8 +7505,8 @@ const useAutoSelectNetwork = ({
|
|
|
7465
7505
|
}) => {
|
|
7466
7506
|
const { hasAnyWallet } = useConnectedWalletsStore();
|
|
7467
7507
|
const { chains, setFromChain } = useChainsStore();
|
|
7468
|
-
const previousHadWallet =
|
|
7469
|
-
|
|
7508
|
+
const previousHadWallet = React.useRef(hasAnyWallet());
|
|
7509
|
+
React.useEffect(() => {
|
|
7470
7510
|
const currentHasWallet = hasAnyWallet();
|
|
7471
7511
|
const isFirstWalletConnection = !previousHadWallet.current && currentHasWallet;
|
|
7472
7512
|
if (isFirstWalletConnection && chains?.length) {
|
|
@@ -26107,7 +26147,7 @@ class WalletConnectModal {
|
|
|
26107
26147
|
}
|
|
26108
26148
|
async initUi() {
|
|
26109
26149
|
if (typeof window !== "undefined") {
|
|
26110
|
-
await Promise.resolve().then(() => require("./index-
|
|
26150
|
+
await Promise.resolve().then(() => require("./index-Btnz7slS.cjs"));
|
|
26111
26151
|
const modal = document.createElement("wcm-modal");
|
|
26112
26152
|
document.body.insertAdjacentElement("beforeend", modal);
|
|
26113
26153
|
OptionsCtrl.setIsUiLoaded(true);
|
|
@@ -26213,16 +26253,16 @@ function isSessionExpiredError(error) {
|
|
|
26213
26253
|
function useTronWalletConnect(projectId) {
|
|
26214
26254
|
const { address, isConnected, isConnecting } = useTronWalletConnectStore();
|
|
26215
26255
|
const { setAddress, setActions, reset } = useTronWalletConnectStore();
|
|
26216
|
-
const providerRef =
|
|
26217
|
-
const modalRef =
|
|
26218
|
-
const abortControllerRef =
|
|
26256
|
+
const providerRef = React.useRef(null);
|
|
26257
|
+
const modalRef = React.useRef(null);
|
|
26258
|
+
const abortControllerRef = React.useRef(null);
|
|
26219
26259
|
const { onClose: closeWalletSelectModal } = useWalletSelectModal();
|
|
26220
26260
|
const appliedTheme = useThemeStore((state2) => state2.appliedTheme);
|
|
26221
|
-
const closeWalletSelectModalRef =
|
|
26261
|
+
const closeWalletSelectModalRef = React.useRef(closeWalletSelectModal);
|
|
26222
26262
|
closeWalletSelectModalRef.current = closeWalletSelectModal;
|
|
26223
|
-
const appliedThemeRef =
|
|
26263
|
+
const appliedThemeRef = React.useRef(appliedTheme);
|
|
26224
26264
|
appliedThemeRef.current = appliedTheme;
|
|
26225
|
-
|
|
26265
|
+
React.useEffect(() => {
|
|
26226
26266
|
if (!projectId || providerRef.current) return;
|
|
26227
26267
|
const initProvider = async () => {
|
|
26228
26268
|
try {
|
|
@@ -26295,7 +26335,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26295
26335
|
}
|
|
26296
26336
|
};
|
|
26297
26337
|
}, [projectId, setAddress]);
|
|
26298
|
-
|
|
26338
|
+
React.useEffect(() => {
|
|
26299
26339
|
if (!projectId || !modalRef.current) return;
|
|
26300
26340
|
const modal = new WalletConnectModal({
|
|
26301
26341
|
projectId,
|
|
@@ -26307,7 +26347,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26307
26347
|
});
|
|
26308
26348
|
modalRef.current = modal;
|
|
26309
26349
|
}, [appliedTheme, projectId]);
|
|
26310
|
-
const connect =
|
|
26350
|
+
const connect = React.useCallback(async () => {
|
|
26311
26351
|
if (!providerRef.current) {
|
|
26312
26352
|
throw new Error(
|
|
26313
26353
|
"WalletConnect not initialized. Please provide a valid project ID."
|
|
@@ -26375,7 +26415,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26375
26415
|
abortControllerRef.current = null;
|
|
26376
26416
|
}
|
|
26377
26417
|
}, [setAddress]);
|
|
26378
|
-
const cancelConnection =
|
|
26418
|
+
const cancelConnection = React.useCallback(() => {
|
|
26379
26419
|
if (abortControllerRef.current) {
|
|
26380
26420
|
abortControllerRef.current.abort();
|
|
26381
26421
|
console.log("TRON WalletConnect connection cancelled");
|
|
@@ -26384,7 +26424,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26384
26424
|
modalRef.current.closeModal();
|
|
26385
26425
|
}
|
|
26386
26426
|
}, []);
|
|
26387
|
-
const disconnect =
|
|
26427
|
+
const disconnect = React.useCallback(async () => {
|
|
26388
26428
|
if (!providerRef.current) return;
|
|
26389
26429
|
try {
|
|
26390
26430
|
await providerRef.current.disconnect();
|
|
@@ -26395,7 +26435,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26395
26435
|
throw error;
|
|
26396
26436
|
}
|
|
26397
26437
|
}, [reset]);
|
|
26398
|
-
const signTransaction =
|
|
26438
|
+
const signTransaction = React.useCallback(
|
|
26399
26439
|
async (transaction2) => {
|
|
26400
26440
|
if (!providerRef.current) {
|
|
26401
26441
|
throw new Error("WalletConnect not initialized");
|
|
@@ -26462,7 +26502,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26462
26502
|
},
|
|
26463
26503
|
[address, setAddress]
|
|
26464
26504
|
);
|
|
26465
|
-
const onAddressCorrected =
|
|
26505
|
+
const onAddressCorrected = React.useCallback(
|
|
26466
26506
|
(correctedAddress) => {
|
|
26467
26507
|
console.log(
|
|
26468
26508
|
"TRON WalletConnect address corrected:",
|
|
@@ -26474,7 +26514,7 @@ function useTronWalletConnect(projectId) {
|
|
|
26474
26514
|
},
|
|
26475
26515
|
[address, setAddress]
|
|
26476
26516
|
);
|
|
26477
|
-
|
|
26517
|
+
React.useEffect(() => {
|
|
26478
26518
|
setActions({
|
|
26479
26519
|
connect,
|
|
26480
26520
|
disconnect,
|
|
@@ -26532,10 +26572,10 @@ function useUrlSync(options) {
|
|
|
26532
26572
|
const { setInputAmount } = useBridgeQuoteStore();
|
|
26533
26573
|
const internalData = useBridgeExternalData();
|
|
26534
26574
|
const currentUrlParams = internalData.urlParams;
|
|
26535
|
-
const [hasInitialized, setHasInitialized] =
|
|
26536
|
-
const isSyncingRef =
|
|
26537
|
-
const lastSyncedParamsRef =
|
|
26538
|
-
const validateParams =
|
|
26575
|
+
const [hasInitialized, setHasInitialized] = React.useState(false);
|
|
26576
|
+
const isSyncingRef = React.useRef(false);
|
|
26577
|
+
const lastSyncedParamsRef = React.useRef({});
|
|
26578
|
+
const validateParams = React.useCallback(
|
|
26539
26579
|
(urlParams) => {
|
|
26540
26580
|
const result = {};
|
|
26541
26581
|
if (!chains?.length || !tokens?.length || !assetMatrix) {
|
|
@@ -26588,7 +26628,7 @@ function useUrlSync(options) {
|
|
|
26588
26628
|
},
|
|
26589
26629
|
[chains, tokens, assetMatrix]
|
|
26590
26630
|
);
|
|
26591
|
-
const syncStateToUrl =
|
|
26631
|
+
const syncStateToUrl = React.useCallback(
|
|
26592
26632
|
(includeAmount = false) => {
|
|
26593
26633
|
if (!enabled || isSyncingRef.current || !hasInitialized) {
|
|
26594
26634
|
return;
|
|
@@ -26610,11 +26650,11 @@ function useUrlSync(options) {
|
|
|
26610
26650
|
},
|
|
26611
26651
|
[enabled, hasInitialized, currentUrlParams, onUrlParamsChange]
|
|
26612
26652
|
);
|
|
26613
|
-
const handleAmountBlur =
|
|
26653
|
+
const handleAmountBlur = React.useCallback(() => {
|
|
26614
26654
|
if (!enabled || !hasInitialized) return;
|
|
26615
26655
|
syncStateToUrl(true);
|
|
26616
26656
|
}, [enabled, hasInitialized, syncStateToUrl]);
|
|
26617
|
-
|
|
26657
|
+
React.useEffect(() => {
|
|
26618
26658
|
if (!enabled || !chains?.length || !tokens?.length) {
|
|
26619
26659
|
return;
|
|
26620
26660
|
}
|
|
@@ -26660,7 +26700,7 @@ function useUrlSync(options) {
|
|
|
26660
26700
|
setInputAmount,
|
|
26661
26701
|
setIsUrlInitialized
|
|
26662
26702
|
]);
|
|
26663
|
-
|
|
26703
|
+
React.useEffect(() => {
|
|
26664
26704
|
if (!enabled || !hasInitialized) return;
|
|
26665
26705
|
syncStateToUrl(false);
|
|
26666
26706
|
}, [
|
|
@@ -26684,7 +26724,7 @@ const EvaaBridgeWithProviders = (props) => {
|
|
|
26684
26724
|
const { disconnect: evmDisconnect } = wagmi.useDisconnect();
|
|
26685
26725
|
const { data: walletClient } = wagmi.useWalletClient();
|
|
26686
26726
|
const publicClient = wagmi.usePublicClient();
|
|
26687
|
-
const getPublicClientForChain =
|
|
26727
|
+
const getPublicClientForChain = React.useCallback(
|
|
26688
26728
|
(chainId) => {
|
|
26689
26729
|
try {
|
|
26690
26730
|
const client = wagmiConfig.getClient({
|
|
@@ -26704,15 +26744,15 @@ const EvaaBridgeWithProviders = (props) => {
|
|
|
26704
26744
|
connect: tronConnect,
|
|
26705
26745
|
disconnect: tronDisconnect
|
|
26706
26746
|
} = tronwalletAdapterReactHooks.useWallet();
|
|
26707
|
-
const tronSelectRef =
|
|
26708
|
-
const tronConnectRef =
|
|
26709
|
-
const tronDisconnectRef =
|
|
26710
|
-
|
|
26747
|
+
const tronSelectRef = React.useRef(tronSelect);
|
|
26748
|
+
const tronConnectRef = React.useRef(tronConnect);
|
|
26749
|
+
const tronDisconnectRef = React.useRef(tronDisconnect);
|
|
26750
|
+
React.useEffect(() => {
|
|
26711
26751
|
tronSelectRef.current = tronSelect;
|
|
26712
26752
|
tronConnectRef.current = tronConnect;
|
|
26713
26753
|
tronDisconnectRef.current = tronDisconnect;
|
|
26714
26754
|
}, [tronSelect, tronConnect, tronDisconnect]);
|
|
26715
|
-
const tronLinkActions =
|
|
26755
|
+
const tronLinkActions = React.useMemo(
|
|
26716
26756
|
() => ({
|
|
26717
26757
|
select: (adapterName) => tronSelectRef.current(adapterName),
|
|
26718
26758
|
connect: () => tronConnectRef.current(),
|
|
@@ -26722,14 +26762,14 @@ const EvaaBridgeWithProviders = (props) => {
|
|
|
26722
26762
|
);
|
|
26723
26763
|
const tronWalletConnect = useTronWalletConnect(props.walletConnectProjectId);
|
|
26724
26764
|
const { setTonConnected, setMetaMaskConnected, setTronConnected } = useConnectedWalletsStore();
|
|
26725
|
-
|
|
26765
|
+
React.useEffect(() => {
|
|
26726
26766
|
setTonConnected(!!tonAddress);
|
|
26727
26767
|
}, [tonAddress, setTonConnected]);
|
|
26728
|
-
|
|
26768
|
+
React.useEffect(() => {
|
|
26729
26769
|
setMetaMaskConnected(!!evmIsConnected);
|
|
26730
26770
|
}, [evmIsConnected, setMetaMaskConnected]);
|
|
26731
26771
|
const isAnyTronConnected = !!tronConnected || !!tronWalletConnect.isConnected;
|
|
26732
|
-
|
|
26772
|
+
React.useEffect(() => {
|
|
26733
26773
|
setTronConnected(isAnyTronConnected);
|
|
26734
26774
|
}, [isAnyTronConnected, setTronConnected]);
|
|
26735
26775
|
useAutoSelectNetwork({
|
|
@@ -26818,7 +26858,7 @@ const EvaaBridgeContent = ({
|
|
|
26818
26858
|
const canSwap = Boolean(
|
|
26819
26859
|
fromChain && toChain && selectedAssetSymbol && isAllowedFromChain(toChain.chainKey)
|
|
26820
26860
|
);
|
|
26821
|
-
const outputAmount =
|
|
26861
|
+
const outputAmount = React.useMemo(() => {
|
|
26822
26862
|
if (!quote || loading) return "";
|
|
26823
26863
|
const srcToken = resolveTokenOnChainFromMatrix$1(
|
|
26824
26864
|
assetMatrix,
|
|
@@ -26840,35 +26880,35 @@ const EvaaBridgeContent = ({
|
|
|
26840
26880
|
fromChain?.chainKey,
|
|
26841
26881
|
toChain?.chainKey
|
|
26842
26882
|
]);
|
|
26843
|
-
|
|
26883
|
+
React.useEffect(() => {
|
|
26844
26884
|
if (chains?.length && onInitialized) {
|
|
26845
26885
|
onInitialized();
|
|
26846
26886
|
}
|
|
26847
26887
|
}, [chains, onInitialized]);
|
|
26848
|
-
const handleAmountChange =
|
|
26888
|
+
const handleAmountChange = React.useCallback(
|
|
26849
26889
|
(newAmount) => {
|
|
26850
26890
|
setAmountAction(newAmount);
|
|
26851
26891
|
},
|
|
26852
26892
|
[setAmountAction]
|
|
26853
26893
|
);
|
|
26854
|
-
const handleFromChainChange =
|
|
26894
|
+
const handleFromChainChange = React.useCallback(
|
|
26855
26895
|
(chain2) => {
|
|
26856
26896
|
if (!chain2) return;
|
|
26857
26897
|
setFromChainAction(chain2);
|
|
26858
26898
|
},
|
|
26859
26899
|
[setFromChainAction]
|
|
26860
26900
|
);
|
|
26861
|
-
const handleToChainChange =
|
|
26901
|
+
const handleToChainChange = React.useCallback(
|
|
26862
26902
|
(chain2) => {
|
|
26863
26903
|
if (!chain2) return;
|
|
26864
26904
|
setToChainAction(chain2);
|
|
26865
26905
|
},
|
|
26866
26906
|
[setToChainAction]
|
|
26867
26907
|
);
|
|
26868
|
-
const handleSwapSides =
|
|
26908
|
+
const handleSwapSides = React.useCallback(() => {
|
|
26869
26909
|
swap.actions.swapSides();
|
|
26870
26910
|
}, [swap.actions]);
|
|
26871
|
-
const destinationChains =
|
|
26911
|
+
const destinationChains = React.useMemo(() => {
|
|
26872
26912
|
if (!chains || !selectedAssetSymbol || !assetMatrix) {
|
|
26873
26913
|
return allowedToChains ?? [];
|
|
26874
26914
|
}
|
|
@@ -26881,7 +26921,7 @@ const EvaaBridgeContent = ({
|
|
|
26881
26921
|
fromChain?.chainKey,
|
|
26882
26922
|
selectedAssetSymbol
|
|
26883
26923
|
]);
|
|
26884
|
-
const sourceChains =
|
|
26924
|
+
const sourceChains = React.useMemo(() => {
|
|
26885
26925
|
if (!chains || !assetMatrix) {
|
|
26886
26926
|
return allowedFromChains ?? [];
|
|
26887
26927
|
}
|
|
@@ -27009,4 +27049,4 @@ exports.useSettingsStore = useSettingsStore;
|
|
|
27009
27049
|
exports.useSwapModel = useSwapModel;
|
|
27010
27050
|
exports.useTokensStore = useTokensStore;
|
|
27011
27051
|
exports.useTransactionStore = useTransactionStore;
|
|
27012
|
-
//# sourceMappingURL=index-
|
|
27052
|
+
//# sourceMappingURL=index-bZ0S5sNd.cjs.map
|