@hfunlabs/hypurr-connect 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 +0 -1
- package/dist/index.d.ts +128 -9
- package/dist/index.js +2568 -13
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/DeleteWalletModal.tsx +344 -0
- package/src/HypurrConnectProvider.tsx +29 -18
- package/src/RenameWalletModal.tsx +325 -0
- package/src/UserProfileModal.tsx +982 -0
- package/src/WalletSelectorDropdown.tsx +797 -0
- package/src/icons/lucide.tsx +197 -0
- package/src/index.ts +9 -0
- package/src/profileStyles.ts +213 -0
- package/src/types.ts +4 -10
- package/src/TelegramLoginWidget.tsx +0 -62
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/HypurrConnectProvider.tsx","../src/privateKeySigner.ts","../src/agent.ts","../src/grpc.ts","../src/GrpcExchangeTransport.ts","../src/LoginModal.tsx","../src/icons/MetaMaskColorIcon.tsx","../src/icons/TelegramColorIcon.tsx","../src/types.ts"],"sourcesContent":["import {\n ExchangeClient,\n HttpTransport,\n type IRequestTransport,\n} from \"@hfunlabs/hyperliquid\";\nimport {\n signUserSignedAction,\n type AbstractViemLocalAccount,\n} from \"@hfunlabs/hyperliquid/signing\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramUserResponse } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type {\n TelegramUser as HypurrTelegramUser,\n TelegramChatWalletPack,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n AGENT_NAME,\n clearAgent as clearStoredAgent,\n fetchActiveAgent,\n generateAgentKey,\n isAgentValid,\n isDeadAgentError,\n loadAgent,\n saveAgent,\n} from \"./agent\";\nimport { createStaticClient, createTelegramClient } from \"./grpc\";\nimport { GrpcExchangeTransport } from \"./GrpcExchangeTransport\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\nimport type {\n AuthMethod,\n EoaSigner,\n EvmTransactionRequest,\n Hex,\n HypurrConnectConfig,\n HypurrConnectState,\n HypurrUser,\n SignTypedDataFn,\n StoredAgent,\n} from \"./types\";\n\n/** @internal context value — extends the public type with fields used only by library internals */\ninterface InternalConnectState extends HypurrConnectState {\n loginTelegram: () => void;\n botUsername: string;\n useWidget: boolean;\n}\n\nconst TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-jwt\";\nconst LEGACY_TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-user\";\nconst TELEGRAM_AUTH_STATE_KEY = \"hypurr-connect-auth-state\";\nconst TELEGRAM_AUTH_MESSAGE = \"hypurr-connect:telegram-auth\";\nconst DEFAULT_AUTH_HUB_URL = \"https://auth.hypurr.fun/login\";\nconst DEFAULT_MEDIA_URL = \"https://media.hypurr.fun\";\nconst IGNORED_EXTERNAL_SIGNATURE =\n \"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b\" as const;\nconst DEFAULT_TELEGRAM_SCOPES = [\n \"telegram:user:read\",\n \"telegram:wallet:read\",\n \"telegram:wallet:write\",\n \"telegram:trade:read\",\n \"telegram:trade:write\",\n \"telegram:cabal:read\",\n \"telegram:cabal:write\",\n \"telegram:agent:write\",\n \"telegram:support:read\",\n \"telegram:support:write\",\n];\n\nfunction createExternalSigningWallet(address: Hex): AbstractViemLocalAccount {\n return {\n address,\n signTypedData(params) {\n void params;\n return Promise.resolve(IGNORED_EXTERNAL_SIGNATURE);\n },\n };\n}\n\nfunction isInvalidTelegramAuthError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n msg,\n );\n}\n\nfunction normalizeMediaUrl(mediaUrl?: string): string {\n return (mediaUrl?.trim() || DEFAULT_MEDIA_URL).replace(/\\/+$/, \"\");\n}\n\nfunction isAddress(value?: string | null): value is Hex {\n return !!value && /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\nfunction getRawSignedTransaction(result: unknown): Hex | null {\n if (typeof result === \"string\" && result.startsWith(\"0x\")) {\n return result as Hex;\n }\n if (!result || typeof result !== \"object\") return null;\n\n const record = result as Record<string, unknown>;\n const candidates = [\n record.raw,\n record.rawTransaction,\n record.signedTransaction,\n record.serializedTransaction,\n record.result,\n ];\n const raw = candidates.find(\n (value): value is string =>\n typeof value === \"string\" && value.startsWith(\"0x\"),\n );\n return raw ? (raw as Hex) : null;\n}\n\nfunction decodeJsonBytes(bytes: Uint8Array): unknown {\n const text = new TextDecoder().decode(bytes);\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction encodeJsonBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(value));\n}\n\nfunction withExpectedFrom(\n transaction: EvmTransactionRequest,\n address: Hex,\n): EvmTransactionRequest {\n if (\n transaction.from &&\n transaction.from.toLowerCase() !== address.toLowerCase()\n ) {\n throw new Error(\n \"[HypurrConnect] EVM transaction `from` does not match the connected wallet.\",\n );\n }\n return transaction.from ? transaction : { ...transaction, from: address };\n}\n\nfunction currentReturnTo(): string {\n const url = new URL(window.location.href);\n for (const param of [\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n url.searchParams.delete(param);\n }\n return url.toString();\n}\n\nfunction randomState(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\nfunction normalizeScopes(scope?: string | string[]): string {\n if (Array.isArray(scope)) return scope.join(\" \");\n return scope?.trim() || DEFAULT_TELEGRAM_SCOPES.join(\" \");\n}\n\nfunction isTelegramAuthMessage(data: unknown): data is {\n type: typeof TELEGRAM_AUTH_MESSAGE;\n token: string;\n state: string;\n} {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"type\" in data &&\n \"token\" in data &&\n \"state\" in data &&\n (data as { type: unknown }).type === TELEGRAM_AUTH_MESSAGE &&\n typeof (data as { token: unknown }).token === \"string\" &&\n typeof (data as { state: unknown }).state === \"string\"\n );\n}\n\nconst HypurrConnectContext = createContext<InternalConnectState | null>(null);\n\nexport function useHypurrConnect(): HypurrConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnect must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\n/** @internal — gives library components access to fields not on the public API */\nexport function useHypurrConnectInternal(): InternalConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnectInternal must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\nexport function HypurrConnectProvider({\n config,\n children,\n}: {\n config: HypurrConnectConfig;\n children: ReactNode;\n}) {\n const tgClient = useMemo(() => createTelegramClient(config), [config]);\n const staticClient = useMemo(() => createStaticClient(config), [config]);\n\n // ── Telegram auth state ──────────────────────────────────────\n const [tgAuthToken, setTgAuthToken] = useState<string | null>(() => {\n try {\n return localStorage.getItem(TELEGRAM_STORAGE_KEY);\n } catch {\n return null;\n }\n });\n const [tgUser, setTgUser] = useState<HypurrTelegramUser | null>(null);\n const [tgLoading, setTgLoading] = useState(false);\n const [tgError, setTgError] = useState<string | null>(null);\n\n const authDataMap = useMemo(() => ({}), []);\n const telegramRpcOptions = useMemo<RpcOptions | undefined>(\n () =>\n tgAuthToken\n ? { meta: { authorization: `Bearer ${tgAuthToken}` } }\n : undefined,\n [tgAuthToken],\n );\n\n const [tgUserTick, setTgUserTick] = useState(0);\n\n // Auto-disconnect when the server rejects telegram auth data.\n const onInvalidAuthRef = useRef<(() => void) | null>(null);\n onInvalidAuthRef.current = () => {\n console.warn(\n \"[HypurrConnect] Invalid Telegram auth token — disconnecting.\",\n );\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n };\n\n const acceptTelegramToken = useCallback((token: string) => {\n setTgAuthToken(token);\n setTgError(null);\n localStorage.setItem(TELEGRAM_STORAGE_KEY, token);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\");\n if (!token) {\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n return;\n }\n\n const callbackState = params.get(\"state\") ?? \"\";\n\n if (window.opener && window.opener !== window) {\n window.opener.postMessage(\n {\n type: TELEGRAM_AUTH_MESSAGE,\n token,\n state: callbackState,\n },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || callbackState !== expectedState) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n acceptTelegramToken(token);\n\n const cleanUrl = new URL(window.location.href);\n for (const param of [\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n cleanUrl.searchParams.delete(param);\n }\n window.history.replaceState({}, document.title, cleanUrl.toString());\n }, [acceptTelegramToken]);\n\n useEffect(() => {\n function onMessage(event: MessageEvent) {\n if (event.origin !== window.location.origin) return;\n if (!isTelegramAuthMessage(event.data)) return;\n\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || event.data.state !== expectedState) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n acceptTelegramToken(event.data.token);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [acceptTelegramToken]);\n\n useEffect(() => {\n if (!tgAuthToken || !telegramRpcOptions) return;\n let cancelled = false;\n setTgLoading(true);\n setTgError(null);\n\n (async () => {\n try {\n const [{ response: userResp }, { response: walletsResp }] =\n await Promise.all([\n tgClient.telegramUser({ authData: {} }, telegramRpcOptions),\n tgClient.telegramUserWallets({ authData: {} }, telegramRpcOptions),\n ]);\n if (cancelled) return;\n const user = (userResp as TelegramUserResponse).user ?? null;\n if (user) {\n // TelegramUser.wallets lacks twap/scale sessions; replace with\n // the full wallets from TelegramUserWallets which populates them.\n user.wallets = walletsResp.wallets;\n }\n setTgUser(user);\n } catch (err) {\n if (cancelled) return;\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n console.error(\"[HypurrConnect] gRPC TelegramUser failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n } finally {\n if (!cancelled) setTgLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [tgAuthToken, telegramRpcOptions, tgClient, tgUserTick]);\n\n // ── EOA auth state ───────────────────────────────────────────\n const [eoaAddress, setEoaAddress] = useState<`0x${string}` | null>(null);\n const [agent, setAgent] = useState<StoredAgent | null>(null);\n const [eoaLoading, setEoaLoading] = useState(false);\n const [eoaError, setEoaError] = useState<string | null>(null);\n const eoaSignerRef = useRef<EoaSigner | null>(null);\n\n // ── Derived auth ─────────────────────────────────────────────\n const authMethod: AuthMethod = tgAuthToken\n ? \"telegram\"\n : eoaAddress\n ? \"eoa\"\n : null;\n\n // ── Multi-wallet state (Telegram) ─────────────────────────────\n const [wallets, setWallets] = useState<HyperliquidWallet[]>([]);\n const [selectedWalletId, setSelectedWalletId] = useState<number>(0);\n const [packs, setPacks] = useState<TelegramChatWalletPack[]>([]);\n\n const refreshWallets = useCallback(() => setTgUserTick((t) => t + 1), []);\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !tgUser) {\n setWallets([]);\n setSelectedWalletId(0);\n setPacks([]);\n return;\n }\n\n const userWallets = tgUser.wallets ?? [];\n setWallets(userWallets);\n setPacks(tgUser.packs ?? []);\n\n const defaultId = tgUser.walletId || userWallets[0]?.id || 0;\n setSelectedWalletId((prev) => {\n if (prev && userWallets.some((w) => w.id === prev)) return prev;\n return defaultId;\n });\n }, [authMethod, tgUser]);\n\n const selectedWallet = useMemo(\n () => wallets.find((w) => w.id === selectedWalletId) ?? wallets[0] ?? null,\n [wallets, selectedWalletId],\n );\n\n const selectWallet = useCallback(\n (walletId: number) => {\n if (wallets.some((w) => w.id === walletId)) {\n setSelectedWalletId(walletId);\n }\n },\n [wallets],\n );\n\n // ── Session poller (TWAP + Scale for selected wallet) ──────\n const pollInterval = config.sessionPollInterval ?? 5_000;\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !selectedWalletId || !pollInterval) return;\n\n let cancelled = false;\n\n const poll = async () => {\n try {\n const [{ response: twapResp }, { response: scaleResp }] =\n await Promise.all([\n tgClient.hyperliquidWalletTwapSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n tgClient.hyperliquidWalletScaleSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n ]);\n if (cancelled) return;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: twapResp.sessions,\n scaleSessions: scaleResp.sessions,\n }\n : w,\n ),\n );\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n // Silently ignore poll errors — next tick will retry.\n }\n };\n\n // Fire immediately on mount / wallet switch, then on interval.\n poll();\n const id = setInterval(poll, pollInterval);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [\n authMethod,\n selectedWalletId,\n pollInterval,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const user = useMemo<HypurrUser | null>(() => {\n if (tgAuthToken && authMethod === \"telegram\" && selectedWallet && tgUser) {\n const mediaUrl = normalizeMediaUrl(config.mediaUrl);\n return {\n address: selectedWallet.ethereumAddress,\n walletId: selectedWallet.id,\n displayName: tgUser.telegramUsername\n ? `@${tgUser.telegramUsername}`\n : `Telegram ${tgUser.telegramId}`,\n photoUrl: tgUser.pictureFileId\n ? `${mediaUrl}/${tgUser.pictureFileId}`\n : undefined,\n authMethod: \"telegram\",\n telegramId: String(tgUser.telegramId),\n hfunScore: tgUser?.reputation?.hfunScore,\n reputationScore: tgUser?.reputation?.reputationScore,\n };\n }\n if (eoaAddress && authMethod === \"eoa\") {\n return {\n address: eoaAddress,\n walletId: 0,\n displayName: `${eoaAddress.slice(0, 6)}...${eoaAddress.slice(-4)}`,\n authMethod: \"eoa\",\n };\n }\n return null;\n }, [\n tgAuthToken,\n selectedWallet,\n eoaAddress,\n authMethod,\n tgUser,\n config.mediaUrl,\n ]);\n\n // ── Exchange client ──────────────────────────────────────────\n // Telegram: dummy local wallet → GrpcExchangeTransport → HyperliquidCoreAction (server signs)\n // EOA: dual wallet — agent key for L1 actions, master signer for user-signed\n // actions (transfers, withdrawals, etc.). The dual wallet inspects the\n // EIP-712 domain name to decide which key signs each request.\n // When a signer is available but no agent exists yet, the dual wallet\n // auto-provisions an agent on the first L1 action (triggers one extra\n // wallet popup for the approveAgent user-signed action).\n\n const onDeadAgentRef = useRef<((address: `0x${string}`) => void) | null>(\n null,\n );\n onDeadAgentRef.current = (addr: `0x${string}`) => {\n clearStoredAgent(addr);\n setAgent(null);\n setEoaError(\"Agent expired or was deregistered. Please reconnect.\");\n };\n\n // Mutable slot for the agent signer — the dual wallet reads this so it can\n // pick up a newly provisioned agent without waiting for a React re-render.\n const agentSignerRef = useRef<PrivateKeySigner | null>(\n agent ? new PrivateKeySigner(agent.privateKey) : null,\n );\n useEffect(() => {\n agentSignerRef.current = agent\n ? new PrivateKeySigner(agent.privateKey)\n : null;\n }, [agent]);\n\n // Lock to prevent concurrent auto-provisioning attempts\n const provisioningRef = useRef<Promise<PrivateKeySigner> | null>(null);\n\n const agentReady =\n authMethod === \"telegram\" || (authMethod === \"eoa\" && !!agent);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const exchange = useMemo<ExchangeClient<any> | null>(() => {\n if (authMethod === \"telegram\" && user?.address) {\n const transport = new GrpcExchangeTransport({\n isTestnet: config.isTestnet ?? false,\n telegramClient: tgClient,\n rpcOptions: telegramRpcOptions,\n walletId: user.walletId,\n onAuthError: () => onInvalidAuthRef.current?.(),\n });\n return new ExchangeClient({\n transport,\n wallet: createExternalSigningWallet(user.address as Hex),\n });\n }\n\n if (authMethod === \"eoa\" && eoaAddress) {\n const hasSigner = !!eoaSignerRef.current;\n\n if (!agent && !hasSigner) {\n const noAgentTransport: IRequestTransport = {\n isTestnet: config.isTestnet ?? false,\n request(): Promise<never> {\n throw new Error(\n \"[HypurrConnect] No agent key approved and no wallet signer available. \" +\n \"Either call approveAgent(signTypedDataAsync) or pass a signer to \" +\n \"connectEoa(address, { signTypedData, chainId }).\",\n );\n },\n };\n return new ExchangeClient({\n transport: noAgentTransport,\n wallet: createExternalSigningWallet(eoaAddress),\n });\n }\n\n const isTestnet = config.isTestnet ?? false;\n const inner = new HttpTransport({ isTestnet });\n const deadAgentAddr = eoaAddress;\n const guardedTransport: IRequestTransport = {\n isTestnet: inner.isTestnet,\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n try {\n return await inner.request<T>(endpoint, payload, signal);\n } catch (err) {\n if (endpoint === \"exchange\" && isDeadAgentError(err)) {\n onDeadAgentRef.current?.(deadAgentAddr);\n }\n throw err;\n }\n },\n };\n\n const signerRef = eoaSignerRef;\n const agentRef = agentSignerRef;\n const provRef = provisioningRef;\n const ownerAddress = eoaAddress;\n\n /**\n * Auto-provision an agent key when one doesn't exist yet.\n *\n * Bypasses the SDK's `executeUserSignedAction` (and its per-address\n * semaphore) to avoid deadlocking when called from inside\n * `dualWallet.signTypedData`, which is already inside the SDK's\n * `executeL1Action` lock for the same address.\n */\n const ensureAgent = async (): Promise<PrivateKeySigner> => {\n const existing = agentRef.current;\n if (existing) return existing;\n\n if (provRef.current) return provRef.current;\n\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available to auto-provision agent. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n\n provRef.current = (async () => {\n try {\n const { privateKey, address: agentAddress } =\n await generateAgentKey();\n\n const chainIdHex =\n `0x${signer.chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signer.signTypedData(params);\n },\n getAddresses: async () => [ownerAddress] as `0x${string}`[],\n getChainId: async () => signer.chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api-ui.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(ownerAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(ownerAddress, stored);\n\n const newSigner = new PrivateKeySigner(privateKey);\n agentRef.current = newSigner;\n setAgent(stored);\n\n return newSigner;\n } finally {\n provRef.current = null;\n }\n })();\n\n return provRef.current;\n };\n\n // Dual wallet: routes signing based on the EIP-712 domain.\n // \"Exchange\" domain → L1 action → agent key signs (auto-provisions if needed).\n // \"HyperliquidSignTransaction\" domain → user-signed → master wallet (popup).\n const dualWallet: AbstractViemLocalAccount = {\n address: ownerAddress,\n async signTypedData(params): Promise<`0x${string}`> {\n if (params.domain.name === \"HyperliquidSignTransaction\") {\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available for user-signed actions. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n return signer.signTypedData(\n params as Parameters<typeof signer.signTypedData>[0],\n );\n }\n\n const agentSigner = await ensureAgent();\n return agentSigner.signTypedData(params);\n },\n };\n\n return new ExchangeClient({\n transport: guardedTransport,\n wallet: dualWallet,\n signatureChainId: () => {\n const id = signerRef.current?.chainId ?? 42161;\n return `0x${id.toString(16)}` as `0x${string}`;\n },\n });\n }\n\n return null;\n }, [\n authMethod,\n user,\n agent,\n eoaAddress,\n config.isTestnet,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const handleClearAgent = useCallback(() => {\n if (eoaAddress) {\n clearStoredAgent(eoaAddress);\n setAgent(null);\n }\n }, [eoaAddress]);\n\n const signEvmTransaction = useCallback(\n async (transaction: EvmTransactionRequest): Promise<Hex> => {\n if (authMethod === \"eoa\") {\n if (!eoaAddress) {\n throw new Error(\"[HypurrConnect] No EOA wallet connected.\");\n }\n\n const signer = eoaSignerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No EOA signer available. Pass a signer to connectEoa(address, signer).\",\n );\n }\n\n const tx = withExpectedFrom(transaction, eoaAddress);\n const result = signer.signTransaction\n ? await signer.signTransaction(tx)\n : signer.request\n ? await signer.request({\n method: \"eth_signTransaction\",\n params: [tx],\n })\n : null;\n const rawTransaction = getRawSignedTransaction(result);\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] EOA signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n }\n\n if (authMethod === \"telegram\") {\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n if (!selectedWallet) {\n throw new Error(\"[HypurrConnect] No Telegram wallet selected.\");\n }\n if (\n selectedWallet.id <= 0 ||\n selectedWallet.isReadOnly ||\n selectedWallet.isAgent\n ) {\n throw new Error(\n \"[HypurrConnect] Select a Telegram private-key wallet to sign EVM transactions.\",\n );\n }\n if (!isAddress(selectedWallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Selected Telegram wallet does not have a valid EVM address.\",\n );\n }\n\n const tx = withExpectedFrom(\n transaction,\n selectedWallet.ethereumAddress,\n );\n try {\n const signResponse = await tgClient.eVMSignTransaction(\n {\n authData: {},\n walletId: selectedWallet.id,\n params: encodeJsonBytes(tx),\n },\n telegramRpcOptions,\n );\n const rawTransaction = getRawSignedTransaction(\n decodeJsonBytes(signResponse.response.result),\n );\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] Telegram signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n }\n throw err;\n }\n }\n\n throw new Error(\"[HypurrConnect] No wallet connected.\");\n },\n [authMethod, eoaAddress, selectedWallet, telegramRpcOptions, tgClient],\n );\n\n // ── Wallet management (Telegram only) ───────────────────────\n const createWallet = useCallback(\n async (name: string): Promise<HyperliquidWallet> => {\n const { response } = await tgClient.hyperliquidWalletCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n if (!response.wallet)\n throw new Error(\"Wallet creation returned no wallet\");\n return response.wallet;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const deleteWallet = useCallback(\n async (walletId: number): Promise<void> => {\n await tgClient.hyperliquidWalletDelete(\n {\n authData: {},\n walletId,\n },\n telegramRpcOptions,\n );\n if (walletId === selectedWalletId) {\n const remaining = wallets.filter((w) => w.id !== walletId);\n setSelectedWalletId(remaining[0]?.id ?? 0);\n }\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, selectedWalletId, wallets, refreshWallets],\n );\n\n const createWalletPack = useCallback(\n async (name: string): Promise<number> => {\n const { response } = await tgClient.telegramChatWalletPackCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n return response.packId;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const addPackLabel = useCallback(\n async (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelAdd(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const modifyPackLabel = useCallback(\n async (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelModify(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const removePackLabel = useCallback(\n async (params: { walletLabel: string; packId: number }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelRemove(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n // ── TWAP session management (Telegram only) ─────────────────\n const createTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"TWAP creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, twapSessions: [...w.twapSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const modifyTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapModify>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapModify(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session) throw new Error(\"TWAP modify returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.map((s) =>\n s.id === session.id ? session : s,\n ),\n }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelTwap = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidTwapCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n twapSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.filter((s) => s.id !== sessionId),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Scale session management (Telegram only) ───────────────\n const createScale = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidScaleCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidScaleCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"Scale creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, scaleSessions: [...w.scaleSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelScale = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidScaleCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n scaleSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n scaleSessions: w.scaleSessions.filter(\n (s) => s.id !== sessionId,\n ),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Login modal state ────────────────────────────────────────\n const [loginModalOpen, setLoginModalOpen] = useState(false);\n const openLoginModal = useCallback(() => setLoginModalOpen(true), []);\n const closeLoginModal = useCallback(() => setLoginModalOpen(false), []);\n\n // ── Auth actions ─────────────────────────────────────────────\n const loginTelegram = useCallback(() => {\n const state = randomState();\n sessionStorage.setItem(TELEGRAM_AUTH_STATE_KEY, state);\n\n const configuredReturnTo = config.telegram.returnTo;\n const returnTo =\n typeof configuredReturnTo === \"function\"\n ? configuredReturnTo()\n : configuredReturnTo || currentReturnTo();\n\n const authUrl = new URL(config.telegram.authHubUrl || DEFAULT_AUTH_HUB_URL);\n authUrl.searchParams.set(\"return_to\", returnTo);\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"scope\", normalizeScopes(config.telegram.scope));\n\n const width = 520;\n const height = 720;\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\n const popup = window.open(\n authUrl.toString(),\n \"hypurr_telegram_auth\",\n [\n `width=${width}`,\n `height=${height}`,\n `left=${Math.round(left)}`,\n `top=${Math.round(top)}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n ].join(\",\"),\n );\n\n if (popup) {\n popup.focus();\n return;\n }\n\n window.location.assign(authUrl.toString());\n }, [\n config.telegram.authHubUrl,\n config.telegram.returnTo,\n config.telegram.scope,\n ]);\n\n const connectEoa = useCallback(\n (address: `0x${string}`, signer?: EoaSigner) => {\n eoaSignerRef.current = signer ?? null;\n setEoaAddress(address);\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n setEoaError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n\n const existing = loadAgent(address);\n if (existing && existing.validUntil > Date.now()) {\n setAgent(existing);\n } else {\n if (existing) clearStoredAgent(address);\n setAgent(null);\n }\n },\n [],\n );\n\n const approveAgentFn = useCallback(\n async (signTypedDataAsync: SignTypedDataFn, chainId: number) => {\n if (!eoaAddress) {\n throw new Error(\n \"[HypurrConnect] Cannot approve agent: no EOA wallet connected. Call connectEoa(address) first.\",\n );\n }\n\n const currentSigner = eoaSignerRef.current;\n eoaSignerRef.current = {\n signTypedData: signTypedDataAsync,\n signTransaction: currentSigner?.signTransaction,\n request: currentSigner?.request,\n chainId,\n };\n\n setEoaLoading(true);\n setEoaError(null);\n try {\n const existing = loadAgent(eoaAddress);\n if (existing) {\n const isTestnet = config.isTestnet ?? false;\n const valid = await isAgentValid(existing, eoaAddress, isTestnet);\n if (valid) {\n setAgent(existing);\n return;\n }\n clearStoredAgent(eoaAddress);\n }\n\n const { privateKey, address: agentAddress } = await generateAgentKey();\n const isTestnet = config.isTestnet ?? false;\n\n const chainIdHex = `0x${chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signTypedDataAsync(params);\n },\n getAddresses: async () => [eoaAddress] as `0x${string}`[],\n getChainId: async () => chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(eoaAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(eoaAddress, stored);\n setAgent(stored);\n } catch (err) {\n console.error(\"[HypurrConnect] EOA agent approval failed:\", err);\n setEoaError(err instanceof Error ? err.message : String(err));\n setAgent(null);\n } finally {\n setEoaLoading(false);\n }\n },\n [eoaAddress, config.isTestnet],\n );\n\n const logout = useCallback(() => {\n setTgUser(null);\n setTgError(null);\n setTgAuthToken(null);\n setEoaAddress(null);\n setAgent(null);\n setEoaError(null);\n eoaSignerRef.current = null;\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n // ── Context value ────────────────────────────────────────────\n const value = useMemo<InternalConnectState>(\n () => ({\n user,\n isLoggedIn: !!user,\n isLoading: tgLoading || eoaLoading,\n error: tgError ?? eoaError,\n authMethod,\n exchange,\n\n wallets,\n selectedWalletId,\n selectWallet,\n\n createWallet,\n deleteWallet,\n refreshWallets,\n\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n\n createTwap,\n modifyTwap,\n cancelTwap,\n\n createScale,\n cancelScale,\n\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgent: approveAgentFn,\n logout,\n\n agent,\n agentReady,\n clearAgent: handleClearAgent,\n\n botId: config.telegram?.botId ?? \"\",\n botUsername: config.telegram?.botUsername ?? \"\",\n useWidget: config.telegram?.useWidget ?? false,\n\n authDataMap,\n authToken: tgAuthToken,\n telegramRpcOptions,\n telegramClient: tgClient,\n staticClient,\n }),\n [\n user,\n tgLoading,\n eoaLoading,\n tgError,\n eoaError,\n authMethod,\n exchange,\n wallets,\n selectedWalletId,\n selectWallet,\n createWallet,\n deleteWallet,\n refreshWallets,\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n createTwap,\n modifyTwap,\n cancelTwap,\n createScale,\n cancelScale,\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgentFn,\n logout,\n agent,\n agentReady,\n handleClearAgent,\n config.telegram?.botId,\n config.telegram?.botUsername,\n config.telegram?.useWidget,\n authDataMap,\n tgAuthToken,\n telegramRpcOptions,\n tgClient,\n staticClient,\n ],\n );\n\n return (\n <HypurrConnectContext.Provider value={value}>\n {children}\n </HypurrConnectContext.Provider>\n );\n}\n","import type { AbstractViemLocalAccount } from \"@hfunlabs/hyperliquid/signing\";\nimport { privateKeyToAccount, type PrivateKeyAccount } from \"viem/accounts\";\nimport type { Hex } from \"./types\";\n\ntype SignTypedDataParams = Parameters<\n AbstractViemLocalAccount[\"signTypedData\"]\n>[0];\n\n/**\n * Compatibility wrapper for SDK versions that removed PrivateKeySigner.\n *\n * It exposes the viem local-account shape accepted by the Hyperliquid SDK.\n */\nexport class PrivateKeySigner implements AbstractViemLocalAccount {\n #account: PrivateKeyAccount;\n readonly address: Hex;\n\n constructor(privateKey: string) {\n this.#account = privateKeyToAccount(normalizePrivateKey(privateKey));\n this.address = this.#account.address;\n }\n\n signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return this.#account.signTypedData(\n params as Parameters<PrivateKeyAccount[\"signTypedData\"]>[0],\n );\n }\n}\n\nfunction normalizePrivateKey(privateKey: string): Hex {\n return (privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`) as Hex;\n}\n","import type { StoredAgent } from \"./types\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\n\nexport const AGENT_NAME = \"hypurr-connect\";\n\nconst AGENT_STORAGE_PREFIX = \"hypurr-connect-agent\";\n\nfunction storageKey(masterAddress: string): string {\n return `${AGENT_STORAGE_PREFIX}:${masterAddress.toLowerCase()}`;\n}\n\nexport function loadAgent(masterAddress: string): StoredAgent | null {\n try {\n const raw = localStorage.getItem(storageKey(masterAddress));\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nexport function saveAgent(masterAddress: string, agent: StoredAgent): void {\n localStorage.setItem(storageKey(masterAddress), JSON.stringify(agent));\n}\n\nexport function clearAgent(masterAddress: string): void {\n localStorage.removeItem(storageKey(masterAddress));\n}\n\n/**\n * Generate a random 32-byte private key and derive its address using the\n * local PrivateKeySigner compatibility wrapper.\n */\nexport async function generateAgentKey(): Promise<{\n privateKey: `0x${string}`;\n address: `0x${string}`;\n}> {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const privateKey = `0x${hex}` as `0x${string}`;\n\n const signer = new PrivateKeySigner(privateKey);\n return { privateKey, address: signer.address };\n}\n\ninterface ExtraAgent {\n address: string;\n name: string;\n validUntil: number;\n}\n\n/**\n * Query the Hyperliquid info API for the named agents registered to a user.\n * Returns the matching entry for AGENT_NAME if it exists and is still valid.\n */\nexport async function fetchActiveAgent(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const url = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/info\"\n : \"https://api.hyperliquid.xyz/info\";\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type: \"extraAgents\", user: userAddress }),\n });\n\n if (!res.ok) return null;\n\n const agents: unknown = await res.json();\n if (!Array.isArray(agents)) return null;\n\n const nowMs = Date.now();\n const match = (agents as ExtraAgent[]).find(\n (a) => a.name === AGENT_NAME && a.validUntil * 1000 > nowMs,\n );\n if (!match) return null;\n return { ...match, validUntil: match.validUntil * 1000 };\n}\n\n/**\n * Checks whether a stored agent is still valid: the address must appear in the\n * on-chain `extraAgents` list and not be expired.\n */\nexport async function isAgentValid(\n stored: StoredAgent,\n userAddress: string,\n isTestnet: boolean,\n): Promise<boolean> {\n if (stored.validUntil <= Date.now()) return false;\n\n const remote = await fetchActiveAgent(userAddress, isTestnet);\n if (!remote) return false;\n\n return (\n remote.address.toLowerCase() === stored.address.toLowerCase() &&\n remote.validUntil > Date.now()\n );\n}\n\nconst DEAD_AGENT_PATTERNS = [\n /agent address .+ is not valid/i,\n /unknown signer/i,\n /not authorized/i,\n /not an agent/i,\n];\n\n/**\n * Returns true if the error indicates the agent has been pruned, expired,\n * or is otherwise no longer registered on-chain.\n */\nexport function isDeadAgentError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return DEAD_AGENT_PATTERNS.some((p) => p.test(msg));\n}\n","import { GrpcWebFetchTransport } from \"@protobuf-ts/grpcweb-transport\";\nimport { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type { HypurrConnectConfig } from \"./types\";\n\nconst DEFAULT_GRPC_URL = \"https://grpc.hypurr.fun\";\n\nfunction createTransport(config: HypurrConnectConfig) {\n return new GrpcWebFetchTransport({\n baseUrl: config.grpcUrl ?? DEFAULT_GRPC_URL,\n timeout: config.grpcTimeout ?? 15_000,\n });\n}\n\nexport function createTelegramClient(\n config: HypurrConnectConfig,\n): TelegramClient {\n return new TelegramClient(createTransport(config));\n}\n\nexport function createStaticClient(config: HypurrConnectConfig): StaticClient {\n return new StaticClient(createTransport(config));\n}\n","import type { IRequestTransport } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\n\nexport interface GrpcExchangeTransportConfig {\n isTestnet?: boolean;\n telegramClient: TelegramClient;\n rpcOptions?: RpcOptions;\n walletId: number;\n onAuthError?: () => void;\n}\n\ninterface ExchangePayload {\n action: { type: string; [key: string]: unknown };\n nonce: number;\n signature?: { r: string; s: string; v: number };\n vaultAddress?: string | null;\n}\n\n/**\n * Routes exchange requests through the Hypurr gRPC backend (HyperliquidCoreAction)\n * for server-side signing. The backend handles signature generation.\n *\n * The SDK-generated nonce is forwarded; the action payload is JSON-encoded as bytes.\n * Info/explorer requests are proxied directly to the Hyperliquid HTTP API.\n */\nexport class GrpcExchangeTransport implements IRequestTransport {\n isTestnet: boolean;\n private telegramClient: TelegramClient;\n private rpcOptions?: RpcOptions;\n private walletId: number;\n private infoUrl: string;\n private onAuthError?: () => void;\n\n constructor(config: GrpcExchangeTransportConfig) {\n this.isTestnet = config.isTestnet ?? false;\n this.telegramClient = config.telegramClient;\n this.rpcOptions = config.rpcOptions;\n this.walletId = config.walletId;\n this.onAuthError = config.onAuthError;\n this.infoUrl = this.isTestnet\n ? \"https://api.hyperliquid-testnet.xyz\"\n : \"https://api.hyperliquid.xyz\";\n }\n\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n if (endpoint === \"exchange\") {\n return this.exchangeViaGrpc<T>(payload as ExchangePayload, signal);\n }\n return this.directRequest<T>(endpoint, payload, signal);\n }\n\n private async exchangeViaGrpc<T>(\n payload: ExchangePayload,\n signal?: AbortSignal,\n ): Promise<T> {\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const actionBytes = new TextEncoder().encode(\n JSON.stringify(payload.action),\n );\n\n console.debug(\"[GrpcExchangeTransport] sending action:\", payload.action);\n\n let response;\n try {\n ({ response } = await this.telegramClient.hyperliquidCoreAction(\n {\n authData: {},\n walletId: this.walletId,\n action: actionBytes,\n nonce: payload.nonce || Date.now(),\n },\n this.rpcOptions,\n ));\n } catch (err) {\n if (\n this.onAuthError &&\n err instanceof Error &&\n /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n err.message,\n )\n ) {\n this.onAuthError();\n }\n throw err;\n }\n\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const { status, result, error } = response;\n\n console.debug(\n \"[GrpcExchangeTransport] gRPC status:\",\n status,\n \"error:\",\n error,\n );\n\n if (error) {\n throw new Error(`GrpcExchangeTransport: ${error}`);\n }\n\n // The backend's `result` contains the raw Hyperliquid API JSON response.\n // The SDK's assertSuccessResponse expects the same shape as the HTTP API,\n // e.g. { status: \"ok\", response: { type: \"order\", data: { statuses: [...] } } }\n if (result && result.length > 0) {\n const parsed = JSON.parse(new TextDecoder().decode(result));\n console.debug(\"[GrpcExchangeTransport] parsed result:\", parsed);\n return parsed as T;\n }\n\n // Fallback: return a minimal success shape if no result bytes\n return { status: \"ok\", response: status } as T;\n }\n\n private async directRequest<T>(\n endpoint: string,\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const res = await fetch(`${this.infoUrl}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n }\n\n return (await res.json()) as T;\n }\n}\n","import {\n AnimatePresence,\n motion,\n useAnimationControls,\n type PanInfo,\n} from \"framer-motion\";\nimport {\n useCallback,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { MetaMaskColorIcon } from \"./icons/MetaMaskColorIcon\";\nimport { TelegramColorIcon } from \"./icons/TelegramColorIcon\";\n\nexport interface LoginModalProps {\n onConnectWallet: () => void;\n walletIcon?: ReactNode;\n}\n\nconst MOBILE_BREAKPOINT = 640;\n\nconst btnStyle: CSSProperties = {\n display: \"flex\",\n height: 53,\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n overflow: \"hidden\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.05)\",\n padding: \"0 24px\",\n fontSize: 14,\n fontWeight: 600,\n letterSpacing: \"-0.01em\",\n color: \"#fff\",\n cursor: \"pointer\",\n border: \"none\",\n transition: \"background 150ms\",\n};\n\nconst btnHoverBg = { background: \"rgba(255,255,255,0.1)\" };\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 100,\n background: \"rgba(0,0,0,0.6)\",\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n};\n\nconst modalWrapperStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 101,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n};\n\nconst modalBoxStyle: CSSProperties = {\n display: \"flex\",\n width: 400,\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n overflow: \"hidden\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"#282828\",\n padding: 24,\n};\n\nconst headingStyle: CSSProperties = {\n fontSize: 16,\n fontWeight: 700,\n letterSpacing: \"-0.025em\",\n color: \"#fff\",\n margin: 0,\n};\n\nconst dividerStyle: CSSProperties = {\n height: 1,\n width: \"100%\",\n background: \"rgba(255,255,255,0.05)\",\n};\n\nconst iconSize: CSSProperties = { width: 20, height: 20 };\n\nconst mobileQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`)\n : null;\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener(\"change\", cb);\n return () => mobileQuery?.removeEventListener(\"change\", cb);\n}\n\nfunction getSnapshotMobile() {\n return mobileQuery?.matches ?? false;\n}\n\nfunction useIsMobile() {\n return useSyncExternalStore(subscribeMobile, getSnapshotMobile, () => false);\n}\n\nfunction HoverButton({\n onClick,\n children,\n}: {\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <motion.button\n type=\"button\"\n onClick={onClick}\n style={btnStyle}\n whileHover={btnHoverBg}\n >\n {children}\n </motion.button>\n );\n}\n\nexport function LoginModal({ onConnectWallet, walletIcon }: LoginModalProps) {\n const { loginTelegram, loginModalOpen, closeLoginModal } =\n useHypurrConnectInternal();\n\n const handleTelegramAuth = useCallback(() => {\n closeLoginModal();\n loginTelegram();\n }, [loginTelegram, closeLoginModal]);\n\n const isMobile = useIsMobile();\n\n const modalContent = (\n <>\n <div\n style={{\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n <HoverButton onClick={handleTelegramAuth}>\n <TelegramColorIcon style={iconSize} />\n Telegram\n </HoverButton>\n </div>\n\n <div style={dividerStyle} />\n\n <HoverButton\n onClick={() => {\n closeLoginModal();\n onConnectWallet();\n }}\n >\n {walletIcon ?? <MetaMaskColorIcon style={iconSize} />}\n Wallet\n </HoverButton>\n </>\n );\n\n return (\n <AnimatePresence>\n {loginModalOpen &&\n (isMobile ? (\n <MobileDrawer key=\"drawer\" onClose={closeLoginModal}>\n {modalContent}\n </MobileDrawer>\n ) : (\n <>\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={closeLoginModal}\n />\n <motion.div\n key=\"modal-wrapper\"\n style={modalWrapperStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.05 }}\n onClick={closeLoginModal}\n >\n <motion.div\n style={modalBoxStyle}\n initial={{ scale: 0.96, opacity: 0, y: 8 }}\n animate={{ scale: 1, opacity: 1, y: 0 }}\n exit={{ scale: 0.96, opacity: 0, y: 8 }}\n transition={{ duration: 0.12 }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 style={headingStyle}>Connect</h2>\n {modalContent}\n </motion.div>\n </motion.div>\n </>\n ))}\n </AnimatePresence>\n );\n}\n\nconst drawerSheetStyle: CSSProperties = {\n position: \"fixed\",\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 101,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderLeft: \"1px solid rgba(255,255,255,0.1)\",\n borderRight: \"1px solid rgba(255,255,255,0.1)\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n background: \"#282828\",\n padding: \"12px 24px max(24px, env(safe-area-inset-bottom))\",\n};\n\nconst drawerBgStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n right: 0,\n top: 0,\n bottom: \"-100vh\",\n zIndex: -1,\n background: \"#282828\",\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n};\n\nconst grabHandleAreaStyle: CSSProperties = {\n width: \"100%\",\n cursor: \"grab\",\n paddingBottom: 4,\n};\n\nconst grabHandleStyle: CSSProperties = {\n margin: \"0 auto\",\n height: 4,\n width: 100,\n borderRadius: 9999,\n background: \"rgba(255,255,255,0.05)\",\n};\n\nfunction MobileDrawer({\n children,\n onClose,\n}: {\n children: ReactNode;\n onClose: () => void;\n}) {\n const controls = useAnimationControls();\n\n const handleDragEnd = useCallback(\n (_: unknown, info: PanInfo) => {\n if (info.offset.y > 100 || info.velocity.y > 500) {\n onClose();\n } else {\n controls.start({ y: 0 });\n }\n },\n [onClose, controls],\n );\n\n return (\n <>\n <motion.div\n key=\"drawer-backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n\n <motion.div\n key=\"drawer-sheet\"\n style={drawerSheetStyle}\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ type: \"tween\", duration: 0.3, ease: [0.32, 0.72, 0, 1] }}\n drag=\"y\"\n dragConstraints={{ top: 0, bottom: 0 }}\n dragElastic={{ top: 0, bottom: 0.4 }}\n onDragEnd={handleDragEnd}\n >\n <div style={drawerBgStyle} />\n\n <div style={grabHandleAreaStyle}>\n <div style={grabHandleStyle} />\n </div>\n\n <p style={headingStyle}>Connect</p>\n\n {children}\n </motion.div>\n </>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function MetaMaskColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_2567_1088)\">\n <path\n d=\"M19.8188 19.418L15.9421 18.2871L13.0186 19.9994L10.9788 19.9985L8.05356 18.2871L4.17862 19.418L3 15.5193L4.17875 11.1924L3 7.5341L4.17875 3L10.2336 6.54437H13.7639L19.8188 3L20.9976 7.5341L19.8188 11.1924L20.9976 15.5193L19.8188 19.418Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M4.17969 3L10.2347 6.54685L9.99394 8.98101L4.17969 3ZM8.05476 15.5209L10.7189 17.5093L8.05476 18.2869V15.5209ZM10.5059 12.2335L9.99394 8.98275L6.71642 11.1934L6.71464 11.1925V11.1941L6.72479 13.4695L8.05387 12.2336L10.5059 12.2335ZM19.819 3L13.7641 6.54685L14.004 8.98101L19.819 3ZM15.9441 15.5209L13.2798 17.5093L15.9441 18.2869V15.5209ZM17.2833 11.194V11.1924L17.2825 11.1932L14.0049 8.98275L13.4929 12.2335H15.944L17.2739 13.4693L17.2833 11.194Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M8.05369 18.2867L4.17875 19.4177L3 15.5207H8.05369V18.2867ZM10.5049 12.2324L11.245 16.9321L10.2191 14.319L6.72296 13.4691L8.0528 12.2325L10.5049 12.2324ZM15.9438 18.2867L19.8188 19.4177L20.9976 15.5206H15.9438C15.9438 15.5207 15.9438 18.2867 15.9438 18.2867ZM13.4927 12.2324L12.7526 16.9321L13.7783 14.319L17.2748 13.4691L15.944 12.2325L13.4927 12.2324Z\"\n fill=\"#E34807\"\n />\n <path\n d=\"M3 15.5194L4.17875 11.1924H6.71358L6.72283 13.4686L10.2194 14.3185L11.2451 16.9315L10.7178 17.5069L8.05369 15.5185H3V15.5194ZM20.9976 15.5194L19.8188 11.1924H17.2839L17.2746 13.4686L13.7783 14.3185L12.7524 16.9315L13.2796 17.5069L15.9439 15.5185H20.9976V15.5194ZM13.7639 6.54443H10.2336L9.99389 8.97859L11.2453 16.9289H12.7526L14.0047 8.97859L13.7639 6.54443Z\"\n fill=\"#FF8D5D\"\n />\n <path\n d=\"M4.17875 3L3 7.5341L4.17875 11.1924H6.71358L9.99287 8.98114L4.17875 3ZM9.77231 13.1766H8.62399L7.9988 13.7771L10.2202 14.3166L9.77231 13.1757V13.1766ZM19.8188 3L20.9976 7.5341L19.8188 11.1924H17.2839L14.0047 8.98114L19.8188 3ZM14.2269 13.1766H15.3769L16.0021 13.7778L13.7782 14.3184L14.2269 13.1757V13.1766ZM13.0178 18.4484L13.2798 17.5086L12.7524 16.9332H11.244L10.7168 17.5086L10.9787 18.4484\"\n fill=\"#661800\"\n />\n <path\n d=\"M13.0173 18.4482V20.0001H10.9785V18.4482H13.0173Z\"\n fill=\"#C0C4CD\"\n />\n <path\n d=\"M8.05469 18.2854L10.9807 19.9994V18.4475L10.7187 17.5078L8.05469 18.2854ZM15.944 18.2854L13.0179 19.9994V18.4475L13.2799 17.5078L15.944 18.2854Z\"\n fill=\"#E7EBF6\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2567_1088\">\n <rect\n width=\"18\"\n height=\"17\"\n fill=\"white\"\n transform=\"translate(3 3)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function TelegramColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z\"\n fill=\"url(#paint0_linear_2571_1084)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.07426 11.905C9.69794 10.7619 11.4475 10.0083 12.3229 9.64417C14.8222 8.60458 15.3416 8.424 15.6801 8.41803C15.7546 8.41672 15.921 8.43517 16.0289 8.52267C16.1199 8.59655 16.145 8.69635 16.1569 8.7664C16.1689 8.83645 16.1839 8.99602 16.172 9.1207C16.0366 10.5438 15.4505 13.9973 15.1523 15.5912C15.0262 16.2657 14.7778 16.4918 14.5373 16.514C14.0146 16.562 13.6178 16.1686 13.1115 15.8367C12.3194 15.3175 11.8719 14.9943 11.103 14.4876C10.2145 13.902 10.7905 13.5802 11.2969 13.0542C11.4294 12.9166 13.7322 10.822 13.7768 10.632C13.7824 10.6082 13.7875 10.5196 13.7349 10.4729C13.6823 10.4261 13.6046 10.4421 13.5486 10.4548C13.4691 10.4728 12.2037 11.3092 9.75232 12.964C9.39313 13.2106 9.06779 13.3308 8.7763 13.3245C8.45496 13.3176 7.83681 13.1428 7.37729 12.9934C6.81366 12.8102 6.3657 12.7134 6.40471 12.4022C6.42503 12.2401 6.64821 12.0744 7.07426 11.905Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_2571_1084\"\n x1=\"903\"\n y1=\"3\"\n x2=\"903\"\n y2=\"1789.65\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#2AABEE\" />\n <stop offset=\"1\" stopColor=\"#229ED9\" />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n","import type { ExchangeClient } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport type {\n HyperliquidScaleCreateRequest,\n HyperliquidTwapCreateRequest,\n HyperliquidTwapModifyRequest,\n} from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type {\n HyperliquidWalletScaleSession,\n HyperliquidWalletTwapSession,\n} from \"hypurr-grpc/ts/hypurr/tools\";\nimport type { TelegramChatWalletPack } from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\n// ─── Config ──────────────────────────────────────────────────────\n\nexport interface HypurrConnectConfig {\n /** gRPC-web base URL. Defaults to https://grpc.hypurr.fun. */\n grpcUrl?: string;\n /** Media base URL for user-uploaded assets. Defaults to https://media.hypurr.fun. */\n mediaUrl?: string;\n grpcTimeout?: number;\n isTestnet?: boolean;\n /** Polling interval in ms for TWAP/Scale session updates. Default 5000. Set 0 to disable. */\n sessionPollInterval?: number;\n telegram: {\n /** Deprecated for the hub flow; retained for older consumers. */\n botUsername?: string;\n /** Deprecated for the hub flow; retained for older consumers. */\n botId?: string;\n /** Deprecated: Telegram login is now handled by the auth hub. */\n useWidget?: boolean;\n /** Auth hub login URL. Defaults to https://auth.hypurr.fun/login. */\n authHubUrl?: string;\n /** Optional callback URL. Defaults to the current page without auth query params. */\n returnTo?: string | (() => string);\n /** Requested hub scopes. Defaults to the scopes required by this SDK. */\n scope?: string | string[];\n };\n}\n\n// ─── Telegram login ──────────────────────────────────────────────\n\n/** @deprecated Telegram login is handled by the auth hub; raw Telegram data is no longer used by the provider. */\nexport interface TelegramLoginData {\n id: number;\n first_name: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: number;\n hash: string;\n}\n\n// ─── Auth ────────────────────────────────────────────────────────\n\nexport type AuthMethod = \"telegram\" | \"eoa\" | null;\n\nexport interface HypurrUser {\n address: string;\n walletId: number;\n displayName: string;\n photoUrl?: string;\n authMethod: AuthMethod;\n telegramId?: string;\n hfunScore?: number;\n reputationScore?: number;\n}\n\n// ─── Agent (EOA flow) ────────────────────────────────────────────\n\nexport interface StoredAgent {\n privateKey: `0x${string}`;\n address: `0x${string}`;\n approvedAt: number;\n /** Epoch ms from the `extraAgents` response; agent is invalid after this time. */\n validUntil: number;\n}\n\nexport type SignTypedDataFn = (params: {\n domain: Record<string, unknown>;\n types: Record<string, { name: string; type: string }[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}) => Promise<`0x${string}`>;\n\nexport type Hex = `0x${string}`;\n\nexport interface EvmTransactionRequest {\n from?: Hex;\n to?: Hex;\n gas?: Hex;\n gasPrice?: Hex;\n value?: Hex;\n data?: Hex;\n nonce?: Hex;\n chainId?: Hex;\n maxFeePerGas?: Hex;\n maxPriorityFeePerGas?: Hex;\n type?: Hex;\n accessList?: unknown;\n [key: string]: unknown;\n}\n\nexport type EvmRequestFn = (args: {\n method: string;\n params?: unknown[];\n}) => Promise<unknown>;\n\nexport type SignEvmTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<Hex>;\n\nexport type EoaSignTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<unknown>;\n\n/** Wallet signer provided at EOA connect time for user-signed actions. */\nexport interface EoaSigner {\n signTypedData: SignTypedDataFn;\n /** Optional raw EVM transaction signer. Used by `signEvmTransaction()` in EOA mode. */\n signTransaction?: EoaSignTransactionFn;\n /** Optional EIP-1193 provider request function. Used as a fallback for `eth_signTransaction`. */\n request?: EvmRequestFn;\n chainId: number;\n}\n\nexport interface EoaSignerOptions {\n signTransaction?: EoaSignTransactionFn;\n request?: EvmRequestFn;\n}\n\n/**\n * Create an {@link EoaSigner} from any EIP-712 signing function.\n *\n * Accepts either a direct function or a `{ current }` ref object so the\n * signer always calls through to the latest function (avoids stale closures\n * with React hooks like wagmi's `useSignTypedData`).\n *\n * @example wagmi v2 — ref pattern (recommended)\n * ```ts\n * const { signTypedDataAsync } = useSignTypedData();\n * const chainId = useChainId();\n * const signerRef = useRef(signTypedDataAsync);\n * signerRef.current = signTypedDataAsync; // stays fresh every render\n *\n * // call once — the ref keeps it up to date\n * connectEoa(address, createEoaSigner(signerRef, chainId));\n * ```\n *\n * @example direct function (e.g. from viem WalletClient)\n * ```ts\n * connectEoa(address, createEoaSigner(client.signTypedData, chainId));\n * ```\n */\nexport function createEoaSigner(\n signTypedDataAsync:\n | ((args: Record<string, unknown>) => Promise<`0x${string}`>)\n | { current: (args: Record<string, unknown>) => Promise<`0x${string}`> },\n chainId: number,\n options: EoaSignerOptions = {},\n): EoaSigner {\n const resolve =\n typeof signTypedDataAsync === \"function\"\n ? signTypedDataAsync\n : (args: Record<string, unknown>) => signTypedDataAsync.current(args);\n return {\n signTypedData: (params) => resolve(params),\n signTransaction: options.signTransaction,\n request: options.request,\n chainId,\n };\n}\n\n// ─── TWAP / Scale param types ────────────────────────────────────\n// Omit authData & walletId — auto-filled from context using the selected wallet.\n\nexport type TwapCreateParams = Omit<\n HyperliquidTwapCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type TwapModifyParams = Omit<\n HyperliquidTwapModifyRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type ScaleCreateParams = Omit<\n HyperliquidScaleCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\n// ─── Context state ───────────────────────────────────────────────\n\nexport interface HypurrConnectState {\n // Auth\n user: HypurrUser | null;\n isLoggedIn: boolean;\n isLoading: boolean;\n error: string | null;\n authMethod: AuthMethod;\n\n // SDK ExchangeClient — handles both L1 (agent-signed) and user-signed actions.\n // Telegram: backed by GrpcExchangeTransport (HyperliquidCoreAction)\n // EOA: uses a dual wallet — agent key for L1 actions, master wallet for\n // user-signed actions (transfers, withdrawals, etc.) when a signer is provided.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exchange: ExchangeClient<any> | null;\n\n // Multi-wallet (Telegram only — EOA has a single wallet)\n wallets: HyperliquidWallet[];\n selectedWalletId: number;\n selectWallet: (walletId: number) => void;\n\n // Wallet management (Telegram only)\n createWallet: (name: string) => Promise<HyperliquidWallet>;\n deleteWallet: (walletId: number) => Promise<void>;\n refreshWallets: () => void;\n\n // Wallet packs & labels (Telegram only)\n packs: TelegramChatWalletPack[];\n createWalletPack: (name: string) => Promise<number>;\n addPackLabel: (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n modifyPackLabel: (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }) => Promise<void>;\n removePackLabel: (params: {\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n\n // TWAP sessions (Telegram only)\n createTwap: (\n params: TwapCreateParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n modifyTwap: (\n params: TwapModifyParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n cancelTwap: (sessionId: number) => Promise<void>;\n\n // Scale sessions (Telegram only)\n createScale: (\n params: ScaleCreateParams,\n ) => Promise<HyperliquidWalletScaleSession>;\n cancelScale: (sessionId: number) => Promise<void>;\n\n // Login modal\n loginModalOpen: boolean;\n openLoginModal: () => void;\n closeLoginModal: () => void;\n\n // Auth actions\n connectEoa: (address: `0x${string}`, signer?: EoaSigner) => void;\n signEvmTransaction: SignEvmTransactionFn;\n approveAgent: (\n signTypedDataAsync: SignTypedDataFn,\n chainId: number,\n ) => Promise<void>;\n logout: () => void;\n\n // EOA agent management\n agent: StoredAgent | null;\n agentReady: boolean;\n clearAgent: () => void;\n\n // Telegram config\n botId: string;\n\n // Low-level access\n /** Deprecated: JWT auth leaves authData empty; use `telegramRpcOptions` for low-level calls. */\n authDataMap: Record<string, string>;\n authToken: string | null;\n telegramRpcOptions?: RpcOptions;\n telegramClient: TelegramClient;\n staticClient: StaticClient;\n}\n"],"mappings":"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","names":["user","isTestnet","useCallback","jsx","jsx","jsxs","jsx","jsxs","useCallback"]}
|
|
1
|
+
{"version":3,"sources":["../src/HypurrConnectProvider.tsx","../src/privateKeySigner.ts","../src/agent.ts","../src/grpc.ts","../src/GrpcExchangeTransport.ts","../src/LoginModal.tsx","../src/icons/MetaMaskColorIcon.tsx","../src/icons/TelegramColorIcon.tsx","../src/WalletSelectorDropdown.tsx","../src/UserProfileModal.tsx","../src/DeleteWalletModal.tsx","../src/icons/lucide.tsx","../src/profileStyles.ts","../src/RenameWalletModal.tsx","../src/types.ts"],"sourcesContent":["import {\n ExchangeClient,\n HttpTransport,\n type IRequestTransport,\n} from \"@hfunlabs/hyperliquid\";\nimport {\n signUserSignedAction,\n type AbstractViemLocalAccount,\n} from \"@hfunlabs/hyperliquid/signing\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramUserResponse } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type {\n TelegramUser as HypurrTelegramUser,\n TelegramChatWalletPack,\n} from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n AGENT_NAME,\n clearAgent as clearStoredAgent,\n fetchActiveAgent,\n generateAgentKey,\n isAgentValid,\n isDeadAgentError,\n loadAgent,\n saveAgent,\n} from \"./agent\";\nimport { createStaticClient, createTelegramClient } from \"./grpc\";\nimport { GrpcExchangeTransport } from \"./GrpcExchangeTransport\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\nimport type {\n AuthMethod,\n EoaSigner,\n EvmTransactionRequest,\n Hex,\n HypurrConnectConfig,\n HypurrConnectState,\n HypurrUser,\n SignTypedDataFn,\n StoredAgent,\n} from \"./types\";\n\n/** @internal context value — extends the public type with fields used only by library internals */\ninterface InternalConnectState extends HypurrConnectState {\n loginTelegram: () => void;\n}\n\nconst TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-jwt\";\nconst LEGACY_TELEGRAM_STORAGE_KEY = \"hypurr-connect-tg-user\";\nconst TELEGRAM_AUTH_STATE_KEY = \"hypurr-connect-auth-state\";\nconst TELEGRAM_AUTH_MESSAGE = \"hypurr-connect:telegram-auth\";\nconst DEFAULT_AUTH_HUB_URL = \"https://auth.hypurr.fun/login\";\nconst DEFAULT_MEDIA_URL = \"https://media.hypurr.fun\";\nconst IGNORED_EXTERNAL_SIGNATURE =\n \"0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001b\" as const;\nconst DEFAULT_TELEGRAM_SCOPES = [\n \"telegram:user:read\",\n \"telegram:wallet:read\",\n \"telegram:wallet:write\",\n \"telegram:trade:read\",\n \"telegram:trade:write\",\n \"telegram:cabal:read\",\n \"telegram:cabal:write\",\n \"telegram:agent:write\",\n \"telegram:support:read\",\n \"telegram:support:write\",\n];\n\nfunction createExternalSigningWallet(address: Hex): AbstractViemLocalAccount {\n return {\n address,\n signTypedData(params) {\n void params;\n return Promise.resolve(IGNORED_EXTERNAL_SIGNATURE);\n },\n };\n}\n\nfunction isInvalidTelegramAuthError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n msg,\n );\n}\n\nfunction normalizeMediaUrl(mediaUrl?: string): string {\n return (mediaUrl?.trim() || DEFAULT_MEDIA_URL).replace(/\\/+$/, \"\");\n}\n\nfunction isAddress(value?: string | null): value is Hex {\n return !!value && /^0x[a-fA-F0-9]{40}$/.test(value);\n}\n\nfunction getRawSignedTransaction(result: unknown): Hex | null {\n if (typeof result === \"string\" && result.startsWith(\"0x\")) {\n return result as Hex;\n }\n if (!result || typeof result !== \"object\") return null;\n\n const record = result as Record<string, unknown>;\n const candidates = [\n record.raw,\n record.rawTransaction,\n record.signedTransaction,\n record.serializedTransaction,\n record.result,\n ];\n const raw = candidates.find(\n (value): value is string =>\n typeof value === \"string\" && value.startsWith(\"0x\"),\n );\n return raw ? (raw as Hex) : null;\n}\n\nfunction decodeJsonBytes(bytes: Uint8Array): unknown {\n const text = new TextDecoder().decode(bytes);\n if (!text) return null;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nfunction encodeJsonBytes(value: unknown): Uint8Array {\n return new TextEncoder().encode(JSON.stringify(value));\n}\n\nfunction withExpectedFrom(\n transaction: EvmTransactionRequest,\n address: Hex,\n): EvmTransactionRequest {\n if (\n transaction.from &&\n transaction.from.toLowerCase() !== address.toLowerCase()\n ) {\n throw new Error(\n \"[HypurrConnect] EVM transaction `from` does not match the connected wallet.\",\n );\n }\n return transaction.from ? transaction : { ...transaction, from: address };\n}\n\nfunction currentReturnTo(): string {\n const url = new URL(window.location.href);\n for (const param of [\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n url.searchParams.delete(param);\n }\n return url.toString();\n}\n\nfunction randomState(): string {\n const bytes = new Uint8Array(16);\n crypto.getRandomValues(bytes);\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\n \"\",\n );\n}\n\nfunction normalizeScopes(scope?: string | string[]): string {\n if (Array.isArray(scope)) return scope.join(\" \");\n return scope?.trim() || DEFAULT_TELEGRAM_SCOPES.join(\" \");\n}\n\nfunction isTelegramAuthMessage(data: unknown): data is {\n type: typeof TELEGRAM_AUTH_MESSAGE;\n token: string;\n state: string;\n} {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"type\" in data &&\n \"token\" in data &&\n \"state\" in data &&\n (data as { type: unknown }).type === TELEGRAM_AUTH_MESSAGE &&\n typeof (data as { token: unknown }).token === \"string\" &&\n typeof (data as { state: unknown }).state === \"string\"\n );\n}\n\nconst HypurrConnectContext = createContext<InternalConnectState | null>(null);\n\nexport function useHypurrConnect(): HypurrConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnect must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\n/** @internal — gives library components access to fields not on the public API */\nexport function useHypurrConnectInternal(): InternalConnectState {\n const ctx = useContext(HypurrConnectContext);\n if (!ctx)\n throw new Error(\n \"useHypurrConnectInternal must be used within <HypurrConnectProvider>\",\n );\n return ctx;\n}\n\nexport function HypurrConnectProvider({\n config,\n children,\n}: {\n config: HypurrConnectConfig;\n children: ReactNode;\n}) {\n const tgClient = useMemo(() => createTelegramClient(config), [config]);\n const staticClient = useMemo(() => createStaticClient(config), [config]);\n\n // ── Telegram auth state ──────────────────────────────────────\n const [tgAuthToken, setTgAuthToken] = useState<string | null>(() => {\n try {\n return localStorage.getItem(TELEGRAM_STORAGE_KEY);\n } catch {\n return null;\n }\n });\n const [tgUser, setTgUser] = useState<HypurrTelegramUser | null>(null);\n const [tgLoading, setTgLoading] = useState(false);\n const [tgError, setTgError] = useState<string | null>(null);\n\n const authDataMap = useMemo(() => ({}), []);\n const telegramRpcOptions = useMemo<RpcOptions | undefined>(\n () =>\n tgAuthToken\n ? { meta: { authorization: `Bearer ${tgAuthToken}` } }\n : undefined,\n [tgAuthToken],\n );\n\n const [tgUserTick, setTgUserTick] = useState(0);\n\n // Auto-disconnect when the server rejects telegram auth data.\n const onInvalidAuthRef = useRef<(() => void) | null>(null);\n onInvalidAuthRef.current = () => {\n console.warn(\n \"[HypurrConnect] Invalid Telegram auth token — disconnecting.\",\n );\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n };\n\n const acceptTelegramToken = useCallback((token: string) => {\n setTgAuthToken(token);\n setTgError(null);\n localStorage.setItem(TELEGRAM_STORAGE_KEY, token);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\");\n if (!token) {\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n return;\n }\n\n const callbackState = params.get(\"state\") ?? \"\";\n\n if (window.opener && window.opener !== window) {\n window.opener.postMessage(\n {\n type: TELEGRAM_AUTH_MESSAGE,\n token,\n state: callbackState,\n },\n window.location.origin,\n );\n window.close();\n return;\n }\n\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || callbackState !== expectedState) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n acceptTelegramToken(token);\n\n const cleanUrl = new URL(window.location.href);\n for (const param of [\n \"token\",\n \"token_type\",\n \"token_source\",\n \"state\",\n \"scope\",\n ]) {\n cleanUrl.searchParams.delete(param);\n }\n window.history.replaceState({}, document.title, cleanUrl.toString());\n }, [acceptTelegramToken]);\n\n useEffect(() => {\n function onMessage(event: MessageEvent) {\n if (event.origin !== window.location.origin) return;\n if (!isTelegramAuthMessage(event.data)) return;\n\n const expectedState = sessionStorage.getItem(TELEGRAM_AUTH_STATE_KEY);\n sessionStorage.removeItem(TELEGRAM_AUTH_STATE_KEY);\n if (!expectedState || event.data.state !== expectedState) {\n setTgError(\"Invalid auth callback state.\");\n return;\n }\n\n acceptTelegramToken(event.data.token);\n }\n\n window.addEventListener(\"message\", onMessage);\n return () => window.removeEventListener(\"message\", onMessage);\n }, [acceptTelegramToken]);\n\n useEffect(() => {\n if (!tgAuthToken || !telegramRpcOptions) return;\n let cancelled = false;\n setTgLoading(true);\n setTgError(null);\n\n (async () => {\n try {\n const [{ response: userResp }, { response: walletsResp }] =\n await Promise.all([\n tgClient.telegramUser({ authData: {} }, telegramRpcOptions),\n tgClient.telegramUserWallets({ authData: {} }, telegramRpcOptions),\n ]);\n if (cancelled) return;\n const user = (userResp as TelegramUserResponse).user ?? null;\n if (user) {\n // TelegramUser.wallets lacks twap/scale sessions; replace with\n // the full wallets from TelegramUserWallets which populates them.\n user.wallets = walletsResp.wallets;\n }\n setTgUser(user);\n } catch (err) {\n if (cancelled) return;\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n console.error(\"[HypurrConnect] gRPC TelegramUser failed:\", err);\n setTgError(err instanceof Error ? err.message : String(err));\n } finally {\n if (!cancelled) setTgLoading(false);\n }\n })();\n\n return () => {\n cancelled = true;\n };\n }, [tgAuthToken, telegramRpcOptions, tgClient, tgUserTick]);\n\n // ── EOA auth state ───────────────────────────────────────────\n const [eoaAddress, setEoaAddress] = useState<`0x${string}` | null>(null);\n const [agent, setAgent] = useState<StoredAgent | null>(null);\n const [eoaLoading, setEoaLoading] = useState(false);\n const [eoaError, setEoaError] = useState<string | null>(null);\n const eoaSignerRef = useRef<EoaSigner | null>(null);\n\n // ── Derived auth ─────────────────────────────────────────────\n const authMethod: AuthMethod = tgAuthToken\n ? \"telegram\"\n : eoaAddress\n ? \"eoa\"\n : null;\n\n // ── Multi-wallet state (Telegram) ─────────────────────────────\n const [wallets, setWallets] = useState<HyperliquidWallet[]>([]);\n const [selectedWalletId, setSelectedWalletId] = useState<number>(0);\n const [packs, setPacks] = useState<TelegramChatWalletPack[]>([]);\n\n const refreshWallets = useCallback(() => setTgUserTick((t) => t + 1), []);\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !tgUser) {\n setWallets([]);\n setSelectedWalletId(0);\n setPacks([]);\n return;\n }\n\n const userWallets = tgUser.wallets ?? [];\n setWallets(userWallets);\n setPacks(tgUser.packs ?? []);\n\n const defaultId = tgUser.walletId || userWallets[0]?.id || 0;\n setSelectedWalletId((prev) => {\n if (prev && userWallets.some((w) => w.id === prev)) return prev;\n return defaultId;\n });\n }, [authMethod, tgUser]);\n\n const selectedWallet = useMemo(\n () => wallets.find((w) => w.id === selectedWalletId) ?? wallets[0] ?? null,\n [wallets, selectedWalletId],\n );\n\n const selectWallet = useCallback(\n (walletId: number) => {\n if (wallets.some((w) => w.id === walletId)) {\n setSelectedWalletId(walletId);\n }\n },\n [wallets],\n );\n\n // ── Session poller (TWAP + Scale for selected wallet) ──────\n const pollInterval = config.sessionPollInterval ?? 5_000;\n\n useEffect(() => {\n if (authMethod !== \"telegram\" || !selectedWalletId || !pollInterval) return;\n\n let cancelled = false;\n\n const poll = async () => {\n try {\n const [{ response: twapResp }, { response: scaleResp }] =\n await Promise.all([\n tgClient.hyperliquidWalletTwapSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n tgClient.hyperliquidWalletScaleSessions(\n {\n authData: {},\n walletId: selectedWalletId,\n },\n telegramRpcOptions,\n ),\n ]);\n if (cancelled) return;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: twapResp.sessions,\n scaleSessions: scaleResp.sessions,\n }\n : w,\n ),\n );\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n return;\n }\n // Silently ignore poll errors — next tick will retry.\n }\n };\n\n // Fire immediately on mount / wallet switch, then on interval.\n poll();\n const id = setInterval(poll, pollInterval);\n return () => {\n cancelled = true;\n clearInterval(id);\n };\n }, [\n authMethod,\n selectedWalletId,\n pollInterval,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const user = useMemo<HypurrUser | null>(() => {\n if (tgAuthToken && authMethod === \"telegram\" && selectedWallet && tgUser) {\n const mediaUrl = normalizeMediaUrl(config.mediaUrl);\n return {\n address: selectedWallet.ethereumAddress,\n walletId: selectedWallet.id,\n displayName: tgUser.telegramUsername\n ? `@${tgUser.telegramUsername}`\n : `Telegram ${tgUser.telegramId}`,\n photoUrl: (() => {\n // `pictureFileId` is read at runtime; the schema may not type it.\n const fileId = (tgUser as unknown as { pictureFileId?: string })\n .pictureFileId;\n return fileId ? `${mediaUrl}/${fileId}` : undefined;\n })(),\n authMethod: \"telegram\",\n telegramId: String(tgUser.telegramId),\n hfunScore: tgUser?.reputation?.hfunScore,\n reputationScore: tgUser?.reputation?.reputationScore,\n };\n }\n if (eoaAddress && authMethod === \"eoa\") {\n return {\n address: eoaAddress,\n walletId: 0,\n displayName: `${eoaAddress.slice(0, 6)}...${eoaAddress.slice(-4)}`,\n authMethod: \"eoa\",\n };\n }\n return null;\n }, [\n tgAuthToken,\n selectedWallet,\n eoaAddress,\n authMethod,\n tgUser,\n config.mediaUrl,\n ]);\n\n // ── Exchange client ──────────────────────────────────────────\n // Telegram: dummy local wallet → GrpcExchangeTransport → HyperliquidCoreAction (server signs)\n // EOA: dual wallet — agent key for L1 actions, master signer for user-signed\n // actions (transfers, withdrawals, etc.). The dual wallet inspects the\n // EIP-712 domain name to decide which key signs each request.\n // When a signer is available but no agent exists yet, the dual wallet\n // auto-provisions an agent on the first L1 action (triggers one extra\n // wallet popup for the approveAgent user-signed action).\n\n const onDeadAgentRef = useRef<((address: `0x${string}`) => void) | null>(\n null,\n );\n onDeadAgentRef.current = (addr: `0x${string}`) => {\n clearStoredAgent(addr);\n setAgent(null);\n setEoaError(\"Agent expired or was deregistered. Please reconnect.\");\n };\n\n // Mutable slot for the agent signer — the dual wallet reads this so it can\n // pick up a newly provisioned agent without waiting for a React re-render.\n const agentSignerRef = useRef<PrivateKeySigner | null>(\n agent ? new PrivateKeySigner(agent.privateKey) : null,\n );\n useEffect(() => {\n agentSignerRef.current = agent\n ? new PrivateKeySigner(agent.privateKey)\n : null;\n }, [agent]);\n\n // Lock to prevent concurrent auto-provisioning attempts\n const provisioningRef = useRef<Promise<PrivateKeySigner> | null>(null);\n\n const agentReady =\n authMethod === \"telegram\" || (authMethod === \"eoa\" && !!agent);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const exchange = useMemo<ExchangeClient<any> | null>(() => {\n if (authMethod === \"telegram\" && user?.address) {\n const transport = new GrpcExchangeTransport({\n isTestnet: config.isTestnet ?? false,\n telegramClient: tgClient,\n rpcOptions: telegramRpcOptions,\n walletId: user.walletId,\n onAuthError: () => onInvalidAuthRef.current?.(),\n });\n return new ExchangeClient({\n transport,\n wallet: createExternalSigningWallet(user.address as Hex),\n });\n }\n\n if (authMethod === \"eoa\" && eoaAddress) {\n const hasSigner = !!eoaSignerRef.current;\n\n if (!agent && !hasSigner) {\n const noAgentTransport: IRequestTransport = {\n isTestnet: config.isTestnet ?? false,\n request(): Promise<never> {\n throw new Error(\n \"[HypurrConnect] No agent key approved and no wallet signer available. \" +\n \"Either call approveAgent(signTypedDataAsync) or pass a signer to \" +\n \"connectEoa(address, { signTypedData, chainId }).\",\n );\n },\n };\n return new ExchangeClient({\n transport: noAgentTransport,\n wallet: createExternalSigningWallet(eoaAddress),\n });\n }\n\n const isTestnet = config.isTestnet ?? false;\n const inner = new HttpTransport({ isTestnet });\n const deadAgentAddr = eoaAddress;\n const guardedTransport: IRequestTransport = {\n isTestnet: inner.isTestnet,\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n try {\n return await inner.request<T>(endpoint, payload, signal);\n } catch (err) {\n if (endpoint === \"exchange\" && isDeadAgentError(err)) {\n onDeadAgentRef.current?.(deadAgentAddr);\n }\n throw err;\n }\n },\n };\n\n const signerRef = eoaSignerRef;\n const agentRef = agentSignerRef;\n const provRef = provisioningRef;\n const ownerAddress = eoaAddress;\n\n /**\n * Auto-provision an agent key when one doesn't exist yet.\n *\n * Bypasses the SDK's `executeUserSignedAction` (and its per-address\n * semaphore) to avoid deadlocking when called from inside\n * `dualWallet.signTypedData`, which is already inside the SDK's\n * `executeL1Action` lock for the same address.\n */\n const ensureAgent = async (): Promise<PrivateKeySigner> => {\n const existing = agentRef.current;\n if (existing) return existing;\n\n if (provRef.current) return provRef.current;\n\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available to auto-provision agent. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n\n provRef.current = (async () => {\n try {\n const { privateKey, address: agentAddress } =\n await generateAgentKey();\n\n const chainIdHex =\n `0x${signer.chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signer.signTypedData(params);\n },\n getAddresses: async () => [ownerAddress] as `0x${string}`[],\n getChainId: async () => signer.chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api-ui.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(ownerAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(ownerAddress, stored);\n\n const newSigner = new PrivateKeySigner(privateKey);\n agentRef.current = newSigner;\n setAgent(stored);\n\n return newSigner;\n } finally {\n provRef.current = null;\n }\n })();\n\n return provRef.current;\n };\n\n // Dual wallet: routes signing based on the EIP-712 domain.\n // \"Exchange\" domain → L1 action → agent key signs (auto-provisions if needed).\n // \"HyperliquidSignTransaction\" domain → user-signed → master wallet (popup).\n const dualWallet: AbstractViemLocalAccount = {\n address: ownerAddress,\n async signTypedData(params): Promise<`0x${string}`> {\n if (params.domain.name === \"HyperliquidSignTransaction\") {\n const signer = signerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No wallet signer available for user-signed actions. \" +\n \"Pass a signer to connectEoa(address, { signTypedData, chainId }).\",\n );\n }\n return signer.signTypedData(\n params as Parameters<typeof signer.signTypedData>[0],\n );\n }\n\n const agentSigner = await ensureAgent();\n return agentSigner.signTypedData(params);\n },\n };\n\n return new ExchangeClient({\n transport: guardedTransport,\n wallet: dualWallet,\n signatureChainId: () => {\n const id = signerRef.current?.chainId ?? 42161;\n return `0x${id.toString(16)}` as `0x${string}`;\n },\n });\n }\n\n return null;\n }, [\n authMethod,\n user,\n agent,\n eoaAddress,\n config.isTestnet,\n tgClient,\n telegramRpcOptions,\n ]);\n\n const handleClearAgent = useCallback(() => {\n if (eoaAddress) {\n clearStoredAgent(eoaAddress);\n setAgent(null);\n }\n }, [eoaAddress]);\n\n const signEvmTransaction = useCallback(\n async (transaction: EvmTransactionRequest): Promise<Hex> => {\n if (authMethod === \"eoa\") {\n if (!eoaAddress) {\n throw new Error(\"[HypurrConnect] No EOA wallet connected.\");\n }\n\n const signer = eoaSignerRef.current;\n if (!signer) {\n throw new Error(\n \"[HypurrConnect] No EOA signer available. Pass a signer to connectEoa(address, signer).\",\n );\n }\n\n const tx = withExpectedFrom(transaction, eoaAddress);\n const result = signer.signTransaction\n ? await signer.signTransaction(tx)\n : signer.request\n ? await signer.request({\n method: \"eth_signTransaction\",\n params: [tx],\n })\n : null;\n const rawTransaction = getRawSignedTransaction(result);\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] EOA signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n }\n\n if (authMethod === \"telegram\") {\n if (!telegramRpcOptions) {\n throw new Error(\"[HypurrConnect] No Telegram RPC session available.\");\n }\n if (!selectedWallet) {\n throw new Error(\"[HypurrConnect] No Telegram wallet selected.\");\n }\n if (\n selectedWallet.id <= 0 ||\n selectedWallet.isReadOnly ||\n selectedWallet.isAgent\n ) {\n throw new Error(\n \"[HypurrConnect] Select a Telegram private-key wallet to sign EVM transactions.\",\n );\n }\n if (!isAddress(selectedWallet.ethereumAddress)) {\n throw new Error(\n \"[HypurrConnect] Selected Telegram wallet does not have a valid EVM address.\",\n );\n }\n\n const tx = withExpectedFrom(\n transaction,\n selectedWallet.ethereumAddress,\n );\n try {\n const signResponse = await tgClient.eVMSignTransaction(\n {\n authData: {},\n walletId: selectedWallet.id,\n params: encodeJsonBytes(tx),\n },\n telegramRpcOptions,\n );\n const rawTransaction = getRawSignedTransaction(\n decodeJsonBytes(signResponse.response.result),\n );\n if (!rawTransaction) {\n throw new Error(\n \"[HypurrConnect] Telegram signer did not return a raw transaction.\",\n );\n }\n return rawTransaction;\n } catch (err) {\n if (isInvalidTelegramAuthError(err)) {\n onInvalidAuthRef.current?.();\n }\n throw err;\n }\n }\n\n throw new Error(\"[HypurrConnect] No wallet connected.\");\n },\n [authMethod, eoaAddress, selectedWallet, telegramRpcOptions, tgClient],\n );\n\n // ── Wallet management (Telegram only) ───────────────────────\n const createWallet = useCallback(\n async (name: string): Promise<HyperliquidWallet> => {\n const { response } = await tgClient.hyperliquidWalletCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n if (!response.wallet)\n throw new Error(\"Wallet creation returned no wallet\");\n return response.wallet;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const deleteWallet = useCallback(\n async (walletId: number): Promise<void> => {\n await tgClient.hyperliquidWalletDelete(\n {\n authData: {},\n walletId,\n },\n telegramRpcOptions,\n );\n if (walletId === selectedWalletId) {\n const remaining = wallets.filter((w) => w.id !== walletId);\n setSelectedWalletId(remaining[0]?.id ?? 0);\n }\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, selectedWalletId, wallets, refreshWallets],\n );\n\n const renameWallet = useCallback(\n async (walletId: number, name: string): Promise<void> => {\n await tgClient.hyperliquidWalletUpdate(\n {\n authData: {},\n walletId,\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const createWalletPack = useCallback(\n async (name: string): Promise<number> => {\n const { response } = await tgClient.telegramChatWalletPackCreate(\n {\n authData: {},\n name,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n return response.packId;\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const addPackLabel = useCallback(\n async (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelAdd(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const modifyPackLabel = useCallback(\n async (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelModify(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n const removePackLabel = useCallback(\n async (params: { walletLabel: string; packId: number }): Promise<void> => {\n await tgClient.telegramChatWalletPackLabelRemove(\n {\n authData: {},\n ...params,\n },\n telegramRpcOptions,\n );\n refreshWallets();\n },\n [tgClient, telegramRpcOptions, refreshWallets],\n );\n\n // ── TWAP session management (Telegram only) ─────────────────\n const createTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"TWAP creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, twapSessions: [...w.twapSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const modifyTwap = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidTwapModify>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidTwapModify(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session) throw new Error(\"TWAP modify returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.map((s) =>\n s.id === session.id ? session : s,\n ),\n }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelTwap = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidTwapCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n twapSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n twapSessions: w.twapSessions.filter((s) => s.id !== sessionId),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Scale session management (Telegram only) ───────────────\n const createScale = useCallback(\n async (\n params: Omit<\n Parameters<typeof tgClient.hyperliquidScaleCreate>[0],\n \"authData\" | \"walletId\"\n >,\n ) => {\n const { response } = await tgClient.hyperliquidScaleCreate(\n {\n authData: {},\n walletId: selectedWalletId,\n ...params,\n },\n telegramRpcOptions,\n );\n if (!response.session)\n throw new Error(\"Scale creation returned no session\");\n const session = response.session;\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? { ...w, scaleSessions: [...w.scaleSessions, session] }\n : w,\n ),\n );\n return session;\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n const cancelScale = useCallback(\n async (sessionId: number) => {\n await tgClient.hyperliquidScaleCancel(\n {\n authData: {},\n walletId: selectedWalletId,\n scaleSessionId: sessionId,\n },\n telegramRpcOptions,\n );\n setWallets((prev) =>\n prev.map((w) =>\n w.id === selectedWalletId\n ? {\n ...w,\n scaleSessions: w.scaleSessions.filter(\n (s) => s.id !== sessionId,\n ),\n }\n : w,\n ),\n );\n },\n [tgClient, telegramRpcOptions, selectedWalletId],\n );\n\n // ── Login modal state ────────────────────────────────────────\n const [loginModalOpen, setLoginModalOpen] = useState(false);\n const openLoginModal = useCallback(() => setLoginModalOpen(true), []);\n const closeLoginModal = useCallback(() => setLoginModalOpen(false), []);\n\n // ── Auth actions ─────────────────────────────────────────────\n const loginTelegram = useCallback(() => {\n const state = randomState();\n sessionStorage.setItem(TELEGRAM_AUTH_STATE_KEY, state);\n\n const configuredReturnTo = config.telegram?.returnTo;\n const returnTo =\n typeof configuredReturnTo === \"function\"\n ? configuredReturnTo()\n : configuredReturnTo || currentReturnTo();\n\n const authUrl = new URL(config.telegram?.authHubUrl || DEFAULT_AUTH_HUB_URL);\n authUrl.searchParams.set(\"return_to\", returnTo);\n authUrl.searchParams.set(\"state\", state);\n authUrl.searchParams.set(\"scope\", normalizeScopes(config.telegram?.scope));\n\n const width = 520;\n const height = 720;\n const left = window.screenX + Math.max(0, (window.outerWidth - width) / 2);\n const top = window.screenY + Math.max(0, (window.outerHeight - height) / 2);\n const popup = window.open(\n authUrl.toString(),\n \"hypurr_telegram_auth\",\n [\n `width=${width}`,\n `height=${height}`,\n `left=${Math.round(left)}`,\n `top=${Math.round(top)}`,\n \"resizable=yes\",\n \"scrollbars=yes\",\n ].join(\",\"),\n );\n\n if (popup) {\n popup.focus();\n return;\n }\n\n window.location.assign(authUrl.toString());\n }, [\n config.telegram?.authHubUrl,\n config.telegram?.returnTo,\n config.telegram?.scope,\n ]);\n\n const connectEoa = useCallback(\n (address: `0x${string}`, signer?: EoaSigner) => {\n eoaSignerRef.current = signer ?? null;\n setEoaAddress(address);\n setTgAuthToken(null);\n setTgUser(null);\n setTgError(null);\n setEoaError(null);\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n\n const existing = loadAgent(address);\n if (existing && existing.validUntil > Date.now()) {\n setAgent(existing);\n } else {\n if (existing) clearStoredAgent(address);\n setAgent(null);\n }\n },\n [],\n );\n\n const approveAgentFn = useCallback(\n async (signTypedDataAsync: SignTypedDataFn, chainId: number) => {\n if (!eoaAddress) {\n throw new Error(\n \"[HypurrConnect] Cannot approve agent: no EOA wallet connected. Call connectEoa(address) first.\",\n );\n }\n\n const currentSigner = eoaSignerRef.current;\n eoaSignerRef.current = {\n signTypedData: signTypedDataAsync,\n signTransaction: currentSigner?.signTransaction,\n request: currentSigner?.request,\n chainId,\n };\n\n setEoaLoading(true);\n setEoaError(null);\n try {\n const existing = loadAgent(eoaAddress);\n if (existing) {\n const isTestnet = config.isTestnet ?? false;\n const valid = await isAgentValid(existing, eoaAddress, isTestnet);\n if (valid) {\n setAgent(existing);\n return;\n }\n clearStoredAgent(eoaAddress);\n }\n\n const { privateKey, address: agentAddress } = await generateAgentKey();\n const isTestnet = config.isTestnet ?? false;\n\n const chainIdHex = `0x${chainId.toString(16)}` as `0x${string}`;\n const nonce = Date.now();\n const action = {\n type: \"approveAgent\" as const,\n signatureChainId: chainIdHex,\n hyperliquidChain: (isTestnet ? \"Testnet\" : \"Mainnet\") as\n | \"Testnet\"\n | \"Mainnet\",\n agentAddress: agentAddress.toLowerCase() as `0x${string}`,\n agentName: AGENT_NAME,\n nonce,\n };\n\n const approveAgentTypes = {\n \"HyperliquidTransaction:ApproveAgent\": [\n { name: \"hyperliquidChain\", type: \"string\" },\n { name: \"agentAddress\", type: \"address\" },\n { name: \"agentName\", type: \"string\" },\n { name: \"nonce\", type: \"uint64\" },\n ],\n };\n\n const wallet = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n signTypedData(params: any) {\n return signTypedDataAsync(params);\n },\n getAddresses: async () => [eoaAddress] as `0x${string}`[],\n getChainId: async () => chainId,\n };\n\n const signature = await signUserSignedAction({\n wallet,\n action,\n types: approveAgentTypes,\n });\n\n const apiUrl = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/exchange\"\n : \"https://api.hyperliquid.xyz/exchange\";\n\n const res = await fetch(apiUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ action, signature, nonce }),\n });\n\n const body = await res.json();\n if (body?.status === \"err\") {\n throw new Error(\n `approveAgent API error: ${body.response ?? JSON.stringify(body)}`,\n );\n }\n\n const remote = await fetchActiveAgent(eoaAddress, isTestnet);\n const validUntil =\n remote?.validUntil ?? Date.now() + 7 * 24 * 60 * 60 * 1000;\n\n const stored: StoredAgent = {\n privateKey,\n address: agentAddress,\n approvedAt: Date.now(),\n validUntil,\n };\n saveAgent(eoaAddress, stored);\n setAgent(stored);\n } catch (err) {\n console.error(\"[HypurrConnect] EOA agent approval failed:\", err);\n setEoaError(err instanceof Error ? err.message : String(err));\n setAgent(null);\n } finally {\n setEoaLoading(false);\n }\n },\n [eoaAddress, config.isTestnet],\n );\n\n const logout = useCallback(() => {\n setTgUser(null);\n setTgError(null);\n setTgAuthToken(null);\n setEoaAddress(null);\n setAgent(null);\n setEoaError(null);\n eoaSignerRef.current = null;\n localStorage.removeItem(TELEGRAM_STORAGE_KEY);\n localStorage.removeItem(LEGACY_TELEGRAM_STORAGE_KEY);\n }, []);\n\n // ── Context value ────────────────────────────────────────────\n const value = useMemo<InternalConnectState>(\n () => ({\n user,\n isLoggedIn: !!user,\n isLoading: tgLoading || eoaLoading,\n error: tgError ?? eoaError,\n authMethod,\n exchange,\n\n wallets,\n selectedWalletId,\n selectWallet,\n\n createWallet,\n deleteWallet,\n renameWallet,\n refreshWallets,\n\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n\n createTwap,\n modifyTwap,\n cancelTwap,\n\n createScale,\n cancelScale,\n\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgent: approveAgentFn,\n logout,\n\n agent,\n agentReady,\n clearAgent: handleClearAgent,\n\n authDataMap,\n authToken: tgAuthToken,\n telegramRpcOptions,\n telegramClient: tgClient,\n staticClient,\n }),\n [\n user,\n tgLoading,\n eoaLoading,\n tgError,\n eoaError,\n authMethod,\n exchange,\n wallets,\n selectedWalletId,\n selectWallet,\n createWallet,\n deleteWallet,\n renameWallet,\n refreshWallets,\n packs,\n createWalletPack,\n addPackLabel,\n modifyPackLabel,\n removePackLabel,\n createTwap,\n modifyTwap,\n cancelTwap,\n createScale,\n cancelScale,\n loginModalOpen,\n openLoginModal,\n closeLoginModal,\n loginTelegram,\n connectEoa,\n signEvmTransaction,\n approveAgentFn,\n logout,\n agent,\n agentReady,\n handleClearAgent,\n authDataMap,\n tgAuthToken,\n telegramRpcOptions,\n tgClient,\n staticClient,\n ],\n );\n\n return (\n <HypurrConnectContext.Provider value={value}>\n {children}\n </HypurrConnectContext.Provider>\n );\n}\n","import type { AbstractViemLocalAccount } from \"@hfunlabs/hyperliquid/signing\";\nimport { privateKeyToAccount, type PrivateKeyAccount } from \"viem/accounts\";\nimport type { Hex } from \"./types\";\n\ntype SignTypedDataParams = Parameters<\n AbstractViemLocalAccount[\"signTypedData\"]\n>[0];\n\n/**\n * Compatibility wrapper for SDK versions that removed PrivateKeySigner.\n *\n * It exposes the viem local-account shape accepted by the Hyperliquid SDK.\n */\nexport class PrivateKeySigner implements AbstractViemLocalAccount {\n #account: PrivateKeyAccount;\n readonly address: Hex;\n\n constructor(privateKey: string) {\n this.#account = privateKeyToAccount(normalizePrivateKey(privateKey));\n this.address = this.#account.address;\n }\n\n signTypedData(params: SignTypedDataParams): Promise<Hex> {\n return this.#account.signTypedData(\n params as Parameters<PrivateKeyAccount[\"signTypedData\"]>[0],\n );\n }\n}\n\nfunction normalizePrivateKey(privateKey: string): Hex {\n return (privateKey.startsWith(\"0x\") ? privateKey : `0x${privateKey}`) as Hex;\n}\n","import type { StoredAgent } from \"./types\";\nimport { PrivateKeySigner } from \"./privateKeySigner\";\n\nexport const AGENT_NAME = \"hypurr-connect\";\n\nconst AGENT_STORAGE_PREFIX = \"hypurr-connect-agent\";\n\nfunction storageKey(masterAddress: string): string {\n return `${AGENT_STORAGE_PREFIX}:${masterAddress.toLowerCase()}`;\n}\n\nexport function loadAgent(masterAddress: string): StoredAgent | null {\n try {\n const raw = localStorage.getItem(storageKey(masterAddress));\n return raw ? JSON.parse(raw) : null;\n } catch {\n return null;\n }\n}\n\nexport function saveAgent(masterAddress: string, agent: StoredAgent): void {\n localStorage.setItem(storageKey(masterAddress), JSON.stringify(agent));\n}\n\nexport function clearAgent(masterAddress: string): void {\n localStorage.removeItem(storageKey(masterAddress));\n}\n\n/**\n * Generate a random 32-byte private key and derive its address using the\n * local PrivateKeySigner compatibility wrapper.\n */\nexport async function generateAgentKey(): Promise<{\n privateKey: `0x${string}`;\n address: `0x${string}`;\n}> {\n const bytes = crypto.getRandomValues(new Uint8Array(32));\n const hex = Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const privateKey = `0x${hex}` as `0x${string}`;\n\n const signer = new PrivateKeySigner(privateKey);\n return { privateKey, address: signer.address };\n}\n\ninterface ExtraAgent {\n address: string;\n name: string;\n validUntil: number;\n}\n\n/**\n * Query the Hyperliquid info API for the named agents registered to a user.\n * Returns the matching entry for AGENT_NAME if it exists and is still valid.\n */\nexport async function fetchActiveAgent(\n userAddress: string,\n isTestnet: boolean,\n): Promise<ExtraAgent | null> {\n const url = isTestnet\n ? \"https://api.hyperliquid-testnet.xyz/info\"\n : \"https://api.hyperliquid.xyz/info\";\n\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ type: \"extraAgents\", user: userAddress }),\n });\n\n if (!res.ok) return null;\n\n const agents: unknown = await res.json();\n if (!Array.isArray(agents)) return null;\n\n const nowMs = Date.now();\n const match = (agents as ExtraAgent[]).find(\n (a) => a.name === AGENT_NAME && a.validUntil * 1000 > nowMs,\n );\n if (!match) return null;\n return { ...match, validUntil: match.validUntil * 1000 };\n}\n\n/**\n * Checks whether a stored agent is still valid: the address must appear in the\n * on-chain `extraAgents` list and not be expired.\n */\nexport async function isAgentValid(\n stored: StoredAgent,\n userAddress: string,\n isTestnet: boolean,\n): Promise<boolean> {\n if (stored.validUntil <= Date.now()) return false;\n\n const remote = await fetchActiveAgent(userAddress, isTestnet);\n if (!remote) return false;\n\n return (\n remote.address.toLowerCase() === stored.address.toLowerCase() &&\n remote.validUntil > Date.now()\n );\n}\n\nconst DEAD_AGENT_PATTERNS = [\n /agent address .+ is not valid/i,\n /unknown signer/i,\n /not authorized/i,\n /not an agent/i,\n];\n\n/**\n * Returns true if the error indicates the agent has been pruned, expired,\n * or is otherwise no longer registered on-chain.\n */\nexport function isDeadAgentError(err: unknown): boolean {\n const msg =\n err instanceof Error\n ? err.message\n : typeof err === \"object\" && err !== null && \"message\" in err\n ? String((err as { message: unknown }).message)\n : String(err);\n return DEAD_AGENT_PATTERNS.some((p) => p.test(msg));\n}\n","import { GrpcWebFetchTransport } from \"@protobuf-ts/grpcweb-transport\";\nimport { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type { HypurrConnectConfig } from \"./types\";\n\nconst DEFAULT_GRPC_URL = \"https://grpc.hypurr.fun\";\n\nfunction createTransport(config: HypurrConnectConfig) {\n return new GrpcWebFetchTransport({\n baseUrl: config.grpcUrl ?? DEFAULT_GRPC_URL,\n timeout: config.grpcTimeout ?? 15_000,\n });\n}\n\nexport function createTelegramClient(\n config: HypurrConnectConfig,\n): TelegramClient {\n return new TelegramClient(createTransport(config));\n}\n\nexport function createStaticClient(config: HypurrConnectConfig): StaticClient {\n return new StaticClient(createTransport(config));\n}\n","import type { IRequestTransport } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\n\nexport interface GrpcExchangeTransportConfig {\n isTestnet?: boolean;\n telegramClient: TelegramClient;\n rpcOptions?: RpcOptions;\n walletId: number;\n onAuthError?: () => void;\n}\n\ninterface ExchangePayload {\n action: { type: string; [key: string]: unknown };\n nonce: number;\n signature?: { r: string; s: string; v: number };\n vaultAddress?: string | null;\n}\n\n/**\n * Routes exchange requests through the Hypurr gRPC backend (HyperliquidCoreAction)\n * for server-side signing. The backend handles signature generation.\n *\n * The SDK-generated nonce is forwarded; the action payload is JSON-encoded as bytes.\n * Info/explorer requests are proxied directly to the Hyperliquid HTTP API.\n */\nexport class GrpcExchangeTransport implements IRequestTransport {\n isTestnet: boolean;\n private telegramClient: TelegramClient;\n private rpcOptions?: RpcOptions;\n private walletId: number;\n private infoUrl: string;\n private onAuthError?: () => void;\n\n constructor(config: GrpcExchangeTransportConfig) {\n this.isTestnet = config.isTestnet ?? false;\n this.telegramClient = config.telegramClient;\n this.rpcOptions = config.rpcOptions;\n this.walletId = config.walletId;\n this.onAuthError = config.onAuthError;\n this.infoUrl = this.isTestnet\n ? \"https://api.hyperliquid-testnet.xyz\"\n : \"https://api.hyperliquid.xyz\";\n }\n\n async request<T>(\n endpoint: \"info\" | \"exchange\" | \"explorer\",\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n if (endpoint === \"exchange\") {\n return this.exchangeViaGrpc<T>(payload as ExchangePayload, signal);\n }\n return this.directRequest<T>(endpoint, payload, signal);\n }\n\n private async exchangeViaGrpc<T>(\n payload: ExchangePayload,\n signal?: AbortSignal,\n ): Promise<T> {\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const actionBytes = new TextEncoder().encode(\n JSON.stringify(payload.action),\n );\n\n console.debug(\"[GrpcExchangeTransport] sending action:\", payload.action);\n\n let response;\n try {\n ({ response } = await this.telegramClient.hyperliquidCoreAction(\n {\n authData: {},\n walletId: this.walletId,\n action: actionBytes,\n nonce: payload.nonce || Date.now(),\n },\n this.rpcOptions,\n ));\n } catch (err) {\n if (\n this.onAuthError &&\n err instanceof Error &&\n /invalid telegram auth data|invalid auth token|missing authorization token/i.test(\n err.message,\n )\n ) {\n this.onAuthError();\n }\n throw err;\n }\n\n if (signal?.aborted) {\n throw new DOMException(\"Request aborted\", \"AbortError\");\n }\n\n const { status, result, error } = response;\n\n console.debug(\n \"[GrpcExchangeTransport] gRPC status:\",\n status,\n \"error:\",\n error,\n );\n\n if (error) {\n throw new Error(`GrpcExchangeTransport: ${error}`);\n }\n\n // The backend's `result` contains the raw Hyperliquid API JSON response.\n // The SDK's assertSuccessResponse expects the same shape as the HTTP API,\n // e.g. { status: \"ok\", response: { type: \"order\", data: { statuses: [...] } } }\n if (result && result.length > 0) {\n const parsed = JSON.parse(new TextDecoder().decode(result));\n console.debug(\"[GrpcExchangeTransport] parsed result:\", parsed);\n return parsed as T;\n }\n\n // Fallback: return a minimal success shape if no result bytes\n return { status: \"ok\", response: status } as T;\n }\n\n private async directRequest<T>(\n endpoint: string,\n payload: unknown,\n signal?: AbortSignal,\n ): Promise<T> {\n const res = await fetch(`${this.infoUrl}/${endpoint}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(payload),\n signal,\n });\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n }\n\n return (await res.json()) as T;\n }\n}\n","import {\n AnimatePresence,\n motion,\n useAnimationControls,\n type PanInfo,\n} from \"framer-motion\";\nimport {\n useCallback,\n useSyncExternalStore,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { MetaMaskColorIcon } from \"./icons/MetaMaskColorIcon\";\nimport { TelegramColorIcon } from \"./icons/TelegramColorIcon\";\n\nexport interface LoginModalProps {\n onConnectWallet: () => void;\n walletIcon?: ReactNode;\n}\n\nconst MOBILE_BREAKPOINT = 640;\n\nconst btnStyle: CSSProperties = {\n display: \"flex\",\n height: 53,\n width: \"100%\",\n alignItems: \"center\",\n gap: 12,\n overflow: \"hidden\",\n borderRadius: 6,\n background: \"rgba(255,255,255,0.05)\",\n padding: \"0 24px\",\n fontSize: 14,\n fontWeight: 600,\n letterSpacing: \"-0.01em\",\n color: \"#fff\",\n cursor: \"pointer\",\n border: \"none\",\n transition: \"background 150ms\",\n};\n\nconst btnHoverBg = { background: \"rgba(255,255,255,0.1)\" };\n\nconst backdropStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 100,\n background: \"rgba(0,0,0,0.6)\",\n backdropFilter: \"blur(2px)\",\n WebkitBackdropFilter: \"blur(2px)\",\n};\n\nconst modalWrapperStyle: CSSProperties = {\n position: \"fixed\",\n inset: 0,\n zIndex: 101,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: 16,\n};\n\nconst modalBoxStyle: CSSProperties = {\n display: \"flex\",\n width: 400,\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n overflow: \"hidden\",\n borderRadius: 12,\n border: \"1px solid rgba(255,255,255,0.1)\",\n background: \"#282828\",\n padding: 24,\n};\n\nconst headingStyle: CSSProperties = {\n fontSize: 16,\n fontWeight: 700,\n letterSpacing: \"-0.025em\",\n color: \"#fff\",\n margin: 0,\n};\n\nconst dividerStyle: CSSProperties = {\n height: 1,\n width: \"100%\",\n background: \"rgba(255,255,255,0.05)\",\n};\n\nconst iconSize: CSSProperties = { width: 20, height: 20 };\n\nconst mobileQuery =\n typeof window !== \"undefined\"\n ? window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT}px)`)\n : null;\n\nfunction subscribeMobile(cb: () => void) {\n mobileQuery?.addEventListener(\"change\", cb);\n return () => mobileQuery?.removeEventListener(\"change\", cb);\n}\n\nfunction getSnapshotMobile() {\n return mobileQuery?.matches ?? false;\n}\n\nfunction useIsMobile() {\n return useSyncExternalStore(subscribeMobile, getSnapshotMobile, () => false);\n}\n\nfunction HoverButton({\n onClick,\n children,\n}: {\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <motion.button\n type=\"button\"\n onClick={onClick}\n style={btnStyle}\n whileHover={btnHoverBg}\n >\n {children}\n </motion.button>\n );\n}\n\nexport function LoginModal({ onConnectWallet, walletIcon }: LoginModalProps) {\n const { loginTelegram, loginModalOpen, closeLoginModal } =\n useHypurrConnectInternal();\n\n const handleTelegramAuth = useCallback(() => {\n closeLoginModal();\n loginTelegram();\n }, [loginTelegram, closeLoginModal]);\n\n const isMobile = useIsMobile();\n\n const modalContent = (\n <>\n <div\n style={{\n display: \"flex\",\n width: \"100%\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 8,\n overflow: \"hidden\",\n }}\n >\n <HoverButton onClick={handleTelegramAuth}>\n <TelegramColorIcon style={iconSize} />\n Telegram\n </HoverButton>\n </div>\n\n <div style={dividerStyle} />\n\n <HoverButton\n onClick={() => {\n closeLoginModal();\n onConnectWallet();\n }}\n >\n {walletIcon ?? <MetaMaskColorIcon style={iconSize} />}\n Wallet\n </HoverButton>\n </>\n );\n\n return (\n <AnimatePresence>\n {loginModalOpen &&\n (isMobile ? (\n <MobileDrawer key=\"drawer\" onClose={closeLoginModal}>\n {modalContent}\n </MobileDrawer>\n ) : (\n <>\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={closeLoginModal}\n />\n <motion.div\n key=\"modal-wrapper\"\n style={modalWrapperStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.05 }}\n onClick={closeLoginModal}\n >\n <motion.div\n style={modalBoxStyle}\n initial={{ scale: 0.96, opacity: 0, y: 8 }}\n animate={{ scale: 1, opacity: 1, y: 0 }}\n exit={{ scale: 0.96, opacity: 0, y: 8 }}\n transition={{ duration: 0.12 }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 style={headingStyle}>Connect</h2>\n {modalContent}\n </motion.div>\n </motion.div>\n </>\n ))}\n </AnimatePresence>\n );\n}\n\nconst drawerSheetStyle: CSSProperties = {\n position: \"fixed\",\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 101,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n gap: 16,\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderLeft: \"1px solid rgba(255,255,255,0.1)\",\n borderRight: \"1px solid rgba(255,255,255,0.1)\",\n borderTop: \"1px solid rgba(255,255,255,0.1)\",\n background: \"#282828\",\n padding: \"12px 24px max(24px, env(safe-area-inset-bottom))\",\n};\n\nconst drawerBgStyle: CSSProperties = {\n position: \"absolute\",\n left: 0,\n right: 0,\n top: 0,\n bottom: \"-100vh\",\n zIndex: -1,\n background: \"#282828\",\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n};\n\nconst grabHandleAreaStyle: CSSProperties = {\n width: \"100%\",\n cursor: \"grab\",\n paddingBottom: 4,\n};\n\nconst grabHandleStyle: CSSProperties = {\n margin: \"0 auto\",\n height: 4,\n width: 100,\n borderRadius: 9999,\n background: \"rgba(255,255,255,0.05)\",\n};\n\nfunction MobileDrawer({\n children,\n onClose,\n}: {\n children: ReactNode;\n onClose: () => void;\n}) {\n const controls = useAnimationControls();\n\n const handleDragEnd = useCallback(\n (_: unknown, info: PanInfo) => {\n if (info.offset.y > 100 || info.velocity.y > 500) {\n onClose();\n } else {\n controls.start({ y: 0 });\n }\n },\n [onClose, controls],\n );\n\n return (\n <>\n <motion.div\n key=\"drawer-backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n\n <motion.div\n key=\"drawer-sheet\"\n style={drawerSheetStyle}\n initial={{ y: \"100%\" }}\n animate={{ y: 0 }}\n exit={{ y: \"100%\" }}\n transition={{ type: \"tween\", duration: 0.3, ease: [0.32, 0.72, 0, 1] }}\n drag=\"y\"\n dragConstraints={{ top: 0, bottom: 0 }}\n dragElastic={{ top: 0, bottom: 0.4 }}\n onDragEnd={handleDragEnd}\n >\n <div style={drawerBgStyle} />\n\n <div style={grabHandleAreaStyle}>\n <div style={grabHandleStyle} />\n </div>\n\n <p style={headingStyle}>Connect</p>\n\n {children}\n </motion.div>\n </>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function MetaMaskColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g clipPath=\"url(#clip0_2567_1088)\">\n <path\n d=\"M19.8188 19.418L15.9421 18.2871L13.0186 19.9994L10.9788 19.9985L8.05356 18.2871L4.17862 19.418L3 15.5193L4.17875 11.1924L3 7.5341L4.17875 3L10.2336 6.54437H13.7639L19.8188 3L20.9976 7.5341L19.8188 11.1924L20.9976 15.5193L19.8188 19.418Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M4.17969 3L10.2347 6.54685L9.99394 8.98101L4.17969 3ZM8.05476 15.5209L10.7189 17.5093L8.05476 18.2869V15.5209ZM10.5059 12.2335L9.99394 8.98275L6.71642 11.1934L6.71464 11.1925V11.1941L6.72479 13.4695L8.05387 12.2336L10.5059 12.2335ZM19.819 3L13.7641 6.54685L14.004 8.98101L19.819 3ZM15.9441 15.5209L13.2798 17.5093L15.9441 18.2869V15.5209ZM17.2833 11.194V11.1924L17.2825 11.1932L14.0049 8.98275L13.4929 12.2335H15.944L17.2739 13.4693L17.2833 11.194Z\"\n fill=\"#FF5C16\"\n />\n <path\n d=\"M8.05369 18.2867L4.17875 19.4177L3 15.5207H8.05369V18.2867ZM10.5049 12.2324L11.245 16.9321L10.2191 14.319L6.72296 13.4691L8.0528 12.2325L10.5049 12.2324ZM15.9438 18.2867L19.8188 19.4177L20.9976 15.5206H15.9438C15.9438 15.5207 15.9438 18.2867 15.9438 18.2867ZM13.4927 12.2324L12.7526 16.9321L13.7783 14.319L17.2748 13.4691L15.944 12.2325L13.4927 12.2324Z\"\n fill=\"#E34807\"\n />\n <path\n d=\"M3 15.5194L4.17875 11.1924H6.71358L6.72283 13.4686L10.2194 14.3185L11.2451 16.9315L10.7178 17.5069L8.05369 15.5185H3V15.5194ZM20.9976 15.5194L19.8188 11.1924H17.2839L17.2746 13.4686L13.7783 14.3185L12.7524 16.9315L13.2796 17.5069L15.9439 15.5185H20.9976V15.5194ZM13.7639 6.54443H10.2336L9.99389 8.97859L11.2453 16.9289H12.7526L14.0047 8.97859L13.7639 6.54443Z\"\n fill=\"#FF8D5D\"\n />\n <path\n d=\"M4.17875 3L3 7.5341L4.17875 11.1924H6.71358L9.99287 8.98114L4.17875 3ZM9.77231 13.1766H8.62399L7.9988 13.7771L10.2202 14.3166L9.77231 13.1757V13.1766ZM19.8188 3L20.9976 7.5341L19.8188 11.1924H17.2839L14.0047 8.98114L19.8188 3ZM14.2269 13.1766H15.3769L16.0021 13.7778L13.7782 14.3184L14.2269 13.1757V13.1766ZM13.0178 18.4484L13.2798 17.5086L12.7524 16.9332H11.244L10.7168 17.5086L10.9787 18.4484\"\n fill=\"#661800\"\n />\n <path\n d=\"M13.0173 18.4482V20.0001H10.9785V18.4482H13.0173Z\"\n fill=\"#C0C4CD\"\n />\n <path\n d=\"M8.05469 18.2854L10.9807 19.9994V18.4475L10.7187 17.5078L8.05469 18.2854ZM15.944 18.2854L13.0179 19.9994V18.4475L13.2799 17.5078L15.944 18.2854Z\"\n fill=\"#E7EBF6\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_2567_1088\">\n <rect\n width=\"18\"\n height=\"17\"\n fill=\"white\"\n transform=\"translate(3 3)\"\n />\n </clipPath>\n </defs>\n </svg>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function TelegramColorIcon({ style }: { style?: CSSProperties }) {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n style={style}\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M12 21C16.9706 21 21 16.9706 21 12C21 7.02944 16.9706 3 12 3C7.02944 3 3 7.02944 3 12C3 16.9706 7.02944 21 12 21Z\"\n fill=\"url(#paint0_linear_2571_1084)\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.07426 11.905C9.69794 10.7619 11.4475 10.0083 12.3229 9.64417C14.8222 8.60458 15.3416 8.424 15.6801 8.41803C15.7546 8.41672 15.921 8.43517 16.0289 8.52267C16.1199 8.59655 16.145 8.69635 16.1569 8.7664C16.1689 8.83645 16.1839 8.99602 16.172 9.1207C16.0366 10.5438 15.4505 13.9973 15.1523 15.5912C15.0262 16.2657 14.7778 16.4918 14.5373 16.514C14.0146 16.562 13.6178 16.1686 13.1115 15.8367C12.3194 15.3175 11.8719 14.9943 11.103 14.4876C10.2145 13.902 10.7905 13.5802 11.2969 13.0542C11.4294 12.9166 13.7322 10.822 13.7768 10.632C13.7824 10.6082 13.7875 10.5196 13.7349 10.4729C13.6823 10.4261 13.6046 10.4421 13.5486 10.4548C13.4691 10.4728 12.2037 11.3092 9.75232 12.964C9.39313 13.2106 9.06779 13.3308 8.7763 13.3245C8.45496 13.3176 7.83681 13.1428 7.37729 12.9934C6.81366 12.8102 6.3657 12.7134 6.40471 12.4022C6.42503 12.2401 6.64821 12.0744 7.07426 11.905Z\"\n fill=\"white\"\n />\n <defs>\n <linearGradient\n id=\"paint0_linear_2571_1084\"\n x1=\"903\"\n y1=\"3\"\n x2=\"903\"\n y2=\"1789.65\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"#2AABEE\" />\n <stop offset=\"1\" stopColor=\"#229ED9\" />\n </linearGradient>\n </defs>\n </svg>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n Fragment,\n useCallback,\n useMemo,\n useState,\n type CSSProperties,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from \"react\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { UserProfileModal, type SlippageOption } from \"./UserProfileModal\";\nimport {\n Copy,\n Crown,\n Folder,\n LayoutDashboard,\n LogOut,\n Plus,\n Star,\n User,\n Wallet,\n} from \"./icons/lucide\";\nimport {\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n resolvePrincipalColors,\n} from \"./profileStyles\";\n\nexport interface WalletSelectorDropdownProps {\n isOpen: boolean;\n onClose: () => void;\n /** Called when the user clicks \"Add Wallet\". Host renders the add-wallet UI. */\n onAddWallet?: () => void;\n /** Called when the user clicks the portfolio icon on a wallet row. */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /**\n * Called before the SDK's `logout()` runs. Host can do extra cleanup\n * (e.g. wagmi `disconnect()`).\n */\n onLogout?: () => void;\n /** Toast callback. Fires \"Address copied\" success on copy-address clicks. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** HFun score threshold for the VIP crown. Defaults to 10. */\n vipThreshold?: number;\n\n // ─── Profile & Settings modal (rendered internally) ────────────\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /** Fired after the SDK successfully deletes a wallet. */\n onWalletDeleted?: (walletId: number) => void;\n /** Fired after the SDK successfully renames a wallet. */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for add-wallet text, wallet icon surfaces, and the Profile & Settings modal. */\n principalColors?: PrincipalColorOverrides;\n /** CSS color used as the dropdown panel background. Defaults to `rgba(20,20,20,0.95)`. */\n backgroundColor?: string;\n}\n\nconst DEFAULT_BACKGROUND_COLOR = \"rgba(20,20,20,0.95)\";\n\ninterface DropdownWallet {\n id: number;\n name?: string | null;\n ethereumAddress?: string;\n}\n\ninterface WalletListItem {\n wallet: DropdownWallet;\n label: string | null;\n}\n\ntype WalletListEntry =\n | { type: \"wallet\"; item: WalletListItem }\n | { type: \"group\"; path: string; items: WalletListItem[] };\n\nconst getWalletNameParts = (name?: string | null) =>\n (name ?? \"\")\n .split(\"/\")\n .map((part) => part.trim())\n .filter(Boolean);\n\nconst buildWalletListEntries = (\n wallets: DropdownWallet[] | undefined,\n): WalletListEntry[] => {\n const standalone: WalletListItem[] = [];\n const grouped = new Map<string, WalletListItem[]>();\n const walletParts = (wallets ?? []).map((wallet) => ({\n wallet,\n parts: getWalletNameParts(wallet.name),\n }));\n const prefixCounts = new Map<string, number>();\n\n walletParts.forEach(({ parts }) => {\n for (let index = 1; index < parts.length; index += 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n prefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n }\n });\n\n walletParts.forEach(({ wallet, parts }) => {\n const groupPath = (() => {\n for (let index = parts.length - 1; index > 0; index -= 1) {\n const prefix = parts.slice(0, index).join(\"/\");\n if ((prefixCounts.get(prefix) ?? 0) > 1) {\n return prefix;\n }\n }\n return null;\n })();\n const groupDepth = groupPath ? groupPath.split(\"/\").length : 0;\n const item: WalletListItem = {\n wallet,\n label: parts.length > 0 ? parts.slice(groupDepth).join(\"/\") : null,\n };\n\n if (!groupPath) {\n standalone.push(item);\n return;\n }\n\n const groupItems = grouped.get(groupPath) ?? [];\n groupItems.push(item);\n grouped.set(groupPath, groupItems);\n });\n\n const entries: WalletListEntry[] = standalone.map((item) => ({\n type: \"wallet\",\n item,\n }));\n\n grouped.forEach((items, path) => {\n if (items.length === 1) {\n entries.push({\n type: \"wallet\",\n item: { ...items[0], label: `${path}/${items[0].label ?? \"\"}` },\n });\n return;\n }\n\n entries.push({\n type: \"group\",\n path,\n items: [...items].sort((a, b) =>\n (a.label ?? \"\").localeCompare(b.label ?? \"\"),\n ),\n });\n });\n\n return entries.sort((a, b) => {\n const aLabel = a.type === \"group\" ? a.path : (a.item.label ?? \"\");\n const bLabel = b.type === \"group\" ? b.path : (b.item.label ?? \"\");\n return aLabel.localeCompare(bLabel);\n });\n};\n\nconst formatCompactAddress = (addr: string | undefined) => {\n if (!addr) return \"\";\n return `${addr.slice(0, 4)}...${addr.slice(-2)}`;\n};\n\nconst rootStyle: CSSProperties = {\n position: \"absolute\",\n right: 0,\n top: \"calc(100% + 4px)\",\n width: 240,\n backdropFilter: \"blur(10px)\",\n WebkitBackdropFilter: \"blur(10px)\",\n borderRadius: 9,\n boxShadow: \"0 8px 40px rgba(0,0,0,0.85)\",\n border: \"1px solid rgba(255,255,255,0.08)\",\n zIndex: 50,\n transformOrigin: \"top right\",\n overflow: \"hidden\",\n};\n\nconst sectionBorder = \"1px solid rgba(255,255,255,0.06)\";\n\nconst sectionHeaderStyle: CSSProperties = {\n padding: \"8px 16px\",\n fontSize: 12,\n fontWeight: 600,\n color: \"#9ca3af\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n};\n\nconst footerBtnStyle: CSSProperties = {\n width: \"100%\",\n textAlign: \"left\",\n padding: \"10px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: \"#9ca3af\",\n transition: \"background 120ms, color 120ms\",\n};\n\nexport function WalletSelectorDropdown({\n isOpen,\n onClose,\n onAddWallet,\n onShowPortfolio,\n onLogout,\n onNotify,\n vipThreshold = 10,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions,\n onWalletDeleted,\n onWalletRenamed,\n accentColor,\n principalColors,\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n}: WalletSelectorDropdownProps): ReactNode {\n const { user, wallets, selectedWalletId, selectWallet, logout, authMethod } =\n useHypurrConnectInternal();\n\n const [profileOpen, setProfileOpen] = useState(false);\n const openProfile = useCallback(() => {\n setProfileOpen(true);\n onClose();\n }, [onClose]);\n\n const walletListEntries = useMemo(\n () => buildWalletListEntries(Array.isArray(wallets) ? wallets : undefined),\n [wallets],\n );\n\n const handleCopyAddress = useCallback(\n (address: string | undefined) => {\n if (!address) return;\n navigator.clipboard.writeText(address);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n },\n [onNotify],\n );\n\n const handleLogout = useCallback(() => {\n onLogout?.();\n logout();\n onClose();\n }, [logout, onClose, onLogout]);\n\n const profilePic = user?.photoUrl;\n const displayName = user?.displayName ?? \"\";\n const hfunScore = user?.hfunScore ?? 0;\n const isVip = hfunScore > vipThreshold;\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const renderWalletRow = (item: WalletListItem, depth: number): ReactNode => {\n const { wallet, label } = item;\n const isSelected = wallet.id === selectedWalletId;\n const compactAddress = formatCompactAddress(wallet.ethereumAddress);\n return (\n <WalletRow\n key={wallet.id}\n depth={depth}\n isSelected={isSelected}\n label={label}\n compactAddress={compactAddress}\n onSelect={() => {\n selectWallet(wallet.id);\n onClose();\n }}\n onShowPortfolio={\n onShowPortfolio\n ? () => {\n onShowPortfolio(wallet as HyperliquidWallet);\n onClose();\n }\n : undefined\n }\n onCopy={() => handleCopyAddress(wallet.ethereumAddress)}\n colors={colors}\n />\n );\n };\n\n return (\n <>\n <AnimatePresence>\n {isOpen && (\n <motion.div\n style={{ ...rootStyle, background: backgroundColor }}\n initial={{ opacity: 0, scale: 0.95 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.95 }}\n transition={{ duration: 0.15, ease: \"easeOut\" }}\n >\n {/* Profile header */}\n <button\n onClick={openProfile}\n style={{\n width: \"100%\",\n padding: \"12px 16px\",\n borderBottom: sectionBorder,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n background: \"transparent\",\n border: \"none\",\n borderBottomColor: \"rgba(255,255,255,0.06)\",\n borderBottomStyle: \"solid\",\n borderBottomWidth: 1,\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background = \"rgba(255,255,255,0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n {profilePic ? (\n <div\n style={{\n position: \"relative\",\n padding: isVip ? 2 : 0,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(to right, #fde047, #eab308, #ca8a04)\"\n : \"transparent\",\n }}\n >\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n display: \"block\",\n }}\n />\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n ) : authMethod === \"eoa\" ? (\n <div\n style={{\n height: 32,\n width: 32,\n borderRadius: 7,\n background: colors.accentBackground,\n border: `1px solid ${colors.accentBorder}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Wallet size={14} color={colors.accentText} />\n </div>\n ) : (\n <div\n style={{\n position: \"relative\",\n height: 32,\n width: 32,\n borderRadius: \"50%\",\n background: isVip\n ? \"linear-gradient(135deg, #ca8a04, #fde047)\"\n : colors.accentBackground,\n border: `1px solid ${\n isVip ? \"rgba(255,255,255,0.08)\" : colors.accentBorder\n }`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: isVip ? profileColors.text : colors.accentText,\n fontSize: 14,\n fontWeight: 700,\n }}\n >\n {displayName.charAt(0)}\n {isVip && (\n <Crown\n size={12}\n color=\"#fde047\"\n fill=\"#eab308\"\n style={{\n position: \"absolute\",\n top: -4,\n right: -2,\n filter: \"drop-shadow(0 1px 2px rgba(0,0,0,0.5))\",\n }}\n />\n )}\n </div>\n )}\n <div style={{ overflow: \"hidden\", flex: 1 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <p\n style={{\n margin: 0,\n fontSize: 14,\n fontWeight: 500,\n color: \"#fff\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </p>\n {hfunScore > 0 && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 2,\n fontSize: 12,\n color: \"#eab308\",\n fontWeight: 500,\n background: \"rgba(234,179,8,0.1)\",\n padding: \"2px 6px\",\n borderRadius: 4,\n }}\n >\n <Star size={10} color=\"#eab308\" fill=\"#eab308\" />\n {hfunScore.toFixed(0)}\n </span>\n )}\n </div>\n </div>\n </button>\n\n {/* Wallets section */}\n <div style={{ borderBottom: sectionBorder }}>\n <div style={sectionHeaderStyle}>Wallets</div>\n <div\n style={{\n maxHeight: 256,\n overflowY: \"auto\",\n paddingBottom: 4,\n }}\n >\n {walletListEntries.map((entry) => {\n if (entry.type === \"wallet\") {\n return renderWalletRow(entry.item, 0);\n }\n const isSelectedGroup = entry.items.some(\n (item) => item.wallet.id === selectedWalletId,\n );\n return (\n <Fragment key={entry.path}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"8px 16px 4px\",\n fontSize: 11,\n fontWeight: 600,\n textTransform: \"uppercase\",\n letterSpacing: \"0.05em\",\n color: isSelectedGroup ? \"#e5e7eb\" : \"#6b7280\",\n }}\n >\n <Folder size={12} style={{ flexShrink: 0 }} />\n <span\n style={{\n minWidth: 0,\n flex: 1,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {entry.path}\n </span>\n <span\n style={{\n flexShrink: 0,\n fontVariantNumeric: \"tabular-nums\",\n color: \"#4b5563\",\n }}\n >\n {entry.items.length}\n </span>\n </div>\n {entry.items.map((item) => renderWalletRow(item, 1))}\n </Fragment>\n );\n })}\n </div>\n {authMethod !== \"eoa\" && onAddWallet && (\n <button\n onClick={() => {\n onAddWallet();\n onClose();\n }}\n style={{\n width: \"100%\",\n textAlign: \"left\",\n padding: \"8px 16px\",\n fontSize: 14,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n color: colors.accentText,\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) =>\n (e.currentTarget.style.background =\n \"rgba(255,255,255,0.06)\")\n }\n onMouseLeave={(e) =>\n (e.currentTarget.style.background = \"transparent\")\n }\n >\n <Plus size={14} />\n Add Wallet\n </button>\n )}\n </div>\n\n {/* Footer actions */}\n <div>\n <FooterBtn\n onClick={openProfile}\n icon={<User size={14} />}\n label=\"Profile & Settings\"\n />\n <FooterBtn\n onClick={handleLogout}\n icon={<LogOut size={14} />}\n label=\"Logout\"\n hoverColor=\"#ef4444\"\n />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n\n <UserProfileModal\n isOpen={profileOpen}\n onClose={() => setProfileOpen(false)}\n animationsEnabled={animationsEnabled}\n onToggleAnimations={onToggleAnimations}\n defaultSlippage={defaultSlippage}\n onSlippageChange={onSlippageChange}\n slippageOptions={slippageOptions}\n accentColor={accentColor}\n principalColors={principalColors}\n onWalletDeleted={onWalletDeleted}\n onWalletRenamed={onWalletRenamed}\n onShowPortfolio={\n onShowPortfolio\n ? (wallet) => {\n onShowPortfolio(wallet);\n setProfileOpen(false);\n }\n : undefined\n }\n onNotify={onNotify}\n />\n </>\n );\n}\n\nfunction FooterBtn({\n onClick,\n icon,\n label,\n hoverColor = \"#fff\",\n}: {\n onClick: () => void;\n icon: ReactNode;\n label: string;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n style={footerBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255,255,255,0.06)\";\n e.currentTarget.style.color = hoverColor;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"#9ca3af\";\n }}\n >\n {icon}\n {label}\n </button>\n );\n}\n\nfunction WalletRow({\n depth,\n isSelected,\n label,\n compactAddress,\n onSelect,\n onShowPortfolio,\n onCopy,\n colors,\n}: {\n depth: number;\n isSelected: boolean;\n label: string | null;\n compactAddress: string;\n onSelect: () => void;\n onShowPortfolio?: () => void;\n onCopy: () => void;\n colors: PrincipalColors;\n}) {\n return (\n <div\n style={{\n width: \"100%\",\n paddingLeft: 16 + depth * 14,\n paddingRight: 16,\n paddingTop: 6,\n paddingBottom: 6,\n fontSize: 14,\n color: \"#d1d5db\",\n display: \"flex\",\n alignItems: \"center\",\n background: isSelected ? \"rgba(255,255,255,0.06)\" : \"transparent\",\n transition: \"background 120ms\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(255,255,255,0.06)\";\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"1\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isSelected\n ? \"rgba(255,255,255,0.06)\"\n : \"transparent\";\n const actions =\n e.currentTarget.querySelector<HTMLDivElement>(\"[data-row-actions]\");\n if (actions) actions.style.opacity = \"0\";\n }}\n >\n <button\n onClick={onSelect}\n style={{\n flex: 1,\n textAlign: \"left\",\n minWidth: 0,\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n cursor: \"pointer\",\n padding: 0,\n }}\n >\n {label ? (\n <>\n <span\n style={{\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n color: isSelected ? \"#fff\" : undefined,\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {label}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n flexShrink: 0,\n color: \"#6b7280\",\n }}\n >\n ({compactAddress})\n </span>\n </>\n ) : (\n <span\n style={{\n fontSize: 12,\n color: isSelected ? \"#fff\" : \"#9ca3af\",\n fontWeight: isSelected ? 500 : undefined,\n }}\n >\n {compactAddress}\n </span>\n )}\n </button>\n <div\n data-row-actions\n style={{\n display: \"flex\",\n alignItems: \"center\",\n opacity: 0,\n transition: \"opacity 120ms\",\n }}\n >\n {onShowPortfolio && (\n <RowIconBtn\n title=\"View portfolio\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onShowPortfolio();\n }}\n >\n <LayoutDashboard size={12} />\n </RowIconBtn>\n )}\n <RowIconBtn\n title=\"Copy address\"\n hoverColor={colors.accent}\n onClick={(e) => {\n e.stopPropagation();\n onCopy();\n }}\n >\n <Copy size={12} />\n </RowIconBtn>\n </div>\n </div>\n );\n}\n\nfunction RowIconBtn({\n children,\n title,\n onClick,\n hoverColor = profileColors.text,\n}: {\n children: ReactNode;\n title: string;\n onClick: (e: ReactMouseEvent<HTMLButtonElement>) => void;\n hoverColor?: string;\n}) {\n return (\n <button\n onClick={onClick}\n title={title}\n style={{\n padding: 4,\n marginLeft: 4,\n background: \"transparent\",\n border: \"none\",\n color: \"#4b5563\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = hoverColor)}\n onMouseLeave={(e) => (e.currentTarget.style.color = \"#4b5563\")}\n >\n {children}\n </button>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { DeleteWalletModal } from \"./DeleteWalletModal\";\nimport { useHypurrConnectInternal } from \"./HypurrConnectProvider\";\nimport { RenameWalletModal } from \"./RenameWalletModal\";\nimport {\n Copy,\n LayoutDashboard,\n Pencil,\n SpinKeyframes,\n Star,\n Trash2,\n TrendingUp,\n User,\n Wallet,\n X,\n Zap,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n type PrincipalColorOverrides,\n type PrincipalColors,\n profileColors,\n raisedButtonStyle,\n resolvePrincipalColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\ntype SettingsTab = \"ui\" | \"trading\" | \"wallets\";\n\nexport interface SlippageOption {\n label: string;\n value: number;\n}\n\nconst DEFAULT_SLIPPAGE_OPTIONS: SlippageOption[] = [\n { label: \"0.5%\", value: 0.005 },\n { label: \"1%\", value: 0.01 },\n { label: \"2%\", value: 0.02 },\n { label: \"5%\", value: 0.05 },\n { label: \"10%\", value: 0.1 },\n];\n\nexport interface UserProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Current value for the \"Animations\" toggle. */\n animationsEnabled: boolean;\n /** Called when the user flips the animations toggle. */\n onToggleAnimations: () => void;\n /** Current default slippage value (e.g. 0.01 = 1%). */\n defaultSlippage: number;\n /** Called when the user picks a slippage option. */\n onSlippageChange: (value: number) => void;\n /** Override the slippage choices. Defaults to 0.5/1/2/5/10%. */\n slippageOptions?: SlippageOption[];\n /**\n * Fired after the SDK successfully deletes a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletDeleted?: (walletId: number) => void;\n /**\n * Fired after the SDK successfully renames a wallet. Use this for extra\n * side effects on the host (e.g. invalidating React Query caches).\n */\n onWalletRenamed?: (walletId: number, name: string) => void;\n /**\n * If provided, each wallet row in the Wallets tab gets a \"View portfolio\"\n * button that fires this callback. The host is expected to open its own\n * portfolio UI in response.\n */\n onShowPortfolio?: (wallet: HyperliquidWallet) => void;\n /** Optional toast callback. SDK fires success on rename/delete; errors stay inline in sub-modals. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Shorthand for `principalColors.accent`. Defaults to `#a855f7`. */\n accentColor?: string;\n /** Principal accent colors used for switches, action text, and wallet icon surfaces. */\n principalColors?: PrincipalColorOverrides;\n}\n\nconst backdropStyle = modalBackdropStyle(100);\nconst wrapperStyle = modalWrapperStyle(101);\nconst panelStyle = modalPanelStyle(false);\nconst headerStyle = modalHeaderStyle;\n\nconst profileSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nconst settingsSectionStyle: CSSProperties = {\n padding: \"20px 24px\",\n};\n\nconst tabRowStyle: CSSProperties = {\n display: \"flex\",\n gap: 6,\n marginBottom: 20,\n};\n\nconst tabButtonLayoutStyle: CSSProperties = {\n flex: 1,\n padding: \"6px 0\",\n borderRadius: 4,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 6,\n cursor: \"pointer\",\n transition: \"background-color 150ms, color 150ms, box-shadow 150ms\",\n};\n\nconst statBoxStyle: CSSProperties = {\n background: \"rgba(255,255,255,0.03)\",\n borderRadius: 8,\n padding: 12,\n border: `1px solid ${profileColors.border}`,\n};\n\nconst slippageBtnBaseStyle: CSSProperties = {\n flex: 1,\n padding: \"4px 0\",\n borderRadius: 4,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontFamily: fontFamily.mono,\n fontWeight: 500,\n cursor: \"pointer\",\n transition: \"background-color 150ms, color 150ms, border-color 150ms\",\n};\n\nconst walletRowStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"10px 12px\",\n borderRadius: 8,\n background: profileColors.surfaceBtn,\n border: `1px solid ${profileColors.surfaceBd}`,\n transition: \"background-color 150ms, border-color 150ms\",\n};\n\nfunction ToggleSwitch({\n checked,\n onChange,\n accentColor,\n}: {\n checked: boolean;\n onChange: () => void;\n accentColor: string;\n}) {\n return (\n <button\n onClick={onChange}\n role=\"switch\"\n aria-checked={checked}\n style={{\n position: \"relative\",\n display: \"inline-flex\",\n height: 20,\n width: 36,\n alignItems: \"center\",\n borderRadius: 9999,\n border: \"none\",\n background: checked ? accentColor : \"rgba(255,255,255,0.08)\",\n cursor: \"pointer\",\n padding: 0,\n transition: \"background 150ms\",\n }}\n >\n <span\n style={{\n display: \"inline-block\",\n height: 12,\n width: 12,\n borderRadius: \"50%\",\n background: profileColors.text,\n transform: checked ? \"translateX(20px)\" : \"translateX(4px)\",\n transition: \"transform 150ms\",\n }}\n />\n </button>\n );\n}\n\nfunction RaisedButton({\n selected = false,\n onClick,\n children,\n style,\n}: {\n selected?: boolean;\n onClick: () => void;\n children: ReactNode;\n style?: CSSProperties;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n ...tabButtonLayoutStyle,\n ...raisedButtonStyle(\n selected ? \"active\" : hovered ? \"hover\" : \"default\",\n ),\n ...style,\n }}\n >\n {children}\n </button>\n );\n}\n\nfunction SlippageButton({\n selected,\n onClick,\n children,\n}: {\n selected: boolean;\n onClick: () => void;\n children: ReactNode;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n type=\"button\"\n onClick={onClick}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n style={{\n ...slippageBtnBaseStyle,\n background: selected\n ? profileColors.surfaceBtnActive\n : hovered\n ? profileColors.surfaceBtnHover\n : profileColors.surfaceBtn,\n border: `1px solid ${\n selected\n ? profileColors.surfaceBdActive\n : hovered\n ? profileColors.surfaceBdHover\n : profileColors.surfaceBd\n }`,\n color: selected\n ? profileColors.text\n : hovered\n ? \"#d1d5db\"\n : profileColors.muted,\n }}\n >\n {children}\n </button>\n );\n}\n\nexport function UserProfileModal({\n isOpen,\n onClose,\n animationsEnabled,\n onToggleAnimations,\n defaultSlippage,\n onSlippageChange,\n slippageOptions = DEFAULT_SLIPPAGE_OPTIONS,\n onWalletDeleted,\n onWalletRenamed,\n onShowPortfolio,\n onNotify,\n accentColor,\n principalColors,\n}: UserProfileModalProps): ReactNode {\n const {\n user,\n wallets: userWallets,\n deleteWallet,\n renameWallet,\n authMethod,\n } = useHypurrConnectInternal();\n\n const [settingsTab, setSettingsTab] = useState<SettingsTab>(\"ui\");\n const [walletToDelete, setWalletToDelete] =\n useState<HyperliquidWallet | null>(null);\n const [walletToRename, setWalletToRename] =\n useState<HyperliquidWallet | null>(null);\n\n const profilePic = user?.photoUrl || \"\";\n const displayName = user?.displayName || \"\";\n const hfunScore = user?.hfunScore ?? null;\n const reputationScore = user?.reputationScore ?? null;\n const telegramId = user?.telegramId;\n const wallets = userWallets ?? [];\n const colors = resolvePrincipalColors(accentColor, principalColors);\n\n const handleDeleteWallet = useCallback(\n async (walletId: number) => {\n await deleteWallet(walletId);\n onWalletDeleted?.(walletId);\n },\n [deleteWallet, onWalletDeleted],\n );\n\n const handleRenameWallet = useCallback(\n async (walletId: number, name: string) => {\n await renameWallet(walletId, name);\n onWalletRenamed?.(walletId, name);\n },\n [renameWallet, onWalletRenamed],\n );\n\n const handleCopyAddress = useCallback(() => {\n if (!displayName) return;\n navigator.clipboard.writeText(displayName);\n onNotify?.({ type: \"success\", message: \"Address copied\" });\n }, [displayName, onNotify]);\n\n return (\n <>\n <AnimatePresence>\n {isOpen && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={onClose}\n />\n <div style={wrapperStyle} onClick={onClose}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div style={headerStyle}>\n <h3 style={titleStyle}>Profile & Settings</h3>\n <button\n onClick={onClose}\n style={makeCloseBtnStyle()}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n {/* Profile Section */}\n <div style={profileSectionStyle}>\n {authMethod === \"eoa\" && !profilePic ? (\n <div\n style={{\n padding: \"10px 12px\",\n background: \"rgba(255,255,255,0.03)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n }}\n >\n <p\n style={{\n margin: \"0 0 6px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: 8,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {displayName}\n </p>\n <button\n onClick={handleCopyAddress}\n style={{\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: \"pointer\",\n flexShrink: 0,\n display: \"flex\",\n }}\n aria-label=\"Copy address\"\n >\n <Copy size={13} />\n </button>\n </div>\n </div>\n ) : (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 16,\n }}\n >\n {profilePic ? (\n <img\n src={profilePic}\n alt=\"Profile\"\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n }}\n />\n ) : (\n <div\n style={{\n height: 56,\n width: 56,\n borderRadius: \"50%\",\n border: `1px solid ${profileColors.surfaceBd}`,\n background: profileColors.surfaceBd,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n }}\n >\n {displayName?.charAt(0)}\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <h4\n style={{\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {displayName}\n </h4>\n {telegramId && (\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n ID: {telegramId}\n </p>\n )}\n </div>\n </div>\n )}\n\n {user && (\n <div\n style={{\n marginTop: 16,\n display: \"grid\",\n gridTemplateColumns: \"1fr 1fr\",\n gap: 10,\n }}\n >\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: \"#eab308\",\n marginBottom: 6,\n }}\n >\n <Star size={13} color=\"#eab308\" fill=\"#eab308\" />\n <span style={upperLabelStyle}>Hfun Score</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {hfunScore !== null ? hfunScore.toFixed(0) : \"--\"}\n </p>\n </div>\n <div style={statBoxStyle}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n color: profileColors.muted,\n marginBottom: 6,\n }}\n >\n <User size={13} />\n <span style={upperLabelStyle}>Reputation</span>\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 18,\n lineHeight: \"1.75rem\",\n fontWeight: 700,\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n }}\n >\n {reputationScore !== null\n ? reputationScore.toFixed(0)\n : \"--\"}\n </p>\n </div>\n </div>\n )}\n </div>\n\n {/* Settings Section */}\n <div style={settingsSectionStyle}>\n <div style={tabRowStyle}>\n <RaisedButton\n selected={settingsTab === \"ui\"}\n onClick={() => setSettingsTab(\"ui\")}\n >\n <Zap size={13} /> UI\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"trading\"}\n onClick={() => setSettingsTab(\"trading\")}\n >\n <TrendingUp size={13} /> Trading\n </RaisedButton>\n <RaisedButton\n selected={settingsTab === \"wallets\"}\n onClick={() => setSettingsTab(\"wallets\")}\n >\n <Wallet size={13} /> Wallets\n </RaisedButton>\n </div>\n\n {settingsTab === \"ui\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"8px 0\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n <Zap size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Animations\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Enable chart and UI animations\n </p>\n </div>\n </div>\n <ToggleSwitch\n checked={animationsEnabled}\n onChange={onToggleAnimations}\n accentColor={colors.accent}\n />\n </div>\n </div>\n )}\n\n {settingsTab === \"trading\" && (\n <div style={{ padding: \"8px 0\" }}>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n marginBottom: 12,\n }}\n >\n <TrendingUp size={16} color={profileColors.muted} />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n Default Slippage\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n Max price deviation for market orders\n </p>\n </div>\n </div>\n <div style={{ display: \"flex\", gap: 6 }}>\n {slippageOptions.map((option) => (\n <SlippageButton\n key={option.value}\n onClick={() => onSlippageChange(option.value)}\n selected={defaultSlippage === option.value}\n >\n {option.label}\n </SlippageButton>\n ))}\n </div>\n </div>\n )}\n\n {settingsTab === \"wallets\" && (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 8,\n }}\n >\n {wallets.length === 0 ? (\n <div\n style={{\n textAlign: \"center\",\n padding: \"32px 0\",\n }}\n >\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: \"50%\",\n background: \"rgba(255,255,255,0.04)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n margin: \"0 auto 12px\",\n }}\n >\n <Wallet size={18} color={profileColors.muted} />\n </div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n }}\n >\n No wallets yet\n </p>\n </div>\n ) : (\n <div\n style={{\n maxHeight: 208,\n overflowY: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n {wallets.map((wallet) => (\n <WalletRow\n key={wallet.id}\n wallet={wallet}\n colors={colors}\n onRename={() => setWalletToRename(wallet)}\n onDelete={() => setWalletToDelete(wallet)}\n onShowPortfolio={\n onShowPortfolio\n ? () => onShowPortfolio(wallet)\n : undefined\n }\n />\n ))}\n </div>\n )}\n <p\n style={{\n margin: \"4px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n textAlign: \"center\",\n }}\n >\n {wallets.length} wallet\n {wallets.length !== 1 ? \"s\" : \"\"} linked\n </p>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div style={{ padding: \"0 24px 24px\" }}>\n <button\n onClick={onClose}\n style={{\n ...raisedButtonStyle(\"default\"),\n width: \"100%\",\n padding: \"6px 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n borderRadius: 8,\n cursor: \"pointer\",\n }}\n >\n Close\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n\n <DeleteWalletModal\n isOpen={!!walletToDelete}\n onClose={() => setWalletToDelete(null)}\n wallet={walletToDelete}\n onConfirm={handleDeleteWallet}\n onNotify={onNotify}\n />\n <RenameWalletModal\n isOpen={!!walletToRename}\n onClose={() => setWalletToRename(null)}\n wallet={walletToRename}\n onConfirm={handleRenameWallet}\n onNotify={onNotify}\n accentColor={colors.accent}\n />\n </>\n );\n}\n\nfunction WalletRow({\n wallet,\n colors,\n onRename,\n onDelete,\n onShowPortfolio,\n}: {\n wallet: HyperliquidWallet;\n colors: PrincipalColors;\n onRename: () => void;\n onDelete: () => void;\n onShowPortfolio?: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <div\n style={{\n ...walletRowStyle,\n background: hovered\n ? profileColors.surfaceBtnHover\n : profileColors.surfaceBtn,\n borderColor: hovered\n ? profileColors.surfaceBdHover\n : profileColors.surfaceBd,\n }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n >\n <div\n style={{\n width: 32,\n height: 32,\n borderRadius: 6,\n background: colors.accentBackground,\n border: `1px solid ${colors.accentBorder}`,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <span\n style={{\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 600,\n color: colors.accentText,\n }}\n >\n {(wallet.name || \"W\")[0].toUpperCase()}\n </span>\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {wallet.name || \"Unnamed\"}\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n }}\n >\n {wallet.ethereumAddress?.slice(0, 6)}...\n {wallet.ethereumAddress?.slice(-4)}\n </p>\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 4,\n flexShrink: 0,\n opacity: hovered ? 1 : 0,\n transition: \"opacity 120ms\",\n }}\n >\n {onShowPortfolio && (\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"View portfolio\"\n ariaLabel={`View portfolio for ${wallet.name || \"wallet\"}`}\n onClick={onShowPortfolio}\n >\n <LayoutDashboard size={13} />\n </IconBtn>\n )}\n <IconBtn\n color={colors.accent}\n hoverBackgroundColor={colors.accentHoverBackground}\n title=\"Rename wallet\"\n ariaLabel={`Rename ${wallet.name || \"wallet\"}`}\n onClick={onRename}\n >\n <Pencil size={13} />\n </IconBtn>\n <IconBtn\n color=\"#ef4444\"\n hoverBackgroundColor=\"rgba(239,68,68,0.1)\"\n title=\"Delete wallet\"\n ariaLabel={`Delete ${wallet.name || \"wallet\"}`}\n onClick={onDelete}\n >\n <Trash2 size={13} />\n </IconBtn>\n </div>\n </div>\n );\n}\n\nfunction IconBtn({\n children,\n color,\n hoverBackgroundColor,\n title,\n ariaLabel,\n onClick,\n}: {\n children: ReactNode;\n color: string;\n hoverBackgroundColor?: string;\n title: string;\n ariaLabel: string;\n onClick: () => void;\n}) {\n const [hovered, setHovered] = useState(false);\n return (\n <button\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onClick={onClick}\n title={title}\n aria-label={ariaLabel}\n style={{\n padding: 6,\n borderRadius: 4,\n background: hovered\n ? (hoverBackgroundColor ?? \"transparent\")\n : \"transparent\",\n border: \"none\",\n color: hovered ? color : profileColors.disabled,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n transition: \"color 120ms, background 120ms\",\n }}\n >\n {children}\n </button>\n );\n}\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n SpinKeyframes,\n Trash2,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n dangerOutlineButtonStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface DeleteWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number) => Promise<void>;\n /** Optional toast callback. Fires `{type:\"success\"}` on delete; errors are shown inline. */\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n}\n\nconst DANGER_BG = \"rgba(248,113,113,0.07)\";\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst warningBoxStyle: CSSProperties = {\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 12,\n padding: 14,\n background: DANGER_BG,\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgba(255,255,255,0.03)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (disabled: boolean): CSSProperties => ({\n width: \"100%\",\n background: \"rgba(13,18,25,0.9)\",\n border: `1px solid ${profileColors.surfaceBd}`,\n borderRadius: 8,\n padding: \"10px 12px\",\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n transition: \"border-color 150ms, background-color 150ms\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst deleteButtonStyle = (\n enabled: boolean,\n hovered: boolean,\n): CSSProperties => ({\n ...dangerOutlineButtonStyle(enabled, hovered),\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n transition: \"background-color 150ms, color 150ms, border-color 150ms\",\n});\n\nexport function DeleteWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: DeleteWalletModalProps): ReactNode {\n const [confirmName, setConfirmName] = useState(\"\");\n const [isDeleting, setIsDeleting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [deleteHovered, setDeleteHovered] = useState(false);\n\n const walletName = wallet?.name || \"Unnamed Wallet\";\n const isNameMatch = confirmName === walletName;\n const canDelete = isNameMatch && !isDeleting;\n\n const handleClose = useCallback(() => {\n if (isDeleting) return;\n setConfirmName(\"\");\n setError(null);\n onClose();\n }, [isDeleting, onClose]);\n\n const handleDelete = useCallback(async () => {\n if (!wallet || !isNameMatch) return;\n setError(null);\n setIsDeleting(true);\n try {\n await onConfirm(wallet.id);\n setConfirmName(\"\");\n onNotify?.({ type: \"success\", message: \"Wallet deleted successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to delete wallet\");\n } finally {\n setIsDeleting(false);\n }\n }, [wallet, isNameMatch, onConfirm, onClose, onNotify]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Delete Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isDeleting}\n style={makeCloseBtnStyle(isDeleting)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={warningBoxStyle}>\n <AlertTriangle\n size={15}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <div>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n fontWeight: 500,\n }}\n >\n This action cannot be undone\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: \"rgba(248,113,113,0.7)\",\n }}\n >\n The private key will be permanently deleted. Any remaining\n funds will be inaccessible.\n </p>\n </div>\n </div>\n\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet to delete\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {walletName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {wallet.ethereumAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>\n Type{\" \"}\n <span\n style={{\n color: profileColors.text,\n fontWeight: 500,\n }}\n >\n "{walletName}"\n </span>{\" \"}\n to confirm\n </label>\n <input\n type=\"text\"\n value={confirmName}\n onChange={(e) => setConfirmName(e.target.value)}\n placeholder={walletName}\n disabled={isDeleting}\n style={inputStyle(isDeleting)}\n />\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleDelete}\n disabled={!canDelete}\n onMouseEnter={() => setDeleteHovered(true)}\n onMouseLeave={() => setDeleteHovered(false)}\n style={deleteButtonStyle(canDelete, deleteHovered)}\n >\n {isDeleting ? (\n <>\n <Loader2 size={14} /> Deleting...\n </>\n ) : (\n <>\n <Trash2 size={14} /> Delete Wallet\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { CSSProperties, SVGProps } from \"react\";\n\ninterface IconProps extends Omit<SVGProps<SVGSVGElement>, \"fill\"> {\n size?: number;\n color?: string;\n fill?: string;\n style?: CSSProperties;\n}\n\nfunction svgBase({\n size = 16,\n color = \"currentColor\",\n fill = \"none\",\n ...rest\n}: IconProps) {\n return {\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill,\n stroke: color,\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n ...rest,\n };\n}\n\nexport function Copy(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n );\n}\n\nexport function Star(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function User(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n );\n}\n\nexport function Zap(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\" />\n </svg>\n );\n}\n\nexport function Wallet(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 12V8H6a2 2 0 0 1-2-2c0-1.1.9-2 2-2h12v4\" />\n <path d=\"M4 6v12c0 1.1.9 2 2 2h14v-4\" />\n <path d=\"M18 12a2 2 0 0 0-2 2c0 1.1.9 2 2 2h4v-4z\" />\n </svg>\n );\n}\n\nexport function TrendingUp(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <polyline points=\"22 7 13.5 15.5 8.5 10.5 2 17\" />\n <polyline points=\"16 7 22 7 22 13\" />\n </svg>\n );\n}\n\nexport function Trash2(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Pencil(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n );\n}\n\nexport function LayoutDashboard(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <rect width=\"7\" height=\"9\" x=\"3\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"14\" y=\"3\" rx=\"1\" />\n <rect width=\"7\" height=\"9\" x=\"14\" y=\"12\" rx=\"1\" />\n <rect width=\"7\" height=\"5\" x=\"3\" y=\"16\" rx=\"1\" />\n </svg>\n );\n}\n\nexport function AlertTriangle(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </svg>\n );\n}\n\nexport function Loader2(props: IconProps) {\n const { size = 16, color = \"currentColor\", style, ...rest } = props;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{\n animation: \"hypurr-spin 1s linear infinite\",\n ...style,\n }}\n {...rest}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function Crown(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.734H5.81a1 1 0 0 1-.957-.734L2.02 6.02a.5.5 0 0 1 .798-.519l4.276 3.664a1 1 0 0 0 1.516-.294z\" />\n <path d=\"M5 21h14\" />\n </svg>\n );\n}\n\nexport function Folder(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\" />\n </svg>\n );\n}\n\nexport function LogOut(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" />\n <polyline points=\"16 17 21 12 16 7\" />\n <line x1=\"21\" x2=\"9\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n}\n\nexport function Plus(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nexport function X(props: IconProps) {\n return (\n <svg {...svgBase(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/** Inject the keyframes used by {@link Loader2}. Mount once at the top of any modal that spins. */\nexport function SpinKeyframes() {\n return (\n <style>{`@keyframes hypurr-spin { to { transform: rotate(360deg); } }`}</style>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport const profileColors = {\n accent: \"#a855f7\",\n panel: \"rgba(14,18,24,0.8)\",\n panelSolid: \"#0e1218\",\n backdrop: \"rgba(0,0,0,0.7)\",\n border: \"#1f2937\",\n surfaceBtn: \"#0D1219\",\n surfaceBtnHover: \"#15171A\",\n surfaceBtnActive: \"#1E2124\",\n surfaceBd: \"#262A30\",\n surfaceBdHover: \"#444548\",\n surfaceBdActive: \"#4B4D50\",\n text: \"#ffffff\",\n muted: \"#aab1c1\",\n subdued: \"#7d8597\",\n disabled: \"#4b5563\",\n danger: \"#f87171\",\n dangerStrong: \"#ef4444\",\n purple: \"#d8b4fe\",\n yellow: \"#eab308\",\n};\n\nexport const fontFamily = {\n sans: \"Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif\",\n mono: \"Google Sans Code, Roboto Mono, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace\",\n};\n\nexport interface PrincipalColors {\n accent: string;\n accentText: string;\n accentBackground: string;\n accentBorder: string;\n accentHoverBackground: string;\n}\n\nexport type PrincipalColorOverrides = Partial<PrincipalColors>;\n\nconst colorWithAlpha = (color: string, alpha: number): string => {\n const hex = color.trim();\n const shortHex = /^#([0-9a-f]{3})$/i.exec(hex);\n const longHex = /^#([0-9a-f]{6})$/i.exec(hex);\n\n if (shortHex) {\n const [r, g, b] = shortHex[1].split(\"\").map((value) => value + value);\n return `rgba(${parseInt(r, 16)},${parseInt(g, 16)},${parseInt(b, 16)},${alpha})`;\n }\n\n if (longHex) {\n const value = longHex[1];\n return `rgba(${parseInt(value.slice(0, 2), 16)},${parseInt(\n value.slice(2, 4),\n 16,\n )},${parseInt(value.slice(4, 6), 16)},${alpha})`;\n }\n\n return `color-mix(in srgb, ${color} ${Math.round(alpha * 100)}%, transparent)`;\n};\n\nexport const resolvePrincipalColors = (\n accentColor?: string,\n overrides: PrincipalColorOverrides = {},\n): PrincipalColors => {\n const hasCustomAccent = !!accentColor || !!overrides.accent;\n const accent = overrides.accent ?? accentColor ?? profileColors.accent;\n const accentText =\n overrides.accentText ?? (hasCustomAccent ? accent : profileColors.purple);\n\n return {\n accent,\n accentText,\n accentBackground: overrides.accentBackground ?? colorWithAlpha(accent, 0.1),\n accentBorder: overrides.accentBorder ?? colorWithAlpha(accent, 0.25),\n accentHoverBackground:\n overrides.accentHoverBackground ?? colorWithAlpha(accent, 0.1),\n };\n};\n\nexport const modalBackdropStyle = (zIndex: number): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n background: profileColors.backdrop,\n backdropFilter: \"blur(4px)\",\n WebkitBackdropFilter: \"blur(4px)\",\n});\n\nexport const modalWrapperStyle = (\n zIndex: number,\n padding = 0,\n): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding,\n});\n\nexport const modalPanelStyle = (solid = false): CSSProperties => ({\n position: \"relative\",\n width: \"100%\",\n maxWidth: 448,\n background: solid ? profileColors.panelSolid : profileColors.panel,\n backdropFilter: solid ? undefined : \"blur(10px)\",\n WebkitBackdropFilter: solid ? undefined : \"blur(10px)\",\n border: `1px solid ${profileColors.border}`,\n borderRadius: 8,\n boxShadow: \"0 25px 50px -12px rgba(0,0,0,0.6)\",\n overflow: \"hidden\",\n fontFamily: fontFamily.sans,\n});\n\nexport const modalHeaderStyle: CSSProperties = {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"24px 24px 20px\",\n borderBottom: `1px solid ${profileColors.border}`,\n};\n\nexport const titleStyle: CSSProperties = {\n margin: 0,\n fontSize: 14,\n lineHeight: \"1.25rem\",\n fontWeight: 600,\n color: profileColors.text,\n};\n\nexport const closeBtnStyle = (disabled = false): CSSProperties => ({\n position: \"absolute\",\n right: 24,\n background: \"transparent\",\n border: \"none\",\n color: profileColors.muted,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n padding: 0,\n display: \"flex\",\n opacity: disabled ? 0.4 : 1,\n transition: \"color 150ms\",\n});\n\nexport const upperLabelStyle: CSSProperties = {\n fontSize: 11,\n lineHeight: \"1rem\",\n fontWeight: 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.1em\",\n};\n\nexport const raisedButtonStyle = (\n state: \"default\" | \"hover\" | \"active\" | \"disabled\" = \"default\",\n): CSSProperties => {\n if (state === \"active\") {\n return {\n backgroundColor: profileColors.surfaceBtnActive,\n backgroundImage:\n \"linear-gradient(to bottom, rgba(255,255,255,0.05), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgba(255,255,255,0.18), inset 0 -1px 0 rgba(0,0,0,0.45), inset 0 0 0 1px #4B4D50, 0 1px 2px rgba(0,0,0,0.5)\",\n color: profileColors.text,\n border: \"none\",\n };\n }\n\n if (state === \"disabled\") {\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgba(255,255,255,0.02), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgba(255,255,255,0.05), inset 0 -1px 0 rgba(0,0,0,0.25), inset 0 0 0 1px #1c2026\",\n color: profileColors.subdued,\n border: \"none\",\n cursor: \"not-allowed\",\n };\n }\n\n if (state === \"hover\") {\n return {\n backgroundColor: profileColors.surfaceBtnHover,\n backgroundImage:\n \"linear-gradient(to bottom, rgba(255,255,255,0.04), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgba(255,255,255,0.14), inset 0 -1px 0 rgba(0,0,0,0.40), inset 0 0 0 1px #444548\",\n color: \"#d1d5db\",\n border: \"none\",\n };\n }\n\n return {\n backgroundColor: profileColors.surfaceBtn,\n backgroundImage:\n \"linear-gradient(to bottom, rgba(255,255,255,0.03), transparent)\",\n boxShadow:\n \"inset 0 1px 0 rgba(255,255,255,0.10), inset 0 -1px 0 rgba(0,0,0,0.35), inset 0 0 0 1px #262A30\",\n color: profileColors.muted,\n border: \"none\",\n };\n};\n\nexport const dangerOutlineButtonStyle = (\n enabled: boolean,\n hovered = false,\n): CSSProperties => ({\n background: enabled && hovered ? \"rgba(248,113,113,0.1)\" : \"transparent\",\n border: `1px solid ${enabled ? profileColors.danger : \"#374151\"}`,\n color: enabled ? profileColors.danger : profileColors.disabled,\n cursor: enabled ? \"pointer\" : \"not-allowed\",\n});\n","import { AnimatePresence, motion } from \"framer-motion\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\nimport {\n useCallback,\n useEffect,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport {\n AlertTriangle,\n Loader2,\n Pencil,\n SpinKeyframes,\n X,\n} from \"./icons/lucide\";\nimport {\n closeBtnStyle as makeCloseBtnStyle,\n fontFamily,\n modalBackdropStyle,\n modalHeaderStyle,\n modalPanelStyle,\n modalWrapperStyle,\n profileColors,\n raisedButtonStyle,\n titleStyle,\n upperLabelStyle,\n} from \"./profileStyles\";\n\nexport interface RenameWalletModalProps {\n isOpen: boolean;\n onClose: () => void;\n wallet: HyperliquidWallet | null;\n onConfirm: (walletId: number, name: string) => Promise<void>;\n onNotify?: (n: { type: \"success\" | \"error\"; message: string }) => void;\n /** Kept for compatibility. Profile modal actions now use the shared app raised button style. */\n accentColor?: string;\n}\n\nconst DANGER_BORDER = \"rgba(248,113,113,0.2)\";\nconst WALLET_NAME_REGEX = /^[a-zA-Z0-9/]+$/;\n\nconst backdropStyle = modalBackdropStyle(110);\nconst wrapperStyle = modalWrapperStyle(111, 16);\nconst panelStyle: CSSProperties = {\n ...modalPanelStyle(true),\n border: `1px solid ${profileColors.surfaceBd}`,\n};\nconst headerStyle: CSSProperties = {\n ...modalHeaderStyle,\n borderBottom: \"1px solid rgba(255,255,255,0.06)\",\n};\n\nconst bodyStyle: CSSProperties = {\n padding: \"20px 24px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n};\n\nconst infoBoxStyle: CSSProperties = {\n padding: \"10px 12px\",\n background: \"rgba(255,255,255,0.03)\",\n border: \"1px solid rgba(255,255,255,0.06)\",\n borderRadius: 8,\n};\n\nconst labelStyle: CSSProperties = {\n display: \"block\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n marginBottom: 8,\n};\n\nconst inputStyle = (hasError: boolean, disabled: boolean): CSSProperties => ({\n width: \"100%\",\n background: \"rgba(13,18,25,0.9)\",\n border: `1px solid ${\n hasError ? \"rgba(248,113,113,0.5)\" : profileColors.surfaceBd\n }`,\n borderRadius: 8,\n padding: \"10px 12px\",\n color: profileColors.text,\n fontFamily: fontFamily.mono,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n outline: \"none\",\n opacity: disabled ? 0.5 : 1,\n boxSizing: \"border-box\",\n transition: \"border-color 150ms, background-color 150ms\",\n});\n\nconst footerStyle: CSSProperties = {\n padding: \"0 24px 24px\",\n};\n\nconst saveButtonStyle = (\n enabled: boolean,\n hovered: boolean,\n): CSSProperties => ({\n ...raisedButtonStyle(enabled ? (hovered ? \"hover\" : \"default\") : \"disabled\"),\n width: \"100%\",\n padding: \"8px 0\",\n borderRadius: 8,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n});\n\nexport function RenameWalletModal({\n isOpen,\n onClose,\n wallet,\n onConfirm,\n onNotify,\n}: RenameWalletModalProps): ReactNode {\n const [name, setName] = useState(\"\");\n const [isRenaming, setIsRenaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [saveHovered, setSaveHovered] = useState(false);\n\n const currentName = wallet?.name || \"Unnamed\";\n const trimmedName = name.trim();\n const isNameChanged = trimmedName !== currentName;\n const isNameValid = WALLET_NAME_REGEX.test(trimmedName);\n const canSubmit = isNameValid && isNameChanged && !isRenaming;\n\n useEffect(() => {\n if (!wallet) return;\n setName(wallet.name || \"\");\n setError(null);\n }, [wallet]);\n\n const handleClose = useCallback(() => {\n if (isRenaming) return;\n setError(null);\n onClose();\n }, [isRenaming, onClose]);\n\n const handleRename = useCallback(async () => {\n if (!wallet || !isNameValid || !isNameChanged) return;\n setError(null);\n setIsRenaming(true);\n try {\n await onConfirm(wallet.id, trimmedName);\n onNotify?.({ type: \"success\", message: \"Wallet renamed successfully\" });\n onClose();\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : \"Failed to rename wallet\");\n } finally {\n setIsRenaming(false);\n }\n }, [\n wallet,\n isNameValid,\n isNameChanged,\n onConfirm,\n trimmedName,\n onClose,\n onNotify,\n ]);\n\n return (\n <AnimatePresence>\n {isOpen && wallet && (\n <>\n <SpinKeyframes />\n <motion.div\n key=\"backdrop\"\n style={backdropStyle}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15 }}\n onClick={handleClose}\n />\n <div style={wrapperStyle}>\n <motion.div\n key=\"panel\"\n style={panelStyle}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: 8 }}\n transition={{ duration: 0.18, ease: \"easeOut\" }}\n onClick={(e) => e.stopPropagation()}\n >\n <div style={headerStyle}>\n <h3 style={titleStyle}>Rename Wallet</h3>\n <button\n onClick={handleClose}\n disabled={isRenaming}\n style={makeCloseBtnStyle(isRenaming)}\n aria-label=\"Close\"\n >\n <X size={16} />\n </button>\n </div>\n\n <div style={bodyStyle}>\n <div style={infoBoxStyle}>\n <p\n style={{\n margin: \"0 0 4px\",\n color: profileColors.muted,\n ...upperLabelStyle,\n }}\n >\n Wallet\n </p>\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n fontWeight: 500,\n color: profileColors.text,\n }}\n >\n {currentName}\n </p>\n <p\n style={{\n margin: \"2px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.muted,\n fontFamily: fontFamily.mono,\n wordBreak: \"break-all\",\n }}\n >\n {wallet.ethereumAddress}\n </p>\n </div>\n\n <div>\n <label style={labelStyle}>Wallet name</label>\n <input\n type=\"text\"\n value={name}\n onChange={(e) => {\n setName(e.target.value);\n setError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleRename();\n if (e.key === \"Escape\") handleClose();\n }}\n disabled={isRenaming}\n autoFocus\n style={inputStyle(!!error, isRenaming)}\n />\n <p\n style={{\n margin: \"8px 0 0\",\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.subdued,\n }}\n >\n Use letters, numbers, and / only.\n </p>\n </div>\n\n {error && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: 12,\n background: \"rgba(248,113,113,0.08)\",\n border: `1px solid ${DANGER_BORDER}`,\n borderRadius: 8,\n }}\n >\n <AlertTriangle\n size={14}\n color={profileColors.danger}\n style={{ flexShrink: 0, marginTop: 2 }}\n />\n <p\n style={{\n margin: 0,\n fontSize: 12.5,\n lineHeight: \"1rem\",\n color: profileColors.danger,\n }}\n >\n {error}\n </p>\n </div>\n )}\n </div>\n\n <div style={footerStyle}>\n <button\n onClick={handleRename}\n disabled={!canSubmit}\n onMouseEnter={() => setSaveHovered(true)}\n onMouseLeave={() => setSaveHovered(false)}\n style={saveButtonStyle(canSubmit, saveHovered)}\n >\n {isRenaming ? (\n <>\n <Loader2 size={14} /> Saving...\n </>\n ) : (\n <>\n <Pencil size={14} /> Save Name\n </>\n )}\n </button>\n </div>\n </motion.div>\n </div>\n </>\n )}\n </AnimatePresence>\n );\n}\n","import type { ExchangeClient } from \"@hfunlabs/hyperliquid\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { StaticClient } from \"hypurr-grpc/ts/hypurr/static/static_service.client\";\nimport type {\n HyperliquidScaleCreateRequest,\n HyperliquidTwapCreateRequest,\n HyperliquidTwapModifyRequest,\n} from \"hypurr-grpc/ts/hypurr/telegram/telegram_service\";\nimport type { TelegramClient } from \"hypurr-grpc/ts/hypurr/telegram/telegram_service.client\";\nimport type {\n HyperliquidWalletScaleSession,\n HyperliquidWalletTwapSession,\n} from \"hypurr-grpc/ts/hypurr/tools\";\nimport type { TelegramChatWalletPack } from \"hypurr-grpc/ts/hypurr/user\";\nimport type { HyperliquidWallet } from \"hypurr-grpc/ts/hypurr/wallet\";\n\n// ─── Config ──────────────────────────────────────────────────────\n\nexport interface HypurrConnectConfig {\n /** gRPC-web base URL. Defaults to https://grpc.hypurr.fun. */\n grpcUrl?: string;\n /** Media base URL for user-uploaded assets. Defaults to https://media.hypurr.fun. */\n mediaUrl?: string;\n grpcTimeout?: number;\n isTestnet?: boolean;\n /** Polling interval in ms for TWAP/Scale session updates. Default 5000. Set 0 to disable. */\n sessionPollInterval?: number;\n telegram?: {\n /** Auth hub login URL. Defaults to https://auth.hypurr.fun/login. */\n authHubUrl?: string;\n /** Optional callback URL. Defaults to the current page without auth query params. */\n returnTo?: string | (() => string);\n /** Requested hub scopes. Defaults to the scopes required by this SDK. */\n scope?: string | string[];\n /** @deprecated Telegram login is handled by the auth hub; this option is ignored. */\n useWidget?: boolean;\n };\n}\n\n// ─── Telegram login ──────────────────────────────────────────────\n\n/** @deprecated Telegram login is handled by the auth hub; raw Telegram data is no longer used by the provider. */\nexport interface TelegramLoginData {\n id: number;\n first_name: string;\n last_name?: string;\n username?: string;\n photo_url?: string;\n auth_date: number;\n hash: string;\n}\n\n// ─── Auth ────────────────────────────────────────────────────────\n\nexport type AuthMethod = \"telegram\" | \"eoa\" | null;\n\nexport interface HypurrUser {\n address: string;\n walletId: number;\n displayName: string;\n photoUrl?: string;\n authMethod: AuthMethod;\n telegramId?: string;\n hfunScore?: number;\n reputationScore?: number;\n}\n\n// ─── Agent (EOA flow) ────────────────────────────────────────────\n\nexport interface StoredAgent {\n privateKey: `0x${string}`;\n address: `0x${string}`;\n approvedAt: number;\n /** Epoch ms from the `extraAgents` response; agent is invalid after this time. */\n validUntil: number;\n}\n\nexport type SignTypedDataFn = (params: {\n domain: Record<string, unknown>;\n types: Record<string, { name: string; type: string }[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}) => Promise<`0x${string}`>;\n\nexport type Hex = `0x${string}`;\n\nexport interface EvmTransactionRequest {\n from?: Hex;\n to?: Hex;\n gas?: Hex;\n gasPrice?: Hex;\n value?: Hex;\n data?: Hex;\n nonce?: Hex;\n chainId?: Hex;\n maxFeePerGas?: Hex;\n maxPriorityFeePerGas?: Hex;\n type?: Hex;\n accessList?: unknown;\n [key: string]: unknown;\n}\n\nexport type EvmRequestFn = (args: {\n method: string;\n params?: unknown[];\n}) => Promise<unknown>;\n\nexport type SignEvmTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<Hex>;\n\nexport type EoaSignTransactionFn = (\n transaction: EvmTransactionRequest,\n) => Promise<unknown>;\n\n/** Wallet signer provided at EOA connect time for user-signed actions. */\nexport interface EoaSigner {\n signTypedData: SignTypedDataFn;\n /** Optional raw EVM transaction signer. Used by `signEvmTransaction()` in EOA mode. */\n signTransaction?: EoaSignTransactionFn;\n /** Optional EIP-1193 provider request function. Used as a fallback for `eth_signTransaction`. */\n request?: EvmRequestFn;\n chainId: number;\n}\n\nexport interface EoaSignerOptions {\n signTransaction?: EoaSignTransactionFn;\n request?: EvmRequestFn;\n}\n\n/**\n * Create an {@link EoaSigner} from any EIP-712 signing function.\n *\n * Accepts either a direct function or a `{ current }` ref object so the\n * signer always calls through to the latest function (avoids stale closures\n * with React hooks like wagmi's `useSignTypedData`).\n *\n * @example wagmi v2 — ref pattern (recommended)\n * ```ts\n * const { signTypedDataAsync } = useSignTypedData();\n * const chainId = useChainId();\n * const signerRef = useRef(signTypedDataAsync);\n * signerRef.current = signTypedDataAsync; // stays fresh every render\n *\n * // call once — the ref keeps it up to date\n * connectEoa(address, createEoaSigner(signerRef, chainId));\n * ```\n *\n * @example direct function (e.g. from viem WalletClient)\n * ```ts\n * connectEoa(address, createEoaSigner(client.signTypedData, chainId));\n * ```\n */\nexport function createEoaSigner(\n signTypedDataAsync:\n | ((args: Record<string, unknown>) => Promise<`0x${string}`>)\n | { current: (args: Record<string, unknown>) => Promise<`0x${string}`> },\n chainId: number,\n options: EoaSignerOptions = {},\n): EoaSigner {\n const resolve =\n typeof signTypedDataAsync === \"function\"\n ? signTypedDataAsync\n : (args: Record<string, unknown>) => signTypedDataAsync.current(args);\n return {\n signTypedData: (params) => resolve(params),\n signTransaction: options.signTransaction,\n request: options.request,\n chainId,\n };\n}\n\n// ─── TWAP / Scale param types ────────────────────────────────────\n// Omit authData & walletId — auto-filled from context using the selected wallet.\n\nexport type TwapCreateParams = Omit<\n HyperliquidTwapCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type TwapModifyParams = Omit<\n HyperliquidTwapModifyRequest,\n \"authData\" | \"walletId\"\n>;\n\nexport type ScaleCreateParams = Omit<\n HyperliquidScaleCreateRequest,\n \"authData\" | \"walletId\"\n>;\n\n// ─── Context state ───────────────────────────────────────────────\n\nexport interface HypurrConnectState {\n // Auth\n user: HypurrUser | null;\n isLoggedIn: boolean;\n isLoading: boolean;\n error: string | null;\n authMethod: AuthMethod;\n\n // SDK ExchangeClient — handles both L1 (agent-signed) and user-signed actions.\n // Telegram: backed by GrpcExchangeTransport (HyperliquidCoreAction)\n // EOA: uses a dual wallet — agent key for L1 actions, master wallet for\n // user-signed actions (transfers, withdrawals, etc.) when a signer is provided.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exchange: ExchangeClient<any> | null;\n\n // Multi-wallet (Telegram only — EOA has a single wallet)\n wallets: HyperliquidWallet[];\n selectedWalletId: number;\n selectWallet: (walletId: number) => void;\n\n // Wallet management (Telegram only)\n createWallet: (name: string) => Promise<HyperliquidWallet>;\n deleteWallet: (walletId: number) => Promise<void>;\n renameWallet: (walletId: number, name: string) => Promise<void>;\n refreshWallets: () => void;\n\n // Wallet packs & labels (Telegram only)\n packs: TelegramChatWalletPack[];\n createWalletPack: (name: string) => Promise<number>;\n addPackLabel: (params: {\n walletAddress: string;\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n modifyPackLabel: (params: {\n walletLabelOld: string;\n walletLabelNew: string;\n packId: number;\n }) => Promise<void>;\n removePackLabel: (params: {\n walletLabel: string;\n packId: number;\n }) => Promise<void>;\n\n // TWAP sessions (Telegram only)\n createTwap: (\n params: TwapCreateParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n modifyTwap: (\n params: TwapModifyParams,\n ) => Promise<HyperliquidWalletTwapSession>;\n cancelTwap: (sessionId: number) => Promise<void>;\n\n // Scale sessions (Telegram only)\n createScale: (\n params: ScaleCreateParams,\n ) => Promise<HyperliquidWalletScaleSession>;\n cancelScale: (sessionId: number) => Promise<void>;\n\n // Login modal\n loginModalOpen: boolean;\n openLoginModal: () => void;\n closeLoginModal: () => void;\n\n // Auth actions\n connectEoa: (address: `0x${string}`, signer?: EoaSigner) => void;\n signEvmTransaction: SignEvmTransactionFn;\n approveAgent: (\n signTypedDataAsync: SignTypedDataFn,\n chainId: number,\n ) => Promise<void>;\n logout: () => void;\n\n // EOA agent management\n agent: StoredAgent | null;\n agentReady: boolean;\n clearAgent: () => void;\n\n // Low-level access\n /** Deprecated: JWT auth leaves authData empty; use `telegramRpcOptions` for low-level calls. */\n authDataMap: Record<string, string>;\n authToken: string | null;\n telegramRpcOptions?: RpcOptions;\n telegramClient: TelegramClient;\n staticClient: StaticClient;\n}\n"],"mappings":"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","names":["user","isTestnet","useCallback","jsx","jsx","jsxs","jsx","jsxs","useCallback","AnimatePresence","motion","Fragment","useCallback","useMemo","useState","AnimatePresence","motion","useCallback","useState","AnimatePresence","motion","useCallback","useState","jsx","jsxs","modalWrapperStyle","Fragment","jsx","jsxs","backdropStyle","modalWrapperStyle","useState","useCallback","AnimatePresence","motion","AnimatePresence","motion","useCallback","useEffect","useState","Fragment","jsx","jsxs","DANGER_BORDER","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","bodyStyle","infoBoxStyle","labelStyle","inputStyle","footerStyle","useState","useEffect","useCallback","AnimatePresence","motion","Fragment","jsx","jsxs","backdropStyle","wrapperStyle","modalWrapperStyle","panelStyle","headerStyle","useState","useCallback","AnimatePresence","motion","Fragment","jsx","jsxs","useState","useCallback","useMemo","WalletRow","AnimatePresence","motion"]}
|