@zerodev/wallet-react-ui 0.0.10 → 0.0.12

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.
Files changed (52) hide show
  1. package/README.md +38 -7
  2. package/dist/_types/auth/brandAssets.d.ts +2 -0
  3. package/dist/_types/auth/brandAssets.d.ts.map +1 -0
  4. package/dist/_types/auth/components/WalletSheet/index.d.ts +20 -0
  5. package/dist/_types/auth/components/WalletSheet/index.d.ts.map +1 -0
  6. package/dist/_types/auth/hooks/useWalletConnectPairing.d.ts +19 -0
  7. package/dist/_types/auth/hooks/useWalletConnectPairing.d.ts.map +1 -0
  8. package/dist/_types/auth/hooks/useWalletInfo.d.ts +32 -0
  9. package/dist/_types/auth/hooks/useWalletInfo.d.ts.map +1 -0
  10. package/dist/_types/auth/pages/SignUp/MoreWallets.d.ts.map +1 -1
  11. package/dist/_types/auth/pages/SignUp/Wallet.d.ts.map +1 -1
  12. package/dist/_types/auth/pages/SignUp/WalletConnect.d.ts +5 -0
  13. package/dist/_types/auth/pages/SignUp/WalletConnect.d.ts.map +1 -0
  14. package/dist/_types/auth/pages/SignUp/context.d.ts +4 -0
  15. package/dist/_types/auth/pages/SignUp/context.d.ts.map +1 -1
  16. package/dist/_types/auth/pages/SignUp/index.d.ts +2 -0
  17. package/dist/_types/auth/pages/SignUp/index.d.ts.map +1 -1
  18. package/dist/_types/auth/utils/isMobile.d.ts +2 -0
  19. package/dist/_types/auth/utils/isMobile.d.ts.map +1 -0
  20. package/dist/_types/auth/utils/isZeroDevWalletConnect.d.ts +6 -0
  21. package/dist/_types/auth/utils/isZeroDevWalletConnect.d.ts.map +1 -0
  22. package/dist/_types/auth/utils/walletDeepLink.d.ts +18 -0
  23. package/dist/_types/auth/utils/walletDeepLink.d.ts.map +1 -0
  24. package/dist/_types/auth/walletGuide.d.ts +21 -3
  25. package/dist/_types/auth/walletGuide.d.ts.map +1 -1
  26. package/dist/_types/index.d.ts +3 -0
  27. package/dist/_types/index.d.ts.map +1 -1
  28. package/dist/_types/zeroDevWalletConnect.d.ts +13 -0
  29. package/dist/_types/zeroDevWalletConnect.d.ts.map +1 -0
  30. package/dist/index.cjs +3 -3
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.mjs +1009 -659
  33. package/dist/index.mjs.map +1 -1
  34. package/dist/styles.css +1 -1
  35. package/package.json +6 -5
  36. package/src/assets.d.ts +5 -0
  37. package/src/auth/brandAssets.ts +5 -0
  38. package/src/auth/components/WalletSheet/index.tsx +220 -0
  39. package/src/auth/hooks/useWalletConnectPairing.ts +134 -0
  40. package/src/auth/hooks/useWalletInfo.ts +145 -0
  41. package/src/auth/pages/SignUp/InstalledWallets.tsx +1 -1
  42. package/src/auth/pages/SignUp/MoreWallets.tsx +44 -9
  43. package/src/auth/pages/SignUp/Wallet.tsx +43 -13
  44. package/src/auth/pages/SignUp/WalletConnect.tsx +32 -0
  45. package/src/auth/pages/SignUp/context.tsx +4 -0
  46. package/src/auth/pages/SignUp/index.tsx +31 -0
  47. package/src/auth/utils/isMobile.ts +9 -0
  48. package/src/auth/utils/isZeroDevWalletConnect.ts +8 -0
  49. package/src/auth/utils/walletDeepLink.ts +23 -0
  50. package/src/auth/walletGuide.ts +42 -8
  51. package/src/index.ts +7 -2
  52. package/src/zeroDevWalletConnect.ts +95 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/pages/SignUp/context.tsx","../src/shared/utils/common.ts","../src/auth/pages/SignUp/Email.tsx","../src/auth/utils/isCancellationError.ts","../src/auth/pages/SignUp/Google.tsx","../src/auth/walletGuide.ts","../src/auth/pages/SignUp/InstalledWallets.tsx","../src/auth/components/WalletGridSheet/index.tsx","../src/auth/pages/SignUp/MoreWallets.tsx","../src/auth/pages/SignUp/Passkey.tsx","../src/auth/pages/SignUp/Wallet.tsx","../src/auth/pages/SignUp/index.tsx","../src/auth/pages/Verifying.tsx","../src/auth/index.tsx","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts","../src/history/components/TxHistoryItem/index.tsx","../src/history/mocks.ts","../src/history/utils/groupByDay.ts","../src/history/pages/History.tsx","../src/history/pages/index.tsx"],"sourcesContent":["export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n } catch {\n setError(true)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","import { createContext, useContext, useEffect } from 'react'\nimport type { EmailAuthMethod } from '../../types'\n\nexport type SignUpContextValue = {\n /** True while any method's auth attempt is in flight — used to disable\n * sibling methods so two flows can't run at once. */\n authPending: boolean\n setAuthPending: (pending: boolean) => void\n /** Which email verification flow the Email unit runs. Set on the root\n * (`<SignUp emailAuthMethod=…>`); already resolved to its default here. */\n emailAuthMethod: EmailAuthMethod\n /** True when the terms checkbox is required but unchecked. For passive\n * disabled styling; use `guardAgreement` before starting an attempt. */\n needsAgreement: boolean\n /** Call before starting an auth attempt: highlights the terms checkbox and\n * returns false when agreement is required but missing. */\n guardAgreement: () => boolean\n setError: (message: string | null) => void\n /** Guide ids of every mounted `SignUp.Wallet` pin. Discovery units skip\n * these so a pinned wallet isn't listed twice. */\n registeredWallets: readonly string[]\n /** Returns the unregister function. */\n registerWallet: (walletId: string) => () => void\n}\n\nexport const SignUpContext = createContext<SignUpContextValue | null>(null)\n\nexport function useSignUpContext(): SignUpContextValue {\n const ctx = useContext(SignUpContext)\n if (!ctx) {\n throw new Error('SignUp.* components must be rendered inside <SignUp>')\n }\n return ctx\n}\n\n/** Mirror a method's in-flight state into the shared pending flag.\n * Clears on unmount so a removed unit can't leave the page locked.\n * One flag, not per-unit: methods are mutually exclusive, so at most one\n * unit reports `true` at a time. */\nexport function useReportPending(pending: boolean) {\n const { setAuthPending } = useSignUpContext()\n useEffect(() => {\n setAuthPending(pending)\n return () => setAuthPending(false)\n }, [pending, setAuthPending])\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","import { Icon, Input } from '@zerodev/react-ui'\nimport { useSendMagicLink, useSendOTP } from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { isValidEmailAddress } from '../../../shared/utils/common'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Email input row: sends an OTP or magic link depending on the root's\n * `emailAuthMethod`, then advances to the matching verification step. */\nexport function SignUpEmail() {\n const { goToStep, setEmail, setOtpSession } = useAuth()\n const {\n authPending,\n emailAuthMethod,\n needsAgreement,\n guardAgreement,\n setError,\n } = useSignUpContext()\n const [emailInput, setEmailInput] = useState('')\n\n const shouldUseOtp = emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n useReportPending(isEmailLoading)\n\n const handleSubmit = async () => {\n if (!emailInput || authPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (!guardAgreement()) return\n\n setError(null)\n try {\n const send = shouldUseOtp ? sendOtp : sendMagicLink\n const { otpId, otpEncryptionTargetBundle } = await send({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep(shouldUseOtp ? 'otp-input' : 'email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n return (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={authPending}\n variant=\"listItemStyle\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !authPending) {\n handleSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={!isValidEmailAddress(emailInput) || needsAgreement}\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )\n}\n","export function isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // EIP-1193 user rejection (external-wallet connect), via viem\n if (err.name === 'UserRejectedRequestError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n","import { ListItem, ListItemChevron, ListItemIcon } from '@zerodev/react-ui'\nimport { useAuthenticateOAuth } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Google\" OAuth row. */\nexport function SignUpGoogle() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const { mutateAsync: authenticateOAuth, isPending } = useAuthenticateOAuth({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n },\n },\n })\n useReportPending(isPending)\n\n const handleClick = async () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n }\n\n return (\n <ListItem\n icon={<ListItemIcon name=\"google\" />}\n title=\"Google\"\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","/**\n * Static wallet metadata (\"wallet guide\") for the external-wallet auth flow:\n * `rdns` matches EIP-6963 announcements, `mobileLink` builds WalletConnect\n * mobile deep links, `icon`/`downloadUrl` brand rows for wallets that are not\n * installed. Self-contained — no runtime registry fetch.\n *\n * Wallet names and logos are trademarks of their respective owners.\n */\n\nexport type WalletGuideEntry = {\n id: string\n name: string\n /**\n * EIP-6963 identifier used to match announced (installed) providers.\n * Absent for wallets that never announce (mobile-app-only wallets).\n */\n rdns?: string\n /** Self-contained `data:image/svg+xml` URI. */\n icon: string\n /**\n * WalletConnect mobile deep-link prefix — append `encodeURIComponent(wcUri)`.\n * Absent when the wallet has no WC deep link (SDK- or extension-only).\n */\n mobileLink?: string\n /** Vendor download page, for \"get the wallet\" fallbacks. */\n downloadUrl: string\n}\n\n/**\n * A live connector \"claims\" a guide wallet by rdns: announced (6963)\n * connectors carry `id === rdns`, explicit ones (e.g. `metaMask()`) declare\n * `rdns` as a string or array.\n */\nexport function matchesWallet(\n connector: { id: string; rdns?: string | readonly string[] | undefined },\n wallet: WalletGuideEntry,\n): boolean {\n return (\n !!wallet.rdns &&\n (connector.id === wallet.rdns ||\n (Array.isArray(connector.rdns)\n ? connector.rdns.includes(wallet.rdns)\n : connector.rdns === wallet.rdns))\n )\n}\n\nconst guide = [\n {\n id: 'metamask',\n name: 'MetaMask',\n rdns: 'io.metamask',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cg%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%23ff5c16%22%20d%3D%22m24.024%2023.824-4.846-1.434-3.655%202.172-2.55-.001-3.656-2.171-4.844%201.434L3%2018.88l1.473-5.488L3%208.751%204.473%203l7.569%204.496h4.413L24.024%203l1.473%205.751-1.473%204.64%201.473%205.488z%22%2F%3E%3Cpath%20fill%3D%22%23ff5c16%22%20d%3D%22m4.474%203%207.57%204.499-.302%203.087zm4.844%2015.881%203.33%202.522-3.33.987zm3.064-4.17-.64-4.123-4.097%202.804h-.002v.001l.013%202.886%201.661-1.567zM24.024%203l-7.57%204.499.3%203.087zM19.18%2018.881l-3.33%202.522%203.33.987zm1.674-5.488v-.002zl-4.097-2.804-.64%204.124h3.064l1.662%201.567z%22%2F%3E%3Cpath%20fill%3D%22%23e34807%22%20d%3D%22m9.317%2022.39-4.844%201.434L3%2018.881h6.317zm3.064-7.68.925%205.962-1.282-3.315-4.37-1.078%201.662-1.568zm6.799%207.68%204.844%201.434%201.473-4.943H19.18zm-3.064-7.68-.925%205.962%201.282-3.315%204.37-1.078-1.663-1.568z%22%2F%3E%3Cpath%20fill%3D%22%23ff8d5d%22%20d%3D%22m3%2018.88%201.473-5.489h3.169l.012%202.887%204.37%201.078%201.282%203.314-.659.73-3.33-2.522H3zm22.497%200-1.473-5.489h-3.17l-.01%202.887-4.371%201.078-1.282%203.314.659.73%203.33-2.522h6.317zM16.455%207.495h-4.413l-.3%203.087%201.565%2010.084h1.884l1.565-10.084z%22%2F%3E%3Cpath%20fill%3D%22%23661800%22%20d%3D%22M4.473%203%203%208.751l1.473%204.64h3.169l4.1-2.805zm6.992%2012.908H10.03l-.781.761%202.776.685-.56-1.447M24.024%203l1.473%205.751-1.473%204.64h-3.17l-4.098-2.805zm-6.99%2012.908h1.437l.782.762-2.78.686.56-1.45zm-1.512%206.687.328-1.193-.66-.73h-1.885l-.659.73.327%201.192%22%2F%3E%3Cpath%20fill%3D%22%23c0c4cd%22%20d%3D%22M15.522%2022.594v1.969h-2.548v-1.969z%22%2F%3E%3Cpath%20fill%3D%22%23e7ebf6%22%20d%3D%22m9.318%2022.388%203.658%202.174v-1.969l-.328-1.192zm9.862%200-3.658%202.174v-1.969l.328-1.192z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M3%203h22.5v21.563H3z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'https://metamask.app.link/wc?uri=',\n downloadUrl: 'https://metamask.io/download',\n },\n {\n id: 'trust',\n name: 'Trust Wallet',\n rdns: 'com.trustwallet.app',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20width%3D%2228%22%20height%3D%2228%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%230500FF%22%20d%3D%22M6%207.583%2013.53%205v17.882C8.15%2020.498%206%2015.928%206%2013.345V7.583Z%22%2F%3E%3Cpath%20fill%3D%22url(%23a)%22%20d%3D%22M22%207.583%2013.53%205v17.882c6.05-2.384%208.47-6.954%208.47-9.537V7.583Z%22%2F%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22a%22%20x1%3D%2219.768%22%20x2%3D%2214.072%22%20y1%3D%223.753%22%20y2%3D%2222.853%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20offset%3D%22.02%22%20stop-color%3D%22%2300F%22%2F%3E%3Cstop%20offset%3D%22.08%22%20stop-color%3D%22%230094FF%22%2F%3E%3Cstop%20offset%3D%22.16%22%20stop-color%3D%22%2348FF91%22%2F%3E%3Cstop%20offset%3D%22.42%22%20stop-color%3D%22%230094FF%22%2F%3E%3Cstop%20offset%3D%22.68%22%20stop-color%3D%22%230038FF%22%2F%3E%3Cstop%20offset%3D%22.9%22%20stop-color%3D%22%230500FF%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'trust://wc?uri=',\n downloadUrl: 'https://trustwallet.com/download',\n },\n {\n id: 'coinbase',\n name: 'Coinbase Wallet',\n rdns: 'com.coinbase.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20width%3D%2228%22%20height%3D%2228%22%20viewBox%3D%220%200%2028%2028%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22%232C5FF6%22%2F%3E%0A%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M14%2023.8C19.4124%2023.8%2023.8%2019.4124%2023.8%2014C23.8%208.58761%2019.4124%204.2%2014%204.2C8.58761%204.2%204.2%208.58761%204.2%2014C4.2%2019.4124%208.58761%2023.8%2014%2023.8ZM11.55%2010.8C11.1358%2010.8%2010.8%2011.1358%2010.8%2011.55V16.45C10.8%2016.8642%2011.1358%2017.2%2011.55%2017.2H16.45C16.8642%2017.2%2017.2%2016.8642%2017.2%2016.45V11.55C17.2%2011.1358%2016.8642%2010.8%2016.45%2010.8H11.55Z%22%20fill%3D%22white%22%2F%3E%0A%3C%2Fsvg%3E',\n downloadUrl: 'https://coinbase.com/wallet/downloads',\n },\n {\n id: 'rainbow',\n name: 'Rainbow',\n rdns: 'me.rainbow',\n icon: 'data:image/svg+xml,%3Csvg%20width%3D%22120%22%20height%3D%22120%22%20viewBox%3D%220%200%20120%20120%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%22120%22%20height%3D%22120%22%20fill%3D%22url(%23paint0_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2038H26C56.9279%2038%2082%2063.0721%2082%2094V100H94C97.3137%20100%20100%2097.3137%20100%2094C100%2053.1309%2066.8691%2020%2026%2020C22.6863%2020%2020%2022.6863%2020%2026V38Z%22%20fill%3D%22url(%23paint1_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M84%2094H100C100%2097.3137%2097.3137%20100%2094%20100H84V94Z%22%20fill%3D%22url(%23paint2_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M26%2020L26%2036H20L20%2026C20%2022.6863%2022.6863%2020%2026%2020Z%22%20fill%3D%22url(%23paint3_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2036H26C58.0325%2036%2084%2061.9675%2084%2094V100H66V94C66%2071.9086%2048.0914%2054%2026%2054H20V36Z%22%20fill%3D%22url(%23paint4_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M68%2094H84V100H68V94Z%22%20fill%3D%22url(%23paint5_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2052L20%2036L26%2036L26%2052H20Z%22%20fill%3D%22url(%23paint6_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2062C20%2065.3137%2022.6863%2068%2026%2068C40.3594%2068%2052%2079.6406%2052%2094C52%2097.3137%2054.6863%20100%2058%20100H68V94C68%2070.804%2049.196%2052%2026%2052H20V62Z%22%20fill%3D%22url(%23paint7_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M52%2094H68V100H58C54.6863%20100%2052%2097.3137%2052%2094Z%22%20fill%3D%22url(%23paint8_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M26%2068C22.6863%2068%2020%2065.3137%2020%2062L20%2052L26%2052L26%2068Z%22%20fill%3D%22url(%23paint9_radial_62_329)%22%2F%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_62_329%22%20x1%3D%2260%22%20y1%3D%220%22%20x2%3D%2260%22%20y2%3D%22120%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23174299%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23001E59%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint1_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(74)%22%3E%0A%3Cstop%20offset%3D%220.770277%22%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%238754C9%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3ClinearGradient%20id%3D%22paint2_linear_62_329%22%20x1%3D%2283%22%20y1%3D%2297%22%20x2%3D%22100%22%20y2%3D%2297%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%238754C9%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint3_linear_62_329%22%20x1%3D%2223%22%20y1%3D%2220%22%20x2%3D%2223%22%20y2%3D%2237%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%238754C9%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint4_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(58)%22%3E%0A%3Cstop%20offset%3D%220.723929%22%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3ClinearGradient%20id%3D%22paint5_linear_62_329%22%20x1%3D%2268%22%20y1%3D%2297%22%20x2%3D%2284%22%20y2%3D%2297%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint6_linear_62_329%22%20x1%3D%2223%22%20y1%3D%2252%22%20x2%3D%2223%22%20y2%3D%2236%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint7_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(42)%22%3E%0A%3Cstop%20offset%3D%220.59513%22%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22paint8_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(51%2097)%20scale(17%2045.3333)%22%3E%0A%3Cstop%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22paint9_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(23%2069)%20rotate(-90)%20scale(17%20322.37)%22%3E%0A%3Cstop%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E',\n mobileLink: 'rainbow://wc?uri=',\n downloadUrl: 'https://rainbow.download',\n },\n {\n id: 'rabby',\n name: 'Rabby Wallet',\n rdns: 'io.rabby',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cg%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%238697FF%22%20d%3D%22M28%200H0v28h28V0Z%22%2F%3E%3Cpath%20fill%3D%22url(%23b)%22%20d%3D%22M22.54%2015.078c.677-1.514-2.673-5.744-5.874-7.506-2.017-1.365-4.12-1.178-4.545-.579-.935%201.316%203.094%202.43%205.788%203.731-.58.252-1.125.703-1.446%201.28-1.004-1.096-3.209-2.04-5.796-1.28-1.743.513-3.191%201.721-3.751%203.546a1.097%201.097%200%201%200-.445%202.1c.112%200%20.463-.075.463-.075l5.612.041c-2.244%203.56-4.018%204.081-4.018%204.698s1.697.45%202.335.22c3.05-1.1%206.327-4.531%206.89-5.519%202.36.295%204.345.33%204.786-.657Z%22%2F%3E%3Cpath%20fill%3D%22url(%23c)%22%20fill-rule%3D%22evenodd%22%20d%3D%22m17.885%2010.713.025.01c.125-.049.105-.233.07-.378-.078-.333-1.438-1.676-2.715-2.277-1.743-.82-3.025-.777-3.212-.398.356.726%201.998%201.408%203.714%202.12.723.3%201.46.606%202.118.923Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill%3D%22url(%23d)%22%20fill-rule%3D%22evenodd%22%20d%3D%22M15.701%2018.036a10.296%2010.296%200%200%200-1.2-.37c.482-.862.583-2.138.128-2.945-.639-1.133-1.44-1.736-3.304-1.736-1.024%200-3.783.346-3.832%202.648-.005.242%200%20.464.017.667l5.036.037a17.264%2017.264%200%200%201-1.871%202.483c.669.172%201.221.316%201.728.448.48.125.92.24%201.38.357a21.003%2021.003%200%200%200%201.918-1.59Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill%3D%22url(%23e)%22%20d%3D%22M6.848%2016.063c.206%201.75%201.2%202.435%203.232%202.638%202.032.203%203.197.067%204.749.208%201.296.118%202.453.778%202.882.55.386-.205.17-.947-.347-1.423-.67-.617-1.597-1.046-3.229-1.199.325-.89.234-2.138-.27-2.817-.731-.982-2.079-1.426-3.785-1.232-1.782.202-3.49%201.08-3.232%203.275Z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22b%22%20x1%3D%2210.464%22%20x2%3D%2222.394%22%20y1%3D%2213.737%22%20y2%3D%2217.12%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22c%22%20x1%3D%2220.386%22%20x2%3D%2211.779%22%20y1%3D%2213.509%22%20y2%3D%224.879%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%237258DC%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23797DEA%22%20stop-opacity%3D%220%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22d%22%20x1%3D%2215.94%22%20x2%3D%227.673%22%20y1%3D%2218.337%22%20y2%3D%2213.584%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%237461EA%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23BFC2FF%22%20stop-opacity%3D%220%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22e%22%20x1%3D%2211.177%22%20x2%3D%2216.765%22%20y1%3D%2213.648%22%20y2%3D%2220.749%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%2F%3E%3Cstop%20offset%3D%22.984%22%20stop-color%3D%22%23D5CEFF%22%2F%3E%3C%2FlinearGradient%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n downloadUrl: 'https://rabby.io',\n },\n {\n id: 'okx',\n name: 'OKX Wallet',\n rdns: 'com.okex.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22M10.819%205.556H5.93a.376.376%200%200%200-.375.375v4.888c0%20.207.168.375.375.375h4.888a.376.376%200%200%200%20.375-.376V5.932a.376.376%200%200%200-.376-.375Zm5.64%205.638h-4.886a.376.376%200%200%200-.376.376v4.887c0%20.208.168.376.376.376h4.887a.376.376%200%200%200%20.376-.375V11.57a.376.376%200%200%200-.376-.377Zm.75-5.638h4.887c.208%200%20.376.168.376.375v4.888a.376.376%200%200%201-.376.375H17.21a.376.376%200%200%201-.376-.376V5.933c0-.208.169-.376.376-.376Zm-6.39%2011.277H5.93a.376.376%200%200%200-.375.376v4.887c0%20.208.168.376.375.376h4.888a.376.376%200%200%200%20.375-.376V17.21a.376.376%200%200%200-.376-.376Zm6.39%200h4.887c.208%200%20.376.169.376.376v4.887a.376.376%200%200%201-.376.376H17.21a.376.376%200%200%201-.376-.376V17.21c0-.207.169-.376.376-.376Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'okex://main/wc?uri=',\n downloadUrl: 'https://okx.com/download',\n },\n {\n id: 'zerion',\n name: 'Zerion',\n rdns: 'io.zerion.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%232962EF%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M6.073%207c-.48%200-.665.593-.262.841l10.073%206.074a.577.577%200%200%200%20.758-.139l4.43-5.814c.3-.404-.004-.962-.525-.962H6.073ZM21.904%2021c.48%200%20.67-.596.267-.844l-10.075-6.073a.569.569%200%200%200-.751.146l-4.437%205.813c-.301.404.012.958.534.958h14.462Z%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'zerion://wc?uri=',\n downloadUrl: 'https://zerion.io',\n },\n {\n id: 'uniswap',\n name: 'Uniswap',\n rdns: 'org.uniswap.app',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23FFD8EA%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cg%20fill%3D%22%23FF007A%22%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20d%3D%22M9.635%206.068c-.255-.039-.266-.043-.145-.06.23-.035.773.012%201.148.099.874.202%201.67.722%202.519%201.646l.225.246.323-.051c1.36-.213%202.741-.044%203.899.477.319.144.821.43.882.503.022.024.058.173.082.335.086.557.044.982-.13%201.301-.096.173-.101.228-.037.377a.367.367%200%200%200%20.334.206c.287%200%20.597-.454.74-1.086l.056-.252.113.126c.62.685%201.106%201.618%201.189%202.282l.021.174-.103-.158a1.966%201.966%200%200%200-.59-.604c-.415-.268-.855-.36-2.017-.42-1.05-.053-1.645-.141-2.234-.329-1.003-.32-1.508-.744-2.699-2.27-.53-.678-.855-1.053-1.18-1.354-.74-.687-1.466-1.047-2.396-1.187v-.001Z%22%2F%3E%3Cpath%20d%3D%22M18.725%207.581c.026-.453.088-.753.216-1.026.028-.07.063-.136.104-.198a.69.69%200%200%201-.049.178c-.092.266-.108.629-.043%201.052.081.536.126.613.706%201.192.273.272.589.613.704.761l.21.267-.21-.191c-.255-.233-.841-.69-.972-.755-.086-.042-.1-.042-.153.01-.05.048-.06.12-.068.461-.01.532-.084.873-.263%201.213-.096.187-.111.147-.025-.062.066-.155.072-.224.072-.739%200-1.033-.127-1.283-.864-1.707a8.169%208.169%200%200%200-.684-.346%202.614%202.614%200%200%201-.334-.16c.02-.02.74.185%201.029.293.431.163.502.183.555.164.034-.013.051-.113.068-.407h.001Zm-8.595%201.77c-.517-.696-.838-1.764-.768-2.563l.02-.247.119.02c.222.04.603.179.783.286.49.29.703.673.918%201.657.064.288.147.613.185.725.061.178.294.592.483.862.136.194.046.286-.255.26-.46-.04-1.083-.46-1.485-1Zm7.965%205.182c-2.42-.95-3.273-1.777-3.273-3.17%200-.206.007-.374.016-.374.008%200%20.102.067.208.151.491.384%201.04.548%202.563.765.896.128%201.398.231%201.864.382%201.48.478%202.392%201.449%202.61%202.773.063.384.028%201.104-.076%201.484-.082.3-.329.84-.394.861-.019.007-.037-.061-.04-.154-.025-.496-.283-.98-.715-1.343-.49-.412-1.15-.741-2.763-1.375Zm-1.699.396a4.13%204.13%200%200%200-.117-.5l-.062-.18.115.127c.16.173.285.396.391.693.082.227.09.294.09.662%200%20.361-.011.437-.087.64-.104.3-.28.572-.51.794-.443.44-1.011.683-1.833.784-.142.018-.557.047-.922.066-.922.046-1.529.144-2.073.33a.446.446%200%200%201-.156.036c-.021-.021.35-.237.656-.381.431-.204.861-.315%201.825-.47.475-.078.968-.173%201.093-.21%201.178-.352%201.784-1.263%201.59-2.39Z%22%2F%3E%3Cpath%20d%3D%22M17.506%2016.855c-.321-.675-.396-1.327-.22-1.935.02-.067.05-.119.068-.119a.64.64%200%200%201%20.169.09c.149.097.445.261%201.237.682.988.527%201.553.934%201.936%201.4.335.407.542.872.643%201.438.057.32.023%201.093-.061%201.416-.266%201.018-.882%201.818-1.764%202.285a2.129%202.129%200%200%201-.258.124c-.013%200%20.035-.116.104-.259.297-.605.331-1.193.107-1.848-.138-.401-.418-.89-.982-1.718-.657-.96-.817-1.218-.979-1.556Zm-9.095%203.644c.9-.742%202.016-1.267%203.036-1.43a4.85%204.85%200%200%201%201.575.06c.652.163%201.235.528%201.538.962.296.425.423.794.556%201.618.052.324.109.651.125.724.1.427.293.768.532.939.38.272%201.037.29%201.682.044a.853.853%200%200%201%20.21-.064c.023.023-.301.235-.53.347-.27.141-.572.213-.879.208-.59%200-1.08-.294-1.49-.891a7.027%207.027%200%200%201-.402-.784c-.431-.961-.644-1.253-1.145-1.575-.437-.28-1-.329-1.424-.126-.556.266-.71.96-.312%201.4.187.189.43.313.695.354a.75.75%200%200%200%20.589-.174.728.728%200%200%200%20.251-.551c0-.29-.114-.453-.4-.581-.392-.172-.812.029-.81.388%200%20.153.069.249.226.32.1.044.103.046.02.03-.358-.073-.442-.496-.154-.776.347-.336%201.064-.188%201.31.272.103.194.115.578.025.81-.203.52-.79.793-1.387.644-.407-.102-.571-.211-1.06-.703-.852-.856-1.182-1.023-2.408-1.21l-.237-.035.268-.22Z%22%2F%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M4.418%205.179c2.842%203.368%204.8%204.757%205.017%205.05.18.243.112.462-.195.632a1.899%201.899%200%200%201-.699.191c-.2%200-.269-.075-.269-.075-.115-.106-.18-.088-.773-1.116A176.911%20176.911%200%200%200%205.968%207.56c-.044-.04-.042-.04%201.448%202.564.24.543.047.741.047.819%200%20.157-.044.24-.242.457-.332.36-.48.765-.587%201.604-.12.94-.456%201.604-1.39%202.741-.545.666-.635.787-.773%201.056-.174.338-.221.527-.24.952a2.9%202.9%200%200%200%20.16%201.174c.122.378.252.626.582%201.125.285.43.448.75.448.876%200%20.099.019.099.461.001%201.054-.232%201.91-.64%202.392-1.142.298-.311.367-.482.37-.907.002-.277-.008-.336-.085-.496-.125-.26-.353-.477-.855-.813-.66-.44-.942-.794-1.018-1.28-.065-.4.01-.682.373-1.427.377-.773.47-1.103.535-1.88.04-.503.096-.701.244-.861.155-.166.293-.222.676-.272.623-.084%201.018-.24%201.343-.534a1.14%201.14%200%200%200%20.421-.869l.014-.28-.16-.179C9.563%209.34%204.036%204.667%204%204.667c-.007%200%20.18.23.418.512Zm1.325%2013.086a.486.486%200%200%200-.157-.652c-.203-.133-.522-.069-.522.103%200%20.053.03.092.098.125.114.058.122.122.032.254s-.082.248.02.328c.168.126.404.057.529-.158ZM10.683%2012c-.29.086-.575.389-.664.706-.053.194-.022.534.058.638.13.169.255.213.596.212.665-.004%201.243-.283%201.311-.632.054-.286-.2-.68-.55-.855a1.33%201.33%200%200%200-.75-.07Zm.78.593c.102-.143.057-.296-.118-.4-.331-.199-.835-.035-.835.272%200%20.153.262.32.502.32.16%200%20.38-.093.45-.192Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M4%204h19v20H4z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'uniswap://wc?uri=',\n downloadUrl: 'https://wallet.uniswap.org',\n },\n {\n id: 'ledger',\n name: 'Ledger',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22M11.65%204.4H4.4V9h1.1V5.5l6.15-.04V4.4Zm.05%205.95v7.25h4.6v-1.1h-3.5l-.04-6.15H11.7ZM4.4%2023.6h7.25v-1.06L5.5%2022.5V19H4.4v4.6ZM16.35%204.4h7.25V9h-1.1V5.5l-6.15-.04V4.4Zm7.25%2019.2h-7.25v-1.06l6.15-.04V19h1.1v4.6Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'ledgerlive://wc?uri=',\n downloadUrl: 'https://www.ledger.com/ledger-live',\n },\n {\n id: 'binance',\n name: 'Binance Wallet',\n rdns: 'com.binance.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22130%22%20height%3D%22130%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h130v130H0z%22%2F%3E%3Cpath%20fill%3D%22%23F3BA2F%22%20d%3D%22M45.587%2057.02%2065.01%2037.606l19.43%2019.43%2011.295-11.303L65.01%2015%2034.284%2045.725zM15%2065.004l11.299-11.299%2011.298%2011.299L26.3%2076.302zM45.587%2072.983%2065.01%2092.406l19.43-19.43%2011.303%2011.287-.008.007-30.725%2030.734-30.725-30.718-.016-.016zM92.403%2065.006%20103.7%2053.708%20115%2065.006l-11.299%2011.299z%22%2F%3E%3Cpath%20fill%3D%22%23F3BA2F%22%20d%3D%22m76.471%2064.998-11.46-11.469-8.476%208.475-.98.972-2.005%202.006-.016.016.016.024%2011.46%2011.453%2011.461-11.47.008-.007z%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'bnc://app.binance.com/cedefi/wc?uri=',\n downloadUrl: 'https://www.binance.com/en/download',\n },\n] as const satisfies readonly WalletGuideEntry[]\n\n/** Valid `walletId` values for `<SignUp.Wallet>` — the guide's wallet ids. */\nexport type WalletId = (typeof guide)[number]['id']\n\n// Widened so entries have a uniform shape (`rdns` et al. always accessible);\n// `guide` stays literal only to derive `WalletId`.\nexport const WALLET_GUIDE: readonly WalletGuideEntry[] = guide\n","import { Badge, ListItem, ListItemChevron } from '@zerodev/react-ui'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { matchesWallet, WALLET_GUIDE } from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Auto-discovered rows for installed wallets: one row per announced (6963)\n * browser extension. Renders nothing when no wallet is installed. */\nexport function SignUpInstalledWallets({\n excludeWalletIds = [],\n maxWallets = 4,\n}: {\n /** Wallets to hide, by guide id (e.g. `'metamask'`) or EIP-6963 rdns.\n * Pinned `SignUp.Wallet` rows are excluded automatically. */\n excludeWalletIds?: string[]\n /** Cap on the number of rendered rows (default 4). Guide wallets rank\n * first, in guide order, so the cut drops unknown extensions before\n * curated ones. */\n maxWallets?: number\n}) {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError, registeredWallets } =\n useSignUpContext()\n const connectors = useConnectors()\n const { mutate: connect, isPending } = useConnect()\n useReportPending(isPending)\n\n // Same rule that earns the INSTALLED badge elsewhere: only a 6963\n // announcement proves a live extension. Announcements surface as\n // injected-type connectors with `id === rdns`; the generic `injected()`\n // connector (id \"injected\") and our own embedded-wallet connector (which\n // also claims type \"injected\") exist regardless of installation.\n const rows = connectors\n .filter(\n (c) =>\n c.type === 'injected' &&\n c.id !== 'injected' &&\n c.id !== 'zerodev-wallet',\n )\n .map((connector) => {\n const wallet = WALLET_GUIDE.find((w) => matchesWallet(connector, w))\n return {\n connector,\n walletId: wallet?.id,\n name: wallet?.name ?? connector.name,\n icon: wallet?.icon ?? connector.icon,\n ids: wallet ? [wallet.id, connector.id] : [connector.id],\n rank: wallet ? WALLET_GUIDE.indexOf(wallet) : WALLET_GUIDE.length,\n }\n })\n .filter(\n (row) => !(row.walletId && registeredWallets.includes(row.walletId)),\n )\n .filter((row) => !row.ids.some((id) => excludeWalletIds.includes(id)))\n .sort((a, b) => a.rank - b.rank)\n .slice(0, maxWallets)\n\n const startConnect = (connector: (typeof connectors)[number]) => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n connect(\n { connector },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it (mirrors SignUp.Wallet).\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n return (\n <>\n {rows.map(({ connector, name, icon }) => (\n <ListItem\n key={connector.uid}\n title={name}\n icon={\n icon ? <img src={icon} alt=\"\" className=\"zd:w-6 zd:h-6\" /> : null\n }\n subtitle={<Badge text=\"INSTALLED\" />}\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={() => startConnect(connector)}\n />\n ))}\n </>\n )\n}\n","import {\n BottomSheet,\n BottomSheetClose,\n BottomSheetContent,\n BottomSheetTitle,\n Icon,\n Text,\n} from '@zerodev/react-ui'\n\nexport type WalletTileData = {\n key: string\n name: string\n icon?: string | undefined\n onSelect: () => void\n}\n\nfunction WalletTile({ tile }: { tile: WalletTileData }) {\n return (\n <button\n type=\"button\"\n onClick={tile.onSelect}\n className=\"zd:flex zd:flex-col zd:items-center zd:gap-1.5 zd:cursor-pointer\"\n >\n <div className=\"zd:w-16 zd:h-16 zd:rounded-2xl zd:bg-greyScale/5 zd:flex zd:items-center zd:justify-center\">\n {tile.icon ? (\n <img src={tile.icon} alt=\"\" className=\"zd:w-8 zd:h-8\" />\n ) : (\n <Icon\n name=\"walletOutline\"\n className=\"zd:w-8 zd:h-8 zd:text-greyScale\"\n />\n )}\n </div>\n <Text className=\"zd:text-body3 zd:max-w-full zd:truncate\">\n {tile.name}\n </Text>\n </button>\n )\n}\n\n/** \"More wallets\" sheet: every guide wallet (plus live connectors\n * we have no guide entry for) as a scrollable 3-column tile grid, laid over\n * the sign-up page. Selection behavior is the caller's business. */\nexport function WalletGridSheet({\n open,\n onOpenChange,\n tiles,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n tiles: WalletTileData[]\n}) {\n return (\n <BottomSheet open={open} onOpenChange={onOpenChange}>\n <BottomSheetContent className=\"zd:p-4\">\n <BottomSheetTitle>All wallets</BottomSheetTitle>\n <div className=\"zd:mb-3 zd:flex zd:items-center zd:gap-2\">\n <Text className=\"zd:text-h3 zd:flex-1\">All wallets</Text>\n <BottomSheetClose asChild>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"zd:cursor-pointer zd:px-2 zd:text-greyScale/60\"\n >\n ✕\n </button>\n </BottomSheetClose>\n </div>\n <div className=\"zd:grid zd:grid-cols-3 zd:gap-3 zd:max-h-80 zd:overflow-y-auto\">\n {tiles.map((tile) => (\n <WalletTile key={tile.key} tile={tile} />\n ))}\n </div>\n </BottomSheetContent>\n </BottomSheet>\n )\n}\n","import { ListItem, ListItemChevron, ListItemIcon } from '@zerodev/react-ui'\nimport { useState } from 'react'\nimport { useConnect, useConnectors } from 'wagmi'\nimport {\n WalletGridSheet,\n type WalletTileData,\n} from '../../components/WalletGridSheet'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { matchesWallet, WALLET_GUIDE } from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"More wallets\" row — opens the wallet grid sheet. */\nexport function SignUpMoreWallets({\n title = 'More wallets',\n}: {\n title?: string\n}) {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n const [open, setOpen] = useState(false)\n const connectors = useConnectors()\n const { mutate: connect, isPending } = useConnect()\n useReportPending(isPending)\n\n // Our own connector is the embedded wallet, and walletConnect-type\n // connectors are the mobile transport rather than a wallet — neither\n // belongs in the grid.\n const walletConnectors = connectors.filter(\n (c) => c.id !== 'zerodev-wallet' && c.type !== 'walletConnect',\n )\n\n const startConnect = (connector: (typeof connectors)[number]) => {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(false)\n setError(null)\n connect(\n { connector },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it.\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n // Claimed by a connector → connect it; otherwise the tile opens the\n // vendor download page.\n const guideTiles: WalletTileData[] = WALLET_GUIDE.map((wallet) => {\n const installed = walletConnectors.find((c) => matchesWallet(c, wallet))\n return {\n key: wallet.id,\n name: wallet.name,\n icon: wallet.icon,\n onSelect: () => {\n if (installed) {\n startConnect(installed)\n return\n }\n setOpen(false)\n window.open(wallet.downloadUrl, '_blank', 'noopener,noreferrer')\n },\n }\n })\n\n // Live connectors we have no guide entry for still get a tile — nothing\n // installed is ever hidden.\n const connectorTiles: WalletTileData[] = walletConnectors\n .filter((c) => !WALLET_GUIDE.some((wallet) => matchesWallet(c, wallet)))\n .map((connector) => ({\n key: connector.uid,\n name: connector.name,\n icon: connector.icon,\n onSelect: () => startConnect(connector),\n }))\n\n const handleClick = () => {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(true)\n }\n\n return (\n <>\n <ListItem\n icon={<ListItemIcon name=\"walletOutline\" className=\"zd:w-5 zd:h-5\" />}\n title={title}\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n <WalletGridSheet\n open={open}\n onOpenChange={setOpen}\n tiles={[...guideTiles, ...connectorTiles]}\n />\n </>\n )\n}\n","import { Button } from '@zerodev/react-ui'\nimport { useLoginPasskey, useRegisterPasskey } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Create a passkey\" + \"Log in with passkey\" buttons. */\nexport function SignUpPasskey() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const mutation = {\n onSuccess: () => {\n goToStep('authenticated')\n },\n onError: (err: unknown) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n }\n const { mutate: registerPasskey, isPending: isRegisterPending } =\n useRegisterPasskey({ mutation })\n const { mutate: loginPasskey, isPending: isLoginPending } = useLoginPasskey({\n mutation,\n })\n useReportPending(isRegisterPending || isLoginPending)\n\n const guarded = (run: () => void) => () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n run()\n }\n\n return (\n <>\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => registerPasskey())}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => loginPasskey())}\n />\n </>\n )\n}\n","import { Badge, ListItem, ListItemChevron } from '@zerodev/react-ui'\nimport { useLayoutEffect } from 'react'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { matchesWallet, WALLET_GUIDE, type WalletId } from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Dedicated row for a single guide wallet: connects it directly when a live\n * connector claims it, and is a download link for the vendor page otherwise. */\nexport function SignUpWallet({ walletId }: { walletId: WalletId }) {\n const wallet = WALLET_GUIDE.find((w) => w.id === walletId)\n if (!wallet) {\n // Unreachable for TS consumers; catches raw-JS typos.\n throw new Error(\n `Unknown walletId \"${walletId}\". Valid ids: ${WALLET_GUIDE.map((w) => w.id).join(', ')}`,\n )\n }\n\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError, registerWallet } =\n useSignUpContext()\n const connectors = useConnectors()\n const { mutate: connect, isPending } = useConnect()\n useReportPending(isPending)\n useLayoutEffect(() => registerWallet(wallet.id), [registerWallet, wallet.id])\n\n // Same claim rule as the MoreWallets grid: a 6963 announcement or a\n // configured SDK connector both make the row connectable. Only an\n // announcement (id === rdns) proves a live extension and earns the badge.\n const installed = connectors.find((c) => matchesWallet(c, wallet))\n const isAnnounced =\n !!wallet.rdns && connectors.some((c) => c.id === wallet.rdns)\n\n const shared = {\n title: wallet.name,\n icon: <img src={wallet.icon} alt=\"\" className=\"zd:w-6 zd:h-6\" />,\n trailing: <ListItemChevron />,\n }\n\n if (!installed) {\n return (\n <ListItem {...shared} asChild>\n {/* biome-ignore lint/a11y/useAnchorContent: the row layout (incl. the title text) is injected into the anchor via Slot */}\n <a\n href={wallet.downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n </ListItem>\n )\n }\n\n const handleClick = () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n connect(\n { connector: installed },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it (mirrors SignUp.MoreWallets).\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n return (\n <ListItem\n {...shared}\n {...(isAnnounced && { subtitle: <Badge text=\"INSTALLED\" /> })}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","import { Button, Text } from '@zerodev/react-ui'\nimport { type ReactNode, useCallback, useState } from 'react'\nimport { SignUpFooter } from '../../../shared/components/SignUpFooter'\nimport { BlobAnimation } from '../../components/BlobAnimation'\nimport type { EmailAuthMethod } from '../../types'\nimport { SignUpContext } from './context'\nimport { SignUpEmail } from './Email'\nimport { SignUpGoogle } from './Google'\nimport { SignUpInstalledWallets } from './InstalledWallets'\nimport { SignUpMoreWallets } from './MoreWallets'\nimport { SignUpPasskey } from './Passkey'\nimport { SignUpWallet } from './Wallet'\n\ntype SignUpRootProps = {\n children: ReactNode\n /** Enable the consent gate: linked from the footer checkbox, and every\n * method is blocked until the user agrees when either URL is set. */\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n /** Which email verification flow the Email unit runs. */\n emailAuthMethod?: EmailAuthMethod | undefined\n}\n\nfunction SignUpRoot({\n children,\n termsAndConditionsUrl,\n privacyPolicyUrl,\n emailAuthMethod = 'magicLink',\n}: SignUpRootProps) {\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // One flag for the whole page: methods are mutually exclusive, so at most\n // one unit is in flight at a time. Known accepted edge: a unit unmounting\n // mid-flight (conditional composition) clears a sibling's lock.\n const [authPending, setAuthPending] = useState(false)\n // Which wallets have a pinned `SignUp.Wallet` row mounted. A plain list of\n // registrants: register appends, cleanup removes one occurrence.\n const [registeredWallets, setRegisteredWallets] = useState<readonly string[]>(\n [],\n )\n\n const registerWallet = useCallback((walletId: string) => {\n setRegisteredWallets((prev) => [...prev, walletId])\n return () => {\n setRegisteredWallets((prev) => {\n const next = [...prev]\n next.splice(next.indexOf(walletId), 1)\n return next\n })\n }\n }, [])\n\n const requiresAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n const needsAgreement = requiresAgreement && !agreedToTerms\n\n const guardAgreement = () => {\n if (!needsAgreement) return true\n setHighlightAgreement(true)\n return false\n }\n\n return (\n <SignUpContext.Provider\n value={{\n authPending,\n emailAuthMethod,\n setAuthPending,\n needsAgreement,\n guardAgreement,\n setError,\n registeredWallets,\n registerWallet,\n }}\n >\n {error !== null && (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full zd:min-h-100\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )}\n {/* Kept mounted (hidden) during the error takeover so unit state — the\n typed email, pending flags — survives \"Try again\".\n `-mx-4` cancels Screen's scroll-container padding so this page\n owns its own; inner blocks re-add `zd:px-4` where they need it. */}\n <div\n className={`zd:-mx-4 zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden${\n error !== null ? ' zd:hidden' : ''\n }`}\n >\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:mb-4 zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {children}\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={termsAndConditionsUrl}\n privacyPolicyUrl={privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n </SignUpContext.Provider>\n )\n}\n\nfunction SignUpDivider({ label = 'or' }: { label?: string }) {\n return (\n <div className=\"zd:-mx-4 zd:my-2 zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">{label}</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n )\n}\n\n/** The canonical sign-up page. Takes the root's own props (the consent-gate\n * URLs) and forwards them — per-unit config (e.g. the email method) still\n * means composing the units yourself. */\nfunction SignUpDefault(props: Omit<SignUpRootProps, 'children'>) {\n return (\n <SignUpRoot {...props}>\n <SignUpPasskey />\n <SignUpDivider />\n <SignUpGoogle />\n <SignUpEmail />\n </SignUpRoot>\n )\n}\n\nexport const SignUp = Object.assign(SignUpRoot, {\n Default: SignUpDefault,\n Passkey: SignUpPasskey,\n Google: SignUpGoogle,\n Email: SignUpEmail,\n Wallet: SignUpWallet,\n InstalledWallets: SignUpInstalledWallets,\n MoreWallets: SignUpMoreWallets,\n Divider: SignUpDivider,\n})\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const { otpId, otpEncryptionTargetBundle, goToStep, clearOtpSession } =\n useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: () => {\n clearOtpSession()\n goToStep('authenticated')\n },\n onError: (err) => {\n setError(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { type ReactNode, useEffect } from 'react'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(\n step: AuthStep | null,\n renderSignUp?: (() => ReactNode) | undefined,\n): ReactNode {\n switch (step) {\n case 'sign-up':\n return renderSignUp ? renderSignUp() : <SignUp.Default />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function ConnectWallet({\n onClose: userOnClose,\n size,\n renderSignUp,\n logo,\n}: {\n onClose?: (() => void) | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n /** Replace the default sign-up page: compose `SignUp.*` units inside\n * `<SignUp>`. Omit to render the canonical page (`SignUp.Default`). */\n renderSignUp?: (() => ReactNode) | undefined\n /** Optional brand logo for the top nav on the sign-up page. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark\n * independently. */\n logo?: ReactNode | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step, renderSignUp)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n return (\n <Screen\n {...(size && { size })}\n // Sign-up shrinks to its content (few methods → shorter card) but never\n // grows past the standard height; other steps keep the fixed size.\n className={step === 'sign-up' ? 'zd:h-auto zd:max-h-202.5' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onLeftButtonClick: goBack })}\n onRightButtonClick={handleClose}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n\n // Actions\n /** Restore a persisted OTP session (survives reloads mid-email-flow). */\n initialize: () => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n\n // Actions\n initialize: () => {\n const stored = readStoredOtpSession()\n if (!stored) return\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport const createStore = () =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\n/** The kit connector takes exactly the base connector's param\n We alias it to leave room for expansion */\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore()\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n store.getState().auth.reset()\n },\n\n async setup() {\n await connector.setup?.()\n\n // Everything below is browser-only. Skip during SSR — getProvider()\n // touches `window` for EIP-6963 discovery and would crash on the\n // server, and the session restore reads localStorage.\n if (typeof window === 'undefined') return\n\n // Restore a persisted OTP session so an email flow survives a reload.\n store.getState().auth.initialize()\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n","import { cn, Icon, type IconName, Text } from '@zerodev/react-ui'\n\nexport type TxHistoryStatus = 'Pending' | 'Success' | 'Failed'\n\nconst STATUS_COLOR: Record<TxHistoryStatus, string> = {\n Pending: 'zd:text-solarOrange',\n Success: 'zd:text-positive',\n Failed: 'zd:text-negative',\n}\n\nexport interface TxHistoryItemProps {\n /** Leading glyph for the activity kind, e.g. `'arrowSwapHorizontalOutline'`\n * for swaps, `'lighting'` for staking/yield, `'imageFill'` for NFTs. */\n icon: IconName\n /** Activity label, e.g. `\"Swapped ETH → USD₮0\"`. Never truncated. */\n title: string\n /** Pre-formatted outcome, e.g. `\"2,343 ETH\"`. Truncates when long. */\n value: string\n /** Chain the transaction ran on (source chain for cross-chain rows). */\n chainName: string\n chainIconUrl?: string\n /** Destination chain. When present the row renders `chain → destChain`. */\n destChainName?: string\n destChainIconUrl?: string\n status: TxHistoryStatus\n className?: string\n}\n\nexport function TxHistoryItem({\n icon,\n title,\n value,\n chainName,\n chainIconUrl,\n destChainName,\n destChainIconUrl,\n status,\n className,\n}: TxHistoryItemProps) {\n return (\n <div\n className={cn(\n 'zd:flex zd:w-full zd:items-center zd:gap-2 zd:p-2',\n className,\n )}\n >\n <div className=\"zd:flex zd:size-11 zd:shrink-0 zd:items-center zd:justify-center zd:rounded-xl zd:bg-white\">\n <Icon name={icon} className=\"zd:size-5\" />\n </div>\n\n <div className=\"zd:flex zd:min-w-0 zd:flex-1 zd:flex-col zd:gap-2\">\n <div className=\"zd:flex zd:w-full zd:items-center zd:justify-between zd:gap-2\">\n <Text className=\"zd:shrink-0 zd:whitespace-nowrap zd:text-body1\">\n {title}\n </Text>\n <Text className=\"zd:min-w-0 zd:truncate zd:text-right zd:text-body1\">\n {value}\n </Text>\n </div>\n\n <div className=\"zd:flex zd:w-full zd:items-center zd:justify-between zd:gap-2\">\n <div className=\"zd:flex zd:min-w-0 zd:items-center zd:gap-2\">\n <ChainTag\n name={chainName}\n {...(chainIconUrl && { iconUrl: chainIconUrl })}\n />\n {destChainName && (\n <>\n <Icon\n name=\"arrowRightFill\"\n aria-hidden\n className=\"zd:size-3 zd:shrink-0 zd:opacity-30\"\n />\n <ChainTag\n name={destChainName}\n {...(destChainIconUrl && { iconUrl: destChainIconUrl })}\n />\n </>\n )}\n </div>\n <Text\n className={cn('zd:shrink-0 zd:text-body3', STATUS_COLOR[status])}\n >\n {status}\n </Text>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ChainTag({ name, iconUrl }: { name: string; iconUrl?: string }) {\n return (\n <div className=\"zd:flex zd:min-w-0 zd:items-center zd:gap-[5px]\">\n {iconUrl && (\n <span className=\"zd:size-3 zd:shrink-0 zd:overflow-hidden zd:rounded-full zd:bg-white\">\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden\n className=\"zd:size-full zd:object-cover\"\n />\n </span>\n )}\n <Text className=\"zd:truncate zd:text-body3\">{name}</Text>\n </div>\n )\n}\n","import type { TxHistoryEntry } from './types'\n\nconst ARB_ICON =\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/arbitrum/info/logo.png'\nconst BASE_ICON =\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/base/info/logo.png'\n\nconst HOUR = 60 * 60 * 1000\n\n/**\n * Placeholder feed mirroring the Figma history screen (`15873:58582`) until\n * the real activity source lands. Timestamps are relative to module load:\n * a \"Today\" section and an older fixed-looking section two weeks back.\n */\nexport const MOCK_HISTORY: TxHistoryEntry[] = [\n {\n id: 'mock-1',\n icon: 'arrowSwapHorizontalOutline',\n title: 'Swapped ETH → USD₮0',\n value: '2,343 ETH',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n destChainName: 'Base',\n destChainIconUrl: BASE_ICON,\n status: 'Pending',\n timestamp: Date.now() - 1 * HOUR,\n },\n {\n id: 'mock-2',\n icon: 'arrowSwapHorizontalOutline',\n title: 'Swapped ETH → USD₮0',\n value: '2,343 ETH',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n destChainName: 'Base',\n destChainIconUrl: BASE_ICON,\n status: 'Pending',\n timestamp: Date.now() - 2 * HOUR,\n },\n {\n id: 'mock-3',\n icon: 'lighting',\n title: 'Fixed Yield',\n value: '2,323 PT wstETH (25 Jan 2026)',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 3 * HOUR,\n },\n {\n id: 'mock-4',\n icon: 'imageFill',\n title: 'Received NFT',\n value: 'Bored Ape Yacht Club',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 4 * HOUR,\n },\n {\n id: 'mock-5',\n icon: 'lighting',\n title: 'Collateral Used',\n value: 'Collateralization enabled for USD₮0',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 14 * 24 * HOUR,\n },\n {\n id: 'mock-6',\n icon: 'lighting',\n title: 'Liquid Staked ETH',\n value: '2,323 PT wstETH (25 Jan 2026)',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 14 * 24 * HOUR - 1 * HOUR,\n },\n]\n","import type { TxHistoryEntry } from '../types'\n\nexport interface DayGroup {\n /** Section header: \"Today\", \"Yesterday\", or e.g. \"August 12, 2025\". */\n label: string\n entries: TxHistoryEntry[]\n}\n\n/** Local-midnight day index for a timestamp — calendar-day identity. */\nfunction dayKey(timestamp: number): string {\n const d = new Date(timestamp)\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`\n}\n\nfunction dayLabel(timestamp: number, now: number): string {\n const key = dayKey(timestamp)\n if (key === dayKey(now)) return 'Today'\n if (key === dayKey(now - 24 * 60 * 60 * 1000)) return 'Yesterday'\n return new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n }).format(new Date(timestamp))\n}\n\n/**\n * Newest-first entries bucketed by local calendar day, ready to render as\n * header + rows sections. `now` is injectable so tests (and midnight\n * boundaries) are deterministic.\n */\nexport function groupByDay(\n entries: TxHistoryEntry[],\n now: number = Date.now(),\n): DayGroup[] {\n const sorted = [...entries].sort((a, b) => b.timestamp - a.timestamp)\n const groups: DayGroup[] = []\n let currentKey: string | null = null\n for (const entry of sorted) {\n const key = dayKey(entry.timestamp)\n if (key !== currentKey) {\n currentKey = key\n groups.push({ label: dayLabel(entry.timestamp, now), entries: [] })\n }\n groups[groups.length - 1]?.entries.push(entry)\n }\n return groups\n}\n","import { Text, Wrapper } from '@zerodev/react-ui'\nimport { Fragment } from 'react'\nimport { TxHistoryItem } from '../components/TxHistoryItem'\nimport { MOCK_HISTORY } from '../mocks'\nimport type { TxHistoryEntry } from '../types'\nimport { groupByDay } from '../utils/groupByDay'\n\nexport interface HistoryProps {\n /** Activity feed, newest anywhere (sorted internally). Defaults to the\n * mock feed until the real activity source lands. */\n entries?: TxHistoryEntry[]\n /** Fired when a row is tapped. Rows are inert when omitted. */\n onSelectEntry?: (entry: TxHistoryEntry) => void\n}\n\nexport function History({\n entries = MOCK_HISTORY,\n onSelectEntry,\n}: HistoryProps) {\n const groups = groupByDay(entries)\n\n return (\n <div className=\"zd:flex zd:h-full zd:w-full zd:flex-col zd:gap-1 zd:pt-2 zd:pb-4\">\n <Wrapper\n variant=\"ghost\"\n className=\"zd:flex zd:w-full zd:flex-1 zd:flex-col zd:gap-1 zd:overflow-y-auto zd:rounded-2xl zd:p-2\"\n >\n {groups.map((group) => (\n <Fragment key={group.label}>\n <div className=\"zd:flex zd:w-full zd:items-center zd:py-2 zd:pr-2\">\n <Text className=\"zd:text-body3\">{group.label}</Text>\n </div>\n {group.entries.map((entry) =>\n onSelectEntry ? (\n <button\n key={entry.id}\n type=\"button\"\n onClick={() => onSelectEntry(entry)}\n className=\"zd:w-full zd:cursor-pointer zd:text-left\"\n >\n <EntryRow entry={entry} />\n </button>\n ) : (\n <EntryRow key={entry.id} entry={entry} />\n ),\n )}\n </Fragment>\n ))}\n </Wrapper>\n </div>\n )\n}\n\nfunction EntryRow({ entry }: { entry: TxHistoryEntry }) {\n return (\n <TxHistoryItem\n icon={entry.icon}\n title={entry.title}\n value={entry.value}\n chainName={entry.chainName}\n {...(entry.chainIconUrl && { chainIconUrl: entry.chainIconUrl })}\n {...(entry.destChainName && { destChainName: entry.destChainName })}\n {...(entry.destChainIconUrl && {\n destChainIconUrl: entry.destChainIconUrl,\n })}\n status={entry.status}\n />\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { useState } from 'react'\nimport type { TxHistoryEntry } from '../types'\nimport { History } from './History'\n\n/** Current page within the history flow. Single page for now — a\n * transaction-details step slots in beside it later. */\nexport type TxHistoryStep = 'history'\n\nconst TITLE_BY_STEP: Record<TxHistoryStep, string> = {\n history: 'History',\n}\n\nexport interface TxHistoryProps {\n /** Called when the top-right × close button is clicked. */\n onClose: () => void\n /** Activity feed; defaults to the mock feed until a real source lands. */\n entries?: TxHistoryEntry[] | undefined\n /** Fired when a row is tapped. Rows are inert when omitted. */\n onSelectEntry?: ((entry: TxHistoryEntry) => void) | undefined\n className?: string | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n}\n\n/**\n * Transaction history widget.\n *\n * Owns the shared `Screen` + `TopNav` chrome and delegates the body to the\n * current page in this directory — mirrors the layout of\n * `smart-routing-address-react-ui`'s `pages/index.tsx`. Navigation is owned\n * here: pages get callbacks, never the step setter.\n */\nexport function TxHistory({\n onClose,\n entries,\n onSelectEntry,\n className,\n size,\n}: TxHistoryProps) {\n // Single step today, so the setter is unused; destructure it back in when\n // the first sub-page (transaction details) lands.\n const [step] = useState<TxHistoryStep>('history')\n\n const renderStep = () => {\n switch (step) {\n case 'history':\n return (\n <History\n {...(entries && { entries })}\n {...(onSelectEntry && { onSelectEntry })}\n />\n )\n }\n }\n\n // Sub-pages will swap the left slot for a back chevron returning to the\n // parent step (see SRA's pages/index.tsx); the root step has none.\n return (\n <Screen\n {...(className && { className })}\n {...(size && { size })}\n topNav={\n <TopNav title={TITLE_BY_STEP[step]} onRightButtonClick={onClose} />\n }\n >\n {renderStep()}\n </Screen>\n )\n}\n"],"names":["errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","title","children","className","jsxs","cn","jsx","Text","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","Fragment","PoweredBy","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","i","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","blobWebm","BlobAnimation","SignUpContext","createContext","useSignUpContext","ctx","useContext","useReportPending","pending","setAuthPending","EMAIL_REGEX","isValidEmailAddress","SignUpEmail","setEmail","authPending","emailAuthMethod","needsAgreement","guardAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","handleSubmit","send","err","Input","Icon","isCancellationError","SignUpGoogle","authenticateOAuth","useAuthenticateOAuth","handleClick","ListItem","ListItemIcon","ListItemChevron","matchesWallet","wallet","guide","WALLET_GUIDE","SignUpInstalledWallets","excludeWalletIds","maxWallets","registeredWallets","connectors","useConnectors","connect","useConnect","rows","w","row","id","a","b","startConnect","name","icon","Badge","WalletTile","tile","WalletGridSheet","open","onOpenChange","tiles","BottomSheet","BottomSheetContent","BottomSheetTitle","BottomSheetClose","SignUpMoreWallets","setOpen","walletConnectors","guideTiles","installed","connectorTiles","SignUpPasskey","mutation","registerPasskey","isRegisterPending","useRegisterPasskey","loginPasskey","isLoginPending","useLoginPasskey","guarded","run","SignUpWallet","walletId","registerWallet","useLayoutEffect","isAnnounced","shared","SignUpRoot","highlightAgreement","setHighlightAgreement","setRegisteredWallets","useCallback","next","agreed","SignUpDivider","label","SignUpDefault","props","SignUp","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","OAuthCallback","PasskeyPrompt","renderStep","renderSignUp","ConnectWallet","userOnClose","size","logo","content","handleClose","Screen","TopNav","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","create","subscribeWithSelector","request","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","params","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError","STATUS_COLOR","TxHistoryItem","value","chainName","chainIconUrl","destChainName","destChainIconUrl","status","ChainTag","iconUrl","ARB_ICON","BASE_ICON","HOUR","MOCK_HISTORY","dayKey","timestamp","d","dayLabel","now","key","groupByDay","entries","sorted","groups","currentKey","entry","History","onSelectEntry","group","EntryRow","TITLE_BY_STEP","TxHistory","onClose"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../assets/states/error.webp?no-inline","../assets/states/loading.webp?no-inline","../assets/states/send.webp?no-inline","../assets/states/success.webp?no-inline","../src/shared/components/StatusScreen/index.tsx","../src/shared/hooks/useKitStore.ts","../src/auth/hooks/useAuth.ts","../src/auth/pages/EmailVerification.tsx","../src/auth/utils/url.ts","../src/auth/pages/ErrorScreen.tsx","../src/auth/components/CodeInput/index.tsx","../src/auth/pages/OtpInput.tsx","../src/shared/components/SignUpFooter/index.tsx","../src/auth/assets/blob.webm?no-inline","../src/auth/components/BlobAnimation/index.tsx","../src/auth/assets/wallet-connect.svg?url","../src/auth/brandAssets.ts","../src/auth/utils/isCancellationError.ts","../src/auth/walletGuide.ts","../src/auth/components/WalletSheet/index.tsx","../src/auth/utils/isMobile.ts","../src/auth/utils/isZeroDevWalletConnect.ts","../src/auth/utils/walletDeepLink.ts","../src/auth/hooks/useWalletConnectPairing.ts","../src/auth/pages/SignUp/context.tsx","../src/shared/utils/common.ts","../src/auth/pages/SignUp/Email.tsx","../src/auth/pages/SignUp/Google.tsx","../src/auth/pages/SignUp/InstalledWallets.tsx","../src/auth/components/WalletGridSheet/index.tsx","../src/auth/pages/SignUp/MoreWallets.tsx","../src/auth/pages/SignUp/Passkey.tsx","../src/auth/pages/SignUp/Wallet.tsx","../src/auth/pages/SignUp/WalletConnect.tsx","../src/auth/pages/SignUp/index.tsx","../src/auth/pages/Verifying.tsx","../src/auth/index.tsx","../src/auth/hooks/useWalletInfo.ts","../src/auth/authStoreSlice.ts","../src/store.ts","../src/connector.ts","../src/history/components/TxHistoryItem/index.tsx","../src/history/mocks.ts","../src/history/utils/groupByDay.ts","../src/history/pages/History.tsx","../src/history/pages/index.tsx","../src/zeroDevWalletConnect.ts"],"sourcesContent":["export default \"__VITE_ASSET__J56$5yRt__\"","export default \"__VITE_ASSET__DC8GJ24R__\"","export default \"__VITE_ASSET__DrgAA58A__\"","export default \"__VITE_ASSET___eUV$EDU__\"","import { cn, Text } from '@zerodev/react-ui'\nimport type { ReactNode } from 'react'\nimport errorImg from '../../../../assets/states/error.webp?no-inline'\nimport loadingImg from '../../../../assets/states/loading.webp?no-inline'\nimport sendImg from '../../../../assets/states/send.webp?no-inline'\nimport successImg from '../../../../assets/states/success.webp?no-inline'\n\nexport type StateImageName = 'error' | 'loading' | 'send' | 'success'\n\nconst STATE_IMAGES: Record<StateImageName, string> = {\n error: errorImg,\n loading: loadingImg,\n send: sendImg,\n success: successImg,\n}\n\nexport interface StatusScreenProps {\n imageName: StateImageName\n title: string\n children: ReactNode\n className?: string\n}\n\nexport function StatusScreen({\n imageName,\n title,\n children,\n className,\n}: StatusScreenProps) {\n return (\n <div\n className={cn('zd:flex zd:flex-col zd:gap-8 zd:items-center', className)}\n >\n <img\n src={STATE_IMAGES[imageName]}\n alt={imageName}\n className=\"zd:w-[118px] zd:h-[118px] zd:bg-transparent\"\n />\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:items-center\">\n <Text className=\"zd:text-h2 zd:text-center zd:whitespace-pre-wrap\">\n {title}\n </Text>\n <Text className=\"zd:text-center zd:whitespace-pre-wrap\">\n {children}\n </Text>\n </div>\n </div>\n )\n}\n","import { useConfig } from 'wagmi'\nimport type { createStore } from '../../store'\n\ntype KitStore = ReturnType<typeof createStore>\n\n/**\n * Returns the zustand store attached to the `zeroDevWallet` connector.\n * Throws when the kit connector isn't present on the wagmi config.\n *\n * Read individual fields with `useStore(useKitStore(), (s) => s.field)`.\n */\nexport function useKitStore(): KitStore {\n const config = useConfig()\n const connector = config.connectors.find((c) => c.id === 'zerodev-wallet')\n if (!connector || !('getKitStore' in connector)) {\n throw new Error('useKitStore must be used with the zeroDevWallet connector')\n }\n // @ts-expect-error - getKitStore is a custom method on the kit connector\n return connector.getKitStore()\n}\n","import { useStore } from 'zustand'\nimport { useKitStore } from '../../shared/hooks/useKitStore'\n\nexport function useAuth() {\n const store = useKitStore()\n\n const step = useStore(store, (state) => state.auth.step)\n const stepHistory = useStore(store, (state) => state.auth.stepHistory)\n const email = useStore(store, (state) => state.auth.email)\n const otpId = useStore(store, (state) => state.auth.otpId)\n const otpEncryptionTargetBundle = useStore(\n store,\n (state) => state.auth.otpEncryptionTargetBundle,\n )\n return {\n step,\n email,\n otpId,\n otpEncryptionTargetBundle,\n goToStep: store.getState().auth.goToStep,\n goBack: stepHistory.length > 0 ? store.getState().auth.goBack : null,\n reset: store.getState().auth.reset,\n setEmail: store.getState().auth.setEmail,\n setOtpSession: store.getState().auth.setOtpSession,\n clearOtpSession: store.getState().auth.clearOtpSession,\n }\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function EmailVerification() {\n const { email, setOtpSession } = useAuth()\n const { mutateAsync: sendMagicLink, isPending: isSendPending } =\n useSendMagicLink()\n\n const [secondsLeftUntilResend, setSecondsLeftUntilResend] = useState(60)\n const canResend = secondsLeftUntilResend <= 0 && !isSendPending\n\n useEffect(() => {\n if (secondsLeftUntilResend <= 0) return\n\n const timer = setInterval(() => {\n setSecondsLeftUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n\n return () => {\n clearInterval(timer)\n }\n }, [secondsLeftUntilResend])\n\n const handleResend = async () => {\n if (!email || !canResend) return\n\n try {\n const { otpId, otpEncryptionTargetBundle } = await sendMagicLink({\n email,\n })\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n setSecondsLeftUntilResend(60)\n } catch {\n // Error resending magic link\n }\n }\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center\">\n <StatusScreen\n imageName=\"send\"\n title={'Check your email!\\n An Email is On Its Way'}\n >\n We've sent a magic link to{' '}\n <Text as=\"span\" className=\"zd:text-solarOrange\">\n {email}\n </Text>\n {'\\n'}Please open the email and click the link to log in.\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsLeftUntilResend} ${secondsLeftUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","export function hasMagicLinkCodeInUrl(): boolean {\n if (typeof window === 'undefined') return false\n return new URLSearchParams(window.location.search).has('code')\n}\n\nexport function stripMagicLinkCodeFromUrl(): void {\n if (typeof window === 'undefined') return\n const url = new URL(window.location.href)\n if (!url.searchParams.has('code')) return\n url.searchParams.delete('code')\n window.history.replaceState(null, '', url.toString())\n}\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\ninterface ErrorScreenProps {\n title?: string\n message?: string\n showRetry?: boolean\n showChooseAnother?: boolean\n}\n\nexport function ErrorScreen({\n title = 'Oops, something went wrong',\n message = \"We couldn't complete the sign-in process. This could be due to timeout, an expired link, or a cancelled request.\",\n showRetry = false,\n showChooseAnother = true,\n}: ErrorScreenProps) {\n const { goToStep, goBack, reset } = useAuth()\n const handleRetry = goBack ?? (() => goToStep('sign-up'))\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"error\" title={title}>\n {message}\n </StatusScreen>\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n {showRetry && (\n <Button action=\"primary\" text=\"Try again\" onClick={handleRetry} />\n )}\n {showChooseAnother && (\n <Button\n action={showRetry ? 'secondary' : 'primary'}\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n )}\n {!showRetry && !showChooseAnother && (\n <Button action=\"primary\" text=\"Start over\" onClick={reset} />\n )}\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { cn, Text, Wrapper } from '@zerodev/react-ui'\nimport { useEffect, useMemo, useRef, useState } from 'react'\n\nconst MIN_LENGTH = 4\nconst MAX_LENGTH = 8\nconst DEFAULT_LENGTH = 6\n\nfunction clampLength(length: number): number {\n return Math.max(MIN_LENGTH, Math.min(MAX_LENGTH, length))\n}\n\ninterface CharBoxProps {\n char: string\n isFocused: boolean\n}\n\nfunction CharBox({ char, isFocused }: CharBoxProps) {\n return (\n <Wrapper\n data-testid=\"code-input-box\"\n data-active={isFocused || undefined}\n className={cn(\n 'zd:h-16 zd:w-14 zd:rounded-lg zd:flex zd:items-center zd:justify-center',\n isFocused && 'zd:border-[1.5px] zd:border-greyScale',\n )}\n >\n <Text className=\"zd:text-h2\">{char}</Text>\n </Wrapper>\n )\n}\n\nexport interface CodeInputProps {\n onChange?: (code: string) => void\n onComplete?: (code: string) => void\n disabled?: boolean\n error?: boolean\n autoFocus?: boolean\n length?: number\n 'data-testid'?: string\n}\n\nexport function CodeInput({\n onChange,\n onComplete,\n disabled = false,\n error = false,\n autoFocus = false,\n length = DEFAULT_LENGTH,\n 'data-testid': testId,\n}: CodeInputProps) {\n const codeLength = clampLength(length)\n const charBoxes = useMemo(\n () =>\n Array.from({ length: codeLength }, (_, i) => ({\n id: `char-${i}`,\n index: i,\n })),\n [codeLength],\n )\n\n const [code, setCode] = useState('')\n const [isFocused, setIsFocused] = useState(false)\n const inputRef = useRef<HTMLInputElement>(null)\n\n useEffect(() => {\n if (autoFocus && !disabled) {\n inputRef.current?.focus()\n }\n }, [autoFocus, disabled])\n\n useEffect(() => {\n setCode((prev) => prev.slice(0, codeLength))\n }, [codeLength])\n\n const handleChange = (text: string) => {\n const sanitized = text.slice(0, codeLength).toUpperCase()\n setCode(sanitized)\n onChange?.(sanitized)\n\n if (sanitized.length === codeLength) {\n // Makes sure onComplete is run on the next render cycle after the last char is rendered\n setTimeout(() => {\n onComplete?.(sanitized)\n inputRef.current?.blur()\n }, 0)\n }\n }\n\n return (\n <button\n type=\"button\"\n className=\"zd:flex zd:flex-row zd:items-center zd:justify-between zd:gap-2 zd:w-full zd:cursor-text\"\n onClick={() => inputRef.current?.focus()}\n disabled={disabled}\n data-testid={testId}\n >\n <input\n ref={inputRef}\n value={code}\n onChange={(e) => handleChange(e.target.value)}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n maxLength={codeLength}\n disabled={disabled}\n className=\"zd:absolute zd:opacity-0 zd:pointer-events-none\"\n style={{ position: 'absolute', opacity: 0 }}\n aria-label=\"Verification code\"\n />\n {charBoxes.map((box) => (\n <CharBox\n key={box.id}\n char={code[box.index] ?? ''}\n isFocused={!error && isFocused && box.index === code.length}\n />\n ))}\n </button>\n )\n}\n","import { Button, PoweredBy, Text } from '@zerodev/react-ui'\nimport { useSendOTP, useVerifyOTP } from '@zerodev/wallet-react'\nimport { useEffect, useState } from 'react'\nimport { CodeInput } from '../components/CodeInput'\nimport { useAuth } from '../hooks/useAuth'\n\nexport function OtpInput() {\n const {\n email,\n otpId,\n otpEncryptionTargetBundle,\n setOtpSession,\n clearOtpSession,\n goToStep,\n } = useAuth()\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: verifyOtp, isPending } = useVerifyOTP()\n\n const [otp, setOtp] = useState('')\n const [error, setError] = useState(false)\n const [secondsUntilResend, setSecondsUntilResend] = useState(60)\n\n // Countdown timer for resend\n useEffect(() => {\n if (secondsUntilResend <= 0) return\n\n const interval = setInterval(() => {\n setSecondsUntilResend((prev) => Math.max(0, prev - 1))\n }, 1000)\n return () => clearInterval(interval)\n }, [secondsUntilResend])\n\n const handleVerify = async () => {\n if (!otp.trim() || !otpId || !otpEncryptionTargetBundle) return\n\n setError(false)\n try {\n await verifyOtp({\n otpId,\n code: otp.trim(),\n otpEncryptionTargetBundle,\n })\n clearOtpSession()\n goToStep('authenticated')\n } catch {\n setError(true)\n }\n }\n\n const handleComplete = (code: string) => {\n setOtp(code)\n }\n\n const handleResend = async () => {\n if (!email || secondsUntilResend > 0 || isSendOtpPending) return\n\n try {\n const { otpId: newOtpId, otpEncryptionTargetBundle: newBundle } =\n await sendOtp({ email })\n setOtpSession({\n otpId: newOtpId,\n otpEncryptionTargetBundle: newBundle,\n })\n setSecondsUntilResend(60)\n setError(false)\n } catch {\n setError(true)\n }\n }\n\n const canResend = secondsUntilResend <= 0 && !isSendOtpPending\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:justify-center zd:items-center\">\n <div className=\"zd:flex zd:flex-col zd:gap-4\">\n <Text className=\"zd:text-h2 zd:text-center\">\n Enter verification code\n </Text>\n <Text className=\"zd:text-center\">\n Enter the code from the email we sent to{' '}\n <Text className=\"zd:text-solarOrange\">{email}</Text>\n </Text>\n </div>\n\n <CodeInput\n onComplete={handleComplete}\n onChange={() => setError(false)}\n disabled={isPending}\n error={error}\n autoFocus\n />\n\n <Button\n text=\"Confirm code\"\n onClick={handleVerify}\n disabled={!otp.trim() || isPending}\n />\n\n <div className=\"zd:flex zd:flex-col zd:gap-1\">\n <Text className=\"zd:text-center\">\n Did not get an email?{' '}\n <button\n type=\"button\"\n disabled={!canResend}\n onClick={handleResend}\n className=\"zd:cursor-pointer zd:underline zd:disabled:opacity-50 zd:disabled:cursor-not-allowed\"\n >\n {canResend\n ? 'Resend'\n : `Resend in ${secondsUntilResend} ${secondsUntilResend === 1 ? 'second' : 'seconds'}`}\n </button>\n </Text>\n </div>\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { PoweredBy, Text } from '@zerodev/react-ui'\n\nexport function SignUpFooter({\n termsAndConditionsUrl,\n privacyPolicyUrl,\n agreedToTerms,\n setAgreedToTerms,\n highlight = false,\n}: {\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n agreedToTerms: boolean\n setAgreedToTerms: (agreed: boolean) => void\n highlight?: boolean\n}) {\n const showAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-5\">\n {showAgreement && (\n <div\n className={`zd:flex zd:flex-row zd:items-center zd:gap-2 zd:rounded-md zd:p-2 zd:transition-colors ${\n highlight\n ? 'zd:border zd:border-negative'\n : 'zd:border zd:border-transparent'\n }`}\n >\n <input\n type=\"checkbox\"\n checked={agreedToTerms}\n onChange={(e) => setAgreedToTerms(e.target.checked)}\n className=\"zd:cursor-pointer zd:[color-scheme:light]\"\n />\n <Text className=\"zd:flex-1\">\n I agree to the{' '}\n {termsAndConditionsUrl && (\n <Text\n as=\"a\"\n href={termsAndConditionsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Terms & Conditions\n </Text>\n )}\n {termsAndConditionsUrl && privacyPolicyUrl && ' and '}\n {privacyPolicyUrl && (\n <Text\n as=\"a\"\n href={privacyPolicyUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:underline\"\n >\n Privacy Policy\n </Text>\n )}\n </Text>\n </div>\n )}\n <PoweredBy />\n </div>\n )\n}\n","export default \"__VITE_ASSET__DthArV0k__\"","// ?no-inline forces Vite to emit blob.webm as a separate file (dist/blob.webm)\n// instead of base64-inlining ~700KB into the JS bundle. Requires base:'./' in\n// vite.config.ts so the emitted URL is package-relative, not root-absolute.\nimport blobWebm from '../../assets/blob.webm?no-inline'\n\n// VP9-alpha WebM. Renders the animated blob on browsers that support WebM with\n// an alpha channel (Chrome, Firefox, Edge). Safari plays the WebM container but\n// not VP9 alpha, so the blob is simply not shown there — an acceptable\n// degradation for a decorative element.\nexport function BlobAnimation({ className }: { className?: string }) {\n return (\n <video\n className={className}\n style={{ aspectRatio: '1 / 1' }}\n src={blobWebm}\n autoPlay\n loop\n muted\n playsInline\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n )\n}\n","export default \"data:image/svg+xml,%3csvg%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%3e%3crect%20width='24'%20height='24'%20fill='url(%23pattern0_19361_9946)'/%3e%3cdefs%3e%3cpattern%20id='pattern0_19361_9946'%20patternContentUnits='objectBoundingBox'%20width='1'%20height='1'%3e%3cuse%20xlink:href='%23image0_19361_9946'%20transform='scale(0.0136986)'/%3e%3c/pattern%3e%3cimage%20id='image0_19361_9946'%20width='73'%20height='73'%20preserveAspectRatio='none'%20xlink:href='data:image/png;base64,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'/%3e%3c/defs%3e%3c/svg%3e\"","import url from './assets/wallet-connect.svg?url'\n\n// Typed explicitly so the emitted d.ts is self-contained — a bare re-export\n// would leak the `.svg?url` specifier into consumers' typecheck.\nexport const walletConnectLogo: string = url\n","export function isCancellationError(err: unknown): boolean {\n if (!(err instanceof Error)) return false\n // WebAuthn / passkey\n if (err.name === 'AbortError' || err.name === 'NotAllowedError') return true\n // EIP-1193 user rejection (external-wallet connect), via viem\n if (err.name === 'UserRejectedRequestError') return true\n // OAuth (existing logic, message-based)\n const msg = err.message.toLowerCase()\n return msg.includes('oauth popup was closed')\n}\n","/**\n * Static wallet metadata (\"wallet guide\") for the external-wallet auth flow:\n * `rdns` matches EIP-6963 announcements, `mobileLink` builds WalletConnect\n * mobile deep links, `icon`/`downloadUrl` brand rows for wallets that are not\n * installed. Self-contained — no runtime registry fetch.\n *\n * Wallet names and logos are trademarks of their respective owners.\n */\n\nexport type WalletGuideEntry = {\n id: string\n name: string\n /**\n * EIP-6963 identifier used to match announced (installed) providers.\n * Absent for wallets that never announce (mobile-app-only wallets).\n */\n rdns?: string\n /** Self-contained `data:image/svg+xml` URI. */\n icon: string\n /**\n * WalletConnect mobile deep-link prefix — append `encodeURIComponent(wcUri)`.\n * Absent when the wallet has no WC deep link (SDK- or extension-only).\n */\n mobileLink?: string\n /** Vendor download page, for \"get the wallet\" fallbacks. */\n downloadUrl: string\n}\n\n/**\n * A live 6963 announcement claiming a guide wallet. Announced connectors\n * carry `id === rdns`; wallets' in-app browsers announce a variant rdns\n * (MetaMask mobile is `io.metamask.mobile`) but keep the wallet's exact\n * name, so an announced connector matching the guide name also counts —\n * the same fallback Reown AppKit and Dynamic use. The generic `injected()`\n * connector (id \"injected\") and our embedded connector also claim type\n * \"injected\" without being announcements.\n */\nexport function announcesWallet(\n connector: {\n id: string\n name?: string\n type?: string\n rdns?: string | readonly string[] | undefined\n },\n wallet: WalletGuideEntry,\n): boolean {\n if (!!wallet.rdns && connector.id === wallet.rdns) return true\n return (\n !!wallet.rdns &&\n connector.type === 'injected' &&\n connector.id !== 'injected' &&\n connector.id !== 'zerodev-wallet' &&\n connector.name === wallet.name\n )\n}\n\n/**\n * A live connector \"claims\" a guide wallet: it announces it (see\n * `announcesWallet`), or is an explicit connector (e.g. `metaMask()`)\n * declaring the wallet's rdns as a string or array.\n */\nexport function matchesWallet(\n connector: {\n id: string\n name?: string\n type?: string\n rdns?: string | readonly string[] | undefined\n },\n wallet: WalletGuideEntry,\n): boolean {\n if (announcesWallet(connector, wallet)) return true\n return (\n !!wallet.rdns &&\n (Array.isArray(connector.rdns)\n ? connector.rdns.includes(wallet.rdns)\n : connector.rdns === wallet.rdns)\n )\n}\n\nconst guide = [\n {\n id: 'metamask',\n name: 'MetaMask',\n rdns: 'io.metamask',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cg%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%23ff5c16%22%20d%3D%22m24.024%2023.824-4.846-1.434-3.655%202.172-2.55-.001-3.656-2.171-4.844%201.434L3%2018.88l1.473-5.488L3%208.751%204.473%203l7.569%204.496h4.413L24.024%203l1.473%205.751-1.473%204.64%201.473%205.488z%22%2F%3E%3Cpath%20fill%3D%22%23ff5c16%22%20d%3D%22m4.474%203%207.57%204.499-.302%203.087zm4.844%2015.881%203.33%202.522-3.33.987zm3.064-4.17-.64-4.123-4.097%202.804h-.002v.001l.013%202.886%201.661-1.567zM24.024%203l-7.57%204.499.3%203.087zM19.18%2018.881l-3.33%202.522%203.33.987zm1.674-5.488v-.002zl-4.097-2.804-.64%204.124h3.064l1.662%201.567z%22%2F%3E%3Cpath%20fill%3D%22%23e34807%22%20d%3D%22m9.317%2022.39-4.844%201.434L3%2018.881h6.317zm3.064-7.68.925%205.962-1.282-3.315-4.37-1.078%201.662-1.568zm6.799%207.68%204.844%201.434%201.473-4.943H19.18zm-3.064-7.68-.925%205.962%201.282-3.315%204.37-1.078-1.663-1.568z%22%2F%3E%3Cpath%20fill%3D%22%23ff8d5d%22%20d%3D%22m3%2018.88%201.473-5.489h3.169l.012%202.887%204.37%201.078%201.282%203.314-.659.73-3.33-2.522H3zm22.497%200-1.473-5.489h-3.17l-.01%202.887-4.371%201.078-1.282%203.314.659.73%203.33-2.522h6.317zM16.455%207.495h-4.413l-.3%203.087%201.565%2010.084h1.884l1.565-10.084z%22%2F%3E%3Cpath%20fill%3D%22%23661800%22%20d%3D%22M4.473%203%203%208.751l1.473%204.64h3.169l4.1-2.805zm6.992%2012.908H10.03l-.781.761%202.776.685-.56-1.447M24.024%203l1.473%205.751-1.473%204.64h-3.17l-4.098-2.805zm-6.99%2012.908h1.437l.782.762-2.78.686.56-1.45zm-1.512%206.687.328-1.193-.66-.73h-1.885l-.659.73.327%201.192%22%2F%3E%3Cpath%20fill%3D%22%23c0c4cd%22%20d%3D%22M15.522%2022.594v1.969h-2.548v-1.969z%22%2F%3E%3Cpath%20fill%3D%22%23e7ebf6%22%20d%3D%22m9.318%2022.388%203.658%202.174v-1.969l-.328-1.192zm9.862%200-3.658%202.174v-1.969l.328-1.192z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M3%203h22.5v21.563H3z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'https://metamask.app.link/wc?uri=',\n downloadUrl: 'https://metamask.io/download',\n },\n {\n id: 'trust',\n name: 'Trust Wallet',\n rdns: 'com.trustwallet.app',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20width%3D%2228%22%20height%3D%2228%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%230500FF%22%20d%3D%22M6%207.583%2013.53%205v17.882C8.15%2020.498%206%2015.928%206%2013.345V7.583Z%22%2F%3E%3Cpath%20fill%3D%22url(%23a)%22%20d%3D%22M22%207.583%2013.53%205v17.882c6.05-2.384%208.47-6.954%208.47-9.537V7.583Z%22%2F%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22a%22%20x1%3D%2219.768%22%20x2%3D%2214.072%22%20y1%3D%223.753%22%20y2%3D%2222.853%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20offset%3D%22.02%22%20stop-color%3D%22%2300F%22%2F%3E%3Cstop%20offset%3D%22.08%22%20stop-color%3D%22%230094FF%22%2F%3E%3Cstop%20offset%3D%22.16%22%20stop-color%3D%22%2348FF91%22%2F%3E%3Cstop%20offset%3D%22.42%22%20stop-color%3D%22%230094FF%22%2F%3E%3Cstop%20offset%3D%22.68%22%20stop-color%3D%22%230038FF%22%2F%3E%3Cstop%20offset%3D%22.9%22%20stop-color%3D%22%230500FF%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'trust://wc?uri=',\n downloadUrl: 'https://trustwallet.com/download',\n },\n {\n id: 'coinbase',\n name: 'Coinbase Wallet',\n rdns: 'com.coinbase.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20width%3D%2228%22%20height%3D%2228%22%20viewBox%3D%220%200%2028%2028%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22%232C5FF6%22%2F%3E%0A%3Cpath%20fill-rule%3D%22evenodd%22%20clip-rule%3D%22evenodd%22%20d%3D%22M14%2023.8C19.4124%2023.8%2023.8%2019.4124%2023.8%2014C23.8%208.58761%2019.4124%204.2%2014%204.2C8.58761%204.2%204.2%208.58761%204.2%2014C4.2%2019.4124%208.58761%2023.8%2014%2023.8ZM11.55%2010.8C11.1358%2010.8%2010.8%2011.1358%2010.8%2011.55V16.45C10.8%2016.8642%2011.1358%2017.2%2011.55%2017.2H16.45C16.8642%2017.2%2017.2%2016.8642%2017.2%2016.45V11.55C17.2%2011.1358%2016.8642%2010.8%2016.45%2010.8H11.55Z%22%20fill%3D%22white%22%2F%3E%0A%3C%2Fsvg%3E',\n downloadUrl: 'https://coinbase.com/wallet/downloads',\n },\n {\n id: 'rainbow',\n name: 'Rainbow',\n rdns: 'me.rainbow',\n icon: 'data:image/svg+xml,%3Csvg%20width%3D%22120%22%20height%3D%22120%22%20viewBox%3D%220%200%20120%20120%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Crect%20width%3D%22120%22%20height%3D%22120%22%20fill%3D%22url(%23paint0_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2038H26C56.9279%2038%2082%2063.0721%2082%2094V100H94C97.3137%20100%20100%2097.3137%20100%2094C100%2053.1309%2066.8691%2020%2026%2020C22.6863%2020%2020%2022.6863%2020%2026V38Z%22%20fill%3D%22url(%23paint1_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M84%2094H100C100%2097.3137%2097.3137%20100%2094%20100H84V94Z%22%20fill%3D%22url(%23paint2_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M26%2020L26%2036H20L20%2026C20%2022.6863%2022.6863%2020%2026%2020Z%22%20fill%3D%22url(%23paint3_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2036H26C58.0325%2036%2084%2061.9675%2084%2094V100H66V94C66%2071.9086%2048.0914%2054%2026%2054H20V36Z%22%20fill%3D%22url(%23paint4_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M68%2094H84V100H68V94Z%22%20fill%3D%22url(%23paint5_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2052L20%2036L26%2036L26%2052H20Z%22%20fill%3D%22url(%23paint6_linear_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M20%2062C20%2065.3137%2022.6863%2068%2026%2068C40.3594%2068%2052%2079.6406%2052%2094C52%2097.3137%2054.6863%20100%2058%20100H68V94C68%2070.804%2049.196%2052%2026%2052H20V62Z%22%20fill%3D%22url(%23paint7_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M52%2094H68V100H58C54.6863%20100%2052%2097.3137%2052%2094Z%22%20fill%3D%22url(%23paint8_radial_62_329)%22%2F%3E%0A%3Cpath%20d%3D%22M26%2068C22.6863%2068%2020%2065.3137%2020%2062L20%2052L26%2052L26%2068Z%22%20fill%3D%22url(%23paint9_radial_62_329)%22%2F%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_62_329%22%20x1%3D%2260%22%20y1%3D%220%22%20x2%3D%2260%22%20y2%3D%22120%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23174299%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23001E59%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint1_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(74)%22%3E%0A%3Cstop%20offset%3D%220.770277%22%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%238754C9%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3ClinearGradient%20id%3D%22paint2_linear_62_329%22%20x1%3D%2283%22%20y1%3D%2297%22%20x2%3D%22100%22%20y2%3D%2297%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%238754C9%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint3_linear_62_329%22%20x1%3D%2223%22%20y1%3D%2220%22%20x2%3D%2223%22%20y2%3D%2237%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%238754C9%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF4000%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint4_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(58)%22%3E%0A%3Cstop%20offset%3D%220.723929%22%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3ClinearGradient%20id%3D%22paint5_linear_62_329%22%20x1%3D%2268%22%20y1%3D%2297%22%20x2%3D%2284%22%20y2%3D%2297%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint6_linear_62_329%22%20x1%3D%2223%22%20y1%3D%2252%22%20x2%3D%2223%22%20y2%3D%2236%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23FFF700%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23FF9901%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3CradialGradient%20id%3D%22paint7_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(26%2094)%20rotate(-90)%20scale(42)%22%3E%0A%3Cstop%20offset%3D%220.59513%22%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22paint8_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(51%2097)%20scale(17%2045.3333)%22%3E%0A%3Cstop%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3CradialGradient%20id%3D%22paint9_radial_62_329%22%20cx%3D%220%22%20cy%3D%220%22%20r%3D%221%22%20gradientUnits%3D%22userSpaceOnUse%22%20gradientTransform%3D%22translate(23%2069)%20rotate(-90)%20scale(17%20322.37)%22%3E%0A%3Cstop%20stop-color%3D%22%2300AAFF%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2301DA40%22%2F%3E%0A%3C%2FradialGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E',\n mobileLink: 'rainbow://wc?uri=',\n downloadUrl: 'https://rainbow.download',\n },\n {\n id: 'rabby',\n name: 'Rabby Wallet',\n rdns: 'io.rabby',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cg%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20fill%3D%22%238697FF%22%20d%3D%22M28%200H0v28h28V0Z%22%2F%3E%3Cpath%20fill%3D%22url(%23b)%22%20d%3D%22M22.54%2015.078c.677-1.514-2.673-5.744-5.874-7.506-2.017-1.365-4.12-1.178-4.545-.579-.935%201.316%203.094%202.43%205.788%203.731-.58.252-1.125.703-1.446%201.28-1.004-1.096-3.209-2.04-5.796-1.28-1.743.513-3.191%201.721-3.751%203.546a1.097%201.097%200%201%200-.445%202.1c.112%200%20.463-.075.463-.075l5.612.041c-2.244%203.56-4.018%204.081-4.018%204.698s1.697.45%202.335.22c3.05-1.1%206.327-4.531%206.89-5.519%202.36.295%204.345.33%204.786-.657Z%22%2F%3E%3Cpath%20fill%3D%22url(%23c)%22%20fill-rule%3D%22evenodd%22%20d%3D%22m17.885%2010.713.025.01c.125-.049.105-.233.07-.378-.078-.333-1.438-1.676-2.715-2.277-1.743-.82-3.025-.777-3.212-.398.356.726%201.998%201.408%203.714%202.12.723.3%201.46.606%202.118.923Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill%3D%22url(%23d)%22%20fill-rule%3D%22evenodd%22%20d%3D%22M15.701%2018.036a10.296%2010.296%200%200%200-1.2-.37c.482-.862.583-2.138.128-2.945-.639-1.133-1.44-1.736-3.304-1.736-1.024%200-3.783.346-3.832%202.648-.005.242%200%20.464.017.667l5.036.037a17.264%2017.264%200%200%201-1.871%202.483c.669.172%201.221.316%201.728.448.48.125.92.24%201.38.357a21.003%2021.003%200%200%200%201.918-1.59Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3Cpath%20fill%3D%22url(%23e)%22%20d%3D%22M6.848%2016.063c.206%201.75%201.2%202.435%203.232%202.638%202.032.203%203.197.067%204.749.208%201.296.118%202.453.778%202.882.55.386-.205.17-.947-.347-1.423-.67-.617-1.597-1.046-3.229-1.199.325-.89.234-2.138-.27-2.817-.731-.982-2.079-1.426-3.785-1.232-1.782.202-3.49%201.08-3.232%203.275Z%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22b%22%20x1%3D%2210.464%22%20x2%3D%2222.394%22%20y1%3D%2213.737%22%20y2%3D%2217.12%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fff%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22c%22%20x1%3D%2220.386%22%20x2%3D%2211.779%22%20y1%3D%2213.509%22%20y2%3D%224.879%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%237258DC%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23797DEA%22%20stop-opacity%3D%220%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22d%22%20x1%3D%2215.94%22%20x2%3D%227.673%22%20y1%3D%2218.337%22%20y2%3D%2213.584%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%237461EA%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23BFC2FF%22%20stop-opacity%3D%220%22%2F%3E%3C%2FlinearGradient%3E%3ClinearGradient%20id%3D%22e%22%20x1%3D%2211.177%22%20x2%3D%2216.765%22%20y1%3D%2213.648%22%20y2%3D%2220.749%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%3Cstop%20stop-color%3D%22%23fff%22%2F%3E%3Cstop%20offset%3D%22.984%22%20stop-color%3D%22%23D5CEFF%22%2F%3E%3C%2FlinearGradient%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'rabby://wc?uri=',\n downloadUrl: 'https://rabby.io',\n },\n {\n id: 'okx',\n name: 'OKX Wallet',\n rdns: 'com.okex.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22M10.819%205.556H5.93a.376.376%200%200%200-.375.375v4.888c0%20.207.168.375.375.375h4.888a.376.376%200%200%200%20.375-.376V5.932a.376.376%200%200%200-.376-.375Zm5.64%205.638h-4.886a.376.376%200%200%200-.376.376v4.887c0%20.208.168.376.376.376h4.887a.376.376%200%200%200%20.376-.375V11.57a.376.376%200%200%200-.376-.377Zm.75-5.638h4.887c.208%200%20.376.168.376.375v4.888a.376.376%200%200%201-.376.375H17.21a.376.376%200%200%201-.376-.376V5.933c0-.208.169-.376.376-.376Zm-6.39%2011.277H5.93a.376.376%200%200%200-.375.376v4.887c0%20.208.168.376.375.376h4.888a.376.376%200%200%200%20.375-.376V17.21a.376.376%200%200%200-.376-.376Zm6.39%200h4.887c.208%200%20.376.169.376.376v4.887a.376.376%200%200%201-.376.376H17.21a.376.376%200%200%201-.376-.376V17.21c0-.207.169-.376.376-.376Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'okex://main/wc?uri=',\n downloadUrl: 'https://okx.com/download',\n },\n {\n id: 'zerion',\n name: 'Zerion',\n rdns: 'io.zerion.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20fill%3D%22none%22%20viewBox%3D%220%200%2028%2028%22%3E%3Cpath%20fill%3D%22%232962EF%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M6.073%207c-.48%200-.665.593-.262.841l10.073%206.074a.577.577%200%200%200%20.758-.139l4.43-5.814c.3-.404-.004-.962-.525-.962H6.073ZM21.904%2021c.48%200%20.67-.596.267-.844l-10.075-6.073a.569.569%200%200%200-.751.146l-4.437%205.813c-.301.404.012.958.534.958h14.462Z%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'zerion://wc?uri=',\n downloadUrl: 'https://zerion.io',\n },\n {\n id: 'uniswap',\n name: 'Uniswap',\n rdns: 'org.uniswap.app',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23FFD8EA%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cg%20fill%3D%22%23FF007A%22%20clip-path%3D%22url(%23a)%22%3E%3Cpath%20d%3D%22M9.635%206.068c-.255-.039-.266-.043-.145-.06.23-.035.773.012%201.148.099.874.202%201.67.722%202.519%201.646l.225.246.323-.051c1.36-.213%202.741-.044%203.899.477.319.144.821.43.882.503.022.024.058.173.082.335.086.557.044.982-.13%201.301-.096.173-.101.228-.037.377a.367.367%200%200%200%20.334.206c.287%200%20.597-.454.74-1.086l.056-.252.113.126c.62.685%201.106%201.618%201.189%202.282l.021.174-.103-.158a1.966%201.966%200%200%200-.59-.604c-.415-.268-.855-.36-2.017-.42-1.05-.053-1.645-.141-2.234-.329-1.003-.32-1.508-.744-2.699-2.27-.53-.678-.855-1.053-1.18-1.354-.74-.687-1.466-1.047-2.396-1.187v-.001Z%22%2F%3E%3Cpath%20d%3D%22M18.725%207.581c.026-.453.088-.753.216-1.026.028-.07.063-.136.104-.198a.69.69%200%200%201-.049.178c-.092.266-.108.629-.043%201.052.081.536.126.613.706%201.192.273.272.589.613.704.761l.21.267-.21-.191c-.255-.233-.841-.69-.972-.755-.086-.042-.1-.042-.153.01-.05.048-.06.12-.068.461-.01.532-.084.873-.263%201.213-.096.187-.111.147-.025-.062.066-.155.072-.224.072-.739%200-1.033-.127-1.283-.864-1.707a8.169%208.169%200%200%200-.684-.346%202.614%202.614%200%200%201-.334-.16c.02-.02.74.185%201.029.293.431.163.502.183.555.164.034-.013.051-.113.068-.407h.001Zm-8.595%201.77c-.517-.696-.838-1.764-.768-2.563l.02-.247.119.02c.222.04.603.179.783.286.49.29.703.673.918%201.657.064.288.147.613.185.725.061.178.294.592.483.862.136.194.046.286-.255.26-.46-.04-1.083-.46-1.485-1Zm7.965%205.182c-2.42-.95-3.273-1.777-3.273-3.17%200-.206.007-.374.016-.374.008%200%20.102.067.208.151.491.384%201.04.548%202.563.765.896.128%201.398.231%201.864.382%201.48.478%202.392%201.449%202.61%202.773.063.384.028%201.104-.076%201.484-.082.3-.329.84-.394.861-.019.007-.037-.061-.04-.154-.025-.496-.283-.98-.715-1.343-.49-.412-1.15-.741-2.763-1.375Zm-1.699.396a4.13%204.13%200%200%200-.117-.5l-.062-.18.115.127c.16.173.285.396.391.693.082.227.09.294.09.662%200%20.361-.011.437-.087.64-.104.3-.28.572-.51.794-.443.44-1.011.683-1.833.784-.142.018-.557.047-.922.066-.922.046-1.529.144-2.073.33a.446.446%200%200%201-.156.036c-.021-.021.35-.237.656-.381.431-.204.861-.315%201.825-.47.475-.078.968-.173%201.093-.21%201.178-.352%201.784-1.263%201.59-2.39Z%22%2F%3E%3Cpath%20d%3D%22M17.506%2016.855c-.321-.675-.396-1.327-.22-1.935.02-.067.05-.119.068-.119a.64.64%200%200%201%20.169.09c.149.097.445.261%201.237.682.988.527%201.553.934%201.936%201.4.335.407.542.872.643%201.438.057.32.023%201.093-.061%201.416-.266%201.018-.882%201.818-1.764%202.285a2.129%202.129%200%200%201-.258.124c-.013%200%20.035-.116.104-.259.297-.605.331-1.193.107-1.848-.138-.401-.418-.89-.982-1.718-.657-.96-.817-1.218-.979-1.556Zm-9.095%203.644c.9-.742%202.016-1.267%203.036-1.43a4.85%204.85%200%200%201%201.575.06c.652.163%201.235.528%201.538.962.296.425.423.794.556%201.618.052.324.109.651.125.724.1.427.293.768.532.939.38.272%201.037.29%201.682.044a.853.853%200%200%201%20.21-.064c.023.023-.301.235-.53.347-.27.141-.572.213-.879.208-.59%200-1.08-.294-1.49-.891a7.027%207.027%200%200%201-.402-.784c-.431-.961-.644-1.253-1.145-1.575-.437-.28-1-.329-1.424-.126-.556.266-.71.96-.312%201.4.187.189.43.313.695.354a.75.75%200%200%200%20.589-.174.728.728%200%200%200%20.251-.551c0-.29-.114-.453-.4-.581-.392-.172-.812.029-.81.388%200%20.153.069.249.226.32.1.044.103.046.02.03-.358-.073-.442-.496-.154-.776.347-.336%201.064-.188%201.31.272.103.194.115.578.025.81-.203.52-.79.793-1.387.644-.407-.102-.571-.211-1.06-.703-.852-.856-1.182-1.023-2.408-1.21l-.237-.035.268-.22Z%22%2F%3E%3Cpath%20fill-rule%3D%22evenodd%22%20d%3D%22M4.418%205.179c2.842%203.368%204.8%204.757%205.017%205.05.18.243.112.462-.195.632a1.899%201.899%200%200%201-.699.191c-.2%200-.269-.075-.269-.075-.115-.106-.18-.088-.773-1.116A176.911%20176.911%200%200%200%205.968%207.56c-.044-.04-.042-.04%201.448%202.564.24.543.047.741.047.819%200%20.157-.044.24-.242.457-.332.36-.48.765-.587%201.604-.12.94-.456%201.604-1.39%202.741-.545.666-.635.787-.773%201.056-.174.338-.221.527-.24.952a2.9%202.9%200%200%200%20.16%201.174c.122.378.252.626.582%201.125.285.43.448.75.448.876%200%20.099.019.099.461.001%201.054-.232%201.91-.64%202.392-1.142.298-.311.367-.482.37-.907.002-.277-.008-.336-.085-.496-.125-.26-.353-.477-.855-.813-.66-.44-.942-.794-1.018-1.28-.065-.4.01-.682.373-1.427.377-.773.47-1.103.535-1.88.04-.503.096-.701.244-.861.155-.166.293-.222.676-.272.623-.084%201.018-.24%201.343-.534a1.14%201.14%200%200%200%20.421-.869l.014-.28-.16-.179C9.563%209.34%204.036%204.667%204%204.667c-.007%200%20.18.23.418.512Zm1.325%2013.086a.486.486%200%200%200-.157-.652c-.203-.133-.522-.069-.522.103%200%20.053.03.092.098.125.114.058.122.122.032.254s-.082.248.02.328c.168.126.404.057.529-.158ZM10.683%2012c-.29.086-.575.389-.664.706-.053.194-.022.534.058.638.13.169.255.213.596.212.665-.004%201.243-.283%201.311-.632.054-.286-.2-.68-.55-.855a1.33%201.33%200%200%200-.75-.07Zm.78.593c.102-.143.057-.296-.118-.4-.331-.199-.835-.035-.835.272%200%20.153.262.32.502.32.16%200%20.38-.093.45-.192Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fg%3E%3Cdefs%3E%3CclipPath%20id%3D%22a%22%3E%3Cpath%20fill%3D%22%23fff%22%20d%3D%22M4%204h19v20H4z%22%2F%3E%3C%2FclipPath%3E%3C%2Fdefs%3E%3C%2Fsvg%3E',\n mobileLink: 'uniswap://wc?uri=',\n downloadUrl: 'https://wallet.uniswap.org',\n },\n {\n id: 'ledger',\n name: 'Ledger',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2228%22%20height%3D%2228%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h28v28H0z%22%2F%3E%3Cpath%20fill%3D%22%23fff%22%20fill-rule%3D%22evenodd%22%20d%3D%22M11.65%204.4H4.4V9h1.1V5.5l6.15-.04V4.4Zm.05%205.95v7.25h4.6v-1.1h-3.5l-.04-6.15H11.7ZM4.4%2023.6h7.25v-1.06L5.5%2022.5V19H4.4v4.6ZM16.35%204.4h7.25V9h-1.1V5.5l-6.15-.04V4.4Zm7.25%2019.2h-7.25v-1.06l6.15-.04V19h1.1v4.6Z%22%20clip-rule%3D%22evenodd%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'ledgerlive://wc?uri=',\n downloadUrl: 'https://www.ledger.com/ledger-live',\n },\n {\n id: 'binance',\n name: 'Binance Wallet',\n rdns: 'com.binance.wallet',\n icon: 'data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22130%22%20height%3D%22130%22%20fill%3D%22none%22%3E%3Cpath%20fill%3D%22%23000%22%20d%3D%22M0%200h130v130H0z%22%2F%3E%3Cpath%20fill%3D%22%23F3BA2F%22%20d%3D%22M45.587%2057.02%2065.01%2037.606l19.43%2019.43%2011.295-11.303L65.01%2015%2034.284%2045.725zM15%2065.004l11.299-11.299%2011.298%2011.299L26.3%2076.302zM45.587%2072.983%2065.01%2092.406l19.43-19.43%2011.303%2011.287-.008.007-30.725%2030.734-30.725-30.718-.016-.016zM92.403%2065.006%20103.7%2053.708%20115%2065.006l-11.299%2011.299z%22%2F%3E%3Cpath%20fill%3D%22%23F3BA2F%22%20d%3D%22m76.471%2064.998-11.46-11.469-8.476%208.475-.98.972-2.005%202.006-.016.016.016.024%2011.46%2011.453%2011.461-11.47.008-.007z%22%2F%3E%3C%2Fsvg%3E',\n mobileLink: 'bnc://app.binance.com/cedefi/wc?uri=',\n downloadUrl: 'https://www.binance.com/en/download',\n },\n] as const satisfies readonly WalletGuideEntry[]\n\n/** Valid `walletId` values for `<SignUp.Wallet>` — the guide's wallet ids. */\nexport type WalletId = (typeof guide)[number]['id']\n\n// Widened so entries have a uniform shape (`rdns` et al. always accessible);\n// `guide` stays literal only to derive `WalletId`.\nexport const WALLET_GUIDE: readonly WalletGuideEntry[] = guide\n","import {\n BottomSheet,\n BottomSheetClose,\n BottomSheetContent,\n BottomSheetTitle,\n Button,\n QrCode,\n Text,\n} from '@zerodev/react-ui'\nimport { useState } from 'react'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { walletConnectLogo } from '../../brandAssets'\nimport { useAuth } from '../../hooks/useAuth'\nimport type { WalletConnectPairing } from '../../hooks/useWalletConnectPairing'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { matchesWallet, type WalletGuideEntry } from '../../walletGuide'\n\nexport type WalletSheetProps = {\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Absent = generic WalletConnect mode (raw-URI QR, no tabs). */\n wallet?: WalletGuideEntry | undefined\n /** Page-level pairing (preloaded by the SignUp root) shared by every wallet\n * surface. */\n pairing: WalletConnectPairing\n}\n\n/**\n * Bottom sheet with the connection paths for one wallet (or the generic\n * WalletConnect pairing). The pairing is preloaded at page level so the QR is\n * ready on open and mobile row taps can deep-link synchronously; when the\n * proposal expires, WalletConnect rejects the pending connect and the error\n * branch offers Try again.\n */\nexport function WalletSheet({\n open,\n onOpenChange,\n wallet,\n pairing,\n}: WalletSheetProps) {\n return (\n <BottomSheet open={open} onOpenChange={onOpenChange}>\n <BottomSheetContent className=\"zd:p-4\">\n <BottomSheetTitle>\n {wallet ? `Connect ${wallet.name}` : 'WalletConnect'}\n </BottomSheetTitle>\n <SheetBody wallet={wallet} pairing={pairing} />\n </BottomSheetContent>\n </BottomSheet>\n )\n}\n\nfunction SheetBody({\n wallet,\n pairing,\n}: {\n wallet?: WalletGuideEntry | undefined\n pairing: WalletConnectPairing\n}) {\n const { goToStep } = useAuth()\n const { uri, error, retry } = pairing\n const connectors = useConnectors()\n const { connect } = useConnect()\n\n // Installed (announced/configured) connector for the selected wallet —\n // drives the Browser tab: connect directly instead of \"get the extension\".\n const installed = wallet\n ? connectors.find((c) => matchesWallet(c, wallet))\n : undefined\n const [tab, setTab] = useState<'mobile' | 'browser'>(\n installed ? 'browser' : 'mobile',\n )\n const [connectError, setConnectError] = useState<string | null>(null)\n const [copied, setCopied] = useState(false)\n\n // Wallet-specific QR encodes the wallet's own deep link so phone cameras\n // route to THAT app (`wc:` is claimed by every wallet app). Generic mode\n // keeps the raw URI so any wallet's in-app scanner can claim the pairing.\n const qrValue =\n uri && wallet?.mobileLink\n ? `${wallet.mobileLink}${encodeURIComponent(uri)}`\n : uri\n\n const copyUri = async () => {\n if (!uri) return\n // Clipboard access throws in insecure contexts (non-HTTPS) or when the\n // user denies it — don't let that surface as an unhandled rejection.\n try {\n await navigator.clipboard.writeText(uri)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // No clipboard — the QR / deep link remain the primary paths.\n }\n }\n\n const connectInstalled = () => {\n if (!installed) return\n setConnectError(null)\n connect(\n { connector: installed },\n {\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setConnectError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n const shownError = error ?? connectError\n\n return (\n <div className=\"zd:flex zd:flex-col zd:items-center zd:gap-3\">\n <div className=\"zd:flex zd:w-full zd:items-center zd:gap-2\">\n <img\n src={wallet ? wallet.icon : walletConnectLogo}\n alt=\"\"\n className=\"zd:w-8 zd:h-8 zd:rounded-xl\"\n />\n <Text className=\"zd:text-h3 zd:flex-1\">\n {wallet ? wallet.name : 'WalletConnect'}\n </Text>\n <BottomSheetClose asChild>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"zd:cursor-pointer zd:px-2 zd:text-greyScale/60\"\n >\n ✕\n </button>\n </BottomSheetClose>\n </div>\n\n {wallet && (\n <div className=\"zd:flex zd:w-full zd:gap-2\">\n {(['mobile', 'browser'] as const).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => setTab(t)}\n className={`zd:flex-1 zd:rounded-2xl zd:py-1.5 zd:text-body3 zd:cursor-pointer ${\n tab === t\n ? 'zd:bg-greyScale/10 zd:font-semibold'\n : 'zd:text-greyScale/60'\n }`}\n >\n {t === 'mobile' ? 'Mobile' : 'Browser'}\n </button>\n ))}\n </div>\n )}\n\n {!wallet || tab === 'mobile' ? (\n shownError ? (\n <div className=\"zd:flex zd:flex-col zd:gap-2 zd:items-center\">\n <Text className=\"zd:text-center zd:text-red-500\">{shownError}</Text>\n <Button action=\"secondary\" text=\"Try again\" onClick={retry} />\n </div>\n ) : (\n <>\n <div className=\"zd:bg-white zd:rounded-2xl zd:p-2 zd:border zd:border-greyScale/10\">\n {qrValue ? (\n <QrCode value={qrValue} size={176} />\n ) : (\n <div className=\"zd:w-[176px] zd:h-[176px] zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-8 zd:h-8 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n )}\n </div>\n {qrValue && wallet?.mobileLink && (\n <a\n href={qrValue}\n className=\"zd:w-full zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold\"\n >\n Open in {wallet.name}\n </a>\n )}\n <Button\n action=\"secondary\"\n text={copied ? 'Copied' : 'Copy link'}\n onClick={copyUri}\n disabled={!qrValue}\n />\n </>\n )\n ) : shownError ? (\n <div className=\"zd:flex zd:flex-col zd:gap-2 zd:items-center\">\n <Text className=\"zd:text-center zd:text-red-500\">{shownError}</Text>\n <Button\n action=\"secondary\"\n text=\"Try again\"\n onClick={installed ? connectInstalled : retry}\n />\n </div>\n ) : installed && wallet ? (\n <button\n type=\"button\"\n onClick={connectInstalled}\n className=\"zd:w-full zd:cursor-pointer zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold\"\n >\n Open in {wallet.name}\n </button>\n ) : (\n wallet && (\n <a\n href={wallet.downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"zd:w-full zd:rounded-2xl zd:bg-greyScale/10 zd:py-2 zd:text-center zd:text-body2 zd:font-semibold\"\n >\n Get {wallet.name}\n </a>\n )\n )}\n </div>\n )\n}\n","export function isMobile() {\n if (typeof window === 'undefined') return false\n return (\n window.matchMedia?.('(pointer: coarse)')?.matches ||\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|Opera Mini/u.test(\n navigator.userAgent,\n )\n )\n}\n","import type { Connector } from 'wagmi'\n\n/** True for connectors created by `zeroDevWalletConnect` — the only ones the\n * kit pairs through. A raw `walletConnect()` may have `showQrModal` enabled\n * (its default), which can't be read back, so it's ignored. */\nexport function isZeroDevWalletConnect(connector: Connector) {\n return connector.type === 'walletConnect' && 'zdWalletConnect' in connector\n}\n","import { matchesWallet, type WalletGuideEntry } from '../walletGuide'\n\n/**\n * Wrapped deep link for the one-tap mobile redirect into `wallet`'s app, or\n * null when the tap should just open the sheet: desktop, a claiming installed\n * connector (direct connect wins), or no pairing URI.\n */\nexport function walletDeepLink(params: {\n wallet: WalletGuideEntry\n connectors: readonly {\n id: string\n name?: string\n type?: string\n rdns?: string | readonly string[] | undefined\n }[]\n uri: string | null\n mobile: boolean\n}): string | null {\n const { wallet, connectors, uri, mobile } = params\n if (!wallet.mobileLink || !mobile || !uri) return null\n if (connectors.some((c) => matchesWallet(c, wallet))) return null\n return `${wallet.mobileLink}${encodeURIComponent(uri)}`\n}\n","import { useEffect, useRef, useState } from 'react'\nimport {\n type Connector,\n useAccount,\n useConnect,\n useConnections,\n useConnectors,\n} from 'wagmi'\nimport { isMobile } from '../utils/isMobile'\nimport { isZeroDevWalletConnect } from '../utils/isZeroDevWalletConnect'\nimport { walletDeepLink } from '../utils/walletDeepLink'\nimport type { WalletGuideEntry } from '../walletGuide'\nimport { useAuth } from './useAuth'\n\ntype WcExpiryEvents = {\n on: (event: 'proposal_expire', listener: () => void) => unknown\n off: (event: 'proposal_expire', listener: () => void) => unknown\n}\n/** The slice of `@walletconnect/ethereum-provider` this hook touches: the\n * provider emits `connect` only when a session settles fresh (a pairing the\n * user just approved) — never for a session restored from storage — and the\n * sign-client's emitter fires `proposal_expire` when the pairing offer's TTL\n * runs out. */\ntype WcPairingProvider = {\n on: (event: 'connect', listener: () => void) => unknown\n off: (event: 'connect', listener: () => void) => unknown\n signer?: { client?: { events?: WcExpiryEvents } }\n}\n\nexport type WalletConnectPairing = {\n /** Pairing URI from the connector's `display_uri` event; null until it\n * arrives (or after a retry reset). */\n uri: string | null\n error: string | null\n retry: () => void\n /** Wrapped deep link for the one-tap mobile redirect into `wallet`'s app,\n * or null when the tap should just open the sheet (desktop, claiming\n * installed connector, no usable URI). An errored pairing — including\n * WalletConnect's own proposal expiry — never redirects. */\n deepLinkFor: (wallet: WalletGuideEntry) => string | null\n}\n\n/**\n * Runs one WalletConnect pairing for the lifetime of the mounting component —\n * mount kicks it, unmount abandons it.\n */\nexport function useWalletConnectPairing(): WalletConnectPairing {\n const { goToStep } = useAuth()\n const connectors = useConnectors()\n const wcConnector = connectors.find(isZeroDevWalletConnect)\n const { connect } = useConnect()\n // A restored WC session means the connector is already live — kicking\n // connect() on it would throw ConnectorAlreadyConnectedError.\n const connections = useConnections()\n const wcConnected = connections.some(\n (c) => c.connector.uid === wcConnector?.uid,\n )\n // While wagmi is still rehydrating persisted sessions, hold the pairing\n // kick — a connector mid-restore may be about to come back as connected.\n const { isReconnecting } = useAccount()\n\n const [uri, setUri] = useState<string | null>(null)\n const [error, setError] = useState<string | null>(null)\n const startedRef = useRef(false)\n\n const startConnect = (target: Connector) => {\n setError(null)\n setUri(null)\n connect({ connector: target }, { onError: (err) => setError(err.message) })\n }\n // biome-ignore lint/correctness/useExhaustiveDependencies: mount-only pairing setup — startConnect closes over kick-time callbacks (connect, goToStep), which must not retrigger the subscription\n useEffect(() => {\n if (!wcConnector || wcConnected) return\n const onMessage = ({ type, data }: { type: string; data?: unknown }) => {\n if (type === 'display_uri' && typeof data === 'string') setUri(data)\n }\n // Subscribe before the connect kick — `display_uri` fires mid-connect.\n wcConnector.emitter.on('message', onMessage)\n\n // Expiry comes from the sign-client's own event, not the connect\n // mutation — this subscription is re-established every effect run, so it\n // survives Strict Mode where the mutation's `onError` does not.\n const onExpire = () => setError('Proposal expired')\n // Success is the provider's `connect` event — emitted only when a session\n // settles fresh (the user approved a pairing), never when wagmi restores\n // a persisted session, so rehydration can't close a flow the user is\n // looking at. Whether an already-connected user should see sign-up at\n // all stays the host's `isConnected` decision.\n const onConnect = () => goToStep(null)\n\n let wcProvider: WcPairingProvider | undefined\n let disposed = false\n\n wcConnector\n .getProvider()\n .then((provider) => {\n if (disposed) return\n wcProvider = provider as WcPairingProvider\n wcProvider.signer?.client?.events?.on('proposal_expire', onExpire)\n wcProvider.on('connect', onConnect)\n })\n .catch((err) => {\n // Provider init failed — surface through the pairing's error state\n // instead of an unhandled rejection.\n if (!disposed)\n setError(err instanceof Error ? err.message : String(err))\n })\n if (!startedRef.current && !isReconnecting) {\n startedRef.current = true\n startConnect(wcConnector)\n }\n return () => {\n disposed = true\n wcProvider?.signer?.client?.events?.off('proposal_expire', onExpire)\n wcProvider?.off('connect', onConnect)\n wcConnector.emitter.off('message', onMessage)\n }\n }, [wcConnector, wcConnected, isReconnecting])\n\n return {\n uri,\n error,\n retry: () => {\n if (wcConnector) startConnect(wcConnector)\n },\n deepLinkFor: (wallet) =>\n walletDeepLink({\n wallet,\n connectors,\n uri: error ? null : uri,\n mobile: isMobile(),\n }),\n }\n}\n","import { createContext, useContext, useEffect } from 'react'\nimport type { EmailAuthMethod } from '../../types'\nimport type { WalletGuideEntry } from '../../walletGuide'\n\nexport type SignUpContextValue = {\n /** True while any method's auth attempt is in flight — used to disable\n * sibling methods so two flows can't run at once. */\n authPending: boolean\n setAuthPending: (pending: boolean) => void\n /** Which email verification flow the Email unit runs. Set on the root\n * (`<SignUp emailAuthMethod=…>`); already resolved to its default here. */\n emailAuthMethod: EmailAuthMethod\n /** True when the terms checkbox is required but unchecked. For passive\n * disabled styling; use `guardAgreement` before starting an attempt. */\n needsAgreement: boolean\n /** Call before starting an auth attempt: highlights the terms checkbox and\n * returns false when agreement is required but missing. */\n guardAgreement: () => boolean\n setError: (message: string | null) => void\n /** Guide ids of every mounted `SignUp.Wallet` pin. Discovery units skip\n * these so a pinned wallet isn't listed twice. */\n registeredWallets: readonly string[]\n /** Returns the unregister function. */\n registerWallet: (walletId: string) => () => void\n /** Opens the root's single WalletSheet — a wallet's connection paths, or\n * the generic WalletConnect pairing when called without one. */\n openWalletSheet: (wallet?: WalletGuideEntry) => void\n}\n\nexport const SignUpContext = createContext<SignUpContextValue | null>(null)\n\nexport function useSignUpContext(): SignUpContextValue {\n const ctx = useContext(SignUpContext)\n if (!ctx) {\n throw new Error('SignUp.* components must be rendered inside <SignUp>')\n }\n return ctx\n}\n\n/** Mirror a method's in-flight state into the shared pending flag.\n * Clears on unmount so a removed unit can't leave the page locked.\n * One flag, not per-unit: methods are mutually exclusive, so at most one\n * unit reports `true` at a time. */\nexport function useReportPending(pending: boolean) {\n const { setAuthPending } = useSignUpContext()\n useEffect(() => {\n setAuthPending(pending)\n return () => setAuthPending(false)\n }, [pending, setAuthPending])\n}\n","export function capitalizeFirst(str?: string | null): string {\n if (!str) return ''\n const first = str.at(0) ?? ''\n return first.toUpperCase() + str.slice(1)\n}\n\nexport function shortenHex(hex: string, length = 4) {\n return `${hex.slice(0, length + 2)}...${hex.slice(-length)}`\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\nexport function isValidEmailAddress(email: string): boolean {\n return EMAIL_REGEX.test(email.trim())\n}\n","import { Icon, Input } from '@zerodev/react-ui'\nimport { useSendMagicLink, useSendOTP } from '@zerodev/wallet-react'\nimport { useState } from 'react'\nimport { isValidEmailAddress } from '../../../shared/utils/common'\nimport { useAuth } from '../../hooks/useAuth'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Email input row: sends an OTP or magic link depending on the root's\n * `emailAuthMethod`, then advances to the matching verification step. */\nexport function SignUpEmail() {\n const { goToStep, setEmail, setOtpSession } = useAuth()\n const {\n authPending,\n emailAuthMethod,\n needsAgreement,\n guardAgreement,\n setError,\n } = useSignUpContext()\n const [emailInput, setEmailInput] = useState('')\n\n const shouldUseOtp = emailAuthMethod === 'otp'\n const { mutateAsync: sendOtp, isPending: isSendOtpPending } = useSendOTP()\n const { mutateAsync: sendMagicLink, isPending: isSendMagicLinkPending } =\n useSendMagicLink()\n const isEmailLoading = isSendOtpPending || isSendMagicLinkPending\n useReportPending(isEmailLoading)\n\n const handleSubmit = async () => {\n if (!emailInput || authPending) return\n if (!isValidEmailAddress(emailInput)) return\n if (!guardAgreement()) return\n\n setError(null)\n try {\n const send = shouldUseOtp ? sendOtp : sendMagicLink\n const { otpId, otpEncryptionTargetBundle } = await send({\n email: emailInput,\n })\n setEmail(emailInput)\n setOtpSession({ otpId, otpEncryptionTargetBundle })\n goToStep(shouldUseOtp ? 'otp-input' : 'email-verification')\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to send verification code',\n )\n }\n }\n\n return (\n <Input\n iconName=\"email\"\n placeholder=\"Enter your email\"\n value={emailInput}\n onChange={(e) => setEmailInput(e.target.value)}\n type=\"email\"\n autoCapitalize=\"none\"\n autoComplete=\"email\"\n disabled={authPending}\n variant=\"listItemStyle\"\n onKeyDown={(e) => {\n if (e.key === 'Enter' && emailInput && !authPending) {\n handleSubmit()\n }\n }}\n >\n {isEmailLoading ? (\n <div className=\"zd:w-13 zd:h-13 zd:flex zd:items-center zd:justify-center\">\n <div className=\"zd:w-5 zd:h-5 zd:border-2 zd:border-solarOrange zd:border-t-transparent zd:rounded-full zd:animate-spin\" />\n </div>\n ) : (\n <button\n type=\"button\"\n disabled={!isValidEmailAddress(emailInput) || needsAgreement}\n className={`zd:w-13 zd:h-13 zd:rounded-2xl zd:flex zd:items-center zd:justify-center zd:transition-colors ${\n isValidEmailAddress(emailInput) && !needsAgreement\n ? 'zd:cursor-pointer'\n : 'zd:cursor-not-allowed zd:opacity-50'\n }`}\n onClick={() => handleSubmit()}\n >\n <Icon name=\"chevronRight\" className=\"zd:text-greyScale\" />\n </button>\n )}\n </Input>\n )\n}\n","import { ListItem, ListItemChevron, ListItemIcon } from '@zerodev/react-ui'\nimport { useAuthenticateOAuth } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Google\" OAuth row. */\nexport function SignUpGoogle() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const { mutateAsync: authenticateOAuth, isPending } = useAuthenticateOAuth({\n mutation: {\n onSuccess: () => {\n goToStep('authenticated')\n },\n },\n })\n useReportPending(isPending)\n\n const handleClick = async () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n try {\n await authenticateOAuth({ provider: 'google' })\n } catch (err) {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n }\n }\n\n return (\n <ListItem\n icon={<ListItemIcon name=\"google\" />}\n title=\"Google\"\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","import { Badge, ListItem, ListItemChevron } from '@zerodev/react-ui'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { matchesWallet, WALLET_GUIDE } from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Auto-discovered rows for installed wallets: one row per announced (6963)\n * browser extension. Renders nothing when no wallet is installed. */\nexport function SignUpInstalledWallets({\n excludeWalletIds = [],\n maxWallets = 4,\n}: {\n /** Wallets to hide, by guide id (e.g. `'metamask'`) or EIP-6963 rdns.\n * Pinned `SignUp.Wallet` rows are excluded automatically. */\n excludeWalletIds?: string[]\n /** Cap on the number of rendered rows (default 4). Guide wallets rank\n * first, in guide order, so the cut drops unknown extensions before\n * curated ones. */\n maxWallets?: number\n}) {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError, registeredWallets } =\n useSignUpContext()\n const connectors = useConnectors()\n const { connect, isPending } = useConnect()\n useReportPending(isPending)\n\n // Same rule that earns the INSTALLED badge elsewhere: only a 6963\n // announcement proves a live extension. Announcements surface as\n // injected-type connectors with `id === rdns`; the generic `injected()`\n // connector (id \"injected\") and our own embedded-wallet connector (which\n // also claims type \"injected\") exist regardless of installation.\n const rows = connectors\n .filter(\n (c) =>\n c.type === 'injected' &&\n c.id !== 'injected' &&\n c.id !== 'zerodev-wallet',\n )\n .map((connector) => {\n const wallet = WALLET_GUIDE.find((w) => matchesWallet(connector, w))\n return {\n connector,\n walletId: wallet?.id,\n name: wallet?.name ?? connector.name,\n icon: wallet?.icon ?? connector.icon,\n ids: wallet ? [wallet.id, connector.id] : [connector.id],\n rank: wallet ? WALLET_GUIDE.indexOf(wallet) : WALLET_GUIDE.length,\n }\n })\n .filter(\n (row) => !(row.walletId && registeredWallets.includes(row.walletId)),\n )\n .filter((row) => !row.ids.some((id) => excludeWalletIds.includes(id)))\n .sort((a, b) => a.rank - b.rank)\n .slice(0, maxWallets)\n\n const startConnect = (connector: (typeof connectors)[number]) => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n connect(\n { connector },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it (mirrors SignUp.Wallet).\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n return (\n <>\n {rows.map(({ connector, name, icon }) => (\n <ListItem\n key={connector.uid}\n title={name}\n icon={\n icon ? <img src={icon} alt=\"\" className=\"zd:w-6 zd:h-6\" /> : null\n }\n subtitle={<Badge text=\"INSTALLED\" />}\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={() => startConnect(connector)}\n />\n ))}\n </>\n )\n}\n","import {\n BottomSheet,\n BottomSheetClose,\n BottomSheetContent,\n BottomSheetTitle,\n Icon,\n Text,\n} from '@zerodev/react-ui'\n\nexport type WalletTileData = {\n key: string\n name: string\n icon?: string | undefined\n onSelect: () => void\n}\n\nfunction WalletTile({ tile }: { tile: WalletTileData }) {\n return (\n <button\n type=\"button\"\n onClick={tile.onSelect}\n className=\"zd:flex zd:flex-col zd:items-center zd:gap-1.5 zd:cursor-pointer\"\n >\n <div className=\"zd:w-16 zd:h-16 zd:rounded-2xl zd:bg-greyScale/5 zd:flex zd:items-center zd:justify-center\">\n {tile.icon ? (\n <img src={tile.icon} alt=\"\" className=\"zd:w-8 zd:h-8\" />\n ) : (\n <Icon\n name=\"walletOutline\"\n className=\"zd:w-8 zd:h-8 zd:text-greyScale\"\n />\n )}\n </div>\n <Text className=\"zd:text-body3 zd:max-w-full zd:truncate\">\n {tile.name}\n </Text>\n </button>\n )\n}\n\n/** \"More wallets\" sheet: every guide wallet (plus live connectors\n * we have no guide entry for) as a scrollable 3-column tile grid, laid over\n * the sign-up page. Selection behavior is the caller's business. */\nexport function WalletGridSheet({\n open,\n onOpenChange,\n tiles,\n}: {\n open: boolean\n onOpenChange: (open: boolean) => void\n tiles: WalletTileData[]\n}) {\n return (\n <BottomSheet open={open} onOpenChange={onOpenChange}>\n <BottomSheetContent className=\"zd:p-4\">\n <BottomSheetTitle>All wallets</BottomSheetTitle>\n <div className=\"zd:mb-3 zd:flex zd:items-center zd:gap-2\">\n <Text className=\"zd:text-h3 zd:flex-1\">All wallets</Text>\n <BottomSheetClose asChild>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className=\"zd:cursor-pointer zd:px-2 zd:text-greyScale/60\"\n >\n ✕\n </button>\n </BottomSheetClose>\n </div>\n <div className=\"zd:grid zd:grid-cols-3 zd:gap-3 zd:max-h-80 zd:overflow-y-auto\">\n {tiles.map((tile) => (\n <WalletTile key={tile.key} tile={tile} />\n ))}\n </div>\n </BottomSheetContent>\n </BottomSheet>\n )\n}\n","import { ListItem, ListItemChevron, ListItemIcon } from '@zerodev/react-ui'\nimport { useState } from 'react'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { walletConnectLogo } from '../../brandAssets'\nimport {\n WalletGridSheet,\n type WalletTileData,\n} from '../../components/WalletGridSheet'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { isZeroDevWalletConnect } from '../../utils/isZeroDevWalletConnect'\nimport { announcesWallet, matchesWallet, WALLET_GUIDE } from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"More wallets\" row — opens the wallet grid sheet. */\nexport function SignUpMoreWallets({\n title = 'More wallets',\n}: {\n title?: string\n}) {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError, openWalletSheet } =\n useSignUpContext()\n const [open, setOpen] = useState(false)\n const connectors = useConnectors()\n const { connect, isPending } = useConnect()\n useReportPending(isPending)\n\n // Our own connector is the embedded wallet, and walletConnect-type\n // connectors are the mobile transport rather than a wallet — neither\n // belongs in the grid.\n const walletConnectors = connectors.filter(\n (c) => c.id !== 'zerodev-wallet' && c.type !== 'walletConnect',\n )\n\n const startConnect = (connector: (typeof connectors)[number]) => {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(false)\n setError(null)\n connect(\n { connector },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it.\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n const wcEnabled = connectors.some(isZeroDevWalletConnect)\n\n const guideTiles: WalletTileData[] = WALLET_GUIDE.map((wallet) => {\n const announced = walletConnectors.find((c) => announcesWallet(c, wallet))\n return {\n key: wallet.id,\n name: wallet.name,\n icon: wallet.icon,\n onSelect: () => {\n // Announced = the wallet is live on this page (extension or its own\n // in-app browser) — connect directly instead of a WC handoff.\n if (announced) {\n startConnect(announced)\n return\n }\n if (wcEnabled) {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(false)\n openWalletSheet(wallet)\n return\n }\n // No WC handoff available — a configured connector that claims the\n // wallet (e.g. a vendor SDK) is the last way to connect.\n const claimed = walletConnectors.find((c) => matchesWallet(c, wallet))\n if (claimed) {\n startConnect(claimed)\n return\n }\n setOpen(false)\n window.open(wallet.downloadUrl, '_blank', 'noopener,noreferrer')\n },\n }\n })\n\n // Live connectors we have no guide entry for still get a tile — nothing\n // installed is ever hidden.\n const connectorTiles: WalletTileData[] = walletConnectors\n .filter((c) => !WALLET_GUIDE.some((wallet) => matchesWallet(c, wallet)))\n .map((connector) => ({\n key: connector.uid,\n name: connector.name,\n icon: connector.icon,\n onSelect: () => startConnect(connector),\n }))\n\n const walletConnectTiles: WalletTileData[] = wcEnabled\n ? [\n {\n key: 'walletconnect',\n name: 'WalletConnect',\n icon: walletConnectLogo,\n onSelect: () => {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(false)\n openWalletSheet()\n },\n },\n ]\n : []\n\n const handleClick = () => {\n if (authPending) return\n if (!guardAgreement()) return\n setOpen(true)\n }\n\n return (\n <>\n <ListItem\n icon={<ListItemIcon name=\"walletOutline\" className=\"zd:w-5 zd:h-5\" />}\n title={title}\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n <WalletGridSheet\n open={open}\n onOpenChange={setOpen}\n tiles={[...walletConnectTiles, ...guideTiles, ...connectorTiles]}\n />\n </>\n )\n}\n","import { Button } from '@zerodev/react-ui'\nimport { useLoginPasskey, useRegisterPasskey } from '@zerodev/wallet-react'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** \"Create a passkey\" + \"Log in with passkey\" buttons. */\nexport function SignUpPasskey() {\n const { goToStep } = useAuth()\n const { authPending, guardAgreement, setError } = useSignUpContext()\n\n const mutation = {\n onSuccess: () => {\n goToStep('authenticated')\n },\n onError: (err: unknown) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n }\n const { mutate: registerPasskey, isPending: isRegisterPending } =\n useRegisterPasskey({ mutation })\n const { mutate: loginPasskey, isPending: isLoginPending } = useLoginPasskey({\n mutation,\n })\n useReportPending(isRegisterPending || isLoginPending)\n\n const guarded = (run: () => void) => () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n run()\n }\n\n return (\n <>\n <Button\n action=\"secondary\"\n text=\"Create a passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => registerPasskey())}\n />\n <Button\n action=\"secondary\"\n text=\"Log in with passkey\"\n iconName=\"key\"\n trailIcon\n disabled={authPending}\n onClick={guarded(() => loginPasskey())}\n />\n </>\n )\n}\n","import { Badge, ListItem, ListItemChevron } from '@zerodev/react-ui'\nimport { useLayoutEffect } from 'react'\nimport { useConnect, useConnectors } from 'wagmi'\nimport { useAuth } from '../../hooks/useAuth'\nimport { isCancellationError } from '../../utils/isCancellationError'\nimport { isZeroDevWalletConnect } from '../../utils/isZeroDevWalletConnect'\nimport {\n announcesWallet,\n matchesWallet,\n WALLET_GUIDE,\n type WalletId,\n} from '../../walletGuide'\nimport { useReportPending, useSignUpContext } from './context'\n\n/** Dedicated row for a single guide wallet: connects it directly when a live\n * connector claims it, and is a download link for the vendor page otherwise. */\nexport function SignUpWallet({ walletId }: { walletId: WalletId }) {\n const wallet = WALLET_GUIDE.find((w) => w.id === walletId)\n if (!wallet) {\n // Unreachable for TS consumers; catches raw-JS typos.\n throw new Error(\n `Unknown walletId \"${walletId}\". Valid ids: ${WALLET_GUIDE.map((w) => w.id).join(', ')}`,\n )\n }\n\n const { goToStep } = useAuth()\n const {\n authPending,\n guardAgreement,\n setError,\n registerWallet,\n openWalletSheet,\n } = useSignUpContext()\n const connectors = useConnectors()\n const { connect, isPending } = useConnect()\n useReportPending(isPending)\n useLayoutEffect(() => registerWallet(wallet.id), [registerWallet, wallet.id])\n\n // Only a 6963 announcement proves a live extension (or the wallet's own\n // in-app browser) — it earns the badge and a direct connect.\n const announced = connectors.find((c) => announcesWallet(c, wallet))\n\n const shared = {\n title: wallet.name,\n icon: <img src={wallet.icon} alt=\"\" className=\"zd:w-6 zd:h-6\" />,\n trailing: <ListItemChevron />,\n }\n\n // An announcement means the wallet is right here (extension, or its own\n // in-app browser) — connect it directly; WC pairing would bounce out of\n // the very wallet the user is standing in.\n if (!announced && connectors.some(isZeroDevWalletConnect)) {\n return (\n <ListItem\n {...shared}\n disabled={authPending}\n onClick={() => {\n if (authPending) return\n if (!guardAgreement()) return\n openWalletSheet(wallet)\n }}\n />\n )\n }\n\n // Same claim rule as the MoreWallets grid: announced, or — without a WC\n // handoff — a configured connector (e.g. a vendor SDK) that claims the\n // wallet.\n const claimed = announced ?? connectors.find((c) => matchesWallet(c, wallet))\n\n if (!claimed) {\n return (\n <ListItem {...shared} asChild>\n {/* biome-ignore lint/a11y/useAnchorContent: the row layout (incl. the title text) is injected into the anchor via Slot */}\n <a\n href={wallet.downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n />\n </ListItem>\n )\n }\n\n const handleClick = () => {\n if (authPending) return\n if (!guardAgreement()) return\n setError(null)\n connect(\n { connector: claimed },\n {\n // The external wallet is now the active wagmi connection — the\n // embedded-wallet flow is done, so close it (mirrors SignUp.MoreWallets).\n onSuccess: () => goToStep(null),\n onError: (err) => {\n if (!isCancellationError(err)) {\n setError(err instanceof Error ? err.message : String(err))\n }\n },\n },\n )\n }\n\n return (\n <ListItem\n {...shared}\n {...(!!announced && { subtitle: <Badge text=\"INSTALLED\" /> })}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","import { Badge, ListItem, ListItemChevron } from '@zerodev/react-ui'\nimport { useConnectors } from 'wagmi'\nimport { walletConnectLogo } from '../../brandAssets'\nimport { isZeroDevWalletConnect } from '../../utils/isZeroDevWalletConnect'\nimport { useSignUpContext } from './context'\n\n/** Generic WalletConnect row — opens the pairing sheet with a raw-URI QR any\n * wallet's scanner can claim. Renders nothing unless a `zeroDevWalletConnect`\n * connector is in the wagmi config. */\nexport function SignUpWalletConnect() {\n const { authPending, guardAgreement, openWalletSheet } = useSignUpContext()\n const connectors = useConnectors()\n\n if (!connectors.some(isZeroDevWalletConnect)) return null\n\n const handleClick = () => {\n if (authPending) return\n if (!guardAgreement()) return\n openWalletSheet()\n }\n\n return (\n <ListItem\n title=\"WalletConnect\"\n icon={<img src={walletConnectLogo} alt=\"\" className=\"zd:w-6 zd:h-6\" />}\n subtitle={<Badge text=\"QR CODE\" />}\n trailing={<ListItemChevron />}\n disabled={authPending}\n onClick={handleClick}\n />\n )\n}\n","import { Button, Text } from '@zerodev/react-ui'\nimport { type ReactNode, useCallback, useState } from 'react'\nimport { SignUpFooter } from '../../../shared/components/SignUpFooter'\nimport { BlobAnimation } from '../../components/BlobAnimation'\nimport { WalletSheet } from '../../components/WalletSheet'\nimport { useWalletConnectPairing } from '../../hooks/useWalletConnectPairing'\nimport type { EmailAuthMethod } from '../../types'\nimport type { WalletGuideEntry } from '../../walletGuide'\nimport { SignUpContext } from './context'\nimport { SignUpEmail } from './Email'\nimport { SignUpGoogle } from './Google'\nimport { SignUpInstalledWallets } from './InstalledWallets'\nimport { SignUpMoreWallets } from './MoreWallets'\nimport { SignUpPasskey } from './Passkey'\nimport { SignUpWallet } from './Wallet'\nimport { SignUpWalletConnect } from './WalletConnect'\n\ntype SignUpRootProps = {\n children: ReactNode\n /** Enable the consent gate: linked from the footer checkbox, and every\n * method is blocked until the user agrees when either URL is set. */\n termsAndConditionsUrl?: string | undefined\n privacyPolicyUrl?: string | undefined\n /** Which email verification flow the Email unit runs. */\n emailAuthMethod?: EmailAuthMethod | undefined\n}\n\nfunction SignUpRoot({\n children,\n termsAndConditionsUrl,\n privacyPolicyUrl,\n emailAuthMethod = 'magicLink',\n}: SignUpRootProps) {\n const [agreedToTerms, setAgreedToTerms] = useState(false)\n const [highlightAgreement, setHighlightAgreement] = useState(false)\n const [error, setError] = useState<string | null>(null)\n // One flag for the whole page: methods are mutually exclusive, so at most\n // one unit is in flight at a time. Known accepted edge: a unit unmounting\n // mid-flight (conditional composition) clears a sibling's lock.\n const [authPending, setAuthPending] = useState(false)\n // Which wallets have a pinned `SignUp.Wallet` row mounted. A plain list of\n // registrants: register appends, cleanup removes one occurrence.\n const [registeredWallets, setRegisteredWallets] = useState<readonly string[]>(\n [],\n )\n\n const registerWallet = useCallback((walletId: string) => {\n setRegisteredWallets((prev) => [...prev, walletId])\n return () => {\n setRegisteredWallets((prev) => {\n const next = [...prev]\n next.splice(next.indexOf(walletId), 1)\n return next\n })\n }\n }, [])\n\n // The page's single WalletSheet — every wallet surface opens it via\n // `openWalletSheet` instead of mounting a sheet of its own. The box\n // distinguishes open-without-a-wallet (generic pairing) from closed.\n const [walletSheet, setWalletSheet] = useState<{\n wallet?: WalletGuideEntry | undefined\n } | null>(null)\n // Pairing preloads at page mount so the sheet's QR is ready on open and the\n // mobile deep link below fires synchronously inside the tap — iOS only\n // hands a universal link to the app for gesture-qualified navigations.\n const pairing = useWalletConnectPairing()\n\n const requiresAgreement = !!(termsAndConditionsUrl || privacyPolicyUrl)\n const needsAgreement = requiresAgreement && !agreedToTerms\n\n const guardAgreement = () => {\n if (!needsAgreement) return true\n setHighlightAgreement(true)\n return false\n }\n\n return (\n <SignUpContext.Provider\n value={{\n authPending,\n emailAuthMethod,\n setAuthPending,\n needsAgreement,\n guardAgreement,\n setError,\n registeredWallets,\n registerWallet,\n openWalletSheet: (wallet) => {\n const deepLink = wallet && pairing.deepLinkFor(wallet)\n if (deepLink) window.location.href = deepLink\n // Sheet opens either way — it's the fallback surface when the\n // redirect doesn't take (and the only surface on desktop).\n setWalletSheet({ wallet })\n },\n }}\n >\n {error !== null && (\n <div className=\"zd:flex zd:items-center zd:justify-center zd:h-full zd:min-h-100\">\n <div className=\"zd:flex zd:flex-col zd:gap-4 zd:max-w-md\">\n <Text className=\"zd:text-h2 zd:text-center\">Error occurred</Text>\n <Text className=\"zd:text-center zd:text-red-500\">{error}</Text>\n <Button\n action=\"primary\"\n text=\"Try again\"\n onClick={() => setError(null)}\n />\n </div>\n </div>\n )}\n {/* Kept mounted (hidden) during the error takeover so unit state — the\n typed email, pending flags — survives \"Try again\".\n `-mx-4` cancels Screen's scroll-container padding so this page\n owns its own; inner blocks re-add `zd:px-4` where they need it. */}\n <div\n className={`zd:-mx-4 zd:flex-1 zd:flex zd:flex-col zd:justify-between zd:pb-4 zd:overflow-y-auto zd:overflow-x-hidden${\n error !== null ? ' zd:hidden' : ''\n }`}\n >\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:justify-center\">\n <div className=\"zd:px-4 zd:flex zd:flex-col zd:items-center\">\n <div className=\"zd:w-full zd:px-16 zd:py-4\">\n <BlobAnimation className=\"zd:w-full zd:pointer-events-none zd:select-none\" />\n </div>\n <Text className=\"zd:text-h2 zd:text-center\">\n Continue to your wallet\n </Text>\n <Text className=\"zd:mt-2 zd:text-center zd:text-greyScale/50\">\n Choose a sign-in method to proceed\n </Text>\n </div>\n <div className=\"zd:mt-6 zd:mb-4 zd:px-4 zd:flex zd:flex-col zd:gap-2\">\n {children}\n </div>\n </div>\n <div className=\"zd:px-4\">\n <SignUpFooter\n termsAndConditionsUrl={termsAndConditionsUrl}\n privacyPolicyUrl={privacyPolicyUrl}\n agreedToTerms={agreedToTerms}\n setAgreedToTerms={(agreed) => {\n setAgreedToTerms(agreed)\n if (agreed) setHighlightAgreement(false)\n }}\n highlight={highlightAgreement}\n />\n </div>\n </div>\n <WalletSheet\n pairing={pairing}\n open={walletSheet !== null}\n onOpenChange={(open) => {\n if (!open) setWalletSheet(null)\n }}\n wallet={walletSheet?.wallet}\n />\n </SignUpContext.Provider>\n )\n}\n\nfunction SignUpDivider({ label = 'or' }: { label?: string }) {\n return (\n <div className=\"zd:-mx-4 zd:my-2 zd:flex zd:items-center zd:gap-3\">\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n <Text className=\"zd:text-body3\">{label}</Text>\n <div className=\"zd:h-px zd:flex-1 zd:bg-greyScale/30\" />\n </div>\n )\n}\n\n/** The canonical sign-up page. Takes the root's own props (the consent-gate\n * URLs) and forwards them — per-unit config (e.g. the email method) still\n * means composing the units yourself. */\nfunction SignUpDefault(props: Omit<SignUpRootProps, 'children'>) {\n return (\n <SignUpRoot {...props}>\n <SignUpPasskey />\n <SignUpDivider />\n <SignUpGoogle />\n <SignUpEmail />\n </SignUpRoot>\n )\n}\n\nexport const SignUp = Object.assign(SignUpRoot, {\n Default: SignUpDefault,\n Passkey: SignUpPasskey,\n Google: SignUpGoogle,\n Email: SignUpEmail,\n Wallet: SignUpWallet,\n WalletConnect: SignUpWalletConnect,\n InstalledWallets: SignUpInstalledWallets,\n MoreWallets: SignUpMoreWallets,\n Divider: SignUpDivider,\n})\n","import { Button, PoweredBy } from '@zerodev/react-ui'\nimport { useVerifyMagicLink } from '@zerodev/wallet-react'\nimport { useEffect, useRef, useState } from 'react'\nimport { StatusScreen } from '../../shared/components/StatusScreen'\nimport { useAuth } from '../hooks/useAuth'\nimport { stripMagicLinkCodeFromUrl } from '../utils/url'\n\nfunction getCodeFromUrl(): string | null {\n if (typeof window === 'undefined') return null\n return new URLSearchParams(window.location.search).get('code')\n}\n\nexport function Verifying() {\n const { otpId, otpEncryptionTargetBundle, goToStep, clearOtpSession } =\n useAuth()\n const [code] = useState<string | null>(getCodeFromUrl)\n const [error, setError] = useState<Error | null>(null)\n\n // ref to prevent useEffect firing twice in dev's StrictMode\n const hasVerifiedRef = useRef(false)\n const { mutate: verifyMagicLink, isPending: isVerificationLoading } =\n useVerifyMagicLink({\n mutation: {\n onSuccess: () => {\n clearOtpSession()\n goToStep('authenticated')\n },\n onError: (err) => {\n setError(err)\n },\n },\n })\n\n useEffect(() => {\n if (hasVerifiedRef.current || !code) return\n hasVerifiedRef.current = true\n\n // No active OTP session — most commonly the user tapped the same\n // magic link again after a successful verify, which cleared the\n // session. Skip the (doomed) mutation, clean the URL, and drop\n // back to step=null so the host app's own routing handles the\n // already-authenticated user without flashing an error.\n if (!otpId || !otpEncryptionTargetBundle) {\n stripMagicLinkCodeFromUrl()\n goToStep(null)\n return\n }\n\n verifyMagicLink({ otpId, code, otpEncryptionTargetBundle })\n }, [otpId, otpEncryptionTargetBundle, code, verifyMagicLink, goToStep])\n\n return (\n <>\n <div className=\"zd:flex-1 zd:flex zd:flex-col zd:gap-8 zd:items-center zd:justify-center\">\n {!error && isVerificationLoading && (\n <StatusScreen imageName=\"loading\" title=\"Verifying Your Email\">\n Please wait while we securely connect your wallet.\n </StatusScreen>\n )}\n\n {!error && !code && !isVerificationLoading && (\n <>\n <StatusScreen imageName=\"error\" title=\"Invalid Link\">\n This verification link is invalid or incomplete.\n <br />\n Please check your email and try again with the correct link.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n\n {error != null && (\n <>\n <StatusScreen imageName=\"error\" title=\"Oops, something went wrong\">\n We couldn't complete the sign-in process. This could be due to\n timeout, an expired link, or a cancelled request.\n </StatusScreen>\n <Button\n action=\"primary\"\n onClick={() => {\n stripMagicLinkCodeFromUrl()\n goToStep('sign-up')\n }}\n text=\"Choose another sign-in method\"\n />\n </>\n )}\n </div>\n\n <PoweredBy className=\"zd:self-center zd:pt-4 zd:pb-6\" />\n </>\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { type ReactNode, useEffect } from 'react'\nimport { StatusScreen } from '../shared/components/StatusScreen'\nimport { useAuth } from './hooks/useAuth'\nimport { EmailVerification } from './pages/EmailVerification'\nimport { ErrorScreen } from './pages/ErrorScreen'\nimport { OtpInput } from './pages/OtpInput'\nimport { SignUp } from './pages/SignUp'\nimport { Verifying } from './pages/Verifying'\nimport type { AuthStep } from './types'\nimport { hasMagicLinkCodeInUrl, stripMagicLinkCodeFromUrl } from './utils/url'\n\nfunction OAuthCallback() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Authenticating...\">\n Please wait while we complete the OAuth authentication.\n </StatusScreen>\n </div>\n )\n}\n\nfunction PasskeyPrompt() {\n return (\n <div className=\"zd:flex zd:flex-1 zd:items-center zd:justify-center\">\n <StatusScreen imageName=\"loading\" title=\"Passkey authentication\">\n Please authenticate with your passkey.\n </StatusScreen>\n </div>\n )\n}\n\nfunction renderStep(\n step: AuthStep | null,\n renderSignUp?: (() => ReactNode) | undefined,\n): ReactNode {\n switch (step) {\n case 'sign-up':\n return renderSignUp ? renderSignUp() : <SignUp.Default />\n case 'email-verification':\n return <EmailVerification />\n case 'otp-input':\n return <OtpInput />\n case 'verifying-otp':\n return <Verifying />\n case 'oauth-in-progress':\n return <OAuthCallback />\n case 'passkey-prompt':\n return <PasskeyPrompt />\n case 'error':\n return <ErrorScreen />\n default:\n return null\n }\n}\n\nexport function ConnectWallet({\n onClose: userOnClose,\n size,\n renderSignUp,\n logo,\n}: {\n onClose?: (() => void) | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n /** Replace the default sign-up page: compose `SignUp.*` units inside\n * `<SignUp>`. Omit to render the canonical page (`SignUp.Default`). */\n renderSignUp?: (() => ReactNode) | undefined\n /** Optional brand logo for the top nav on the sign-up page. When omitted,\n * no logo is shown. `PoweredBy` always shows the ZeroDev mark\n * independently. */\n logo?: ReactNode | undefined\n} = {}) {\n const { step, goToStep, goBack, reset } = useAuth()\n\n useEffect(() => {\n if (step === null && hasMagicLinkCodeInUrl()) {\n goToStep('verifying-otp')\n }\n }, [step, goToStep])\n\n const content = renderStep(step, renderSignUp)\n if (!content) return null\n\n const handleClose = () => {\n stripMagicLinkCodeFromUrl()\n reset()\n userOnClose?.()\n }\n return (\n <Screen\n {...(size && { size })}\n // Sign-up shrinks to its content (few methods → shorter card) but never\n // grows past the standard height; other steps keep the fixed size.\n className={step === 'sign-up' ? 'zd:h-auto zd:max-h-202.5' : undefined}\n topNav={\n <TopNav\n {...(goBack !== null && { onLeftButtonClick: goBack })}\n onRightButtonClick={handleClose}\n {...(step === 'sign-up' && {\n ...(logo && { logo }),\n className: 'zd:px-4',\n })}\n />\n }\n >\n {content}\n </Screen>\n )\n}\n","import { useEffect, useMemo, useState } from 'react'\nimport { useAccount } from 'wagmi'\nimport {\n matchesWallet,\n WALLET_GUIDE,\n type WalletGuideEntry,\n type WalletId,\n} from '../walletGuide'\n\n/** How the active connection reaches the wallet. */\nexport type WalletSource = 'injected' | 'walletconnect' | 'embedded' | 'other'\n\nexport type WalletInfo = {\n /** Human-readable wallet name ('MetaMask', 'Trust Wallet', …). */\n name?: string | undefined\n /** Wallet icon URL or data: URI, when one is known. */\n icon?: string | undefined\n /** Guide id when the wallet matches the kit's wallet guide. */\n walletId?: WalletId | undefined\n source: WalletSource\n}\n\n/** The slice of `@walletconnect/ethereum-provider` this hook reads. */\ntype WcPeerProvider = {\n session?: {\n peer?: {\n metadata?: { name?: string; icons?: readonly string[] }\n }\n }\n}\n\n/**\n * Guide entry for a WalletConnect peer, matched by name. Peers report their\n * own branding ('MetaMask Wallet', 'Trust Wallet', …), so match by\n * case-insensitive containment in either direction against the guide names.\n */\nfunction guideEntryForPeerName(name: string): WalletGuideEntry | undefined {\n const peer = name.toLowerCase()\n return WALLET_GUIDE.find((wallet) => {\n const guide = wallet.name.toLowerCase()\n return peer.includes(guide) || guide.includes(peer)\n })\n}\n\nfunction guideEntryForConnector(connector: {\n id: string\n name?: string\n type?: string\n rdns?: string | readonly string[] | undefined\n}): WalletGuideEntry | undefined {\n return WALLET_GUIDE.find((wallet) => matchesWallet(connector, wallet))\n}\n\nfunction useResolvedWalletInfo(): WalletInfo | undefined {\n const { connector, isConnected } = useAccount()\n const [peerMetadata, setPeerMetadata] = useState<\n { name?: string; icons?: readonly string[] } | undefined\n >(undefined)\n\n const isWalletConnect = !!connector && connector.type === 'walletConnect'\n\n useEffect(() => {\n if (!connector || !isWalletConnect) {\n setPeerMetadata(undefined)\n return\n }\n let cancelled = false\n connector\n .getProvider()\n .then((provider) => {\n if (cancelled) return\n const metadata = (provider as WcPeerProvider).session?.peer?.metadata\n setPeerMetadata(metadata)\n })\n .catch(() => {\n // Provider unavailable (torn down mid-flight) — stay unresolved.\n })\n return () => {\n cancelled = true\n }\n }, [connector, isWalletConnect])\n\n // Memoized so the identity is reference-stable across renders: consumers\n // put `walletInfo` in effect deps (analytics on wallet change), and a fresh\n // object every render would fire those on every render instead.\n return useMemo((): WalletInfo | undefined => {\n if (!isConnected || !connector) return undefined\n\n if (connector.id === 'zerodev-wallet') {\n return {\n name: connector.name,\n icon: connector.icon,\n source: 'embedded',\n }\n }\n\n if (isWalletConnect) {\n const entry = peerMetadata?.name\n ? guideEntryForPeerName(peerMetadata.name)\n : undefined\n return {\n name: peerMetadata?.name ?? undefined,\n icon: peerMetadata?.icons?.[0] ?? entry?.icon,\n walletId: entry?.id as WalletId | undefined,\n // Identity is about the session, so a raw walletConnect() connector\n // resolves here too — unlike pairing, which is kit-connector-only.\n source: 'walletconnect',\n }\n }\n\n const entry = guideEntryForConnector(connector)\n\n return {\n name: connector.name,\n icon: connector.icon ?? entry?.icon,\n walletId: entry?.id as WalletId | undefined,\n source: connector.type === 'injected' ? 'injected' : 'other',\n }\n }, [connector, isConnected, isWalletConnect, peerMetadata])\n}\n\n/**\n * Identity of the wallet behind the active wagmi connection, for\n * wallet-specific handling and analytics attribution. Call-compatible with\n * AppKit's `useWalletInfo` — same name, same `{ walletInfo }` return shape,\n * so migrating is an import swap; `walletId` and `source` are kit extras.\n *\n * wagmi's `useAccount().connector` already names injected wallets, but a\n * WalletConnect connection only reports \"WalletConnect\" — the actual wallet\n * on the other end (Trust, Rainbow, … on a phone) is in the session's peer\n * metadata, which this hook reads from the provider. `walletInfo` is\n * `undefined` while disconnected, and the WalletConnect case resolves\n * asynchronously (briefly `name: undefined` after connect/reload).\n *\n * @param _namespace - Accepted for AppKit call-compatibility ('eip155');\n * ignored — the kit is EVM-only.\n */\nexport function useWalletInfo(_namespace?: string): {\n walletInfo: WalletInfo | undefined\n} {\n const walletInfo = useResolvedWalletInfo()\n // The wrapper is memoized too, so the returned object is stable for\n // consumers that depend on it whole rather than destructuring.\n return useMemo(() => ({ walletInfo }), [walletInfo])\n}\n","import type { StateCreator } from 'zustand'\nimport type { AuthStep } from './types'\n\nconst OTP_SESSION_STORAGE_KEY = 'zerodev:auth:otpSession'\n\ntype StoredOtpSession = {\n otpId: string\n otpEncryptionTargetBundle: string\n}\n\nfunction readStoredOtpSession(): StoredOtpSession | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(OTP_SESSION_STORAGE_KEY)\n if (!raw) return null\n const parsed = JSON.parse(raw) as StoredOtpSession\n if (!parsed?.otpId || !parsed?.otpEncryptionTargetBundle) return null\n return parsed\n } catch {\n return null\n }\n}\n\nfunction writeStoredOtpSession(session: StoredOtpSession): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(\n OTP_SESSION_STORAGE_KEY,\n JSON.stringify(session),\n )\n } catch {\n // ignore\n }\n}\n\nfunction clearStoredOtpSession(): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.removeItem(OTP_SESSION_STORAGE_KEY)\n } catch {\n // ignore\n }\n}\n\nexport interface AuthStoreSlice {\n auth: {\n // State\n step: AuthStep | null\n stepHistory: AuthStep[]\n email: string | null\n setEmail: (email: string) => void\n otpId: string | null\n /**\n * HPKE encryption target bundle returned by the latest `sendOTP` call.\n * Required by `verifyOTP` so the OTP attempt can be sealed to the enclave.\n */\n otpEncryptionTargetBundle: string | null\n /** Set both fields produced by `sendOTP` together. */\n setOtpSession: (input: {\n otpId: string\n otpEncryptionTargetBundle: string\n }) => void\n /** Clear the persisted OTP session after a successful verify. */\n clearOtpSession: () => void\n\n // Actions\n /** Restore a persisted OTP session (survives reloads mid-email-flow). */\n initialize: () => void\n goToStep: (step: AuthStep | null) => void\n goBack: () => void\n reset: () => void\n }\n}\n\nexport const createAuthStoreSlice: StateCreator<\n AuthStoreSlice,\n [],\n [],\n AuthStoreSlice\n> = (set, get, _store) => ({\n auth: {\n // Initial state\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n\n // Actions\n initialize: () => {\n const stored = readStoredOtpSession()\n if (!stored) return\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: stored.otpId,\n otpEncryptionTargetBundle: stored.otpEncryptionTargetBundle,\n },\n }))\n },\n\n goToStep: (step: AuthStep | null) => {\n set((state) => ({\n auth: {\n ...state.auth,\n step,\n stepHistory:\n state.auth.step === null\n ? state.auth.stepHistory\n : [...state.auth.stepHistory, state.auth.step],\n },\n }))\n },\n\n goBack: () => {\n const { auth } = get()\n if (auth.stepHistory.length === 0) return\n const newHistory = [...auth.stepHistory]\n const previousStep = newHistory.pop()!\n set((state) => ({\n auth: {\n ...state.auth,\n step: previousStep,\n stepHistory: newHistory,\n },\n }))\n },\n\n reset: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n step: null,\n stepHistory: [],\n email: null,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n\n setEmail: (email) => {\n set((state) => ({\n auth: {\n ...state.auth,\n email,\n },\n }))\n },\n\n setOtpSession: ({ otpId, otpEncryptionTargetBundle }) => {\n writeStoredOtpSession({ otpId, otpEncryptionTargetBundle })\n set((state) => ({\n auth: {\n ...state.auth,\n otpId,\n otpEncryptionTargetBundle,\n },\n }))\n },\n\n clearOtpSession: () => {\n clearStoredOtpSession()\n set((state) => ({\n auth: {\n ...state.auth,\n otpId: null,\n otpEncryptionTargetBundle: null,\n },\n }))\n },\n },\n})\n","import { create } from 'zustand'\nimport { subscribeWithSelector } from 'zustand/middleware'\nimport {\n type AuthStoreSlice,\n createAuthStoreSlice,\n} from './auth/authStoreSlice'\nimport type { PendingRequest } from './types.js'\n\nexport type State = {\n pendingRequests: PendingRequest[]\n userConfirmationListenerActive: boolean\n addPendingRequest: (request: PendingRequest) => void\n removePendingRequest: (id: string) => void\n clearPendingRequests: () => void\n setUserConfirmationListenerActive: (active: boolean) => void\n} & AuthStoreSlice\n\nexport const createStore = () =>\n create<State>()(\n subscribeWithSelector((set, get, store) => ({\n pendingRequests: [],\n userConfirmationListenerActive: false,\n addPendingRequest: (request) =>\n set((state) => ({\n pendingRequests: [...state.pendingRequests, request],\n })),\n removePendingRequest: (id) =>\n set((state) => ({\n pendingRequests: state.pendingRequests.filter((r) => r.id !== id),\n })),\n clearPendingRequests: () => set({ pendingRequests: [] }),\n setUserConfirmationListenerActive: (active) =>\n set({ userConfirmationListenerActive: active }),\n\n ...createAuthStoreSlice(set, get, store),\n })),\n )\n","import type { CreateConnectorFn } from '@wagmi/core'\nimport type {\n ZeroDevProvider,\n ZeroDevWalletConnectorParams,\n} from '@zerodev/wallet-react'\nimport {\n zeroDevWallet as baseZeroDevWallet,\n NotAuthenticatedError,\n} from '@zerodev/wallet-react'\nimport { createStore } from './store.js'\nimport type { Request, RequestMethod } from './types.js'\n\nconst DEFAULT_SIGNING_PROMPT_METHODS: RequestMethod[] = [\n 'eth_sendTransaction',\n 'wallet_sendTransaction',\n 'wallet_sendCalls',\n 'personal_sign',\n 'eth_signTypedData_v4',\n]\n\n/** The kit connector takes exactly the base connector's param\n We alias it to leave room for expansion */\nexport type ZeroDevKitConnectorParams = ZeroDevWalletConnectorParams\n\nfunction requireUserConfirmation(\n store: ReturnType<typeof createStore>,\n request: Request,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n store.getState().addPendingRequest({\n id: crypto.randomUUID(),\n ...request,\n resolve,\n reject,\n })\n })\n}\n\n/**\n * Resolves when the user completes the auth flow (`step === 'authenticated'`),\n * rejects when they dismiss it (`step === null`).\n */\nfunction waitForAuthFlow(store: ReturnType<typeof createStore>): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const unsub = store.subscribe(\n (state) => state.auth.step,\n (step) => {\n if (step === 'authenticated') {\n unsub()\n resolve()\n } else if (step === null) {\n // User dismissed the auth flow (e.g. clicked the TopNav close\n // button) — abort the pending wagmi connect.\n unsub()\n reject(new Error('Auth flow dismissed'))\n }\n },\n )\n })\n}\n\nexport function zeroDevWallet(\n params: ZeroDevKitConnectorParams,\n): CreateConnectorFn {\n const baseFactory = baseZeroDevWallet(params)\n const store = createStore()\n\n return (wagmiConfig) => {\n const connector = baseFactory(wagmiConfig)\n\n return {\n ...connector,\n\n async connect(connectParams) {\n // Try to connect first. If a session is persisted, base will load it\n // and resolve — no auth UI needed. If not, it throws\n // `NotAuthenticatedError` and we surface SignUp.\n //\n // This avoids forcing every connect to await the base store's init\n // (which `isAuthorized()` deliberately skips for perf — see\n // packages/react/src/core/connector.ts), and avoids flashing the auth\n // UI on first paint when the session hasn't loaded yet.\n try {\n return await connector.connect(connectParams)\n } catch (error) {\n if (\n connectParams?.isReconnecting ||\n !(error instanceof NotAuthenticatedError)\n ) {\n throw error\n }\n\n if (store.getState().auth.step !== null) {\n throw new Error('Auth flow already in progress')\n }\n\n store.getState().auth.goToStep('sign-up')\n await waitForAuthFlow(store)\n return connector.connect(connectParams)\n }\n },\n\n async disconnect() {\n await connector.disconnect?.()\n store.getState().auth.reset()\n },\n\n async setup() {\n await connector.setup?.()\n\n // Everything below is browser-only. Skip during SSR — getProvider()\n // touches `window` for EIP-6963 discovery and would crash on the\n // server, and the session restore reads localStorage.\n if (typeof window === 'undefined') return\n\n // Restore a persisted OTP session so an email flow survives a reload.\n store.getState().auth.initialize()\n\n // Signing is pinned to background mode: the prompt-mode confirmation UI\n // is not part of this package's public surface, so requests always pass\n // through without gating. The wrapping logic below is retained but\n // unreachable.\n // const signing = params.signing\n const signing = { mode: 'background' } as const\n if (signing.mode === 'background') return\n\n const methods =\n // (signing?.mode === 'prompt' && signing.methods) ||\n DEFAULT_SIGNING_PROMPT_METHODS\n\n const provider = (await connector.getProvider()) as ZeroDevProvider\n const baseRequest = provider.request.bind(provider)\n\n // todo: move Request type to core package and use as the method and params type here\n // then we can remove as RequestMethod and spread in return baseRequest\n provider.request = async ({\n method,\n params: reqParams,\n }: {\n method: string\n params?: unknown[]\n }) => {\n const { userConfirmationListenerActive } = store.getState()\n if (\n userConfirmationListenerActive &&\n methods.includes(method as RequestMethod)\n ) {\n await requireUserConfirmation(store, {\n method: method as RequestMethod,\n params: reqParams,\n } as Request)\n }\n\n return baseRequest({\n method,\n ...(reqParams && { params: reqParams }),\n })\n }\n },\n\n getKitStore() {\n return store\n },\n }\n }\n}\n","import { cn, Icon, type IconName, Text } from '@zerodev/react-ui'\n\nexport type TxHistoryStatus = 'Pending' | 'Success' | 'Failed'\n\nconst STATUS_COLOR: Record<TxHistoryStatus, string> = {\n Pending: 'zd:text-solarOrange',\n Success: 'zd:text-positive',\n Failed: 'zd:text-negative',\n}\n\nexport interface TxHistoryItemProps {\n /** Leading glyph for the activity kind, e.g. `'arrowSwapHorizontalOutline'`\n * for swaps, `'lighting'` for staking/yield, `'imageFill'` for NFTs. */\n icon: IconName\n /** Activity label, e.g. `\"Swapped ETH → USD₮0\"`. Never truncated. */\n title: string\n /** Pre-formatted outcome, e.g. `\"2,343 ETH\"`. Truncates when long. */\n value: string\n /** Chain the transaction ran on (source chain for cross-chain rows). */\n chainName: string\n chainIconUrl?: string\n /** Destination chain. When present the row renders `chain → destChain`. */\n destChainName?: string\n destChainIconUrl?: string\n status: TxHistoryStatus\n className?: string\n}\n\nexport function TxHistoryItem({\n icon,\n title,\n value,\n chainName,\n chainIconUrl,\n destChainName,\n destChainIconUrl,\n status,\n className,\n}: TxHistoryItemProps) {\n return (\n <div\n className={cn(\n 'zd:flex zd:w-full zd:items-center zd:gap-2 zd:p-2',\n className,\n )}\n >\n <div className=\"zd:flex zd:size-11 zd:shrink-0 zd:items-center zd:justify-center zd:rounded-xl zd:bg-white\">\n <Icon name={icon} className=\"zd:size-5\" />\n </div>\n\n <div className=\"zd:flex zd:min-w-0 zd:flex-1 zd:flex-col zd:gap-2\">\n <div className=\"zd:flex zd:w-full zd:items-center zd:justify-between zd:gap-2\">\n <Text className=\"zd:shrink-0 zd:whitespace-nowrap zd:text-body1\">\n {title}\n </Text>\n <Text className=\"zd:min-w-0 zd:truncate zd:text-right zd:text-body1\">\n {value}\n </Text>\n </div>\n\n <div className=\"zd:flex zd:w-full zd:items-center zd:justify-between zd:gap-2\">\n <div className=\"zd:flex zd:min-w-0 zd:items-center zd:gap-2\">\n <ChainTag\n name={chainName}\n {...(chainIconUrl && { iconUrl: chainIconUrl })}\n />\n {destChainName && (\n <>\n <Icon\n name=\"arrowRightFill\"\n aria-hidden\n className=\"zd:size-3 zd:shrink-0 zd:opacity-30\"\n />\n <ChainTag\n name={destChainName}\n {...(destChainIconUrl && { iconUrl: destChainIconUrl })}\n />\n </>\n )}\n </div>\n <Text\n className={cn('zd:shrink-0 zd:text-body3', STATUS_COLOR[status])}\n >\n {status}\n </Text>\n </div>\n </div>\n </div>\n )\n}\n\nfunction ChainTag({ name, iconUrl }: { name: string; iconUrl?: string }) {\n return (\n <div className=\"zd:flex zd:min-w-0 zd:items-center zd:gap-[5px]\">\n {iconUrl && (\n <span className=\"zd:size-3 zd:shrink-0 zd:overflow-hidden zd:rounded-full zd:bg-white\">\n <img\n src={iconUrl}\n alt=\"\"\n aria-hidden\n className=\"zd:size-full zd:object-cover\"\n />\n </span>\n )}\n <Text className=\"zd:truncate zd:text-body3\">{name}</Text>\n </div>\n )\n}\n","import type { TxHistoryEntry } from './types'\n\nconst ARB_ICON =\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/arbitrum/info/logo.png'\nconst BASE_ICON =\n 'https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/base/info/logo.png'\n\nconst HOUR = 60 * 60 * 1000\n\n/**\n * Placeholder feed mirroring the Figma history screen (`15873:58582`) until\n * the real activity source lands. Timestamps are relative to module load:\n * a \"Today\" section and an older fixed-looking section two weeks back.\n */\nexport const MOCK_HISTORY: TxHistoryEntry[] = [\n {\n id: 'mock-1',\n icon: 'arrowSwapHorizontalOutline',\n title: 'Swapped ETH → USD₮0',\n value: '2,343 ETH',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n destChainName: 'Base',\n destChainIconUrl: BASE_ICON,\n status: 'Pending',\n timestamp: Date.now() - 1 * HOUR,\n },\n {\n id: 'mock-2',\n icon: 'arrowSwapHorizontalOutline',\n title: 'Swapped ETH → USD₮0',\n value: '2,343 ETH',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n destChainName: 'Base',\n destChainIconUrl: BASE_ICON,\n status: 'Pending',\n timestamp: Date.now() - 2 * HOUR,\n },\n {\n id: 'mock-3',\n icon: 'lighting',\n title: 'Fixed Yield',\n value: '2,323 PT wstETH (25 Jan 2026)',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 3 * HOUR,\n },\n {\n id: 'mock-4',\n icon: 'imageFill',\n title: 'Received NFT',\n value: 'Bored Ape Yacht Club',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 4 * HOUR,\n },\n {\n id: 'mock-5',\n icon: 'lighting',\n title: 'Collateral Used',\n value: 'Collateralization enabled for USD₮0',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 14 * 24 * HOUR,\n },\n {\n id: 'mock-6',\n icon: 'lighting',\n title: 'Liquid Staked ETH',\n value: '2,323 PT wstETH (25 Jan 2026)',\n chainName: 'Arbitrum One',\n chainIconUrl: ARB_ICON,\n status: 'Success',\n timestamp: Date.now() - 14 * 24 * HOUR - 1 * HOUR,\n },\n]\n","import type { TxHistoryEntry } from '../types'\n\nexport interface DayGroup {\n /** Section header: \"Today\", \"Yesterday\", or e.g. \"August 12, 2025\". */\n label: string\n entries: TxHistoryEntry[]\n}\n\n/** Local-midnight day index for a timestamp — calendar-day identity. */\nfunction dayKey(timestamp: number): string {\n const d = new Date(timestamp)\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`\n}\n\nfunction dayLabel(timestamp: number, now: number): string {\n const key = dayKey(timestamp)\n if (key === dayKey(now)) return 'Today'\n if (key === dayKey(now - 24 * 60 * 60 * 1000)) return 'Yesterday'\n return new Intl.DateTimeFormat('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n }).format(new Date(timestamp))\n}\n\n/**\n * Newest-first entries bucketed by local calendar day, ready to render as\n * header + rows sections. `now` is injectable so tests (and midnight\n * boundaries) are deterministic.\n */\nexport function groupByDay(\n entries: TxHistoryEntry[],\n now: number = Date.now(),\n): DayGroup[] {\n const sorted = [...entries].sort((a, b) => b.timestamp - a.timestamp)\n const groups: DayGroup[] = []\n let currentKey: string | null = null\n for (const entry of sorted) {\n const key = dayKey(entry.timestamp)\n if (key !== currentKey) {\n currentKey = key\n groups.push({ label: dayLabel(entry.timestamp, now), entries: [] })\n }\n groups[groups.length - 1]?.entries.push(entry)\n }\n return groups\n}\n","import { Text, Wrapper } from '@zerodev/react-ui'\nimport { Fragment } from 'react'\nimport { TxHistoryItem } from '../components/TxHistoryItem'\nimport { MOCK_HISTORY } from '../mocks'\nimport type { TxHistoryEntry } from '../types'\nimport { groupByDay } from '../utils/groupByDay'\n\nexport interface HistoryProps {\n /** Activity feed, newest anywhere (sorted internally). Defaults to the\n * mock feed until the real activity source lands. */\n entries?: TxHistoryEntry[]\n /** Fired when a row is tapped. Rows are inert when omitted. */\n onSelectEntry?: (entry: TxHistoryEntry) => void\n}\n\nexport function History({\n entries = MOCK_HISTORY,\n onSelectEntry,\n}: HistoryProps) {\n const groups = groupByDay(entries)\n\n return (\n <div className=\"zd:flex zd:h-full zd:w-full zd:flex-col zd:gap-1 zd:pt-2 zd:pb-4\">\n <Wrapper\n variant=\"ghost\"\n className=\"zd:flex zd:w-full zd:flex-1 zd:flex-col zd:gap-1 zd:overflow-y-auto zd:rounded-2xl zd:p-2\"\n >\n {groups.map((group) => (\n <Fragment key={group.label}>\n <div className=\"zd:flex zd:w-full zd:items-center zd:py-2 zd:pr-2\">\n <Text className=\"zd:text-body3\">{group.label}</Text>\n </div>\n {group.entries.map((entry) =>\n onSelectEntry ? (\n <button\n key={entry.id}\n type=\"button\"\n onClick={() => onSelectEntry(entry)}\n className=\"zd:w-full zd:cursor-pointer zd:text-left\"\n >\n <EntryRow entry={entry} />\n </button>\n ) : (\n <EntryRow key={entry.id} entry={entry} />\n ),\n )}\n </Fragment>\n ))}\n </Wrapper>\n </div>\n )\n}\n\nfunction EntryRow({ entry }: { entry: TxHistoryEntry }) {\n return (\n <TxHistoryItem\n icon={entry.icon}\n title={entry.title}\n value={entry.value}\n chainName={entry.chainName}\n {...(entry.chainIconUrl && { chainIconUrl: entry.chainIconUrl })}\n {...(entry.destChainName && { destChainName: entry.destChainName })}\n {...(entry.destChainIconUrl && {\n destChainIconUrl: entry.destChainIconUrl,\n })}\n status={entry.status}\n />\n )\n}\n","import { Screen, TopNav } from '@zerodev/react-ui'\nimport { useState } from 'react'\nimport type { TxHistoryEntry } from '../types'\nimport { History } from './History'\n\n/** Current page within the history flow. Single page for now — a\n * transaction-details step slots in beside it later. */\nexport type TxHistoryStep = 'history'\n\nconst TITLE_BY_STEP: Record<TxHistoryStep, string> = {\n history: 'History',\n}\n\nexport interface TxHistoryProps {\n /** Called when the top-right × close button is clicked. */\n onClose: () => void\n /** Activity feed; defaults to the mock feed until a real source lands. */\n entries?: TxHistoryEntry[] | undefined\n /** Fired when a row is tapped. Rows are inert when omitted. */\n onSelectEntry?: ((entry: TxHistoryEntry) => void) | undefined\n className?: string | undefined\n size?: 'sm' | 'md' | 'lg' | undefined\n}\n\n/**\n * Transaction history widget.\n *\n * Owns the shared `Screen` + `TopNav` chrome and delegates the body to the\n * current page in this directory — mirrors the layout of\n * `smart-routing-address-react-ui`'s `pages/index.tsx`. Navigation is owned\n * here: pages get callbacks, never the step setter.\n */\nexport function TxHistory({\n onClose,\n entries,\n onSelectEntry,\n className,\n size,\n}: TxHistoryProps) {\n // Single step today, so the setter is unused; destructure it back in when\n // the first sub-page (transaction details) lands.\n const [step] = useState<TxHistoryStep>('history')\n\n const renderStep = () => {\n switch (step) {\n case 'history':\n return (\n <History\n {...(entries && { entries })}\n {...(onSelectEntry && { onSelectEntry })}\n />\n )\n }\n }\n\n // Sub-pages will swap the left slot for a back chevron returning to the\n // parent step (see SRA's pages/index.tsx); the root step has none.\n return (\n <Screen\n {...(className && { className })}\n {...(size && { size })}\n topNav={\n <TopNav title={TITLE_BY_STEP[step]} onRightButtonClick={onClose} />\n }\n >\n {renderStep()}\n </Screen>\n )\n}\n","import type { CreateConnectorFn } from 'wagmi'\nimport { type WalletConnectParameters, walletConnect } from 'wagmi/connectors'\nimport { isMobile } from './auth/utils/isMobile'\n\n/**\n * localStorage key `@walletconnect/sign-client` reads before publishing each\n * session request — when set, the SDK deep-links back into the chosen wallet\n * app (`{href}/wc?requestId=…&sessionTopic=…`) so the approval prompt is in\n * front of the user. Same key AppKit writes; the SDK no-ops when it's absent.\n */\nconst DEEPLINK_CHOICE_KEY = 'WALLETCONNECT_DEEPLINK_CHOICE'\n\n/** The slice of `@walletconnect/ethereum-provider` this module touches. */\ntype WcSessionProvider = {\n on: (event: 'connect' | 'disconnect', listener: () => void) => unknown\n session?: {\n peer?: {\n metadata?: { name?: string; redirect?: { native?: string } }\n }\n }\n}\n\nconst watched = new WeakSet<object>()\n\n/**\n * Arm the SDK's redirect-on-request with the connected wallet's own\n * registered scheme (`session.peer.metadata.redirect.native`) — authoritative\n * for whichever wallet actually claimed the pairing. Desktop sessions and\n * wallets that register no native redirect stay unarmed.\n */\nfunction storeDeepLinkChoice(provider: WcSessionProvider) {\n const metadata = provider.session?.peer?.metadata\n const href = metadata?.redirect?.native\n if (!href || !isMobile()) {\n clearDeepLinkChoice()\n return\n }\n try {\n localStorage.setItem(\n DEEPLINK_CHOICE_KEY,\n JSON.stringify({ href, name: metadata?.name ?? '' }),\n )\n } catch {\n // Storage unavailable — requests still work, minus the app hop.\n }\n}\n\nfunction clearDeepLinkChoice() {\n try {\n localStorage.removeItem(DEEPLINK_CHOICE_KEY)\n } catch {\n // Nothing to clear if storage is unavailable.\n }\n}\n\nfunction watchSession(provider: WcSessionProvider) {\n if (watched.has(provider)) return\n watched.add(provider)\n provider.on('connect', () => storeDeepLinkChoice(provider))\n // A stale choice would deep-link a future session to the wrong app.\n provider.on('disconnect', clearDeepLinkChoice)\n // Session restored from storage (page reload) — re-arm without an event.\n if (provider.session) storeDeepLinkChoice(provider)\n}\n\n/**\n * WalletConnect connector preconfigured for the kit. `showQrModal: false` is\n * required — the kit renders its own pairing UI, and WalletConnect's bundled\n * Reown modal would pop over it otherwise. All other WalletConnect\n * parameters (e.g. `metadata`) are forwarded as-is.\n *\n * The kit only pairs through connectors created here — a raw `walletConnect()`\n * in the config is ignored, since its `showQrModal` can't be read back.\n */\nexport function zeroDevWalletConnect(\n params: Omit<WalletConnectParameters, 'showQrModal'>,\n): CreateConnectorFn {\n if (!params.projectId) {\n throw new Error('zeroDevWalletConnect requires a WalletConnect projectId')\n }\n const create = walletConnect({ ...params, showQrModal: false })\n return (config) => {\n // Stamp the connector instance so the kit's discovery can tell a\n // correctly-configured connector from a raw walletConnect(), where\n // showQrModal defaults to true.\n const connector = Object.assign(create(config), { zdWalletConnect: true })\n const getProvider = connector.getProvider.bind(connector)\n connector.getProvider = async (...args: Parameters<typeof getProvider>) => {\n const provider = await getProvider(...args)\n watchSession(provider as WcSessionProvider)\n return provider\n }\n return connector\n }\n}\n"],"names":["errorImg","loadingImg","sendImg","successImg","STATE_IMAGES","StatusScreen","imageName","title","children","className","jsxs","cn","jsx","Text","useKitStore","connector","useConfig","c","useAuth","store","step","useStore","state","stepHistory","email","otpId","otpEncryptionTargetBundle","EmailVerification","setOtpSession","sendMagicLink","isSendPending","useSendMagicLink","secondsLeftUntilResend","setSecondsLeftUntilResend","useState","canResend","useEffect","timer","prev","handleResend","Fragment","PoweredBy","hasMagicLinkCodeInUrl","stripMagicLinkCodeFromUrl","url","ErrorScreen","message","showRetry","showChooseAnother","goToStep","goBack","reset","handleRetry","Button","MIN_LENGTH","MAX_LENGTH","DEFAULT_LENGTH","clampLength","length","CharBox","char","isFocused","Wrapper","CodeInput","onChange","onComplete","disabled","error","autoFocus","testId","codeLength","charBoxes","useMemo","_","i","code","setCode","setIsFocused","inputRef","useRef","_a","handleChange","text","sanitized","e","box","OtpInput","clearOtpSession","sendOtp","isSendOtpPending","useSendOTP","verifyOtp","isPending","useVerifyOTP","otp","setOtp","setError","secondsUntilResend","setSecondsUntilResend","interval","handleVerify","handleComplete","newOtpId","newBundle","SignUpFooter","termsAndConditionsUrl","privacyPolicyUrl","agreedToTerms","setAgreedToTerms","highlight","showAgreement","blobWebm","BlobAnimation","walletConnectLogo","isCancellationError","err","announcesWallet","wallet","matchesWallet","guide","WALLET_GUIDE","WalletSheet","open","onOpenChange","pairing","BottomSheet","BottomSheetContent","BottomSheetTitle","SheetBody","uri","retry","connectors","useConnectors","connect","useConnect","installed","tab","setTab","connectError","setConnectError","copied","setCopied","qrValue","copyUri","connectInstalled","shownError","BottomSheetClose","t","QrCode","isMobile","_b","isZeroDevWalletConnect","walletDeepLink","params","mobile","useWalletConnectPairing","wcConnector","wcConnected","useConnections","isReconnecting","useAccount","setUri","startedRef","startConnect","target","onMessage","type","data","onExpire","onConnect","wcProvider","disposed","provider","_c","SignUpContext","createContext","useSignUpContext","ctx","useContext","useReportPending","pending","setAuthPending","EMAIL_REGEX","isValidEmailAddress","SignUpEmail","setEmail","authPending","emailAuthMethod","needsAgreement","guardAgreement","emailInput","setEmailInput","shouldUseOtp","isSendMagicLinkPending","isEmailLoading","handleSubmit","send","Input","Icon","SignUpGoogle","authenticateOAuth","useAuthenticateOAuth","handleClick","ListItem","ListItemIcon","ListItemChevron","SignUpInstalledWallets","excludeWalletIds","maxWallets","registeredWallets","rows","w","row","id","a","b","name","icon","Badge","WalletTile","tile","WalletGridSheet","tiles","SignUpMoreWallets","openWalletSheet","setOpen","walletConnectors","wcEnabled","guideTiles","announced","claimed","connectorTiles","walletConnectTiles","SignUpPasskey","mutation","registerPasskey","isRegisterPending","useRegisterPasskey","loginPasskey","isLoginPending","useLoginPasskey","guarded","run","SignUpWallet","walletId","registerWallet","useLayoutEffect","shared","SignUpWalletConnect","SignUpRoot","highlightAgreement","setHighlightAgreement","setRegisteredWallets","useCallback","next","walletSheet","setWalletSheet","deepLink","agreed","SignUpDivider","label","SignUpDefault","props","SignUp","getCodeFromUrl","Verifying","hasVerifiedRef","verifyMagicLink","isVerificationLoading","useVerifyMagicLink","OAuthCallback","PasskeyPrompt","renderStep","renderSignUp","ConnectWallet","userOnClose","size","logo","content","handleClose","Screen","TopNav","guideEntryForPeerName","peer","guideEntryForConnector","useResolvedWalletInfo","isConnected","peerMetadata","setPeerMetadata","isWalletConnect","cancelled","metadata","entry","useWalletInfo","_namespace","walletInfo","OTP_SESSION_STORAGE_KEY","readStoredOtpSession","raw","parsed","writeStoredOtpSession","session","clearStoredOtpSession","createAuthStoreSlice","set","get","_store","stored","auth","newHistory","previousStep","createStore","create","subscribeWithSelector","request","r","active","waitForAuthFlow","resolve","reject","unsub","zeroDevWallet","baseFactory","baseZeroDevWallet","wagmiConfig","connectParams","NotAuthenticatedError","STATUS_COLOR","TxHistoryItem","value","chainName","chainIconUrl","destChainName","destChainIconUrl","status","ChainTag","iconUrl","ARB_ICON","BASE_ICON","HOUR","MOCK_HISTORY","dayKey","timestamp","d","dayLabel","now","key","groupByDay","entries","sorted","groups","currentKey","History","onSelectEntry","group","EntryRow","TITLE_BY_STEP","TxHistory","onClose","DEEPLINK_CHOICE_KEY","watched","storeDeepLinkChoice","href","clearDeepLinkChoice","watchSession","zeroDevWalletConnect","walletConnect","config","getProvider","args"],"mappings":"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"}