UNPKG

@particle-network/connectkit

Version:
1,510 lines (1,475 loc) 77.8 kB
"use client"; import { getLocale, init_locales } from "./chunk-CVABX3CN.mjs"; import { PasskeyIcon_default, init_PasskeyIcon } from "./chunk-WYWSNAPC.mjs"; import { Zerion_default, init_Zerion } from "./chunk-X3AHMJH4.mjs"; import { Rabby_default, init_Rabby } from "./chunk-VM42Y624.mjs"; import { Rainbow_default, init_Rainbow } from "./chunk-3CZRO6RQ.mjs"; import { SafePal_default, init_SafePal } from "./chunk-2LQKVNKI.mjs"; import { Slope_default, init_Slope } from "./chunk-CNE7WI2P.mjs"; import { Talisman_default, init_Talisman } from "./chunk-HKMLJP4P.mjs"; import { TokenPocket_default, init_TokenPocket } from "./chunk-VW7L52Q6.mjs"; import { WalletConnect_default, init_WalletConnect } from "./chunk-BG2VLRRD.mjs"; import { Injected_default, init_Injected } from "./chunk-5TAT3MVW.mjs"; import { Ledger_default, init_Ledger } from "./chunk-AOBFG4R6.mjs"; import { MetaMask_default, init_MetaMask } from "./chunk-KD3UOOP5.mjs"; import { OKX_default, init_OKX } from "./chunk-VYUWVCC2.mjs"; import { ONTO_default, init_ONTO } from "./chunk-HHHJM4FL.mjs"; import { Onekey_default, init_Onekey } from "./chunk-743HT6GA.mjs"; import { Phantom_default, init_Phantom } from "./chunk-3JW6NUP7.mjs"; import { BitKeep_default, init_BitKeep } from "./chunk-Y2AM7F32.mjs"; import { Brave_default, init_Brave } from "./chunk-4EX26J4C.mjs"; import { Bybit_default, init_Bybit } from "./chunk-QT4CBCFK.mjs"; import { Coin98_default, init_Coin98 } from "./chunk-3OVTLX5O.mjs"; import { Coinbase_default, init_Coinbase } from "./chunk-5VTAF6IK.mjs"; import { Frontier_default, init_Frontier } from "./chunk-5KG67Q3H.mjs"; import { ImToken_default, init_ImToken } from "./chunk-PSUGDD7L.mjs"; import { InfinityWallet_default, init_InfinityWallet } from "./chunk-MEE5TGUN.mjs"; import { __esm } from "./chunk-Y7A564BU.mjs"; // src/utils/theme.ts function getSystemMode() { if (typeof window !== "undefined" && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches) { return "dark"; } else { return "light"; } } var init_theme = __esm({ "src/utils/theme.ts"() { "use strict"; } }); // src/utils/deepEqual.ts function deepEqual(a, b) { if (a === b) return true; if (a && b && typeof a === "object" && typeof b === "object") { if (a.constructor !== b.constructor) return false; let length; let i; if (Array.isArray(a) && Array.isArray(b)) { length = a.length; if (length !== b.length) return false; for (i = length; i-- !== 0; ) if (!deepEqual(a[i], b[i])) return false; return true; } if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf(); if (a.toString !== Object.prototype.toString) return a.toString() === b.toString(); const keys = Object.keys(a); length = keys.length; if (length !== Object.keys(b).length) return false; for (i = length; i-- !== 0; ) if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false; for (i = length; i-- !== 0; ) { const key = keys[i]; if (key && !deepEqual(a[key], b[key])) return false; } return true; } return a !== a && b !== b; } var init_deepEqual = __esm({ "src/utils/deepEqual.ts"() { "use strict"; } }); // src/actions/getAccount.ts import { checksumAddress, isAddress } from "viem"; function getAccount(config) { const state = config.state; if (deepEqual(previousState, state)) return previousAccount; const uid = config.state.current; const connection = config.state.connections.get(uid); let addresses = connection?.accounts; if (addresses?.length && addresses.every((account) => isAddress(account, { strict: false }))) { addresses = addresses.map((item) => checksumAddress(item)); } const address = addresses?.[0]; const chain = config.chains.find((chain2) => chain2.id === connection?.chainId); const status = config.state.status; let result; switch (status) { case "connected": result = { address, addresses, chain, chainId: connection?.chainId, connector: connection?.connector, isConnected: true, isConnecting: false, isDisconnected: false, isReconnecting: false, status }; break; case "reconnecting": result = { address, addresses, chain, chainId: connection?.chainId, connector: connection?.connector, isConnected: !!address, isConnecting: false, isDisconnected: false, isReconnecting: true, status }; break; case "connecting": result = { address, addresses, chain, chainId: connection?.chainId, connector: connection?.connector, isConnected: false, isConnecting: true, isDisconnected: false, isReconnecting: false, status }; break; case "disconnected": result = { address: void 0, addresses: void 0, chain: void 0, chainId: void 0, connector: void 0, isConnected: false, isConnecting: false, isDisconnected: true, isReconnecting: false, status }; break; } previousAccount = result; return result; } var previousAccount, previousState; var init_getAccount = __esm({ "src/actions/getAccount.ts"() { "use strict"; init_deepEqual(); } }); // src/actions/watchAccount.ts function watchAccount(config, parameters) { const { onChange } = parameters; return config.subscribe(() => getAccount(config), onChange, { equalityFn(a, b) { const { connector: aConnector, ...aRest } = a; const { connector: bConnector, ...bRest } = b; return deepEqual(aRest, bRest) && aConnector?.id === bConnector?.id && aConnector?.uid === bConnector?.uid; } }); } var init_watchAccount = __esm({ "src/actions/watchAccount.ts"() { "use strict"; init_deepEqual(); init_getAccount(); } }); // src/hooks/useSyncExternalStoreWithTracked.ts import { useRef } from "react"; import { useSyncExternalStoreWithSelector } from "use-sync-external-store/shim/with-selector.js"; function useSyncExternalStoreWithTracked(subscribe, getSnapshot, getServerSnapshot = getSnapshot, isEqual = deepEqual) { const trackedKeys = useRef([]); const result = useSyncExternalStoreWithSelector( subscribe, getSnapshot, getServerSnapshot, (x) => x, (a, b) => { if (isPlainObject(a) && isPlainObject(b) && trackedKeys.current.length) { for (const key of trackedKeys.current) { const equal = isEqual(a[key], b[key]); if (!equal) return false; } return true; } return isEqual(a, b); } ); if (isPlainObject(result)) { const trackedResult = { ...result }; let properties = {}; for (const [key, value] of Object.entries(trackedResult)) { properties = { ...properties, [key]: { configurable: false, enumerable: true, get: () => { if (!trackedKeys.current.includes(key)) { trackedKeys.current.push(key); } return value; } } }; } Object.defineProperties(trackedResult, properties); return trackedResult; } return result; } var isPlainObject; var init_useSyncExternalStoreWithTracked = __esm({ "src/hooks/useSyncExternalStoreWithTracked.ts"() { "use strict"; init_deepEqual(); isPlainObject = (obj) => typeof obj === "object" && !Array.isArray(obj); } }); // src/hooks/useAccount.ts function useAccount() { const { config } = useContext(); return useSyncExternalStoreWithTracked( (onChange) => watchAccount(config, { onChange }), () => getAccount(config) ); } var init_useAccount = __esm({ "src/hooks/useAccount.ts"() { "use strict"; init_getAccount(); init_watchAccount(); init_context(); init_useSyncExternalStoreWithTracked(); } }); // src/hooks/useLocales.ts import { useMemo } from "react"; function useLocales() { const { appearance } = useAppearance(); const language = useMemo(() => { return appearance?.language ?? "en-US"; }, [appearance.language]); const overrideLocales = useMemo(() => { return appearance.overrideLocales; }, [appearance.overrideLocales]); const translations = useMemo(() => { const locales = getLocale(language); const overrideLanguage = overrideLocales?.[language]; return { ...locales, ...overrideLanguage }; }, [language, overrideLocales]); if (!translations) { throw new Error(`Missing translations for ${language}`); } return translations; } var init_useLocales = __esm({ "src/hooks/useLocales.ts"() { "use strict"; init_locales(); init_useAppearance(); } }); // src/hooks/useModalError.ts import { create } from "zustand"; var useModalError; var init_useModalError = __esm({ "src/hooks/useModalError.ts"() { "use strict"; useModalError = create((set) => ({ showError: (value) => { set({ error: value }); }, hideError: () => { set({ error: void 0 }); } })); } }); // src/hooks/useModalState.ts import { create as create2 } from "zustand"; var useModalState; var init_useModalState = __esm({ "src/hooks/useModalState.ts"() { "use strict"; useModalState = create2((set) => ({ open: false, setOpen: (value) => set({ open: value }) })); } }); // src/pages/index.ts import { lazy } from "react"; var Captcha, Connecting, Connectors, DownloadApp, LoginPasskey, PasskeySetup, Receive, SelectChain, Signup, WalletInfo, WalletInfoTitle, Walletconnect, safeRoutes, allRoutes, pages, getPage; var init_pages = __esm({ "src/pages/index.ts"() { "use strict"; Captcha = lazy(() => import("./captcha-BJNUJSLN.mjs")); Connecting = lazy(() => import("./connecting-QIBXOTIY.mjs")); Connectors = lazy(() => import("./connectors-N4MLEWA2.mjs")); DownloadApp = lazy(() => import("./downloadApp-VDOE5ENN.mjs")); LoginPasskey = lazy(() => import("./loginPasskey-SENFOSGO.mjs")); PasskeySetup = lazy(() => import("./passkeySetup-YIKSH3AM.mjs")); Receive = lazy(() => import("./receive-I5TISPW3.mjs")); SelectChain = lazy(() => import("./selectChain-WM7NTLJL.mjs")); Signup = lazy(() => import("./signup-YQFJ523Z.mjs")); WalletInfo = lazy(() => import("./walletInfo-JSCOSP5J.mjs")); WalletInfoTitle = lazy(() => import("./title-NMCACSN6.mjs")); Walletconnect = lazy(() => import("./walletconnect-G6YKRJA3.mjs")); safeRoutes = { connected: ["wallet-info" /* WalletInfo */, "receive" /* Receive */], disconnected: [ "signup" /* Signup */, "connectors" /* Connectors */, "captcha" /* Captcha */, "connecting" /* Connecting */, "download-app" /* DownloadApp */, "select-chain" /* SelectChain */, "walletconnect" /* Walletconnect */, "passkey-setup" /* PasskeySetup */, "login-passkey" /* LoginPasskey */ ] }; allRoutes = [...safeRoutes.connected, ...safeRoutes.disconnected]; pages = [ { title: "signupTitle", path: "signup" /* Signup */, element: Signup }, { title: "connectorsTitle", path: "connectors" /* Connectors */, element: Connectors }, { title: "captchaTitle", path: "captcha" /* Captcha */, element: Captcha }, { path: "connecting" /* Connecting */, element: Connecting }, { path: "download-app" /* DownloadApp */, element: DownloadApp }, { title: "scanWithPhone", path: "walletconnect" /* Walletconnect */, element: Walletconnect }, { title: "selectChainTitle", path: "select-chain" /* SelectChain */, element: SelectChain }, { title: WalletInfoTitle, path: "wallet-info" /* WalletInfo */, element: WalletInfo }, { title: "receive", path: "receive" /* Receive */, element: Receive }, { title: "setupPasskey", path: "passkey-setup" /* PasskeySetup */, element: PasskeySetup }, { title: "usePasskeyToLogin", path: "login-passkey" /* LoginPasskey */, element: LoginPasskey } ]; getPage = (path) => { const page = pages.find((item) => item.path === path); if (!page) { throw new Error("route path undefined"); } return page; }; } }); // src/hooks/useRouteState.ts import { create as create3 } from "zustand"; var initialState, useRouteState; var init_useRouteState = __esm({ "src/hooks/useRouteState.ts"() { "use strict"; initialState = { path: "signup" /* Signup */ }; useRouteState = create3((set) => ({ route: initialState, setRoute: (value) => { if (typeof value === "string") { set({ route: { path: value } }); } else { set({ route: value }); } } })); } }); // src/hooks/useRouter.ts import { useCallback } from "react"; var useRouter; var init_useRouter = __esm({ "src/hooks/useRouter.ts"() { "use strict"; init_pages(); init_useAccount(); init_useModalState(); init_useRouteState(); useRouter = () => { const { setOpen, open } = useModalState(); const setRoute = useRouteState((state) => state.setRoute); const { isConnected } = useAccount(); const navigate = (route, state) => { let validRoute = route; if (!allRoutes.includes(route)) { validRoute = isConnected ? "wallet-info" /* WalletInfo */ : "signup" /* Signup */; } if (isConnected) { if (!safeRoutes.connected.includes(route)) { validRoute = "wallet-info" /* WalletInfo */; } } else { if (!safeRoutes.disconnected.includes(route)) { validRoute = "signup" /* Signup */; } } if (!open) { setOpen(true); } setRoute({ path: validRoute, state }); }; const close = useCallback(() => { setOpen(false); }, [setOpen]); return { navigate, close, isOpen: open }; }; } }); // src/components/connectModal/index.tsx import { lazy as lazy2, useCallback as useCallback2, useEffect, useMemo as useMemo2 } from "react"; import { jsx } from "react/jsx-runtime"; var Modal, ConnectModal, connectModal_default; var init_connectModal = __esm({ "src/components/connectModal/index.tsx"() { "use strict"; init_useAccount(); init_useLocales(); init_useModalError(); init_useModalState(); init_useRouteState(); init_useRouter(); init_pages(); Modal = lazy2(() => import("./modal-XFCSOAZD.mjs")); ConnectModal = () => { const { setOpen, open } = useModalState(); const { route } = useRouteState(); const { navigate } = useRouter(); const locales = useLocales(); const { hideError } = useModalError(); const { isConnected } = useAccount(); useEffect(() => { setOpen(false); }, [isConnected, setOpen]); useEffect(() => { hideError(); }, [route, hideError]); const { element: PageElement, title, state } = useMemo2(() => { const page = getPage(route.path); return { ...page, state: route.state }; }, [route]); const onClose = useCallback2(() => { setOpen(false); }, [setOpen]); const onBack = useCallback2(() => { navigate("signup" /* Signup */); }, [navigate]); const isCanBack = useMemo2(() => route.path !== "signup" /* Signup */ && route.path !== "wallet-info" /* WalletInfo */, [route.path]); return /* @__PURE__ */ jsx( Modal, { open, onClose, title: typeof title === "string" ? locales[title] : title, onBack: isCanBack ? onBack : void 0, children: /* @__PURE__ */ jsx(PageElement, { ...state }) } ); }; connectModal_default = ConnectModal; } }); // src/utils/index.ts import { detect } from "detect-browser"; import { formatUnits } from "viem/utils"; function formatStringNumber(num, n) { let [integerPart, decimalPart] = num.split("."); if (!decimalPart) { return integerPart; } decimalPart = decimalPart.slice(0, n); decimalPart = decimalPart.replace(/0+$/, ""); if (decimalPart === "") { return integerPart; } return `${integerPart}.${decimalPart}`; } function getElementDimensionsRelativeToParent(ref) { if (!ref.current) { return null; } const element = ref.current; const parent = element.parentElement; if (!parent) { return null; } const elementRect = element.getBoundingClientRect(); const parentRect = parent.getBoundingClientRect(); const topDistance = elementRect.top - parentRect.top; const bottomDistance = parentRect.bottom - elementRect.bottom; const dimensions = { width: elementRect.width, height: elementRect.height, topDistance, bottomDistance }; return dimensions; } function getBuyUrl(chainId, address, currency = "USD", theme = "light", language = "en-US") { const RAMP_WEB_URL = "https://ramp.particle.network"; const supportedNetworks = { "1": ["Ethereum", "ETH"], "10": ["Optimism", "ETH"], "56": ["Binance Smart Chain", "BNB"], "101": ["Solana", "SOL"], "137": ["Polygon", "MATIC"], "204": ["opBNB", "BNB"], "324": ["Zksync", "ETH"], "5000": ["Mantle", "MNT"], "8453": ["Base", "ETH"], "42161": ["Arbitrum One", "ETH"], "42220": ["Celo", "CELO"], "43114": ["Avalanche", "AVAX"], "728126428": ["Tron", "TRX"] }; if (!chainId || !address || !supportedNetworks[chainId]) { return ""; } const chainName = supportedNetworks[chainId]?.[0] || ""; const cryptoCoin = supportedNetworks[chainId]?.[1] || "ETH"; const buyParams = { walletAddress: address, fiatCoin: currency, cryptoCoin, chainName, showBackButton: false, theme, language }; const queryString = new URLSearchParams(buyParams).toString(); return `${RAMP_WEB_URL}/?${queryString}`; } function popupWindow(url, title, w, h) { const left = screen.width / 2 - w / 2; const top = screen.height / 2 - h / 2; return window.open( url, title, "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=" + w + ", height=" + h + ", top=" + top + ", left=" + left ); } function hexToRgbaColor(hex, alpha) { if (!hex) { return ""; } hex = hex.replace(/^#/, ""); if (hex.length === 3) { hex = hex.split("").map((char) => char + char).join(""); } if (!/^[0-9A-Fa-f]{6}$/.test(hex)) { throw new Error("Invalid hex color format"); } if (typeof alpha !== "number" || alpha < 0 || alpha > 1) { throw new Error("Alpha value must be a number between 0 and 1"); } const r = parseInt(hex.slice(0, 2), 16); const g = parseInt(hex.slice(2, 4), 16); const b = parseInt(hex.slice(4, 6), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } var detectOS, isIOS, isAndroid, isMobile, hexToRgba, shortAddress, openMobileUrl, hasPCDownloadUrl, formatTokenAmount, roundToEven, isFirstRegisterPasskey, setFirstRegisterPasskey; var init_utils = __esm({ "src/utils/index.ts"() { "use strict"; detectOS = () => { const browser = detect(); return browser?.os ?? ""; }; isIOS = () => { const os = detectOS(); return os.toLowerCase().includes("ios"); }; isAndroid = () => { const os = detectOS(); return os.toLowerCase().includes("android"); }; isMobile = () => { return isAndroid() || isIOS(); }; hexToRgba = (hex, alpha) => { let r = 0, g = 0, b = 0; if (hex.length === 4) { r = parseInt(hex[1] + hex[1], 16); g = parseInt(hex[2] + hex[2], 16); b = parseInt(hex[3] + hex[3], 16); } else if (hex.length === 7) { r = parseInt(hex[1] + hex[2], 16); g = parseInt(hex[3] + hex[4], 16); b = parseInt(hex[5] + hex[6], 16); } return `rgba(${r}, ${g}, ${b}, ${alpha})`; }; shortAddress = (address) => { if (!address) { return ""; } if (address.length <= 10) { return address; } return `${address.slice(0, 6)}...${address.slice(-4)}`; }; openMobileUrl = (url) => { if (url.startsWith("http")) { const link = document.createElement("a"); link.href = url; link.target = "_blank"; link.rel = "noreferrer noopener"; link.click(); } else { window.location.href = url; } }; hasPCDownloadUrl = (walletProps) => { return Boolean( walletProps.downloadUrls?.chrome || walletProps.downloadUrls?.brave || walletProps.downloadUrls?.edge || walletProps.downloadUrls?.firefox || walletProps.downloadUrls?.safari ); }; formatTokenAmount = (value, decimal, decimalPlaces = 9) => { if (!value) return "0"; if (typeof value === "string" || typeof value === "number") { value = BigInt(value); } let result = formatUnits(value, decimal); const [integerPart, decimalPart] = result.split("."); if (decimalPlaces >= 5 && integerPart === "0" && decimalPart?.startsWith("".padEnd(decimalPlaces, "0"))) { return "<0.".padEnd(decimalPlaces + 3 - 1, "0") + "1"; } result = formatStringNumber(result, decimalPlaces); return result; }; roundToEven = (value) => { return Math.floor(value / 2) * 2; }; isFirstRegisterPasskey = () => { return localStorage.getItem("passkeyRegistrationStatus") !== "completed"; }; setFirstRegisterPasskey = () => { localStorage.setItem("passkeyRegistrationStatus", "completed"); }; } }); // src/styles/themes/dark.ts var darkTheme, dark_default; var init_dark = __esm({ "src/styles/themes/dark.ts"() { "use strict"; darkTheme = { "--pcm-overlay-background": "rgba(0,0,0,0.4)", "--pcm-modal-box-shadow": "0px 6px 20px 6px rgba(0, 0, 0, 0.1)", "--pcm-body-background": "#1C1D22", "--pcm-body-background-secondary": "#41424A", "--pcm-body-background-tertiary": "#232529", "--pcm-body-color": "#ffffff", "--pcm-body-color-secondary": "#8B8EA1", "--pcm-body-color-tertiary": "#42444B", "--pcm-body-action-color": "#808080", "--pcm-button-border-color": "#292B36", "--pcm-accent-color": "#A257FA", "--pcm-button-font-weight": "500", "--pcm-button-hover-shadow": "0px 2px 4px rgba(255, 255, 255, 0.05)", "--pcm-primary-button-color": "#000000", "--pcm-primary-button-bankground": "#FFFFFF", "--pcm-primary-button-hover-background": "#f5f5f5", "--pcm-secondary-button-color": "#FFFFFF", "--pcm-secondary-button-bankground": "#41424A", "--pcm-secondary-button-hover-background": "#5A5B66" }; dark_default = darkTheme; } }); // src/styles/themes/light.ts var lightTheme, light_default; var init_light = __esm({ "src/styles/themes/light.ts"() { "use strict"; lightTheme = { "--pcm-overlay-background": "rgba(71, 88, 107, 0.24)", "--pcm-modal-box-shadow": "0px 2px 4px rgba(0, 0, 0, 0.1)", "--pcm-body-background": "#ffffff", "--pcm-body-background-secondary": "#EFF0F2", "--pcm-body-background-tertiary": "#F9F9FA", "--pcm-body-color": "#181B1E", "--pcm-body-color-secondary": "#8B8EA1", "--pcm-body-color-tertiary": "#DCDFE6", "--pcm-body-action-color": "#999999", "--pcm-button-border-color": "#EAECF0", "--pcm-accent-color": "#A257FA", "--pcm-button-font-weight": "500", "--pcm-button-hover-shadow": "0px 2px 4px rgba(0, 0, 0, 0.05)", "--pcm-primary-button-color": "#ffffff", "--pcm-primary-button-bankground": "#181B1E", "--pcm-primary-button-hover-background": "#353738", "--pcm-secondary-button-color": "#181B1E", "--pcm-secondary-button-bankground": "#EFF0F2", "--pcm-secondary-button-hover-background": "#D9DBDD" }; light_default = lightTheme; } }); // src/styles/themes/index.ts var base, themes_default; var init_themes = __esm({ "src/styles/themes/index.ts"() { "use strict"; init_dark(); init_light(); base = { dark: dark_default, light: light_default }; themes_default = { base }; } }); // src/styles/index.ts import { motion } from "framer-motion"; import { css, styled } from "styled-components"; var getWalletOption, mergeThemes, getAuthCoreTheme, themeGlobals, themeColors, createCssVars, themes, mode, ThemeContainer; var init_styles = __esm({ "src/styles/index.ts"() { "use strict"; init_utils(); init_theme(); init_themes(); init_dark(); init_light(); getWalletOption = (appearance) => { let theme = appearance?.mode ?? getSystemMode(); if (theme === "auto") { theme = getSystemMode(); } let themeConfig = theme === "light" ? light_default : dark_default; themeConfig = mergeThemes({ ...themeGlobals.default, ...themeConfig }, appearance?.theme || {}); const walletTheme = {}; walletTheme.colorAccent = themeConfig["--pcm-accent-color"]; walletTheme.colorPrimary = themeConfig["--pcm-body-background"]; walletTheme.colorOnPrimary = themeConfig["--pcm-primary-button-color"]; walletTheme.primaryButtonBackgroundColors = [ themeConfig["--pcm-primary-button-bankground"], themeConfig["--pcm-primary-button-hover-background"] ]; walletTheme.primaryIconButtonBackgroundColors = [ themeConfig["--pcm-accent-color"], themeConfig["--pcm-accent-color"] ]; walletTheme.primaryIconTextColor = themeConfig["--pcm-secondary-button-color"]; walletTheme.primaryButtonTextColor = themeConfig["--pcm-primary-button-color"]; walletTheme.cancelButtonBackgroundColor = themeConfig["--pcm-secondary-button-bankground"]; walletTheme.backgroundColors = [ themeConfig["--pcm-body-background-secondary"], [ [themeConfig["--pcm-body-background"], themeConfig["--pcm-body-background"]], [themeConfig["--pcm-body-background"], themeConfig["--pcm-body-background"]] ] ]; walletTheme.messageColors = [themeConfig["--pcm-success-color"], themeConfig["--pcm-error-color"]]; walletTheme.borderGlowColors = [themeConfig["--pcm-accent-color"], themeConfig["--pcm-body-color"]]; walletTheme.modalMaskBackgroundColor = themeConfig["--pcm-overlay-background"]; walletTheme.cardBorderRadius = parseInt(themeConfig["--pcm-rounded-xl"]); const options = { themeType: theme, customStyle: { [theme]: walletTheme }, language: appearance?.language }; return options; }; mergeThemes = (base2, override) => { const result = { ...base2 }; Object.keys(override).forEach((key) => { if (Object.prototype.hasOwnProperty.call(override, key) && override[key] !== "") { result[key] = override[key]; } }); return result; }; getAuthCoreTheme = (appearance) => { let theme = appearance?.mode ?? getSystemMode(); if (theme === "auto") { theme = getSystemMode(); } let themeConfig = theme === "light" ? light_default : dark_default; themeConfig = mergeThemes({ ...themeGlobals.default, ...themeConfig }, appearance?.theme || {}); const authTheme = { primaryBtnColor: themeConfig["--pcm-primary-button-color"], primaryBtnBackgroundColor: themeConfig["--pcm-primary-button-bankground"], textColor: themeConfig["--pcm-body-color"], secondaryTextColor: themeConfig["--pcm-body-color-secondary"], themeBackgroundColor: themeConfig["--pcm-body-background"], iconBorderColor: themeConfig["--pcm-button-border-color"], accentColor: themeConfig["--pcm-accent-color"], inputBackgroundColor: themeConfig["--pcm-body-background-secondary"], inputBorderColor: themeConfig["--pcm-button-border-color"], inputPlaceholderColor: themeConfig["--pcm-body-color-tertiary"], cardBorderColor: themeConfig["--pcm-button-border-color"], cardUnclickableBackgroundColor: themeConfig["--pcm-body-background-tertiary"], cardUnclickableBorderColor: themeConfig["--pcm-button-border-color"], cardDividerColor: themeConfig["--pcm-button-border-color"], tagBackgroundColor: themeConfig["--pcm-body-background-secondary"], modalBackgroundColor: themeConfig["--pcm-body-background"], tipsBackgroundColor: themeConfig["--pcm-body-background-secondary"], primaryBtnBorderRadius: themeConfig["--pcm-rounded-lg"], cardBorderRadius: themeConfig["--pcm-rounded-md"], modalBorderRadius: themeConfig["--pcm-rounded-lg"] }; return authTheme; }; themeGlobals = { default: { "--pcm-font-family": `-apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, 'Apple Color Emoji', Arial, sans-serif, 'Segoe UI Emoji', 'Segoe UI Symbol'`, "--pcm-overlay-backdrop-filter": "blur(6px)", "--pcm-rounded-sm": "4px", "--pcm-rounded-md": "8px", "--pcm-rounded-lg": "11px", "--pcm-rounded-xl": "22px", "--pcm-rounded-full": "9999px", "--pcm-error-color": "#EA4335", "--pcm-error-background": hexToRgba("#EA4335", 0.2), "--pcm-success-color": "#58C08F", "--pcm-success-background": hexToRgba("#58C08F", 0.2), "--pcm-warning-color": "#F59E0A", "--pcm-warning-background": hexToRgba("#F59E0A", 0.2), "--pcm-wallet-lable-color": "#33C759", "--pcm-wallet-lable-background": hexToRgba("#33C759", 0.2) } }; themeColors = { light: themes_default.base.light, dark: themes_default.base.dark }; createCssVars = (scheme, override) => { const important = override ? " !important" : ""; return css` ${Object.keys(scheme).map((key) => { const value = scheme[key]; return value && `${key}:${value}${important};`; })} `; }; themes = { default: createCssVars(themeGlobals.default), light: createCssVars(themeColors.light), dark: createCssVars(themeColors.dark) }; mode = "auto"; ThemeContainer = styled(motion.div)` ${themes.default} ${(props) => { if (props.$useMode === "light") { mode = "light"; return themes.light; } else if (props.$useMode === "dark") { mode = "dark"; return themes.dark; } else { return css` @media (prefers-color-scheme: light) { ${themes.light} } @media (prefers-color-scheme: dark) { ${themes.dark} } `; } }} ${(props) => { if (props.$useTheme) { return createCssVars(props.$useTheme, true); } return void 0; }} ${(props) => { if (props.$useTheme) { const merge = {}; if (props.$useTheme["--pcm-success-color"]) { merge["--pcm-success-background"] = hexToRgba(props.$useTheme["--pcm-success-color"], 0.2); } if (props.$useTheme["--pcm-warning-color"]) { merge["--pcm-warning-background"] = hexToRgba(props.$useTheme["--pcm-warning-color"], 0.2); } if (props.$useTheme["--pcm-error-color"]) { merge["--pcm-error-background"] = hexToRgba(props.$useTheme["--pcm-error-color"], 0.2); } if (props.$useTheme["--pcm-wallet-lable-color"]) { merge["--pcm-wallet-lable-background"] = hexToRgba(props.$useTheme["--pcm-wallet-lable-color"], 0.2); } return createCssVars(merge, true); } return void 0; }} all: initial; text-align: left; text-direction: ltr; text-rendering: optimizeLegibility; -webkit-font-smoothing: auto; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-text-stroke: 0.001px transparent; text-size-adjust: none; font-size: 16px; color: var(--pcm-body-color); &, * { font-family: var(--pcm-font-family); box-sizing: border-box; &:after, &:before { box-sizing: border-box; border: 0 solid #e5e7eb; } } img, svg { max-width: 100%; overflow: visible; } strong { font-weight: 600; } input:focus-visible, a:focus-visible, button:focus-visible { outline: 1px solid var(--pcm-focus-color, var(--pcm-accent-color)); } input { caret-color: var(--pcm-focus-color, var(--pcm-accent-color)); } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } `; } }); // src/hooks/useAAPlugin.ts import { create as create4 } from "zustand"; var useAAPlugin; var init_useAAPlugin = __esm({ "src/hooks/useAAPlugin.ts"() { "use strict"; useAAPlugin = create4((set) => ({ smartAccount: null, setSmartAccount: (value) => { set({ smartAccount: value }); } })); } }); // src/actions/getConnections.ts function getConnections(config) { if (config.state.status === "reconnecting") return previousConnections; const connections = [...config.state.connections.values()]; const current = config.state.current; connections.sort((a, b) => { if (a.connector.uid === current) { return -1; } if (b.connector.uid === current) { return 1; } return 0; }); if (deepEqual(previousConnections, connections)) return previousConnections; previousConnections = connections; return connections; } var previousConnections; var init_getConnections = __esm({ "src/actions/getConnections.ts"() { "use strict"; init_deepEqual(); previousConnections = []; } }); // src/actions/watchConnections.ts function watchConnections(config, parameters) { const { onChange } = parameters; return config.subscribe(() => getConnections(config), onChange, { equalityFn: deepEqual }); } var init_watchConnections = __esm({ "src/actions/watchConnections.ts"() { "use strict"; init_deepEqual(); init_getConnections(); } }); // src/hooks/useConnections.ts import { useSyncExternalStore } from "react"; function useConnections() { const { config } = useContext(); return useSyncExternalStore( (onChange) => watchConnections(config, { onChange }), () => getConnections(config), () => getConnections(config) ); } var init_useConnections = __esm({ "src/hooks/useConnections.ts"() { "use strict"; init_getConnections(); init_watchConnections(); init_context(); } }); // src/config/wallet.tsx import { jsx as jsx2 } from "react/jsx-runtime"; var walletConfigs, isCoinbase, isWalletConnect, isPasskeySmartWallet; var init_wallet = __esm({ "src/config/wallet.tsx"() { "use strict"; init_PasskeyIcon(); init_BitKeep(); init_Brave(); init_Bybit(); init_Coin98(); init_Coinbase(); init_Frontier(); init_ImToken(); init_InfinityWallet(); init_Injected(); init_Ledger(); init_MetaMask(); init_OKX(); init_ONTO(); init_Onekey(); init_Phantom(); init_Rabby(); init_Rainbow(); init_SafePal(); init_Slope(); init_Talisman(); init_TokenPocket(); init_Trust(); init_WalletConnect(); init_Zerion(); init_utils(); walletConfigs = { "particleEVM, particleSolana, network.particle": { name: "Particle Auth", iconShape: "circle" }, "coinbaseWallet, coinbaseWalletSDK, com.coinbase.wallet": { name: "Coinbase Wallet", shortName: "Coinbase", icon: /* @__PURE__ */ jsx2(Coinbase_default, {}), iconShape: "squircle", downloadUrls: { website: "https://www.coinbase.com/wallet/getting-started-extension", chrome: "https://chrome.google.com/webstore/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad", brave: "https://chromewebstore.google.com/detail/coinbase-wallet-extension/hnfanknocfeofbddgcijnmhnfnkdnaad", android: "https://play.google.com/store/apps/details?id=org.toshi", ios: "https://apps.apple.com/app/coinbase-wallet-store-crypto/id1278383455" }, getWalletConnectDeeplink: (uri) => { return uri; }, getDAppBrowserDeeplink: (uri) => { return `https://go.cb-w.com/dapp?cb_url=${encodeURIComponent(uri)}`; } }, "metaMask, io.metamask, io.metamask.mobile": { name: "MetaMask", icon: /* @__PURE__ */ jsx2(MetaMask_default, {}), iconShouldShrink: true, downloadUrls: { website: "https://metamask.io/download/", chrome: "https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn", firefox: "https://addons.mozilla.org/firefox/addon/ether-metamask/", brave: "https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn", edge: "https://microsoftedge.microsoft.com/addons/detail/metamask/ejbalbakoplchlghecdalmeeeajnimhm", android: "https://play.google.com/store/apps/details?id=io.metamask", ios: "https://apps.apple.com/app/metamask/id1438144202" }, getWalletConnectDeeplink: (uri) => { return isAndroid() || isIOS() ? `metamask://wc?uri=${encodeURIComponent(uri)}` : `https://metamask.app.link/wc?uri=${encodeURIComponent(uri)}`; } }, "phantom, app.phantom": { name: "Phantom", iconShape: "squircle", icon: /* @__PURE__ */ jsx2(Phantom_default, {}), downloadUrls: { website: "https://phantom.app/download", chrome: "https://chromewebstore.google.com/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa", brave: "https://chromewebstore.google.com/detail/phantom/bfnaelmomeimhlpmgjnjophhpkkoljpa", firefox: "https://addons.mozilla.org/en-US/firefox/addon/phantom-app/", android: "https://play.google.com/store/apps/details?id=app.phantom", ios: "https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977" }, getDAppBrowserDeeplink: (uri) => { return `https://phantom.app/ul/browse/${encodeURIComponent(uri)}?ref=${encodeURIComponent(window.location.origin)}`; } }, "okxWallet, oKExWallet, com.okex.wallet": { name: "OKX Wallet", shortName: "OKX", iconShape: "squircle", icon: /* @__PURE__ */ jsx2(OKX_default, {}), downloadUrls: { website: "https://www.okx.com/download", chrome: "https://chromewebstore.google.com/detail/%E6%AC%A7%E6%98%93-web3-%E9%92%B1%E5%8C%85/mcohilncbfahbmgdjkbpemcciiolgcge", edge: "https://microsoftedge.microsoft.com/addons/detail/okx-wallet/pbpjkcldjiffchgbbndmhojiacbgflha", brave: "https://chromewebstore.google.com/detail/%E6%AC%A7%E6%98%93-web3-%E9%92%B1%E5%8C%85/mcohilncbfahbmgdjkbpemcciiolgcge", android: "https://play.google.com/store/apps/details?id=com.okinc.okex.gp", ios: "https://apps.apple.com/us/app/okx-buy-bitcoin-btc-crypto/id1327268470" }, getWalletConnectDeeplink: (uri) => { return `okex://main/wc?uri=${encodeURIComponent(uri)}`; }, getDAppBrowserDeeplink: (uri) => { const deepLink = `okx://wallet/dapp/url?dappUrl=${encodeURIComponent(uri)}`; return `https://www.okx.com/download?deeplink=${encodeURIComponent(deepLink)}`; } }, "bitKeep, bitget, com.bitget.web3": { name: "Bitget Wallet", shortName: "Bitget", iconShape: "circle", icon: /* @__PURE__ */ jsx2(BitKeep_default, {}), downloadUrls: { website: "https://web3.bitget.com/wallet-download", chrome: "https://chromewebstore.google.com/detail/bitget-wallet-formerly-bi/jiidiaalihmmhddjgbnbgdfflelocpak", android: "https://play.google.com/store/apps/details?id=com.bitkeep.wallet", ios: "https://apps.apple.com/us/app/bitget-wallet-ex-bitkeep/id1395301115" }, getWalletConnectDeeplink: (uri) => { return `bitkeep://wc?uri=${encodeURIComponent(uri)}`; }, getDAppBrowserDeeplink: (uri) => { return `https://bkcode.vip?action=dapp&url=${encodeURIComponent(uri)}`; } }, "rabby, io.rabby": { name: "Rabby Wallet", shortName: "Rabby", icon: /* @__PURE__ */ jsx2(Rabby_default, {}), downloadUrls: { website: "https://rabby.io", chrome: "https://chrome.google.com/webstore/detail/rabby-wallet/acmacodkjbdgmoleebolmdjonilkdbch" } }, "rainbow, me.rainbow": { name: "Rainbow Wallet", shortName: "Rainbow", icon: /* @__PURE__ */ jsx2(Rainbow_default, {}), iconShape: "squircle", downloadUrls: { website: "https://rainbow.me/?utm_source=connectkit", chrome: "https://chrome.google.com/webstore/detail/opfgelmcmbiajamepnmloijbpoleiama", edge: "https://microsoftedge.microsoft.com/addons/detail/cpojfbodiccabbabgimdeohkkpjfpbnf", firefox: "https://addons.mozilla.org/firefox/addon/rainbow-extension", brave: "https://rainbow.me/extension?utm_source=connectkit", android: "https://play.google.com/store/apps/details?id=me.rainbow", ios: "https://apps.apple.com/app/id1457119021" }, getWalletConnectDeeplink: (uri) => { return isAndroid() || isIOS() ? `rainbow://wc?uri=${encodeURIComponent(uri)}&connector=rainbowkit` : `https://rnbwapp.com/wc?uri=${encodeURIComponent(uri)}&connector=rainbowkit`; } }, "talisman, xyz.talisman": { name: "Talisman", shortName: "Talisman", icon: /* @__PURE__ */ jsx2(Talisman_default, {}), iconShape: "squircle", downloadUrls: { website: "https://talisman.xyz", chrome: "https://chrome.google.com/webstore/detail/talisman-polkadot-wallet/fijngjgcjhjmmpcmkeiomlglpeiijkld", firefox: "https://addons.mozilla.org/en-US/firefox/addon/talisman-wallet-extension/", brave: "https://chromewebstore.google.com/detail/talisman-ethereum-and-pol/fijngjgcjhjmmpcmkeiomlglpeiijkld" } }, "trust, trustWallet, com.trustwallet.app": { name: "Trust Wallet", shortName: "Trust", icon: /* @__PURE__ */ jsx2(Trust_default, {}), iconShouldShrink: true, downloadUrls: { website: "https://trustwallet.com/download", chrome: "https://chromewebstore.google.com/detail/trust-wallet/egjidjbpglichdcondbcbdnbeeppgdph", android: "https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp", ios: "https://apps.apple.com/app/trust-crypto-bitcoin-wallet/id1288339409" }, getWalletConnectDeeplink(uri) { return isAndroid() || isIOS() ? `trust://wc?uri=${encodeURIComponent(uri)}` : `https://link.trustwallet.com/wc?uri=${encodeURIComponent(uri)}`; }, getDAppBrowserDeeplink: (uri) => { return `https://link.trustwallet.com/open_url?url=${encodeURIComponent(uri)}`; } }, "com.crypto.wallet": { name: "Crypto.com", shortName: "Crypto" }, "frontier, xyz.frontier.wallet": { name: "Frontier Wallet", shortName: "Frontier", icon: /* @__PURE__ */ jsx2(Frontier_default, {}), downloadUrls: { website: "https://www.frontier.xyz/download", chrome: "https://chrome.google.com/webstore/detail/frontier-wallet/kppfdiipphfccemcignhifpjkapfbihd", brave: "https://chromewebstore.google.com/detail/frontier-wallet/kppfdiipphfccemcignhifpjkapfbihd", android: "https://play.google.com/store/apps/details?id=com.frontierwallet", ios: "https://apps.apple.com/app/frontier-crypto-defi-wallet/id1482380988" }, getWalletConnectDeeplink: (uri) => { return `frontier://wc?uri=${encodeURIComponent(uri)}`; } }, infinityWallet: { name: "Infinity Wallet", icon: /* @__PURE__ */ jsx2(InfinityWallet_default, {}), downloadUrls: { website: "https://infinitywallet.io/download", chrome: "https://infinitywallet.io/download", firefox: "https://infinitywallet.io/download", brave: "https://infinitywallet.io/download", edge: "https://infinitywallet.io/download" } }, imToken: { name: "imToken", icon: /* @__PURE__ */ jsx2(ImToken_default, {}), downloadUrls: { website: "https://token.im/download", android: "https://play.google.com/store/apps/details?id=im.token.app", ios: "https://itunes.apple.com/us/app/imtoken2/id1384798940" }, getWalletConnectDeeplink: (uri) => { return `imtokenv2://wc?uri=${encodeURIComponent(uri)}`; } }, onto: { name: "ONTO", icon: /* @__PURE__ */ jsx2(ONTO_default, {}), downloadUrls: { website: "https://onto.app/en/download/", chrome: "https://chromewebstore.google.com/detail/onto-wallet/ifckdpamphokdglkkdomedpdegcjhjdp", ios: "https://apps.apple.com/app/onto-an-ontology-dapp/id1436009823", android: "https://play.google.com/store/apps/details?id=com.github.ontio.onto" }, getWalletConnectDeeplink: (uri) => { return isAndroid() ? uri : `https://onto.app/wc?uri=${encodeURIComponent(uri)}`; } }, ledger: { name: "Ledger Live", shortName: "Ledger", icon: /* @__PURE__ */ jsx2(Ledger_default, {}), downloadUrls: { website: "https://www.ledger.com/ledger-live/download#download-device-2", android: "https://play.google.com/store/apps/details?id=com.ledger.live", ios: "https://apps.apple.com/app/ledger-live-web3-wallet/id1361671700" }, getWalletConnectDeeplink: (uri) => { return `ledgerlive://wc?uri=${encodeURIComponent(uri)}`; } }, "zerion, io.zerion.wallet": { name: "Zerion", icon: /* @__PURE__ */ jsx2(Zerion_default, {}), downloadUrls: { website: "https://zerion.io/download", chrome: "https://chromewebstore.google.com/detail/zerion-wallet-for-web3-nf/klghhnkeealcohjjanjjdaeeggmfmlpl", brave: "https://chromewebstore.google.com/detail/zerion-wallet-for-web3-nf/klghhnkeealcohjjanjjdaeeggmfmlpl", ios: "https://apps.apple.com/app/apple-store/id1456732565", android: "https://play.google.com/store/apps/details?id=io.zerion.android" }, getWalletConnectDeeplink: (uri) => { return isAndroid() || isIOS() ? `zerion://wc?uri=${encodeURIComponent(uri)}` : `https://app.zerion.io/wc?uri=${encodeURIComponent(uri)}`; } }, slope: { name: "Slope", icon: /* @__PURE__ */ jsx2(Slope_default, {}), downloadUrls: { website: "https://slope.finance/", chrome: "https://chrome.google.com/webstore/detail/slope-wallet/pocmplpaccanhmnllbbkpgfliimjljgo", ios: "https://apps.apple.com/app/slope-wallet/id1574624530", android: "https://play.google.com/store/apps/details?id=com.wd.wallet" }, getWalletConnectDeeplink: (uri) => { return isAndroid() ? uri : `https://slope.finance/app/wc?uri=${encodeURIComponent(uri)}`; } }, "tokenPocket, pro.tokenpocket": { name: "TokenPocket", icon: /* @__PURE__ */ jsx2(TokenPocket_default, {}), downloadUrls: { website: "https://www.tokenpocket.pro/en/download/app", chrome: "https://chrome.google.com/webstore/detail/tokenpocket/mfgccjchihfkkindfppnaooecgfneiii", android: "https://play.google.com/store/apps/details?id=vip.mytokenpocket", ios: "https://apps.apple.com/us/app/tp-global-wallet/id6444625622" }, getWalletConnectDeeplink: (uri) => { return `tpoutside://wc?uri=${encodeURIComponent(uri)}`; } }, "safePal, https://www.safepal.com/download": { name: "SafePal", icon: /* @__PURE__ */ jsx2(SafePal_default, {}), iconShape: "circle", downloadUrls: { website: "https://www.safepal.com/download", chrome: "https://chrome.google.com/webstore/detail/lgmpcpglpngdoalbgeoldeajfclnhafa", edge: "https://microsoftedge.microsoft.com/addons/detail/apenkfbbpmhihehmihndmmcdanacolnh", firefox: "https://addons.mozilla.org/firefox/addon/safepal-extension-wallet", android: "https://play.google.com/store/apps/details?id=io.safepal.wallet", ios: "https://apps.apple.com/app/id1548297139" }, getWalletConnectDeeplink: (uri) => { return isAndroid() || isIOS() ? `safepalwallet://wc?uri=${encodeURIComponent(uri)}` : `https://link.safepal.io/wc?uri=${encodeURIComponent(uri)}`; } }, "coin98, coin98.com": { name: "Coin98", shortName: "Coin98", icon: /* @__PURE__ */ jsx2(Coin98_default, {}), iconShape: "circle", downl