@rash2x/bridge-widget 0.1.12 → 0.1.13
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/README.md +5 -2
- package/dist/evaa-bridge.cjs +98 -24
- package/dist/evaa-bridge.cjs.map +1 -1
- package/dist/evaa-bridge.mjs +96 -22
- package/dist/evaa-bridge.mjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
package/dist/evaa-bridge.mjs
CHANGED
|
@@ -2,8 +2,9 @@ var __defProp = Object.defineProperty;
|
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
4
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import require$$0, { useEffect, useState, useCallback, useMemo, createContext, useContext, memo, forwardRef, useRef } from "react";
|
|
6
|
+
import { initReactI18next, useTranslation, I18nextProvider } from "react-i18next";
|
|
7
|
+
import i18n, { t } from "i18next";
|
|
7
8
|
import { create as create$1 } from "zustand";
|
|
8
9
|
import { Button } from "@/components/ui/button";
|
|
9
10
|
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from "@/components/ui/dialog";
|
|
@@ -22,12 +23,76 @@ import { Switch } from "@/components/ui/switch";
|
|
|
22
23
|
import { X } from "lucide-react";
|
|
23
24
|
import { AnimatePresence, motion } from "framer-motion";
|
|
24
25
|
import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "@/components/ui/accordion";
|
|
25
|
-
import { t } from "i18next";
|
|
26
26
|
import { toast, Toaster } from "sonner";
|
|
27
27
|
import { BrowserProvider, Contract, parseUnits } from "ethers";
|
|
28
28
|
import { isAddress, formatUnits } from "viem";
|
|
29
29
|
import { TonClient, Address as Address$1, beginCell } from "@ton/ton";
|
|
30
30
|
import { TronLinkAdapterName } from "@tronweb3/tronwallet-adapters";
|
|
31
|
+
const common$1 = { "connecting": "Connecting…", "initializing": "Initializing...", "loading": "Loading...", "paste": "paste", "close": "Close", "zeroPlaceholder": "0", "nativeToken": "Native Token" };
|
|
32
|
+
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", "tonKeeper": "TonKeeper", "metaMask": "WalletConnect", "tronLink": "TronLink", "addTronWallet": "Add Tron wallet", "comingSoon": "Coming Soon", "connected": "CONNECTED", "disconnect": "Disconnect", "chooseWallet": "Choose wallet", "oneWalletPerEnv": "You can only connect one wallet per environment.", "connect": "Connect", "connectTronWallet": "Connect Tron wallet", "connectWallet": "Connect wallet" };
|
|
33
|
+
const bridge$1 = { "sourceNetwork": "Source network", "destinationNetwork": "Destination network", "selectToken": "Select token", "selectNetwork": "Select network", "searchToken": "Search token", "searchDestinationChain": "Search destination chain", "myTokens": "My tokens", "allTokens": "All tokens", "willChangeSourceChain": "Will Change Source Chain", "noBalancesFound": "No balances found.", "noResults": "No results", "sendToAnotherAddress": "Send to another address", "youWillReceive": "You will receive", "tonAddressPlaceholder": "TON address", "evmAddressPlaceholder": "0x… EVM address", "addressDoesntMatch": "Address doesn't match the {{network}} network", "checkBeforeTransfer": "Check correctness before transfer" };
|
|
34
|
+
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": "Processing...", "checkingBalance": "Checking balance...", "insufficientBalance": "Insufficient balance", "amountTooSmall": "Min {{min}}", "amountTooLarge": "Max {{max}}", "successTitle": "Success", "bridged": "Bridged", "transferTitle": "Transfer", "hash": "Hash", "route": "Route", "estTime": "Est. Time", "slippage": "Slippage", "minimumReceived": "Minimum received", "totalFee": "Total Fee", "noRouteFound": "No route found", "notEnoughGas": "Not enough gas", "noRouteFoundForSettings": "No route found for current settings.", "tryAdjustSettings": "Try disabling Gas on Destination, or adjust amount/networks.", "quoteError": "Quote error" };
|
|
35
|
+
const app$1 = { "stargateWidgetName": "Stargate Bridge Widget", "liveWidget": "Live Widget", "getStarted": "Get Started" };
|
|
36
|
+
const settings$1 = { "title": "Settings", "gasOnDestination": "Gas on destination", "slippageTolerance": "Slippage tolerance", "routePriority": "Route Priority", "highSlippageWarning": "High slippage warning", "gasPresets": { "auto": "Auto", "none": "None", "medium": "Medium", "max": "Max" }, "routePresets": { "fastest": "Fastest", "cheapest": "Cheapest", "recommended": "Recommended" } };
|
|
37
|
+
const en = {
|
|
38
|
+
common: common$1,
|
|
39
|
+
wallets: wallets$1,
|
|
40
|
+
bridge: bridge$1,
|
|
41
|
+
transaction: transaction$1,
|
|
42
|
+
app: app$1,
|
|
43
|
+
settings: settings$1
|
|
44
|
+
};
|
|
45
|
+
const common = { "connecting": "Подключение…", "initializing": "Инициализация...", "loading": "Загрузка...", "paste": "вставить", "close": "Закрыть", "zeroPlaceholder": "0", "nativeToken": "Нативный токен" };
|
|
46
|
+
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", "tonKeeper": "TonKeeper", "metaMask": "WalletConnect", "tronLink": "TronLink", "addTronWallet": "Добавить Tron кошелёк", "comingSoon": "Скоро", "connected": "ПОДКЛЮЧЕНО", "disconnect": "Отключить", "chooseWallet": "Выберите кошелёк", "oneWalletPerEnv": "Можно подключить только один кошелёк на окружение.", "connect": "Подключить", "connectTronWallet": "Подключить Tron кошелёк", "connectWallet": "Подключить кошелёк" };
|
|
47
|
+
const bridge = { "sourceNetwork": "Исходная сеть", "destinationNetwork": "Целевая сеть", "selectToken": "Выбрать токен", "selectNetwork": "Выбрать сеть", "searchToken": "Поиск токена", "searchDestinationChain": "Поиск целевой сети", "myTokens": "Мои токены", "allTokens": "Все токены", "willChangeSourceChain": "Сменит исходную сеть", "noBalancesFound": "Балансы не найдены.", "noResults": "Нет результатов", "sendToAnotherAddress": "Отправить на другой адрес", "youWillReceive": "Вы получите", "tonAddressPlaceholder": "TON адрес", "evmAddressPlaceholder": "0x… EVM адрес", "addressDoesntMatch": "Адрес не соответствует сети {{network}}", "checkBeforeTransfer": "Проверьте корректность перед переводом" };
|
|
48
|
+
const transaction = { "enterAmount": "Введите сумму", "transfer": "Перевести", "getQuote": "Получить котировку", "quoting": "Расчет котировки...", "failed": "Ошибка транзакции", "confirm": "Подтвердите транзакцию", "signTransaction": "Подпишите транзакцию в кошельке", "inProgress": "Выполнение...", "checkingBalance": "Проверка баланса...", "insufficientBalance": "Недостаточно средств", "amountTooSmall": "Минимум {{min}}", "amountTooLarge": "Максимум {{max}}", "successTitle": "Успех", "bridged": "Переведено", "transferTitle": "Перевод", "hash": "Хэш", "route": "Маршрут", "estTime": "Время", "slippage": "Проскальзывание", "minimumReceived": "Минимум к получению", "totalFee": "Общая комиссия", "noRouteFound": "Маршрут не найден", "notEnoughGas": "Недостаточно газа", "noRouteFoundForSettings": "Маршрут не найден для текущих настроек.", "tryAdjustSettings": "Попробуйте отключить Gas on Destination или измените сумму/сети.", "quoteError": "Ошибка котировки" };
|
|
49
|
+
const app = { "stargateWidgetName": "Виджет Stargate Bridge", "liveWidget": "Живой виджет", "getStarted": "Начало работы" };
|
|
50
|
+
const settings = { "title": "Настройки", "gasOnDestination": "Газ на назначении", "slippageTolerance": "Толерантность к проскальзыванию", "routePriority": "Приоритет маршрута", "highSlippageWarning": "Высокое проскальзывание", "gasPresets": { "auto": "Авто", "none": "Нет", "medium": "Средний", "max": "Макс" }, "routePresets": { "fastest": "Быстрейший", "cheapest": "Дешевейший", "recommended": "Рекомендуемый" } };
|
|
51
|
+
const ru = {
|
|
52
|
+
common,
|
|
53
|
+
wallets,
|
|
54
|
+
bridge,
|
|
55
|
+
transaction,
|
|
56
|
+
app,
|
|
57
|
+
settings
|
|
58
|
+
};
|
|
59
|
+
const bridgeI18n = i18n.createInstance();
|
|
60
|
+
const resources = {
|
|
61
|
+
en: {
|
|
62
|
+
"evaa-bridge": en
|
|
63
|
+
},
|
|
64
|
+
ru: {
|
|
65
|
+
"evaa-bridge": ru
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
bridgeI18n.use(initReactI18next).init({
|
|
69
|
+
resources,
|
|
70
|
+
lng: "en",
|
|
71
|
+
// Will be overridden by defaultLanguage prop
|
|
72
|
+
fallbackLng: "en",
|
|
73
|
+
debug: false,
|
|
74
|
+
// Use a dedicated namespace to avoid conflicts
|
|
75
|
+
defaultNS: "evaa-bridge",
|
|
76
|
+
ns: ["evaa-bridge"],
|
|
77
|
+
interpolation: {
|
|
78
|
+
escapeValue: false
|
|
79
|
+
// react already does escaping
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
function BridgeI18nProvider({
|
|
83
|
+
children,
|
|
84
|
+
defaultLanguage = "en"
|
|
85
|
+
}) {
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (bridgeI18n.language !== defaultLanguage) {
|
|
88
|
+
bridgeI18n.changeLanguage(defaultLanguage);
|
|
89
|
+
}
|
|
90
|
+
}, [defaultLanguage]);
|
|
91
|
+
return /* @__PURE__ */ jsx(I18nextProvider, { i18n: bridgeI18n, children });
|
|
92
|
+
}
|
|
93
|
+
function useBridgeTranslation() {
|
|
94
|
+
return useTranslation("evaa-bridge", { i18n: bridgeI18n });
|
|
95
|
+
}
|
|
31
96
|
const norm = (s) => (s ?? "").toUpperCase().replace(/₮/g, "T").replace(/[^A-Z0-9]/g, "");
|
|
32
97
|
const POPULAR_ORDER = [
|
|
33
98
|
"USDT",
|
|
@@ -808,7 +873,7 @@ const routePresets = [
|
|
|
808
873
|
RoutePriority.RECOMMENDED
|
|
809
874
|
];
|
|
810
875
|
const SettingModal = ({ isOpen, onClose }) => {
|
|
811
|
-
const { t: t2 } =
|
|
876
|
+
const { t: t2 } = useBridgeTranslation();
|
|
812
877
|
const { toChain } = useChainsStore();
|
|
813
878
|
const { tokens } = useTokensStore();
|
|
814
879
|
const {
|
|
@@ -1435,7 +1500,7 @@ const TokenSelectModal = ({
|
|
|
1435
1500
|
items,
|
|
1436
1501
|
onChangeAsset
|
|
1437
1502
|
}) => {
|
|
1438
|
-
const { t: t2 } =
|
|
1503
|
+
const { t: t2 } = useBridgeTranslation();
|
|
1439
1504
|
const {
|
|
1440
1505
|
query,
|
|
1441
1506
|
setQuery,
|
|
@@ -1669,7 +1734,7 @@ const SelectTokenButton = ({
|
|
|
1669
1734
|
onClick,
|
|
1670
1735
|
token
|
|
1671
1736
|
}) => {
|
|
1672
|
-
const { t: t2 } =
|
|
1737
|
+
const { t: t2 } = useBridgeTranslation();
|
|
1673
1738
|
const label = useMemo(() => {
|
|
1674
1739
|
return token?.symbol ?? t2("bridge.selectToken");
|
|
1675
1740
|
}, [token, t2]);
|
|
@@ -1699,7 +1764,7 @@ const SelectTokenButton = ({
|
|
|
1699
1764
|
);
|
|
1700
1765
|
};
|
|
1701
1766
|
const FormHeaderComponent = () => {
|
|
1702
|
-
const { t: t2 } =
|
|
1767
|
+
const { t: t2 } = useBridgeTranslation();
|
|
1703
1768
|
const { isOpen, onClose, onOpen } = useModal();
|
|
1704
1769
|
const {
|
|
1705
1770
|
isOpen: isOpenSettings,
|
|
@@ -2204,7 +2269,7 @@ const SelectNetworkButton = ({
|
|
|
2204
2269
|
onClick,
|
|
2205
2270
|
network
|
|
2206
2271
|
}) => {
|
|
2207
|
-
const { t: t2 } =
|
|
2272
|
+
const { t: t2 } = useBridgeTranslation();
|
|
2208
2273
|
const label = useMemo(() => {
|
|
2209
2274
|
return network?.name ?? t2("bridge.selectNetwork");
|
|
2210
2275
|
}, [network, t2]);
|
|
@@ -2301,7 +2366,7 @@ const ChainSelectModal = ({
|
|
|
2301
2366
|
allowedItems,
|
|
2302
2367
|
onChangeChain
|
|
2303
2368
|
}) => {
|
|
2304
|
-
const { t: t2 } =
|
|
2369
|
+
const { t: t2 } = useBridgeTranslation();
|
|
2305
2370
|
const [query, setQuery] = useState("");
|
|
2306
2371
|
const [isFocused, setIsFocused] = useState(false);
|
|
2307
2372
|
const { setFromChain, chains, fromChain, toChain } = useChainsStore();
|
|
@@ -2446,7 +2511,7 @@ const WalletButton = ({
|
|
|
2446
2511
|
wallet,
|
|
2447
2512
|
addressType
|
|
2448
2513
|
}) => {
|
|
2449
|
-
const { t: t2 } =
|
|
2514
|
+
const { t: t2 } = useBridgeTranslation();
|
|
2450
2515
|
const { onOpen } = useWalletSelectModal();
|
|
2451
2516
|
const { chainRegistry } = useChainStrategies();
|
|
2452
2517
|
const walletType = mapWalletToType(wallet);
|
|
@@ -2633,7 +2698,7 @@ const tonNormalize = (addr) => {
|
|
|
2633
2698
|
}
|
|
2634
2699
|
};
|
|
2635
2700
|
const ToggleRow = ({ enabled, onToggle }) => {
|
|
2636
|
-
const { t: t2 } =
|
|
2701
|
+
const { t: t2 } = useBridgeTranslation();
|
|
2637
2702
|
const { toChain } = useChainsStore();
|
|
2638
2703
|
const { dstAddress } = useAddresses();
|
|
2639
2704
|
const { setCustomDstAddress, clearCustomDstAddress } = useCustomAddressStore();
|
|
@@ -2859,7 +2924,7 @@ function getRouteDisplayName(route) {
|
|
|
2859
2924
|
return route.split(/[/\-_]/).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
|
|
2860
2925
|
}
|
|
2861
2926
|
const Details = () => {
|
|
2862
|
-
const { t: t2 } =
|
|
2927
|
+
const { t: t2 } = useBridgeTranslation();
|
|
2863
2928
|
const { selectedAssetSymbol, assetMatrix, tokens } = useTokensStore();
|
|
2864
2929
|
const { toChain, fromChain, chains } = useChainsStore();
|
|
2865
2930
|
const { quote, status } = useBridgeQuoteStore();
|
|
@@ -3505,7 +3570,7 @@ function useSilentValidations(amountString) {
|
|
|
3505
3570
|
return validationResult;
|
|
3506
3571
|
}
|
|
3507
3572
|
const SubmitButton = () => {
|
|
3508
|
-
const { t: t2 } =
|
|
3573
|
+
const { t: t2 } = useBridgeTranslation();
|
|
3509
3574
|
const { chainRegistry } = useChainStrategies();
|
|
3510
3575
|
const { srcAddress, dstAddress } = useAddresses();
|
|
3511
3576
|
const { quote, status, inputAmount, noRoute } = useBridgeQuoteStore();
|
|
@@ -3600,13 +3665,22 @@ const SubmitButton = () => {
|
|
|
3600
3665
|
}
|
|
3601
3666
|
};
|
|
3602
3667
|
const disabled = isBusy || amountNum <= 0 || status === "loading" || isBalanceLoading || hasInsufficientBalance || hasAmountTooLarge || !gas.hasEnoughGas || noRoute || !isValidForTransfer;
|
|
3603
|
-
return /* @__PURE__ */ jsx(
|
|
3668
|
+
return /* @__PURE__ */ jsx(
|
|
3669
|
+
Button,
|
|
3670
|
+
{
|
|
3671
|
+
onClick: handleClick,
|
|
3672
|
+
disabled,
|
|
3673
|
+
size: "lg",
|
|
3674
|
+
className: "w-full mt-4",
|
|
3675
|
+
children: label
|
|
3676
|
+
}
|
|
3677
|
+
);
|
|
3604
3678
|
};
|
|
3605
3679
|
function short(addr) {
|
|
3606
3680
|
return addr.slice(0, 4) + "…" + addr.slice(-4);
|
|
3607
3681
|
}
|
|
3608
3682
|
const WalletSelectModal = () => {
|
|
3609
|
-
const { t: t2 } =
|
|
3683
|
+
const { t: t2 } = useBridgeTranslation();
|
|
3610
3684
|
const { isOpen, onClose } = useWalletSelectModal();
|
|
3611
3685
|
const { connect, connectors, isPending } = useConnect();
|
|
3612
3686
|
const { chainRegistry } = useChainStrategies();
|
|
@@ -5465,7 +5539,7 @@ var fireworksExports = requireFireworks();
|
|
|
5465
5539
|
const Fireworks = /* @__PURE__ */ getDefaultExportFromCjs(fireworksExports);
|
|
5466
5540
|
const SuccessStep = () => {
|
|
5467
5541
|
const { current, reset } = useTransactionStore();
|
|
5468
|
-
const { t: t2 } =
|
|
5542
|
+
const { t: t2 } = useBridgeTranslation();
|
|
5469
5543
|
const metadata = current?.metadata;
|
|
5470
5544
|
const srcTxHash = current?.srcTxHash;
|
|
5471
5545
|
const handleCopyHash = () => {
|
|
@@ -5684,7 +5758,7 @@ const useCountdown = (initialSeconds) => {
|
|
|
5684
5758
|
};
|
|
5685
5759
|
};
|
|
5686
5760
|
const ConfirmStep = () => {
|
|
5687
|
-
const { t: t2 } =
|
|
5761
|
+
const { t: t2 } = useBridgeTranslation();
|
|
5688
5762
|
const { formatTime } = useCountdown(90);
|
|
5689
5763
|
return /* @__PURE__ */ jsx(Card, { className: "flex flex-col border-none h-full bg-background overflow-hidden rounded-none md:rounded-lg", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex flex-col relative gap-4 py-10 px-8 flex-1 items-center justify-start text-center noise", children: [
|
|
5690
5764
|
/* @__PURE__ */ jsx(TransactionConfirmVector, {}),
|
|
@@ -6659,12 +6733,12 @@ class TonChainStrategy {
|
|
|
6659
6733
|
payload: msg.payload
|
|
6660
6734
|
})
|
|
6661
6735
|
);
|
|
6662
|
-
const
|
|
6736
|
+
const transaction2 = {
|
|
6663
6737
|
validUntil: Math.floor(Date.now() / 1e3) + TON_CONFIG.validUntil,
|
|
6664
6738
|
messages: tonMessages
|
|
6665
6739
|
};
|
|
6666
6740
|
const result = await this.config.tonConnectUI.sendTransaction(
|
|
6667
|
-
|
|
6741
|
+
transaction2
|
|
6668
6742
|
);
|
|
6669
6743
|
return {
|
|
6670
6744
|
chainKey: "ton",
|
|
@@ -7483,7 +7557,7 @@ const EvaaBridgeWithProviders = (props) => {
|
|
|
7483
7557
|
useEffect(() => {
|
|
7484
7558
|
setTronConnected(!!tronConnected);
|
|
7485
7559
|
}, [tronConnected, setTronConnected]);
|
|
7486
|
-
return /* @__PURE__ */ jsx(
|
|
7560
|
+
return /* @__PURE__ */ jsx(BridgeI18nProvider, { defaultLanguage: props.defaultLanguage, children: /* @__PURE__ */ jsx(
|
|
7487
7561
|
ChainStrategyProvider,
|
|
7488
7562
|
{
|
|
7489
7563
|
evmWallet: {
|
|
@@ -7508,7 +7582,7 @@ const EvaaBridgeWithProviders = (props) => {
|
|
|
7508
7582
|
tonApiKey: props.tonApiKey,
|
|
7509
7583
|
children: /* @__PURE__ */ jsx(EvaaBridgeContent, { ...props })
|
|
7510
7584
|
}
|
|
7511
|
-
);
|
|
7585
|
+
) });
|
|
7512
7586
|
};
|
|
7513
7587
|
const EvaaBridgeContent = ({
|
|
7514
7588
|
className,
|
|
@@ -7516,7 +7590,7 @@ const EvaaBridgeContent = ({
|
|
|
7516
7590
|
onAmountChange,
|
|
7517
7591
|
onChainChange
|
|
7518
7592
|
} = {}) => {
|
|
7519
|
-
const { t: t2 } =
|
|
7593
|
+
const { t: t2 } = useBridgeTranslation();
|
|
7520
7594
|
useTokensRequest();
|
|
7521
7595
|
useChainsRequest();
|
|
7522
7596
|
const [sendToAnother, setSendToAnother] = useState(false);
|